Index: llvm/test/tools/llvm-readobj/XCOFF/relocation-invalid.test =================================================================== --- /dev/null +++ llvm/test/tools/llvm-readobj/XCOFF/relocation-invalid.test @@ -0,0 +1,16 @@ +# RUN: yaml2obj %s -o %t +# RUN: llvm-readobj --relocs --expand-relocs %t 2>&1 | FileCheck %s -DFILE=%t + +# CHECK: Relocations [ +# CHECK-NEXT: warning: '[[FILE]]': The end of the file was unexpectedly encountered +# CHECK-NEXT: ] + +--- !XCOFF +FileHeader: + MagicNumber: 0x1DF +Sections: + - Name: .text + Flags: [ STYP_TEXT ] + FileOffsetToRelocations: 0x222 + + Index: llvm/test/tools/llvm-readobj/XCOFF/relocation-symbol-invalid.test =================================================================== --- /dev/null +++ llvm/test/tools/llvm-readobj/XCOFF/relocation-symbol-invalid.test @@ -0,0 +1,20 @@ +# RUN: yaml2obj %s -o %t +# RUN: llvm-readobj --relocs --expand-relocs %t 2>&1 | FileCheck %s -DFILE=%t + +# CHECK: Relocations [ +# CHECK-NEXT: Section (index: 1) .text { +# CHECK-NEXT: warning: '[[FILE]]': Invalid symbol index +# CHECK-NEXT: } +# CHECK-NEXT: ] + +--- !XCOFF +FileHeader: + MagicNumber: 0x1DF +Sections: + - Name: .text + Flags: [ STYP_TEXT ] + Relocations: + - Address: 0x80 + Symbol: 0x21 + + Index: llvm/tools/llvm-readobj/XCOFFDumper.cpp =================================================================== --- llvm/tools/llvm-readobj/XCOFFDumper.cpp +++ llvm/tools/llvm-readobj/XCOFFDumper.cpp @@ -134,16 +134,27 @@ 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 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);