Index: llvm/trunk/test/tools/dsymutil/X86/dwarf4-linetable.test =================================================================== --- llvm/trunk/test/tools/dsymutil/X86/dwarf4-linetable.test +++ llvm/trunk/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 Index: llvm/trunk/test/tools/dsymutil/X86/dwarf5-linetable.test =================================================================== --- llvm/trunk/test/tools/dsymutil/X86/dwarf5-linetable.test +++ llvm/trunk/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 Index: llvm/trunk/tools/dsymutil/DwarfLinker.cpp =================================================================== --- llvm/trunk/tools/dsymutil/DwarfLinker.cpp +++ llvm/trunk/tools/dsymutil/DwarfLinker.cpp @@ -3232,16 +3232,21 @@ } // 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;