//===- Linker.h -----------------------------------------------------------===//
//
// The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef MCLD_LINKER_H
#define MCLD_LINKER_H
#include <string>
namespace mcld {
class Module;
class LinkerConfig;
class LinkerScript;
class Target;
class TargetLDBackend;
class IRBuilder;
class ObjectLinker;
class FileHandle;
class FileOutputBuffer;
/** \class Linker
* \brief Linker is a modular linker.
*/
class Linker
{
public:
Linker();
~Linker();
/// emulate - To set up target-dependent options and default linker script.
bool emulate(LinkerScript& pScript, LinkerConfig& pConfig);
/// normalize - To normalize the command line language into mcld::Module.
bool normalize(Module& pModule, IRBuilder& pBuilder);
/// resolve - To build up the topology of mcld::Module.
bool resolve(Module& pModule);
/// layout - To serialize the final result of the output mcld::Module.
bool layout();
/// link - A convenient way to resolve and to layout the output mcld::Module.
bool link(Module& pModule, IRBuilder& pBuilder);
/// emit - To emit output mcld::Module to a FileOutputBuffer.
bool emit(FileOutputBuffer& pOutput);
/// emit - To open a file for output in pPath and to emit output mcld::Module
/// to the file.
bool emit(const Module& pModule, const std::string& pPath);
/// emit - To emit output mcld::Module in the pFileDescriptor.
bool emit(const Module& pModule, int pFileDescriptor);
bool reset();
private:
bool initTarget();
bool initBackend();
bool initOStream();
bool initEmulator(LinkerScript& pScript);
private:
LinkerConfig* m_pConfig;
IRBuilder* m_pIRBuilder;
const Target* m_pTarget;
TargetLDBackend* m_pBackend;
ObjectLinker* m_pObjLinker;
};
} // namespace of MC Linker
#endif