[PowerPC][AIX] llvm-readobj: Convert some errors to warnings.
authorMaryam Benimmar <maryam.benimmar@atos.net>
Tue, 17 Aug 2021 17:06:30 +0000 (13:06 -0400)
committerSean Fertile <sd.fertile@gmail.com>
Wed, 18 Aug 2021 15:04:08 +0000 (11:04 -0400)
Report warnings rather than errors, so that llvm-readobj doesn't bail
out on malformed inputs.

Differential Revision: https://reviews.llvm.org/D106783

llvm/test/tools/llvm-readobj/XCOFF/relocations-invalid.test [new file with mode: 0644]
llvm/tools/llvm-readobj/XCOFFDumper.cpp

diff --git a/llvm/test/tools/llvm-readobj/XCOFF/relocations-invalid.test b/llvm/test/tools/llvm-readobj/XCOFF/relocations-invalid.test
new file mode 100644 (file)
index 0000000..76d75ae
--- /dev/null
@@ -0,0 +1,39 @@
+## Check we report warnings when relocations are broken.
+
+# RUN: yaml2obj --docnum=1 %s -o %t1
+# RUN: llvm-readobj --relocs --expand-relocs %t1 2>&1 | \
+# RUN:   FileCheck %s -DFILE=%t1 --check-prefix=INVALID-REL
+
+# INVALID-REL:      Relocations [
+# INVALID-REL-NEXT:   warning: '[[FILE]]': The end of the file was unexpectedly encountered
+# INVALID-REL-NEXT: ]
+
+--- !XCOFF
+FileHeader:
+  MagicNumber:   0x1DF
+Sections:
+  - Name:        .text
+    Flags:       [ STYP_TEXT ]
+## Case 1: Incorrect offset to relocation entries.
+    FileOffsetToRelocations: 0x222
+
+# RUN: yaml2obj --docnum=2 %s -o %t2
+# RUN: llvm-readobj --relocs --expand-relocs %t2 2>&1 | \
+# RUN:   FileCheck %s -DFILE=%t2 --check-prefix=INVALID-SYM
+
+# INVALID-SYM:      Relocations [
+# INVALID-SYM-NEXT:   Section (index: 1) .text {
+# INVALID-SYM-NEXT:     warning: '[[FILE]]': Invalid symbol index
+# INVALID-SYM-NEXT:   }
+# INVALID-SYM-NEXT: ]
+
+--- !XCOFF
+FileHeader:
+  MagicNumber:   0x1DF
+Sections:
+  - Name:        .text
+    Flags:       [ STYP_TEXT ]
+    Relocations:
+      - Address: 0x80
+## Case 2: There is no symbol with index 0x21.
+        Symbol:  0x21
index 85c3a25..9be2626 100644 (file)
@@ -134,16 +134,27 @@ void XCOFFDumper::printRelocations(ArrayRef<XCOFFSectionHeader32> Sections) {
     if (Sec.Flags != XCOFF::STYP_TEXT && Sec.Flags != XCOFF::STYP_DATA &&
         Sec.Flags != XCOFF::STYP_TDATA && Sec.Flags != XCOFF::STYP_DWARF)
       continue;
-    auto Relocations = unwrapOrError(Obj.getFileName(), Obj.relocations(Sec));
+    auto ErrOrRelocations = Obj.relocations(Sec);
+    if (Error E = ErrOrRelocations.takeError()) {
+      reportUniqueWarning(std::move(E));
+      continue;
+    }
+
+    auto Relocations = *ErrOrRelocations;
     if (Relocations.empty())
       continue;
 
     W.startLine() << "Section (index: " << Index << ") " << Sec.getName()
                   << " {\n";
     for (auto Reloc : Relocations) {
-      StringRef SymbolName = unwrapOrError(
-          Obj.getFileName(), Obj.getSymbolNameByIndex(Reloc.SymbolIndex));
+      Expected<StringRef> ErrOrSymbolName =
+          Obj.getSymbolNameByIndex(Reloc.SymbolIndex);
+      if (Error E = ErrOrSymbolName.takeError()) {
+        reportUniqueWarning(std::move(E));
+        continue;
+      }
 
+      StringRef SymbolName = *ErrOrSymbolName;
       DictScope RelocScope(W, "Relocation");
       W.printHex("Virtual Address", Reloc.VirtualAddress);
       W.printNumber("Symbol", SymbolName, Reloc.SymbolIndex);