From: Fangrui Song Date: Thu, 2 May 2019 10:32:03 +0000 (+0000) Subject: [Object] Change getSectionName() to return Expected X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=61afdad9ff369b9abd394f705a27b57bf81a5755;p=llvm [Object] Change getSectionName() to return Expected Summary: It currently receives an output parameter and returns std::error_code. Expected fits for this purpose perfectly. Differential Revision: https://reviews.llvm.org/D61421 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359774 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Object/COFF.h b/include/llvm/Object/COFF.h index c22a482aa15..8e5f714ffab 100644 --- a/include/llvm/Object/COFF.h +++ b/include/llvm/Object/COFF.h @@ -897,8 +897,7 @@ protected: Expected getSymbolType(DataRefImpl Symb) const override; Expected getSymbolSection(DataRefImpl Symb) const override; void moveSectionNext(DataRefImpl &Sec) const override; - std::error_code getSectionName(DataRefImpl Sec, - StringRef &Res) const override; + Expected getSectionName(DataRefImpl Sec) const override; uint64_t getSectionAddress(DataRefImpl Sec) const override; uint64_t getSectionIndex(DataRefImpl Sec) const override; uint64_t getSectionSize(DataRefImpl Sec) const override; @@ -1033,7 +1032,7 @@ public: ArrayRef getRelocations(const coff_section *Sec) const; - std::error_code getSectionName(const coff_section *Sec, StringRef &Res) const; + Expected getSectionName(const coff_section *Sec) const; uint64_t getSectionSize(const coff_section *Sec) const; std::error_code getSectionContents(const coff_section *Sec, ArrayRef &Res) const; diff --git a/include/llvm/Object/ELFObjectFile.h b/include/llvm/Object/ELFObjectFile.h index a5d3c15809d..1d543fb4e53 100644 --- a/include/llvm/Object/ELFObjectFile.h +++ b/include/llvm/Object/ELFObjectFile.h @@ -259,8 +259,7 @@ protected: Expected getSymbolSection(DataRefImpl Symb) const override; void moveSectionNext(DataRefImpl &Sec) const override; - std::error_code getSectionName(DataRefImpl Sec, - StringRef &Res) const override; + Expected getSectionName(DataRefImpl Sec) const override; uint64_t getSectionAddress(DataRefImpl Sec) const override; uint64_t getSectionIndex(DataRefImpl Sec) const override; uint64_t getSectionSize(DataRefImpl Sec) const override; @@ -675,13 +674,8 @@ void ELFObjectFile::moveSectionNext(DataRefImpl &Sec) const { } template -std::error_code ELFObjectFile::getSectionName(DataRefImpl Sec, - StringRef &Result) const { - auto Name = EF.getSectionName(&*getSection(Sec)); - if (!Name) - return errorToErrorCode(Name.takeError()); - Result = *Name; - return std::error_code(); +Expected ELFObjectFile::getSectionName(DataRefImpl Sec) const { + return EF.getSectionName(&*getSection(Sec)); } template diff --git a/include/llvm/Object/MachO.h b/include/llvm/Object/MachO.h index 912df675812..ce636a6d278 100644 --- a/include/llvm/Object/MachO.h +++ b/include/llvm/Object/MachO.h @@ -293,8 +293,7 @@ public: unsigned getSectionID(SectionRef Sec) const; void moveSectionNext(DataRefImpl &Sec) const override; - std::error_code getSectionName(DataRefImpl Sec, - StringRef &Res) const override; + Expected getSectionName(DataRefImpl Sec) const override; uint64_t getSectionAddress(DataRefImpl Sec) const override; uint64_t getSectionIndex(DataRefImpl Sec) const override; uint64_t getSectionSize(DataRefImpl Sec) const override; diff --git a/include/llvm/Object/ObjectFile.h b/include/llvm/Object/ObjectFile.h index 51359ba1964..de4867c2cd5 100644 --- a/include/llvm/Object/ObjectFile.h +++ b/include/llvm/Object/ObjectFile.h @@ -257,8 +257,7 @@ protected: friend class SectionRef; virtual void moveSectionNext(DataRefImpl &Sec) const = 0; - virtual std::error_code getSectionName(DataRefImpl Sec, - StringRef &Res) const = 0; + virtual Expected getSectionName(DataRefImpl Sec) const = 0; virtual uint64_t getSectionAddress(DataRefImpl Sec) const = 0; virtual uint64_t getSectionIndex(DataRefImpl Sec) const = 0; virtual uint64_t getSectionSize(DataRefImpl Sec) const = 0; @@ -438,7 +437,11 @@ inline void SectionRef::moveNext() { } inline std::error_code SectionRef::getName(StringRef &Result) const { - return OwningObject->getSectionName(SectionPimpl, Result); + Expected NameOrErr = OwningObject->getSectionName(SectionPimpl); + if (!NameOrErr) + return errorToErrorCode(NameOrErr.takeError()); + Result = *NameOrErr; + return std::error_code(); } inline uint64_t SectionRef::getAddress() const { diff --git a/include/llvm/Object/Wasm.h b/include/llvm/Object/Wasm.h index db1bef38892..f778526657d 100644 --- a/include/llvm/Object/Wasm.h +++ b/include/llvm/Object/Wasm.h @@ -171,8 +171,7 @@ public: // Overrides from SectionRef. void moveSectionNext(DataRefImpl &Sec) const override; - std::error_code getSectionName(DataRefImpl Sec, - StringRef &Res) const override; + Expected getSectionName(DataRefImpl Sec) const override; uint64_t getSectionAddress(DataRefImpl Sec) const override; uint64_t getSectionIndex(DataRefImpl Sec) const override; uint64_t getSectionSize(DataRefImpl Sec) const override; diff --git a/include/llvm/Object/XCOFFObjectFile.h b/include/llvm/Object/XCOFFObjectFile.h index f35b36e9489..caa792d6b7f 100644 --- a/include/llvm/Object/XCOFFObjectFile.h +++ b/include/llvm/Object/XCOFFObjectFile.h @@ -87,8 +87,7 @@ public: Expected getSymbolSection(DataRefImpl Symb) const override; void moveSectionNext(DataRefImpl &Sec) const override; - std::error_code getSectionName(DataRefImpl Sec, - StringRef &Res) const override; + Expected getSectionName(DataRefImpl Sec) const override; uint64_t getSectionAddress(DataRefImpl Sec) const override; uint64_t getSectionIndex(DataRefImpl Sec) const override; uint64_t getSectionSize(DataRefImpl Sec) const override; diff --git a/lib/Object/COFFObjectFile.cpp b/lib/Object/COFFObjectFile.cpp index d52206d8cd3..ccb861cb187 100644 --- a/lib/Object/COFFObjectFile.cpp +++ b/lib/Object/COFFObjectFile.cpp @@ -269,10 +269,9 @@ void COFFObjectFile::moveSectionNext(DataRefImpl &Ref) const { Ref.p = reinterpret_cast(Sec); } -std::error_code COFFObjectFile::getSectionName(DataRefImpl Ref, - StringRef &Result) const { +Expected COFFObjectFile::getSectionName(DataRefImpl Ref) const { const coff_section *Sec = toSec(Ref); - return getSectionName(Sec, Result); + return getSectionName(Sec); } uint64_t COFFObjectFile::getSectionAddress(DataRefImpl Ref) const { @@ -1074,8 +1073,8 @@ uint32_t COFFObjectFile::getSymbolIndex(COFFSymbolRef Symbol) const { return Index; } -std::error_code COFFObjectFile::getSectionName(const coff_section *Sec, - StringRef &Res) const { +Expected +COFFObjectFile::getSectionName(const coff_section *Sec) const { StringRef Name; if (Sec->Name[COFF::NameSize - 1] == 0) // Null terminated, let ::strlen figure out the length. @@ -1089,17 +1088,18 @@ std::error_code COFFObjectFile::getSectionName(const coff_section *Sec, uint32_t Offset; if (Name.startswith("//")) { if (decodeBase64StringEntry(Name.substr(2), Offset)) - return object_error::parse_failed; + return createStringError(object_error::parse_failed, + "inalid section name"); } else { if (Name.substr(1).getAsInteger(10, Offset)) - return object_error::parse_failed; + return createStringError(object_error::parse_failed, + "invalid section name"); } if (std::error_code EC = getString(Offset, Name)) - return EC; + return errorCodeToError(EC); } - Res = Name; - return std::error_code(); + return Name; } uint64_t COFFObjectFile::getSectionSize(const coff_section *Sec) const { diff --git a/lib/Object/MachOObjectFile.cpp b/lib/Object/MachOObjectFile.cpp index 8be287c5f9e..1aa57bbbc76 100644 --- a/lib/Object/MachOObjectFile.cpp +++ b/lib/Object/MachOObjectFile.cpp @@ -1863,11 +1863,9 @@ void MachOObjectFile::moveSectionNext(DataRefImpl &Sec) const { Sec.d.a++; } -std::error_code MachOObjectFile::getSectionName(DataRefImpl Sec, - StringRef &Result) const { +Expected MachOObjectFile::getSectionName(DataRefImpl Sec) const { ArrayRef Raw = getSectionRawName(Sec); - Result = parseSegmentOrSectionName(Raw.data()); - return std::error_code(); + return parseSegmentOrSectionName(Raw.data()); } uint64_t MachOObjectFile::getSectionAddress(DataRefImpl Sec) const { @@ -2000,9 +1998,8 @@ bool MachOObjectFile::isSectionVirtual(DataRefImpl Sec) const { bool MachOObjectFile::isSectionBitcode(DataRefImpl Sec) const { StringRef SegmentName = getSectionFinalSegmentName(Sec); - StringRef SectName; - if (!getSectionName(Sec, SectName)) - return (SegmentName == "__LLVM" && SectName == "__bitcode"); + if (Expected NameOrErr = getSectionName(Sec)) + return (SegmentName == "__LLVM" && *NameOrErr == "__bitcode"); return false; } diff --git a/lib/Object/ObjectFile.cpp b/lib/Object/ObjectFile.cpp index 081e29c21b6..cc0b282665d 100644 --- a/lib/Object/ObjectFile.cpp +++ b/lib/Object/ObjectFile.cpp @@ -68,9 +68,8 @@ std::error_code ObjectFile::printSymbolName(raw_ostream &OS, uint32_t ObjectFile::getSymbolAlignment(DataRefImpl DRI) const { return 0; } bool ObjectFile::isSectionBitcode(DataRefImpl Sec) const { - StringRef SectName; - if (!getSectionName(Sec, SectName)) - return SectName == ".llvmbc"; + if (Expected NameOrErr = getSectionName(Sec)) + return *NameOrErr == ".llvmbc"; return false; } diff --git a/lib/Object/WasmObjectFile.cpp b/lib/Object/WasmObjectFile.cpp index 45e343f8f47..1c56ee6652a 100644 --- a/lib/Object/WasmObjectFile.cpp +++ b/lib/Object/WasmObjectFile.cpp @@ -1389,13 +1389,11 @@ WasmObjectFile::getSymbolSection(DataRefImpl Symb) const { void WasmObjectFile::moveSectionNext(DataRefImpl &Sec) const { Sec.d.a++; } -std::error_code WasmObjectFile::getSectionName(DataRefImpl Sec, - StringRef &Res) const { +Expected WasmObjectFile::getSectionName(DataRefImpl Sec) const { const WasmSection &S = Sections[Sec.d.a]; #define ECase(X) \ case wasm::WASM_SEC_##X: \ - Res = #X; \ - break + return #X; switch (S.Type) { ECase(TYPE); ECase(IMPORT); @@ -1411,13 +1409,11 @@ std::error_code WasmObjectFile::getSectionName(DataRefImpl Sec, ECase(DATA); ECase(DATACOUNT); case wasm::WASM_SEC_CUSTOM: - Res = S.Name; - break; + return S.Name; default: - return object_error::invalid_section_index; + return createStringError(object_error::invalid_section_index, ""); } #undef ECase - return std::error_code(); } uint64_t WasmObjectFile::getSectionAddress(DataRefImpl Sec) const { return 0; } diff --git a/lib/Object/XCOFFObjectFile.cpp b/lib/Object/XCOFFObjectFile.cpp index e74085575a6..bc982593f0b 100644 --- a/lib/Object/XCOFFObjectFile.cpp +++ b/lib/Object/XCOFFObjectFile.cpp @@ -119,14 +119,12 @@ void XCOFFObjectFile::moveSectionNext(DataRefImpl &Sec) const { Sec.p = reinterpret_cast(Ptr + getSectionHeaderSize()); } -std::error_code XCOFFObjectFile::getSectionName(DataRefImpl Sec, - StringRef &Res) const { +Expected XCOFFObjectFile::getSectionName(DataRefImpl Sec) const { const char *Name = toSection(Sec)->Name; auto NulCharPtr = static_cast(memchr(Name, '\0', XCOFF::SectionNameSize)); - Res = NulCharPtr ? StringRef(Name, NulCharPtr - Name) - : StringRef(Name, XCOFF::SectionNameSize); - return std::error_code(); + return NulCharPtr ? StringRef(Name, NulCharPtr - Name) + : StringRef(Name, XCOFF::SectionNameSize); } uint64_t XCOFFObjectFile::getSectionAddress(DataRefImpl Sec) const { diff --git a/tools/llvm-nm/llvm-nm.cpp b/tools/llvm-nm/llvm-nm.cpp index 898ffd8bd92..336167f34bb 100644 --- a/tools/llvm-nm/llvm-nm.cpp +++ b/tools/llvm-nm/llvm-nm.cpp @@ -525,7 +525,8 @@ static void darwinPrintSymbol(SymbolicFile &Obj, const NMSymbol &S, } DataRefImpl Ref = Sec->getRawDataRefImpl(); StringRef SectionName; - MachO->getSectionName(Ref, SectionName); + if (Expected NameOrErr = MachO->getSectionName(Ref)) + SectionName = *NameOrErr; StringRef SegmentName = MachO->getSectionFinalSegmentName(Ref); outs() << "(" << SegmentName << "," << SectionName << ") "; break; @@ -951,10 +952,9 @@ static char getSymbolNMTypeChar(COFFObjectFile &Obj, symbol_iterator I) { section_iterator SecI = *SecIOrErr; const coff_section *Section = Obj.getCOFFSection(*SecI); Characteristics = Section->Characteristics; - StringRef SectionName; - Obj.getSectionName(Section, SectionName); - if (SectionName.startswith(".idata")) - return 'i'; + if (Expected NameOrErr = Obj.getSectionName(Section)) + if (NameOrErr->startswith(".idata")) + return 'i'; } switch (Symb.getSectionNumber()) { @@ -1014,7 +1014,8 @@ static char getSymbolNMTypeChar(MachOObjectFile &Obj, basic_symbol_iterator I) { return 's'; DataRefImpl Ref = Sec->getRawDataRefImpl(); StringRef SectionName; - Obj.getSectionName(Ref, SectionName); + if (Expected NameOrErr = Obj.getSectionName(Ref)) + SectionName = *NameOrErr; StringRef SegmentName = Obj.getSectionFinalSegmentName(Ref); if (Obj.is64Bit() && Obj.getHeader64().filetype == MachO::MH_KEXT_BUNDLE && SegmentName == "__TEXT_EXEC" && SectionName == "__text") @@ -1136,7 +1137,8 @@ static unsigned getNsectForSegSect(MachOObjectFile *Obj) { for (auto &S : Obj->sections()) { DataRefImpl Ref = S.getRawDataRefImpl(); StringRef SectionName; - Obj->getSectionName(Ref, SectionName); + if (Expected NameOrErr = Obj->getSectionName(Ref)) + SectionName = *NameOrErr; StringRef SegmentName = Obj->getSectionFinalSegmentName(Ref); if (SegmentName == SegSect[0] && SectionName == SegSect[1]) return Nsect; diff --git a/tools/llvm-objcopy/COFF/Reader.cpp b/tools/llvm-objcopy/COFF/Reader.cpp index e91f4597187..774427a7704 100644 --- a/tools/llvm-objcopy/COFF/Reader.cpp +++ b/tools/llvm-objcopy/COFF/Reader.cpp @@ -75,8 +75,10 @@ Error COFFReader::readSections(Object &Obj) const { ArrayRef Relocs = COFFObj.getRelocations(Sec); for (const coff_relocation &R : Relocs) S.Relocs.push_back(R); - if (auto EC = COFFObj.getSectionName(Sec, S.Name)) - return errorCodeToError(EC); + if (Expected NameOrErr = COFFObj.getSectionName(Sec)) + S.Name = *NameOrErr; + else + return NameOrErr.takeError(); if (Sec->hasExtendedRelocations()) return createStringError(object_error::parse_failed, "Extended relocations not supported yet"); diff --git a/tools/llvm-objdump/MachODump.cpp b/tools/llvm-objdump/MachODump.cpp index e5e039cd054..42b82ae5a9d 100644 --- a/tools/llvm-objdump/MachODump.cpp +++ b/tools/llvm-objdump/MachODump.cpp @@ -965,11 +965,10 @@ static void PrintRelocationEntries(const MachOObjectFile *O, object::DataRefImpl DRI; DRI.d.a = r_symbolnum-1; StringRef SegName = O->getSectionFinalSegmentName(DRI); - StringRef SectName; - if (O->getSectionName(DRI, SectName)) - outs() << "(?,?)\n"; + if (Expected NameOrErr = O->getSectionName(DRI)) + outs() << "(" << SegName << "," << *NameOrErr << ")\n"; else - outs() << "(" << SegName << "," << SectName << ")\n"; + outs() << "(?,?)\n"; } else { outs() << "(?,?)\n"; @@ -1022,13 +1021,12 @@ static void PrintRelocations(const MachOObjectFile *O, const bool verbose) { DataRefImpl DRI; DRI.d.a = J; const StringRef SegName = O->getSectionFinalSegmentName(DRI); - StringRef SectName; - if (O->getSectionName(DRI, SectName)) + if (Expected NameOrErr = O->getSectionName(DRI)) + outs() << "Relocation information (" << SegName << "," << *NameOrErr + << format(") %u entries", Sec.nreloc); + else outs() << "Relocation information (" << SegName << ",?) " << format("%u entries", Sec.nreloc); - else - outs() << "Relocation information (" << SegName << "," - << SectName << format(") %u entries", Sec.nreloc); outs() << "\naddress pcrel length extern type scattered " "symbolnum/value\n"; PrintRelocationEntries(O, O->section_rel_begin(DRI), @@ -1043,13 +1041,12 @@ static void PrintRelocations(const MachOObjectFile *O, const bool verbose) { DataRefImpl DRI; DRI.d.a = J; const StringRef SegName = O->getSectionFinalSegmentName(DRI); - StringRef SectName; - if (O->getSectionName(DRI, SectName)) + if (Expected NameOrErr = O->getSectionName(DRI)) + outs() << "Relocation information (" << SegName << "," << *NameOrErr + << format(") %u entries", Sec.nreloc); + else outs() << "Relocation information (" << SegName << ",?) " << format("%u entries", Sec.nreloc); - else - outs() << "Relocation information (" << SegName << "," - << SectName << format(") %u entries", Sec.nreloc); outs() << "\naddress pcrel length extern type scattered " "symbolnum/value\n"; PrintRelocationEntries(O, O->section_rel_begin(DRI), diff --git a/tools/llvm-readobj/ARMWinEHPrinter.cpp b/tools/llvm-readobj/ARMWinEHPrinter.cpp index 770062aa73b..4de14e2e78d 100644 --- a/tools/llvm-readobj/ARMWinEHPrinter.cpp +++ b/tools/llvm-readobj/ARMWinEHPrinter.cpp @@ -1094,17 +1094,17 @@ void Decoder::dumpProcedureData(const COFFObjectFile &COFF, break; } -std::error_code Decoder::dumpProcedureData(const COFFObjectFile &COFF) { +Error Decoder::dumpProcedureData(const COFFObjectFile &COFF) { for (const auto &Section : COFF.sections()) { - StringRef SectionName; - if (std::error_code EC = - COFF.getSectionName(COFF.getCOFFSection(Section), SectionName)) - return EC; + Expected NameOrErr = + COFF.getSectionName(COFF.getCOFFSection(Section)); + if (!NameOrErr) + return NameOrErr.takeError(); - if (SectionName.startswith(".pdata")) + if (NameOrErr->startswith(".pdata")) dumpProcedureData(COFF, Section); } - return std::error_code(); + return Error::success(); } } } diff --git a/tools/llvm-readobj/ARMWinEHPrinter.h b/tools/llvm-readobj/ARMWinEHPrinter.h index cb3c482f95e..5de7062cb1d 100644 --- a/tools/llvm-readobj/ARMWinEHPrinter.h +++ b/tools/llvm-readobj/ARMWinEHPrinter.h @@ -156,7 +156,7 @@ public: Decoder(ScopedPrinter &SW, bool isAArch64) : SW(SW), OS(SW.getOStream()), isAArch64(isAArch64) {} - std::error_code dumpProcedureData(const object::COFFObjectFile &COFF); + Error dumpProcedureData(const object::COFFObjectFile &COFF); }; } } diff --git a/tools/llvm-readobj/COFFDumper.cpp b/tools/llvm-readobj/COFFDumper.cpp index aca5d133a82..e8db76f791c 100644 --- a/tools/llvm-readobj/COFFDumper.cpp +++ b/tools/llvm-readobj/COFFDumper.cpp @@ -1390,15 +1390,11 @@ void COFFDumper::printSymbols() { void COFFDumper::printDynamicSymbols() { ListScope Group(W, "DynamicSymbols"); } -static ErrorOr +static Expected getSectionName(const llvm::object::COFFObjectFile *Obj, int32_t SectionNumber, const coff_section *Section) { - if (Section) { - StringRef SectionName; - if (std::error_code EC = Obj->getSectionName(Section, SectionName)) - return EC; - return SectionName; - } + if (Section) + return Obj->getSectionName(Section); if (SectionNumber == llvm::COFF::IMAGE_SYM_DEBUG) return StringRef("IMAGE_SYM_DEBUG"); if (SectionNumber == llvm::COFF::IMAGE_SYM_ABSOLUTE) @@ -1423,11 +1419,10 @@ void COFFDumper::printSymbol(const SymbolRef &Sym) { if (Obj->getSymbolName(Symbol, SymbolName)) SymbolName = ""; - StringRef SectionName = ""; - ErrorOr Res = - getSectionName(Obj, Symbol.getSectionNumber(), Section); - if (Res) - SectionName = *Res; + StringRef SectionName; + if (Expected NameOrErr = + getSectionName(Obj, Symbol.getSectionNumber(), Section)) + SectionName = *NameOrErr; W.printString("Name", SymbolName); W.printNumber("Value", Symbol.getValue()); @@ -1495,16 +1490,12 @@ void COFFDumper::printSymbol(const SymbolRef &Sym) { && Aux->Selection == COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE) { const coff_section *Assoc; StringRef AssocName = ""; - std::error_code EC = Obj->getSection(AuxNumber, Assoc); - ErrorOr Res = getSectionName(Obj, AuxNumber, Assoc); - if (Res) - AssocName = *Res; - if (!EC) - EC = Res.getError(); - if (EC) { - AssocName = ""; + if (std::error_code EC = Obj->getSection(AuxNumber, Assoc)) error(EC); - } + Expected Res = getSectionName(Obj, AuxNumber, Assoc); + if (!Res) + error(Res.takeError()); + AssocName = *Res; W.printNumber("AssocSection", AssocName, AuxNumber); } @@ -1551,7 +1542,8 @@ void COFFDumper::printUnwindInfo() { case COFF::IMAGE_FILE_MACHINE_ARMNT: { ARM::WinEH::Decoder Decoder(W, Obj->getMachine() == COFF::IMAGE_FILE_MACHINE_ARM64); - Decoder.dumpProcedureData(*Obj); + // TODO Propagate the error. + consumeError(Decoder.dumpProcedureData(*Obj)); break; } default: