diff options
author | Yunzhong Gao <Yunzhong_Gao@playstation.sony.com> | 2013-08-30 05:37:02 +0000 |
---|---|---|
committer | Yunzhong Gao <Yunzhong_Gao@playstation.sony.com> | 2013-08-30 05:37:02 +0000 |
commit | be8d7ba93a5e19017096faaf5df54335a6d52000 (patch) | |
tree | 2075bfb4188bd16bfa22392c4b4fab81f47bd777 /clang/lib/CodeGen/CGDebugInfo.cpp | |
parent | b7ecc3e6afefc521fb0aa1e48ff3e64e34a46b8e (diff) | |
download | bcm5719-llvm-be8d7ba93a5e19017096faaf5df54335a6d52000.tar.gz bcm5719-llvm-be8d7ba93a5e19017096faaf5df54335a6d52000.zip |
Fixing a bug where debug info for a local variable gets emitted at file scope.
The patch was discussed in Phabricator. See:
http://llvm-reviews.chandlerc.com/D1281
llvm-svn: 189649
Diffstat (limited to 'clang/lib/CodeGen/CGDebugInfo.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGDebugInfo.cpp | 60 |
1 files changed, 30 insertions, 30 deletions
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp index fe503982be3..89e20590255 100644 --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/lib/CodeGen/CGDebugInfo.cpp @@ -3142,14 +3142,31 @@ CGDebugInfo::getOrCreateStaticDataMemberDeclarationOrNull(const VarDecl *D) { } /// EmitGlobalVariable - Emit information about a global variable. -void CGDebugInfo::EmitGlobalVariable(llvm::GlobalVariable *Var, +/// \param VarOrInit either the global variable itself or the initializer +/// \param D the global declaration +void CGDebugInfo::EmitGlobalVariable(llvm::Value *VarOrInit, const VarDecl *D) { assert(DebugKind >= CodeGenOptions::LimitedDebugInfo); // Create global variable debug descriptor. llvm::DIFile Unit = getOrCreateFile(D->getLocation()); unsigned LineNo = getLineNumber(D->getLocation()); - - setLocation(D->getLocation()); + StringRef DeclName = D->getName(); + StringRef LinkageName; + bool IsLocalToUnit = true; + + // For deferred global variables, the current source location is usually + // where they are being referenced. Do not change the current source location + // to the place where they are declared, lest we get a bogus line table. + // FIXME: maybe we do not need to set the source location here at all. + if (llvm::GlobalVariable *Var = dyn_cast<llvm::GlobalVariable>(VarOrInit)) { + setLocation(D->getLocation()); + IsLocalToUnit = Var->hasInternalLinkage(); + if (D->getDeclContext() && !isa<FunctionDecl>(D->getDeclContext()) + && !isa<ObjCMethodDecl>(D->getDeclContext())) + LinkageName = Var->getName(); + if (LinkageName == DeclName) + LinkageName = StringRef(); + } QualType T = D->getType(); if (T->isIncompleteArrayType()) { @@ -3161,18 +3178,11 @@ void CGDebugInfo::EmitGlobalVariable(llvm::GlobalVariable *Var, T = CGM.getContext().getConstantArrayType(ET, ConstVal, ArrayType::Normal, 0); } - StringRef DeclName = D->getName(); - StringRef LinkageName; - if (D->getDeclContext() && !isa<FunctionDecl>(D->getDeclContext()) - && !isa<ObjCMethodDecl>(D->getDeclContext())) - LinkageName = Var->getName(); - if (LinkageName == DeclName) - LinkageName = StringRef(); llvm::DIDescriptor DContext = getContextDescriptor(dyn_cast<Decl>(D->getDeclContext())); llvm::DIGlobalVariable GV = DBuilder.createStaticVariable( DContext, DeclName, LinkageName, Unit, LineNo, getOrCreateType(T, Unit), - Var->hasInternalLinkage(), Var, + IsLocalToUnit, VarOrInit, getOrCreateStaticDataMemberDeclarationOrNull(D)); DeclCache.insert(std::make_pair(D->getCanonicalDecl(), llvm::WeakVH(GV))); } @@ -3203,26 +3213,16 @@ void CGDebugInfo::EmitGlobalVariable(llvm::GlobalVariable *Var, Var->hasInternalLinkage(), Var); } -/// EmitGlobalVariable - Emit global variable's debug info. -void CGDebugInfo::EmitGlobalVariable(const ValueDecl *VD, - llvm::Constant *Init) { +/// EmitEnumConstant - Emit debug info for an enumerator constant +void CGDebugInfo::EmitEnumConstant(const EnumConstantDecl *ECD) +{ assert(DebugKind >= CodeGenOptions::LimitedDebugInfo); - // Create the descriptor for the variable. - llvm::DIFile Unit = getOrCreateFile(VD->getLocation()); - StringRef Name = VD->getName(); - llvm::DIType Ty = getOrCreateType(VD->getType(), Unit); - if (const EnumConstantDecl *ECD = dyn_cast<EnumConstantDecl>(VD)) { - const EnumDecl *ED = cast<EnumDecl>(ECD->getDeclContext()); - assert(isa<EnumType>(ED->getTypeForDecl()) && "Enum without EnumType?"); - Ty = getOrCreateType(QualType(ED->getTypeForDecl(), 0), Unit); - } - // Do not use DIGlobalVariable for enums. - if (Ty.getTag() == llvm::dwarf::DW_TAG_enumeration_type) - return; - llvm::DIGlobalVariable GV = DBuilder.createStaticVariable( - Unit, Name, Name, Unit, getLineNumber(VD->getLocation()), Ty, true, Init, - getOrCreateStaticDataMemberDeclarationOrNull(cast<VarDecl>(VD))); - DeclCache.insert(std::make_pair(VD->getCanonicalDecl(), llvm::WeakVH(GV))); + llvm::DIFile Unit = getOrCreateFile(ECD->getLocation()); + llvm::DIType Ty = getOrCreateType(ECD->getType(), Unit); + + const EnumDecl *ED = cast<EnumDecl>(ECD->getDeclContext()); + assert(isa<EnumType>(ED->getTypeForDecl()) && "Enum without EnumType?"); + Ty = getOrCreateType(QualType(ED->getTypeForDecl(), 0), Unit); } llvm::DIScope CGDebugInfo::getCurrentContextDescriptor(const Decl *D) { |