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

Eric Christopher echristo at gmail.com
Wed Oct 16 23:35:42 PDT 2013


On Wed, Oct 16, 2013 at 10:48 PM, David Blaikie <dblaikie at gmail.com> wrote:
>
>
>
> 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?
>

It's a good question. Either way this wasn't correct as it was just
using the context of the context and not, necessarily, the top level
context. I assume that anything with multiple levels was incorrect in
some way. Though I could verify this.

The general thought I had behind this was that the front end shouldn't
be in the business of handling the dwarf layout per se, that should be
the backend, but I can be persuaded.

-eric

>>
>>
>>>
>>> +
>>> +// 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
>>
>>
>



More information about the cfe-commits mailing list