Linker.h revision 6f75755c9204b1d8817ae5a65a2f7e5af0ec3f70
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//===----------------------------------------------------------------------===//
922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#ifndef MCLD_LINKER_H
1022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#define MCLD_LINKER_H
1122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#ifdef ENABLE_UNITTEST
1222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <gtest.h>
1322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#endif
1422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <string>
1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld {
1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass Module;
2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LinkerConfig;
2122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
2222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass Target;
2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass TargetLDBackend;
2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
2522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass IRBuilder;
2622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass ObjectLinker;
2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
2822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass FileHandle;
2922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass MemoryArea;
3022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
3122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/** \class Linker
3222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao*  \brief Linker is a modular linker.
3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao*/
3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass Linker
3522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaopublic:
3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Linker();
3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
3922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ~Linker();
4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
416f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// config - To set up target-dependent options in pConfig.
4222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool config(LinkerConfig& pConfig);
4322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
446f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// resolve - To read participatory input files and build up mcld::Module
456f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  bool resolve(Module& pModule, IRBuilder& pBuilder);
466f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// layout - To serialize the final result of the output mcld::Module
486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  bool layout();
496f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
506f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// link - A convenient way to resolve and to layout the output mcld::Module.
5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool link(Module& pModule, IRBuilder& pBuilder);
5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
536f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// emit - To emit output mcld::Module to a output MemoryArea
5422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool emit(MemoryArea& pOutput);
5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
566f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// emit - To open a file for output in pPath and to emit output mcld::Module
576f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// to the file.
5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool emit(const std::string& pPath);
5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
606f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// emit - To emit output mcld::Module in the pFileDescriptor.
6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool emit(int pFileDescriptor);
6222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool reset();
6422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoprivate:
6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool initTarget();
6722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool initBackend();
6922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool initEmulator();
7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool initOStream();
7322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoprivate:
7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  LinkerConfig* m_pConfig;
7622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  IRBuilder* m_pIRBuilder;
7722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const Target* m_pTarget;
7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  TargetLDBackend* m_pBackend;
8022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ObjectLinker* m_pObjLinker;
8122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao};
8222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} // namespace of MC Linker
8422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#endif
8622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
87