[PATCH] Support DWARF discriminators in object streamer.

Diego Novillo dnovillo at google.com
Thu Feb 13 15:24:03 PST 2014


Hi echristo,

This adds support for emitting DWARF path discriminator values in
the object streamer. It also changes the DWARF dumper to show
discriminator values in the line table output.

http://llvm-reviews.chandlerc.com/D2794

Files:
  lib/DebugInfo/DWARFDebugLine.cpp
  lib/DebugInfo/DWARFDebugLine.h
  lib/MC/MCDwarf.cpp
  test/DebugInfo/X86/ending-run.ll
  test/DebugInfo/X86/line-info.ll
  test/MC/ELF/discriminator.s
  test/MC/MachO/gen-dwarf-cpp.s
  test/MC/MachO/gen-dwarf.s

Index: lib/DebugInfo/DWARFDebugLine.cpp
===================================================================
--- lib/DebugInfo/DWARFDebugLine.cpp
+++ lib/DebugInfo/DWARFDebugLine.cpp
@@ -62,6 +62,7 @@
   Column = 0;
   File = 1;
   Isa = 0;
+  Discriminator = 0;
   IsStmt = default_is_stmt;
   BasicBlock = false;
   EndSequence = false;
@@ -71,7 +72,7 @@
 
 void DWARFDebugLine::Row::dump(raw_ostream &OS) const {
   OS << format("0x%16.16" PRIx64 " %6u %6u", Address, Line, Column)
-     << format(" %6u %3u ", File, Isa)
+     << format(" %6u %3u %13u ", File, Isa, Discriminator)
      << (IsStmt ? " is_stmt" : "")
      << (BasicBlock ? " basic_block" : "")
      << (PrologueEnd ? " prologue_end" : "")
@@ -85,8 +86,9 @@
   OS << '\n';
 
   if (!Rows.empty()) {
-    OS << "Address            Line   Column File   ISA Flags\n"
-       << "------------------ ------ ------ ------ --- -------------\n";
+    OS << "Address            Line   Column File   ISA Discriminator Flags\n"
+       << "------------------ ------ ------ ------ --- ------------- "
+          "-------------\n";
     for (std::vector<Row>::const_iterator pos = Rows.begin(),
          end = Rows.end(); pos != end; ++pos)
       pos->dump(OS);
@@ -311,6 +313,10 @@
         }
         break;
 
+      case DW_LNE_set_discriminator:
+        state.Discriminator = debug_line_data.getULEB128(offset_ptr);
+        break;
+
       default:
         // Length doesn't include the zero opcode byte or the length itself, but
         // it does include the sub_opcode, so we have to adjust for that below
Index: lib/DebugInfo/DWARFDebugLine.h
===================================================================
--- lib/DebugInfo/DWARFDebugLine.h
+++ lib/DebugInfo/DWARFDebugLine.h
@@ -112,6 +112,9 @@
     // An unsigned integer whose value encodes the applicable instruction set
     // architecture for the current instruction.
     uint8_t Isa;
+    // An unsigned integer representing the DWARF path discriminator value
+    // for this location.
+    uint32_t Discriminator;
     // A boolean indicating that the current instruction is the beginning of a
     // statement.
     uint8_t IsStmt:1,
Index: lib/MC/MCDwarf.cpp
===================================================================
--- lib/MC/MCDwarf.cpp
+++ lib/MC/MCDwarf.cpp
@@ -137,6 +137,7 @@
   unsigned Column = 0;
   unsigned Flags = DWARF2_LINE_DEFAULT_IS_STMT ? DWARF2_FLAG_IS_STMT : 0;
   unsigned Isa = 0;
+  unsigned Discriminator = 0;
   MCSymbol *LastLabel = NULL;
 
   // Loop through each MCLineEntry and encode the dwarf line number table.
@@ -154,6 +155,15 @@
       MCOS->EmitIntValue(dwarf::DW_LNS_set_column, 1);
       MCOS->EmitULEB128IntValue(Column);
     }
+    if (Discriminator != it->getDiscriminator()) {
+      Discriminator = it->getDiscriminator();
+      unsigned Size =
+          MCOS->getContext().getAsmInfo()->getULEB128Size(Discriminator);
+      MCOS->EmitIntValue(dwarf::DW_LNS_extended_op, 1);
+      MCOS->EmitULEB128IntValue(Size + 1);
+      MCOS->EmitIntValue(dwarf::DW_LNE_set_discriminator, 1);
+      MCOS->EmitULEB128IntValue(Discriminator);
+    }
     if (Isa != it->getIsa()) {
       Isa = it->getIsa();
       MCOS->EmitIntValue(dwarf::DW_LNS_set_isa, 1);
Index: test/DebugInfo/X86/ending-run.ll
===================================================================
--- test/DebugInfo/X86/ending-run.ll
+++ test/DebugInfo/X86/ending-run.ll
@@ -4,9 +4,9 @@
 ; Check that the line table starts at 7, not 4, but that the first
 ; statement isn't until line 8.
 
-; CHECK-NOT: 0x0000000000000000      7      0      1   0  is_stmt
+; CHECK-NOT: 0x0000000000000000      7      0      1   0  0  is_stmt
 ; CHECK: 0x0000000000000000      7      0      1   0
-; CHECK: 0x0000000000000004      8     18      1   0  is_stmt prologue_end
+; CHECK: 0x0000000000000004      8     18      1   0  0  is_stmt prologue_end
 
 define i32 @callee(i32 %x) nounwind uwtable ssp {
 entry:
Index: test/DebugInfo/X86/line-info.ll
===================================================================
--- test/DebugInfo/X86/line-info.ll
+++ test/DebugInfo/X86/line-info.ll
@@ -2,7 +2,7 @@
 ; RUN: llvm-dwarfdump %t | FileCheck %s
 
 ; CHECK: [[FILEID:[0-9]+]]]{{.*}}list0.h
-; CHECK: [[FILEID]]      0      1   0  is_stmt{{$}}
+; CHECK: [[FILEID]]      0      1   0  0 is_stmt{{$}}
 
 ; IR generated from clang -g -emit-llvm with the following source:
 ; list0.h:
Index: test/MC/ELF/discriminator.s
===================================================================
--- /dev/null
+++ test/MC/ELF/discriminator.s
@@ -0,0 +1,20 @@
+# RUN: llvm-mc -g -triple i386-unknown-unknown %s -filetype=obj -o - | llvm-readobj -r | FileCheck %s
+# RUN: llvm-mc -g -triple i386-unknown-unknown %s -filetype=obj -o - | llvm-dwarfdump -debug-dump=line - | FileCheck %s -check-prefix=DWARF-DUMP
+
+    .text
+    .globl foo
+    .type foo, @function
+    .align 4
+foo:
+    .loc 1 2 discriminator 1
+    ret
+    .size foo, .-foo
+
+# CHECK:      Relocations [
+# CHECK:        Section ({{[^ ]+}}) .rel.debug_line {
+# CHECK-NEXT:     0x5B R_386_32 .text 0x0
+# CHECK-NEXT:   }
+
+# DWARF-DUMP: Address            Line   Column File   ISA Discriminator Flags
+# DWARF-DUMP: ------------------ ------ ------ ------ --- ------------- -------------
+# DWARF-DUMP: 0x0000000000000000      2      0      1   0             1  is_stmt
Index: test/MC/MachO/gen-dwarf-cpp.s
===================================================================
--- test/MC/MachO/gen-dwarf-cpp.s
+++ test/MC/MachO/gen-dwarf-cpp.s
@@ -17,6 +17,6 @@
 // CHECK: file_names[  2]    0 0x00000000 0x00000000 t.s
 
 // We check that the source line number 100 is picked up before the "movl"
-// CHECK: Address            Line   Column File   ISA Flags
-// CHECK: ------------------ ------ ------ ------ --- -------------
-// CHECK: 0x0000000000000000    102      0      2   0  is_stmt
+// CHECK: Address            Line   Column File   ISA Discriminator Flags
+// CHECK: ------------------ ------ ------ ------ --- ------------- -------------
+// CHECK: 0x0000000000000000    102      0      2   0             0  is_stmt
Index: test/MC/MachO/gen-dwarf.s
===================================================================
--- test/MC/MachO/gen-dwarf.s
+++ test/MC/MachO/gen-dwarf.s
@@ -113,10 +113,10 @@
 // CHECK:                 ---- ---------- ---------- ---------------------------
 // CHECK: file_names[  1]    1 0x00000000 0x00000000 gen-dwarf.s
 
-// CHECK: Address            Line   Column File   ISA Flags
-// CHECK: ------------------ ------ ------ ------ --- -------------
-// CHECK: 0x0000000000000000      6      0      1   0  is_stmt
-// CHECK: 0x0000000000000005      7      0      1   0  is_stmt
-// CHECK: 0x0000000000000006      8      0      1   0  is_stmt
-// CHECK: 0x0000000000000007     11      0      1   0  is_stmt
-// CHECK: 0x0000000000000008     11      0      1   0  is_stmt end_sequence
+// CHECK: Address            Line   Column File   ISA Discriminator Flags
+// CHECK: ------------------ ------ ------ ------ --- ------------- -------------
+// CHECK: 0x0000000000000000      6      0      1   0             0  is_stmt
+// CHECK: 0x0000000000000005      7      0      1   0             0  is_stmt
+// CHECK: 0x0000000000000006      8      0      1   0             0  is_stmt
+// CHECK: 0x0000000000000007     11      0      1   0             0  is_stmt
+// CHECK: 0x0000000000000008     11      0      1   0             0  is_stmt end_sequence
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D2794.1.patch
Type: text/x-patch
Size: 7489 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140213/68ebf917/attachment.bin>


More information about the llvm-commits mailing list