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