From 4e58e4a18cefbffae1d72fb467a516bf38596a20 Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Wed, 14 Dec 2022 10:24:52 +0000 Subject: [PATCH] [llvm-readobj] llvm::Optional => std::optional Temporarily add expectedToStdOptional to llvm/Support/Error.h for migration. --- llvm/include/llvm/Support/Error.h | 8 ++++ llvm/tools/llvm-readobj/ARMEHABIPrinter.h | 18 ++++----- llvm/tools/llvm-readobj/ELFDumper.cpp | 63 +++++++++++++++---------------- llvm/tools/llvm-readobj/MachODumper.cpp | 8 ++-- llvm/tools/llvm-readobj/ObjDumper.h | 6 +-- llvm/tools/llvm-readobj/llvm-readobj.cpp | 2 +- 6 files changed, 55 insertions(+), 50 deletions(-) diff --git a/llvm/include/llvm/Support/Error.h b/llvm/include/llvm/Support/Error.h index 6c794ea..c5eb4b3 100644 --- a/llvm/include/llvm/Support/Error.h +++ b/llvm/include/llvm/Support/Error.h @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -1057,6 +1058,13 @@ template Optional expectedToOptional(Expected &&E) { return std::nullopt; } +template std::optional expectedToStdOptional(Expected &&E) { + if (E) + return std::move(*E); + consumeError(E.takeError()); + return std::nullopt; +} + /// Helper for converting an Error to a bool. /// /// This method returns true if Err is in an error state, or false if it is diff --git a/llvm/tools/llvm-readobj/ARMEHABIPrinter.h b/llvm/tools/llvm-readobj/ARMEHABIPrinter.h index 609104a..a42403e 100644 --- a/llvm/tools/llvm-readobj/ARMEHABIPrinter.h +++ b/llvm/tools/llvm-readobj/ARMEHABIPrinter.h @@ -341,8 +341,9 @@ class PrinterContext { return Location + Place; } - ErrorOr FunctionAtAddress(uint64_t Address, - Optional SectionIndex) const; + ErrorOr + FunctionAtAddress(uint64_t Address, + std::optional SectionIndex) const; const Elf_Shdr *FindExceptionTable(unsigned IndexTableIndex, off_t IndexTableOffset) const; @@ -363,9 +364,8 @@ template const size_t PrinterContext::IndexTableEntrySize = 8; template -ErrorOr -PrinterContext::FunctionAtAddress(uint64_t Address, - Optional SectionIndex) const { +ErrorOr PrinterContext::FunctionAtAddress( + uint64_t Address, std::optional SectionIndex) const { if (!Symtab) return inconvertibleErrorCode(); auto StrTableOrErr = ELF.getStringTableForSymtab(*Symtab); @@ -501,8 +501,8 @@ void PrinterContext::PrintExceptionTable(const Elf_Shdr &EHT, ? PREL31(Word, EHT.sh_addr) : PREL31(Word, EHT.sh_addr + TableEntryOffset); SW.printHex("PersonalityRoutineAddress", Address); - Optional SecIndex = - IsRelocatable ? Optional(EHT.sh_link) : std::nullopt; + std::optional SecIndex = + IsRelocatable ? std::optional(EHT.sh_link) : std::nullopt; if (ErrorOr Name = FunctionAtAddress(Address, SecIndex)) SW.printString("PersonalityRoutineName", *Name); } @@ -574,8 +574,8 @@ void PrinterContext::PrintIndexTable(unsigned SectionIndex, // their code sections via the sh_link field. For a non-relocatable ELF file // the sh_link field is not reliable, because we have one .ARM.exidx section // normally, but might have many code sections. - Optional SecIndex = - IsRelocatable ? Optional(IT->sh_link) : std::nullopt; + std::optional SecIndex = + IsRelocatable ? std::optional(IT->sh_link) : std::nullopt; if (ErrorOr Name = FunctionAtAddress(Address, SecIndex)) SW.printString("FunctionName", *Name); diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp index 7d2b557..a1fdfd1 100644 --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/llvm/tools/llvm-readobj/ELFDumper.cpp @@ -202,7 +202,7 @@ public: uint32_t Symbol; typename ELFT::uint Offset; typename ELFT::uint Info; - Optional Addend; + std::optional Addend; }; template class MipsGOTParser; @@ -290,7 +290,7 @@ protected: bool NonVisibilityBitsUsed) const {}; virtual void printSymbol(const Elf_Sym &Symbol, unsigned SymIndex, DataRegion ShndxTable, - Optional StrTable, bool IsDynamic, + std::optional StrTable, bool IsDynamic, bool NonVisibilityBitsUsed) const = 0; virtual void printMipsABIFlags() = 0; @@ -308,11 +308,10 @@ protected: // symbol's section with FunctionSec when specified. // Returns std::nullopt if no function symbol can be found for the address or // in case it is not defined in the specified section. - SmallVector - getSymbolIndexesForFunctionAddress(uint64_t SymValue, - Optional FunctionSec); + SmallVector getSymbolIndexesForFunctionAddress( + uint64_t SymValue, std::optional FunctionSec); bool printFunctionStackSize(uint64_t SymValue, - Optional FunctionSec, + std::optional FunctionSec, const Elf_Shdr &StackSizeSec, DataExtractor Data, uint64_t *Offset); void printStackSize(const Relocation &R, const Elf_Shdr &RelocSec, @@ -362,7 +361,7 @@ protected: DynRegionInfo DynRelaRegion; DynRegionInfo DynRelrRegion; DynRegionInfo DynPLTRelRegion; - Optional DynSymRegion; + std::optional DynSymRegion; DynRegionInfo DynSymTabShndxRegion; DynRegionInfo DynamicTable; StringRef DynamicStringTable; @@ -381,7 +380,7 @@ protected: std::string getFullSymbolName(const Elf_Sym &Symbol, unsigned SymIndex, DataRegion ShndxTable, - Optional StrTable, + std::optional StrTable, bool IsDynamic) const; Expected getSymbolSectionIndex(const Elf_Sym &Symbol, unsigned SymIndex, @@ -494,7 +493,7 @@ ELFDumper::getVersionTable(const Elf_Shdr &Sec, ArrayRef *SymTab, template void ELFDumper::printSymbolsHelper(bool IsDynamic) const { - Optional StrTable; + std::optional StrTable; size_t Entries = 0; Elf_Sym_Range Syms(nullptr, nullptr); const Elf_Shdr *SymtabSec = IsDynamic ? DotDynsymSec : DotSymtabSec; @@ -636,7 +635,7 @@ private: const RelSymbol &RelSym) override; void printSymbol(const Elf_Sym &Symbol, unsigned SymIndex, DataRegion ShndxTable, - Optional StrTable, bool IsDynamic, + std::optional StrTable, bool IsDynamic, bool NonVisibilityBitsUsed) const override; void printDynamicRelocHeader(unsigned Type, StringRef Name, const DynRegionInfo &Reg) override; @@ -693,7 +692,7 @@ private: DataRegion ShndxTable) const; void printSymbol(const Elf_Sym &Symbol, unsigned SymIndex, DataRegion ShndxTable, - Optional StrTable, bool IsDynamic, + std::optional StrTable, bool IsDynamic, bool /*NonVisibilityBitsUsed*/) const override; void printProgramHeaders() override; void printSectionMapping() override {} @@ -882,11 +881,9 @@ std::string ELFDumper::getStaticSymbolName(uint32_t Index) const { } template -std::string ELFDumper::getFullSymbolName(const Elf_Sym &Symbol, - unsigned SymIndex, - DataRegion ShndxTable, - Optional StrTable, - bool IsDynamic) const { +std::string ELFDumper::getFullSymbolName( + const Elf_Sym &Symbol, unsigned SymIndex, DataRegion ShndxTable, + std::optional StrTable, bool IsDynamic) const { if (!StrTable) return ""; @@ -1948,7 +1945,7 @@ template void ELFDumper::parseDynamicTable() { const char *StringTableBegin = nullptr; uint64_t StringTableSize = 0; - Optional DynSymFromTable; + std::optional DynSymFromTable; for (const Elf_Dyn &Dyn : dynamic_table()) { switch (Dyn.d_tag) { case ELF::DT_HASH: @@ -2553,7 +2550,7 @@ template void ELFDumper::printHashTable() { template static Expected> -getGnuHashTableChains(Optional DynSymRegion, +getGnuHashTableChains(std::optional DynSymRegion, const typename ELFT::GnuHash *GnuHashTable) { if (!DynSymRegion) return createError("no dynamic symbol table found"); @@ -3540,7 +3537,7 @@ void GNUELFDumper::printRelRelaReloc(const Relocation &R, printField(F); std::string Addend; - if (Optional A = R.Addend) { + if (std::optional A = R.Addend) { int64_t RelAddend = *A; if (!RelSym.Name.empty()) { if (RelAddend < 0) { @@ -3836,7 +3833,7 @@ GNUELFDumper::getSymbolSectionNdx(const Elf_Sym &Symbol, template void GNUELFDumper::printSymbol(const Elf_Sym &Symbol, unsigned SymIndex, DataRegion ShndxTable, - Optional StrTable, + std::optional StrTable, bool IsDynamic, bool NonVisibilityBitsUsed) const { unsigned Bias = ELFT::Is64Bits ? 8 : 0; @@ -5230,7 +5227,7 @@ struct FreeBSDNote { }; template -static Optional +static std::optional getFreeBSDNote(uint32_t NoteType, ArrayRef Desc, bool IsCore) { if (IsCore) return std::nullopt; // No pretty-printing yet. @@ -5680,7 +5677,7 @@ StringRef getNoteTypeName(const typename ELFT::Note &Note, unsigned ELFType) { template static void printNotesHelper( const ELFDumper &Dumper, - llvm::function_ref, typename ELFT::Off, + llvm::function_ref, typename ELFT::Off, typename ELFT::Addr)> StartNotesFn, llvm::function_ref ProcessNoteFn, @@ -5693,7 +5690,7 @@ static void printNotesHelper( for (const typename ELFT::Shdr &S : Sections) { if (S.sh_type != SHT_NOTE) continue; - StartNotesFn(expectedToOptional(Obj.getSectionName(S)), S.sh_offset, + StartNotesFn(expectedToStdOptional(Obj.getSectionName(S)), S.sh_offset, S.sh_size); Error Err = Error::success(); size_t I = 0; @@ -5746,7 +5743,7 @@ static void printNotesHelper( template void GNUELFDumper::printNotes() { bool IsFirstHeader = true; - auto PrintHeader = [&](Optional SecName, + auto PrintHeader = [&](std::optional SecName, const typename ELFT::Off Offset, const typename ELFT::Addr Size) { // Print a newline between notes sections to match GNU readelf. @@ -5789,7 +5786,7 @@ template void GNUELFDumper::printNotes() { if (printGNUNote(OS, Type, Descriptor)) return Error::success(); } else if (Name == "FreeBSD") { - if (Optional N = + if (std::optional N = getFreeBSDNote(Type, Descriptor, IsCore)) { OS << " " << N->Type << ": " << N->Value << '\n'; return Error::success(); @@ -6002,7 +5999,7 @@ template void GNUELFDumper::printDependentLibs() { template SmallVector ELFDumper::getSymbolIndexesForFunctionAddress( - uint64_t SymValue, Optional FunctionSec) { + uint64_t SymValue, std::optional FunctionSec) { SmallVector SymbolIndexes; if (!this->AddressToIndexMap) { // Populate the address to index map upon the first invocation of this @@ -6068,7 +6065,7 @@ SmallVector ELFDumper::getSymbolIndexesForFunctionAddress( template bool ELFDumper::printFunctionStackSize( - uint64_t SymValue, Optional FunctionSec, + uint64_t SymValue, std::optional FunctionSec, const Elf_Shdr &StackSizeSec, DataExtractor Data, uint64_t *Offset) { SmallVector FuncSymIndexes = this->getSymbolIndexesForFunctionAddress(SymValue, FunctionSec); @@ -6729,7 +6726,7 @@ template void LLVMELFDumper::printSymbolSection( const Elf_Sym &Symbol, unsigned SymIndex, DataRegion ShndxTable) const { - auto GetSectionSpecialType = [&]() -> Optional { + auto GetSectionSpecialType = [&]() -> std::optional { if (Symbol.isUndefined()) return StringRef("Undefined"); if (Symbol.isProcessorSpecific()) @@ -6745,7 +6742,7 @@ void LLVMELFDumper::printSymbolSection( return std::nullopt; }; - if (Optional Type = GetSectionSpecialType()) { + if (std::optional Type = GetSectionSpecialType()) { W.printHex("Section", *Type, Symbol.st_shndx); return; } @@ -6779,7 +6776,7 @@ void LLVMELFDumper::printSymbolSection( template void LLVMELFDumper::printSymbol(const Elf_Sym &Symbol, unsigned SymIndex, DataRegion ShndxTable, - Optional StrTable, + std::optional StrTable, bool IsDynamic, bool /*NonVisibilityBitsUsed*/) const { std::string FullSymbolName = this->getFullSymbolName( @@ -7106,7 +7103,7 @@ template void LLVMELFDumper::printBBAddrMaps() { Sec.sh_type != SHT_LLVM_BB_ADDR_MAP_V0) { continue; } - Optional FunctionSec; + std::optional FunctionSec; if (IsRelocatable) FunctionSec = unwrapOrError(this->FileName, this->Obj.getSection(Sec.sh_link)); @@ -7242,7 +7239,7 @@ template void LLVMELFDumper::printNotes() { ListScope L(W, "Notes"); std::unique_ptr NoteScope; - auto StartNotes = [&](Optional SecName, + auto StartNotes = [&](std::optional SecName, const typename ELFT::Off Offset, const typename ELFT::Addr Size) { NoteScope = std::make_unique(W, "NoteSection"); @@ -7277,7 +7274,7 @@ template void LLVMELFDumper::printNotes() { if (printGNUNoteLLVMStyle(Type, Descriptor, W)) return Error::success(); } else if (Name == "FreeBSD") { - if (Optional N = + if (std::optional N = getFreeBSDNote(Type, Descriptor, IsCore)) { W.printString(N->Type, N->Value); return Error::success(); diff --git a/llvm/tools/llvm-readobj/MachODumper.cpp b/llvm/tools/llvm-readobj/MachODumper.cpp index 6ea1c50..0949240 100644 --- a/llvm/tools/llvm-readobj/MachODumper.cpp +++ b/llvm/tools/llvm-readobj/MachODumper.cpp @@ -61,9 +61,9 @@ private: uint8_t getSymbolType(const SymbolRef &Symbol) const; void printSymbols() override; - void printSymbols(Optional SymComp) override; + void printSymbols(std::optional SymComp) override; void printDynamicSymbols() override; - void printDynamicSymbols(Optional SymComp) override; + void printDynamicSymbols(std::optional SymComp) override; void printSymbol(const SymbolRef &Symbol, ScopedPrinter &W); void printSymbol(const SymbolRef &Symbol); @@ -636,7 +636,7 @@ bool MachODumper::compareSymbolsByType(SymbolRef LHS, SymbolRef RHS) const { void MachODumper::printSymbols() { printSymbols(std::nullopt); } -void MachODumper::printSymbols(Optional SymComp) { +void MachODumper::printSymbols(std::optional SymComp) { ListScope Group(W, "Symbols"); if (SymComp) { auto SymbolRange = Obj->symbols(); @@ -655,7 +655,7 @@ void MachODumper::printSymbols(Optional SymComp) { void MachODumper::printDynamicSymbols() { ListScope Group(W, "DynamicSymbols"); } -void MachODumper::printDynamicSymbols(Optional SymComp) { +void MachODumper::printDynamicSymbols(std::optional SymComp) { ListScope Group(W, "DynamicSymbols"); } diff --git a/llvm/tools/llvm-readobj/ObjDumper.h b/llvm/tools/llvm-readobj/ObjDumper.h index 4aff9fb..c7d3dd0 100644 --- a/llvm/tools/llvm-readobj/ObjDumper.h +++ b/llvm/tools/llvm-readobj/ObjDumper.h @@ -85,7 +85,7 @@ public: printDynamicSymbols(); } virtual void printSymbols(bool PrintSymbols, bool PrintDynamicSymbols, - llvm::Optional SymComp) { + std::optional SymComp) { if (SymComp) { if (PrintSymbols) printSymbols(SymComp); @@ -189,9 +189,9 @@ protected: private: virtual void printSymbols() {} - virtual void printSymbols(llvm::Optional Comp) {} + virtual void printSymbols(std::optional Comp) {} virtual void printDynamicSymbols() {} - virtual void printDynamicSymbols(llvm::Optional Comp) {} + virtual void printDynamicSymbols(std::optional Comp) {} virtual void printProgramHeaders() {} virtual void printSectionMapping() {} diff --git a/llvm/tools/llvm-readobj/llvm-readobj.cpp b/llvm/tools/llvm-readobj/llvm-readobj.cpp index b8e7971..b618b4f 100644 --- a/llvm/tools/llvm-readobj/llvm-readobj.cpp +++ b/llvm/tools/llvm-readobj/llvm-readobj.cpp @@ -363,7 +363,7 @@ static void dumpObject(ObjectFile &Obj, ScopedPrinter &Writer, toString(std::move(ContentErr)); ObjDumper *Dumper; - Optional SymComp; + std::optional SymComp; Expected> DumperOrErr = createDumper(Obj, Writer); if (!DumperOrErr) reportError(DumperOrErr.takeError(), FileStr); -- 2.7.4