122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===- Linker.h -----------------------------------------------------------===//
222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//
322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//                     The MCLinker Project
422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//
522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// This file is distributed under the University of Illinois Open Source
622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// License. See LICENSE.TXT for details.
722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//
822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef MCLD_LINKER_H_
1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define MCLD_LINKER_H_
1122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <string>
1322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld {
1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass FileHandle;
1737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass FileOutputBuffer;
1837b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass IRBuilder;
1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LinkerConfig;
20f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesclass LinkerScript;
2137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass Module;
2237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass ObjectLinker;
2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass Target;
2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass TargetLDBackend;
2522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
2622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/** \class Linker
2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao*  \brief Linker is a modular linker.
2822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao*/
2937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass Linker {
3037b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
3122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Linker();
3222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ~Linker();
3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
35f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// emulate - To set up target-dependent options and default linker script.
36f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  bool emulate(LinkerScript& pScript, LinkerConfig& pConfig);
3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
38f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// normalize - To normalize the command line language into mcld::Module.
39f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  bool normalize(Module& pModule, IRBuilder& pBuilder);
406f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
41f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// resolve - To build up the topology of mcld::Module.
4287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  bool resolve(Module& pModule);
43f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
44f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// layout - To serialize the final result of the output mcld::Module.
456f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  bool layout();
466f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// link - A convenient way to resolve and to layout the output mcld::Module.
4822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool link(Module& pModule, IRBuilder& pBuilder);
4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// emit - To emit output mcld::Module to a FileOutputBuffer.
5187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  bool emit(FileOutputBuffer& pOutput);
5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
536f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// emit - To open a file for output in pPath and to emit output mcld::Module
546f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// to the file.
5587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  bool emit(const Module& pModule, const std::string& pPath);
5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
576f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// emit - To emit output mcld::Module in the pFileDescriptor.
5887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  bool emit(const Module& pModule, int pFileDescriptor);
5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool reset();
6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6237b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool initTarget();
6422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool initBackend();
6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool initOStream();
6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
69f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  bool initEmulator(LinkerScript& pScript);
70f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
7137b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  LinkerConfig* m_pConfig;
7322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  IRBuilder* m_pIRBuilder;
7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const Target* m_pTarget;
7622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  TargetLDBackend* m_pBackend;
7722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ObjectLinker* m_pObjLinker;
7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao};
7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8037b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
8122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif  // MCLD_LINKER_H_
83