14 #ifndef LLVM_OBJECT_COFF_H
15 #define LLVM_OBJECT_COFF_H
25 template <
typename T>
class ArrayRef;
28 class ImportDirectoryEntryRef;
29 class DelayImportDirectoryEntryRef;
30 class ExportDirectoryEntryRef;
31 class ImportedSymbolRef;
176 template <
typename IntTy>
184 return Data & 0xFFFF;
189 return Data & 0xFFFFFFFF;
237 template <
typename SectionNumberType>
272 return CS16 ?
static_cast<const void *
>(CS16) : CS32;
298 assert(isSet() &&
"COFFSymbolRef points to nothing!");
305 assert(isSet() &&
"COFFSymbolRef points to nothing!");
316 assert(isSet() &&
"COFFSymbolRef points to nothing!");
317 return CS16 ? CS16->
Type : CS32->
Type;
321 assert(isSet() &&
"COFFSymbolRef points to nothing!");
326 assert(isSet() &&
"COFFSymbolRef points to nothing!");
383 bool isAppdomainGlobal =
389 return isAppdomainGlobal || isOrdinarySection;
397 bool isSet()
const {
return CS16 || CS32; }
430 return 1U << (Shift - 1);
450 "auxiliary entry must be 18 bytes");
461 "auxiliary entry must be 18 bytes");
470 "auxiliary entry must be 18 bytes");
485 return static_cast<int32_t
>(Number);
490 "auxiliary entry must be 18 bytes");
500 "auxiliary entry must be 18 bytes");
527 template <
typename IntTy>
539 return 1U << (Shift - 1);
622 const char *StringTable;
626 uint32_t NumberOfDelayImportDirectory;
635 template <
typename coff_symbol_type>
636 const coff_symbol_type *toSymb(
DataRefImpl Symb)
const;
640 std::error_code initSymbolTablePtr();
641 std::error_code initImportTablePtr();
642 std::error_code initDelayImportTablePtr();
643 std::error_code initExportTablePtr();
644 std::error_code initBaseRelocPtr();
645 std::error_code initDebugDirectoryPtr();
650 return reinterpret_cast<uintptr_t
>(SymbolTable16);
652 return reinterpret_cast<uintptr_t
>(SymbolTable32);
658 if (COFFBigObjHeader)
659 return COFFBigObjHeader->
Machine;
667 if (COFFBigObjHeader)
676 if (COFFBigObjHeader)
683 if (COFFBigObjHeader)
690 if (COFFBigObjHeader)
698 if (COFFBigObjHeader)
705 if (COFFBigObjHeader)
710 if (!SymbolTable16 && !SymbolTable32)
763 unsigned getArch()
const override;
775 return DebugDirectoryBegin;
778 return DebugDirectoryEnd;
791 if (!PE32Header && !PE32PlusHeader)
800 template <
typename coff_symbol_type>
802 const coff_symbol_type *&Res)
const {
806 Res =
reinterpret_cast<coff_symbol_type *
>(
getSymbolTable()) + Index;
807 return std::error_code();
812 if (std::error_code EC =
getSymbol(index, Symb))
818 if (std::error_code EC =
getSymbol(index, Symb))
824 template <
typename T>
827 if (std::error_code EC = s.
getError())
829 Res =
reinterpret_cast<const T *
>(s->getRawPtr());
830 return std::error_code();
841 if (COFFBigObjHeader)
855 std::error_code
getVaPtr(uint64_t VA, uintptr_t &Res)
const;
880 bool is64()
const {
return PE32PlusHeader; }
891 : ImportTable(Table), Index(I), OwningObject(Owner) {}
922 : Table(T), Index(I), OwningObject(Owner) {}
948 : ExportTable(Table), Index(I), OwningObject(Owner) {}
973 : Entry32(Entry), Entry64(nullptr), Index(I), OwningObject(Owner) {}
976 : Entry32(nullptr), Entry64(Entry), Index(I), OwningObject(Owner) {}
982 std::error_code
isOrdinal(
bool &Result)
const;
983 std::error_code
getOrdinal(uint16_t &Result)
const;
998 : Header(Header), Index(0), OwningObject(Owner) {}
std::error_code getRVA(uint32_t &Result) const
uint32_t getNumberOfSections() const
bool operator==(const ImportDirectoryEntryRef &Other) const
support::ulittle32_t EditList
std::error_code getError() const
std::error_code getImportTableEntry(const coff_import_directory_table_entry *&Result) const
ImportDirectoryEntryRef()
Represents either an error or a value T.
coff_tls_directory< support::little32_t > coff_tls_directory32
uint32_t getSymbolAlignment(DataRefImpl Symb) const override
support::ulittle32_t MaximumAllocationSize
support::ulittle32_t PointerToNextFunction
section_iterator section_begin() const override
support::ulittle64_t SecurityCookie
iterator_range< imported_symbol_iterator > imported_symbols() const
support::ulittle32_t TimeDateStamp
support::ulittle16_t MajorVersion
support::ulittle32_t PointerToLinenumbers
uint16_t getCharacteristics() const
support::ulittle32_t Name
support::ulittle32_t OrdinalBase
const void * getRawPtr() const
std::error_code getDelayImportTable(const delay_import_directory_table_entry *&Result) const
support::ulittle32_t GlobalFlagsClear
COFFObjectFile(MemoryBufferRef Object, std::error_code &EC)
uint8_t getStorageClass() const
uint64_t getRelocationOffset(DataRefImpl Rel) const override
bool hasExtendedRelocations() const
std::error_code getImportAddress(int AddrIndex, uint64_t &Result) const
DelayImportDirectoryEntryRef()
imported_symbol_iterator imported_symbol_begin() const
support::ulittle32_t UnloadDelayImportTable
const uint8_t * base() const
support::ulittle32_t VirtualAddress
import_directory_iterator import_directory_end() const
support::ulittle32_t Attributes
void moveSectionNext(DataRefImpl &Sec) const override
support::ulittle16_t MajorVersion
support::ulittle16_t NumberOfLinenumbers
std::error_code getDebugPDBInfo(const debug_directory *DebugDir, const codeview::DebugInfo *&Info, StringRef &PDBFileName) const
Get PDB information out of a codeview debug directory entry.
void moveRelocationNext(DataRefImpl &Rel) const override
This class is the base class for all object file types.
support::ulittle32_t PointerToRelocations
uint32_t getAlignment() const
bool isSectionCompressed(DataRefImpl Sec) const override
ImportedSymbolRef(const import_lookup_table_entry64 *Entry, uint32_t I, const COFFObjectFile *Owner)
support::ulittle16_t NumberLowPart
uint32_t getValue() const
std::error_code getImportAddressTableRVA(uint32_t &Result) const
uint32_t getAlignment() const
std::error_code getSectionContents(DataRefImpl Sec, StringRef &Res) const override
uint64_t getSymbolValueImpl(DataRefImpl Symb) const override
support::ulittle32_t TagIndex
const coff_section * getCOFFSection(const SectionRef &Section) const
std::error_code getSectionName(DataRefImpl Sec, StringRef &Res) const override
support::ulittle16_t Data
std::error_code getRvaPtr(uint32_t Rva, uintptr_t &Res) const
support::ulittle32_t DelayImportAddressTable
int getPrologSize() const
uint8_t getBytesInAddress() const override
The number of bytes used to represent an address in this object file format.
basic_symbol_iterator symbol_end() const override
support::ulittle32_t CheckSum
support::ulittle32_t SecurityCookie
ExportDirectoryEntryRef()
char ShortName[COFF::NameSize]
ImportedSymbolRef(const import_lookup_table_entry32 *Entry, uint32_t I, const COFFObjectFile *Owner)
bool isFunctionLineInfo() const
std::error_code isOrdinal(bool &Result) const
std::error_code getAuxSymbol(uint32_t index, const T *&Res) const
support::ulittle32_t NameRVA
uint16_t getOrdinal() const
support::ulittle64_t SEHandlerTable
".bf" or ".ef" - beginning or end of function
uint64_t getSectionAlignment(DataRefImpl Sec) const override
char Name[COFF::NameSize]
support::ulittle16_t MajorVersion
support::ulittle32_t Type
support::ulittle32_t DeCommitFreeBlockThreshold
support::ulittle16_t Reserved
support::ulittle32_t PointerToRawData
This is a value type class that represents a single relocation in the list of relocations in the obje...
Expected< uint64_t > getSymbolAddress(DataRefImpl Symb) const override
bool operator==(const ExportDirectoryEntryRef &Other) const
uint8_t getBaseType() const
iterator_range< base_reloc_iterator > base_relocs() const
support::ulittle32_t NumLocals
std::error_code getOrdinal(uint32_t &Result) const
Tagged union holding either a T or a Error.
uint32_t getTimeDateStamp() const
content_iterator< ImportedSymbolRef > imported_symbol_iterator
support::ulittle16_t MajorVersion
const int32_t MaxNumberOfSections16
iterator_range< import_directory_iterator > import_directories() const
External symbol in dmert public lib.
bool isReservedSectionNumber(int32_t SectionNumber)
union llvm::object::coff_symbol_generic::@114 Name
support::ulittle32_t VirtualSize
support::ulittle32_t Characteristics
std::error_code getVaPtr(uint64_t VA, uintptr_t &Res) const
int getNumSavedRegs() const
Expected< SymbolRef::Type > getSymbolType(DataRefImpl Symb) const override
uint32_t getSymbolFlags(DataRefImpl Symb) const override
std::error_code getName(StringRef &Result) const
support::ulittle32_t ExportFlags
uint64_t getSectionAddress(DataRefImpl Sec) const override
iterator_range< const coff_relocation * > getRelocations(const coff_section *Sec) const
static GCRegistry::Add< OcamlGC > B("ocaml","ocaml 3.10-compatible GC")
std::error_code getSymbolName(StringRef &Result) const
void moveSymbolNext(DataRefImpl &Symb) const override
bool isFunctionDefinition() const
support::ulittle16_t MinorVersion
support::ulittle16_t NumParams
support::ulittle32_t NamePointerRVA
support::ulittle32_t ExportRVA
support::ulittle32_t NameRVA
bool isRelocatableObject() const override
True if this is a relocatable object (.o/.obj).
support::ulittle32_t GlobalFlagsSet
IntTy StartAddressOfRawData
unsigned getArch() const override
imported_symbol_iterator imported_symbol_end() const
support::ulittle16_t MinorVersion
unsigned getSectionID(SectionRef Sec) const
support::ulittle32_t TagIndex
relocation_iterator section_rel_end(DataRefImpl Sec) const override
support::ulittle32_t ProcessHeapFlags
support::ulittle32_t GlobalFlagsSet
No type information or unknown base type.
support::ulittle32_t ProcessHeapFlags
support::ulittle32_t ProcessAffinityMask
std::error_code getForwardTo(StringRef &Result) const
support::ulittle32_t Characteristics
support::ulittle16_t NumberHighPart
support::ulittle32_t Characteristics
support::ulittle32_t DeCommitTotalFreeThreshold
Expected< section_iterator > getSymbolSection(DataRefImpl Symb) const override
uint64_t getImageBase() const
bool isFileRecord() const
The instances of the Type class are immutable: once they are created, they are never changed...
uint16_t getMachine() const
const char * getShortName() const
support::ulittle32_t Characteristics
Line number, reformatted as symbol.
support::ulittle32_t SizeOfZeroFill
support::ulittle32_t VirtualMemoryThreshold
support::ulittle32_t MaximumAllocationSize
std::error_code getDataDirectory(uint32_t index, const data_directory *&Res) const
int32_t getSectionNumber() const
char ShortName[COFF::NameSize]
Type is formed as (base + (derived << SCT_COMPLEX_TYPE_SHIFT))
support::ulittle32_t SymbolTableIndex
std::error_code getImportLookupTableRVA(uint32_t &Result) const
uint32_t getRawNumberOfSymbols() const
export_directory_iterator export_directory_end() const
support::ulittle32_t CriticalSectionDefaultTimeout
COFFSymbolRef(const coff_symbol16 *CS)
COFFSymbolRef(const coff_symbol32 *CS)
support::ulittle32_t Size
base_reloc_iterator base_reloc_begin() const
support::ulittle32_t RelativeVirtualAddress
Expected< StringRef > getSymbolName(DataRefImpl Symb) const override
support::ulittle32_t Value
std::error_code getOrdinal(uint16_t &Result) const
uint16_t getSizeOfOptionalHeader() const
uint8_t getComplexType() const
std::error_code getPE32PlusHeader(const pe32plus_header *&Res) const
support::ulittle32_t TimeStamp
A function that returns a base type.
support::ulittle32_t ImportAddressTableRVA
relocation_iterator section_rel_begin(DataRefImpl Sec) const override
iterator_range< const debug_directory * > debug_directories() const
support::ulittle32_t Characteristics
support::ulittle16_t Type
support::ulittle32_t EndAddress
support::ulittle32_t OrdinalTableRVA
COFFSymbolRef getCOFFSymbol(const DataRefImpl &Ref) const
coff_symbol< support::ulittle16_t > coff_symbol16
export_directory_iterator export_directory_begin() const
support::ulittle32_t SizeOfRawData
SubtargetFeatures getFeatures() const override
support::ulittle16_t Linenumber
coff_symbol< support::ulittle32_t > coff_symbol32
uint64_t getRelocationType(DataRefImpl Rel) const override
support::ulittle32_t VirtualMemoryThreshold
imported_symbol_iterator lookup_table_end() const
StringRef getFileFormatName() const override
content_iterator< ImportDirectoryEntryRef > import_directory_iterator
DelayImportDirectoryEntryRef(const delay_import_directory_table_entry *T, uint32_t I, const COFFObjectFile *Owner)
support::ulittle32_t ForwarderChain
support::ulittle32_t VirtualAddress
support::ulittle32_t SymbolTableIndex
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
const debug_directory * debug_directory_begin() const
support::ulittle32_t export_name_pointer_table_entry
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
support::ulittle32_t TimeDateStamp
support::ulittle32_t TimeDateStamp
import_directory_iterator import_directory_begin() const
support::ulittle32_t PointerToRawData
support::ulittle32_t DeCommitTotalFreeThreshold
SectionNumberType SectionNumber
support::ulittle16_t MinorVersion
bool isWeakExternal() const
support::ulittle32_t BeginAddress
BaseRelocRef(const coff_base_reloc_block_header *Header, const COFFObjectFile *Owner)
uint64_t getCommonSymbolSizeImpl(DataRefImpl Symb) const override
basic_symbol_iterator symbol_begin() const override
std::error_code getRvaAndSizeAsBytes(uint32_t RVA, uint32_t Size, ArrayRef< uint8_t > &Contents) const
Given an RVA base and size, returns a valid array of bytes or an error code if the RVA and size is no...
iterator_range< imported_symbol_iterator > lookup_table_symbols() const
imported_symbol_iterator imported_symbol_end() const
content_iterator< ExportDirectoryEntryRef > export_directory_iterator
bool isSectionData(DataRefImpl Sec) const override
support::ulittle16_t CSDVersion
const StringTableOffset & getStringTableOffset() const
support::ulittle16_t CSDVersion
ExportDirectoryEntryRef(const export_directory_table_entry *Table, uint32_t I, const COFFObjectFile *Owner)
support::ulittle64_t SEHandlerCount
const dos_header * getDOSHeader() const
support::ulittle32_t GlobalFlagsClear
support::ulittle16_t NumberOfRelocations
friend bool operator<(COFFSymbolRef A, COFFSymbolRef B)
support::ulittle32_t SEHandlerTable
IntTy EndAddressOfRawData
imported_symbol_iterator lookup_table_begin() const
support::ulittle32_t Offset
support::ulittle32_t ModuleHandle
support::ulittle32_t ForwarderRVA
A range adaptor for a pair of iterators.
support::ulittle32_t EditList
section_iterator section_end() const override
support::ulittle32_t AddressOfRawData
delay_import_directory_iterator delay_import_directory_begin() const
SubtargetFeatures - Manages the enabling and disabling of subtarget specific features.
support::ulittle32_t Size
uint8_t getNumberOfAuxSymbols() const
unsigned getSymbolSectionID(SymbolRef Sym) const
std::error_code getHintName(uint32_t Rva, uint16_t &Hint, StringRef &Name) const
This is a value type class that represents a single symbol in the list of symbols in the object file...
support::ulittle16_t Attributes
support::ulittle32_t Zeroes
std::error_code getHintNameRVA(uint32_t &Result) const
ImportDirectoryEntryRef(const coff_import_directory_table_entry *Table, uint32_t I, const COFFObjectFile *Owner)
const coff_relocation * getCOFFRelocation(const RelocationRef &Reloc) const
imported_symbol_iterator imported_symbol_begin() const
symbol_iterator getRelocationSymbol(DataRefImpl Rel) const override
delay_import_directory_iterator delay_import_directory_end() const
support::ulittle32_t NumberOfNamePointers
std::error_code getPE32Header(const pe32_header *&Res) const
bool isSectionDefinition() const
import_lookup_table_entry< support::little64_t > import_lookup_table_entry64
support::ulittle32_t PointerToNextFunction
iterator_range< imported_symbol_iterator > imported_symbols() const
bool isSectionText(DataRefImpl Sec) const override
bool operator==(const DelayImportDirectoryEntryRef &Other) const
uintptr_t getSymbolTable() const
const coff_symbol_generic * getGeneric() const
std::error_code getDllName(StringRef &Result) const
support::ulittle32_t Characteristics
bool operator==(const BaseRelocRef &Other) const
void getRelocationTypeName(DataRefImpl Rel, SmallVectorImpl< char > &Result) const override
support::ulittle32_t ImportLookupTableRVA
content_iterator< DelayImportDirectoryEntryRef > delay_import_directory_iterator
support::ulittle32_t AddressTableEntries
union llvm::object::coff_symbol::@113 Name
support::ulittle32_t LockPrefixTable
size_t getSymbolTableEntrySize() const
support::ulittle32_t PointerToLinenumber
import_lookup_table_entry< support::little32_t > import_lookup_table_entry32
support::ulittle16_t export_ordinal_table_entry
iterator_range< export_directory_iterator > export_directories() const
support::ulittle16_t NumberOfLinenumbers
bool isSectionVirtual(DataRefImpl Sec) const override
std::error_code getSymbol(uint32_t Index, const coff_symbol_type *&Res) const
Provides ErrorOr<T> smart pointer.
bool operator==(const ImportedSymbolRef &Other) const
uint64_t getSectionSize(DataRefImpl Sec) const override
support::ulittle32_t Length
support::ulittle32_t CriticalSectionDefaultTimeout
coff_tls_directory< support::little64_t > coff_tls_directory64
support::ulittle16_t NumberOfRelocations
uint32_t getNumberOfSymbols() const
uint8_t NumberOfAuxSymbols
bool isAnyUndefined() const
ErrorOr< COFFSymbolRef > getSymbol(uint32_t index) const
support::ulittle32_t SizeOfData
bool isSectionBSS(DataRefImpl Sec) const override
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
base_reloc_iterator base_reloc_end() const
int32_t getNumber(bool IsBigObj) const
std::error_code getSymbolName(StringRef &Result) const
std::error_code getOrdinalBase(uint32_t &Result) const
support::ulittle32_t DeCommitFreeBlockThreshold
support::ulittle32_t Value
static bool classof(const Binary *v)
support::ulittle16_t Reserved
support::ulittle32_t ExportAddressTableRVA
support::ulittle32_t TimeDateStamp
StringRef - Represent a constant reference to a string, i.e.
std::error_code getType(uint8_t &Type) const
content_iterator< BaseRelocRef > base_reloc_iterator
support::ulittle32_t DelayImportNameTable
support::ulittle32_t TimeDateStamp
support::ulittle16_t MinorVersion
uint32_t getPointerToSymbolTable() const
std::error_code getName(StringRef &Result) const
uint32_t getHintNameRVA() const
ArrayRef< uint8_t > getSymbolAuxData(COFFSymbolRef Symbol) const
support::ulittle32_t SEHandlerCount
static GCRegistry::Add< ErlangGC > A("erlang","erlang-compatible garbage collector")
std::error_code getSection(int32_t index, const coff_section *&Res) const
std::error_code isForwarder(bool &Result) const
support::ulittle32_t TotalSize
support::ulittle32_t ProcessAffinityMask
support::ulittle16_t Type
const debug_directory * debug_directory_end() const
support::ulittle32_t UnwindInformation
std::error_code getExportRVA(uint32_t &Result) const
support::ulittle32_t LockPrefixTable
support::ulittle32_t BoundDelayImportTable
This is a value type class that represents a single section in the list of sections in the object fil...
iterator_range< delay_import_directory_iterator > delay_import_directories() const
support::ulittle32_t Offset