13#ifndef LLVM_OBJECT_ELFOBJECTFILE_H
14#define LLVM_OBJECT_ELFOBJECTFILE_H
41template <
typename T>
class SmallVectorImpl;
123 readBBAddrMap(std::optional<unsigned> TextSectionIndex = std::nullopt,
124 std::vector<PGOAnalysisMap> *PGOAnalyses =
nullptr)
const;
153 assert(isa<ELFObjectFileBase>(
B->getObject()));
194 if (EE.Value ==
Type) {
205 if (DRIA.
d.
a == DRIB.
d.
a)
206 return DRIA.
d.
b < DRIB.
d.
b;
207 return DRIA.
d.
a < DRIB.
d.
a;
263 uint16_t getEMachine()
const override;
265 uint8_t getEIdentABIVersion()
const override;
286 bool ContentValid =
false;
309 const Elf_Shdr *SymTab)
const;
356 auto SectionsOrErr =
EF.sections();
357 if (!SectionsOrErr) {
362 uintptr_t SHT =
reinterpret_cast<uintptr_t
>((*SectionsOrErr).begin());
363 unsigned SymTableIndex =
364 (
reinterpret_cast<uintptr_t
>(SymTable) - SHT) /
sizeof(Elf_Shdr);
366 DRI.
d.
a = SymTableIndex;
372 return reinterpret_cast<const Elf_Shdr *
>(Sec.
p);
377 DRI.
p =
reinterpret_cast<uintptr_t
>(Sec);
383 DRI.
p =
reinterpret_cast<uintptr_t
>(Dyn);
388 unsigned char Binding = ESym->getBinding();
389 unsigned char Visibility = ESym->getVisibility();
402 switch (getEMachine()) {
416 auto SectionsOrErr =
EF.sections();
418 return SectionsOrErr.takeError();
419 for (
const Elf_Shdr &Sec : *SectionsOrErr) {
420 if (Sec.sh_type !=
Type)
422 auto ErrorOrContents =
EF.getSectionContents(Sec);
423 if (!ErrorOrContents)
424 return ErrorOrContents.takeError();
426 auto Contents = ErrorOrContents.get();
445 bool InitContent =
true);
451 return EF.template getEntry<Elf_Sym>(
Sym.d.a,
Sym.d.b);
456 auto RelSecOrErr =
EF.getSection(Rel.
d.
a);
464 return reinterpret_cast<const Elf_Shdr *
>(Sec.
p);
492 return v->getType() ==
515 auto SectionsOrErr = EF.sections();
517 return SectionsOrErr.takeError();
519 for (
const Elf_Shdr &Sec : *SectionsOrErr) {
520 switch (Sec.sh_type) {
532 if (!DotSymtabShndxSec)
533 DotSymtabShndxSec = &Sec;
548 auto SymTabOrErr = EF.getSection(
Sym.d.a);
550 return SymTabOrErr.takeError();
551 const Elf_Shdr *SymTableSec = *SymTabOrErr;
552 auto StrTabOrErr = EF.getSection(SymTableSec->sh_link);
554 return StrTabOrErr.takeError();
555 const Elf_Shdr *StringTableSec = *StrTabOrErr;
556 auto SymStrTabOrErr = EF.getStringTable(*StringTableSec);
558 return SymStrTabOrErr.takeError();
567 return (*SecOrErr)->getName();
594 uint64_t Ret = (*SymOrErr)->st_value;
598 const Elf_Ehdr &Header = EF.getHeader();
611 if (!SymbolValueOrErr)
615 uint64_t Result = *SymbolValueOrErr;
620 switch ((*SymOrErr)->st_shndx) {
627 auto SymTabOrErr = EF.getSection(Symb.
d.
a);
629 return SymTabOrErr.takeError();
633 if (DotSymtabShndxSec) {
636 EF.getSHNDXTable(*DotSymtabShndxSec))
637 ShndxTable = *ShndxTableOrErr;
639 return ShndxTableOrErr.takeError();
643 EF.getSection(**SymOrErr, *SymTabOrErr, ShndxTable);
646 const Elf_Shdr *Section = *SectionOrErr;
648 Result += Section->sh_addr;
660 return (*SymOrErr)->st_value;
666 return EF.getHeader().e_machine;
669template <
class ELFT>
uint16_t ELFObjectFile<ELFT>::getEType()
const {
670 return EF.getHeader().e_type;
673template <
class ELFT> uint8_t ELFObjectFile<ELFT>::getEIdentABIVersion()
const {
678uint64_t ELFObjectFile<ELFT>::getSymbolSize(DataRefImpl
Sym)
const {
679 Expected<const Elf_Sym *> SymOrErr = getSymbol(
Sym);
682 return (*SymOrErr)->st_size;
687 return getSymbolSize(Symb);
695 return (*SymOrErr)->getBinding();
703 return (*SymOrErr)->st_other;
711 return (*SymOrErr)->getType();
721 switch ((*SymOrErr)->getType()) {
745 const Elf_Sym *ESym = *SymOrErr;
761 EF.symbols(DotSymtabSec)) {
763 if (ESym == SymbolsOrErr->begin())
767 return SymbolsOrErr.takeError();
770 EF.symbols(DotDynSymSec)) {
772 if (ESym == SymbolsOrErr->begin())
776 return SymbolsOrErr.takeError();
781 if (
Name.starts_with(
"$d") ||
Name.starts_with(
"$x"))
787 }
else if (EF.getHeader().e_machine ==
ELF::EM_ARM) {
791 if (
Name.empty() ||
Name.starts_with(
"$d") ||
Name.starts_with(
"$t") ||
792 Name.starts_with(
"$a"))
798 if (ESym->getType() ==
ELF::STT_FUNC && (ESym->st_value & 1) == 1)
803 if (
Name.starts_with(
"$d") ||
Name.starts_with(
"$t"))
813 if (
Name ==
".L0 " ||
Name.starts_with(
"$d") ||
Name.starts_with(
"$x"))
827 if (isExportedToOtherDSO(ESym))
842 const Elf_Shdr *SymTab)
const {
844 if (DotSymtabShndxSec) {
847 EF.getSHNDXTable(*DotSymtabShndxSec);
848 if (!ShndxTableOrErr)
850 ShndxTable = *ShndxTableOrErr;
853 auto ESecOrErr = EF.getSection(*ESym, SymTab, ShndxTable);
857 const Elf_Shdr *ESec = *ESecOrErr;
859 return section_end();
862 Sec.
p =
reinterpret_cast<intptr_t
>(ESec);
873 auto SymTabOrErr = EF.getSection(Symb.
d.
a);
875 return SymTabOrErr.takeError();
876 return getSymbolSection(*SymOrErr, *SymTabOrErr);
897 auto SectionsOrErr = EF.sections();
900 llvm_unreachable(
"unable to get section index");
902 const Elf_Shdr *
First = SectionsOrErr->begin();
916 return ArrayRef((
const uint8_t *)base(), (
size_t)0);
918 checkOffset(getMemoryBufferRef(),
919 (uintptr_t)base() + EShdr->sh_offset, EShdr->sh_size))
921 return ArrayRef((
const uint8_t *)base() + EShdr->sh_offset, EShdr->sh_size);
955std::vector<SectionRef>
957 std::vector<SectionRef> Res;
958 std::vector<uintptr_t> Offsets;
960 auto SectionsOrErr = EF.sections();
964 for (
const Elf_Shdr &Sec : *SectionsOrErr) {
968 reinterpret_cast<Elf_Dyn *
>((uintptr_t)base() + Sec.sh_offset);
970 if (
Dynamic->d_tag == ELF::DT_REL ||
Dynamic->d_tag == ELF::DT_RELA ||
971 Dynamic->d_tag == ELF::DT_JMPREL) {
972 Offsets.push_back(
Dynamic->d_un.d_val);
976 for (
const Elf_Shdr &Sec : *SectionsOrErr) {
978 Res.emplace_back(toDRI(&Sec),
this);
1002template <
class ELFT>
1005 if (!SectionNameOrErr) {
1015template <
class ELFT>
1019 auto SectionsOrErr = EF.sections();
1022 uintptr_t SHT =
reinterpret_cast<uintptr_t
>((*SectionsOrErr).begin());
1023 RelData.
d.
a = (Sec.
p - SHT) / EF.getHeader().e_shentsize;
1028template <
class ELFT>
1031 const Elf_Shdr *S =
reinterpret_cast<const Elf_Shdr *
>(Sec.
p);
1036 const Elf_Shdr *RelSec = getRelSection(RelData);
1039 auto SymSecOrErr = EF.getSection(RelSec->sh_link);
1044 RelData.
d.
b += S->sh_size / S->sh_entsize;
1048template <
class ELFT>
1052 uintX_t
Type = EShdr->sh_type;
1054 return section_end();
1063template <
class ELFT>
1068template <
class ELFT>
1072 const Elf_Shdr *sec = getRelSection(Rel);
1074 symbolIdx = getRel(Rel)->getSymbol(EF.isMips64EL());
1076 symbolIdx = getRela(Rel)->getSymbol(EF.isMips64EL());
1078 return symbol_end();
1082 SymbolData.
d.
a = sec->sh_link;
1083 SymbolData.
d.
b = symbolIdx;
1087template <
class ELFT>
1089 const Elf_Shdr *sec = getRelSection(Rel);
1091 return getRel(Rel)->r_offset;
1093 return getRela(Rel)->r_offset;
1096template <
class ELFT>
1098 const Elf_Shdr *sec = getRelSection(Rel);
1100 return getRel(Rel)->getType(EF.isMips64EL());
1102 return getRela(Rel)->getType(EF.isMips64EL());
1105template <
class ELFT>
1110template <
class ELFT>
1113 uint32_t type = getRelocationType(Rel);
1114 EF.getRelocationTypeName(type, Result);
1117template <
class ELFT>
1122 return (int64_t)getRela(Rel)->r_addend;
1125template <
class ELFT>
1129 auto Ret = EF.template getEntry<Elf_Rel>(Rel.
d.
a, Rel.
d.
b);
1135template <
class ELFT>
1139 auto Ret = EF.template getEntry<Elf_Rela>(Rela.
d.
a, Rela.
d.
b);
1145template <
class ELFT>
1149 if (
Error E = EFOrErr.takeError())
1150 return std::move(
E);
1156 return std::move(
E);
1157 return std::move(Obj);
1160template <
class ELFT>
1162 const Elf_Shdr *DotDynSymSec,
1163 const Elf_Shdr *DotSymtabSec,
1164 const Elf_Shdr *DotSymtabShndx)
1168 EF(EF), DotDynSymSec(DotDynSymSec), DotSymtabSec(DotSymtabSec),
1169 DotSymtabShndxSec(DotSymtabShndx) {}
1171template <
class ELFT>
1174 Other.DotSymtabSec,
Other.DotSymtabShndxSec) {}
1176template <
class ELFT>
1180 DotSymtabSec && DotSymtabSec->sh_size >=
sizeof(Elf_Sym) ? 1 : 0);
1184template <
class ELFT>
1186 const Elf_Shdr *SymTab = DotSymtabSec;
1188 return symbol_begin();
1189 DataRefImpl Sym = toDRI(SymTab, SymTab->sh_size /
sizeof(Elf_Sym));
1193template <
class ELFT>
1195 if (!DotDynSymSec || DotDynSymSec->sh_size <
sizeof(Elf_Sym))
1203template <
class ELFT>
1205 const Elf_Shdr *SymTab = DotDynSymSec;
1207 return dynamic_symbol_begin();
1208 DataRefImpl Sym = toDRI(SymTab, SymTab->sh_size /
sizeof(Elf_Sym));
1212template <
class ELFT>
1214 auto SectionsOrErr = EF.sections();
1220template <
class ELFT>
1222 auto SectionsOrErr = EF.sections();
1228template <
class ELFT>
1230 return ELFT::Is64Bits ? 8 : 4;
1233template <
class ELFT>
1238 switch (EF.getHeader().e_machine) {
1240 return "elf32-m68k";
1242 return "elf32-i386";
1244 return "elf32-iamcu";
1246 return "elf32-x86-64";
1248 return (IsLittleEndian ?
"elf32-littlearm" :
"elf32-bigarm");
1252 return "elf32-hexagon";
1254 return "elf32-lanai";
1256 return "elf32-mips";
1258 return "elf32-msp430";
1260 return (IsLittleEndian ?
"elf32-powerpcle" :
"elf32-powerpc");
1262 return "elf32-littleriscv";
1264 return "elf32-csky";
1267 return "elf32-sparc";
1269 return "elf32-amdgpu";
1271 return "elf32-loongarch";
1273 return "elf32-xtensa";
1275 return "elf32-unknown";
1278 switch (EF.getHeader().e_machine) {
1280 return "elf64-i386";
1282 return "elf64-x86-64";
1284 return (IsLittleEndian ?
"elf64-littleaarch64" :
"elf64-bigaarch64");
1286 return (IsLittleEndian ?
"elf64-powerpcle" :
"elf64-powerpc");
1288 return "elf64-littleriscv";
1290 return "elf64-s390";
1292 return "elf64-sparc";
1294 return "elf64-mips";
1296 return "elf64-amdgpu";
1302 return "elf64-loongarch";
1304 return "elf64-unknown";
1314 switch (EF.getHeader().e_machine) {
1366 if (!IsLittleEndian)
1441template <
class ELFT>
1443 return EF.getHeader().e_entry;
1446template <
class ELFT>
1449 return make_range(dynamic_symbol_begin(), dynamic_symbol_end());
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static StringRef getSymbolName(SymbolKind SymKind)
#define LLVM_ELF_IMPORT_TYPES_ELFT(ELFT)
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
static uint64_t getSymbolValue(const MCSymbol &Symbol, const MCAsmLayout &Layout)
ArrayRef - 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.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
StringRef - 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)
static Expected< ELFFile > create(StringRef Object)
virtual uint64_t getSymbolSize(DataRefImpl Symb) const =0
virtual uint8_t getEIdentABIVersion() const =0
virtual Error getBuildAttributes(ELFAttributeParser &Attributes) const =0
virtual uint64_t getSectionFlags(DataRefImpl Sec) const =0
virtual uint16_t getEType() const =0
virtual uint8_t getSymbolELFType(DataRefImpl Symb) 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
elf_symbol_iterator_range symbols() const
virtual Expected< int64_t > getRelocationAddend(DataRefImpl Rel) const =0
std::vector< ELFPltEntry > getPltEntries() const
Expected< SubtargetFeatures > getFeatures() const override
virtual uint8_t getSymbolBinding(DataRefImpl Symb) const =0
std::optional< StringRef > tryGetCPUName() const override
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.
void setARMSubArch(Triple &TheTriple) const override
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
const Elf_Rel * getRel(DataRefImpl Rel) const
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
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
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
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
This class is the base class for all object file types.
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
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)
Error createError(const Twine &Err)
StringRef getELFRelocationTypeName(uint32_t Machine, uint32_t Type)
constexpr int NumElfSymbolTypes
content_iterator< SectionRef > section_iterator
content_iterator< RelocationRef > relocation_iterator
content_iterator< BasicSymbolRef > basic_symbol_iterator
const llvm::EnumEntry< unsigned > ElfSymbolTypes[NumElfSymbolTypes]
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.
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
@ Dynamic
Denotes mode unknown at compile time.
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.
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.
std::optional< DataRefImpl > Symbol
struct llvm::object::DataRefImpl::@355 d