diff --git a/llvm/test/tools/llvm-objdump/X86/Inputs/debug-info-fileinfo.exe.elf-x86_64 b/llvm/test/tools/llvm-objdump/X86/Inputs/debug-info-fileinfo.exe.elf-x86_64 new file mode 100644 index 000000000000..2074886c6656 Binary files /dev/null and b/llvm/test/tools/llvm-objdump/X86/Inputs/debug-info-fileinfo.exe.elf-x86_64 differ diff --git a/llvm/test/tools/llvm-objdump/X86/debug-info-fileinfo.test b/llvm/test/tools/llvm-objdump/X86/debug-info-fileinfo.test new file mode 100644 index 000000000000..2c51e0beda46 --- /dev/null +++ b/llvm/test/tools/llvm-objdump/X86/debug-info-fileinfo.test @@ -0,0 +1,27 @@ +# Check that debug info line number pointing beyond the end of the file +# doesn't cause a segmentation fault in llvm-objdump. + +# To rebuild the input: clang -g debug-info-fileinfo.S -o debug-info-fileinfo.exe -nostdlib + +# RUN: llvm-objdump -S %p/Inputs/debug-info-fileinfo.exe.elf-x86_64 | FileCheck %s + +# CHECK: Disassembly of section .text: +# CHECK: _start +# CHECK-NEXT: 400078: c3 retq +# CHECK: foo +# CHECK-NEXT: 400079: 90 nop +# CHECK-NEXT: 40007a: 90 nop +# CHECK-NEXT: 40007b: c3 retq + +.text + +.global _start; .type _start, STT_FUNC; _start: + ret + +.global foo; .type foo, STT_FUNC; foo: + # foo + # bar + # baz + nop + nop + ret diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp index 613d0643b433..18fa0e074084 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -485,10 +485,13 @@ void SourcePrinter::printSourceLine(raw_ostream &OS, uint64_t Address, auto FileBuffer = SourceCache.find(LineInfo.FileName); if (FileBuffer != SourceCache.end()) { auto LineBuffer = LineCache.find(LineInfo.FileName); - if (LineBuffer != LineCache.end()) + if (LineBuffer != LineCache.end()) { + if (LineInfo.Line > LineBuffer->second.size()) + return; // Vector begins at 0, line numbers are non-zero OS << Delimiter << LineBuffer->second[LineInfo.Line - 1].ltrim() << "\n"; + } } } OldLineInfo = LineInfo;