[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