13#ifndef LLVM_OBJECT_ELFOBJECTFILE_H
14#define LLVM_OBJECT_ELFOBJECTFILE_H
103 std::optional<StringRef> tryGetCPUName()
const override;
105 void setARMSubArch(
Triple &TheTriple)
const override;
129 readBBAddrMap(std::optional<unsigned> TextSectionIndex = std::nullopt,
130 std::vector<PGOAnalysisMap> *PGOAnalyses =
nullptr)
const;
202 if (EE.Value ==
Type) {
213 if (DRIA.
d.
a == DRIB.
d.
a)
214 return DRIA.
d.
b < DRIB.
d.
b;
215 return DRIA.
d.
a < DRIB.
d.
a;
295 bool ContentValid =
false;
322 const Elf_Shdr *SymTab)
const;
369 auto SectionsOrErr =
EF.sections();
370 if (!SectionsOrErr) {
375 uintptr_t SHT =
reinterpret_cast<uintptr_t
>((*SectionsOrErr).begin());
376 unsigned SymTableIndex =
377 (
reinterpret_cast<uintptr_t
>(SymTable) - SHT) /
sizeof(Elf_Shdr);
379 DRI.
d.
a = SymTableIndex;
385 return reinterpret_cast<const Elf_Shdr *
>(Sec.
p);
390 DRI.
p =
reinterpret_cast<uintptr_t
>(Sec);
396 DRI.
p =
reinterpret_cast<uintptr_t
>(Dyn);
401 unsigned char Binding = ESym->getBinding();
402 unsigned char Visibility = ESym->getVisibility();
432 auto SectionsOrErr =
EF.sections();
434 return SectionsOrErr.takeError();
435 for (
const Elf_Shdr &Sec : *SectionsOrErr) {
436 if (Sec.sh_type !=
Type)
438 auto ErrorOrContents =
EF.getSectionContents(Sec);
439 if (!ErrorOrContents)
440 return ErrorOrContents.takeError();
442 auto Contents = ErrorOrContents.get();
446 if (
Error E = Attributes.parse(Contents, ELFT::Endianness))
461 bool InitContent =
true);
468 return EF.template getEntry<Elf_Sym>(Sym.
d.
a, Sym.
d.
b);
473 auto RelSecOrErr =
EF.getSection(Rel.
d.
a);
481 return reinterpret_cast<const Elf_Shdr *
>(Sec.
p);
509 return v->getType() ==
534 auto SectionsOrErr =
EF.sections();
536 return SectionsOrErr.takeError();
538 for (
const Elf_Shdr &Sec : *SectionsOrErr) {
539 switch (Sec.sh_type) {
567 auto SymTabOrErr =
EF.getSection(Sym.
d.
a);
569 return SymTabOrErr.takeError();
570 const Elf_Shdr *SymTableSec = *SymTabOrErr;
571 auto StrTabOrErr =
EF.getSection(SymTableSec->sh_link);
573 return StrTabOrErr.takeError();
574 const Elf_Shdr *StringTableSec = *StrTabOrErr;
575 auto SymStrTabOrErr =
EF.getStringTable(*StringTableSec);
577 return SymStrTabOrErr.takeError();
579 if (Name && !Name->empty())
586 return (*SecOrErr)->getName();
613 uint64_t Ret = (*SymOrErr)->st_value;
617 const Elf_Ehdr &Header =
EF.getHeader();
630 if (!SymbolValueOrErr)
634 uint64_t Result = *SymbolValueOrErr;
639 switch ((*SymOrErr)->st_shndx) {
646 auto SymTabOrErr =
EF.getSection(Symb.
d.
a);
648 return SymTabOrErr.takeError();
656 ShndxTable = *ShndxTableOrErr;
658 return ShndxTableOrErr.takeError();
662 EF.getSection(**SymOrErr, *SymTabOrErr, ShndxTable);
665 const Elf_Shdr *Section = *SectionOrErr;
667 Result += Section->sh_addr;
679 return (*SymOrErr)->st_value;
685 return EF.getHeader().e_machine;
689 return EF.getHeader().e_type;
701uint64_t ELFObjectFile<ELFT>::getSymbolSize(
DataRefImpl Sym)
const {
702 Expected<const Elf_Sym *> SymOrErr = getSymbol(Sym);
705 return (*SymOrErr)->st_size;
710 return getSymbolSize(Symb);
718 return (*SymOrErr)->getBinding();
726 return (*SymOrErr)->st_other;
734 return (*SymOrErr)->getType();
744 switch ((*SymOrErr)->getType()) {
768 const Elf_Sym *ESym = *SymOrErr;
786 if (ESym == SymbolsOrErr->begin())
790 return SymbolsOrErr.takeError();
795 if (ESym == SymbolsOrErr->begin())
799 return SymbolsOrErr.takeError();
804 if (Name.starts_with(
"$d") || Name.starts_with(
"$x"))
814 if (Name.empty() || Name.starts_with(
"$d") || Name.starts_with(
"$t") ||
815 Name.starts_with(
"$a"))
821 if (ESym->getType() ==
ELF::STT_FUNC && (ESym->st_value & 1) == 1)
826 if (Name.starts_with(
"$d") || Name.starts_with(
"$t"))
836 if (Name ==
".L0 " || Name.starts_with(
"$d") || Name.starts_with(
"$x"))
865 const Elf_Shdr *SymTab)
const {
871 if (!ShndxTableOrErr)
873 ShndxTable = *ShndxTableOrErr;
876 auto ESecOrErr =
EF.getSection(*ESym, SymTab, ShndxTable);
878 return ESecOrErr.takeError();
880 const Elf_Shdr *ESec = *ESecOrErr;
885 Sec.
p =
reinterpret_cast<intptr_t
>(ESec);
896 auto SymTabOrErr =
EF.getSection(Symb.
d.
a);
898 return SymTabOrErr.takeError();
920 auto SectionsOrErr =
EF.sections();
923 llvm_unreachable(
"unable to get section index");
925 const Elf_Shdr *
First = SectionsOrErr->begin();
942 (uintptr_t)
base() + EShdr->sh_offset, EShdr->sh_size))
977std::vector<SectionRef>
979 std::vector<SectionRef> Res;
980 std::vector<uintptr_t> Offsets;
982 auto SectionsOrErr =
EF.sections();
986 for (
const Elf_Shdr &Sec : *SectionsOrErr) {
990 reinterpret_cast<Elf_Dyn *
>((uintptr_t)
base() + Sec.sh_offset);
992 if (
Dynamic->d_tag == ELF::DT_REL ||
Dynamic->d_tag == ELF::DT_RELA ||
993 Dynamic->d_tag == ELF::DT_JMPREL) {
994 Offsets.push_back(
Dynamic->d_un.d_val);
998 for (
const Elf_Shdr &Sec : *SectionsOrErr) {
1000 Res.emplace_back(
toDRI(&Sec),
this);
1005template <
class ELFT>
1010template <
class ELFT>
1017template <
class ELFT>
1024template <
class ELFT>
1027 if (!SectionNameOrErr) {
1037template <
class ELFT>
1041 auto SectionsOrErr =
EF.sections();
1044 uintptr_t SHT =
reinterpret_cast<uintptr_t
>((*SectionsOrErr).begin());
1045 RelData.
d.
a = (Sec.
p - SHT) /
EF.getHeader().e_shentsize;
1047 if (
reinterpret_cast<const Elf_Shdr *
>(Sec.
p)->sh_type ==
ELF::SHT_CREL) {
1048 if (RelData.
d.
a + 1 >
Crels.size())
1049 Crels.resize(RelData.
d.
a + 1);
1050 auto &Crel =
Crels[RelData.
d.
a];
1056 [&](Elf_Crel Crel) {
Crels[RelData.
d.
a][
I++] = Crel; });
1058 Crel.assign(1, Elf_Crel{0, 0, 0, 0});
1068template <
class ELFT>
1071 const Elf_Shdr *S =
reinterpret_cast<const Elf_Shdr *
>(Sec.
p);
1075 RelData.
d.
b =
Crels[RelData.
d.
a].size();
1083 auto SymSecOrErr =
EF.getSection(RelSec->sh_link);
1088 RelData.
d.
b += S->sh_size / S->sh_entsize;
1092template <
class ELFT>
1096 uintX_t
Type = EShdr->sh_type;
1107template <
class ELFT>
1112template <
class ELFT>
1118 symbolIdx =
getCrel(Rel).r_symidx;
1120 symbolIdx =
getRel(Rel)->getSymbol(
EF.isMips64EL());
1122 symbolIdx =
getRela(Rel)->getSymbol(
EF.isMips64EL());
1128 SymbolData.
d.
a = sec->sh_link;
1129 SymbolData.
d.
b = symbolIdx;
1133template <
class ELFT>
1139 return getRel(Rel)->r_offset;
1141 return getRela(Rel)->r_offset;
1144template <
class ELFT>
1150 return getRel(Rel)->getType(
EF.isMips64EL());
1152 return getRela(Rel)->getType(
EF.isMips64EL());
1155template <
class ELFT>
1160template <
class ELFT>
1164 EF.getRelocationTypeName(type, Result);
1167template <
class ELFT>
1171 return (int64_t)
getRela(Rel)->r_addend;
1173 return (int64_t)
getCrel(Rel).r_addend;
1174 return createError(
"Relocation section does not have addends");
1177template <
class ELFT>
1181 auto Ret =
EF.template getEntry<Elf_Rel>(Rel.
d.
a, Rel.
d.
b);
1187template <
class ELFT>
1191 auto Ret =
EF.template getEntry<Elf_Rela>(Rela.
d.
a, Rela.
d.
b);
1197template <
class ELFT>
1205template <
class ELFT>
1209 if (
Error E = EFOrErr.takeError())
1210 return std::move(
E);
1212 ELFObjectFile<ELFT> Obj = {Object, std::move(*EFOrErr),
nullptr,
nullptr,
1215 if (
Error E = Obj.initContent())
1216 return std::move(
E);
1217 return std::move(Obj);
1220template <
class ELFT>
1222 const Elf_Shdr *DotDynSymSec,
1223 const Elf_Shdr *DotSymtabSec,
1224 const Elf_Shdr *DotSymtabShndx)
1228 EF(
std::
move(EF)), DotDynSymSec(DotDynSymSec), DotSymtabSec(DotSymtabSec),
1229 DotSymtabShndxSec(DotSymtabShndx) {}
1231template <
class ELFT>
1232ELFObjectFile<ELFT>::ELFObjectFile(ELFObjectFile<ELFT> &&
Other)
1236template <
class ELFT>
1244template <
class ELFT>
1253template <
class ELFT>
1263template <
class ELFT>
1272template <
class ELFT>
1274 auto SectionsOrErr =
EF.sections();
1280template <
class ELFT>
1282 auto SectionsOrErr =
EF.sections();
1288template <
class ELFT>
1290 return ELFT::Is64Bits ? 8 : 4;
1293template <
class ELFT>
1298 switch (
EF.getHeader().e_machine) {
1300 return "elf32-m68k";
1302 return "elf32-i386";
1304 return "elf32-iamcu";
1306 return "elf32-x86-64";
1308 return (IsLittleEndian ?
"elf32-littlearm" :
"elf32-bigarm");
1312 return "elf32-hexagon";
1314 return "elf32-lanai";
1316 return "elf32-mips";
1318 return "elf32-msp430";
1320 return (IsLittleEndian ?
"elf32-powerpcle" :
"elf32-powerpc");
1322 return (IsLittleEndian ?
"elf32-littleriscv" :
"elf32-bigriscv");
1324 return "elf32-csky";
1327 return "elf32-sparc";
1329 return "elf32-amdgpu";
1331 return "elf32-loongarch";
1333 return "elf32-xtensa";
1335 return "elf32-unknown";
1338 switch (
EF.getHeader().e_machine) {
1340 return "elf64-i386";
1342 return "elf64-x86-64";
1344 return (IsLittleEndian ?
"elf64-littleaarch64" :
"elf64-bigaarch64");
1346 return (IsLittleEndian ?
"elf64-powerpcle" :
"elf64-powerpc");
1348 return (IsLittleEndian ?
"elf64-littleriscv" :
"elf64-bigriscv");
1350 return "elf64-s390";
1352 return "elf64-sparc";
1354 return "elf64-mips";
1356 return "elf64-amdgpu";
1362 return "elf64-loongarch";
1364 return "elf64-unknown";
1374 switch (
EF.getHeader().e_machine) {
1426 if (!IsLittleEndian)
1502template <
class ELFT>
1504 return EF.getHeader().e_entry;
1507template <
class ELFT>
1517template <
class ELFT>
1519 uintptr_t SHT =
reinterpret_cast<uintptr_t
>(
cantFail(
EF.sections()).begin());
1520 auto I = (Sec.
p - SHT) /
EF.getHeader().e_shentsize;
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static StringRef getSymbolName(SymbolKind SymKind)
DXIL Resource Implicit Binding
#define LLVM_ELF_IMPORT_TYPES_ELFT(ELFT)
static FeatureBitset getFeatures(MCSubtargetInfo &STI, StringRef CPU, StringRef TuneCPU, StringRef FS, ArrayRef< StringRef > ProcNames, ArrayRef< SubtargetSubTypeKV > ProcDesc, ArrayRef< SubtargetFeatureKV > ProcFeatures)
static uint64_t getSymbolValue(const MCSymbolCOFF &Symbol, const MCAssembler &Asm)
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Base class for error info classes.
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
Tagged union holding either a T or a Error.
Error takeError()
Take ownership of the stored error.
reference get()
Returns a reference to the stored T value.
Generic base class for all target subtargets.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Represent a constant reference to a string, i.e.
Manages the enabling and disabling of subtarget specific features.
Triple - Helper class for working with autoconf configuration names.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
The instances of the Type class are immutable: once they are created, they are never changed.
A range adaptor for a pair of iterators.
const SymbolicFile * getObject() const
DataRefImpl getRawDataRefImpl() const
static unsigned int getELFType(bool isLE, bool is64Bits)
MemoryBufferRef getMemoryBufferRef() const
static Error checkOffset(MemoryBufferRef M, uintptr_t Addr, const uint64_t Size)
static Expected< ELFFile > create(StringRef Object)
virtual uint64_t getSymbolSize(DataRefImpl Symb) const =0
friend class ELFRelocationRef
virtual uint8_t getEIdentABIVersion() const =0
friend class ELFSectionRef
virtual Error getBuildAttributes(ELFAttributeParser &Attributes) const =0
std::vector< ELFPltEntry > getPltEntries(const MCSubtargetInfo &STI) const
virtual uint64_t getSectionFlags(DataRefImpl Sec) const =0
virtual uint16_t getEType() const =0
virtual uint8_t getSymbolELFType(DataRefImpl Symb) const =0
virtual uint8_t getEIdentOSABI() const =0
Expected< std::vector< VersionEntry > > readDynsymVersions() const
Returns a vector containing a symbol version for each dynamic symbol.
virtual uint8_t getSymbolOther(DataRefImpl Symb) const =0
virtual elf_symbol_iterator_range getDynamicSymbolIterators() const =0
virtual uint32_t getSectionType(DataRefImpl Sec) const =0
friend class ELFSymbolRef
StringRef getCrelDecodeProblem(SectionRef Sec) const
elf_symbol_iterator_range symbols() const
virtual Expected< int64_t > getRelocationAddend(DataRefImpl Rel) const =0
virtual uint8_t getSymbolBinding(DataRefImpl Symb) const =0
iterator_range< elf_symbol_iterator > elf_symbol_iterator_range
virtual uint16_t getEMachine() const =0
static bool classof(const Binary *v)
virtual unsigned getPlatformFlags() const =0
Returns platform-specific object flags, if any.
ELFObjectFileBase(unsigned int Type, MemoryBufferRef Source)
virtual uint64_t getSectionOffset(DataRefImpl Sec) const =0
Expected< std::vector< BBAddrMap > > readBBAddrMap(std::optional< unsigned > TextSectionIndex=std::nullopt, std::vector< PGOAnalysisMap > *PGOAnalyses=nullptr) const
Returns a vector of all BB address maps in the object file.
static bool classof(const Binary *v)
const ELFFile< ELFT > & getELFFile() const
Expected< StringRef > getSectionName(DataRefImpl Sec) const override
std::vector< SectionRef > dynamic_relocation_sections() const override
uint64_t getRelocationType(DataRefImpl Rel) const override
bool isSectionText(DataRefImpl Sec) const override
uint8_t getSymbolELFType(DataRefImpl Symb) const override
uint64_t getSectionAlignment(DataRefImpl Sec) const override
bool is64Bit() const override
DataRefImpl toDRI(const Elf_Dyn *Dyn) const
bool isSectionVirtual(DataRefImpl Sec) const override
Triple::OSType getOS() const override
SectionRef toSectionRef(const Elf_Shdr *Sec) const
bool IsContentValid() const
uint32_t getSectionType(DataRefImpl Sec) const override
symbol_iterator getRelocationSymbol(DataRefImpl Rel) const override
elf_symbol_iterator_range getDynamicSymbolIterators() const override
void createFakeSections()
Expected< const Elf_Sym * > getSymbol(DataRefImpl Sym) const
Expected< section_iterator > getSymbolSection(DataRefImpl Symb) const override
StringRef getRelocationTypeName(uint32_t Type) const
const Elf_Rel * getRel(DataRefImpl Rel) const
Elf_Crel getCrel(DataRefImpl Crel) const
ELFObjectFile(ELFObjectFile< ELFT > &&Other)
Expected< section_iterator > getSymbolSection(const Elf_Sym *Symb, const Elf_Shdr *SymTab) const
uint64_t getSymbolValueImpl(DataRefImpl Symb) const override
basic_symbol_iterator symbol_begin() const override
Expected< uint64_t > getSymbolAddress(DataRefImpl Symb) const override
ELFSymbolRef toSymbolRef(const Elf_Shdr *SymTable, unsigned SymbolNum) const
SmallVector< std::string, 0 > CrelDecodeProblems
const Elf_Rela * getRela(DataRefImpl Rela) const
static Expected< ELFObjectFile< ELFT > > create(MemoryBufferRef Object, bool InitContent=true)
bool isExportedToOtherDSO(const Elf_Sym *ESym) const
uint64_t getSectionAddress(DataRefImpl Sec) const override
Expected< ArrayRef< uint8_t > > getSectionContents(DataRefImpl Sec) const override
void getRelocationTypeName(DataRefImpl Rel, SmallVectorImpl< char > &Result) const override
uint64_t getSectionIndex(DataRefImpl Sec) const override
Expected< uint32_t > getSymbolFlags(DataRefImpl Symb) const override
bool isSectionData(DataRefImpl Sec) const override
const Elf_Shdr * DotSymtabSec
const Elf_Shdr * DotDynSymSec
uint32_t getSymbolAlignment(DataRefImpl Symb) const override
const Elf_Shdr * toELFShdrIter(DataRefImpl Sec) const
Triple::ArchType getArch() const override
uint64_t getCommonSymbolSizeImpl(DataRefImpl Symb) const override
uint64_t getSectionSize(DataRefImpl Sec) const override
bool isBerkeleyData(DataRefImpl Sec) const override
StringRef getFileFormatName() const override
bool isRelocatableObject() const override
True if this is a relocatable object (.o/.obj).
void moveSymbolNext(DataRefImpl &Symb) const override
uint8_t getSymbolOther(DataRefImpl Symb) const override
section_iterator section_end() const override
const Elf_Shdr * getRelSection(DataRefImpl Rel) const
Get the relocation section that contains Rel.
Expected< int64_t > getRelocationAddend(DataRefImpl Rel) const override
uint64_t getRelocationOffset(DataRefImpl Rel) const override
Expected< section_iterator > getRelocatedSection(DataRefImpl Sec) const override
void moveSectionNext(DataRefImpl &Sec) const override
bool isSectionBSS(DataRefImpl Sec) const override
unsigned getPlatformFlags() const override
Returns platform-specific object flags, if any.
uint64_t getSectionFlags(DataRefImpl Sec) const override
void moveRelocationNext(DataRefImpl &Rel) const override
relocation_iterator section_rel_begin(DataRefImpl Sec) const override
Expected< StringRef > getSymbolName(DataRefImpl Symb) const override
Error initContent() override
basic_symbol_iterator symbol_end() const override
uint8_t getSymbolBinding(DataRefImpl Symb) const override
uint64_t getSectionOffset(DataRefImpl Sec) const override
relocation_iterator section_rel_end(DataRefImpl Sec) const override
Expected< SymbolRef::Type > getSymbolType(DataRefImpl Symb) const override
const Elf_Shdr * getSection(DataRefImpl Sec) const
Error getBuildAttributes(ELFAttributeParser &Attributes) const override
DataRefImpl toDRI(const Elf_Shdr *Sec) const
elf_symbol_iterator dynamic_symbol_begin() const
const Elf_Shdr * DotSymtabShndxSec
elf_symbol_iterator dynamic_symbol_end() const
DataRefImpl toDRI(const Elf_Shdr *SymTable, unsigned SymbolNum) const
bool isDebugSection(DataRefImpl Sec) const override
section_iterator section_begin() const override
bool isSectionCompressed(DataRefImpl Sec) const override
SmallVector< SmallVector< Elf_Crel, 0 >, 0 > Crels
bool isBerkeleyText(DataRefImpl Sec) const override
uint8_t getBytesInAddress() const override
The number of bytes used to represent an address in this object file format.
Expected< uint64_t > getStartAddress() const override
StringRef getCrelDecodeProblem(DataRefImpl Sec) const
Expected< int64_t > getAddend() const
const ELFObjectFileBase * getObject() const
ELFRelocationRef(const RelocationRef &B)
uint64_t getFlags() const
const ELFObjectFileBase * getObject() const
uint64_t getOffset() const
ELFSectionRef(const SectionRef &B)
const ELFObjectFileBase * getObject() const
uint8_t getELFType() const
ELFSymbolRef(const SymbolRef &B)
uint8_t getBinding() const
StringRef getELFTypeName() const
const uint8_t * base() const
ObjectFile(unsigned int Type, MemoryBufferRef Source)
This is a value type class that represents a single relocation in the list of relocations in the obje...
const ObjectFile * getObject() const
DataRefImpl getRawDataRefImpl() const
This is a value type class that represents a single section in the list of sections in the object fil...
DataRefImpl getRawDataRefImpl() const
const ObjectFile * getObject() const
This is a value type class that represents a single symbol in the list of symbols in the object file.
const ObjectFile * getObject() const
virtual basic_symbol_iterator symbol_begin() const =0
virtual basic_symbol_iterator symbol_end() const =0
const SectionRef & operator*() const
const SectionRef * operator->() const
const ELFRelocationRef & operator*() const
elf_relocation_iterator(const relocation_iterator &B)
const ELFRelocationRef * operator->() const
elf_section_iterator(const section_iterator &B)
const ELFSectionRef * operator->() const
const ELFSectionRef & operator*() const
const ELFSymbolRef & operator*() const
elf_symbol_iterator(const basic_symbol_iterator &B)
const ELFSymbolRef * operator->() const
const SymbolRef * operator->() const
const SymbolRef & operator*() const
symbol_iterator(SymbolRef Sym)
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
@ EF_AMDGPU_MACH_AMDGCN_LAST
@ EF_AMDGPU_MACH_R600_LAST
@ EF_AMDGPU_MACH_AMDGCN_FIRST
@ EF_AMDGPU_MACH_R600_FIRST
static constexpr const StringLiteral & getSectionName(DebugSectionKind SectionKind)
Return the name of the section.
static Expected< const T * > getObject(MemoryBufferRef M, const void *Ptr, const uint64_t Size=sizeof(T))
Expected< const typename ELFT::Shdr * > getSection(typename ELFT::ShdrRange Sections, uint32_t Index)
bool operator<(const ELFSymbolRef &A, const ELFSymbolRef &B)
content_iterator< SectionRef > section_iterator
Error createError(const Twine &Err)
LLVM_ABI StringRef getELFRelocationTypeName(uint32_t Machine, uint32_t Type)
ELFObjectFile< ELF32BE > ELF32BEObjectFile
constexpr int NumElfSymbolTypes
content_iterator< BasicSymbolRef > basic_symbol_iterator
ELFObjectFile< ELF64LE > ELF64LEObjectFile
ELFObjectFile< ELF32LE > ELF32LEObjectFile
static Error decodeCrel(ArrayRef< uint8_t > Content, function_ref< void(uint64_t, bool)> HdrHandler, function_ref< void(Elf_Crel_Impl< Is64 >)> EntryHandler)
LLVM_ABI const llvm::EnumEntry< unsigned > ElfSymbolTypes[NumElfSymbolTypes]
content_iterator< RelocationRef > relocation_iterator
ELFObjectFile< ELF64BE > ELF64BEObjectFile
This is an optimization pass for GlobalISel generic memory operations.
void handleAllErrors(Error E, HandlerTs &&... Handlers)
Behaves the same as handleErrors, except that by contract all errors must be handled by the given han...
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
FunctionAddr VTableAddr Count
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
void cantFail(Error Err, const char *Msg=nullptr)
Report a fatal error if Err is a failure value.
@ Dynamic
Denotes mode unknown at compile time.
ArrayRef(const T &OneElt) -> ArrayRef< T >
std::string toString(const APInt &I, unsigned Radix, bool Signed, bool formatAsCLiteral=false, bool UpperCase=true, bool InsertSeparators=false)
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
LLVM_ABI std::error_code errorToErrorCode(Error Err)
Helper for converting an ECError to a std::error_code.
void consumeError(Error Err)
Consume a Error without doing anything.
Implement std::hash so that hash_code can be used in STL containers.
std::optional< DataRefImpl > Symbol
struct llvm::object::DataRefImpl::@005117267142344013370254144343227032034000327225 d