[dsymutil] Accept line tables up to DWARFv5.

This patch removes the hard-coded check for DWARFv2 line tables. Now
dsymutil accepts line tables for DWARF versions 2 to 5 (inclusive).

Differential revision: https://reviews.llvm.org/D41084

rdar://35968319

llvm-svn: 320469
This commit is contained in:
Jonas Devlieghere 2017-12-12 11:32:21 +00:00
parent 657159c273
commit f0945f48bd
5 changed files with 54 additions and 3 deletions

Binary file not shown.

Binary file not shown.

View File

@ -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

View File

@ -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

View File

@ -3232,16 +3232,21 @@ void DwarfLinker::patchLineTableForUnit(CompileUnit &Unit,
} }
// Finished extracting, now emit the line tables. // Finished extracting, now emit the line tables.
uint32_t PrologueEnd = *StmtList + 10 + LineTable.Prologue.PrologueLength; // FIXME: LLVM hardcodes its prologue values. We just copy the
// FIXME: LLVM hardcodes it's prologue values. We just copy the
// prologue over and that works because we act as both producer and // prologue over and that works because we act as both producer and
// consumer. It would be nicer to have a real configurable line // consumer. It would be nicer to have a real configurable line
// table emitter. // 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.DefaultIsStmt != DWARF2_LINE_DEFAULT_IS_STMT ||
LineTable.Prologue.OpcodeBase > 13) LineTable.Prologue.OpcodeBase > 13)
reportWarning("line table parameters mismatch. Cannot emit."); reportWarning("line table parameters mismatch. Cannot emit.");
else { 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; StringRef LineData = OrigDwarf.getDWARFObj().getLineSection().Data;
MCDwarfLineTableParams Params; MCDwarfLineTableParams Params;
Params.DWARF2LineOpcodeBase = LineTable.Prologue.OpcodeBase; Params.DWARF2LineOpcodeBase = LineTable.Prologue.OpcodeBase;