From 4137f904c5546fcf1efa789b6ca2c762c699eb1d Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Mon, 25 Mar 2024 17:06:07 -0700 Subject: [PATCH] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20initia?= =?UTF-8?q?l=20version?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Created using spr 1.3.5-bogner --- lld/ELF/SyntheticSections.cpp | 4 +- llvm/include/llvm/Object/ELFTypes.h | 1 + llvm/lib/ObjCopy/ELF/ELFObject.cpp | 15 +++--- llvm/lib/ObjectYAML/ELFEmitter.cpp | 58 ++++++++++----------- llvm/tools/llvm-readobj/DwarfCFIEHPrinter.h | 9 ++-- llvm/tools/llvm-readobj/ELFDumper.cpp | 44 +++++++--------- 6 files changed, 62 insertions(+), 69 deletions(-) diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp index 650bd6cd39006..3a290eaa9bd3e 100644 --- a/lld/ELF/SyntheticSections.cpp +++ b/lld/ELF/SyntheticSections.cpp @@ -415,7 +415,7 @@ void EhFrameSection::addRecords(EhInputSection *sec, ArrayRef rels) { for (EhSectionPiece &cie : sec->cies) offsetToCie[cie.inputOff] = addCie(cie, rels); for (EhSectionPiece &fde : sec->fdes) { - uint32_t id = endian::read32(fde.data().data() + 4); + uint32_t id = endian::read32(fde.data().data() + 4); CieRecord *rec = offsetToCie[fde.inputOff + 4 - id]; if (!rec) fatal(toString(sec) + ": invalid CIE reference"); @@ -448,7 +448,7 @@ void EhFrameSection::iterateFDEWithLSDAAux( if (hasLSDA(cie)) ciesWithLSDA.insert(cie.inputOff); for (EhSectionPiece &fde : sec.fdes) { - uint32_t id = endian::read32(fde.data().data() + 4); + uint32_t id = endian::read32(fde.data().data() + 4); if (!ciesWithLSDA.contains(fde.inputOff + 4 - id)) continue; diff --git a/llvm/include/llvm/Object/ELFTypes.h b/llvm/include/llvm/Object/ELFTypes.h index 4986ecf8323d0..7fa850e218b7e 100644 --- a/llvm/include/llvm/Object/ELFTypes.h +++ b/llvm/include/llvm/Object/ELFTypes.h @@ -52,6 +52,7 @@ template struct ELFType { public: static const endianness TargetEndianness = E; + static const endianness Endian = E; static const bool Is64Bits = Is64; using uint = std::conditional_t; diff --git a/llvm/lib/ObjCopy/ELF/ELFObject.cpp b/llvm/lib/ObjCopy/ELF/ELFObject.cpp index 9547cc10d2a0b..3fd81bfea93c8 100644 --- a/llvm/lib/ObjCopy/ELF/ELFObject.cpp +++ b/llvm/lib/ObjCopy/ELF/ELFObject.cpp @@ -33,6 +33,7 @@ using namespace llvm; using namespace llvm::ELF; using namespace llvm::objcopy::elf; using namespace llvm::object; +using namespace llvm::support; template void ELFWriter::writePhdr(const Segment &Seg) { uint8_t *B = reinterpret_cast(Buf->getBufferStart()) + @@ -1175,9 +1176,9 @@ template Error ELFSectionWriter::visit(const GroupSection &Sec) { ELF::Elf32_Word *Buf = reinterpret_cast(Out.getBufferStart() + Sec.Offset); - support::endian::write32(Buf++, Sec.FlagWord); + endian::write32(Buf++, Sec.FlagWord); for (SectionBase *S : Sec.GroupMembers) - support::endian::write32(Buf++, S->Index); + endian::write32(Buf++, S->Index); return Error::success(); } @@ -1522,10 +1523,9 @@ Error ELFBuilder::initGroupSection(GroupSection *GroupSec) { reinterpret_cast(GroupSec->Contents.data()); const ELF::Elf32_Word *End = Word + GroupSec->Contents.size() / sizeof(ELF::Elf32_Word); - GroupSec->setFlagWord( - support::endian::read32(Word++)); + GroupSec->setFlagWord(endian::read32(Word++)); for (; Word != End; ++Word) { - uint32_t Index = support::endian::read32(Word); + uint32_t Index = support::endian::read32(Word); Expected Sec = SecTable.getSection( Index, "group member index " + Twine(Index) + " in section '" + GroupSec->Name + "' is invalid"); @@ -1993,9 +1993,8 @@ template void ELFWriter::writeEhdr() { Ehdr.e_ident[EI_MAG2] = 'L'; Ehdr.e_ident[EI_MAG3] = 'F'; Ehdr.e_ident[EI_CLASS] = ELFT::Is64Bits ? ELFCLASS64 : ELFCLASS32; - Ehdr.e_ident[EI_DATA] = ELFT::TargetEndianness == llvm::endianness::big - ? ELFDATA2MSB - : ELFDATA2LSB; + Ehdr.e_ident[EI_DATA] = + ELFT::Endian == llvm::endianness::big ? ELFDATA2MSB : ELFDATA2LSB; Ehdr.e_ident[EI_VERSION] = EV_CURRENT; Ehdr.e_ident[EI_OSABI] = Obj.OSABI; Ehdr.e_ident[EI_ABIVERSION] = Obj.ABIVersion; diff --git a/llvm/lib/ObjectYAML/ELFEmitter.cpp b/llvm/lib/ObjectYAML/ELFEmitter.cpp index 58a725f8d8778..890a24d98afc9 100644 --- a/llvm/lib/ObjectYAML/ELFEmitter.cpp +++ b/llvm/lib/ObjectYAML/ELFEmitter.cpp @@ -1314,7 +1314,7 @@ void ELFState::writeSectionContent(Elf_Shdr &SHeader, if (!ELFT::Is64Bits && E > UINT32_MAX) reportError(Section.Name + ": the value is too large for 32-bits: 0x" + Twine::utohexstr(E)); - CBA.write(E, ELFT::TargetEndianness); + CBA.write(E, ELFT::Endian); } SHeader.sh_size = sizeof(uintX_t) * Section.Entries->size(); @@ -1333,7 +1333,7 @@ void ELFState::writeSectionContent( return; for (uint32_t E : *Shndx.Entries) - CBA.write(E, ELFT::TargetEndianness); + CBA.write(E, ELFT::Endian); SHeader.sh_size = Shndx.Entries->size() * SHeader.sh_entsize; } @@ -1357,7 +1357,7 @@ void ELFState::writeSectionContent(Elf_Shdr &SHeader, SectionIndex = llvm::ELF::GRP_COMDAT; else SectionIndex = toSectionIndex(Member.sectionNameOrType, Section.Name); - CBA.write(SectionIndex, ELFT::TargetEndianness); + CBA.write(SectionIndex, ELFT::Endian); } SHeader.sh_size = SHeader.sh_entsize * Section.Members->size(); } @@ -1370,7 +1370,7 @@ void ELFState::writeSectionContent(Elf_Shdr &SHeader, return; for (uint16_t Version : *Section.Entries) - CBA.write(Version, ELFT::TargetEndianness); + CBA.write(Version, ELFT::Endian); SHeader.sh_size = Section.Entries->size() * SHeader.sh_entsize; } @@ -1382,7 +1382,7 @@ void ELFState::writeSectionContent( return; for (const ELFYAML::StackSizeEntry &E : *Section.Entries) { - CBA.write(E.Address, ELFT::TargetEndianness); + CBA.write(E.Address, ELFT::Endian); SHeader.sh_size += sizeof(uintX_t) + CBA.writeULEB128(E.Size); } } @@ -1444,7 +1444,7 @@ void ELFState::writeSectionContent( uint64_t TotalNumBlocks = 0; for (const ELFYAML::BBAddrMapEntry::BBRangeEntry &BBR : *E.BBRanges) { // Write the base address of the range. - CBA.write(BBR.BaseAddress, ELFT::TargetEndianness); + CBA.write(BBR.BaseAddress, ELFT::Endian); // Write number of BBEntries (number of basic blocks in this basic block // range). This is overridden by the 'NumBlocks' YAML field when // specified. @@ -1558,7 +1558,7 @@ void ELFState::writeSectionContent( return; for (const ELFYAML::CallGraphEntryWeight &E : *Section.Entries) { - CBA.write(E.Weight, ELFT::TargetEndianness); + CBA.write(E.Weight, ELFT::Endian); SHeader.sh_size += sizeof(object::Elf_CGProfile_Impl); } } @@ -1572,15 +1572,15 @@ void ELFState::writeSectionContent(Elf_Shdr &SHeader, CBA.write( Section.NBucket.value_or(llvm::yaml::Hex64(Section.Bucket->size())), - ELFT::TargetEndianness); + ELFT::Endian); CBA.write( Section.NChain.value_or(llvm::yaml::Hex64(Section.Chain->size())), - ELFT::TargetEndianness); + ELFT::Endian); for (uint32_t Val : *Section.Bucket) - CBA.write(Val, ELFT::TargetEndianness); + CBA.write(Val, ELFT::Endian); for (uint32_t Val : *Section.Chain) - CBA.write(Val, ELFT::TargetEndianness); + CBA.write(Val, ELFT::Endian); SHeader.sh_size = (2 + Section.Bucket->size() + Section.Chain->size()) * 4; } @@ -1687,8 +1687,8 @@ void ELFState::writeSectionContent( return; for (const ELFYAML::ARMIndexTableEntry &E : *Section.Entries) { - CBA.write(E.Offset, ELFT::TargetEndianness); - CBA.write(E.Value, ELFT::TargetEndianness); + CBA.write(E.Offset, ELFT::Endian); + CBA.write(E.Value, ELFT::Endian); } SHeader.sh_size = Section.Entries->size() * 8; } @@ -1729,8 +1729,8 @@ void ELFState::writeSectionContent(Elf_Shdr &SHeader, return; for (const ELFYAML::DynamicEntry &DE : *Section.Entries) { - CBA.write(DE.Tag, ELFT::TargetEndianness); - CBA.write(DE.Val, ELFT::TargetEndianness); + CBA.write(DE.Tag, ELFT::Endian); + CBA.write(DE.Val, ELFT::Endian); } SHeader.sh_size = 2 * sizeof(uintX_t) * Section.Entries->size(); } @@ -1758,18 +1758,18 @@ void ELFState::writeSectionContent(Elf_Shdr &SHeader, for (const ELFYAML::NoteEntry &NE : *Section.Notes) { // Write name size. if (NE.Name.empty()) - CBA.write(0, ELFT::TargetEndianness); + CBA.write(0, ELFT::Endian); else - CBA.write(NE.Name.size() + 1, ELFT::TargetEndianness); + CBA.write(NE.Name.size() + 1, ELFT::Endian); // Write description size. if (NE.Desc.binary_size() == 0) - CBA.write(0, ELFT::TargetEndianness); + CBA.write(0, ELFT::Endian); else - CBA.write(NE.Desc.binary_size(), ELFT::TargetEndianness); + CBA.write(NE.Desc.binary_size(), ELFT::Endian); // Write type. - CBA.write(NE.Type, ELFT::TargetEndianness); + CBA.write(NE.Type, ELFT::Endian); // Write name, null terminator and padding. if (!NE.Name.empty()) { @@ -1803,35 +1803,35 @@ void ELFState::writeSectionContent(Elf_Shdr &SHeader, // be used to override this field, which is useful for producing broken // objects. if (Section.Header->NBuckets) - CBA.write(*Section.Header->NBuckets, ELFT::TargetEndianness); + CBA.write(*Section.Header->NBuckets, ELFT::Endian); else - CBA.write(Section.HashBuckets->size(), ELFT::TargetEndianness); + CBA.write(Section.HashBuckets->size(), ELFT::Endian); // Write the index of the first symbol in the dynamic symbol table accessible // via the hash table. - CBA.write(Section.Header->SymNdx, ELFT::TargetEndianness); + CBA.write(Section.Header->SymNdx, ELFT::Endian); // Write the number of words in the Bloom filter. As above, the "MaskWords" // property can be used to set this field to any value. if (Section.Header->MaskWords) - CBA.write(*Section.Header->MaskWords, ELFT::TargetEndianness); + CBA.write(*Section.Header->MaskWords, ELFT::Endian); else - CBA.write(Section.BloomFilter->size(), ELFT::TargetEndianness); + CBA.write(Section.BloomFilter->size(), ELFT::Endian); // Write the shift constant used by the Bloom filter. - CBA.write(Section.Header->Shift2, ELFT::TargetEndianness); + CBA.write(Section.Header->Shift2, ELFT::Endian); // We've finished writing the header. Now write the Bloom filter. for (llvm::yaml::Hex64 Val : *Section.BloomFilter) - CBA.write(Val, ELFT::TargetEndianness); + CBA.write(Val, ELFT::Endian); // Write an array of hash buckets. for (llvm::yaml::Hex32 Val : *Section.HashBuckets) - CBA.write(Val, ELFT::TargetEndianness); + CBA.write(Val, ELFT::Endian); // Write an array of hash values. for (llvm::yaml::Hex32 Val : *Section.HashValues) - CBA.write(Val, ELFT::TargetEndianness); + CBA.write(Val, ELFT::Endian); SHeader.sh_size = 16 /*Header size*/ + Section.BloomFilter->size() * sizeof(typename ELFT::uint) + diff --git a/llvm/tools/llvm-readobj/DwarfCFIEHPrinter.h b/llvm/tools/llvm-readobj/DwarfCFIEHPrinter.h index 2e89463e68d51..d14b0b1bec34d 100644 --- a/llvm/tools/llvm-readobj/DwarfCFIEHPrinter.h +++ b/llvm/tools/llvm-readobj/DwarfCFIEHPrinter.h @@ -113,7 +113,7 @@ void PrinterContext::printEHFrameHdr(const Elf_Phdr *EHFramePHdr) const { if (!Content) reportError(Content.takeError(), ObjF.getFileName()); - DataExtractor DE(*Content, ELFT::TargetEndianness == llvm::endianness::little, + DataExtractor DE(*Content, ELFT::Endian == llvm::endianness::little, ELFT::Is64Bits ? 8 : 4); DictScope D(W, "Header"); @@ -186,10 +186,9 @@ void PrinterContext::printEHFrame(const Elf_Shdr *EHFrameShdr) const { // Construct DWARFDataExtractor to handle relocations ("PC Begin" fields). std::unique_ptr DICtx = DWARFContext::create( ObjF, DWARFContext::ProcessDebugRelocations::Process, nullptr); - DWARFDataExtractor DE(DICtx->getDWARFObj(), - DICtx->getDWARFObj().getEHFrameSection(), - ELFT::TargetEndianness == llvm::endianness::little, - ELFT::Is64Bits ? 8 : 4); + DWARFDataExtractor DE( + DICtx->getDWARFObj(), DICtx->getDWARFObj().getEHFrameSection(), + ELFT::Endian == llvm::endianness::little, ELFT::Is64Bits ? 8 : 4); DWARFDebugFrame EHFrame(Triple::ArchType(ObjF.getArch()), /*IsEH=*/true, /*EHFrameAddress=*/Address); if (Error E = EHFrame.parse(DE)) diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp index d1c05f437042d..954c07c634abf 100644 --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/llvm/tools/llvm-readobj/ELFDumper.cpp @@ -74,6 +74,7 @@ using namespace llvm; using namespace llvm::object; +using namespace llvm::support; using namespace ELF; #define LLVM_READOBJ_ENUM_CASE(ns, enum) \ @@ -3419,13 +3420,12 @@ template void ELFDumper::printStackMap() const { return; } - if (Error E = StackMapParser::validateHeader( - *ContentOrErr)) { + if (Error E = StackMapParser::validateHeader(*ContentOrErr)) { Warn(std::move(E)); return; } - prettyPrintStackMap(W, StackMapParser(*ContentOrErr)); + prettyPrintStackMap(W, StackMapParser(*ContentOrErr)); } template @@ -5145,7 +5145,7 @@ static std::string getGNUProperty(uint32_t Type, uint32_t DataSize, OS << format("", DataSize); return OS.str(); } - PrData = support::endian::read32(Data.data()); + PrData = endian::read32(Data.data()); if (PrData == 0) { OS << ""; return OS.str(); @@ -5169,7 +5169,7 @@ static std::string getGNUProperty(uint32_t Type, uint32_t DataSize, OS << format("", DataSize); return OS.str(); } - PrData = support::endian::read32(Data.data()); + PrData = endian::read32(Data.data()); if (PrData == 0) { OS << ""; return OS.str(); @@ -5195,7 +5195,7 @@ static std::string getGNUProperty(uint32_t Type, uint32_t DataSize, OS << format("", DataSize); return OS.str(); } - PrData = support::endian::read32(Data.data()); + PrData = endian::read32(Data.data()); if (PrData == 0) { OS << ""; return OS.str(); @@ -5374,10 +5374,8 @@ static bool printAArch64Note(raw_ostream &OS, uint32_t NoteType, return false; } - uint64_t Platform = - support::endian::read64(Desc.data() + 0); - uint64_t Version = - support::endian::read64(Desc.data() + 8); + uint64_t Platform = endian::read64(Desc.data() + 0); + uint64_t Version = endian::read64(Desc.data() + 8); OS << format("platform 0x%" PRIx64 ", version 0x%" PRIx64, Platform, Version); if (Desc.size() > 16) @@ -5457,16 +5455,14 @@ getFreeBSDNote(uint32_t NoteType, ArrayRef Desc, bool IsCore) { case ELF::NT_FREEBSD_ABI_TAG: if (Desc.size() != 4) return std::nullopt; - return FreeBSDNote{ - "ABI tag", - utostr(support::endian::read32(Desc.data()))}; + return FreeBSDNote{"ABI tag", + utostr(endian::read32(Desc.data()))}; case ELF::NT_FREEBSD_ARCH_TAG: return FreeBSDNote{"Arch tag", toStringRef(Desc).str()}; case ELF::NT_FREEBSD_FEATURE_CTL: { if (Desc.size() != 4) return std::nullopt; - unsigned Value = - support::endian::read32(Desc.data()); + unsigned Value = endian::read32(Desc.data()); std::string FlagsStr; raw_string_ostream OS(FlagsStr); printFlags(Value, ArrayRef(FreeBSDFeatureCtlFlags), OS); @@ -6052,9 +6048,9 @@ template void GNUELFDumper::printNotes() { return Error::success(); } else if (Name == "CORE") { if (Type == ELF::NT_FILE) { - DataExtractor DescExtractor( - Descriptor, ELFT::TargetEndianness == llvm::endianness::little, - sizeof(Elf_Addr)); + DataExtractor DescExtractor(Descriptor, + ELFT::Endian == llvm::endianness::little, + sizeof(Elf_Addr)); if (Expected NoteOrErr = readCoreNote(DescExtractor)) { printCoreNote(OS, *NoteOrErr); return Error::success(); @@ -7714,10 +7710,8 @@ static bool printAarch64NoteLLVMStyle(uint32_t NoteType, ArrayRef Desc, if (Desc.size() < 16) return false; - uint64_t platform = - support::endian::read64(Desc.data() + 0); - uint64_t version = - support::endian::read64(Desc.data() + 8); + uint64_t platform = endian::read64(Desc.data() + 0); + uint64_t version = endian::read64(Desc.data() + 8); W.printNumber("Platform", platform); W.printNumber("Version", version); @@ -7851,9 +7845,9 @@ template void LLVMELFDumper::printNotes() { return Error::success(); } else if (Name == "CORE") { if (Type == ELF::NT_FILE) { - DataExtractor DescExtractor( - Descriptor, ELFT::TargetEndianness == llvm::endianness::little, - sizeof(Elf_Addr)); + DataExtractor DescExtractor(Descriptor, + ELFT::Endian == llvm::endianness::little, + sizeof(Elf_Addr)); if (Expected N = readCoreNote(DescExtractor)) { printCoreNoteLLVMStyle(*N, W); return Error::success();