187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//===- ELFReaderIf.h ------------------------------------------------------===//
26f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//
36f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//                     The MCLinker Project
46f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//
56f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// This file is distributed under the University of Illinois Open Source
66f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// License. See LICENSE.TXT for details.
76f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//
86f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===//
987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#ifndef MCLD_LD_ELFREADERIF_H
1087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#define MCLD_LD_ELFREADERIF_H
116f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
126f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <llvm/ADT/StringRef.h>
136f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <llvm/Support/ELF.h>
146f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <llvm/Support/Host.h>
156f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
166f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/Module.h>
176f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/LinkerConfig.h>
186f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/LD/LDContext.h>
196f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/Target/GNULDBackend.h>
206f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/Support/MsgHandling.h>
216f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
226f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesnamespace mcld {
236f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
246f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass Module;
256f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass IRBuilder;
266f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass FragmentRef;
276f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass SectionData;
286f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass LDSection;
296f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
306f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/** \class ELFReaderIF
316f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines *  \brief ELFReaderIF provides common interface for all kind of ELF readers.
326f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines */
336f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass ELFReaderIF
346f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{
356f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinespublic:
366f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  ELFReaderIF(GNULDBackend& pBackend)
376f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    : m_Backend(pBackend)
386f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { }
396f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
406f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual ~ELFReaderIF() { }
416f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
426f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// ELFHeaderSize - return the size of the ELFHeader
436f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual size_t getELFHeaderSize() const = 0;
446f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
456f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// isELF - is this a ELF file
4687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  virtual bool isELF(const void* pELFHeader) const = 0;
476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// isMyEndian - is this ELF file in the same endian to me?
4987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  virtual bool isMyEndian(const void* pELFHeader) const = 0;
506f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
516f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// isMyMachine - is this ELF file generated for the same machine.
5287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  virtual bool isMyMachine(const void* pELFHeader) const = 0;
536f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
546f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// fileType - the file type of this file
5587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  virtual Input::Type fileType(const void* pELFHeader) const = 0;
566f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
576f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// target - the target backend
586f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const GNULDBackend& target() const { return m_Backend; }
596f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  GNULDBackend&       target()       { return m_Backend; }
606f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
616f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
626f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// readSectionHeaders - read ELF section header table and create LDSections
6387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  virtual bool readSectionHeaders(Input& pInput,
6487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                                  const void* pELFHeader) const = 0;
656f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
666f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// readRegularSection - read a regular section and create fragments.
676f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual bool readRegularSection(Input& pInput, SectionData& pSD) const = 0;
686f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
696f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// readSymbols - read ELF symbols and create LDSymbol
706f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual bool readSymbols(Input& pInput,
716f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines                           IRBuilder& pBuilder,
7287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                           llvm::StringRef pRegion,
736f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines                           const char* StrTab) const = 0;
746f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
756f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// readSignature - read a symbol from the given Input and index in symtab
766f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// This is used to get the signature of a group section.
776f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual ResolveInfo* readSignature(Input& pInput,
786f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines                                     LDSection& pSymTab,
796f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines                                     uint32_t pSymIdx) const = 0;
806f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
816f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// readRela - read ELF rela and create Relocation
826f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual bool readRela(Input& pInput,
836f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines                        LDSection& pSection,
8487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                        llvm::StringRef pRegion) const = 0;
856f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
866f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// readRel - read ELF rel and create Relocation
876f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual bool readRel(Input& pInput,
886f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines                       LDSection& pSection,
8987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                       llvm::StringRef pRegion) const = 0;
906f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
916f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// readDynamic - read ELF .dynamic in input dynobj
926f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  virtual bool readDynamic(Input& pInput) const = 0;
936f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
946f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprotected:
956f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// LinkInfo - some section needs sh_link and sh_info, remember them.
966f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  struct LinkInfo {
976f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    LDSection* section;
986f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    uint32_t sh_link;
996f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    uint32_t sh_info;
1006f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  };
1016f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1026f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef std::vector<LinkInfo> LinkInfoList;
1036f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1046f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprotected:
1056f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  ResolveInfo::Type getSymType(uint8_t pInfo, uint16_t pShndx) const;
1066f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1076f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  ResolveInfo::Desc getSymDesc(uint16_t pShndx, const Input& pInput) const;
1086f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1096f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  ResolveInfo::Binding getSymBinding(uint8_t pBinding,
1106f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines                                     uint16_t pShndx,
1116f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines                                     uint8_t pVisibility) const;
1126f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1136f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  uint64_t getSymValue(uint64_t pValue,
1146f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines                       uint16_t pShndx,
1156f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines                       const Input& pInput) const;
1166f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1176f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  FragmentRef* getSymFragmentRef(Input& pInput,
1186f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines                                 uint16_t pShndx,
1196f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines                                 uint32_t pOffset) const;
1206f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1216f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  ResolveInfo::Visibility getSymVisibility(uint8_t pVis) const;
1226f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1236f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprotected:
1246f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  GNULDBackend& m_Backend;
1256f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines};
1266f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1276f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} // namespace of mcld
1286f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1296f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#endif
1306f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
131