<div dir="ltr">Thanks! I updated the comments a bit after.<div><br></div><div>-eric</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Feb 27, 2013 at 3:21 PM, Manman Ren <span dir="ltr"><<a href="mailto:mren@apple.com" target="_blank">mren@apple.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: mren<br>
Date: Wed Feb 27 17:21:02 2013<br>
New Revision: 176220<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=176220&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=176220&view=rev</a><br>
Log:<br>
Debug Info: for static member variables, always put AT_MIPS_linkage_name to the<br>
definition DIE (TAG_variable), and put AT_MIPS_linkage_name to TAG_member when<br>
DarwinGDBCompat is true.<br>
<br>
Darwin GDB needs AT_MIPS_linkage_name at both places to work.<br>
<br>
Follow-up patch to r176143.<br>
rdar://problem/13291234<br>
<br>
Modified:<br>
    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp<br>
    llvm/trunk/test/DebugInfo/X86/debug-info-static-member.ll<br>
<br>
Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp?rev=176220&r1=176219&r2=176220&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp?rev=176220&r1=176219&r2=176220&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp Wed Feb 27 17:21:02 2013<br>
@@ -1349,12 +1349,19 @@ void CompileUnit::createGlobalVariableDI<br>
     // Add linkage name.<br>
     StringRef LinkageName = GV.getLinkageName();<br>
     if (!LinkageName.empty() && isGlobalVariable) {<br>
-      addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name,<br>
+      // From dwarf-4: DIE to which DW_AT_linkage_name may apply include:<br>
+      // TAG_commono_block, TAG_constant, TAG_entry_point, TAG_subporgram and<br>
+      // TAG_variable. For static member variables, gcc 4.7 puts<br>
+      // MIPS_linkage_name on the definition DIE only, but Darwin gdb needs<br>
+      // MIPS_linkage_name at both places.<br>
+      // Per discussion with Eric, for static member variables, we put<br>
+      // MIPS_linkage_name on the definition DIE (TAG_variable) and conditionaly<br>
+      // put MIPS_linkage_name on TAG_member when DarwinGDBCompat is on.<br>
+      addString(IsStaticMember && VariableSpecDIE ?<br>
+                VariableSpecDIE : VariableDIE, dwarf::DW_AT_MIPS_linkage_name,<br>
                 getRealLinkageName(LinkageName));<br>
-      // To make old GDB happy, for static member variables, we add<br>
-      // AT_MIPS_linkage_name to the definition DIE as well.<br>
-      if (IsStaticMember && VariableSpecDIE)<br>
-        addString(VariableSpecDIE, dwarf::DW_AT_MIPS_linkage_name,<br>
+      if (IsStaticMember && VariableSpecDIE && DD->useDarwinGDBCompat())<br>
+        addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name,<br>
                   getRealLinkageName(LinkageName));<br>
     }<br>
   } else if (const ConstantInt *CI =<br>
<br>
Modified: llvm/trunk/test/DebugInfo/X86/debug-info-static-member.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/debug-info-static-member.ll?rev=176220&r1=176219&r2=176220&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/debug-info-static-member.ll?rev=176220&r1=176219&r2=176220&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/test/DebugInfo/X86/debug-info-static-member.ll (original)<br>
+++ llvm/trunk/test/DebugInfo/X86/debug-info-static-member.ll Wed Feb 27 17:21:02 2013<br>
@@ -1,6 +1,9 @@<br>
 ; RUN: llc %s -o %t -filetype=obj -O0 -mtriple=x86_64-unknown-linux-gnu<br>
 ; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s -check-prefix=PRESENT<br>
 ; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s -check-prefix=ABSENT<br>
+; RUN: llc %s -o %t -filetype=obj -O0 -mtriple=x86_64-apple-darwin<br>
+; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s -check-prefix=DARWINP<br>
+; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s -check-prefix=DARWINA<br>
 ; Verify that attributes we do want are PRESENT;<br>
 ; verify that attributes we don't want are ABSENT.<br>
 ; It's a lot easier to do this in two passes than in one.<br>
@@ -97,7 +100,6 @@ declare void @llvm.dbg.declare(metadata,<br>
 ; PRESENT:      DW_AT_external<br>
 ; PRESENT:      DW_AT_declaration<br>
 ; PRESENT:      DW_AT_accessibility [DW_FORM_data1]   (0x03)<br>
-; PRESENT:      DW_AT_MIPS_linkage_name {{.*}} "_ZN1C1aE"<br>
 ; PRESENT:      DW_TAG_member<br>
 ; PRESENT-NEXT: DW_AT_name {{.*}} "const_a"<br>
 ; PRESENT:      DW_AT_external<br>
@@ -107,7 +109,6 @@ declare void @llvm.dbg.declare(metadata,<br>
 ; PRESENT:      0x[[DECL_B:[0-9a-f]+]]: DW_TAG_member<br>
 ; PRESENT-NEXT: DW_AT_name {{.*}} "b"<br>
 ; PRESENT:      DW_AT_accessibility [DW_FORM_data1]   (0x02)<br>
-; PRESENT:      DW_AT_MIPS_linkage_name {{.*}} "_ZN1C1bE"<br>
 ; PRESENT:      DW_TAG_member<br>
 ; PRESENT-NEXT: DW_AT_name {{.*}} "const_b"<br>
 ; PRESENT:      DW_AT_accessibility [DW_FORM_data1]   (0x02)<br>
@@ -115,7 +116,6 @@ declare void @llvm.dbg.declare(metadata,<br>
 ; PRESENT:      0x[[DECL_C:[0-9a-f]+]]: DW_TAG_member<br>
 ; PRESENT-NEXT: DW_AT_name {{.*}} "c"<br>
 ; PRESENT:      DW_AT_accessibility [DW_FORM_data1]   (0x01)<br>
-; PRESENT:      DW_AT_MIPS_linkage_name {{.*}} "_ZN1C1cE"<br>
 ; PRESENT:      DW_TAG_member<br>
 ; PRESENT-NEXT: DW_AT_name {{.*}} "const_c"<br>
 ; PRESENT:      DW_AT_accessibility [DW_FORM_data1]   (0x01)<br>
@@ -141,6 +141,59 @@ declare void @llvm.dbg.declare(metadata,<br>
 ; PRESENT-NEXT: DW_AT_location<br>
 ; PRESENT-NEXT: DW_AT_MIPS_linkage_name {{.*}} "_ZN1C1cE"<br>
<br>
+; For Darwin gdb:<br>
+; DARWINP:      .debug_info contents:<br>
+; DARWINP:      DW_TAG_class_type<br>
+; DARWINP-NEXT: DW_AT_name {{.*}} "C"<br>
+; DARWINP:      0x[[DECL_A:[0-9a-f]+]]: DW_TAG_member<br>
+; DARWINP-NEXT: DW_AT_name {{.*}} "a"<br>
+; DARWINP:      DW_AT_external<br>
+; DARWINP:      DW_AT_declaration<br>
+; DARWINP:      DW_AT_accessibility [DW_FORM_data1]   (0x03)<br>
+; DARWINP:      DW_AT_MIPS_linkage_name {{.*}} "_ZN1C1aE"<br>
+; DARWINP:      DW_TAG_member<br>
+; DARWINP-NEXT: DW_AT_name {{.*}} "const_a"<br>
+; DARWINP:      DW_AT_external<br>
+; DARWINP:      DW_AT_declaration<br>
+; DARWINP:      DW_AT_accessibility [DW_FORM_data1]   (0x03)<br>
+; DARWINP:      DW_AT_const_value {{.*}} (1)<br>
+; DARWINP:      0x[[DECL_B:[0-9a-f]+]]: DW_TAG_member<br>
+; DARWINP-NEXT: DW_AT_name {{.*}} "b"<br>
+; DARWINP:      DW_AT_accessibility [DW_FORM_data1]   (0x02)<br>
+; DARWINP:      DW_AT_MIPS_linkage_name {{.*}} "_ZN1C1bE"<br>
+; DARWINP:      DW_TAG_member<br>
+; DARWINP-NEXT: DW_AT_name {{.*}} "const_b"<br>
+; DARWINP:      DW_AT_accessibility [DW_FORM_data1]   (0x02)<br>
+; DARWINP:      DW_AT_const_value {{.*}} (0x4048f5c3)<br>
+; DARWINP:      0x[[DECL_C:[0-9a-f]+]]: DW_TAG_member<br>
+; DARWINP-NEXT: DW_AT_name {{.*}} "c"<br>
+; DARWINP:      DW_AT_accessibility [DW_FORM_data1]   (0x01)<br>
+; DARWINP:      DW_AT_MIPS_linkage_name {{.*}} "_ZN1C1cE"<br>
+; DARWINP:      DW_TAG_member<br>
+; DARWINP-NEXT: DW_AT_name {{.*}} "const_c"<br>
+; DARWINP:      DW_AT_accessibility [DW_FORM_data1]   (0x01)<br>
+; DARWINP:      DW_AT_const_value {{.*}} (0x00000012)<br>
+; While we're here, a normal member has data_member_location and<br>
+; accessibility attributes.<br>
+; DARWINP:      DW_TAG_member<br>
+; DARWINP-NEXT: DW_AT_name {{.*}} "d"<br>
+; DARWINP:      DW_AT_data_member_location<br>
+; DARWINP:      DW_AT_accessibility [DW_FORM_data1]   (0x01)<br>
+; DARWINP:      NULL<br>
+; Definitions point back to their declarations, and have a location.<br>
+; DARWINP:      DW_TAG_variable<br>
+; DARWINP-NEXT: DW_AT_specification {{.*}} {0x[[DECL_A]]}<br>
+; DARWINP-NEXT: DW_AT_location<br>
+; DARWINP-NEXT: DW_AT_MIPS_linkage_name {{.*}} "_ZN1C1aE"<br>
+; DARWINP:      DW_TAG_variable<br>
+; DARWINP-NEXT: DW_AT_specification {{.*}} {0x[[DECL_B]]}<br>
+; DARWINP-NEXT: DW_AT_location<br>
+; DARWINP-NEXT: DW_AT_MIPS_linkage_name {{.*}} "_ZN1C1bE"<br>
+; DARWINP:      DW_TAG_variable<br>
+; DARWINP-NEXT: DW_AT_specification {{.*}} {0x[[DECL_C]]}<br>
+; DARWINP-NEXT: DW_AT_location<br>
+; DARWINP-NEXT: DW_AT_MIPS_linkage_name {{.*}} "_ZN1C1cE"<br>
+<br>
 ; ABSENT verifies that static member declarations do not have either<br>
 ; DW_AT_location or DW_AT_data_member_location; also, variables do not<br>
 ; have DW_AT_const_value and constants do not have DW_AT_MIPS_linkage_name.<br>
@@ -172,3 +225,32 @@ declare void @llvm.dbg.declare(metadata,<br>
 ; ABSENT-NOT:  DW_AT_const_value<br>
 ; ABSENT-NOT:  DW_AT_location<br>
 ; ABSENT:      NULL<br>
+<br>
+; For Darwin gdb:<br>
+; DARWINA:      .debug_info contents:<br>
+; DARWINA:      DW_TAG_member<br>
+; DARWINA:      DW_AT_name {{.*}} "a"<br>
+; DARWINA-NOT:  DW_AT_const_value<br>
+; DARWINA-NOT:  location<br>
+; DARWINA:      DW_AT_name {{.*}} "const_a"<br>
+; DARWINA-NOT:  DW_AT_MIPS_linkage_name<br>
+; DARWINA-NOT:  location<br>
+; DARWINA:      DW_AT_name {{.*}} "b"<br>
+; DARWINA-NOT:  DW_AT_const_value<br>
+; DARWINA-NOT:  location<br>
+; DARWINA:      DW_AT_name {{.*}} "const_b"<br>
+; DARWINA-NOT:  DW_AT_MIPS_linkage_name<br>
+; DARWINA-NOT:  location<br>
+; DARWINA:      DW_AT_name {{.*}} "c"<br>
+; DARWINA-NOT:  DW_AT_const_value<br>
+; DARWINA-NOT:  location<br>
+; DARWINA:      DW_AT_name {{.*}} "const_c"<br>
+; DARWINA-NOT:  DW_AT_MIPS_linkage_name<br>
+; DARWINA-NOT:  location<br>
+; While we're here, a normal member does not have a linkage name, constant<br>
+; value, or DW_AT_location.<br>
+; DARWINA:      DW_AT_name {{.*}} "d"<br>
+; DARWINA-NOT:  DW_AT_MIPS_linkage_name<br>
+; DARWINA-NOT:  DW_AT_const_value<br>
+; DARWINA-NOT:  DW_AT_location<br>
+; DARWINA:      NULL<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>