Revert "Debug Info: Represent local anonymous unions as anonymous unions"
authorAdrian Prantl <aprantl@apple.com>
Wed, 29 Apr 2015 15:05:50 +0000 (15:05 +0000)
committerAdrian Prantl <aprantl@apple.com>
Wed, 29 Apr 2015 15:05:50 +0000 (15:05 +0000)
This reverts commit r236059 as it breaks the gdb buildbot.

llvm-svn: 236110

clang/lib/CodeGen/CGDebugInfo.cpp
clang/test/CodeGenCXX/debug-info-anon-union-vars.cpp

index 8118a9d..fd45f62 100644 (file)
@@ -2835,6 +2835,31 @@ void CGDebugInfo::EmitDeclare(const VarDecl *VD, llvm::dwarf::Tag Tag,
       return;
     } else if (isa<VariableArrayType>(VD->getType()))
       Expr.push_back(llvm::dwarf::DW_OP_deref);
+  } else if (const RecordType *RT = dyn_cast<RecordType>(VD->getType())) {
+    // If VD is an anonymous union then Storage represents value for
+    // all union fields.
+    const RecordDecl *RD = cast<RecordDecl>(RT->getDecl());
+    if (RD->isUnion() && RD->isAnonymousStructOrUnion()) {
+      for (const auto *Field : RD->fields()) {
+        llvm::MDType *FieldTy = getOrCreateType(Field->getType(), Unit);
+        StringRef FieldName = Field->getName();
+
+        // Ignore unnamed fields. Do not ignore unnamed records.
+        if (FieldName.empty() && !isa<RecordType>(Field->getType()))
+          continue;
+
+        // Use VarDecl's Tag, Scope and Line number.
+        auto *D = DBuilder.createLocalVariable(
+            Tag, Scope, FieldName, Unit, Line, FieldTy,
+            CGM.getLangOpts().Optimize, Flags, ArgNo);
+
+        // Insert an llvm.dbg.declare into the current block.
+        DBuilder.insertDeclare(Storage, D, DBuilder.createExpression(Expr),
+                               llvm::DebugLoc::get(Line, Column, Scope),
+                               Builder.GetInsertBlock());
+      }
+      return;
+    }
   }
 
   // Create the descriptor for the variable.
index 318c9c9..d75ce69 100644 (file)
@@ -21,26 +21,8 @@ int test_it() {
   return (c == 1);
 }
 
-// This is not necessary (and actually harmful because it breaks IR assumptions)
-// for local variables.
-void foo() {
-  union {
-    int i;
-    char c;
-  };
-  i = 8;
-}
-
 // CHECK: [[FILE:.*]] = !MDFile(filename: "{{.*}}debug-info-anon-union-vars.cpp",
 // CHECK: !MDGlobalVariable(name: "c",{{.*}} file: [[FILE]], line: 6,{{.*}} isLocal: true, isDefinition: true
 // CHECK: !MDGlobalVariable(name: "d",{{.*}} file: [[FILE]], line: 6,{{.*}} isLocal: true, isDefinition: true
 // CHECK: !MDGlobalVariable(name: "a",{{.*}} file: [[FILE]], line: 6,{{.*}} isLocal: true, isDefinition: true
 // CHECK: !MDGlobalVariable(name: "b",{{.*}} file: [[FILE]], line: 6,{{.*}} isLocal: true, isDefinition: true
-// CHECK: !MDLocalVariable(
-// CHECK-NOT: name:
-// CHECK: type: ![[UNION:[0-9]+]]
-// CHECK: ![[UNION]] = !MDCompositeType(tag: DW_TAG_union_type,
-// CHECK-NOT: name:
-// CHECK: elements
-// CHECK: !MDDerivedType(tag: DW_TAG_member, name: "i", scope: ![[UNION]],
-// CHECK: !MDDerivedType(tag: DW_TAG_member, name: "c", scope: ![[UNION]],