r192862 - Add the context that a function was created in as the context for the

David Blaikie dblaikie at gmail.com
Wed Oct 16 22:48:12 PDT 2013


On Wed, Oct 16, 2013 at 10:41 PM, David Blaikie <dblaikie at gmail.com> wrote:

>
>
>
> On Wed, Oct 16, 2013 at 6:31 PM, Eric Christopher <echristo at gmail.com>wrote:
>
>> Author: echristo
>> Date: Wed Oct 16 20:31:21 2013
>> New Revision: 192862
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=192862&view=rev
>> Log:
>> Add the context that a function was created in as the context for the
>> function, not the context of the context.
>>
>> Added:
>>     cfe/trunk/test/CodeGenCXX/debug-info-function-context.cpp
>> Modified:
>>     cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
>>
>> Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=192862&r1=192861&r2=192862&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Wed Oct 16 20:31:21 2013
>> @@ -2475,11 +2475,11 @@ void CGDebugInfo::EmitFunctionStart(Glob
>>
>>      if (DebugKind >= CodeGenOptions::LimitedDebugInfo) {
>>        if (const NamespaceDecl *NSDecl =
>> -          dyn_cast_or_null<NamespaceDecl>(FD->getDeclContext()))
>> +              dyn_cast_or_null<NamespaceDecl>(FD->getDeclContext()))
>>          FDContext = getOrCreateNameSpace(NSDecl);
>>        else if (const RecordDecl *RDecl =
>> -               dyn_cast_or_null<RecordDecl>(FD->getDeclContext()))
>> -        FDContext =
>> getContextDescriptor(cast<Decl>(RDecl->getDeclContext()));
>> +                   dyn_cast_or_null<RecordDecl>(FD->getDeclContext()))
>> +        FDContext = getContextDescriptor(cast<Decl>(RDecl));
>>
>>        // Collect template parameters.
>>        TParamsArray = CollectFunctionTemplateParams(FD, Unit);
>> @@ -2499,11 +2499,13 @@ void CGDebugInfo::EmitFunctionStart(Glob
>>    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)));
>>
>>
>> Added: cfe/trunk/test/CodeGenCXX/debug-info-function-context.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-function-context.cpp?rev=192862&view=auto
>>
>> ==============================================================================
>> --- cfe/trunk/test/CodeGenCXX/debug-info-function-context.cpp (added)
>> +++ cfe/trunk/test/CodeGenCXX/debug-info-function-context.cpp Wed Oct 16
>> 20:31:21 2013
>> @@ -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.
>>
>
> Is this right, though? In the actual DWARF the parent of a member function
> definition is generally not the type itself - the definitions are out of
> line (so the parent is usually the CU, I guess?), aren't they? Is this
> change going to cause these definitions to end up as children of the type
> DIE?
>

I see your corresponding commit to LLVM to undo this.

Would it be nicer to keep the metadata more like the DWARF and have the
qualified name computation go from definition to declaration and compute
the name there instead?


>
>
>> +
>> +// 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]
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20131016/4881e76f/attachment.html>


More information about the cfe-commits mailing list