From: David Blaikie Date: Sat, 2 Feb 2013 00:34:16 +0000 (+0000) Subject: Basics X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1513eb9284c23acfd19cf742b95996fbb11ca741;p=clang Basics git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@174246 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGDebugInfo.cpp b/lib/CodeGen/CGDebugInfo.cpp index 5e60bd8f66..6d61c52af5 100644 --- a/lib/CodeGen/CGDebugInfo.cpp +++ b/lib/CodeGen/CGDebugInfo.cpp @@ -111,6 +111,9 @@ llvm::DIDescriptor CGDebugInfo::getContextDescriptor(const Decl *Context) { return llvm::DIDescriptor(Ty); } } + + if (!LexicalBlockStack.empty()) + return llvm::DIDescriptor(LexicalBlockStack.back()); return TheCU; } @@ -2822,6 +2825,12 @@ void CGDebugInfo::EmitGlobalVariable(const ValueDecl *VD, getStaticDataMemberDeclaration(VD)); } +void CGDebugInfo::EmitUsingDirectiveDecl(const UsingDirectiveDecl &UD) { + SourceLocation Loc = UD.getNamespaceKeyLocation(); + llvm::DIFile Unit = getOrCreateFile(Loc); + DBuilder.createUsingDirective(getContextDescriptor(&UD), Unit, getLineNumber(Loc), getOrCreateNameSpace(UD.getNominatedNamespace())); +} + /// getOrCreateNamesSpace - Return namespace descriptor for the given /// namespace decl. llvm::DINameSpace diff --git a/lib/CodeGen/CGDebugInfo.h b/lib/CodeGen/CGDebugInfo.h index fbbee0b3d2..bcda906a02 100644 --- a/lib/CodeGen/CGDebugInfo.h +++ b/lib/CodeGen/CGDebugInfo.h @@ -34,6 +34,7 @@ namespace clang { class ObjCInterfaceDecl; class ClassTemplateSpecializationDecl; class GlobalDecl; + class UsingDirectiveDecl; namespace CodeGen { class CodeGenModule; @@ -247,6 +248,9 @@ public: /// EmitGlobalVariable - Emit global variable's debug info. void EmitGlobalVariable(const ValueDecl *VD, llvm::Constant *Init); + /// \brief Emit a C++ using directive. + void EmitUsingDirectiveDecl(const UsingDirectiveDecl &UD); + /// getOrCreateRecordType - Emit record type's standalone debug info. llvm::DIType getOrCreateRecordType(QualType Ty, SourceLocation L); diff --git a/lib/CodeGen/CGDecl.cpp b/lib/CodeGen/CGDecl.cpp index a43a38360b..75b45cc28b 100644 --- a/lib/CodeGen/CGDecl.cpp +++ b/lib/CodeGen/CGDecl.cpp @@ -78,14 +78,18 @@ void CodeGenFunction::EmitDecl(const Decl &D) { case Decl::CXXRecord: // struct/union/class X; [C++] case Decl::Using: // using X; [C++] case Decl::UsingShadow: - case Decl::UsingDirective: // using namespace X; [C++] case Decl::NamespaceAlias: case Decl::StaticAssert: // static_assert(X, ""); [C++0x] case Decl::Label: // __label__ x; case Decl::Import: // None of these decls require codegen support. return; - + case Decl::UsingDirective: { // using namespace X; [C++] + if (CGDebugInfo *DI = getDebugInfo()) { + DI->EmitUsingDirectiveDecl(cast(D)); + } + return; + } case Decl::Var: { const VarDecl &VD = cast(D); assert(VD.isLocalVarDecl() && diff --git a/lib/CodeGen/CodeGenFunction.cpp b/lib/CodeGen/CodeGenFunction.cpp index 729cdba4de..119b90aa08 100644 --- a/lib/CodeGen/CodeGenFunction.cpp +++ b/lib/CodeGen/CodeGenFunction.cpp @@ -191,6 +191,7 @@ void CodeGenFunction::FinishFunction(SourceLocation EndLoc) { // Emit debug descriptor for function end. if (CGDebugInfo *DI = getDebugInfo()) { DI->EmitFunctionEnd(Builder); + DI->setLocation(EndLoc); } EmitFunctionEpilog(*CurFnInfo);