diff options
author | Devang Patel <dpatel@apple.com> | 2010-10-12 23:24:54 +0000 |
---|---|---|
committer | Devang Patel <dpatel@apple.com> | 2010-10-12 23:24:54 +0000 |
commit | cebbedd237d4560099de3b5b7f7c03a1689b700e (patch) | |
tree | f495d7cf04e55765e1fb0cb5d2fbdc990f8ef45c /lib/CodeGen/CGDebugInfo.cpp | |
parent | a2c21a2ddd84a216bad48a005ccec12c7cfd1549 (diff) |
Fix debug info for anon union.
This is tested by anon-union.exp.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@116372 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGDebugInfo.cpp')
-rw-r--r-- | lib/CodeGen/CGDebugInfo.cpp | 57 |
1 files changed, 45 insertions, 12 deletions
diff --git a/lib/CodeGen/CGDebugInfo.cpp b/lib/CodeGen/CGDebugInfo.cpp index a07b43a0b5..404c010c77 100644 --- a/lib/CodeGen/CGDebugInfo.cpp +++ b/lib/CodeGen/CGDebugInfo.cpp @@ -144,7 +144,6 @@ CGDebugInfo::getClassName(RecordDecl *RD) { char *StrPtr = DebugInfoNames.Allocate<char>(Buffer.length()); memcpy(StrPtr, Buffer.data(), Buffer.length()); return llvm::StringRef(StrPtr, Buffer.length()); - } /// getOrCreateFile - Get the file debug info descriptor for the input location. @@ -1793,18 +1792,52 @@ void CGDebugInfo::EmitDeclare(const VarDecl *VD, unsigned Tag, unsigned Flags = 0; if (VD->isImplicit()) Flags |= llvm::DIDescriptor::FlagArtificial; - // Create the descriptor for the variable. - llvm::DIVariable D = - DebugFactory.CreateVariable(Tag, llvm::DIDescriptor(RegionStack.back()), - VD->getName(), Unit, Line, Ty, - CGM.getLangOptions().Optimize, Flags); - - // Insert an llvm.dbg.declare into the current block. - llvm::Instruction *Call = - DebugFactory.InsertDeclare(Storage, D, Builder.GetInsertBlock()); - llvm::MDNode *Scope = RegionStack.back(); - Call->setDebugLoc(llvm::DebugLoc::get(Line, Column, Scope)); + + llvm::StringRef Name = VD->getName(); + if (!Name.empty()) { + // Create the descriptor for the variable. + llvm::DIVariable D = + DebugFactory.CreateVariable(Tag, llvm::DIDescriptor(Scope), + Name, Unit, Line, Ty, + CGM.getLangOptions().Optimize, Flags); + + // Insert an llvm.dbg.declare into the current block. + llvm::Instruction *Call = + DebugFactory.InsertDeclare(Storage, D, Builder.GetInsertBlock()); + + Call->setDebugLoc(llvm::DebugLoc::get(Line, Column, Scope)); + } + + // If VD is an anonymous union then Storage represents value for + // all union fields. + if (const RecordType *RT = dyn_cast<RecordType>(VD->getType())) + if (const RecordDecl *RD = dyn_cast<RecordDecl>(RT->getDecl())) + if (RD->isUnion()) { + for (RecordDecl::field_iterator I = RD->field_begin(), + E = RD->field_end(); + I != E; ++I) { + FieldDecl *Field = *I; + llvm::DIType FieldTy = getOrCreateType(Field->getType(), Unit); + llvm::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. + llvm::DIVariable D = + DebugFactory.CreateVariable(Tag, llvm::DIDescriptor(Scope), + FieldName, Unit, Line, FieldTy, + CGM.getLangOptions().Optimize, Flags); + + // Insert an llvm.dbg.declare into the current block. + llvm::Instruction *Call = + DebugFactory.InsertDeclare(Storage, D, Builder.GetInsertBlock()); + + Call->setDebugLoc(llvm::DebugLoc::get(Line, Column, Scope)); + } + } } /// EmitDeclare - Emit local variable declaration debug info. |