Debug Info: for static member variables, add AT_MIPS_linkage_name to the
authorManman Ren <mren@apple.com>
Wed, 27 Feb 2013 00:02:32 +0000 (00:02 +0000)
committerManman Ren <mren@apple.com>
Wed, 27 Feb 2013 00:02:32 +0000 (00:02 +0000)
definition DIE, to make old GDB happy.

We have a regression for old GDB when Clang uses DW_TAG_member to declare
static members inside a class, instead of DW_TAG_variable. This patch will fix
this regression.

rdar://problem/13291234

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

lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
test/DebugInfo/X86/debug-info-static-member.ll

index 93b00fb52298a548348ab851cac9b1b2d6e2f84f..59e433b70b12de0a1a13b773986a4940af284254 100644 (file)
@@ -1348,9 +1348,15 @@ void CompileUnit::createGlobalVariableDIE(const MDNode *N) {
     }
     // Add linkage name.
     StringRef LinkageName = GV.getLinkageName();
-    if (!LinkageName.empty() && isGlobalVariable)
+    if (!LinkageName.empty() && isGlobalVariable) {
       addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
                 getRealLinkageName(LinkageName));
+      // To make old GDB happy, for static member variables, we add
+      // AT_MIPS_linkage_name to the definition DIE as well.
+      if (IsStaticMember && VariableSpecDIE)
+        addString(VariableSpecDIE, dwarf::DW_AT_MIPS_linkage_name,
+                  getRealLinkageName(LinkageName));
+    }
   } else if (const ConstantInt *CI =
              dyn_cast_or_null<ConstantInt>(GV.getConstant())) {
     // AT_const_value was added when the static memeber was created. To avoid
index d7a6578ff703304847b7364f6f2824ab68851dc7..228507956a7f13c22de843c7ec823c6382c5d470 100644 (file)
@@ -131,12 +131,15 @@ declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone
 ; PRESENT:      DW_TAG_variable
 ; PRESENT-NEXT: DW_AT_specification {{.*}} {0x[[DECL_A]]}
 ; PRESENT-NEXT: DW_AT_location
+; PRESENT-NEXT: DW_AT_MIPS_linkage_name {{.*}} "_ZN1C1aE"
 ; PRESENT:      DW_TAG_variable
 ; PRESENT-NEXT: DW_AT_specification {{.*}} {0x[[DECL_B]]}
 ; PRESENT-NEXT: DW_AT_location
+; PRESENT-NEXT: DW_AT_MIPS_linkage_name {{.*}} "_ZN1C1bE"
 ; PRESENT:      DW_TAG_variable
 ; PRESENT-NEXT: DW_AT_specification {{.*}} {0x[[DECL_C]]}
 ; PRESENT-NEXT: DW_AT_location
+; PRESENT-NEXT: DW_AT_MIPS_linkage_name {{.*}} "_ZN1C1cE"
 
 ; ABSENT verifies that static member declarations do not have either
 ; DW_AT_location or DW_AT_data_member_location; also, variables do not