122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===- ObjectLinker.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//===----------------------------------------------------------------------===//
987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#ifndef MCLD_OBJECT_OBJECTLINKER_H
1087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#define MCLD_OBJECT_OBJECTLINKER_H
1187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <llvm/Support/DataTypes.h>
1222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld {
1422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass Module;
1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LinkerConfig;
17d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoclass IRBuilder;
1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass TargetLDBackend;
1987f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass FileOutputBuffer;
2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass ObjectReader;
2122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass DynObjReader;
2222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass ArchiveReader;
2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass GroupReader;
24d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoclass BinaryReader;
2587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass ScriptReader;
2622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass ObjectWriter;
2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass DynObjWriter;
2822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass ExecWriter;
29d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaoclass BinaryWriter;
3087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Relocation;
3187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass ResolveInfo;
3222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/** \class ObjectLinker
3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao */
3522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass ObjectLinker
3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaopublic:
3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ObjectLinker(const LinkerConfig& pConfig,
3922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao               TargetLDBackend& pLDBackend);
4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
4122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ~ObjectLinker();
4222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
4387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  bool initialize(Module& pModule, IRBuilder& pBuilder);
4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// initStdSections - initialize standard sections of the output file.
4622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool initStdSections();
4722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
48a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines  /// addUndefinedSymbols - add symbols set by -u
49a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines  void addUndefinedSymbols();
50a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines
5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// normalize - normalize the input files
5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  void normalize();
5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// linkable - check the linkability of current LinkerConfig
5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ///  Check list:
5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ///  - check the Attributes are not violate the constaint
5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ///  - check every Input has a correct Attribute
5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool linkable() const;
5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// readRelocations - read all relocation entries
6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool readRelocations();
6222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// dataStrippingOpt - optimizations for reducing code size
6487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void dataStrippingOpt();
6587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// mergeSections - put allinput sections into output sections
6722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool mergeSections();
6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// addSymbolsToOutput - after all symbols has been resolved, add the symbol
7087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// to output
7187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void addSymbolsToOutput(Module& pModule);
7287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
736f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// allocateCommonSymobols - allocate fragments for common symbols to the
746f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// corresponding sections
756f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  bool allocateCommonSymbols();
766f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
7722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// addStandardSymbols - shared object and executable files need some
7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// standard symbols
7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ///   @return if there are some input symbols with the same name to the
8022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ///   standard symbols, return false
8122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool addStandardSymbols();
8222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// addTargetSymbols - some targets, such as MIPS and ARM, need some
8422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// target-dependent symbols
8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ///   @return if there are some input symbols with the same name to the
8622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ///   target symbols, return false
8722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool addTargetSymbols();
8822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
896f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// addScriptSymbols - define symbols from the command line option or linker
906f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// scripts.
916f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  bool addScriptSymbols();
926f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
9322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// scanRelocations - scan all relocation entries by output symbols.
9422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool scanRelocations();
9522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
966f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// initStubs - initialize stub-related stuff.
976f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  bool initStubs();
986f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
9922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// prelayout - help backend to do some modification before layout
10022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool prelayout();
10122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
10222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// layout - linearly layout all output sections and reserve some space
10322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// for GOT/PLT
10422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ///   Because we do not support instruction relaxing in this early version,
10522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ///   if there is a branch can not jump to its target, we return false
10622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ///   directly
10722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool layout();
10822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
10922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// postlayout - help backend to do some modification after layout
11022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool postlayout();
11122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
11222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// relocate - applying relocation entries and create relocation
11322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// section in the output files
11422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// Create relocation section, asking TargetLDBackend to
11522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// read the relocation information into RelocationEntry
11622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// and push_back into the relocation section
11722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool relocation();
11822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
11922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// finalizeSymbolValue - finalize the symbol value
12022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool finalizeSymbolValue();
12122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
12222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// emitOutput - emit the output file.
12387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  bool emitOutput(FileOutputBuffer& pOutput);
12422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
12522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// postProcessing - do modificatiion after all processes
12687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  bool postProcessing(FileOutputBuffer& pOutput);
12722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
12822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // -----  readers and writers  ----- //
12922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const ObjectReader*  getObjectReader () const { return m_pObjectReader;  }
13022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ObjectReader*        getObjectReader ()       { return m_pObjectReader;  }
13122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
13222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const DynObjReader*  getDynObjReader () const { return m_pDynObjReader;  }
13322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  DynObjReader*        getDynObjReader ()       { return m_pDynObjReader;  }
13422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
13522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const ArchiveReader* getArchiveReader() const { return m_pArchiveReader; }
13622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ArchiveReader*       getArchiveReader()       { return m_pArchiveReader; }
13722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
138d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  const GroupReader*   getGroupReader  () const { return m_pGroupReader;   }
139d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  GroupReader*         getGroupReader  ()       { return m_pGroupReader;   }
140d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
141d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  const BinaryReader*  getBinaryReader () const { return m_pBinaryReader;  }
142d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  BinaryReader*        getBinaryReader ()       { return m_pBinaryReader;  }
14322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
14487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  const ScriptReader*  getScriptReader () const { return m_pScriptReader;  }
14587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  ScriptReader*        getScriptReader ()       { return m_pScriptReader;  }
14687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
1476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const ObjectWriter*  getWriter () const { return m_pWriter;  }
1486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  ObjectWriter*        getWriter ()       { return m_pWriter;  }
149d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
15022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoprivate:
15187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// normalSyncRelocationResult - sync relocation result when producing shared
15287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// objects or executables
15387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void normalSyncRelocationResult(FileOutputBuffer& pOutput);
15487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
15587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// partialSyncRelocationResult - sync relocation result when doing partial
15687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// link
15787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void partialSyncRelocationResult(FileOutputBuffer& pOutput);
15887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
15987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// writeRelocationResult - helper function of syncRelocationResult, write
16087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// relocation target data to output
16187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void writeRelocationResult(Relocation& pReloc, uint8_t* pOutput);
16287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
16387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// addSymbolToOutput - add a symbol to output symbol table if it's not a
16487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// section symbol and not defined in the discarded section
16587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void addSymbolToOutput(ResolveInfo& pInfo, Module& pModule);
16687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
16787f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesprivate:
16822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const LinkerConfig& m_Config;
1696f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  Module* m_pModule;
1706f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  IRBuilder* m_pBuilder;
1716f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
17222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  TargetLDBackend &m_LDBackend;
17322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
17422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // -----  readers and writers  ----- //
175d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  ObjectReader*  m_pObjectReader;
176d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  DynObjReader*  m_pDynObjReader;
17722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ArchiveReader* m_pArchiveReader;
178d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  GroupReader*   m_pGroupReader;
179d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  BinaryReader*  m_pBinaryReader;
18087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  ScriptReader*  m_pScriptReader;
1816f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  ObjectWriter*  m_pWriter;
18222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao};
18322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
18422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} // end namespace mcld
18522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#endif
186