From: Eric Christopher Date: Thu, 17 Oct 2013 01:31:21 +0000 (+0000) Subject: Add the context that a function was created in as the context for the X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2e3fd942b6ba3539f53512a005270f97e09f1824;p=clang Add the context that a function was created in as the context for the function, not the context of the context. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@192862 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGDebugInfo.cpp b/lib/CodeGen/CGDebugInfo.cpp index 8cc6cf3dc2..1feccf18e0 100644 --- a/lib/CodeGen/CGDebugInfo.cpp +++ b/lib/CodeGen/CGDebugInfo.cpp @@ -2475,11 +2475,11 @@ void CGDebugInfo::EmitFunctionStart(GlobalDecl GD, QualType FnType, if (DebugKind >= CodeGenOptions::LimitedDebugInfo) { if (const NamespaceDecl *NSDecl = - dyn_cast_or_null(FD->getDeclContext())) + dyn_cast_or_null(FD->getDeclContext())) FDContext = getOrCreateNameSpace(NSDecl); else if (const RecordDecl *RDecl = - dyn_cast_or_null(FD->getDeclContext())) - FDContext = getContextDescriptor(cast(RDecl->getDeclContext())); + dyn_cast_or_null(FD->getDeclContext())) + FDContext = getContextDescriptor(cast(RDecl)); // Collect template parameters. TParamsArray = CollectFunctionTemplateParams(FD, Unit); @@ -2499,11 +2499,13 @@ void CGDebugInfo::EmitFunctionStart(GlobalDecl GD, QualType FnType, if (!HasDecl || D->isImplicit()) Flags |= llvm::DIDescriptor::FlagArtificial; - llvm::DISubprogram SP = DBuilder.createFunction( - FDContext, Name, LinkageName, Unit, LineNo, - getOrCreateFunctionType(D, FnType, Unit), Fn->hasInternalLinkage(), - true /*definition*/, getLineNumber(CurLoc), Flags, - CGM.getLangOpts().Optimize, Fn, TParamsArray, getFunctionDeclaration(D)); + llvm::DISubprogram SP = + DBuilder.createFunction(FDContext, Name, LinkageName, Unit, LineNo, + getOrCreateFunctionType(D, FnType, Unit), + Fn->hasInternalLinkage(), true /*definition*/, + getLineNumber(CurLoc), Flags, + CGM.getLangOpts().Optimize, Fn, TParamsArray, + getFunctionDeclaration(D)); if (HasDecl) DeclCache.insert(std::make_pair(D->getCanonicalDecl(), llvm::WeakVH(SP))); diff --git a/test/CodeGenCXX/debug-info-function-context.cpp b/test/CodeGenCXX/debug-info-function-context.cpp new file mode 100644 index 0000000000..4ca1c8d1ec --- /dev/null +++ b/test/CodeGenCXX/debug-info-function-context.cpp @@ -0,0 +1,36 @@ +// RUN: %clang_cc1 -emit-llvm -g -triple x86_64-pc-linux-gnu %s -o - | FileCheck %s + +struct C { + void member_function(); + static int static_member_function(); + static int static_member_variable; +}; + +int C::static_member_variable = 0; + +void C::member_function() { static_member_variable = 0; } + +int C::static_member_function() { return static_member_variable; } + +C global_variable; + +int global_function() { return -1; } + +namespace ns { +void global_namespace_function() { global_variable.member_function(); } +int global_namespace_variable = 1; +} + +// Check that the functions that belong to C have C as a context and the +// functions that belong to the namespace have it as a context, and the global +// function has the file as a context. + +// CHECK: metadata !"_ZTS1C", metadata !"member_function"{{.*}} [ DW_TAG_subprogram ] [line 11] [def] [member_function] + +// CHECK: metadata !"_ZTS1C", metadata !"static_member_function"{{.*}} [ DW_TAG_subprogram ] [line 13] [def] [static_member_function] + +// CHECK: metadata !22, metadata !"global_function"{{.*}} [ DW_TAG_subprogram ] [line 17] [def] [global_function] +// CHECK: !22 = {{.*}} [ DW_TAG_file_type ] + +// CHECK: metadata !24, metadata !"global_namespace_function"{{.*}} [ DW_TAG_subprogram ] [line 20] [def] [global_namespace_function] +// CHECK: !24 = {{.*}} [ DW_TAG_namespace ] [ns] [line 19]