LLVM: lib/Object/ELFObjectFile.cpp Source File (original) (raw)

1

2

3

4

5

6

7

8

9

10

11

12

29#include

30#include

31#include

32#include

33#include

34#include

35#include

36

37using namespace llvm;

38using namespace object;

39

48 {"Unknown", ": 7", 7},

49 {"Unknown", ": 8", 8},

50 {"Unknown", ": 9", 9},

52 {"OS Specific", ": 11", 11},

53 {"OS Specific", ": 12", 12},

54 {"Proc Specific", ": 13", 13},

55 {"Proc Specific", ": 14", 14},

56 {"Proc Specific", ": 15", 15}

57};

58

61

62template

66 if (Error E = Ret.takeError())

67 return std::move(E);

68 return std::make_unique<ELFObjectFile>(std::move(*Ret));

69}

70

73 std::pair<unsigned char, unsigned char> Ident =

75 std::size_t MaxAlignment =

78

79 if (MaxAlignment < 2)

80 return createError("Insufficient alignment");

81

84 return createPtr(Obj, InitContent);

86 return createPtr(Obj, InitContent);

87 else

91 return createPtr(Obj, InitContent);

93 return createPtr(Obj, InitContent);

94 else

96 }

98}

99

103

106 break;

109 break;

112 break;

115 break;

118 break;

121 break;

124 break;

127 break;

130 break;

133 break;

136 break;

137 default:

139 }

140

143

144 break;

147 break;

148 default:

150 }

151

156

157 return Features;

158}

159

166 }

167

168

169 bool isV7 = false;

170 std::optional Attr =

172 if (Attr)

174

176 if (Attr) {

177 switch (*Attr) {

180 break;

183 if (isV7)

185 break;

188 if (isV7)

190 break;

191 }

192 }

193

195 if (Attr) {

196 switch (*Attr) {

197 default:

198 break;

201 Features.AddFeature("thumb2", false);

202 break;

205 break;

206 }

207 }

208

210 if (Attr) {

211 switch (*Attr) {

212 default:

213 break;

215 Features.AddFeature("vfp2sp", false);

216 Features.AddFeature("vfp3d16sp", false);

217 Features.AddFeature("vfp4d16sp", false);

218 break;

221 break;

225 break;

229 break;

230 }

231 }

232

234 if (Attr) {

235 switch (*Attr) {

236 default:

237 break;

241 break;

244 break;

248 break;

249 }

250 }

251

253 if (Attr) {

254 switch (*Attr) {

255 default:

256 break;

259 Features.AddFeature("mve.fp", false);

260 break;

262 Features.AddFeature("mve.fp", false);

264 break;

267 break;

268 }

269 }

270

272 if (Attr) {

273 switch (*Attr) {

274 default:

275 break;

278 Features.AddFeature("hwdiv-arm", false);

279 break;

283 break;

284 }

285 }

286

287 return Features;

288}

289

291 switch (Attr) {

292 case 5:

293 return "v5";

294 case 55:

295 return "v55";

296 case 60:

297 return "v60";

298 case 62:

299 return "v62";

300 case 65:

301 return "v65";

302 case 67:

303 return "v67";

304 case 68:

305 return "v68";

306 case 69:

307 return "v69";

308 case 71:

309 return "v71";

310 case 73:

311 return "v73";

312 case 75:

313 return "v75";

314 default:

315 return {};

316 }

317}

318

323

324

326 return Features;

327 }

328 std::optional Attr;

329

331 if (std::optionalstd::string FeatureString =

334 }

335

337 std::optionalstd::string FeatureString =

339

340 if (FeatureString && *Attr >= 60)

341 Features.AddFeature("hvx" + *FeatureString);

342 }

343

345 if (*Attr)

347

349 if (*Attr)

351

353 if (*Attr)

355

357 if (*Attr)

359

361 if (*Attr)

363

364 return Features;

365}

366

370

373 }

374

377 return std::move(E);

378 }

379

380 std::optional Attr =

382 if (Attr) {

387

388 if (ISAInfo->getXLen() == 32)

390 else if (ISAInfo->getXLen() == 64)

392 else

394

396 }

397

398 return Features;

399}

400

401SubtargetFeatures ELFObjectFileBase::getLoongArchFeatures() const {

403

406 break;

409

410 [[fallthrough]];

413 break;

414 }

415

416 return Features;

417}

418

422 return getMIPSFeatures();

424 return getARMFeatures();

426 return getRISCVFeatures();

428 return getLoongArchFeatures();

430 return getHexagonFeatures();

431 default:

433 }

434}

435

439 return getAMDGPUCPUName();

441 return getNVPTXCPUName();

447 default:

448 return std::nullopt;

449 }

450}

451

452StringRef ELFObjectFileBase::getAMDGPUCPUName() const {

455

456 switch (CPU) {

457

459 return "r600";

461 return "r630";

463 return "rs880";

465 return "rv670";

466

467

469 return "rv710";

471 return "rv730";

473 return "rv770";

474

475

477 return "cedar";

479 return "cypress";

481 return "juniper";

483 return "redwood";

485 return "sumo";

486

487

489 return "barts";

491 return "caicos";

493 return "cayman";

495 return "turks";

496

497

499 return "gfx600";

501 return "gfx601";

503 return "gfx602";

504

505

507 return "gfx700";

509 return "gfx701";

511 return "gfx702";

513 return "gfx703";

515 return "gfx704";

517 return "gfx705";

518

519

521 return "gfx801";

523 return "gfx802";

525 return "gfx803";

527 return "gfx805";

529 return "gfx810";

530

531

533 return "gfx900";

535 return "gfx902";

537 return "gfx904";

539 return "gfx906";

541 return "gfx908";

543 return "gfx909";

545 return "gfx90a";

547 return "gfx90c";

549 return "gfx940";

551 return "gfx941";

553 return "gfx942";

555 return "gfx950";

556

557

559 return "gfx1010";

561 return "gfx1011";

563 return "gfx1012";

565 return "gfx1013";

567 return "gfx1030";

569 return "gfx1031";

571 return "gfx1032";

573 return "gfx1033";

575 return "gfx1034";

577 return "gfx1035";

579 return "gfx1036";

580

581

583 return "gfx1100";

585 return "gfx1101";

587 return "gfx1102";

589 return "gfx1103";

591 return "gfx1150";

593 return "gfx1151";

595 return "gfx1152";

597 return "gfx1153";

598

599

601 return "gfx1200";

603 return "gfx1201";

604

605

607 return "gfx9-generic";

609 return "gfx9-4-generic";

611 return "gfx10-1-generic";

613 return "gfx10-3-generic";

615 return "gfx11-generic";

617 return "gfx12-generic";

618 default:

620 }

621}

622

623StringRef ELFObjectFileBase::getNVPTXCPUName() const {

626

627 switch (SM) {

628

630 return "sm_20";

632 return "sm_21";

633

634

636 return "sm_30";

638 return "sm_32";

640 return "sm_35";

642 return "sm_37";

643

644

646 return "sm_50";

648 return "sm_52";

650 return "sm_53";

651

652

654 return "sm_60";

656 return "sm_61";

658 return "sm_62";

659

660

662 return "sm_70";

664 return "sm_72";

665

666

668 return "sm_75";

669

670

672 return "sm_80";

674 return "sm_86";

676 return "sm_87";

677

678

680 return "sm_89";

681

682

685 default:

687 }

688}

689

690

693 return;

694

697

699 return;

700 }

701

703

706 else

708

709 std::optional Attr =

711 if (Attr) {

712 switch (*Attr) {

715 break;

718 break;

721 break;

724 break;

727 break;

730 break;

733 break;

736 break;

739 break;

741 std::optional ArchProfileAttr =

743 if (ArchProfileAttr &&

746 else

748 break;

749 }

752 break;

755 break;

758 break;

761 break;

764 break;

766 Triple += "v8m.base";

767 break;

769 Triple += "v8m.main";

770 break;

772 Triple += "v8.1m.main";

773 break;

776 break;

777 }

778 }

781

783}

784

786 std::string Err;

789 if (T)

790 return {};

791 uint32_t JumpSlotReloc = 0, GlobDatReloc = 0;

794 JumpSlotReloc = ELF::R_386_JUMP_SLOT;

795 GlobDatReloc = ELF::R_386_GLOB_DAT;

796 break;

798 JumpSlotReloc = ELF::R_X86_64_JUMP_SLOT;

799 GlobDatReloc = ELF::R_X86_64_GLOB_DAT;

800 break;

803 JumpSlotReloc = ELF::R_AARCH64_JUMP_SLOT;

804 break;

805 default:

806 return {};

807 }

808 std::unique_ptr MII(T->createMCInstrInfo());

809 std::unique_ptr MIA(

810 T->createMCInstrAnalysis(MII.get()));

811 if (!MIA)

812 return {};

813 std::vector<std::pair<uint64_t, uint64_t>> PltEntries;

814 std::optional RelaPlt, RelaDyn;

818 if (!NameOrErr) {

820 continue;

821 }

823

824 if (Name == ".rela.plt" || Name == ".rel.plt") {

825 RelaPlt = Section;

826 } else if (Name == ".rela.dyn" || Name == ".rel.dyn") {

827 RelaDyn = Section;

828 } else if (Name == ".got.plt") {

829 GotBaseVA = Section.getAddress();

830 } else if (Name == ".plt" || Name == ".plt.got") {

832 if (!PltContents) {

834 return {};

835 }

837 PltEntries,

838 MIA->findPltEntries(Section.getAddress(),

839 arrayRefFromStringRef(*PltContents), Triple));

840 }

841 }

842

843

845 for (auto [Plt, GotPlt] : PltEntries) {

846 uint64_t GotPltEntry = GotPlt;

847

848

849

851 GotPltEntry = static_cast<int32_t>(GotPltEntry) + GotBaseVA;

852 GotToPlt.insert(std::make_pair(GotPltEntry, Plt));

853 }

854

855

856

857 std::vector Result;

860 for (const auto &R : Rels) {

861 if (R.getType() != RelType)

862 continue;

863 auto PltEntryIter = GotToPlt.find(R.getOffset());

864 if (PltEntryIter != GotToPlt.end()) {

867 Result.push_back(

868 ELFPltEntry{PltSec, std::nullopt, PltEntryIter->second});

869 else

870 Result.push_back(ELFPltEntry{PltSec, Sym->getRawDataRefImpl(),

871 PltEntryIter->second});

872 }

873 }

874 };

875

876 if (RelaPlt)

877 handleRels(RelaPlt->relocations(), JumpSlotReloc, ".plt");

878

879

880

881 if (RelaDyn)

882 handleRels(RelaDyn->relocations(), GlobDatReloc, ".plt.got");

883

884 return Result;

885}

886

887template

889 const ELFFile &EF, std::optional TextSectionIndex,

890 std::vector *PGOAnalyses) {

891 using Elf_Shdr = typename ELFT::Shdr;

893 std::vector BBAddrMaps;

894 if (PGOAnalyses)

895 PGOAnalyses->clear();

896

898 auto IsMatch = [&](const Elf_Shdr &Sec) -> Expected {

901 return false;

902 if (!TextSectionIndex)

903 return true;

905 if (!TextSecOrErr)

906 return createError("unable to get the linked-to section for " +

909 assert(*TextSecOrErr >= Sections.begin() &&

910 "Text section pointer outside of bounds");

911 if (*TextSectionIndex !=

912 (unsigned)std::distance(Sections.begin(), *TextSecOrErr))

913 return false;

914 return true;

915 };

916

919 if (!SectionRelocMapOrErr)

920 return SectionRelocMapOrErr.takeError();

921

922 for (auto const &[Sec, RelocSec] : *SectionRelocMapOrErr) {

923 if (IsRelocatable && !RelocSec)

924 return createError("unable to get relocation section for " +

928 if (!BBAddrMapOrErr) {

929 if (PGOAnalyses)

930 PGOAnalyses->clear();

933 }

934 std::move(BBAddrMapOrErr->begin(), BBAddrMapOrErr->end(),

935 std::back_inserter(BBAddrMaps));

936 }

937 if (PGOAnalyses)

938 assert(PGOAnalyses->size() == BBAddrMaps.size() &&

939 "The same number of BBAddrMaps and PGOAnalysisMaps should be "

940 "returned when PGO information is requested");

941 return BBAddrMaps;

942}

943

944template

948 using Elf_Shdr = typename ELFT::Shdr;

949 const Elf_Shdr *VerSec = nullptr;

950 const Elf_Shdr *VerNeedSec = nullptr;

951 const Elf_Shdr *VerDefSec = nullptr;

952

955 VerSec = &Sec;

957 VerDefSec = &Sec;

959 VerNeedSec = &Sec;

960 }

961 if (!VerSec)

962 return std::vector();

963

966 if (!MapOrErr)

968

969 std::vector Ret;

970 size_t I = 0;

972 ++I;

974 EF.template getEntry(*VerSec, I);

975 if (!VerEntryOrErr)

976 return createError("unable to read an entry with index " + Twine(I) +

977 " from " + describe(EF, *VerSec) + ": " +

979

981 if (!FlagsOrErr)

982 return createError("unable to read flags for symbol with index " +

984

985 bool IsDefault;

987 (*VerEntryOrErr)->vs_index, IsDefault, *MapOrErr,

989 if (!VerOrErr)

990 return createError("unable to get a version for entry " + Twine(I) +

991 " of " + describe(EF, *VerSec) + ": " +

993

994 Ret.push_back({(*VerOrErr).str(), IsDefault});

995 }

996

997 return Ret;

998}

999

1003 if (const auto *Obj = dyn_cast(this))

1005 if (const auto *Obj = dyn_cast(this))

1007 if (const auto *Obj = dyn_cast(this))

1010 Symbols);

1011}

1012

1014 std::optional TextSectionIndex,

1015 std::vector *PGOAnalyses) const {

1016 if (const auto *Obj = dyn_cast(this))

1017 return readBBAddrMapImpl(Obj->getELFFile(), TextSectionIndex, PGOAnalyses);

1018 if (const auto *Obj = dyn_cast(this))

1019 return readBBAddrMapImpl(Obj->getELFFile(), TextSectionIndex, PGOAnalyses);

1020 if (const auto *Obj = dyn_cast(this))

1021 return readBBAddrMapImpl(Obj->getELFFile(), TextSectionIndex, PGOAnalyses);

1022 return readBBAddrMapImpl(cast(this)->getELFFile(),

1023 TextSectionIndex, PGOAnalyses);

1024}

1025

1028 if (const auto *Obj = dyn_cast(this))

1029 return Obj->getCrelDecodeProblem(Data);

1030 if (const auto *Obj = dyn_cast(this))

1031 return Obj->getCrelDecodeProblem(Data);

1032 if (const auto *Obj = dyn_cast(this))

1033 return Obj->getCrelDecodeProblem(Data);

1034 return cast(this)->getCrelDecodeProblem(Data);

1035}

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)

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

This class represents success/failure for parsing-like operations that find it important to chain tog...

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

StringRef getCrelDecodeProblem(SectionRef Sec) const

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...

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

@ 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_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_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_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_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

@ EF_LOONGARCH_ABI_SINGLE_FLOAT

@ EF_LOONGARCH_ABI_DOUBLE_FLOAT

@ EF_LOONGARCH_ABI_SOFT_FLOAT

@ EF_LOONGARCH_ABI_MODIFIER_MASK

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.

const char * toString(DWARFSectionKind Kind)

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.