[dsymutil] Use the new MCDwarfLineTableParams customization to emit linetables
authorFrederic Riss <friss@apple.com>
Fri, 7 Aug 2015 15:14:13 +0000 (15:14 +0000)
committerFrederic Riss <friss@apple.com>
Fri, 7 Aug 2015 15:14:13 +0000 (15:14 +0000)
llvm-dsymutil has to be able to process debug info produced by other compilers
which use different line table settings. The testcase wasn't generated by
another compiler, but by a modified clang.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@244319 91177308-0d34-0410-b5e6-96231b3b80d8

test/tools/dsymutil/Inputs/basic2-custom-linetable.macho.x86_64.o [new file with mode: 0644]
test/tools/dsymutil/Inputs/basic2.c
test/tools/dsymutil/X86/custom-line-table.test [new file with mode: 0644]
tools/dsymutil/DwarfLinker.cpp

diff --git a/test/tools/dsymutil/Inputs/basic2-custom-linetable.macho.x86_64.o b/test/tools/dsymutil/Inputs/basic2-custom-linetable.macho.x86_64.o
new file mode 100644 (file)
index 0000000..07b36a2
Binary files /dev/null and b/test/tools/dsymutil/Inputs/basic2-custom-linetable.macho.x86_64.o differ
index 13c6d07c2a0856ad84895ae0c7900925cd140112..4524e9bc6cc31a4b7bf623751f21e0a4cbbacfc7 100644 (file)
@@ -20,3 +20,9 @@ int foo(int arg) {
   return bar(arg+val) + inc() + baz++;
 }
 
+/* This file was also used to create basic2-custom-linetable.macho.x86_64.o
+   with a custom clang that had different settings for the linetable
+   encoding constants: line_base == -1 and line_range == 4.
+
+   clang -c -g basic2.c -o basic2-custom-linetable.macho.x86_64.o 
+*/
diff --git a/test/tools/dsymutil/X86/custom-line-table.test b/test/tools/dsymutil/X86/custom-line-table.test
new file mode 100644 (file)
index 0000000..86fd7e2
--- /dev/null
@@ -0,0 +1,40 @@
+# RUN: llvm-dsymutil -oso-prepend-path %p/../Inputs -y %s -f -o - | llvm-dwarfdump - -debug-dump=line | FileCheck %s
+
+# This test runs dsymutil on an object file with non-standard (as far
+# as llvm is concerned) line table settings.
+
+---
+triple:          'x86_64-apple-darwin'
+objects:
+  - filename: basic2-custom-linetable.macho.x86_64.o
+    symbols:
+      - { sym: _foo, objAddr: 0x0, binAddr: 0x1000, size: 0x12 }
+
+# CHECK: 0x0000000000001000     19      0 {{.*}} is_stmt
+# CHECK: 0x0000000000001012     20     14 {{.*}} is_stmt prologue_end
+# CHECK: 0x0000000000001015     20     18 {{.*}}
+# CHECK: 0x0000000000001017     20     17 {{.*}}
+# CHECK: 0x0000000000001019     20     10 {{.*}}
+# CHECK: 0x000000000000101e     20     25 {{.*}}
+# CHECK: 0x0000000000001026     20     23 {{.*}}
+# CHECK: 0x000000000000102b     20     36 {{.*}}
+# CHECK: 0x000000000000103c     20     31 {{.*}}
+# CHECK: 0x000000000000103e     20      3 {{.*}}
+# CHECK: 0x0000000000001046     20      3 {{.*}} end_sequence
+
+      - { sym: _inc, objAddr: 0x0, binAddr: 0x2000, size: 0x12 }
+
+# CHECK: 0x0000000000002000     14      0 {{.*}} is_stmt
+# CHECK: 0x0000000000002004     15     10 {{.*}} is_stmt prologue_end
+# CHECK: 0x0000000000002013     15      3 {{.*}}
+# CHECK: 0x0000000000002015     15      3 {{.*}} end_sequence
+
+      - { sym: _unused1,  objAddr: 0x0, binAddr: 0x3000, size: 0x12 }
+
+# CHECK: 0x0000000000003000     10      0 {{.*}} is_stmt
+# CHECK: 0x0000000000003004     11      7 {{.*}} is_stmt prologue_end
+# CHECK: 0x000000000000300e     11      3 {{.*}}
+# CHECK: 0x0000000000003013     12      1 {{.*}} is_stmt
+# CHECK: 0x000000000000301c     12      1 {{.*}} is_stmt end_sequence
+...
+
index 68618bc3371ed3e7cff99c03b6b3526a42e3f92c..47d085047866b5b7c6fbce2ed2ea3286458af580 100644 (file)
@@ -618,7 +618,8 @@ public:
 
   /// \brief Emit the line table described in \p Rows into the
   /// debug_line section.
-  void emitLineTableForUnit(StringRef PrologueBytes, unsigned MinInstLength,
+  void emitLineTableForUnit(MCDwarfLineTableParams Params,
+                            StringRef PrologueBytes, unsigned MinInstLength,
                             std::vector<DWARFDebugLine::Row> &Rows,
                             unsigned AdddressSize);
 
@@ -942,7 +943,8 @@ void DwarfStreamer::emitLocationsForUnit(const CompileUnit &Unit,
   }
 }
 
-void DwarfStreamer::emitLineTableForUnit(StringRef PrologueBytes,
+void DwarfStreamer::emitLineTableForUnit(MCDwarfLineTableParams Params,
+                                         StringRef PrologueBytes,
                                          unsigned MinInstLength,
                                          std::vector<DWARFDebugLine::Row> &Rows,
                                          unsigned PointerSize) {
@@ -965,7 +967,7 @@ void DwarfStreamer::emitLineTableForUnit(StringRef PrologueBytes,
   if (Rows.empty()) {
     // We only have the dummy entry, dsymutil emits an entry with a 0
     // address in that case.
-    MCDwarfLineAddr::Encode(*MC, INT64_MAX, 0, EncodingOS);
+    MCDwarfLineAddr::Encode(*MC, Params, INT64_MAX, 0, EncodingOS);
     MS->EmitBytes(EncodingOS.str());
     LineSectionSize += EncodingBuffer.size();
     MS->EmitLabel(LineEndSym);
@@ -1047,7 +1049,7 @@ void DwarfStreamer::emitLineTableForUnit(StringRef PrologueBytes,
 
     int64_t LineDelta = int64_t(Row.Line) - LastLine;
     if (!Row.EndSequence) {
-      MCDwarfLineAddr::Encode(*MC, LineDelta, AddressDelta, EncodingOS);
+      MCDwarfLineAddr::Encode(*MC, Params, LineDelta, AddressDelta, EncodingOS);
       MS->EmitBytes(EncodingOS.str());
       LineSectionSize += EncodingBuffer.size();
       EncodingBuffer.resize(0);
@@ -1066,7 +1068,7 @@ void DwarfStreamer::emitLineTableForUnit(StringRef PrologueBytes,
         MS->EmitULEB128IntValue(AddressDelta);
         LineSectionSize += 1 + getULEB128Size(AddressDelta);
       }
-      MCDwarfLineAddr::Encode(*MC, INT64_MAX, 0, EncodingOS);
+      MCDwarfLineAddr::Encode(*MC, Params, INT64_MAX, 0, EncodingOS);
       MS->EmitBytes(EncodingOS.str());
       LineSectionSize += EncodingBuffer.size();
       EncodingBuffer.resize(0);
@@ -1078,7 +1080,7 @@ void DwarfStreamer::emitLineTableForUnit(StringRef PrologueBytes,
   }
 
   if (RowsSinceLastSequence) {
-    MCDwarfLineAddr::Encode(*MC, INT64_MAX, 0, EncodingOS);
+    MCDwarfLineAddr::Encode(*MC, Params, INT64_MAX, 0, EncodingOS);
     MS->EmitBytes(EncodingOS.str());
     LineSectionSize += EncodingBuffer.size();
     EncodingBuffer.resize(0);
@@ -2915,13 +2917,18 @@ void DwarfLinker::patchLineTableForUnit(CompileUnit &Unit,
   // table emitter.
   if (LineTable.Prologue.Version != 2 ||
       LineTable.Prologue.DefaultIsStmt != DWARF2_LINE_DEFAULT_IS_STMT ||
-      LineTable.Prologue.LineBase != -5 || LineTable.Prologue.LineRange != 14 ||
-      LineTable.Prologue.OpcodeBase != 13)
+      LineTable.Prologue.OpcodeBase > 13)
     reportWarning("line table paramters mismatch. Cannot emit.");
-  else
-    Streamer->emitLineTableForUnit(LineData.slice(StmtList + 4, PrologueEnd),
+  else {
+    MCDwarfLineTableParams Params;
+    Params.DWARF2LineOpcodeBase = LineTable.Prologue.OpcodeBase;
+    Params.DWARF2LineBase = LineTable.Prologue.LineBase;
+    Params.DWARF2LineRange = LineTable.Prologue.LineRange;
+    Streamer->emitLineTableForUnit(Params,
+                                   LineData.slice(StmtList + 4, PrologueEnd),
                                    LineTable.Prologue.MinInstLength, NewRows,
                                    Unit.getOrigUnit().getAddressByteSize());
+  }
 }
 
 void DwarfLinker::emitAcceleratorEntriesForUnit(CompileUnit &Unit) {