diff --git a/lib/Object/ObjectFile.cpp b/lib/Object/ObjectFile.cpp index 79812e3a10b..bcc44cd6ce3 100644 --- a/lib/Object/ObjectFile.cpp +++ b/lib/Object/ObjectFile.cpp @@ -67,8 +67,10 @@ Error ObjectFile::printSymbolName(raw_ostream &OS, DataRefImpl Symb) const { uint32_t ObjectFile::getSymbolAlignment(DataRefImpl DRI) const { return 0; } bool ObjectFile::isSectionBitcode(DataRefImpl Sec) const { - if (Expected NameOrErr = getSectionName(Sec)) + Expected NameOrErr = getSectionName(Sec); + if (NameOrErr) return *NameOrErr == ".llvmbc"; + consumeError(NameOrErr.takeError()); return false; } diff --git a/test/tools/llvm-nm/format-sysv-section.test b/test/tools/llvm-nm/format-sysv-section.test index 1ebfa93d141..67ed1a8f7db 100644 --- a/test/tools/llvm-nm/format-sysv-section.test +++ b/test/tools/llvm-nm/format-sysv-section.test @@ -1,7 +1,7 @@ -# RUN: yaml2obj %s > %t.o -# RUN: llvm-nm %t.o --format=sysv | FileCheck %s +# RUN: yaml2obj --docnum=1 %s > %t1.o +# RUN: llvm-nm %t1.o --format=sysv | FileCheck %s -!ELF +--- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB @@ -33,3 +33,27 @@ Symbols: # CHECK-NEXT: symbol_absolute {{.*}}| |*ABS* # CHECK-NEXT: symbol_common {{.*}}| |*COM* # CHECK-NEXT: symbol_undefined {{.*}}| |*UND* + +## Here we have a symbol that belongs to a section with a broken name +## (sh_name offset goes past the end of the sections name string table). +## We test that we can still print a reasonable output and don't crash/assert. + +# RUN: yaml2obj --docnum=2 %s > %t2.o +# RUN: llvm-nm %t2.o --format=sysv | FileCheck %s --check-prefix=ERR + +# ERR: foo |0000000000000000| ? | NOTYPE|0000000000000000| | + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .broken + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + ShName: 0xffff +Symbols: + - Name: foo + Section: .broken