14 #ifndef LLVM_OBJECT_COFF_H
15 #define LLVM_OBJECT_COFF_H
24 template <
typename T>
class ArrayRef;
27 class ImportDirectoryEntryRef;
28 class DelayImportDirectoryEntryRef;
29 class ExportDirectoryEntryRef;
30 class ImportedSymbolRef;
172 template <
typename IntTy>
179 assert(
isOrdinal() &&
"ILT entry is not an ordinal!");
180 return Data & 0xFFFF;
184 assert(!
isOrdinal() &&
"ILT entry is not a Hint/Name RVA!");
185 return Data & 0xFFFFFFFF;
233 template <
typename SectionNumberType>
268 return CS16 ?
static_cast<const void *
>(CS16) : CS32;
294 assert(isSet() &&
"COFFSymbolRef points to nothing!");
301 assert(isSet() &&
"COFFSymbolRef points to nothing!");
312 assert(isSet() &&
"COFFSymbolRef points to nothing!");
313 return CS16 ? CS16->
Type : CS32->
Type;
317 assert(isSet() &&
"COFFSymbolRef points to nothing!");
322 assert(isSet() &&
"COFFSymbolRef points to nothing!");
379 bool isAppdomainGlobal =
385 return isAppdomainGlobal || isOrdinarySection;
393 bool isSet()
const {
return CS16 || CS32; }
457 return static_cast<int32_t
>(Number);
563 const char *StringTable;
564 uint32_t StringTableSize;
566 uint32_t NumberOfImportDirectory;
568 uint32_t NumberOfDelayImportDirectory;
575 template <
typename coff_symbol_type>
576 const coff_symbol_type *toSymb(
DataRefImpl Symb)
const;
580 std::error_code initSymbolTablePtr();
581 std::error_code initImportTablePtr();
582 std::error_code initDelayImportTablePtr();
583 std::error_code initExportTablePtr();
584 std::error_code initBaseRelocPtr();
589 return reinterpret_cast<uintptr_t
>(SymbolTable16);
591 return reinterpret_cast<uintptr_t
>(SymbolTable32);
597 if (COFFBigObjHeader)
598 return COFFBigObjHeader->
Machine;
606 if (COFFBigObjHeader)
615 if (COFFBigObjHeader)
622 if (COFFBigObjHeader)
629 if (COFFBigObjHeader)
637 if (COFFBigObjHeader)
644 if (COFFBigObjHeader)
696 unsigned getArch()
const override;
714 if (!PE32Header && !PE32PlusHeader)
723 template <
typename coff_symbol_type>
725 const coff_symbol_type *&Res)
const {
729 Res =
reinterpret_cast<coff_symbol_type *
>(
getSymbolTable()) + Index;
730 return std::error_code();
735 if (std::error_code EC =
getSymbol(index, Symb))
741 if (std::error_code EC =
getSymbol(index, Symb))
747 template <
typename T>
750 if (std::error_code EC = s.
getError())
752 Res =
reinterpret_cast<const T *
>(s->getRawPtr());
753 return std::error_code();
764 if (COFFBigObjHeader)
777 std::error_code
getVaPtr(uint64_t VA, uintptr_t &Res)
const;
778 std::error_code
getRvaPtr(uint32_t Rva, uintptr_t &Res)
const;
783 bool is64()
const {
return PE32PlusHeader; }
794 : ImportTable(Table), Index(I), OwningObject(Owner) {}
824 : Table(T), Index(I), OwningObject(Owner) {}
850 : ExportTable(Table), Index(I), OwningObject(Owner) {}
857 std::error_code
getOrdinal(uint32_t &Result)
const;
872 : Entry32(Entry), Entry64(nullptr), Index(I), OwningObject(Owner) {}
875 : Entry32(nullptr), Entry64(Entry), Index(I), OwningObject(Owner) {}
881 std::error_code
getOrdinal(uint16_t &Result)
const;
895 : Header(Header), Index(0), OwningObject(Owner) {}
901 std::error_code
getRVA(uint32_t &Result)
const;
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
ImportDirectoryEntryRef()
Represents either an error or a value T.
support::ulittle32_t ImportAddressTableRVA
support::ulittle32_t MaximumAllocationSize
support::ulittle32_t PointerToNextFunction
section_iterator section_begin() const override
ErrorOr< StringRef > getSymbolName(DataRefImpl Symb) const override
support::ulittle64_t SecurityCookie
union llvm::object::coff_symbol::@90 Name
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 NumberOfLinenumbers
void moveRelocationNext(DataRefImpl &Rel) const override
This class is the base class for all object file types.
ImportDirectoryEntryRef(const import_directory_table_entry *Table, uint32_t I, const COFFObjectFile *Owner)
support::ulittle32_t PointerToRelocations
ImportedSymbolRef(const import_lookup_table_entry64 *Entry, uint32_t I, const COFFObjectFile *Owner)
support::ulittle16_t NumberLowPart
uint32_t getValue() const
union llvm::object::coff_symbol_generic::@91 Name
std::error_code getImportAddressTableRVA(uint32_t &Result) 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
aarch64 collect AArch64 Collect Linker Optimization Hint(LOH)"
support::ulittle32_t DelayImportAddressTable
uint8_t getBytesInAddress() const override
The number of bytes used to represent an address in this object file format.
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 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
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
support::ulittle32_t DeCommitFreeBlockThreshold
support::ulittle16_t Reserved
This is a value type class that represents a single relocation in the list of relocations in the obje...
bool operator==(const ExportDirectoryEntryRef &Other) const
uint8_t getBaseType() const
iterator_range< base_reloc_iterator > base_relocs() const
std::error_code getOrdinal(uint32_t &Result) const
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.
support::ulittle32_t ImportLookupTableRVA
bool isReservedSectionNumber(int32_t SectionNumber)
support::ulittle32_t VirtualSize
support::ulittle32_t NameRVA
support::ulittle32_t Characteristics
std::error_code getVaPtr(uint64_t VA, uintptr_t &Res) const
uint32_t getSymbolFlags(DataRefImpl Symb) const override
ErrorOr< uint64_t > getSymbolAddress(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
std::error_code getSymbolName(StringRef &Result) const
void moveSymbolNext(DataRefImpl &Symb) const override
bool isFunctionDefinition() const
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
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
support::ulittle32_t Characteristics
support::ulittle16_t NumberHighPart
support::ulittle32_t Characteristics
support::ulittle32_t DeCommitTotalFreeThreshold
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 VirtualMemoryThreshold
support::ulittle32_t MaximumAllocationSize
std::error_code getDataDirectory(uint32_t index, const data_directory *&Res) const
basic_symbol_iterator symbol_end_impl() const override
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
export_directory_iterator export_directory_end() const
support::ulittle32_t CriticalSectionDefaultTimeout
COFFSymbolRef(const coff_symbol16 *CS)
COFFSymbolRef(const coff_symbol32 *CS)
base_reloc_iterator base_reloc_begin() const
support::ulittle32_t RelativeVirtualAddress
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
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
support::ulittle16_t Linenumber
coff_symbol< support::ulittle32_t > coff_symbol32
uint64_t getRelocationType(DataRefImpl Rel) const override
support::ulittle32_t VirtualMemoryThreshold
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
std::error_code getSymbolSection(DataRefImpl Symb, section_iterator &Res) const override
support::ulittle32_t export_name_pointer_table_entry
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
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
basic_symbol_iterator symbol_begin_impl() const override
support::ulittle32_t GlobalFlagsClear
support::ulittle16_t NumberOfRelocations
std::error_code getImportLookupEntry(const import_lookup_table_entry32 *&Result) const
friend bool operator<(COFFSymbolRef A, COFFSymbolRef B)
support::ulittle32_t SEHandlerTable
support::ulittle32_t ForwarderChain
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
delay_import_directory_iterator delay_import_directory_begin() const
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::ulittle32_t Zeroes
const coff_relocation * getCOFFRelocation(const RelocationRef &Reloc) const
support::ulittle32_t TimeDateStamp
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
std::error_code getImportTableEntry(const import_directory_table_entry *&Result) const
uintptr_t getSymbolTable() const
const coff_symbol_generic * getGeneric() const
std::error_code getDllName(StringRef &Result) const
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
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
support::ulittle16_t NumberOfRelocations
uint32_t getNumberOfSymbols() const
uint8_t NumberOfAuxSymbols
bool isAnyUndefined() const
ErrorOr< COFFSymbolRef > getSymbol(uint32_t index) const
bool isSectionBSS(DataRefImpl Sec) const override
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::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
std::error_code getSection(int32_t index, const coff_section *&Res) const
support::ulittle32_t TotalSize
support::ulittle32_t ProcessAffinityMask
support::ulittle16_t Type
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...
SymbolRef::Type getSymbolType(DataRefImpl Symb) const override
iterator_range< delay_import_directory_iterator > delay_import_directories() const
support::ulittle32_t Offset