diff options
| author | George Rimar <grimar@accesssoftek.com> | 2019-08-09 10:53:12 +0000 | 
|---|---|---|
| committer | George Rimar <grimar@accesssoftek.com> | 2019-08-09 10:53:12 +0000 | 
| commit | e3d81fdf6f019c4774f8f513d880fcdd4f3a0239 (patch) | |
| tree | 53edacd88216b454b9bd53ab1f7a35a3afdb8991 | |
| parent | ac42e741e01b0c2d91c3ae1d92a5b9685a05baf7 (diff) | |
| download | bcm5719-llvm-e3d81fdf6f019c4774f8f513d880fcdd4f3a0239.tar.gz bcm5719-llvm-e3d81fdf6f019c4774f8f513d880fcdd4f3a0239.zip  | |
[llvm-readobj] - Remove deprecated unwrapOrError(Expected<T> EO).
This patch changes the code to use a modern unwrapOrError(StringRef Input, Expected<T> EO)
version that contains the input source name and removes the deprecated version.
Differential revision: https://reviews.llvm.org/D65946
llvm-svn: 368428
| -rw-r--r-- | llvm/test/Object/invalid.test | 50 | ||||
| -rw-r--r-- | llvm/test/tools/llvm-readobj/elf-packed-relocs-error1.s | 2 | ||||
| -rw-r--r-- | llvm/test/tools/llvm-readobj/elf-packed-relocs-error2.s | 2 | ||||
| -rw-r--r-- | llvm/test/tools/llvm-readobj/elf-packed-relocs-error3.s | 2 | ||||
| -rw-r--r-- | llvm/test/tools/llvm-readobj/elf-packed-relocs-error4.s | 2 | ||||
| -rw-r--r-- | llvm/test/tools/llvm-readobj/elf-packed-relocs-error5.s | 2 | ||||
| -rw-r--r-- | llvm/test/tools/yaml2obj/elf-sht-symtab-shndx.yaml | 8 | ||||
| -rw-r--r-- | llvm/tools/llvm-readobj/ARMEHABIPrinter.h | 15 | ||||
| -rw-r--r-- | llvm/tools/llvm-readobj/COFFDumper.cpp | 30 | ||||
| -rw-r--r-- | llvm/tools/llvm-readobj/ELFDumper.cpp | 391 | ||||
| -rw-r--r-- | llvm/tools/llvm-readobj/MachODumper.cpp | 6 | ||||
| -rw-r--r-- | llvm/tools/llvm-readobj/ObjDumper.cpp | 6 | ||||
| -rw-r--r-- | llvm/tools/llvm-readobj/llvm-readobj.h | 11 | 
13 files changed, 303 insertions, 224 deletions
diff --git a/llvm/test/Object/invalid.test b/llvm/test/Object/invalid.test index 7566ab23d17..09c8dfecdd9 100644 --- a/llvm/test/Object/invalid.test +++ b/llvm/test/Object/invalid.test @@ -109,9 +109,9 @@ Symbols:  ## Check that llvm-readobj reports an error if .symtab has an invalid sh_entsize.  # RUN: yaml2obj %s --docnum=6 -o %t6 -# RUN: not llvm-readobj --symbols %t6 2>&1 | FileCheck --check-prefix=INVALID-SYM-SIZE %s +# RUN: not llvm-readobj --symbols %t6 2>&1 | FileCheck -DFILE=%t6 --check-prefix=INVALID-SYM-SIZE %s -# INVALID-SYM-SIZE: error: section [index 1] has an invalid sh_entsize: 32 +# INVALID-SYM-SIZE: error: '[[FILE]]': section [index 1] has an invalid sh_entsize: 32  --- !ELF  FileHeader: @@ -150,9 +150,9 @@ DynamicSymbols:  ## which is greater than number of sections.  # RUN: yaml2obj %s --docnum=8 -o %t8 -# RUN: not llvm-readobj --symbols %t8 2>&1 | FileCheck --check-prefix=INVALID-SYMTAB-LINK %s +# RUN: not llvm-readobj --symbols %t8 2>&1 | FileCheck -DFILE=%t8 --check-prefix=INVALID-SYMTAB-LINK %s -# INVALID-SYMTAB-LINK: error: invalid section index: 255 +# INVALID-SYMTAB-LINK: error: '[[FILE]]': invalid section index: 255  --- !ELF  FileHeader: @@ -185,9 +185,9 @@ FileHeader:  ## that is not a multiple of sh_entsize.  # RUN: yaml2obj %s --docnum=10 -o %t10 -# RUN: not llvm-readobj --symbols %t10 2>&1 | FileCheck --check-prefix=INVALID-SYMTAB-SIZE %s +# RUN: not llvm-readobj --symbols %t10 2>&1 | FileCheck -DFILE=%t10 --check-prefix=INVALID-SYMTAB-SIZE %s -# INVALID-SYMTAB-SIZE: error: section [index 1] has an invalid sh_size (1) which is not a multiple of its sh_entsize (24) +# INVALID-SYMTAB-SIZE: error: '[[FILE]]': section [index 1] has an invalid sh_size (1) which is not a multiple of its sh_entsize (24)  --- !ELF  FileHeader: @@ -224,27 +224,27 @@ Sections:  ## Check that llvm-readobj reports an error if the e_phentsize field is broken.  # RUN: not llvm-readobj --program-headers %p/Inputs/invalid-e_shnum.elf 2>&1 | \ -# RUN:  FileCheck --check-prefix=INVALID-PH-ENTSIZE %s +# RUN:  FileCheck -DFILE=%p/Inputs/invalid-e_shnum.elf --check-prefix=INVALID-PH-ENTSIZE %s -# INVALID-PH-ENTSIZE: error: invalid e_phentsize: 12336 +# INVALID-PH-ENTSIZE: error: '[[FILE]]': invalid e_phentsize: 12336  ## Check that llvm-readobj reports an error when we have no SHT_SYMTAB_SHNDX section,  ## but have a symbol referencing it.  # RUN: not llvm-readobj --symbols %p/Inputs/invalid-ext-symtab-index.elf-x86-64 2>&1 | \ -# RUN:   FileCheck --check-prefix=INVALID-EXT-SYMTAB-INDEX %s +# RUN:   FileCheck -DFILE=%p/Inputs/invalid-ext-symtab-index.elf-x86-64 --check-prefix=INVALID-EXT-SYMTAB-INDEX %s -# INVALID-EXT-SYMTAB-INDEX: error: extended symbol index (0) is past the end of the SHT_SYMTAB_SHNDX section of size 0 +# INVALID-EXT-SYMTAB-INDEX: error: '[[FILE]]': extended symbol index (0) is past the end of the SHT_SYMTAB_SHNDX section of size 0  ## Check that llvm-readobj reports an error if a relocation section  ## has a broken sh_offset (past the end of the file).  # RUN: yaml2obj %s --docnum=12 -o %t12  # RUN: yaml2obj %s --docnum=13 -o %t13 -# RUN: not llvm-readobj -r %t12 2>&1 | FileCheck --check-prefix=INVALID-RELOC-SH-OFFSET %s -# RUN: not llvm-readobj -r %t13 2>&1 | FileCheck --check-prefix=INVALID-RELOC-SH-OFFSET %s +# RUN: not llvm-readobj -r %t12 2>&1 | FileCheck -DFILE=%t12 --check-prefix=INVALID-RELOC-SH-OFFSET %s +# RUN: not llvm-readobj -r %t13 2>&1 | FileCheck -DFILE=%t13 --check-prefix=INVALID-RELOC-SH-OFFSET %s -# INVALID-RELOC-SH-OFFSET: error: section [index 1] has a sh_offset (0x10000) + sh_size (0x0) that cannot be represented +# INVALID-RELOC-SH-OFFSET: error: '[[FILE]]': section [index 1] has a sh_offset (0x10000) + sh_size (0x0) that cannot be represented  --- !ELF  FileHeader: @@ -272,9 +272,9 @@ Sections:  ## so large that sh_offset + sh_size overflows the platform address size type.  # RUN: yaml2obj %s --docnum=14 -o %t14 -# RUN: not llvm-readobj --symbols %t14 2>&1 | FileCheck --check-prefix=INVALID-SECTION-SIZE2 %s +# RUN: not llvm-readobj --symbols %t14 2>&1 | FileCheck -DFILE=%t14 --check-prefix=INVALID-SECTION-SIZE2 %s -# INVALID-SECTION-SIZE2: error: section [index 1] has a sh_offset (0xffffffff) + sh_size (0x27) that cannot be represented +# INVALID-SECTION-SIZE2: error: '[[FILE]]': section [index 1] has a sh_offset (0xffffffff) + sh_size (0x27) that cannot be represented  --- !ELF  FileHeader: @@ -307,9 +307,9 @@ FileHeader:  ## incorrect (too large) symbol index.  # RUN: yaml2obj %s --docnum=16 -o %t16 -# RUN: not llvm-readobj -r %t16 2>&1 | FileCheck --check-prefix=INVALID-REL-SYM %s +# RUN: not llvm-readobj -r %t16 2>&1 | FileCheck -DFILE=%t16 --check-prefix=INVALID-REL-SYM %s -# INVALID-REL-SYM: error: unable to access section [index 2] data at 0x18000180: offset goes past the end of file +# INVALID-REL-SYM: error: '[[FILE]]': unable to access section [index 2] data at 0x18000180: offset goes past the end of file  --- !ELF  FileHeader: @@ -363,9 +363,9 @@ Sections:  # RUN: yaml2obj %s --docnum=18 -o %t18  # RUN: not llvm-readobj --sections --section-data %t18 2>&1 \ -# RUN:  | FileCheck --check-prefix=BROKEN-SECSHOFFSET %s +# RUN:  | FileCheck -DFILE=%t18 --check-prefix=BROKEN-SECSHOFFSET %s -# BROKEN-SECSHOFFSET: error: section [index 1] has a sh_offset (0xffff0000) + sh_size (0x0) that cannot be represented +# BROKEN-SECSHOFFSET: error: '[[FILE]]': section [index 1] has a sh_offset (0xffff0000) + sh_size (0x0) that cannot be represented  --- !ELF  FileHeader: @@ -382,9 +382,9 @@ Sections:  ## offset goes past the end of the symbol string table.  # RUN: yaml2obj %s --docnum=19 -o %t19 -# RUN: not llvm-readobj --symbols %t19 2>&1 | FileCheck --check-prefix=INVALID-SYM-NAME %s +# RUN: not llvm-readobj --symbols %t19 2>&1 | FileCheck -DFILE=%t19 --check-prefix=INVALID-SYM-NAME %s -# INVALID-SYM-NAME: error: Invalid data was encountered while parsing the file +# INVALID-SYM-NAME: error: '[[FILE]]': Invalid data was encountered while parsing the file  --- !ELF  FileHeader: @@ -424,9 +424,9 @@ DynamicSymbols:  ## Check llvm-readobj reports it.  # RUN: not llvm-readobj -l %p/Inputs/corrupt-invalid-phentsize.elf.x86-64 2>&1 \ -# RUN:   | FileCheck --check-prefix=PHENTSIZE %s +# RUN:   | FileCheck -DFILE=%p/Inputs/corrupt-invalid-phentsize.elf.x86-64 --check-prefix=PHENTSIZE %s -# PHENTSIZE: error: invalid e_phentsize: 57 +# PHENTSIZE: error: '[[FILE]]': invalid e_phentsize: 57  ## The dynamic table contains DT_STRTAB with a value that is not in any loadable segment.  ## Check llvm-readobj reports it. @@ -631,9 +631,9 @@ Symbols:  ## sh_entsize value (3 instead of 2) when trying to access the entries.  # RUN: yaml2obj %s --docnum=30 -o %t30 -# RUN: not llvm-readobj -V %t30 2>&1 | FileCheck --check-prefix=INVALID-VER-SHENTSIZE %s +# RUN: not llvm-readobj -V %t30 2>&1 | FileCheck -DFILE=%t30 --check-prefix=INVALID-VER-SHENTSIZE %s -# INVALID-VER-SHENTSIZE: error: section [index 1] has invalid sh_entsize: expected 2, but got 3 +# INVALID-VER-SHENTSIZE: error: '[[FILE]]': section [index 1] has invalid sh_entsize: expected 2, but got 3  --- !ELF  FileHeader: diff --git a/llvm/test/tools/llvm-readobj/elf-packed-relocs-error1.s b/llvm/test/tools/llvm-readobj/elf-packed-relocs-error1.s index c83748185b5..cfe2f8cf5bd 100644 --- a/llvm/test/tools/llvm-readobj/elf-packed-relocs-error1.s +++ b/llvm/test/tools/llvm-readobj/elf-packed-relocs-error1.s @@ -1,7 +1,7 @@  // REQUIRES: x86-registered-target  // RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | not llvm-readobj -r - 2>&1 | FileCheck %s -// CHECK: error: invalid packed relocation header +// CHECK: error: '<stdin>': invalid packed relocation header  .section .rela.dyn, "a", @0x60000001  .ascii "APS9" diff --git a/llvm/test/tools/llvm-readobj/elf-packed-relocs-error2.s b/llvm/test/tools/llvm-readobj/elf-packed-relocs-error2.s index 23dd33e5a93..6e8e9bf5bd1 100644 --- a/llvm/test/tools/llvm-readobj/elf-packed-relocs-error2.s +++ b/llvm/test/tools/llvm-readobj/elf-packed-relocs-error2.s @@ -1,7 +1,7 @@  // REQUIRES: x86-registered-target  // RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | not llvm-readobj -r - 2>&1 | FileCheck %s -// CHECK: error: malformed sleb128, extends past end +// CHECK: error: '<stdin>': malformed sleb128, extends past end  .section .rela.dyn, "a", @0x60000001  .ascii "APS2" diff --git a/llvm/test/tools/llvm-readobj/elf-packed-relocs-error3.s b/llvm/test/tools/llvm-readobj/elf-packed-relocs-error3.s index e2a6376e366..8b18ca210aa 100644 --- a/llvm/test/tools/llvm-readobj/elf-packed-relocs-error3.s +++ b/llvm/test/tools/llvm-readobj/elf-packed-relocs-error3.s @@ -1,7 +1,7 @@  // REQUIRES: x86-registered-target  // RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | not llvm-readobj -r - 2>&1 | FileCheck %s -// CHECK: error: malformed sleb128, extends past end +// CHECK: error: '<stdin>': malformed sleb128, extends past end  .section .rela.dyn, "a", @0x60000001  .ascii "APS2" diff --git a/llvm/test/tools/llvm-readobj/elf-packed-relocs-error4.s b/llvm/test/tools/llvm-readobj/elf-packed-relocs-error4.s index 97aee3a9ce1..05b95410898 100644 --- a/llvm/test/tools/llvm-readobj/elf-packed-relocs-error4.s +++ b/llvm/test/tools/llvm-readobj/elf-packed-relocs-error4.s @@ -1,7 +1,7 @@  // REQUIRES: x86-registered-target  // RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | not llvm-readobj -r - 2>&1 | FileCheck %s -// CHECK: error: malformed sleb128, extends past end +// CHECK: error: '<stdin>': malformed sleb128, extends past end  .section .rela.dyn, "a", @0x60000001  .ascii "APS2" diff --git a/llvm/test/tools/llvm-readobj/elf-packed-relocs-error5.s b/llvm/test/tools/llvm-readobj/elf-packed-relocs-error5.s index 1c2eb890ac6..db2b0511478 100644 --- a/llvm/test/tools/llvm-readobj/elf-packed-relocs-error5.s +++ b/llvm/test/tools/llvm-readobj/elf-packed-relocs-error5.s @@ -1,7 +1,7 @@  // REQUIRES: x86-registered-target  // RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | not llvm-readobj -r - 2>&1 | FileCheck %s -// CHECK: error: relocation group unexpectedly large +// CHECK: error: '<stdin>': relocation group unexpectedly large  .section .rela.dyn, "a", @0x60000001  .ascii "APS2" diff --git a/llvm/test/tools/yaml2obj/elf-sht-symtab-shndx.yaml b/llvm/test/tools/yaml2obj/elf-sht-symtab-shndx.yaml index c8d86b1ed2f..6e20912d76d 100644 --- a/llvm/test/tools/yaml2obj/elf-sht-symtab-shndx.yaml +++ b/llvm/test/tools/yaml2obj/elf-sht-symtab-shndx.yaml @@ -3,9 +3,9 @@  ## but no SHT_SYMTAB_SHNDX section is defined.  # RUN: yaml2obj --docnum=1 %s -o %t1 -# RUN: not llvm-readobj --symbols 2>&1 %t1 | FileCheck %s --check-prefix=CASE1 +# RUN: not llvm-readobj --symbols 2>&1 %t1 | FileCheck -DFILE=%t1 %s --check-prefix=CASE1 -# CASE1: error: extended symbol index (1) is past the end of the SHT_SYMTAB_SHNDX section of size 0 +# CASE1: error: '[[FILE]]': extended symbol index (1) is past the end of the SHT_SYMTAB_SHNDX section of size 0  --- !ELF  FileHeader: @@ -71,9 +71,9 @@ Symbols:  ## which is larger than the total number of sections in the file).  # RUN: yaml2obj --docnum=3 %s -o %t3 -# RUN: not llvm-readobj --symbols 2>&1 %t3 | FileCheck %s --check-prefix=CASE3 +# RUN: not llvm-readobj --symbols 2>&1 %t3 | FileCheck %s -DFILE=%t3 --check-prefix=CASE3 -# CASE3: error: invalid section index: 255 +# CASE3: error: '[[FILE]]': invalid section index: 255  --- !ELF  FileHeader: diff --git a/llvm/tools/llvm-readobj/ARMEHABIPrinter.h b/llvm/tools/llvm-readobj/ARMEHABIPrinter.h index 11f9d6166a5..df05f272d39 100644 --- a/llvm/tools/llvm-readobj/ARMEHABIPrinter.h +++ b/llvm/tools/llvm-readobj/ARMEHABIPrinter.h @@ -329,6 +329,7 @@ class PrinterContext {    ScopedPrinter &SW;    const object::ELFFile<ET> *ELF; +  StringRef FileName;    const Elf_Shdr *Symtab;    ArrayRef<Elf_Word> ShndxTable; @@ -352,8 +353,8 @@ class PrinterContext {  public:    PrinterContext(ScopedPrinter &SW, const object::ELFFile<ET> *ELF, -                 const Elf_Shdr *Symtab) -      : SW(SW), ELF(ELF), Symtab(Symtab) {} +                 StringRef FileName, const Elf_Shdr *Symtab) +      : SW(SW), ELF(ELF), FileName(FileName), Symtab(Symtab) {}    void PrintUnwindInformation() const;  }; @@ -372,7 +373,7 @@ PrinterContext<ET>::FunctionAtAddress(unsigned Section,      error(StrTableOrErr.takeError());    StringRef StrTable = *StrTableOrErr; -  for (const Elf_Sym &Sym : unwrapOrError(ELF->symbols(Symtab))) +  for (const Elf_Sym &Sym : unwrapOrError(FileName, ELF->symbols(Symtab)))      if (Sym.st_shndx == Section && Sym.st_value == Address &&          Sym.getType() == ELF::STT_FUNC) {        auto NameOrErr = Sym.getName(StrTable); @@ -398,7 +399,7 @@ PrinterContext<ET>::FindExceptionTable(unsigned IndexSectionIndex,    /// handling table.  Use this symbol to recover the actual exception handling    /// table. -  for (const Elf_Shdr &Sec : unwrapOrError(ELF->sections())) { +  for (const Elf_Shdr &Sec : unwrapOrError(FileName, ELF->sections())) {      if (Sec.sh_type != ELF::SHT_REL || Sec.sh_info != IndexSectionIndex)        continue; @@ -407,7 +408,7 @@ PrinterContext<ET>::FindExceptionTable(unsigned IndexSectionIndex,        error(SymTabOrErr.takeError());      const Elf_Shdr *SymTab = *SymTabOrErr; -    for (const Elf_Rel &R : unwrapOrError(ELF->rels(&Sec))) { +    for (const Elf_Rel &R : unwrapOrError(FileName, ELF->rels(&Sec))) {        if (R.r_offset != static_cast<unsigned>(IndexTableOffset))          continue; @@ -417,7 +418,7 @@ PrinterContext<ET>::FindExceptionTable(unsigned IndexSectionIndex,        RelA.r_addend = 0;        const Elf_Sym *Symbol = -          unwrapOrError(ELF->getRelocationSymbol(&RelA, SymTab)); +          unwrapOrError(FileName, ELF->getRelocationSymbol(&RelA, SymTab));        auto Ret = ELF->getSection(Symbol, SymTab, ShndxTable);        if (!Ret) @@ -570,7 +571,7 @@ void PrinterContext<ET>::PrintUnwindInformation() const {    DictScope UI(SW, "UnwindInformation");    int SectionIndex = 0; -  for (const Elf_Shdr &Sec : unwrapOrError(ELF->sections())) { +  for (const Elf_Shdr &Sec : unwrapOrError(FileName, ELF->sections())) {      if (Sec.sh_type == ELF::SHT_ARM_EXIDX) {        DictScope UIT(SW, "UnwindIndexTable"); diff --git a/llvm/tools/llvm-readobj/COFFDumper.cpp b/llvm/tools/llvm-readobj/COFFDumper.cpp index 3f61edcb97c..9b949f1c83c 100644 --- a/llvm/tools/llvm-readobj/COFFDumper.cpp +++ b/llvm/tools/llvm-readobj/COFFDumper.cpp @@ -937,7 +937,8 @@ void COFFDumper::initializeFileAndStringTables(BinaryStreamReader &Reader) {  void COFFDumper::printCodeViewSymbolSection(StringRef SectionName,                                              const SectionRef &Section) { -  StringRef SectionContents = unwrapOrError(Section.getContents()); +  StringRef SectionContents = +      unwrapOrError(Obj->getFileName(), Section.getContents());    StringRef Data = SectionContents;    SmallVector<StringRef, 10> FunctionNames; @@ -1226,7 +1227,7 @@ void COFFDumper::mergeCodeViewTypes(MergingTypeTableBuilder &CVIDs,      StringRef SectionName;      error(S.getName(SectionName));      if (SectionName == ".debug$T") { -      StringRef Data = unwrapOrError(S.getContents()); +      StringRef Data = unwrapOrError(Obj->getFileName(), S.getContents());        uint32_t Magic;        error(consume(Data, Magic));        if (Magic != 4) @@ -1262,7 +1263,7 @@ void COFFDumper::printCodeViewTypeSection(StringRef SectionName,    ListScope D(W, "CodeViewTypes");    W.printNumber("Section", SectionName, Obj->getSectionID(Section)); -  StringRef Data = unwrapOrError(Section.getContents()); +  StringRef Data = unwrapOrError(Obj->getFileName(), Section.getContents());    if (opts::CodeViewSubsectionBytes)      W.printBinaryBlock("Data", Data); @@ -1322,7 +1323,7 @@ void COFFDumper::printSectionHeaders() {      if (opts::SectionData &&          !(Section->Characteristics & COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA)) { -      StringRef Data = unwrapOrError(Sec.getContents()); +      StringRef Data = unwrapOrError(Obj->getFileName(), Sec.getContents());        W.printBinaryBlock("SectionData", Data);      }    } @@ -1670,7 +1671,8 @@ void COFFDumper::printCOFFDirectives() {      if (Name != ".drectve")        continue; -    StringRef Contents = unwrapOrError(Section.getContents()); +    StringRef Contents = +        unwrapOrError(Obj->getFileName(), Section.getContents());      W.printString("Directive(s)", Contents);    }  } @@ -1709,11 +1711,11 @@ void COFFDumper::printCOFFResources() {      if (!Name.startswith(".rsrc"))        continue; -    StringRef Ref = unwrapOrError(S.getContents()); +    StringRef Ref = unwrapOrError(Obj->getFileName(), S.getContents());      if ((Name == ".rsrc") || (Name == ".rsrc$01")) {        ResourceSectionRef RSF(Ref); -      auto &BaseTable = unwrapOrError(RSF.getBaseTable()); +      auto &BaseTable = unwrapOrError(Obj->getFileName(), RSF.getBaseTable());        W.printNumber("Total Number of Resources",                      countTotalTableEntries(RSF, BaseTable, "Type"));        W.printHex("Base Table Address", @@ -1741,7 +1743,8 @@ COFFDumper::countTotalTableEntries(ResourceSectionRef RSF,          NextLevel = "Language";        else          NextLevel = "Name"; -      auto &NextTable = unwrapOrError(RSF.getEntrySubDir(Entry)); +      auto &NextTable = +          unwrapOrError(Obj->getFileName(), RSF.getEntrySubDir(Entry));        TotalEntries += countTotalTableEntries(RSF, NextTable, NextLevel);      } else {        TotalEntries += 1; @@ -1767,7 +1770,7 @@ void COFFDumper::printResourceDirectoryTable(      raw_svector_ostream OS(IDStr);      if (i < Table.NumberOfNameEntries) {        ArrayRef<UTF16> RawEntryNameString = -          unwrapOrError(RSF.getEntryNameString(Entry)); +          unwrapOrError(Obj->getFileName(), RSF.getEntryNameString(Entry));        std::vector<UTF16> EndianCorrectedNameString;        if (llvm::sys::IsBigEndianHost) {          EndianCorrectedNameString.resize(RawEntryNameString.size() + 1); @@ -1799,7 +1802,8 @@ void COFFDumper::printResourceDirectoryTable(          NextLevel = "Language";        else          NextLevel = "Name"; -      auto &NextTable = unwrapOrError(RSF.getEntrySubDir(Entry)); +      auto &NextTable = +          unwrapOrError(Obj->getFileName(), RSF.getEntrySubDir(Entry));        printResourceDirectoryTable(RSF, NextTable, NextLevel);      } else {        W.printHex("Entry Offset", Entry.Offset.value()); @@ -1837,7 +1841,8 @@ void COFFDumper::printStackMap() const {    if (StackMapSection == object::SectionRef())      return; -  StringRef StackMapContents = unwrapOrError(StackMapSection.getContents()); +  StringRef StackMapContents = +      unwrapOrError(Obj->getFileName(), StackMapSection.getContents());    ArrayRef<uint8_t> StackMapContentsArray =        arrayRefFromStringRef(StackMapContents); @@ -1863,7 +1868,8 @@ void COFFDumper::printAddrsig() {    if (AddrsigSection == object::SectionRef())      return; -  StringRef AddrsigContents = unwrapOrError(AddrsigSection.getContents()); +  StringRef AddrsigContents = +      unwrapOrError(Obj->getFileName(), AddrsigSection.getContents());    ArrayRef<uint8_t> AddrsigContentsArray(AddrsigContents.bytes_begin(),                                           AddrsigContents.size()); diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp index aa6bb41088a..afff087b766 100644 --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/llvm/tools/llvm-readobj/ELFDumper.cpp @@ -333,9 +333,11 @@ void ELFDumper<ELFT>::printSymbolsHelper(bool IsDynamic) const {    } else {      if (!DotSymtabSec)        return; -    StrTable = unwrapOrError(Obj->getStringTableForSymtab(*DotSymtabSec)); -    Syms = unwrapOrError(Obj->symbols(DotSymtabSec)); -    SymtabName = unwrapOrError(Obj->getSectionName(DotSymtabSec)); +    StrTable = unwrapOrError(ObjF->getFileName(), +                             Obj->getStringTableForSymtab(*DotSymtabSec)); +    Syms = unwrapOrError(ObjF->getFileName(), Obj->symbols(DotSymtabSec)); +    SymtabName = +        unwrapOrError(ObjF->getFileName(), Obj->getSectionName(DotSymtabSec));      Entries = DotSymtabSec->getEntityCount();    }    if (Syms.begin() == Syms.end()) @@ -354,10 +356,11 @@ public:    using Elf_Addr = typename ELFT::Addr;    DumpStyle(ELFDumper<ELFT> *Dumper) : Dumper(Dumper) { +    FileName = this->Dumper->getElfObject()->getFileName(); +      // Dumper reports all non-critical errors as warnings.      // It does not print the same warning more than once.      WarningHandler = [this](const Twine &Msg) { -      StringRef FileName = this->Dumper->getElfObject()->getFileName();        if (Warnings.insert(Msg.str()).second)          reportWarning(FileName, createError(Msg));        return Error::success(); @@ -414,6 +417,7 @@ public:  protected:    std::function<Error(const Twine &Msg)> WarningHandler; +  StringRef FileName;  private:    std::unordered_set<std::string> Warnings; @@ -718,9 +722,9 @@ StringRef ELFDumper<ELFT>::getSymbolVersion(StringRef StrTab,                         sizeof(Elf_Sym);    // Get the corresponding version index entry. -  const Elf_Versym *Versym = -      unwrapOrError(ObjF->getELFFile()->template getEntry<Elf_Versym>( -          SymbolVersionSection, EntryIndex)); +  const Elf_Versym *Versym = unwrapOrError( +      ObjF->getFileName(), ObjF->getELFFile()->template getEntry<Elf_Versym>( +                               SymbolVersionSection, EntryIndex));    return this->getSymbolVersionByIndex(StrTab, Versym->vs_index, IsDefault);  } @@ -731,13 +735,15 @@ static std::string maybeDemangle(StringRef Name) {  template <typename ELFT>  std::string ELFDumper<ELFT>::getStaticSymbolName(uint32_t Index) const {    const ELFFile<ELFT> *Obj = ObjF->getELFFile(); -  StringRef StrTable = -      unwrapOrError(Obj->getStringTableForSymtab(*DotSymtabSec)); -  Elf_Sym_Range Syms = unwrapOrError(Obj->symbols(DotSymtabSec)); +  StringRef StrTable = unwrapOrError( +      ObjF->getFileName(), Obj->getStringTableForSymtab(*DotSymtabSec)); +  Elf_Sym_Range Syms = +      unwrapOrError(ObjF->getFileName(), Obj->symbols(DotSymtabSec));    if (Index >= Syms.size())      reportError("Invalid symbol index");    const Elf_Sym *Sym = &Syms[Index]; -  return maybeDemangle(unwrapOrError(Sym->getName(StrTable))); +  return maybeDemangle( +      unwrapOrError(ObjF->getFileName(), Sym->getName(StrTable)));  }  template <typename ELFT> @@ -777,14 +783,14 @@ template <typename ELFT>  std::string ELFDumper<ELFT>::getFullSymbolName(const Elf_Sym *Symbol,                                                 StringRef StrTable,                                                 bool IsDynamic) const { -  std::string SymbolName = -      maybeDemangle(unwrapOrError(Symbol->getName(StrTable))); +  std::string SymbolName = maybeDemangle( +      unwrapOrError(ObjF->getFileName(), Symbol->getName(StrTable)));    if (SymbolName.empty() && Symbol->getType() == ELF::STT_SECTION) {      unsigned SectionIndex;      StringRef SectionName; -    Elf_Sym_Range Syms = -        unwrapOrError(ObjF->getELFFile()->symbols(DotSymtabSec)); +    Elf_Sym_Range Syms = unwrapOrError( +        ObjF->getFileName(), ObjF->getELFFile()->symbols(DotSymtabSec));      getSectionNameIndex(Symbol, Syms.begin(), SectionName, SectionIndex);      return SectionName;    } @@ -821,31 +827,32 @@ void ELFDumper<ELFT>::getSectionNameIndex(const Elf_Sym *Symbol,      SectionName = "Reserved";    else {      if (SectionIndex == SHN_XINDEX) -      SectionIndex = unwrapOrError(object::getExtendedSymbolTableIndex<ELFT>( -          Symbol, FirstSym, ShndxTable)); +      SectionIndex = unwrapOrError(ObjF->getFileName(), +                                   object::getExtendedSymbolTableIndex<ELFT>( +                                       Symbol, FirstSym, ShndxTable));      const ELFFile<ELFT> *Obj = ObjF->getELFFile();      const typename ELFT::Shdr *Sec = -        unwrapOrError(Obj->getSection(SectionIndex)); -    SectionName = unwrapOrError(Obj->getSectionName(Sec)); +        unwrapOrError(ObjF->getFileName(), Obj->getSection(SectionIndex)); +    SectionName = unwrapOrError(ObjF->getFileName(), Obj->getSectionName(Sec));    }  }  template <class ELFO>  static const typename ELFO::Elf_Shdr * -findNotEmptySectionByAddress(const ELFO *Obj, uint64_t Addr) { -  for (const auto &Shdr : unwrapOrError(Obj->sections())) +findNotEmptySectionByAddress(const ELFO *Obj, StringRef FileName, +                             uint64_t Addr) { +  for (const auto &Shdr : unwrapOrError(FileName, Obj->sections()))      if (Shdr.sh_addr == Addr && Shdr.sh_size > 0)        return &Shdr;    return nullptr;  }  template <class ELFO> -static const typename ELFO::Elf_Shdr *findSectionByName(const ELFO &Obj, -                                                        StringRef Name) { -  for (const auto &Shdr : unwrapOrError(Obj.sections())) { -    if (Name == unwrapOrError(Obj.getSectionName(&Shdr))) +static const typename ELFO::Elf_Shdr * +findSectionByName(const ELFO &Obj, StringRef FileName, StringRef Name) { +  for (const auto &Shdr : unwrapOrError(FileName, Obj.sections())) +    if (Name == unwrapOrError(FileName, Obj.getSectionName(&Shdr)))        return &Shdr; -  }    return nullptr;  } @@ -1397,7 +1404,8 @@ template <typename ELFT>  void ELFDumper<ELFT>::loadDynamicTable(const ELFFile<ELFT> *Obj) {    // Try to locate the PT_DYNAMIC header.    const Elf_Phdr *DynamicPhdr = nullptr; -  for (const Elf_Phdr &Phdr : unwrapOrError(Obj->program_headers())) { +  for (const Elf_Phdr &Phdr : +       unwrapOrError(ObjF->getFileName(), Obj->program_headers())) {      if (Phdr.p_type != ELF::PT_DYNAMIC)        continue;      DynamicPhdr = &Phdr; @@ -1406,7 +1414,8 @@ void ELFDumper<ELFT>::loadDynamicTable(const ELFFile<ELFT> *Obj) {    // Try to locate the .dynamic section in the sections header table.    const Elf_Shdr *DynamicSec = nullptr; -  for (const Elf_Shdr &Sec : unwrapOrError(Obj->sections())) { +  for (const Elf_Shdr &Sec : +       unwrapOrError(ObjF->getFileName(), Obj->sections())) {      if (Sec.sh_type != ELF::SHT_DYNAMIC)        continue;      DynamicSec = &Sec; @@ -1440,7 +1449,8 @@ void ELFDumper<ELFT>::loadDynamicTable(const ELFFile<ELFT> *Obj) {      return;    } -  StringRef Name = unwrapOrError(Obj->getSectionName(DynamicSec)); +  StringRef Name = +      unwrapOrError(ObjF->getFileName(), Obj->getSectionName(DynamicSec));    if (DynamicSec->sh_addr + DynamicSec->sh_size >            DynamicPhdr->p_vaddr + DynamicPhdr->p_memsz ||        DynamicSec->sh_addr < DynamicPhdr->p_vaddr) @@ -1460,7 +1470,8 @@ ELFDumper<ELFT>::ELFDumper(const object::ELFObjectFile<ELFT> *ObjF,      : ObjDumper(Writer), ObjF(ObjF) {    const ELFFile<ELFT> *Obj = ObjF->getELFFile(); -  for (const Elf_Shdr &Sec : unwrapOrError(Obj->sections())) { +  for (const Elf_Shdr &Sec : +       unwrapOrError(ObjF->getFileName(), Obj->sections())) {      switch (Sec.sh_type) {      case ELF::SHT_SYMTAB:        if (!DotSymtabSec) @@ -1471,7 +1482,8 @@ ELFDumper<ELFT>::ELFDumper(const object::ELFObjectFile<ELFT> *ObjF,          DynSymRegion = createDRIFrom(&Sec);          // This is only used (if Elf_Shdr present)for naming section in GNU          // style -        DynSymtabName = unwrapOrError(Obj->getSectionName(&Sec)); +        DynSymtabName = +            unwrapOrError(ObjF->getFileName(), Obj->getSectionName(&Sec));          if (Expected<StringRef> E = Obj->getStringTableForSymtab(Sec))            DynamicStringTable = *E; @@ -1480,7 +1492,7 @@ ELFDumper<ELFT>::ELFDumper(const object::ELFObjectFile<ELFT> *ObjF,        }        break;      case ELF::SHT_SYMTAB_SHNDX: -      ShndxTable = unwrapOrError(Obj->getSHNDXTable(Sec)); +      ShndxTable = unwrapOrError(ObjF->getFileName(), Obj->getSHNDXTable(Sec));        break;      case ELF::SHT_GNU_versym:        if (!SymbolVersionSection) @@ -2029,7 +2041,8 @@ template <> void ELFDumper<ELF32LE>::printUnwindInfo() {    const ELFFile<ELF32LE> *Obj = ObjF->getELFFile();    const unsigned Machine = Obj->getHeader()->e_machine;    if (Machine == EM_ARM) { -    ARM::EHABI::PrinterContext<ELF32LE> Ctx(W, Obj, DotSymtabSec); +    ARM::EHABI::PrinterContext<ELF32LE> Ctx(W, Obj, ObjF->getFileName(), +                                            DotSymtabSec);      Ctx.PrintUnwindInformation();    }    DwarfCFIEH::PrinterContext<ELF32LE> Ctx(W, ObjF); @@ -2101,11 +2114,13 @@ template <> void ELFDumper<ELF32LE>::printAttributes() {    }    DictScope BA(W, "BuildAttributes"); -  for (const ELFO::Elf_Shdr &Sec : unwrapOrError(Obj->sections())) { +  for (const ELFO::Elf_Shdr &Sec : +       unwrapOrError(ObjF->getFileName(), Obj->sections())) {      if (Sec.sh_type != ELF::SHT_ARM_ATTRIBUTES)        continue; -    ArrayRef<uint8_t> Contents = unwrapOrError(Obj->getSectionContents(&Sec)); +    ArrayRef<uint8_t> Contents = +        unwrapOrError(ObjF->getFileName(), Obj->getSectionContents(&Sec));      if (Contents[0] != ARMBuildAttrs::Format_Version) {        errs() << "unrecognised FormatVersion: 0x"               << Twine::utohexstr(Contents[0]) << '\n'; @@ -2129,7 +2144,8 @@ public:    const bool IsStatic;    const ELFO * const Obj; -  MipsGOTParser(const ELFO *Obj, Elf_Dyn_Range DynTable, Elf_Sym_Range DynSyms); +  MipsGOTParser(const ELFO *Obj, StringRef FileName, Elf_Dyn_Range DynTable, +                Elf_Sym_Range DynSyms);    bool hasGot() const { return !GotEntries.empty(); }    bool hasPlt() const { return !PltEntries.empty(); } @@ -2163,6 +2179,8 @@ private:    const Elf_Shdr *PltSec;    const Elf_Shdr *PltRelSec;    const Elf_Shdr *PltSymTable; +  StringRef FileName; +    Elf_Sym_Range GotDynSyms;    StringRef PltStrTable; @@ -2173,21 +2191,24 @@ private:  } // end anonymous namespace  template <class ELFT> -MipsGOTParser<ELFT>::MipsGOTParser(const ELFO *Obj, Elf_Dyn_Range DynTable, +MipsGOTParser<ELFT>::MipsGOTParser(const ELFO *Obj, StringRef FileName, +                                   Elf_Dyn_Range DynTable,                                     Elf_Sym_Range DynSyms)      : IsStatic(DynTable.empty()), Obj(Obj), GotSec(nullptr), LocalNum(0), -      GlobalNum(0), PltSec(nullptr), PltRelSec(nullptr), PltSymTable(nullptr) { +      GlobalNum(0), PltSec(nullptr), PltRelSec(nullptr), PltSymTable(nullptr), +      FileName(FileName) {    // See "Global Offset Table" in Chapter 5 in the following document    // for detailed GOT description.    // ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf    // Find static GOT secton.    if (IsStatic) { -    GotSec = findSectionByName(*Obj, ".got"); +    GotSec = findSectionByName(*Obj, FileName, ".got");      if (!GotSec)        reportError("Cannot find .got section"); -    ArrayRef<uint8_t> Content = unwrapOrError(Obj->getSectionContents(GotSec)); +    ArrayRef<uint8_t> Content = +        unwrapOrError(FileName, Obj->getSectionContents(GotSec));      GotEntries = Entries(reinterpret_cast<const Entry *>(Content.data()),                           Content.size() / sizeof(Entry));      LocalNum = GotEntries.size(); @@ -2233,7 +2254,7 @@ MipsGOTParser<ELFT>::MipsGOTParser(const ELFO *Obj, Elf_Dyn_Range DynTable,      if (*DtGotSym > DynSymTotal)        reportError("MIPS_GOTSYM exceeds a number of dynamic symbols"); -    GotSec = findNotEmptySectionByAddress(Obj, *DtPltGot); +    GotSec = findNotEmptySectionByAddress(Obj, FileName, *DtPltGot);      if (!GotSec)        reportError("There is no not empty GOT section at 0x" +                    Twine::utohexstr(*DtPltGot)); @@ -2241,7 +2262,8 @@ MipsGOTParser<ELFT>::MipsGOTParser(const ELFO *Obj, Elf_Dyn_Range DynTable,      LocalNum = *DtLocalGotNum;      GlobalNum = DynSymTotal - *DtGotSym; -    ArrayRef<uint8_t> Content = unwrapOrError(Obj->getSectionContents(GotSec)); +    ArrayRef<uint8_t> Content = +        unwrapOrError(FileName, Obj->getSectionContents(GotSec));      GotEntries = Entries(reinterpret_cast<const Entry *>(Content.data()),                           Content.size() / sizeof(Entry));      GotDynSyms = DynSyms.drop_front(*DtGotSym); @@ -2254,23 +2276,24 @@ MipsGOTParser<ELFT>::MipsGOTParser(const ELFO *Obj, Elf_Dyn_Range DynTable,      if (!DtJmpRel)        report_fatal_error("Cannot find JMPREL dynamic table tag."); -    PltSec = findNotEmptySectionByAddress(Obj, *DtMipsPltGot); +    PltSec = findNotEmptySectionByAddress(Obj, FileName, * DtMipsPltGot);      if (!PltSec)        report_fatal_error("There is no not empty PLTGOT section at 0x " +                           Twine::utohexstr(*DtMipsPltGot)); -    PltRelSec = findNotEmptySectionByAddress(Obj, *DtJmpRel); +    PltRelSec = findNotEmptySectionByAddress(Obj, FileName, * DtJmpRel);      if (!PltRelSec)        report_fatal_error("There is no not empty RELPLT section at 0x" +                           Twine::utohexstr(*DtJmpRel));      ArrayRef<uint8_t> PltContent = -        unwrapOrError(Obj->getSectionContents(PltSec)); +        unwrapOrError(FileName, Obj->getSectionContents(PltSec));      PltEntries = Entries(reinterpret_cast<const Entry *>(PltContent.data()),                           PltContent.size() / sizeof(Entry)); -    PltSymTable = unwrapOrError(Obj->getSection(PltRelSec->sh_link)); -    PltStrTable = unwrapOrError(Obj->getStringTableForSymtab(*PltSymTable)); +    PltSymTable = unwrapOrError(FileName, Obj->getSection(PltRelSec->sh_link)); +    PltStrTable = +        unwrapOrError(FileName, Obj->getStringTableForSymtab(*PltSymTable));    }  } @@ -2371,11 +2394,13 @@ const typename MipsGOTParser<ELFT>::Elf_Sym *  MipsGOTParser<ELFT>::getPltSym(const Entry *E) const {    int64_t Offset = std::distance(getPltEntries().data(), E);    if (PltRelSec->sh_type == ELF::SHT_REL) { -    Elf_Rel_Range Rels = unwrapOrError(Obj->rels(PltRelSec)); -    return unwrapOrError(Obj->getRelocationSymbol(&Rels[Offset], PltSymTable)); +    Elf_Rel_Range Rels = unwrapOrError(FileName, Obj->rels(PltRelSec)); +    return unwrapOrError(FileName, +                         Obj->getRelocationSymbol(&Rels[Offset], PltSymTable));    } else { -    Elf_Rela_Range Rels = unwrapOrError(Obj->relas(PltRelSec)); -    return unwrapOrError(Obj->getRelocationSymbol(&Rels[Offset], PltSymTable)); +    Elf_Rela_Range Rels = unwrapOrError(FileName, Obj->relas(PltRelSec)); +    return unwrapOrError(FileName, +                         Obj->getRelocationSymbol(&Rels[Offset], PltSymTable));    }  } @@ -2384,7 +2409,8 @@ template <class ELFT> void ELFDumper<ELFT>::printMipsPLTGOT() {    if (Obj->getHeader()->e_machine != EM_MIPS)      reportError("MIPS PLT GOT is available for MIPS targets only"); -  MipsGOTParser<ELFT> Parser(Obj, dynamic_table(), dynamic_symbols()); +  MipsGOTParser<ELFT> Parser(Obj, ObjF->getFileName(), dynamic_table(), +                             dynamic_symbols());    if (Parser.hasGot())      ELFDumperStyle->printMipsGOT(Parser);    if (Parser.hasPlt()) @@ -2466,12 +2492,14 @@ static int getMipsRegisterSize(uint8_t Flag) {  template <class ELFT> void ELFDumper<ELFT>::printMipsABIFlags() {    const ELFFile<ELFT> *Obj = ObjF->getELFFile(); -  const Elf_Shdr *Shdr = findSectionByName(*Obj, ".MIPS.abiflags"); +  const Elf_Shdr *Shdr = +      findSectionByName(*Obj, ObjF->getFileName(), ".MIPS.abiflags");    if (!Shdr) {      W.startLine() << "There is no .MIPS.abiflags section in the file.\n";      return;    } -  ArrayRef<uint8_t> Sec = unwrapOrError(Obj->getSectionContents(Shdr)); +  ArrayRef<uint8_t> Sec = +      unwrapOrError(ObjF->getFileName(), Obj->getSectionContents(Shdr));    if (Sec.size() != sizeof(Elf_Mips_ABIFlags<ELFT>)) {      W.startLine() << "The .MIPS.abiflags section has a wrong size.\n";      return; @@ -2512,12 +2540,13 @@ static void printMipsReginfoData(ScopedPrinter &W,  template <class ELFT> void ELFDumper<ELFT>::printMipsReginfo() {    const ELFFile<ELFT> *Obj = ObjF->getELFFile(); -  const Elf_Shdr *Shdr = findSectionByName(*Obj, ".reginfo"); +  const Elf_Shdr *Shdr = findSectionByName(*Obj, ObjF->getFileName(), ".reginfo");    if (!Shdr) {      W.startLine() << "There is no .reginfo section in the file.\n";      return;    } -  ArrayRef<uint8_t> Sec = unwrapOrError(Obj->getSectionContents(Shdr)); +  ArrayRef<uint8_t> Sec = +      unwrapOrError(ObjF->getFileName(), Obj->getSectionContents(Shdr));    if (Sec.size() != sizeof(Elf_Mips_RegInfo<ELFT>)) {      W.startLine() << "The .reginfo section has a wrong size.\n";      return; @@ -2530,7 +2559,8 @@ template <class ELFT> void ELFDumper<ELFT>::printMipsReginfo() {  template <class ELFT> void ELFDumper<ELFT>::printMipsOptions() {    const ELFFile<ELFT> *Obj = ObjF->getELFFile(); -  const Elf_Shdr *Shdr = findSectionByName(*Obj, ".MIPS.options"); +  const Elf_Shdr *Shdr = +      findSectionByName(*Obj, ObjF->getFileName(), ".MIPS.options");    if (!Shdr) {      W.startLine() << "There is no .MIPS.options section in the file.\n";      return; @@ -2538,7 +2568,8 @@ template <class ELFT> void ELFDumper<ELFT>::printMipsOptions() {    DictScope GS(W, "MIPS Options"); -  ArrayRef<uint8_t> Sec = unwrapOrError(Obj->getSectionContents(Shdr)); +  ArrayRef<uint8_t> Sec = +      unwrapOrError(ObjF->getFileName(), Obj->getSectionContents(Shdr));    while (!Sec.empty()) {      if (Sec.size() < sizeof(Elf_Mips_Options<ELFT>)) {        W.startLine() << "The .MIPS.options section has a wrong size.\n"; @@ -2561,8 +2592,9 @@ template <class ELFT> void ELFDumper<ELFT>::printMipsOptions() {  template <class ELFT> void ELFDumper<ELFT>::printStackMap() const {    const ELFFile<ELFT> *Obj = ObjF->getELFFile();    const Elf_Shdr *StackMapSection = nullptr; -  for (const auto &Sec : unwrapOrError(Obj->sections())) { -    StringRef Name = unwrapOrError(Obj->getSectionName(&Sec)); +  for (const auto &Sec : unwrapOrError(ObjF->getFileName(), Obj->sections())) { +    StringRef Name = +        unwrapOrError(ObjF->getFileName(), Obj->getSectionName(&Sec));      if (Name == ".llvm_stackmaps") {        StackMapSection = &Sec;        break; @@ -2572,8 +2604,8 @@ template <class ELFT> void ELFDumper<ELFT>::printStackMap() const {    if (!StackMapSection)      return; -  ArrayRef<uint8_t> StackMapContentsArray = -      unwrapOrError(Obj->getSectionContents(StackMapSection)); +  ArrayRef<uint8_t> StackMapContentsArray = unwrapOrError( +      ObjF->getFileName(), Obj->getSectionContents(StackMapSection));    prettyPrintStackMap(        W, StackMapParser<ELFT::TargetEndianness>(StackMapContentsArray)); @@ -2597,24 +2629,26 @@ static inline void printFields(formatted_raw_ostream &OS, StringRef Str1,  }  template <class ELFT> -static std::string getSectionHeadersNumString(const ELFFile<ELFT> *Obj) { +static std::string getSectionHeadersNumString(const ELFFile<ELFT> *Obj, +                                              StringRef FileName) {    const typename ELFT::Ehdr *ElfHeader = Obj->getHeader();    if (ElfHeader->e_shnum != 0)      return to_string(ElfHeader->e_shnum); -  ArrayRef<typename ELFT::Shdr> Arr = unwrapOrError(Obj->sections()); +  ArrayRef<typename ELFT::Shdr> Arr = unwrapOrError(FileName, Obj->sections());    if (Arr.empty())      return "0";    return "0 (" + to_string(Arr[0].sh_size) + ")";  }  template <class ELFT> -static std::string getSectionHeaderTableIndexString(const ELFFile<ELFT> *Obj) { +static std::string getSectionHeaderTableIndexString(const ELFFile<ELFT> *Obj, +                                                    StringRef FileName) {    const typename ELFT::Ehdr *ElfHeader = Obj->getHeader();    if (ElfHeader->e_shstrndx != SHN_XINDEX)      return to_string(ElfHeader->e_shstrndx); -  ArrayRef<typename ELFT::Shdr> Arr = unwrapOrError(Obj->sections()); +  ArrayRef<typename ELFT::Shdr> Arr = unwrapOrError(FileName, Obj->sections());    if (Arr.empty())      return "65535 (corrupt: out of range)";    return to_string(ElfHeader->e_shstrndx) + " (" + to_string(Arr[0].sh_link) + @@ -2676,9 +2710,9 @@ template <class ELFT> void GNUStyle<ELFT>::printFileHeaders(const ELFO *Obj) {    printFields(OS, "Number of program headers:", Str);    Str = to_string(e->e_shentsize) + " (bytes)";    printFields(OS, "Size of section headers:", Str); -  Str = getSectionHeadersNumString(Obj); +  Str = getSectionHeadersNumString(Obj, this->FileName);    printFields(OS, "Number of section headers:", Str); -  Str = getSectionHeaderTableIndexString(Obj); +  Str = getSectionHeaderTableIndexString(Obj, this->FileName);    printFields(OS, "Section header string table index:", Str);  } @@ -2700,26 +2734,29 @@ struct GroupSection {  };  template <class ELFT> -std::vector<GroupSection> getGroups(const ELFFile<ELFT> *Obj) { +std::vector<GroupSection> getGroups(const ELFFile<ELFT> *Obj, +                                    StringRef FileName) {    using Elf_Shdr = typename ELFT::Shdr;    using Elf_Sym = typename ELFT::Sym;    using Elf_Word = typename ELFT::Word;    std::vector<GroupSection> Ret;    uint64_t I = 0; -  for (const Elf_Shdr &Sec : unwrapOrError(Obj->sections())) { +  for (const Elf_Shdr &Sec : unwrapOrError(FileName, Obj->sections())) {      ++I;      if (Sec.sh_type != ELF::SHT_GROUP)        continue; -    const Elf_Shdr *Symtab = unwrapOrError(Obj->getSection(Sec.sh_link)); -    StringRef StrTable = unwrapOrError(Obj->getStringTableForSymtab(*Symtab)); -    const Elf_Sym *Sym = -        unwrapOrError(Obj->template getEntry<Elf_Sym>(Symtab, Sec.sh_info)); -    auto Data = -        unwrapOrError(Obj->template getSectionContentsAsArray<Elf_Word>(&Sec)); +    const Elf_Shdr *Symtab = +        unwrapOrError(FileName, Obj->getSection(Sec.sh_link)); +    StringRef StrTable = +        unwrapOrError(FileName, Obj->getStringTableForSymtab(*Symtab)); +    const Elf_Sym *Sym = unwrapOrError( +        FileName, Obj->template getEntry<Elf_Sym>(Symtab, Sec.sh_info)); +    auto Data = unwrapOrError( +        FileName, Obj->template getSectionContentsAsArray<Elf_Word>(&Sec)); -    StringRef Name = unwrapOrError(Obj->getSectionName(&Sec)); +    StringRef Name = unwrapOrError(FileName, Obj->getSectionName(&Sec));      StringRef Signature = StrTable.data() + Sym->st_name;      Ret.push_back({Name,                     maybeDemangle(Signature), @@ -2732,8 +2769,8 @@ std::vector<GroupSection> getGroups(const ELFFile<ELFT> *Obj) {      std::vector<GroupMember> &GM = Ret.back().Members;      for (uint32_t Ndx : Data.slice(1)) { -      auto Sec = unwrapOrError(Obj->getSection(Ndx)); -      const StringRef Name = unwrapOrError(Obj->getSectionName(Sec)); +      auto Sec = unwrapOrError(FileName, Obj->getSection(Ndx)); +      const StringRef Name = unwrapOrError(FileName, Obj->getSectionName(Sec));        GM.push_back({Name, Ndx});      }    } @@ -2752,7 +2789,7 @@ mapSectionsToGroups(ArrayRef<GroupSection> Groups) {  } // namespace  template <class ELFT> void GNUStyle<ELFT>::printGroupSections(const ELFO *Obj) { -  std::vector<GroupSection> V = getGroups<ELFT>(Obj); +  std::vector<GroupSection> V = getGroups<ELFT>(Obj, this->FileName);    DenseMap<uint64_t, const GroupSection *> Map = mapSectionsToGroups(V);    for (const GroupSection &G : V) {      OS << "\n" @@ -2782,14 +2819,17 @@ template <class ELFT> void GNUStyle<ELFT>::printGroupSections(const ELFO *Obj) {  template <class ELFT>  void GNUStyle<ELFT>::printRelocation(const ELFO *Obj, const Elf_Shdr *SymTab,                                       const Elf_Rela &R, bool IsRela) { -  const Elf_Sym *Sym = unwrapOrError(Obj->getRelocationSymbol(&R, SymTab)); +  const Elf_Sym *Sym = +      unwrapOrError(this->FileName, Obj->getRelocationSymbol(&R, SymTab));    std::string TargetName;    if (Sym && Sym->getType() == ELF::STT_SECTION) {      const Elf_Shdr *Sec = unwrapOrError( +        this->FileName,          Obj->getSection(Sym, SymTab, this->dumper()->getShndxTable())); -    TargetName = unwrapOrError(Obj->getSectionName(Sec)); +    TargetName = unwrapOrError(this->FileName, Obj->getSectionName(Sec));    } else if (Sym) { -    StringRef StrTable = unwrapOrError(Obj->getStringTableForSymtab(*SymTab)); +    StringRef StrTable = +        unwrapOrError(this->FileName, Obj->getStringTableForSymtab(*SymTab));      TargetName = this->dumper()->getFullSymbolName(          Sym, StrTable, SymTab->sh_type == SHT_DYNSYM /* IsDynamic */);    } @@ -2858,21 +2898,21 @@ template <class ELFT> void GNUStyle<ELFT>::printRelocHeader(unsigned SType) {  template <class ELFT> void GNUStyle<ELFT>::printRelocations(const ELFO *Obj) {    bool HasRelocSections = false; -  for (const Elf_Shdr &Sec : unwrapOrError(Obj->sections())) { +  for (const Elf_Shdr &Sec : unwrapOrError(this->FileName, Obj->sections())) {      if (Sec.sh_type != ELF::SHT_REL && Sec.sh_type != ELF::SHT_RELA &&          Sec.sh_type != ELF::SHT_RELR && Sec.sh_type != ELF::SHT_ANDROID_REL &&          Sec.sh_type != ELF::SHT_ANDROID_RELA &&          Sec.sh_type != ELF::SHT_ANDROID_RELR)        continue;      HasRelocSections = true; -    StringRef Name = unwrapOrError(Obj->getSectionName(&Sec)); +    StringRef Name = unwrapOrError(this->FileName, Obj->getSectionName(&Sec));      unsigned Entries = Sec.getEntityCount();      std::vector<Elf_Rela> AndroidRelas;      if (Sec.sh_type == ELF::SHT_ANDROID_REL ||          Sec.sh_type == ELF::SHT_ANDROID_RELA) {        // Android's packed relocation section needs to be unpacked first        // to get the actual number of entries. -      AndroidRelas = unwrapOrError(Obj->android_relas(&Sec)); +      AndroidRelas = unwrapOrError(this->FileName, Obj->android_relas(&Sec));        Entries = AndroidRelas.size();      }      std::vector<Elf_Rela> RelrRelas; @@ -2880,8 +2920,8 @@ template <class ELFT> void GNUStyle<ELFT>::printRelocations(const ELFO *Obj) {                             Sec.sh_type == ELF::SHT_ANDROID_RELR)) {        // .relr.dyn relative relocation section needs to be unpacked first        // to get the actual number of entries. -      Elf_Relr_Range Relrs = unwrapOrError(Obj->relrs(&Sec)); -      RelrRelas = unwrapOrError(Obj->decode_relrs(Relrs)); +      Elf_Relr_Range Relrs = unwrapOrError(this->FileName, Obj->relrs(&Sec)); +      RelrRelas = unwrapOrError(this->FileName, Obj->decode_relrs(Relrs));        Entries = RelrRelas.size();      }      uintX_t Offset = Sec.sh_offset; @@ -2889,10 +2929,11 @@ template <class ELFT> void GNUStyle<ELFT>::printRelocations(const ELFO *Obj) {         << to_hexString(Offset, false) << " contains " << Entries         << " entries:\n";      printRelocHeader(Sec.sh_type); -    const Elf_Shdr *SymTab = unwrapOrError(Obj->getSection(Sec.sh_link)); +    const Elf_Shdr *SymTab = +        unwrapOrError(this->FileName, Obj->getSection(Sec.sh_link));      switch (Sec.sh_type) {      case ELF::SHT_REL: -      for (const auto &R : unwrapOrError(Obj->rels(&Sec))) { +      for (const auto &R : unwrapOrError(this->FileName, Obj->rels(&Sec))) {          Elf_Rela Rela;          Rela.r_offset = R.r_offset;          Rela.r_info = R.r_info; @@ -2901,13 +2942,13 @@ template <class ELFT> void GNUStyle<ELFT>::printRelocations(const ELFO *Obj) {        }        break;      case ELF::SHT_RELA: -      for (const auto &R : unwrapOrError(Obj->relas(&Sec))) +      for (const auto &R : unwrapOrError(this->FileName, Obj->relas(&Sec)))          printRelocation(Obj, SymTab, R, true);        break;      case ELF::SHT_RELR:      case ELF::SHT_ANDROID_RELR:        if (opts::RawRelr) -        for (const auto &R : unwrapOrError(Obj->relrs(&Sec))) +        for (const auto &R : unwrapOrError(this->FileName, Obj->relrs(&Sec)))            OS << to_string(format_hex_no_prefix(R, ELFT::Is64Bits ? 16 : 8))               << "\n";        else @@ -3049,7 +3090,7 @@ static std::string getSectionTypeString(unsigned Arch, unsigned Type) {  template <class ELFT>  void GNUStyle<ELFT>::printSectionHeaders(const ELFO *Obj) {    unsigned Bias = ELFT::Is64Bits ? 0 : 8; -  ArrayRef<Elf_Shdr> Sections = unwrapOrError(Obj->sections()); +  ArrayRef<Elf_Shdr> Sections = unwrapOrError(this->FileName, Obj->sections());    OS << "There are " << to_string(Sections.size())       << " section headers, starting at offset "       << "0x" << to_hexString(Obj->getHeader()->e_shoff, false) << ":\n\n"; @@ -3133,10 +3174,11 @@ std::string GNUStyle<ELFT>::getSymbolSectionNdx(const ELFO *Obj,    case ELF::SHN_COMMON:      return "COM";    case ELF::SHN_XINDEX: -    return to_string( -        format_decimal(unwrapOrError(object::getExtendedSymbolTableIndex<ELFT>( -                           Symbol, FirstSym, this->dumper()->getShndxTable())), -                       3)); +    return to_string(format_decimal( +        unwrapOrError(this->FileName, +                      object::getExtendedSymbolTableIndex<ELFT>( +                          Symbol, FirstSym, this->dumper()->getShndxTable())), +        3));    default:      // Find if:      // Processor specific @@ -3398,7 +3440,8 @@ void GNUStyle<ELFT>::printProgramHeaders(const ELFO *Obj) {    unsigned Width = ELFT::Is64Bits ? 18 : 10;    unsigned SizeWidth = ELFT::Is64Bits ? 8 : 7; -  for (const auto &Phdr : unwrapOrError(Obj->program_headers())) { +  for (const auto &Phdr : +       unwrapOrError(this->FileName, Obj->program_headers())) {      Fields[0].Str = getElfPtType(Header->e_machine, Phdr.p_type);      Fields[1].Str = to_string(format_hex(Phdr.p_offset, 8));      Fields[2].Str = to_string(format_hex(Phdr.p_vaddr, Width)); @@ -3422,10 +3465,11 @@ void GNUStyle<ELFT>::printSectionMapping(const ELFO *Obj) {    OS << "\n Section to Segment mapping:\n  Segment Sections...\n";    DenseSet<const Elf_Shdr *> BelongsToSegment;    int Phnum = 0; -  for (const Elf_Phdr &Phdr : unwrapOrError(Obj->program_headers())) { +  for (const Elf_Phdr &Phdr : +       unwrapOrError(this->FileName, Obj->program_headers())) {      std::string Sections;      OS << format("   %2.2d     ", Phnum++); -    for (const Elf_Shdr &Sec : unwrapOrError(Obj->sections())) { +    for (const Elf_Shdr &Sec : unwrapOrError(this->FileName, Obj->sections())) {        // Check if each section is in a segment and then print mapping.        // readelf additionally makes sure it does not print zero sized sections        // at end of segments and for PT_DYNAMIC both start and end of section @@ -3436,7 +3480,9 @@ void GNUStyle<ELFT>::printSectionMapping(const ELFO *Obj) {        if (!TbssInNonTLS && checkTLSSections(Phdr, Sec) &&            checkoffsets(Phdr, Sec) && checkVMA(Phdr, Sec) &&            checkPTDynamic(Phdr, Sec) && (Sec.sh_type != ELF::SHT_NULL)) { -        Sections += unwrapOrError(Obj->getSectionName(&Sec)).str() + " "; +        Sections += +            unwrapOrError(this->FileName, Obj->getSectionName(&Sec)).str() + +            " ";          BelongsToSegment.insert(&Sec);        }      } @@ -3446,9 +3492,10 @@ void GNUStyle<ELFT>::printSectionMapping(const ELFO *Obj) {    // Display sections that do not belong to a segment.    std::string Sections; -  for (const Elf_Shdr &Sec : unwrapOrError(Obj->sections())) { +  for (const Elf_Shdr &Sec : unwrapOrError(this->FileName, Obj->sections())) {      if (BelongsToSegment.find(&Sec) == BelongsToSegment.end()) -      Sections += unwrapOrError(Obj->getSectionName(&Sec)).str() + ' '; +      Sections += +          unwrapOrError(this->FileName, Obj->getSectionName(&Sec)).str() + ' ';    }    if (!Sections.empty()) {      OS << "   None  " << Sections << '\n'; @@ -3461,8 +3508,8 @@ void GNUStyle<ELFT>::printDynamicRelocation(const ELFO *Obj, Elf_Rela R,                                              bool IsRela) {    uint32_t SymIndex = R.getSymbol(Obj->isMips64EL());    const Elf_Sym *Sym = this->dumper()->dynamic_symbols().begin() + SymIndex; -  std::string SymbolName = maybeDemangle( -      unwrapOrError(Sym->getName(this->dumper()->getDynamicStringTable()))); +  std::string SymbolName = maybeDemangle(unwrapOrError( +      this->FileName, Sym->getName(this->dumper()->getDynamicStringTable())));    printRelocation(Obj, Sym, SymbolName, R, IsRela);  } @@ -3536,7 +3583,8 @@ void GNUStyle<ELFT>::printDynamicRelocations(const ELFO *Obj) {         << " contains " << DynRelrRegion.Size << " bytes:\n";      printRelocHeader(ELF::SHT_REL);      Elf_Relr_Range Relrs = this->dumper()->dyn_relrs(); -    std::vector<Elf_Rela> RelrRelas = unwrapOrError(Obj->decode_relrs(Relrs)); +    std::vector<Elf_Rela> RelrRelas = +        unwrapOrError(this->FileName, Obj->decode_relrs(Relrs));      for (const Elf_Rela &Rela : RelrRelas) {        printDynamicRelocation(Obj, Rela, false);      } @@ -3568,14 +3616,15 @@ template <class ELFT>  static void printGNUVersionSectionProlog(formatted_raw_ostream &OS,                                           const Twine &Name, unsigned EntriesNum,                                           const ELFFile<ELFT> *Obj, -                                         const typename ELFT::Shdr *Sec) { -  StringRef SecName = unwrapOrError(Obj->getSectionName(Sec)); +                                         const typename ELFT::Shdr *Sec, +                                         StringRef FileName) { +  StringRef SecName = unwrapOrError(FileName, Obj->getSectionName(Sec));    OS << Name << " section '" << SecName << "' "       << "contains " << EntriesNum << " entries:\n";    const typename ELFT::Shdr *SymTab = -      unwrapOrError(Obj->getSection(Sec->sh_link)); -  StringRef SymTabName = unwrapOrError(Obj->getSectionName(SymTab)); +      unwrapOrError(FileName, Obj->getSection(Sec->sh_link)); +  StringRef SymTabName = unwrapOrError(FileName, Obj->getSectionName(SymTab));    OS << " Addr: " << format_hex_no_prefix(Sec->sh_addr, 16)       << "  Offset: " << format_hex(Sec->sh_offset, 8)       << "  Link: " << Sec->sh_link << " (" << SymTabName << ")\n"; @@ -3588,7 +3637,8 @@ void GNUStyle<ELFT>::printVersionSymbolSection(const ELFFile<ELFT> *Obj,      return;    unsigned Entries = Sec->sh_size / sizeof(Elf_Versym); -  printGNUVersionSectionProlog(OS, "Version symbols", Entries, Obj, Sec); +  printGNUVersionSectionProlog(OS, "Version symbols", Entries, Obj, Sec, +                               this->FileName);    const uint8_t *VersymBuf =        reinterpret_cast<const uint8_t *>(Obj->base() + Sec->sh_offset); @@ -3660,14 +3710,17 @@ void GNUStyle<ELFT>::printVersionDefinitionSection(const ELFFile<ELFT> *Obj,      return;    unsigned VerDefsNum = Sec->sh_info; -  printGNUVersionSectionProlog(OS, "Version definition", VerDefsNum, Obj, Sec); +  printGNUVersionSectionProlog(OS, "Version definition", VerDefsNum, Obj, Sec, +                               this->FileName); -  const Elf_Shdr *StrTabSec = unwrapOrError(Obj->getSection(Sec->sh_link)); +  const Elf_Shdr *StrTabSec = +      unwrapOrError(this->FileName, Obj->getSection(Sec->sh_link));    StringRef StringTable(        reinterpret_cast<const char *>(Obj->base() + StrTabSec->sh_offset),        (size_t)StrTabSec->sh_size); -  const uint8_t *VerdefBuf = unwrapOrError(Obj->getSectionContents(Sec)).data(); +  const uint8_t *VerdefBuf = +      unwrapOrError(this->FileName, Obj->getSectionContents(Sec)).data();    const uint8_t *Begin = VerdefBuf;    while (VerDefsNum--) { @@ -3702,11 +3755,14 @@ void GNUStyle<ELFT>::printVersionDependencySection(const ELFFile<ELFT> *Obj,      return;    unsigned VerneedNum = Sec->sh_info; -  printGNUVersionSectionProlog(OS, "Version needs", VerneedNum, Obj, Sec); +  printGNUVersionSectionProlog(OS, "Version needs", VerneedNum, Obj, Sec, +                               this->FileName); -  ArrayRef<uint8_t> SecData = unwrapOrError(Obj->getSectionContents(Sec)); +  ArrayRef<uint8_t> SecData = +      unwrapOrError(this->FileName, Obj->getSectionContents(Sec)); -  const Elf_Shdr *StrTabSec = unwrapOrError(Obj->getSection(Sec->sh_link)); +  const Elf_Shdr *StrTabSec = +      unwrapOrError(this->FileName, Obj->getSection(Sec->sh_link));    StringRef StringTable = {        reinterpret_cast<const char *>(Obj->base() + StrTabSec->sh_offset),        (size_t)StrTabSec->sh_size}; @@ -4350,7 +4406,8 @@ void GNUStyle<ELFT>::printNotes(const ELFFile<ELFT> *Obj) {    };    if (Obj->getHeader()->e_type == ELF::ET_CORE) { -    for (const auto &P : unwrapOrError(Obj->program_headers())) { +    for (const auto &P : +         unwrapOrError(this->FileName, Obj->program_headers())) {        if (P.p_type != PT_NOTE)          continue;        PrintHeader(P.p_offset, P.p_filesz); @@ -4361,7 +4418,8 @@ void GNUStyle<ELFT>::printNotes(const ELFFile<ELFT> *Obj) {          error(std::move(Err));      }    } else { -    for (const auto &S : unwrapOrError(Obj->sections())) { +    for (const auto &S : +         unwrapOrError(this->FileName, Obj->sections())) {        if (S.sh_type != SHT_NOTE)          continue;        PrintHeader(S.sh_offset, S.sh_size); @@ -4518,7 +4576,8 @@ void DumpStyle<ELFT>::printNonRelocatableStackSizes(      if (!SectionName.startswith(".stack_sizes"))        continue;      PrintHeader(); -    ArrayRef<uint8_t> Contents = unwrapOrError(EF->getSectionContents(ElfSec)); +    ArrayRef<uint8_t> Contents = +        unwrapOrError(this->FileName, EF->getSectionContents(ElfSec));      DataExtractor Data(          StringRef(reinterpret_cast<const char *>(Contents.data()),                    Contents.size()), @@ -4527,7 +4586,7 @@ void DumpStyle<ELFT>::printNonRelocatableStackSizes(      // to the section that contains the functions whose stack sizes are      // described in it.      const Elf_Shdr *FunctionELFSec = -        unwrapOrError(EF->getSection(ElfSec->sh_link)); +        unwrapOrError(this->FileName, EF->getSection(ElfSec->sh_link));      uint64_t Offset = 0;      while (Offset < Contents.size()) {        // The function address is followed by a ULEB representing the stack @@ -4611,12 +4670,13 @@ void DumpStyle<ELFT>::printRelocatableStackSizes(      const Elf_Shdr *StackSizesELFSec =          Obj->getSection(StackSizesSec.getRawDataRefImpl());      const SectionRef FunctionSec = toSectionRef<ELFT>( -        Obj, unwrapOrError(EF->getSection(StackSizesELFSec->sh_link))); +        Obj, unwrapOrError(this->FileName, +                           EF->getSection(StackSizesELFSec->sh_link)));      bool (*IsSupportedFn)(uint64_t);      RelocationResolver Resolver;      std::tie(IsSupportedFn, Resolver) = getRelocationResolver(*Obj); -    auto Contents = unwrapOrError(StackSizesSec.getContents()); +    auto Contents = unwrapOrError(this->FileName, StackSizesSec.getContents());      DataExtractor Data(          StringRef(reinterpret_cast<const char *>(Contents.data()),                    Contents.size()), @@ -4836,16 +4896,17 @@ template <class ELFT> void LLVMStyle<ELFT>::printFileHeaders(const ELFO *Obj) {      W.printNumber("ProgramHeaderEntrySize", E->e_phentsize);      W.printNumber("ProgramHeaderCount", E->e_phnum);      W.printNumber("SectionHeaderEntrySize", E->e_shentsize); -    W.printString("SectionHeaderCount", getSectionHeadersNumString(Obj)); +    W.printString("SectionHeaderCount", +                  getSectionHeadersNumString(Obj, this->FileName));      W.printString("StringTableSectionIndex", -                  getSectionHeaderTableIndexString(Obj)); +                  getSectionHeaderTableIndexString(Obj, this->FileName));    }  }  template <class ELFT>  void LLVMStyle<ELFT>::printGroupSections(const ELFO *Obj) {    DictScope Lists(W, "Groups"); -  std::vector<GroupSection> V = getGroups<ELFT>(Obj); +  std::vector<GroupSection> V = getGroups<ELFT>(Obj, this->FileName);    DenseMap<uint64_t, const GroupSection *> Map = mapSectionsToGroups(V);    for (const GroupSection &G : V) {      DictScope D(W, "Group"); @@ -4880,7 +4941,7 @@ template <class ELFT> void LLVMStyle<ELFT>::printRelocations(const ELFO *Obj) {    ListScope D(W, "Relocations");    int SectionNumber = -1; -  for (const Elf_Shdr &Sec : unwrapOrError(Obj->sections())) { +  for (const Elf_Shdr &Sec : unwrapOrError(this->FileName, Obj->sections())) {      ++SectionNumber;      if (Sec.sh_type != ELF::SHT_REL && Sec.sh_type != ELF::SHT_RELA && @@ -4889,7 +4950,7 @@ template <class ELFT> void LLVMStyle<ELFT>::printRelocations(const ELFO *Obj) {          Sec.sh_type != ELF::SHT_ANDROID_RELR)        continue; -    StringRef Name = unwrapOrError(Obj->getSectionName(&Sec)); +    StringRef Name = unwrapOrError(this->FileName, Obj->getSectionName(&Sec));      W.startLine() << "Section (" << SectionNumber << ") " << Name << " {\n";      W.indent(); @@ -4903,11 +4964,12 @@ template <class ELFT> void LLVMStyle<ELFT>::printRelocations(const ELFO *Obj) {  template <class ELFT>  void LLVMStyle<ELFT>::printRelocations(const Elf_Shdr *Sec, const ELFO *Obj) { -  const Elf_Shdr *SymTab = unwrapOrError(Obj->getSection(Sec->sh_link)); +  const Elf_Shdr *SymTab = +      unwrapOrError(this->FileName, Obj->getSection(Sec->sh_link));    switch (Sec->sh_type) {    case ELF::SHT_REL: -    for (const Elf_Rel &R : unwrapOrError(Obj->rels(Sec))) { +    for (const Elf_Rel &R : unwrapOrError(this->FileName, Obj->rels(Sec))) {        Elf_Rela Rela;        Rela.r_offset = R.r_offset;        Rela.r_info = R.r_info; @@ -4916,17 +4978,18 @@ void LLVMStyle<ELFT>::printRelocations(const Elf_Shdr *Sec, const ELFO *Obj) {      }      break;    case ELF::SHT_RELA: -    for (const Elf_Rela &R : unwrapOrError(Obj->relas(Sec))) +    for (const Elf_Rela &R : unwrapOrError(this->FileName, Obj->relas(Sec)))        printRelocation(Obj, R, SymTab);      break;    case ELF::SHT_RELR:    case ELF::SHT_ANDROID_RELR: { -    Elf_Relr_Range Relrs = unwrapOrError(Obj->relrs(Sec)); +    Elf_Relr_Range Relrs = unwrapOrError(this->FileName, Obj->relrs(Sec));      if (opts::RawRelr) {        for (const Elf_Relr &R : Relrs)          W.startLine() << W.hex(R) << "\n";      } else { -      std::vector<Elf_Rela> RelrRelas = unwrapOrError(Obj->decode_relrs(Relrs)); +      std::vector<Elf_Rela> RelrRelas = +          unwrapOrError(this->FileName, Obj->decode_relrs(Relrs));        for (const Elf_Rela &R : RelrRelas)          printRelocation(Obj, R, SymTab);      } @@ -4934,7 +4997,8 @@ void LLVMStyle<ELFT>::printRelocations(const Elf_Shdr *Sec, const ELFO *Obj) {    }    case ELF::SHT_ANDROID_REL:    case ELF::SHT_ANDROID_RELA: -    for (const Elf_Rela &R : unwrapOrError(Obj->android_relas(Sec))) +    for (const Elf_Rela &R : +         unwrapOrError(this->FileName, Obj->android_relas(Sec)))        printRelocation(Obj, R, SymTab);      break;    } @@ -4946,13 +5010,16 @@ void LLVMStyle<ELFT>::printRelocation(const ELFO *Obj, Elf_Rela Rel,    SmallString<32> RelocName;    Obj->getRelocationTypeName(Rel.getType(Obj->isMips64EL()), RelocName);    std::string TargetName; -  const Elf_Sym *Sym = unwrapOrError(Obj->getRelocationSymbol(&Rel, SymTab)); +  const Elf_Sym *Sym = +      unwrapOrError(this->FileName, Obj->getRelocationSymbol(&Rel, SymTab));    if (Sym && Sym->getType() == ELF::STT_SECTION) {      const Elf_Shdr *Sec = unwrapOrError( +        this->FileName,          Obj->getSection(Sym, SymTab, this->dumper()->getShndxTable())); -    TargetName = unwrapOrError(Obj->getSectionName(Sec)); +    TargetName = unwrapOrError(this->FileName, Obj->getSectionName(Sec));    } else if (Sym) { -    StringRef StrTable = unwrapOrError(Obj->getStringTableForSymtab(*SymTab)); +    StringRef StrTable = +        unwrapOrError(this->FileName, Obj->getStringTableForSymtab(*SymTab));      TargetName = this->dumper()->getFullSymbolName(          Sym, StrTable, SymTab->sh_type == SHT_DYNSYM /* IsDynamic */);    } @@ -4977,7 +5044,7 @@ void LLVMStyle<ELFT>::printSectionHeaders(const ELFO *Obj) {    ListScope SectionsD(W, "Sections");    int SectionIndex = -1; -  ArrayRef<Elf_Shdr> Sections = unwrapOrError(Obj->sections()); +  ArrayRef<Elf_Shdr> Sections = unwrapOrError(this->FileName, Obj->sections());    const ELFObjectFile<ELFT> *ElfObj = this->dumper()->getElfObject();    for (const Elf_Shdr &Sec : Sections) {      StringRef Name = unwrapOrError( @@ -5034,19 +5101,24 @@ void LLVMStyle<ELFT>::printSectionHeaders(const ELFO *Obj) {      if (opts::SectionSymbols) {        ListScope D(W, "Symbols");        const Elf_Shdr *Symtab = this->dumper()->getDotSymtabSec(); -      StringRef StrTable = unwrapOrError(Obj->getStringTableForSymtab(*Symtab)); +      StringRef StrTable = +          unwrapOrError(this->FileName, Obj->getStringTableForSymtab(*Symtab)); -      for (const Elf_Sym &Sym : unwrapOrError(Obj->symbols(Symtab))) { +      for (const Elf_Sym &Sym : +           unwrapOrError(this->FileName, Obj->symbols(Symtab))) {          const Elf_Shdr *SymSec = unwrapOrError( +            this->FileName,              Obj->getSection(&Sym, Symtab, this->dumper()->getShndxTable()));          if (SymSec == &Sec) -          printSymbol(Obj, &Sym, unwrapOrError(Obj->symbols(Symtab)).begin(), +          printSymbol(Obj, &Sym, +              unwrapOrError(this->FileName, Obj->symbols(Symtab)).begin(),                        StrTable, false);        }      }      if (opts::SectionData && Sec.sh_type != ELF::SHT_NOBITS) { -      ArrayRef<uint8_t> Data = unwrapOrError(Obj->getSectionContents(&Sec)); +      ArrayRef<uint8_t> Data = +          unwrapOrError(this->FileName, Obj->getSectionContents(&Sec));        W.printBinaryBlock(            "SectionData",            StringRef(reinterpret_cast<const char *>(Data.data()), Data.size())); @@ -5168,7 +5240,8 @@ void LLVMStyle<ELFT>::printDynamicRelocations(const ELFO *Obj) {      }    if (DynRelrRegion.Size > 0) {      Elf_Relr_Range Relrs = this->dumper()->dyn_relrs(); -    std::vector<Elf_Rela> RelrRelas = unwrapOrError(Obj->decode_relrs(Relrs)); +    std::vector<Elf_Rela> RelrRelas = +        unwrapOrError(this->FileName, Obj->decode_relrs(Relrs));      for (const Elf_Rela &Rela : RelrRelas)        printDynamicRelocation(Obj, Rela);    } @@ -5194,8 +5267,8 @@ void LLVMStyle<ELFT>::printDynamicRelocation(const ELFO *Obj, Elf_Rela Rel) {    std::string SymbolName;    uint32_t SymIndex = Rel.getSymbol(Obj->isMips64EL());    const Elf_Sym *Sym = this->dumper()->dynamic_symbols().begin() + SymIndex; -  SymbolName = maybeDemangle( -      unwrapOrError(Sym->getName(this->dumper()->getDynamicStringTable()))); +  SymbolName = maybeDemangle(unwrapOrError( +      this->FileName, Sym->getName(this->dumper()->getDynamicStringTable())));    if (opts::ExpandRelocs) {      DictScope Group(W, "Relocation");      W.printHex("Offset", Rel.r_offset); @@ -5224,7 +5297,8 @@ template <class ELFT>  void LLVMStyle<ELFT>::printProgramHeaders(const ELFO *Obj) {    ListScope L(W, "ProgramHeaders"); -  for (const Elf_Phdr &Phdr : unwrapOrError(Obj->program_headers())) { +  for (const Elf_Phdr &Phdr : +       unwrapOrError(this->FileName, Obj->program_headers())) {      DictScope P(W, "ProgramHeader");      W.printHex("Type",                 getElfSegmentType(Obj->getHeader()->e_machine, Phdr.p_type), @@ -5246,7 +5320,7 @@ void LLVMStyle<ELFT>::printVersionSymbolSection(const ELFFile<ELFT> *Obj,    if (!Sec)      return; -  StringRef SecName = unwrapOrError(Obj->getSectionName(Sec)); +  StringRef SecName = unwrapOrError(this->FileName, Obj->getSectionName(Sec));    W.printNumber("Section Name", SecName, Sec->sh_name);    W.printHex("Address", Sec->sh_addr);    W.printHex("Offset", Sec->sh_offset); @@ -5281,7 +5355,8 @@ void LLVMStyle<ELFT>::printVersionDefinitionSection(const ELFFile<ELFT> *Obj,        reinterpret_cast<const uint8_t *>(Obj->base() + Sec->sh_offset);    const uint8_t *SecEndAddress = SecStartAddress + Sec->sh_size;    const uint8_t *VerdefBuf = SecStartAddress; -  const Elf_Shdr *StrTab = unwrapOrError(Obj->getSection(Sec->sh_link)); +  const Elf_Shdr *StrTab = +      unwrapOrError(this->FileName, Obj->getSection(Sec->sh_link));    unsigned VerDefsNum = Sec->sh_info;    while (VerDefsNum--) { @@ -5326,7 +5401,8 @@ void LLVMStyle<ELFT>::printVersionDependencySection(const ELFFile<ELFT> *Obj,    const uint8_t *SecData =        reinterpret_cast<const uint8_t *>(Obj->base() + Sec->sh_offset); -  const Elf_Shdr *StrTab = unwrapOrError(Obj->getSection(Sec->sh_link)); +  const Elf_Shdr *StrTab = +      unwrapOrError(this->FileName, Obj->getSection(Sec->sh_link));    const uint8_t *VerneedBuf = SecData;    unsigned VerneedNum = Sec->sh_info; @@ -5368,9 +5444,9 @@ void LLVMStyle<ELFT>::printCGProfile(const ELFFile<ELFT> *Obj) {    ListScope L(W, "CGProfile");    if (!this->dumper()->getDotCGProfileSec())      return; -  auto CGProfile = -      unwrapOrError(Obj->template getSectionContentsAsArray<Elf_CGProfile>( -          this->dumper()->getDotCGProfileSec())); +  auto CGProfile = unwrapOrError( +      this->FileName, Obj->template getSectionContentsAsArray<Elf_CGProfile>( +                          this->dumper()->getDotCGProfileSec()));    for (const Elf_CGProfile &CGPE : CGProfile) {      DictScope D(W, "CGProfileEntry");      W.printNumber("From", this->dumper()->getStaticSymbolName(CGPE.cgp_from), @@ -5387,6 +5463,7 @@ void LLVMStyle<ELFT>::printAddrsig(const ELFFile<ELFT> *Obj) {    if (!this->dumper()->getDotAddrsigSec())      return;    ArrayRef<uint8_t> Contents = unwrapOrError( +      this->FileName,        Obj->getSectionContents(this->dumper()->getDotAddrsigSec()));    const uint8_t *Cur = Contents.begin();    const uint8_t *End = Contents.end(); @@ -5479,7 +5556,8 @@ void LLVMStyle<ELFT>::printNotes(const ELFFile<ELFT> *Obj) {    };    if (Obj->getHeader()->e_type == ELF::ET_CORE) { -    for (const auto &P : unwrapOrError(Obj->program_headers())) { +    for (const auto &P : +         unwrapOrError(this->FileName, Obj->program_headers())) {        if (P.p_type != PT_NOTE)          continue;        DictScope D(W, "NoteSection"); @@ -5491,7 +5569,7 @@ void LLVMStyle<ELFT>::printNotes(const ELFFile<ELFT> *Obj) {          error(std::move(Err));      }    } else { -    for (const auto &S : unwrapOrError(Obj->sections())) { +    for (const auto &S : unwrapOrError(this->FileName, Obj->sections())) {        if (S.sh_type != SHT_NOTE)          continue;        DictScope D(W, "NoteSection"); @@ -5509,11 +5587,12 @@ template <class ELFT>  void LLVMStyle<ELFT>::printELFLinkerOptions(const ELFFile<ELFT> *Obj) {    ListScope L(W, "LinkerOptions"); -  for (const Elf_Shdr &Shdr : unwrapOrError(Obj->sections())) { +  for (const Elf_Shdr &Shdr : unwrapOrError(this->FileName, Obj->sections())) {      if (Shdr.sh_type != ELF::SHT_LLVM_LINKER_OPTIONS)        continue; -    ArrayRef<uint8_t> Contents = unwrapOrError(Obj->getSectionContents(&Shdr)); +    ArrayRef<uint8_t> Contents = +        unwrapOrError(this->FileName, Obj->getSectionContents(&Shdr));      for (const uint8_t *P = Contents.begin(), *E = Contents.end(); P < E; ) {        StringRef Key = StringRef(reinterpret_cast<const char *>(P));        StringRef Value = diff --git a/llvm/tools/llvm-readobj/MachODumper.cpp b/llvm/tools/llvm-readobj/MachODumper.cpp index 32a3866eb2f..17883df49e5 100644 --- a/llvm/tools/llvm-readobj/MachODumper.cpp +++ b/llvm/tools/llvm-readobj/MachODumper.cpp @@ -484,7 +484,8 @@ void MachODumper::printSectionHeaders(const MachOObjectFile *Obj) {      }      if (opts::SectionData && !Section.isBSS()) -      W.printBinaryBlock("SectionData", unwrapOrError(Section.getContents())); +      W.printBinaryBlock("SectionData", unwrapOrError(Obj->getFileName(), +                                                      Section.getContents()));    }  } @@ -653,7 +654,8 @@ void MachODumper::printStackMap() const {    if (StackMapSection == object::SectionRef())      return; -  StringRef StackMapContents = unwrapOrError(StackMapSection.getContents()); +  StringRef StackMapContents = +      unwrapOrError(Obj->getFileName(), StackMapSection.getContents());    ArrayRef<uint8_t> StackMapContentsArray =        arrayRefFromStringRef(StackMapContents); diff --git a/llvm/tools/llvm-readobj/ObjDumper.cpp b/llvm/tools/llvm-readobj/ObjDumper.cpp index 0a9e22c8a71..c16b7ec081a 100644 --- a/llvm/tools/llvm-readobj/ObjDumper.cpp +++ b/llvm/tools/llvm-readobj/ObjDumper.cpp @@ -84,7 +84,8 @@ void ObjDumper::printSectionsAsString(const object::ObjectFile *Obj,      First = false;      W.startLine() << "String dump of section '" << SectionName << "':\n"; -    StringRef SectionContent = unwrapOrError(Section.getContents()); +    StringRef SectionContent = +        unwrapOrError(Obj->getFileName(), Section.getContents());      const uint8_t *SecContent = SectionContent.bytes_begin();      const uint8_t *CurrentWord = SecContent; @@ -117,7 +118,8 @@ void ObjDumper::printSectionsAsHex(const object::ObjectFile *Obj,      First = false;      W.startLine() << "Hex dump of section '" << SectionName << "':\n"; -    StringRef SectionContent = unwrapOrError(Section.getContents()); +    StringRef SectionContent = +        unwrapOrError(Obj->getFileName(), Section.getContents());      const uint8_t *SecContent = SectionContent.bytes_begin();      const uint8_t *SecEnd = SecContent + SectionContent.size(); diff --git a/llvm/tools/llvm-readobj/llvm-readobj.h b/llvm/tools/llvm-readobj/llvm-readobj.h index 145b116c9cf..4cdb01da152 100644 --- a/llvm/tools/llvm-readobj/llvm-readobj.h +++ b/llvm/tools/llvm-readobj/llvm-readobj.h @@ -33,17 +33,6 @@ namespace llvm {      return std::move(*E);    } -  // TODO: This one is deprecated. Use one with a Input name below. -  template <class T> T unwrapOrError(Expected<T> EO) { -    if (EO) -      return *EO; -    std::string Buf; -    raw_string_ostream OS(Buf); -    logAllUnhandledErrors(EO.takeError(), OS); -    OS.flush(); -    reportError(Buf); -  } -    template <class T> T unwrapOrError(StringRef Input, Expected<T> EO) {      if (EO)        return *EO;  | 

