[llvm-commits] [llvm] r147860 - in /llvm/trunk: lib/MC/MCDwarf.cpp test/MC/MachO/gen-dwarf.s

Kevin Enderby enderby at apple.com
Tue Jan 10 09:52:30 PST 2012


Author: enderby
Date: Tue Jan 10 11:52:29 2012
New Revision: 147860

URL: http://llvm.org/viewvc/llvm-project?rev=147860&view=rev
Log:
Various crash reporting tools have a problem with the dwarf generated for
assembly source when it generates the TAG_subprogram dwarf debug info for
the labels that have nothing between them as in this bit of assembly source:

% cat ZeroLength.s 
_func1:
_func2:
 nop

One solution would be to not emit the subsequent labels with the same address
and use the next label with a different address or the end of the section for
the AT_high_pc value of the TAG_subprogram.

Turns out in llvm-mc it is not possible in all cases to determine of two
symbols have the same value at the point we put out the TAG_subprogram dwarf
debug info.

So we will have llvm-mc instead of putting out TAG_subprogram's put out
DW_TAG_label's.  And the DW_TAG_label does not have a AT_high_pc value which
avoids the problem.

This commit is only the functional change to make the diffs clear as to what is
really being changed.  The next commit will be to clean up the names of such
things like MCGenDwarfSubprogramEntry to something like MCGenDwarfLabelEntry.

rdar://10666925

Modified:
    llvm/trunk/lib/MC/MCDwarf.cpp
    llvm/trunk/test/MC/MachO/gen-dwarf.s

Modified: llvm/trunk/lib/MC/MCDwarf.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCDwarf.cpp?rev=147860&r1=147859&r2=147860&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCDwarf.cpp (original)
+++ llvm/trunk/lib/MC/MCDwarf.cpp Tue Jan 10 11:52:29 2012
@@ -454,15 +454,14 @@
   EmitAbbrev(MCOS, dwarf::DW_AT_language, dwarf::DW_FORM_data2);
   EmitAbbrev(MCOS, 0, 0);
 
-  // DW_TAG_subprogram DIE abbrev (2).
+  // DW_TAG_label DIE abbrev (2).
   MCOS->EmitULEB128IntValue(2);
-  MCOS->EmitULEB128IntValue(dwarf::DW_TAG_subprogram);
+  MCOS->EmitULEB128IntValue(dwarf::DW_TAG_label);
   MCOS->EmitIntValue(dwarf::DW_CHILDREN_yes, 1);
   EmitAbbrev(MCOS, dwarf::DW_AT_name, dwarf::DW_FORM_string);
   EmitAbbrev(MCOS, dwarf::DW_AT_decl_file, dwarf::DW_FORM_data4);
   EmitAbbrev(MCOS, dwarf::DW_AT_decl_line, dwarf::DW_FORM_data4);
   EmitAbbrev(MCOS, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr);
-  EmitAbbrev(MCOS, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr);
   EmitAbbrev(MCOS, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag);
   EmitAbbrev(MCOS, 0, 0);
 
@@ -545,7 +544,7 @@
 
 // When generating dwarf for assembly source files this emits the data for
 // .debug_info section which contains three parts.  The header, the compile_unit
-// DIE and a list of subprogram DIEs.
+// DIE and a list of label DIEs.
 static void EmitGenDwarfInfo(MCStreamer *MCOS) {
   MCContext &context = MCOS->getContext();
 
@@ -630,7 +629,7 @@
   // draft has no standard code for assembler.
   MCOS->EmitIntValue(dwarf::DW_LANG_Mips_Assembler, 2);
 
-  // Third part: the list of subprogram DIEs.
+  // Third part: the list of label DIEs.
 
   // Loop on saved info for dwarf subprograms and create the DIEs for them.
   const std::vector<const MCGenDwarfSubprogramEntry *> &Entries =
@@ -640,7 +639,7 @@
        ++it) {
     const MCGenDwarfSubprogramEntry *Entry = *it;
 
-    // The DW_TAG_subprogram DIE abbrev (2).
+    // The DW_TAG_label DIE abbrev (2).
     MCOS->EmitULEB128IntValue(2);
 
     // AT_name, of the label without any leading underbar.
@@ -658,17 +657,6 @@
                                              MCSymbolRefExpr::VK_None, context);
     MCOS->EmitAbsValue(AT_low_pc, AddrSize);
 
-    // AT_high_pc, end address which is the next label or end of the section.
-    std::vector<const MCGenDwarfSubprogramEntry *>::const_iterator next = it+1;
-    if (next != Entries.end()){
-      const MCGenDwarfSubprogramEntry *NextEntry = *next;
-      const MCExpr *AT_high_pc = MCSymbolRefExpr::Create(NextEntry->getLabel(),
-                                             MCSymbolRefExpr::VK_None, context);
-      MCOS->EmitAbsValue(AT_high_pc, AddrSize);
-    } else {
-      MCOS->EmitAbsValue(End, AddrSize);
-    }
-
     // DW_AT_prototyped, a one byte flag value of 0 saying we have no prototype.
     MCOS->EmitIntValue(0, 1);
 

Modified: llvm/trunk/test/MC/MachO/gen-dwarf.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/MachO/gen-dwarf.s?rev=147860&r1=147859&r2=147860&view=diff
==============================================================================
--- llvm/trunk/test/MC/MachO/gen-dwarf.s (original)
+++ llvm/trunk/test/MC/MachO/gen-dwarf.s Tue Jan 10 11:52:29 2012
@@ -7,6 +7,7 @@
 L1:	leave
 	ret
 _foo:
+_baz:
 	nop
 .data
 _x:	.long 1
@@ -24,12 +25,11 @@
 // CHECK: 	DW_AT_producer	DW_FORM_string
 // CHECK: 	DW_AT_language	DW_FORM_data2
 
-// CHECK: [2] DW_TAG_subprogram	DW_CHILDREN_yes
+// CHECK: [2] DW_TAG_label	DW_CHILDREN_yes
 // CHECK: 	DW_AT_name	DW_FORM_string
 // CHECK: 	DW_AT_decl_file	DW_FORM_data4
 // CHECK: 	DW_AT_decl_line	DW_FORM_data4
 // CHECK: 	DW_AT_low_pc	DW_FORM_addr
-// CHECK: 	DW_AT_high_pc	DW_FORM_addr
 // CHECK: 	DW_AT_prototyped	DW_FORM_flag
 
 // CHECK: [3] DW_TAG_unspecified_parameters	DW_CHILDREN_no
@@ -48,24 +48,33 @@
 // CHECK:    DW_AT_producer [DW_FORM_string]	("llvm-mc (based on {{.*}})")
 // CHECK:    DW_AT_language [DW_FORM_data2]	(0x8001)
 
-// CHECK:    DW_TAG_subprogram [2] *
+// CHECK:    DW_TAG_label [2] *
 // CHECK:      DW_AT_name [DW_FORM_string]	("bar")
 // CHECK:      DW_AT_decl_file [DW_FORM_data4]	(0x00000001)
 // CHECK:      DW_AT_decl_line [DW_FORM_data4]	(0x00000005)
 // CHECK:      DW_AT_low_pc [DW_FORM_addr]	(0x0000000000000000)
-// CHECK:      DW_AT_high_pc [DW_FORM_addr]	(0x0000000000000007)
 // CHECK:      DW_AT_prototyped [DW_FORM_flag]	(0x00)
 
 // CHECK:      DW_TAG_unspecified_parameters [3]  
 
 // CHECK:      NULL
 
-// CHECK:    DW_TAG_subprogram [2] *
+// CHECK:    DW_TAG_label [2] *
 // CHECK:      DW_AT_name [DW_FORM_string]	("foo")
 // CHECK:      DW_AT_decl_file [DW_FORM_data4]	(0x00000001)
 // CHECK:      DW_AT_decl_line [DW_FORM_data4]	(0x00000009)
 // CHECK:      DW_AT_low_pc [DW_FORM_addr]	(0x0000000000000007)
-// CHECK:      DW_AT_high_pc [DW_FORM_addr]	(0x0000000000000008)
+// CHECK:      DW_AT_prototyped [DW_FORM_flag]	(0x00)
+
+// CHECK:      DW_TAG_unspecified_parameters [3]  
+
+// CHECK:      NULL
+
+// CHECK:    DW_TAG_label [2] *
+// CHECK:      DW_AT_name [DW_FORM_string]	("baz")
+// CHECK:      DW_AT_decl_file [DW_FORM_data4]	(0x00000001)
+// CHECK:      DW_AT_decl_line [DW_FORM_data4]	(0x0000000a)
+// CHECK:      DW_AT_low_pc [DW_FORM_addr]	(0x0000000000000007)
 // CHECK:      DW_AT_prototyped [DW_FORM_flag]	(0x00)
 
 // CHECK:      DW_TAG_unspecified_parameters [3]  
@@ -109,5 +118,5 @@
 // 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     10      0      1   0  is_stmt
-// CHECK: 0x0000000000000008     10      0      1   0  is_stmt end_sequence
+// CHECK: 0x0000000000000007     11      0      1   0  is_stmt
+// CHECK: 0x0000000000000008     11      0      1   0  is_stmt end_sequence





More information about the llvm-commits mailing list