[llvm] r285910 - replace a report_fatal_error with a ErrorOr.

Rafael Espindola via llvm-commits llvm-commits at lists.llvm.org
Thu Nov 3 06:58:15 PDT 2016


Author: rafael
Date: Thu Nov  3 08:58:15 2016
New Revision: 285910

URL: http://llvm.org/viewvc/llvm-project?rev=285910&view=rev
Log:
replace a report_fatal_error with a ErrorOr.

Modified:
    llvm/trunk/include/llvm/Object/ELF.h
    llvm/trunk/test/Object/invalid.test
    llvm/trunk/tools/llvm-readobj/ELFDumper.cpp

Modified: llvm/trunk/include/llvm/Object/ELF.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/ELF.h?rev=285910&r1=285909&r2=285910&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Object/ELF.h (original)
+++ llvm/trunk/include/llvm/Object/ELF.h Thu Nov  3 08:58:15 2016
@@ -147,12 +147,12 @@ public:
   }
 
   ErrorOr<StringRef> getSectionStringTable(Elf_Shdr_Range Sections) const;
-  uint32_t getExtendedSymbolTableIndex(const Elf_Sym *Sym,
-                                       const Elf_Shdr *SymTab,
-                                       ArrayRef<Elf_Word> ShndxTable) const;
-  uint32_t getExtendedSymbolTableIndex(const Elf_Sym *Sym,
-                                       const Elf_Sym *FirstSym,
-                                       ArrayRef<Elf_Word> ShndxTable) const;
+  ErrorOr<uint32_t>
+  getExtendedSymbolTableIndex(const Elf_Sym *Sym, const Elf_Shdr *SymTab,
+                              ArrayRef<Elf_Word> ShndxTable) const;
+  ErrorOr<uint32_t>
+  getExtendedSymbolTableIndex(const Elf_Sym *Sym, const Elf_Sym *FirstSym,
+                              ArrayRef<Elf_Word> ShndxTable) const;
   const Elf_Ehdr *getHeader() const { return Header; }
   ErrorOr<const Elf_Shdr *> getSection(const Elf_Sym *Sym,
                                        const Elf_Shdr *SymTab,
@@ -192,23 +192,23 @@ getSection(typename ELFT::ShdrRange Sect
 }
 
 template <class ELFT>
-uint32_t ELFFile<ELFT>::getExtendedSymbolTableIndex(
+ErrorOr<uint32_t> ELFFile<ELFT>::getExtendedSymbolTableIndex(
     const Elf_Sym *Sym, const Elf_Shdr *SymTab,
     ArrayRef<Elf_Word> ShndxTable) const {
   auto SymsOrErr = symbols(SymTab);
   if (std::error_code EC = SymsOrErr.getError())
-    report_fatal_error(EC.message());
+    return EC;
   return getExtendedSymbolTableIndex(Sym, SymsOrErr->begin(), ShndxTable);
 }
 
 template <class ELFT>
-uint32_t ELFFile<ELFT>::getExtendedSymbolTableIndex(
+ErrorOr<uint32_t> ELFFile<ELFT>::getExtendedSymbolTableIndex(
     const Elf_Sym *Sym, const Elf_Sym *FirstSym,
     ArrayRef<Elf_Word> ShndxTable) const {
   assert(Sym->st_shndx == ELF::SHN_XINDEX);
   unsigned Index = Sym - FirstSym;
   if (Index >= ShndxTable.size())
-    report_fatal_error("Invalid symbol table index");
+    return object_error::parse_failed;
   // The size of the table was checked in getSHNDXTable.
   return ShndxTable[Index];
 }
@@ -222,8 +222,12 @@ ELFFile<ELFT>::getSection(const Elf_Sym
       (Index >= ELF::SHN_LORESERVE && Index != ELF::SHN_XINDEX))
     return nullptr;
 
-  if (Index == ELF::SHN_XINDEX)
-    Index = getExtendedSymbolTableIndex(Sym, SymTab, ShndxTable);
+  if (Index == ELF::SHN_XINDEX) {
+    auto ErrorOrIndex = getExtendedSymbolTableIndex(Sym, SymTab, ShndxTable);
+    if (std::error_code EC = ErrorOrIndex.getError())
+      return EC;
+    Index = *ErrorOrIndex;
+  }
 
   auto SectionsOrErr = sections();
   if (std::error_code EC = SectionsOrErr.getError())

Modified: llvm/trunk/test/Object/invalid.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/invalid.test?rev=285910&r1=285909&r2=285910&view=diff
==============================================================================
--- llvm/trunk/test/Object/invalid.test (original)
+++ llvm/trunk/test/Object/invalid.test Thu Nov  3 08:58:15 2016
@@ -60,7 +60,7 @@ INVALID-SH-NUM: Invalid data was encount
 
 RUN: not llvm-readobj -t %p/Inputs/invalid-ext-symtab-index.elf-x86-64 2>&1 | \
 RUN:   FileCheck --check-prefix=INVALID-EXT-SYMTAB-INDEX %s
-INVALID-EXT-SYMTAB-INDEX: Invalid symbol table index
+INVALID-EXT-SYMTAB-INDEX: Invalid data was encountered while parsing the file.
 
 RUN: not llvm-readobj -r %p/Inputs/invalid-relocation-sec-sh_offset.elf-i386 2>&1 | \
 RUN:   FileCheck --check-prefix=INVALID-RELOC-SH-OFFSET %s

Modified: llvm/trunk/tools/llvm-readobj/ELFDumper.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/ELFDumper.cpp?rev=285910&r1=285909&r2=285910&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-readobj/ELFDumper.cpp (original)
+++ llvm/trunk/tools/llvm-readobj/ELFDumper.cpp Thu Nov  3 08:58:15 2016
@@ -717,8 +717,8 @@ getSectionNameIndex(const ELFO &Obj, con
     SectionName = "Reserved";
   else {
     if (SectionIndex == SHN_XINDEX)
-      SectionIndex =
-          Obj.getExtendedSymbolTableIndex(Symbol, FirstSym, ShndxTable);
+      SectionIndex = unwrapOrError(
+          Obj.getExtendedSymbolTableIndex(Symbol, FirstSym, ShndxTable));
     const typename ELFO::Elf_Shdr *Sec =
         unwrapOrError(Obj.getSection(SectionIndex));
     SectionName = unwrapOrError(Obj.getSectionName(Sec));
@@ -2737,8 +2737,8 @@ std::string GNUStyle<ELFT>::getSymbolSec
   case ELF::SHN_COMMON:
     return "COM";
   case ELF::SHN_XINDEX:
-    SectionIndex = Obj->getExtendedSymbolTableIndex(
-        Symbol, FirstSym, this->dumper()->getShndxTable());
+    SectionIndex = unwrapOrError(Obj->getExtendedSymbolTableIndex(
+        Symbol, FirstSym, this->dumper()->getShndxTable()));
   default:
     // Find if:
     // Processor specific




More information about the llvm-commits mailing list