38using namespace object;
48 {
"Unknown",
"<unknown>: 7", 7},
49 {
"Unknown",
"<unknown>: 8", 8},
50 {
"Unknown",
"<unknown>: 9", 9},
52 {
"OS Specific",
"<OS specific>: 11", 11},
53 {
"OS Specific",
"<OS specific>: 12", 12},
54 {
"Proc Specific",
"<processor specific>: 13", 13},
55 {
"Proc Specific",
"<processor specific>: 14", 14},
56 {
"Proc Specific",
"<processor specific>: 15", 15}
66 if (
Error E = Ret.takeError())
68 return std::make_unique<ELFObjectFile<ELFT>>(std::move(*Ret));
73 std::pair<unsigned char, unsigned char> Ident =
75 std::size_t MaxAlignment =
84 return createPtr<ELF32LE>(Obj, InitContent);
86 return createPtr<ELF32BE>(Obj, InitContent);
91 return createPtr<ELF64LE>(Obj, InitContent);
93 return createPtr<ELF64BE>(Obj, InitContent);
170 std::optional<unsigned> Attr =
303 std::optional<StringRef> Attr =
313 return ParseResult.takeError();
314 auto &ISAInfo = *ParseResult;
316 if (ISAInfo->getXLen() == 32)
318 else if (ISAInfo->getXLen() == 64)
350 return getMIPSFeatures();
352 return getARMFeatures();
354 return getRISCVFeatures();
356 return getLoongArchFeatures();
365 return getAMDGPUCPUName();
373StringRef ELFObjectFileBase::getAMDGPUCPUName()
const {
529 std::optional<unsigned> Attr =
561 std::optional<unsigned> ArchProfileAttr =
563 if (ArchProfileAttr &&
605std::vector<std::pair<std::optional<DataRefImpl>,
uint64_t>>
615 JumpSlotReloc = ELF::R_386_JUMP_SLOT;
618 JumpSlotReloc = ELF::R_X86_64_JUMP_SLOT;
622 JumpSlotReloc = ELF::R_AARCH64_JUMP_SLOT;
627 std::unique_ptr<const MCInstrInfo> MII(
T->createMCInstrInfo());
628 std::unique_ptr<const MCInstrAnalysis> MIA(
629 T->createMCInstrAnalysis(MII.get()));
632 std::optional<SectionRef> Plt, RelaPlt, GotPlt;
643 else if (
Name ==
".rela.plt" ||
Name ==
".rel.plt")
645 else if (
Name ==
".got.plt")
648 if (!Plt || !RelaPlt || !GotPlt)
655 auto PltEntries = MIA->findPltEntries(Plt->getAddress(),
656 arrayRefFromStringRef(*PltContents),
657 GotPlt->getAddress(),
Triple);
660 for (
const auto &Entry : PltEntries)
661 GotToPlt.
insert(std::make_pair(Entry.second, Entry.first));
664 std::vector<std::pair<std::optional<DataRefImpl>,
uint64_t>> Result;
665 for (
const auto &Relocation : RelaPlt->relocations()) {
666 if (Relocation.getType() != JumpSlotReloc)
668 auto PltEntryIter = GotToPlt.
find(Relocation.getOffset());
669 if (PltEntryIter != GotToPlt.
end()) {
672 Result.emplace_back(std::nullopt, PltEntryIter->second);
682 const ELFFile<ELFT> &EF, std::optional<unsigned> TextSectionIndex) {
683 using Elf_Shdr =
typename ELFT::Shdr;
685 std::vector<BBAddrMap> BBAddrMaps;
692 if (!TextSectionIndex)
696 return createError(
"unable to get the linked-to section for " +
699 if (*TextSectionIndex != std::distance(Sections.begin(), *TextSecOrErr))
706 if (!SectionRelocMapOrErr)
709 for (
auto const &[Sec, RelocSec] : *SectionRelocMapOrErr) {
710 if (IsRelocatable && !RelocSec)
711 return createError(
"unable to get relocation section for " +
718 std::move(BBAddrMapOrErr->begin(), BBAddrMapOrErr->end(),
719 std::back_inserter(BBAddrMaps));
728 using Elf_Shdr =
typename ELFT::Shdr;
729 const Elf_Shdr *VerSec =
nullptr;
730 const Elf_Shdr *VerNeedSec =
nullptr;
731 const Elf_Shdr *VerDefSec =
nullptr;
742 return std::vector<VersionEntry>();
749 std::vector<VersionEntry> Ret;
754 EF.template getEntry<typename ELFT::Versym>(*VerSec,
I);
757 " from " +
describe(EF, *VerSec) +
": " +
762 return createError(
"unable to read flags for symbol with index " +
767 (*VerEntryOrErr)->vs_index, IsDefault, *MapOrErr,
771 " of " +
describe(EF, *VerSec) +
": " +
774 Ret.push_back({(*VerOrErr).str(), IsDefault});
783 if (
const auto *Obj = dyn_cast<ELF32LEObjectFile>(
this))
785 if (
const auto *Obj = dyn_cast<ELF32BEObjectFile>(
this))
787 if (
const auto *Obj = dyn_cast<ELF64LEObjectFile>(
this))
794 std::optional<unsigned> TextSectionIndex)
const {
795 if (
const auto *Obj = dyn_cast<ELF32LEObjectFile>(
this))
797 if (
const auto *Obj = dyn_cast<ELF64LEObjectFile>(
this))
799 if (
const auto *Obj = dyn_cast<ELF32BEObjectFile>(
this))
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static Expected< std::unique_ptr< ELFObjectFile< ELFT > > > createPtr(MemoryBufferRef Object, bool InitContent)
static Expected< std::vector< BBAddrMap > > readBBAddrMapImpl(const ELFFile< ELFT > &EF, std::optional< unsigned > TextSectionIndex)
static Expected< std::vector< VersionEntry > > readDynsymVersionsImpl(const ELFFile< ELFT > &EF, ELFObjectFileBase::elf_symbol_iterator_range Symbols)
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
iterator find(const_arg_type_t< KeyT > Val)
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Lightweight error class with error context and mandatory checking.
Tagged union holding either a T or a Error.
Error takeError()
Take ownership of the stored error.
const char * getBufferStart() const
StringRef getBuffer() const
static llvm::Expected< std::unique_ptr< RISCVISAInfo > > parseArchString(StringRef Arch, bool EnableExperimentalExtension, bool ExperimentalExtensionVersionCheck=true, bool IgnoreUnknown=false)
Parse RISCV ISA info from arch string.
StringRef - Represent a constant reference to a string, i.e.
Manages the enabling and disabling of subtarget specific features.
void AddFeature(StringRef String, bool Enable=true)
Adds Features.
void addFeaturesVector(const ArrayRef< std::string > OtherFeatures)
Triple - Helper class for working with autoconf configuration names.
void setArchName(StringRef Str)
Set the architecture (first) component of the triple by name.
bool isThumb() const
Tests whether the target is Thumb (little and big endian).
SubArchType getSubArch() const
get the parsed subarchitecture type for this triple.
ArchType getArch() const
Get the parsed architecture type of this triple.
const std::string & str() const
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.
DataRefImpl getRawDataRefImpl() const
bool isLittleEndian() const
const Elf_Ehdr & getHeader() const
Expected< std::vector< BBAddrMap > > decodeBBAddrMap(const Elf_Shdr &Sec, const Elf_Shdr *RelaSec=nullptr) const
Returns a vector of BBAddrMap structs corresponding to each function within the text section that the...
Expected< StringRef > getSymbolVersionByIndex(uint32_t SymbolVersionIndex, bool &IsDefault, SmallVector< std::optional< VersionEntry >, 0 > &VersionMap, std::optional< bool > IsSymHidden) const
Expected< Elf_Shdr_Range > sections() const
Expected< MapVector< const Elf_Shdr *, const Elf_Shdr * > > getSectionAndRelocations(std::function< Expected< bool >(const Elf_Shdr &)> IsMatch) const
Returns a map from every section matching IsMatch to its relocation section, or nullptr if it has no ...
Expected< SmallVector< std::optional< VersionEntry >, 0 > > loadVersionMap(const Elf_Shdr *VerNeedSec, const Elf_Shdr *VerDefSec) const
Expected< const Elf_Shdr * > getSection(const Elf_Sym &Sym, const Elf_Shdr *SymTab, DataRegion< Elf_Word > ShndxTable) const
std::vector< std::pair< std::optional< DataRefImpl >, uint64_t > > getPltAddresses() const
Expected< std::vector< BBAddrMap > > readBBAddrMap(std::optional< unsigned > TextSectionIndex=std::nullopt) const
Returns a vector of all BB address maps in the object file. When.
virtual Error getBuildAttributes(ELFAttributeParser &Attributes) const =0
Expected< std::vector< VersionEntry > > readDynsymVersions() const
Returns a vector containing a symbol version for each dynamic symbol.
virtual elf_symbol_iterator_range getDynamicSymbolIterators() const =0
Expected< SubtargetFeatures > getFeatures() const override
std::optional< StringRef > tryGetCPUName() const override
virtual uint16_t getEMachine() const =0
virtual unsigned getPlatformFlags() const =0
Returns platform-specific object flags, if any.
ELFObjectFileBase(unsigned int Type, MemoryBufferRef Source)
void setARMSubArch(Triple &TheTriple) const override
static Expected< ELFObjectFile< ELFT > > create(MemoryBufferRef Object, bool InitContent=true)
This class is the base class for all object file types.
static Expected< std::unique_ptr< ObjectFile > > createELFObjectFile(MemoryBufferRef Object, bool InitContent=true)
Triple makeTriple() const
Create a triple from the data in this object file.
section_iterator_range sections() const
This is a value type class that represents a single section in the list of sections in the object fil...
virtual basic_symbol_iterator symbol_end() const =0
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ AllowMVEIntegerAndFloat
@ EF_LOONGARCH_ABI_SINGLE_FLOAT
@ EF_LOONGARCH_ABI_DOUBLE_FLOAT
@ EF_LOONGARCH_ABI_SOFT_FLOAT
@ EF_LOONGARCH_ABI_MODIFIER_MASK
@ SHT_LLVM_BB_ADDR_MAP_V0
@ EF_AMDGPU_MACH_AMDGCN_GFX703
@ EF_AMDGPU_MACH_AMDGCN_GFX1035
@ EF_AMDGPU_MACH_AMDGCN_GFX1031
@ EF_AMDGPU_MACH_R600_CAYMAN
@ EF_AMDGPU_MACH_AMDGCN_GFX704
@ EF_AMDGPU_MACH_AMDGCN_GFX902
@ EF_AMDGPU_MACH_AMDGCN_GFX810
@ EF_AMDGPU_MACH_AMDGCN_GFX1036
@ EF_AMDGPU_MACH_AMDGCN_GFX1102
@ EF_AMDGPU_MACH_R600_RV730
@ EF_AMDGPU_MACH_R600_RV710
@ EF_AMDGPU_MACH_AMDGCN_GFX908
@ EF_AMDGPU_MACH_AMDGCN_GFX1011
@ EF_AMDGPU_MACH_R600_CYPRESS
@ EF_AMDGPU_MACH_AMDGCN_GFX1032
@ EF_AMDGPU_MACH_R600_R600
@ EF_AMDGPU_MACH_AMDGCN_GFX940
@ EF_AMDGPU_MACH_R600_TURKS
@ EF_AMDGPU_MACH_R600_JUNIPER
@ EF_AMDGPU_MACH_AMDGCN_GFX601
@ EF_AMDGPU_MACH_R600_R630
@ EF_AMDGPU_MACH_R600_REDWOOD
@ EF_AMDGPU_MACH_R600_RV770
@ EF_AMDGPU_MACH_AMDGCN_GFX600
@ EF_AMDGPU_MACH_AMDGCN_GFX602
@ EF_AMDGPU_MACH_AMDGCN_GFX1101
@ EF_AMDGPU_MACH_AMDGCN_GFX1100
@ EF_AMDGPU_MACH_AMDGCN_GFX1033
@ EF_AMDGPU_MACH_AMDGCN_GFX801
@ EF_AMDGPU_MACH_AMDGCN_GFX705
@ EF_AMDGPU_MACH_AMDGCN_GFX1010
@ EF_AMDGPU_MACH_R600_RV670
@ EF_AMDGPU_MACH_AMDGCN_GFX701
@ EF_AMDGPU_MACH_AMDGCN_GFX1012
@ EF_AMDGPU_MACH_AMDGCN_GFX1030
@ EF_AMDGPU_MACH_R600_CEDAR
@ EF_AMDGPU_MACH_AMDGCN_GFX700
@ EF_AMDGPU_MACH_AMDGCN_GFX803
@ EF_AMDGPU_MACH_AMDGCN_GFX802
@ EF_AMDGPU_MACH_AMDGCN_GFX90C
@ EF_AMDGPU_MACH_AMDGCN_GFX900
@ EF_AMDGPU_MACH_AMDGCN_GFX909
@ EF_AMDGPU_MACH_AMDGCN_GFX906
@ EF_AMDGPU_MACH_AMDGCN_GFX1103
@ EF_AMDGPU_MACH_R600_CAICOS
@ EF_AMDGPU_MACH_AMDGCN_GFX90A
@ EF_AMDGPU_MACH_AMDGCN_GFX1034
@ EF_AMDGPU_MACH_AMDGCN_GFX1013
@ EF_AMDGPU_MACH_AMDGCN_GFX904
@ EF_AMDGPU_MACH_R600_RS880
@ EF_AMDGPU_MACH_AMDGCN_GFX805
@ EF_AMDGPU_MACH_R600_SUMO
@ EF_AMDGPU_MACH_R600_BARTS
@ EF_AMDGPU_MACH_AMDGCN_GFX702
std::optional< const char * > toString(const std::optional< DWARFFormValue > &V)
Take an optional DWARFFormValue and try to extract a string value from it.
Error createError(const Twine &Err)
constexpr int NumElfSymbolTypes
static std::string describe(const ELFFile< ELFT > &Obj, const typename ELFT::Shdr &Sec)
std::pair< unsigned char, unsigned char > getElfArchType(StringRef Object)
const llvm::EnumEntry< unsigned > ElfSymbolTypes[NumElfSymbolTypes]
This is an optimization pass for GlobalISel generic memory operations.
int countr_zero(T Val)
Count number of 0's from the least significant bit to the most stopping at the first 1.
void cantFail(Error Err, const char *Msg=nullptr)
Report a fatal error if Err is a failure value.
void consumeError(Error Err)
Consume a Error without doing anything.
static const Target * lookupTarget(const std::string &Triple, std::string &Error)
lookupTarget - Lookup a target based on a target triple.