diff options
Diffstat (limited to 'include/llvm/Object/COFF.h')
| -rw-r--r-- | include/llvm/Object/COFF.h | 70 | 
1 files changed, 55 insertions, 15 deletions
diff --git a/include/llvm/Object/COFF.h b/include/llvm/Object/COFF.h index ad657b591fb4..fc605826a8b0 100644 --- a/include/llvm/Object/COFF.h +++ b/include/llvm/Object/COFF.h @@ -249,6 +249,15 @@ struct coff_symbol {  typedef coff_symbol<support::ulittle16_t> coff_symbol16;  typedef coff_symbol<support::ulittle32_t> coff_symbol32; +// Contains only common parts of coff_symbol16 and coff_symbol32. +struct coff_symbol_generic { +  union { +    char ShortName[COFF::NameSize]; +    StringTableOffset Offset; +  } Name; +  support::ulittle32_t Value; +}; +  class COFFSymbolRef {  public:    COFFSymbolRef(const coff_symbol16 *CS) : CS16(CS), CS32(nullptr) {} @@ -259,6 +268,12 @@ public:      return CS16 ? static_cast<const void *>(CS16) : CS32;    } +  const coff_symbol_generic *getGeneric() const { +    if (CS16) +      return reinterpret_cast<const coff_symbol_generic *>(CS16); +    return reinterpret_cast<const coff_symbol_generic *>(CS32); +  } +    friend bool operator<(COFFSymbolRef A, COFFSymbolRef B) {      return A.getRawPtr() < B.getRawPtr();    } @@ -493,6 +508,29 @@ struct coff_load_configuration32 {    support::ulittle32_t SEHandlerCount;  }; +struct coff_load_configuration64 { +  support::ulittle32_t Characteristics; +  support::ulittle32_t TimeDateStamp; +  support::ulittle16_t MajorVersion; +  support::ulittle16_t MinorVersion; +  support::ulittle32_t GlobalFlagsClear; +  support::ulittle32_t GlobalFlagsSet; +  support::ulittle32_t CriticalSectionDefaultTimeout; +  support::ulittle32_t DeCommitFreeBlockThreshold; +  support::ulittle32_t DeCommitTotalFreeThreshold; +  support::ulittle32_t LockPrefixTable; +  support::ulittle32_t MaximumAllocationSize; +  support::ulittle32_t VirtualMemoryThreshold; +  support::ulittle32_t ProcessAffinityMask; +  support::ulittle32_t ProcessHeapFlags; +  support::ulittle16_t CSDVersion; +  support::ulittle16_t Reserved; +  support::ulittle32_t EditList; +  support::ulittle64_t SecurityCookie; +  support::ulittle64_t SEHandlerTable; +  support::ulittle64_t SEHandlerCount; +}; +  struct coff_runtime_function_x64 {    support::ulittle32_t BeginAddress;    support::ulittle32_t EndAddress; @@ -609,14 +647,13 @@ public:    }  protected:    void moveSymbolNext(DataRefImpl &Symb) const override; -  std::error_code getSymbolName(DataRefImpl Symb, -                                StringRef &Res) const override; +  ErrorOr<StringRef> getSymbolName(DataRefImpl Symb) const override;    std::error_code getSymbolAddress(DataRefImpl Symb,                                     uint64_t &Res) const override; -  uint64_t getSymbolSize(DataRefImpl Symb) const override; +  uint64_t getSymbolValue(DataRefImpl Symb) const override; +  uint64_t getCommonSymbolSizeImpl(DataRefImpl Symb) const override;    uint32_t getSymbolFlags(DataRefImpl Symb) const override; -  std::error_code getSymbolType(DataRefImpl Symb, -                                SymbolRef::Type &Res) const override; +  SymbolRef::Type getSymbolType(DataRefImpl Symb) const override;    std::error_code getSymbolSection(DataRefImpl Symb,                                     section_iterator &Res) const override;    void moveSectionNext(DataRefImpl &Sec) const override; @@ -631,21 +668,17 @@ protected:    bool isSectionData(DataRefImpl Sec) const override;    bool isSectionBSS(DataRefImpl Sec) const override;    bool isSectionVirtual(DataRefImpl Sec) const override; -  bool sectionContainsSymbol(DataRefImpl Sec, DataRefImpl Symb) const override;    relocation_iterator section_rel_begin(DataRefImpl Sec) const override;    relocation_iterator section_rel_end(DataRefImpl Sec) const override;    void moveRelocationNext(DataRefImpl &Rel) const override; -  std::error_code getRelocationAddress(DataRefImpl Rel, -                                       uint64_t &Res) const override; -  std::error_code getRelocationOffset(DataRefImpl Rel, -                                      uint64_t &Res) const override; +  ErrorOr<uint64_t> getRelocationAddress(DataRefImpl Rel) const override; +  uint64_t getRelocationOffset(DataRefImpl Rel) const override;    symbol_iterator getRelocationSymbol(DataRefImpl Rel) const override; -  std::error_code getRelocationType(DataRefImpl Rel, -                                    uint64_t &Res) const override; -  std::error_code -  getRelocationTypeName(DataRefImpl Rel, -                        SmallVectorImpl<char> &Result) const override; +  uint64_t getRelocationType(DataRefImpl Rel) const override; +  void getRelocationTypeName(DataRefImpl Rel, +                             SmallVectorImpl<char> &Result) const override; +  public:    COFFObjectFile(MemoryBufferRef Object, std::error_code &EC);    basic_symbol_iterator symbol_begin_impl() const override; @@ -657,6 +690,8 @@ public:    COFFSymbolRef getCOFFSymbol(const DataRefImpl &Ref) const;    COFFSymbolRef getCOFFSymbol(const SymbolRef &Symbol) const;    const coff_relocation *getCOFFRelocation(const RelocationRef &Reloc) const; +  unsigned getSectionID(SectionRef Sec) const; +  unsigned getSymbolSectionID(SymbolRef Sym) const;    uint8_t getBytesInAddress() const override;    StringRef getFileFormatName() const override; @@ -720,6 +755,8 @@ public:      return std::error_code();    }    std::error_code getSymbolName(COFFSymbolRef Symbol, StringRef &Res) const; +  std::error_code getSymbolName(const coff_symbol_generic *Symbol, +                                StringRef &Res) const;    ArrayRef<uint8_t> getSymbolAuxData(COFFSymbolRef Symbol) const; @@ -731,6 +768,9 @@ public:      llvm_unreachable("null symbol table pointer!");    } +  iterator_range<const coff_relocation *> +  getRelocations(const coff_section *Sec) const; +    std::error_code getSectionName(const coff_section *Sec, StringRef &Res) const;    uint64_t getSectionSize(const coff_section *Sec) const;    std::error_code getSectionContents(const coff_section *Sec,  | 
