diff --git a/llvm/test/tools/dsymutil/Inputs/dwarf4.o b/llvm/test/tools/dsymutil/Inputs/dwarf4.o new file mode 100644 index 000000000000..0c6487ac974c Binary files /dev/null and b/llvm/test/tools/dsymutil/Inputs/dwarf4.o differ diff --git a/llvm/test/tools/dsymutil/Inputs/dwarf5.o b/llvm/test/tools/dsymutil/Inputs/dwarf5.o new file mode 100644 index 000000000000..a9767f6d9376 Binary files /dev/null and b/llvm/test/tools/dsymutil/Inputs/dwarf5.o differ diff --git a/llvm/test/tools/dsymutil/X86/dwarf4-linetable.test b/llvm/test/tools/dsymutil/X86/dwarf4-linetable.test new file mode 100644 index 000000000000..39de076ca016 --- /dev/null +++ b/llvm/test/tools/dsymutil/X86/dwarf4-linetable.test @@ -0,0 +1,23 @@ +# RUN: llvm-dsymutil -f -oso-prepend-path=%p/../Inputs/ -y %s -o - | llvm-dwarfdump -debug-line - | FileCheck %s + +# Source: +# int main() { +# return 0; +# } +# Compile with: +# clang -gdwarf-4 dwarf4.c -c -o dwarf4.o + +--- +triple: 'x86_64-apple-darwin' +objects: + - filename: dwarf4.o + timestamp: 1513021112 + symbols: + - { sym: _main, objAddr: 0x0000000000000000, binAddr: 0x0000000100000FA0, size: 0x0000000F } +... + +# CHECK: .debug_line contents: +# CHECK: debug_line +# CHECK: Line table prologue: +# CHECK: total_length: +# CHECK: version: 4 diff --git a/llvm/test/tools/dsymutil/X86/dwarf5-linetable.test b/llvm/test/tools/dsymutil/X86/dwarf5-linetable.test new file mode 100644 index 000000000000..8622c37dc4c7 --- /dev/null +++ b/llvm/test/tools/dsymutil/X86/dwarf5-linetable.test @@ -0,0 +1,23 @@ +# RUN: llvm-dsymutil -f -oso-prepend-path=%p/../Inputs/ -y %s -o - | llvm-dwarfdump -debug-line - | FileCheck %s + +# Source: +# int main() { +# return 0; +# } +# Compile with: +# clang -gdwarf-5 dwarf5.c -c -o dwarf5.o + +--- +triple: 'x86_64-apple-darwin' +objects: + - filename: dwarf5.o + timestamp: 1513021112 + symbols: + - { sym: _main, objAddr: 0x0000000000000000, binAddr: 0x0000000100000FA0, size: 0x0000000F } +... + +# CHECK: .debug_line contents: +# CHECK: debug_line +# CHECK: Line table prologue: +# CHECK: total_length: +# CHECK: version: 5 diff --git a/llvm/tools/dsymutil/DwarfLinker.cpp b/llvm/tools/dsymutil/DwarfLinker.cpp index 68f1505de1c4..50ffc69dfaa0 100644 --- a/llvm/tools/dsymutil/DwarfLinker.cpp +++ b/llvm/tools/dsymutil/DwarfLinker.cpp @@ -3232,16 +3232,21 @@ void DwarfLinker::patchLineTableForUnit(CompileUnit &Unit, } // Finished extracting, now emit the line tables. - uint32_t PrologueEnd = *StmtList + 10 + LineTable.Prologue.PrologueLength; - // FIXME: LLVM hardcodes it's prologue values. We just copy the + // FIXME: LLVM hardcodes its prologue values. We just copy the // prologue over and that works because we act as both producer and // consumer. It would be nicer to have a real configurable line // table emitter. - if (LineTable.Prologue.getVersion() != 2 || + if (LineTable.Prologue.getVersion() < 2 || + LineTable.Prologue.getVersion() > 5 || LineTable.Prologue.DefaultIsStmt != DWARF2_LINE_DEFAULT_IS_STMT || LineTable.Prologue.OpcodeBase > 13) reportWarning("line table parameters mismatch. Cannot emit."); else { + uint32_t PrologueEnd = *StmtList + 10 + LineTable.Prologue.PrologueLength; + // DWARFv5 has an extra 2 bytes of information before the header_length + // field. + if (LineTable.Prologue.getVersion() == 5) + PrologueEnd += 2; StringRef LineData = OrigDwarf.getDWARFObj().getLineSection().Data; MCDwarfLineTableParams Params; Params.DWARF2LineOpcodeBase = LineTable.Prologue.OpcodeBase;