Index: test/tools/llvm-objdump/X86/debug-info-fileinfo.test =================================================================== --- /dev/null +++ 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-NEXT: _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 Index: tools/llvm-objdump/llvm-objdump.cpp =================================================================== --- tools/llvm-objdump/llvm-objdump.cpp +++ tools/llvm-objdump/llvm-objdump.cpp @@ -485,10 +485,13 @@ 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;