ObjectLinker.h revision f7ac0f19a1c8d0ad14bcf6456ce368b830fea886
10b167267bda99b68346045ccab14e810121d5de4Glenn Kasten//===- ObjectLinker.h -----------------------------------------------------===//
20b167267bda99b68346045ccab14e810121d5de4Glenn Kasten//
30b167267bda99b68346045ccab14e810121d5de4Glenn Kasten//                     The MCLinker Project
40b167267bda99b68346045ccab14e810121d5de4Glenn Kasten//
50b167267bda99b68346045ccab14e810121d5de4Glenn Kasten// This file is distributed under the University of Illinois Open Source
60b167267bda99b68346045ccab14e810121d5de4Glenn Kasten// License. See LICENSE.TXT for details.
70b167267bda99b68346045ccab14e810121d5de4Glenn Kasten//
80b167267bda99b68346045ccab14e810121d5de4Glenn Kasten//===----------------------------------------------------------------------===//
90b167267bda99b68346045ccab14e810121d5de4Glenn Kasten//
100b167267bda99b68346045ccab14e810121d5de4Glenn Kasten// ObjectLinker plays the same role as GNU collect2 to prepare all implicit
110b167267bda99b68346045ccab14e810121d5de4Glenn Kasten// parameters for FragmentLinker.
120b167267bda99b68346045ccab14e810121d5de4Glenn Kasten//
130b167267bda99b68346045ccab14e810121d5de4Glenn Kasten//===----------------------------------------------------------------------===//
140b167267bda99b68346045ccab14e810121d5de4Glenn Kasten#ifndef MCLD_OBJECT_OBJECT_LINKER_H
150b167267bda99b68346045ccab14e810121d5de4Glenn Kasten#define MCLD_OBJECT_OBJECT_LINKER_H
160b167267bda99b68346045ccab14e810121d5de4Glenn Kasten#ifdef ENABLE_UNITTEST
170b167267bda99b68346045ccab14e810121d5de4Glenn Kasten#include <gtest.h>
180b167267bda99b68346045ccab14e810121d5de4Glenn Kasten#endif
19979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten#include <stddef.h>
20979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten
21979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastennamespace mcld {
22979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten
23979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenclass Module;
24979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenclass LinkerConfig;
250b167267bda99b68346045ccab14e810121d5de4Glenn Kastenclass IRBuilder;
260b167267bda99b68346045ccab14e810121d5de4Glenn Kastenclass FragmentLinker;
270b167267bda99b68346045ccab14e810121d5de4Glenn Kastenclass TargetLDBackend;
280b167267bda99b68346045ccab14e810121d5de4Glenn Kastenclass MemoryArea;
290b167267bda99b68346045ccab14e810121d5de4Glenn Kastenclass MemoryAreaFactory;
300b167267bda99b68346045ccab14e810121d5de4Glenn Kastenclass ObjectReader;
310b167267bda99b68346045ccab14e810121d5de4Glenn Kastenclass DynObjReader;
320b167267bda99b68346045ccab14e810121d5de4Glenn Kastenclass ArchiveReader;
330b167267bda99b68346045ccab14e810121d5de4Glenn Kastenclass GroupReader;
34979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenclass BinaryReader;
35979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kastenclass ObjectWriter;
360b167267bda99b68346045ccab14e810121d5de4Glenn Kastenclass DynObjWriter;
370b167267bda99b68346045ccab14e810121d5de4Glenn Kastenclass ExecWriter;
380b167267bda99b68346045ccab14e810121d5de4Glenn Kastenclass BinaryWriter;
390b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
40979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten/** \class ObjectLinker
410b167267bda99b68346045ccab14e810121d5de4Glenn Kasten *  \brief ObjectLinker prepares parameters for FragmentLinker.
420b167267bda99b68346045ccab14e810121d5de4Glenn Kasten */
430b167267bda99b68346045ccab14e810121d5de4Glenn Kastenclass ObjectLinker
440b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{
450b167267bda99b68346045ccab14e810121d5de4Glenn Kastenpublic:
460b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  ObjectLinker(const LinkerConfig& pConfig,
470b167267bda99b68346045ccab14e810121d5de4Glenn Kasten               TargetLDBackend& pLDBackend);
480b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
490b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  ~ObjectLinker();
500b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
510b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  void setup(Module& pModule, IRBuilder& pBuilder);
520b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
530b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  /// initFragmentLinker - initialize FragmentLinker
540b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  ///  Connect all components in FragmentLinker
550b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  bool initFragmentLinker();
560b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
570b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  /// initStdSections - initialize standard sections of the output file.
580b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  bool initStdSections();
590b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
600b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  /// normalize - normalize the input files
610b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  void normalize();
620b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
630b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  /// linkable - check the linkability of current LinkerConfig
640b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  ///  Check list:
650b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  ///  - check the Attributes are not violate the constaint
660b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  ///  - check every Input has a correct Attribute
67979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten  bool linkable() const;
68979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten
690b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  /// readRelocations - read all relocation entries
700b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  bool readRelocations();
710b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
720b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  /// mergeSections - put allinput sections into output sections
73979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten  bool mergeSections();
740b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
750b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  /// allocateCommonSymobols - allocate fragments for common symbols to the
760b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  /// corresponding sections
770b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  bool allocateCommonSymbols();
780b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
790b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  /// addStandardSymbols - shared object and executable files need some
800b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  /// standard symbols
810b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  ///   @return if there are some input symbols with the same name to the
820b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  ///   standard symbols, return false
830b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  bool addStandardSymbols();
840b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
850b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  /// addTargetSymbols - some targets, such as MIPS and ARM, need some
860b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  /// target-dependent symbols
870b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  ///   @return if there are some input symbols with the same name to the
880b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  ///   target symbols, return false
890b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  bool addTargetSymbols();
900b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
910b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  /// addScriptSymbols - define symbols from the command line option or linker
92979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten  /// scripts.
93979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten  bool addScriptSymbols();
940b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
950b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  /// scanRelocations - scan all relocation entries by output symbols.
960b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  bool scanRelocations();
970b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
980b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  /// initStubs - initialize stub-related stuff.
990b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  bool initStubs();
1000b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
1010b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  /// prelayout - help backend to do some modification before layout
1020b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  bool prelayout();
1030b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
1040b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  /// layout - linearly layout all output sections and reserve some space
1050b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  /// for GOT/PLT
1060b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  ///   Because we do not support instruction relaxing in this early version,
1070b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  ///   if there is a branch can not jump to its target, we return false
1080b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  ///   directly
1090b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  bool layout();
1100b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
1110b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  /// postlayout - help backend to do some modification after layout
1120b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  bool postlayout();
1130b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
1140b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  /// relocate - applying relocation entries and create relocation
1150b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  /// section in the output files
1160b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  /// Create relocation section, asking TargetLDBackend to
1170b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  /// read the relocation information into RelocationEntry
1180b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  /// and push_back into the relocation section
1190b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  bool relocation();
1200b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
1210b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  /// finalizeSymbolValue - finalize the symbol value
1220b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  bool finalizeSymbolValue();
1230b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
1240b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  /// emitOutput - emit the output file.
1250b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  bool emitOutput(MemoryArea& pOutput);
1260b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
1270b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  /// postProcessing - do modificatiion after all processes
1280b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  bool postProcessing(MemoryArea& pOutput);
1290b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
1300b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  /// getLinker - get internal FragmentLinker object
1310b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  const FragmentLinker* getLinker() const { return m_pLinker; }
1320b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  FragmentLinker*       getLinker()       { return m_pLinker; }
1330b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
1340b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  /// hasInitLinker - has Linker been initialized?
1350b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  bool hasInitLinker() const
1360b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  { return (NULL != m_pLinker); }
1370b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
1380b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  // -----  readers and writers  ----- //
1390b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  const ObjectReader*  getObjectReader () const { return m_pObjectReader;  }
1400b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  ObjectReader*        getObjectReader ()       { return m_pObjectReader;  }
1410b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
1420b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  const DynObjReader*  getDynObjReader () const { return m_pDynObjReader;  }
1430b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  DynObjReader*        getDynObjReader ()       { return m_pDynObjReader;  }
1440b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
1450b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  const ArchiveReader* getArchiveReader() const { return m_pArchiveReader; }
1460b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  ArchiveReader*       getArchiveReader()       { return m_pArchiveReader; }
1470b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
1480b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  const GroupReader*   getGroupReader  () const { return m_pGroupReader;   }
1490b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  GroupReader*         getGroupReader  ()       { return m_pGroupReader;   }
1500b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
1510b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  const BinaryReader*  getBinaryReader () const { return m_pBinaryReader;  }
1520b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  BinaryReader*        getBinaryReader ()       { return m_pBinaryReader;  }
1530b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
1540b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  const ObjectWriter*  getWriter () const { return m_pWriter;  }
1550b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  ObjectWriter*        getWriter ()       { return m_pWriter;  }
1560b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
1570b167267bda99b68346045ccab14e810121d5de4Glenn Kastenprivate:
1580b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  const LinkerConfig& m_Config;
1590b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  FragmentLinker* m_pLinker;
1600b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  Module* m_pModule;
1610b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  IRBuilder* m_pBuilder;
1620b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
1630b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  TargetLDBackend &m_LDBackend;
1640b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
1650b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  // -----  readers and writers  ----- //
1660b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  ObjectReader*  m_pObjectReader;
1670b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  DynObjReader*  m_pDynObjReader;
1680b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  ArchiveReader* m_pArchiveReader;
1690b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  GroupReader*   m_pGroupReader;
1700b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  BinaryReader*  m_pBinaryReader;
1710b167267bda99b68346045ccab14e810121d5de4Glenn Kasten  ObjectWriter*  m_pWriter;
1720b167267bda99b68346045ccab14e810121d5de4Glenn Kasten};
1730b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
1740b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} // end namespace mcld
1750b167267bda99b68346045ccab14e810121d5de4Glenn Kasten#endif
1760b167267bda99b68346045ccab14e810121d5de4Glenn Kasten