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));
71Expected<std::unique_ptr<ObjectFile>>
73 std::pair<unsigned char, unsigned char> Ident =
75 std::size_t MaxAlignment =
160SubtargetFeatures ELFObjectFileBase::getARMFeatures()
const {
161 SubtargetFeatures Features;
165 return SubtargetFeatures();
170 std::optional<unsigned> Attr =
323SubtargetFeatures ELFObjectFileBase::getHexagonFeatures()
const {
324 SubtargetFeatures Features;
325 HexagonAttributeParser Parser;
332 std::optional<unsigned> Attr;
335 if (std::optional<std::string> FeatureString =
341 std::optional<std::string> FeatureString =
344 if (FeatureString && *Attr >= 60)
371Expected<SubtargetFeatures> ELFObjectFileBase::getRISCVFeatures()
const {
372 SubtargetFeatures Features;
384 std::optional<StringRef> Attr =
389 return ParseResult.takeError();
390 auto &ISAInfo = *ParseResult;
392 if (ISAInfo->getXLen() == 32)
394 else if (ISAInfo->getXLen() == 64)
405SubtargetFeatures ELFObjectFileBase::getLoongArchFeatures()
const {
406 SubtargetFeatures Features;
426 return getMIPSFeatures();
428 return getARMFeatures();
430 return getRISCVFeatures();
432 return getLoongArchFeatures();
434 return getHexagonFeatures();
443 return getAMDGPUCPUName();
445 return getNVPTXCPUName();
456StringRef ELFObjectFileBase::getAMDGPUCPUName()
const {
611 return "gfx9-generic";
613 return "gfx9-4-generic";
615 return "gfx10-1-generic";
617 return "gfx10-3-generic";
619 return "gfx11-generic";
621 return "gfx12-generic";
627StringRef ELFObjectFileBase::getNVPTXCPUName()
const {
741 std::optional<unsigned> Attr =
773 std::optional<unsigned> ArchProfileAttr =
816std::vector<ELFPltEntry>
823 uint32_t JumpSlotReloc = 0, GlobDatReloc = 0;
826 JumpSlotReloc = ELF::R_386_JUMP_SLOT;
827 GlobDatReloc = ELF::R_386_GLOB_DAT;
830 JumpSlotReloc = ELF::R_X86_64_JUMP_SLOT;
831 GlobDatReloc = ELF::R_X86_64_GLOB_DAT;
835 JumpSlotReloc = ELF::R_AARCH64_JUMP_SLOT;
841 JumpSlotReloc = ELF::R_ARM_JUMP_SLOT;
844 JumpSlotReloc = ELF::R_HEX_JMP_SLOT;
845 GlobDatReloc = ELF::R_HEX_GLOB_DAT;
849 JumpSlotReloc = ELF::R_RISCV_JUMP_SLOT;
854 std::unique_ptr<const MCInstrInfo> MII(
T->createMCInstrInfo());
855 std::unique_ptr<const MCInstrAnalysis> MIA(
856 T->createMCInstrAnalysis(MII.get()));
859 std::vector<std::pair<uint64_t, uint64_t>> PltEntries;
860 std::optional<SectionRef> RelaPlt, RelaDyn;
870 if (Name ==
".rela.plt" || Name ==
".rel.plt") {
872 }
else if (Name ==
".rela.dyn" || Name ==
".rel.dyn") {
874 }
else if (Name ==
".got.plt") {
875 GotBaseVA = Section.getAddress();
876 }
else if (Name ==
".plt" || Name ==
".plt.got") {
884 MIA->findPltEntries(Section.getAddress(),
891 for (
auto [Plt, GotPlt] : PltEntries) {
897 GotPltEntry =
static_cast<int32_t
>(GotPltEntry) + GotBaseVA;
898 GotToPlt.
insert(std::make_pair(GotPltEntry, Plt));
903 std::vector<ELFPltEntry> Result;
906 for (
const auto &R : Rels) {
907 if (R.getType() != RelType)
909 auto PltEntryIter = GotToPlt.
find(R.getOffset());
910 if (PltEntryIter != GotToPlt.
end()) {
914 ELFPltEntry{PltSec, std::nullopt, PltEntryIter->second});
917 PltEntryIter->second});
923 handleRels(RelaPlt->relocations(), JumpSlotReloc,
".plt");
928 handleRels(RelaDyn->relocations(), GlobDatReloc,
".plt.got");
935 const ELFFile<ELFT> &EF, std::optional<unsigned> TextSectionIndex,
936 std::vector<PGOAnalysisMap> *PGOAnalyses) {
937 using Elf_Shdr =
typename ELFT::Shdr;
939 std::vector<BBAddrMap> BBAddrMaps;
941 PGOAnalyses->clear();
947 if (!TextSectionIndex)
951 return createError(
"unable to get the linked-to section for " +
954 assert(*TextSecOrErr >= Sections.begin() &&
955 "Text section pointer outside of bounds");
956 if (*TextSectionIndex !=
957 (
unsigned)std::distance(Sections.begin(), *TextSecOrErr))
964 if (!SectionRelocMapOrErr)
967 for (
auto const &[Sec, RelocSec] : *SectionRelocMapOrErr) {
968 if (IsRelocatable && !RelocSec)
969 return createError(
"unable to get relocation section for " +
973 if (!BBAddrMapOrErr) {
975 PGOAnalyses->clear();
979 std::move(BBAddrMapOrErr->begin(), BBAddrMapOrErr->end(),
980 std::back_inserter(BBAddrMaps));
983 assert(PGOAnalyses->size() == BBAddrMaps.size() &&
984 "The same number of BBAddrMaps and PGOAnalysisMaps should be "
985 "returned when PGO information is requested");
990static Expected<std::vector<VersionEntry>>
993 using Elf_Shdr =
typename ELFT::Shdr;
994 const Elf_Shdr *VerSec =
nullptr;
995 const Elf_Shdr *VerNeedSec =
nullptr;
996 const Elf_Shdr *VerDefSec =
nullptr;
1007 return std::vector<VersionEntry>();
1014 std::vector<VersionEntry> Ret;
1019 EF.template getEntry<typename ELFT::Versym>(*VerSec,
I);
1022 " from " +
describe(EF, *VerSec) +
": " +
1027 return createError(
"unable to read flags for symbol with index " +
1032 (*VerEntryOrErr)->vs_index, IsDefault, *MapOrErr,
1036 " of " +
describe(EF, *VerSec) +
": " +
1039 Ret.push_back({(*VerOrErr).str(), IsDefault});
1045Expected<std::vector<VersionEntry>>
1059 std::optional<unsigned> TextSectionIndex,
1060 std::vector<PGOAnalysisMap> *PGOAnalyses)
const {
1068 TextSectionIndex, PGOAnalyses);
1074 return Obj->getCrelDecodeProblem(
Data);
1076 return Obj->getCrelDecodeProblem(
Data);
1078 return Obj->getCrelDecodeProblem(
Data);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
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 std::optional< std::string > hexagonAttrToFeatureString(unsigned Attr)
static Expected< std::vector< VersionEntry > > readDynsymVersionsImpl(const ELFFile< ELFT > &EF, ELFObjectFileBase::elf_symbol_iterator_range Symbols)
iterator find(const_arg_type_t< KeyT > Val)
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
std::optional< unsigned > getAttributeValue(unsigned tag) const override
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.
Generic base class for all target subtargets.
const char * getBufferStart() const
StringRef getBuffer() const
static LLVM_ABI 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.
LLVM_ABI void AddFeature(StringRef String, bool Enable=true)
Adds Features.
LLVM_ABI void addFeaturesVector(const ArrayRef< std::string > OtherFeatures)
Triple - Helper class for working with autoconf configuration names.
LLVM_ABI 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.
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, 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 uint8_t getEIdentABIVersion() const =0
virtual Error getBuildAttributes(ELFAttributeParser &Attributes) const =0
std::vector< ELFPltEntry > getPltEntries(const MCSubtargetInfo &STI) const
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
StringRef getCrelDecodeProblem(SectionRef Sec) const
Expected< SubtargetFeatures > getFeatures() const override
std::optional< StringRef > tryGetCPUName() const override
iterator_range< elf_symbol_iterator > elf_symbol_iterator_range
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)
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
ObjectFile(unsigned int Type, MemoryBufferRef Source)
DataRefImpl getRawDataRefImpl() const
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_CUDA_ACCELERATORS_V1
@ 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_GFX950
@ 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_GFX1250
@ EF_AMDGPU_MACH_R600_TURKS
@ EF_AMDGPU_MACH_R600_JUNIPER
@ EF_AMDGPU_MACH_AMDGCN_GFX601
@ EF_AMDGPU_MACH_AMDGCN_GFX942
@ EF_AMDGPU_MACH_AMDGCN_GFX1152
@ 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_GFX9_4_GENERIC
@ EF_AMDGPU_MACH_AMDGCN_GFX1153
@ 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_GFX12_GENERIC
@ EF_AMDGPU_MACH_AMDGCN_GFX10_1_GENERIC
@ EF_AMDGPU_MACH_AMDGCN_GFX904
@ EF_AMDGPU_MACH_AMDGCN_GFX1251
@ 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
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)
LLVM_ABI const llvm::EnumEntry< unsigned > ElfSymbolTypes[NumElfSymbolTypes]
This is an optimization pass for GlobalISel generic memory operations.
ArrayRef< CharT > arrayRefFromStringRef(StringRef Input)
Construct a string ref from an array ref of unsigned chars.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
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.
std::string toString(const APInt &I, unsigned Radix, bool Signed, bool formatAsCLiteral=false, bool UpperCase=true, bool InsertSeparators=false)
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
void consumeError(Error Err)
Consume a Error without doing anything.
static const Target * lookupTarget(StringRef TripleStr, std::string &Error)
lookupTarget - Lookup a target based on a target triple.