r219101 - DebugInfo: Don't include implicit special members in the list of class members

Eric Christopher echristo at gmail.com
Mon Oct 6 00:23:08 PDT 2014


On Sun, Oct 5, 2014 at 11:53 PM, Yaron Keren <yaron.keren at gmail.com> wrote:
> Hi David,
>
> This does not compile on VC 2013:
>
> 1>  CGDebugInfo.cpp
> 1>..\..\..\..\..\tools\clang\lib\CodeGen\CGDebugInfo.cpp(1181): error C2446:
> ':' : no conversion from 'llvm::WeakVH' to 'llvm::DISubprogram'
> 1>          No user-defined-conversion operator available that can perform
> this conversion, or the operator cannot be called
>
> refers to:
>
>     EltTys.push_back(MI == SPCache.end()
>                          ? CreateCXXMemberFunction(Method, Unit, RecordTy)
>                          : MI->second);
>

Feel free to revert if it hasn't been gotten to shortly.

Thanks!

-eric

> Yaron
>
>
> 2014-10-06 8:18 GMT+03:00 David Blaikie <dblaikie at gmail.com>:
>>
>> Author: dblaikie
>> Date: Mon Oct  6 00:18:55 2014
>> New Revision: 219101
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=219101&view=rev
>> Log:
>> DebugInfo: Don't include implicit special members in the list of class
>> members
>>
>> By leaving these members out of the member list, we avoid them being
>> emitted into type unit definitions - while still allowing the
>> definition/declaration to be injected into the compile unit as expected.
>>
>> Modified:
>>     cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
>>     cfe/trunk/test/CodeGenCXX/debug-info-template-member.cpp
>>
>> Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=219101&r1=219100&r2=219101&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Mon Oct  6 00:18:55 2014
>> @@ -1157,24 +1157,23 @@ CollectCXXMemberFunctions(const CXXRecor
>>    // have templated functions iterate over every declaration to gather
>>    // the functions.
>>    for(const auto *I : RD->decls()) {
>> -    if (const auto *Method = dyn_cast<CXXMethodDecl>(I)) {
>> -      // Reuse the existing member function declaration if it exists.
>> -      // It may be associated with the declaration of the type & should
>> be
>> -      // reused as we're building the definition.
>> -      //
>> -      // This situation can arise in the vtable-based debug info
>> reduction where
>> -      // implicit members are emitted in a non-vtable TU.
>> -      llvm::DenseMap<const FunctionDecl *, llvm::WeakVH>::iterator MI =
>> -          SPCache.find(Method->getCanonicalDecl());
>> -      if (MI == SPCache.end()) {
>> -        // If the member is implicit, lazily create it when we see the
>> -        // definition, not before. (an ODR-used implicit default ctor
>> that's
>> -        // never actually code generated should not produce debug info)
>> -        if (!Method->isImplicit())
>> -          EltTys.push_back(CreateCXXMemberFunction(Method, Unit,
>> RecordTy));
>> -      } else
>> -        EltTys.push_back(MI->second);
>> -    }
>> +    const auto *Method = dyn_cast<CXXMethodDecl>(I);
>> +    // If the member is implicit, don't add it to the member list. This
>> avoids
>> +    // the member being added to type units by LLVM, while still allowing
>> it
>> +    // to be emitted into the type declaration/reference inside the
>> compile
>> +    // unit.
>> +    if (!Method || Method->isImplicit())
>> +      continue;
>> +    // Reuse the existing member function declaration if it exists.
>> +    // It may be associated with the declaration of the type & should be
>> +    // reused as we're building the definition.
>> +    //
>> +    // This situation can arise in the vtable-based debug info reduction
>> where
>> +    // implicit members are emitted in a non-vtable TU.
>> +    auto MI = SPCache.find(Method->getCanonicalDecl());
>> +    EltTys.push_back(MI == SPCache.end()
>> +                         ? CreateCXXMemberFunction(Method, Unit,
>> RecordTy)
>> +                         : MI->second);
>>    }
>>  }
>>
>>
>> Modified: cfe/trunk/test/CodeGenCXX/debug-info-template-member.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-template-member.cpp?rev=219101&r1=219100&r2=219101&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/test/CodeGenCXX/debug-info-template-member.cpp (original)
>> +++ cfe/trunk/test/CodeGenCXX/debug-info-template-member.cpp Mon Oct  6
>> 00:18:55 2014
>> @@ -28,21 +28,22 @@ inline int add3(int x) {
>>  // CHECK: [[VIRT_T]] = metadata !{metadata !"0x2f\00T\000\000"{{,
>> [^,]+}}, metadata !"_ZTS4elem", {{.*}} ; [ DW_TAG_template_type_parameter ]
>>
>>  // CHECK: [[C:![0-9]*]] = {{.*}}, metadata [[C_MEM:![0-9]*]], metadata
>> !"_ZTS7MyClass", null, metadata !"_ZTS7MyClass"} ; [ DW_TAG_structure_type ]
>> [MyClass]
>> -// CHECK: [[C_MEM]] = metadata !{metadata [[C_VPTR:![0-9]*]], metadata
>> [[C_FUNC:![0-9]*]], metadata [[C_CTOR:![0-9]*]]}
>> +// CHECK: [[C_MEM]] = metadata !{metadata [[C_VPTR:![0-9]*]], metadata
>> [[C_FUNC:![0-9]*]]}
>>  // CHECK: [[C_VPTR]] = {{.*}} ; [ DW_TAG_member ] [_vptr$MyClass]
>>
>>  // CHECK: [[C_FUNC]] = {{.*}} ; [ DW_TAG_subprogram ] [line 7] [func]
>> -// CHECK: [[C_CTOR]] = {{.*}} ; [ DW_TAG_subprogram ] [line 0] [MyClass]
>>
>>  // CHECK: [[ELEM:![0-9]*]] = {{.*}}, metadata [[ELEM_MEM:![0-9]*]], null,
>> null, metadata !"_ZTS4elem"} ; [ DW_TAG_structure_type ] [elem] {{.*}} [def]
>>  // CHECK: [[ELEM_MEM]] = metadata !{metadata [[ELEM_X:![0-9]*]]}
>>  // CHECK: [[ELEM_X]] = {{.*}} ; [ DW_TAG_member ] [x] {{.*}} [static]
>> [from _ZTS4virtI4elemE]
>>
>> -// Check that the member function template specialization refers to its
>> class by
>> -// scope, even though it didn't appear in the class's member list
>> (C_MEM). This
>> -// prevents the function from being added to type units, while still
>> appearing
>> -// in the type declaration/reference in the compile unit.
>> +// Check that the member function template specialization and implicit
>> special
>> +// members (the default ctor) refer to their class by scope, even though
>> they
>> +// didn't appear in the class's member list (C_MEM). This prevents the
>> functions
>> +// from being added to type units, while still appearing in the type
>> +// declaration/reference in the compile unit.
>>  // CHECK: metadata !"_ZTS7MyClass", {{.*}} ; [ DW_TAG_subprogram ] [line
>> 4] [add<2>]
>> +// CHECK: metadata !"_ZTS7MyClass", {{.*}} ; [ DW_TAG_subprogram ] [line
>> 0] [MyClass]
>>
>>  template<typename T>
>>  struct outer {
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
>
>
> _______________________________________________
> 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