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 =
308 return ParseResult.takeError();
309 auto &ISAInfo = *ParseResult;
311 if (ISAInfo->getXLen() == 32)
313 else if (ISAInfo->getXLen() == 64)
345 return getMIPSFeatures();
347 return getARMFeatures();
349 return getRISCVFeatures();
351 return getLoongArchFeatures();
360 return getAMDGPUCPUName();
362 return getNVPTXCPUName();
371StringRef ELFObjectFileBase::getAMDGPUCPUName()
const {
520 return "gfx9-generic";
522 return "gfx10-1-generic";
524 return "gfx10-3-generic";
526 return "gfx11-generic";
532StringRef ELFObjectFileBase::getNVPTXCPUName()
const {
618 std::optional<unsigned> Attr =
650 std::optional<unsigned> ArchProfileAttr =
652 if (ArchProfileAttr &&
700 uint32_t JumpSlotReloc = 0, GlobDatReloc = 0;
703 JumpSlotReloc = ELF::R_386_JUMP_SLOT;
704 GlobDatReloc = ELF::R_386_GLOB_DAT;
707 JumpSlotReloc = ELF::R_X86_64_JUMP_SLOT;
708 GlobDatReloc = ELF::R_X86_64_GLOB_DAT;
712 JumpSlotReloc = ELF::R_AARCH64_JUMP_SLOT;
717 std::unique_ptr<const MCInstrInfo> MII(
T->createMCInstrInfo());
718 std::unique_ptr<const MCInstrAnalysis> MIA(
719 T->createMCInstrAnalysis(MII.get()));
722 std::vector<std::pair<uint64_t, uint64_t>> PltEntries;
723 std::optional<SectionRef> RelaPlt, RelaDyn;
733 if (
Name ==
".rela.plt" ||
Name ==
".rel.plt") {
735 }
else if (
Name ==
".rela.dyn" ||
Name ==
".rel.dyn") {
737 }
else if (
Name ==
".got.plt") {
738 GotBaseVA = Section.getAddress();
739 }
else if (
Name ==
".plt" ||
Name ==
".plt.got") {
747 MIA->findPltEntries(Section.getAddress(),
748 arrayRefFromStringRef(*PltContents),
Triple));
754 for (
auto [Plt, GotPlt] : PltEntries) {
760 GotPltEntry =
static_cast<int32_t
>(GotPltEntry) + GotBaseVA;
761 GotToPlt.
insert(std::make_pair(GotPltEntry, Plt));
766 std::vector<ELFPltEntry> Result;
769 for (
const auto &R : Rels) {
770 if (R.getType() != RelType)
772 auto PltEntryIter = GotToPlt.
find(R.getOffset());
773 if (PltEntryIter != GotToPlt.
end()) {
777 ELFPltEntry{PltSec, std::nullopt, PltEntryIter->second});
780 PltEntryIter->second});
786 handleRels(RelaPlt->relocations(), JumpSlotReloc,
".plt");
791 handleRels(RelaDyn->relocations(), GlobDatReloc,
".plt.got");
798 const ELFFile<ELFT> &EF, std::optional<unsigned> TextSectionIndex,
799 std::vector<PGOAnalysisMap> *PGOAnalyses) {
800 using Elf_Shdr =
typename ELFT::Shdr;
802 std::vector<BBAddrMap> BBAddrMaps;
804 PGOAnalyses->clear();
811 if (!TextSectionIndex)
815 return createError(
"unable to get the linked-to section for " +
818 assert(*TextSecOrErr >= Sections.begin() &&
819 "Text section pointer outside of bounds");
820 if (*TextSectionIndex !=
821 (
unsigned)std::distance(Sections.begin(), *TextSecOrErr))
828 if (!SectionRelocMapOrErr)
831 for (
auto const &[Sec, RelocSec] : *SectionRelocMapOrErr) {
832 if (IsRelocatable && !RelocSec)
833 return createError(
"unable to get relocation section for " +
837 if (!BBAddrMapOrErr) {
839 PGOAnalyses->clear();
843 std::move(BBAddrMapOrErr->begin(), BBAddrMapOrErr->end(),
844 std::back_inserter(BBAddrMaps));
847 assert(PGOAnalyses->size() == BBAddrMaps.size() &&
848 "The same number of BBAddrMaps and PGOAnalysisMaps should be "
849 "returned when PGO information is requested");
857 using Elf_Shdr =
typename ELFT::Shdr;
858 const Elf_Shdr *VerSec =
nullptr;
859 const Elf_Shdr *VerNeedSec =
nullptr;
860 const Elf_Shdr *VerDefSec =
nullptr;
871 return std::vector<VersionEntry>();
878 std::vector<VersionEntry> Ret;
883 EF.template getEntry<typename ELFT::Versym>(*VerSec,
I);
886 " from " +
describe(EF, *VerSec) +
": " +
891 return createError(
"unable to read flags for symbol with index " +
896 (*VerEntryOrErr)->vs_index, IsDefault, *MapOrErr,
900 " of " +
describe(EF, *VerSec) +
": " +
903 Ret.push_back({(*VerOrErr).str(), IsDefault});
912 if (
const auto *Obj = dyn_cast<ELF32LEObjectFile>(
this))
914 if (
const auto *Obj = dyn_cast<ELF32BEObjectFile>(
this))
916 if (
const auto *Obj = dyn_cast<ELF64LEObjectFile>(
this))
923 std::optional<unsigned> TextSectionIndex,
924 std::vector<PGOAnalysisMap> *PGOAnalyses)
const {
925 if (
const auto *Obj = dyn_cast<ELF32LEObjectFile>(
this))
927 if (
const auto *Obj = dyn_cast<ELF64LEObjectFile>(
this))
929 if (
const auto *Obj = dyn_cast<ELF32BEObjectFile>(
this))
932 TextSectionIndex, PGOAnalyses);
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, std::vector< PGOAnalysisMap > *PGOAnalyses)
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 > > parseNormalizedArchString(StringRef Arch)
Parse RISC-V ISA info from an arch string that is already in normalized form (as defined in the psABI...
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.
bool isLittleEndian() const
const Elf_Ehdr & getHeader() const
Expected< std::vector< BBAddrMap > > decodeBBAddrMap(const Elf_Shdr &Sec, const Elf_Shdr *RelaSec=nullptr, std::vector< PGOAnalysisMap > *PGOAnalyses=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
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
std::vector< ELFPltEntry > getPltEntries() const
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
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 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
@ 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_AMDGCN_GFX941
@ EF_AMDGPU_MACH_R600_TURKS
@ EF_AMDGPU_MACH_R600_JUNIPER
@ EF_AMDGPU_MACH_AMDGCN_GFX601
@ EF_AMDGPU_MACH_AMDGCN_GFX942
@ 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_GFX10_3_GENERIC
@ EF_AMDGPU_MACH_AMDGCN_GFX1012
@ EF_AMDGPU_MACH_AMDGCN_GFX1151
@ EF_AMDGPU_MACH_AMDGCN_GFX1030
@ EF_AMDGPU_MACH_R600_CEDAR
@ EF_AMDGPU_MACH_AMDGCN_GFX1200
@ EF_AMDGPU_MACH_AMDGCN_GFX700
@ EF_AMDGPU_MACH_AMDGCN_GFX11_GENERIC
@ 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_GFX9_GENERIC
@ 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_GFX10_1_GENERIC
@ EF_AMDGPU_MACH_AMDGCN_GFX904
@ EF_AMDGPU_MACH_R600_RS880
@ EF_AMDGPU_MACH_AMDGCN_GFX805
@ EF_AMDGPU_MACH_AMDGCN_GFX1201
@ EF_AMDGPU_MACH_AMDGCN_GFX1150
@ EF_AMDGPU_MACH_R600_SUMO
@ EF_AMDGPU_MACH_R600_BARTS
@ EF_AMDGPU_MACH_AMDGCN_GFX702
@ SHT_LLVM_BB_ADDR_MAP_V0
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.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
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(StringRef Triple, std::string &Error)
lookupTarget - Lookup a target based on a target triple.