diff --git a/lib/MC/MCDwarf.cpp b/lib/MC/MCDwarf.cpp index c646529645b..679f4eeec1f 100644 --- a/lib/MC/MCDwarf.cpp +++ b/lib/MC/MCDwarf.cpp @@ -179,7 +179,7 @@ static inline void EmitDwarfLineTable(MCObjectStreamer *MCOS, if (it->getFlags() & DWARF2_FLAG_EPILOGUE_BEGIN) MCOS->EmitIntValue(dwarf::DW_LNS_set_epilogue_begin, 1); - int64_t LineDelta = it->getLine() - LastLine; + int64_t LineDelta = static_cast(it->getLine()) - LastLine; MCSymbol *Label = it->getLabel(); // At this point we want to emit/create the sequence to encode the delta in diff --git a/test/MC/ELF/debug-loc.s b/test/MC/ELF/debug-loc.s new file mode 100644 index 00000000000..36ae485ef06 --- /dev/null +++ b/test/MC/ELF/debug-loc.s @@ -0,0 +1,32 @@ +// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | elf-dump | FileCheck %s + +// Test that we don't regress on the size of the line info section. We used +// to handle negative line diffs incorrectly which manifested as very +// large integers being passed to DW_LNS_advance_line. + +// FIXME: This size is the same as gnu as, but we can probably do a bit better. +// FIXME2: We need a debug_line dumper so that we can test the actual contents. + +// CHECK: # Section 0x00000004 +// CHECK-NEXT: (('sh_name', 0x00000012) # '.debug_line' +// CHECK-NEXT: ('sh_type', 0x00000001) +// CHECK-NEXT: ('sh_flags', 0x00000000) +// CHECK-NEXT: ('sh_addr', 0x00000000) +// CHECK-NEXT: ('sh_offset', 0x00000044) +// CHECK-NEXT: ('sh_size', 0x0000003d) +// CHECK-NEXT: ('sh_link', 0x00000000) +// CHECK-NEXT: ('sh_info', 0x00000000) +// CHECK-NEXT: ('sh_addralign', 0x00000001) +// CHECK-NEXT: ('sh_entsize', 0x00000000) +// CHECK-NEXT: ), + + .section .debug_line,"",@progbits + .text +foo: + .file 1 "Driver.ii" + .loc 1 2 0 + nop + .loc 1 4 0 + nop + .loc 1 3 0 + nop