r274628 - Include debug info for nested structs and classes

Adrian McCarthy via cfe-commits cfe-commits at lists.llvm.org
Thu Jul 7 16:22:07 PDT 2016


This patch was reverted because it breaks a test on the buildbots (that
I've been unable to reproduce locally), so that's why you didn't seen
anything.  I'll try again to land the patch once I can fix and verify that
test.

This patch is one part of the change.  The other part is
http://reviews.llvm.org/D21939, which ensures this extra info is carried
through for CodeView debug info.

I'm not familiar with DWARF type units (but am currently reading about
them).  I don't immediately see how this change would affect the
calculation of the type signature.

The intent is to ensure that there is a type record for Bar in code like
this:

struct Foo {
  struct Bar {};
};

Without this change, Bar is omitted from the debug info metadata.


On Thu, Jul 7, 2016 at 4:03 PM, David Blaikie <dblaikie at gmail.com> wrote:

> This may cause problems for DWARF type unit consistency...
>
> Under what conditions do nested types appear in the member list? (my
> simple test case on a fresh clang didn't seem to produce anything about the
> nested type: struct outer { struct inner { int i; }; int j; }; outer o; )
>
> On Wed, Jul 6, 2016 at 7:46 AM, Adrian McCarthy via cfe-commits <
> cfe-commits at lists.llvm.org> wrote:
>
>> Author: amccarth
>> Date: Wed Jul  6 09:46:42 2016
>> New Revision: 274628
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=274628&view=rev
>> Log:
>> Include debug info for nested structs and classes
>>
>> This includes nested types in the member list, even if there are no
>> members of that type. Note that structs and classes have themselves as an
>> "implicit struct" as the first member, so we skip implicit ones.
>>
>> Differential Revision: http://reviews.llvm.org/D21705
>>
>> Modified:
>>     cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
>>     cfe/trunk/lib/CodeGen/CGDebugInfo.h
>>     cfe/trunk/test/CodeGenCXX/debug-info-dup-fwd-decl.cpp
>>     cfe/trunk/test/CodeGenCXX/debug-info-indirect-field-decl.cpp
>>     cfe/trunk/test/CodeGenCXX/debug-info-ms-abi.cpp
>>
>> Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=274628&r1=274627&r2=274628&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Wed Jul  6 09:46:42 2016
>> @@ -1095,6 +1095,13 @@ void CGDebugInfo::CollectRecordNormalFie
>>    elements.push_back(FieldType);
>>  }
>>
>> +void CGDebugInfo::CollectRecordNestedRecord(
>> +    const RecordDecl *RD, SmallVectorImpl<llvm::Metadata *> &elements) {
>> +  QualType Ty = CGM.getContext().getTypeDeclType(RD);
>> +  llvm::DIType *nestedType = getOrCreateType(Ty, getOrCreateMainFile());
>> +  elements.push_back(nestedType);
>> +}
>> +
>>  void CGDebugInfo::CollectRecordFields(
>>      const RecordDecl *record, llvm::DIFile *tunit,
>>      SmallVectorImpl<llvm::Metadata *> &elements,
>> @@ -1131,6 +1138,9 @@ void CGDebugInfo::CollectRecordFields(
>>
>>          // Bump field number for next field.
>>          ++fieldNo;
>> +      } else if (const auto *nestedRec = dyn_cast<CXXRecordDecl>(I)) {
>> +        if (!nestedRec->isImplicit() && nestedRec->getDeclContext() ==
>> record)
>> +          CollectRecordNestedRecord(nestedRec, elements);
>>        }
>>    }
>>  }
>> @@ -3633,8 +3643,8 @@ void CGDebugInfo::EmitUsingDirective(con
>>    if (CGM.getCodeGenOpts().getDebugInfo() <
>> codegenoptions::LimitedDebugInfo)
>>      return;
>>    const NamespaceDecl *NSDecl = UD.getNominatedNamespace();
>> -  if (!NSDecl->isAnonymousNamespace() ||
>> -      CGM.getCodeGenOpts().DebugExplicitImport) {
>> +  if (!NSDecl->isAnonymousNamespace() ||
>> +      CGM.getCodeGenOpts().DebugExplicitImport) {
>>      DBuilder.createImportedModule(
>>          getCurrentContextDescriptor(cast<Decl>(UD.getDeclContext())),
>>          getOrCreateNameSpace(NSDecl),
>>
>> Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.h?rev=274628&r1=274627&r2=274628&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CGDebugInfo.h (original)
>> +++ cfe/trunk/lib/CodeGen/CGDebugInfo.h Wed Jul  6 09:46:42 2016
>> @@ -254,6 +254,8 @@ class CGDebugInfo {
>>                                  llvm::DIFile *F,
>>                                  SmallVectorImpl<llvm::Metadata *> &E,
>>                                  llvm::DIType *RecordTy, const RecordDecl
>> *RD);
>> +  void CollectRecordNestedRecord(const RecordDecl *RD,
>> +                                 SmallVectorImpl<llvm::Metadata *> &E);
>>    void CollectRecordFields(const RecordDecl *Decl, llvm::DIFile *F,
>>                             SmallVectorImpl<llvm::Metadata *> &E,
>>                             llvm::DICompositeType *RecordTy);
>>
>> Modified: cfe/trunk/test/CodeGenCXX/debug-info-dup-fwd-decl.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-dup-fwd-decl.cpp?rev=274628&r1=274627&r2=274628&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/test/CodeGenCXX/debug-info-dup-fwd-decl.cpp (original)
>> +++ cfe/trunk/test/CodeGenCXX/debug-info-dup-fwd-decl.cpp Wed Jul  6
>> 09:46:42 2016
>> @@ -19,6 +19,6 @@ protected:
>>
>>  Test t;
>>
>> -// CHECK: !DIDerivedType(tag: DW_TAG_pointer_type
>>  // CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "data"
>> +// CHECK: !DIDerivedType(tag: DW_TAG_pointer_type
>>  // CHECK-NOT: !DICompositeType(tag: DW_TAG_structure_type, name: "data"
>>
>> Modified: cfe/trunk/test/CodeGenCXX/debug-info-indirect-field-decl.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-indirect-field-decl.cpp?rev=274628&r1=274627&r2=274628&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/test/CodeGenCXX/debug-info-indirect-field-decl.cpp
>> (original)
>> +++ cfe/trunk/test/CodeGenCXX/debug-info-indirect-field-decl.cpp Wed Jul
>> 6 09:46:42 2016
>> @@ -8,18 +8,18 @@ template <class T, int T::*ptr> class Fo
>>  struct Bar {
>>    int i1;
>>    // CHECK: ![[INT:[0-9]+]] = !DIBasicType(name: "int"
>> -  // CHECK: !DIDerivedType(tag: DW_TAG_member, scope:
>> -  // CHECK-SAME:           line: [[@LINE+4]]
>> -  // CHECK-SAME:           baseType: ![[UNION:[0-9]+]]
>> -  // CHECK-SAME:           size: 32, align: 32, offset: 32
>> -  // CHECK: ![[UNION]] = distinct !DICompositeType(tag:
>> DW_TAG_union_type,{{.*}} identifier: "_ZTSN3BarUt_E")
>> +  // CHECK: ![[UNION:[0-9]+]] = distinct !DICompositeType(tag:
>> DW_TAG_union_type,{{.*}} identifier: "_ZTSN3BarUt_E")
>>    union {
>>      // CHECK: !DIDerivedType(tag: DW_TAG_member, name: "i2",
>> -    // CHECK-SAME:           line: [[@LINE+5]]
>> +    // CHECK-SAME:           line: [[@LINE+9]]
>>      // CHECK-SAME:           baseType: ![[INT]]
>>      // CHECK-SAME:           size: 32, align: 32
>>      // CHECK-NOT:            offset:
>>      // CHECK-SAME:           ){{$}}
>> +    // CHECK: !DIDerivedType(tag: DW_TAG_member, scope:
>> +    // CHECK-SAME:           line: [[@LINE-8]]
>> +    // CHECK-SAME:           baseType: ![[UNION]]
>> +    // CHECK-SAME:           size: 32, align: 32, offset: 32
>>      int i2;
>>    };
>>  };
>>
>> Modified: cfe/trunk/test/CodeGenCXX/debug-info-ms-abi.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-ms-abi.cpp?rev=274628&r1=274627&r2=274628&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/test/CodeGenCXX/debug-info-ms-abi.cpp (original)
>> +++ cfe/trunk/test/CodeGenCXX/debug-info-ms-abi.cpp Wed Jul  6 09:46:42
>> 2016
>> @@ -14,6 +14,9 @@ Foo::Nested n;
>>  // CHECK: ![[Foo:[^ ]*]] = distinct !DICompositeType(tag:
>> DW_TAG_structure_type, name: "Foo",
>>  // CHECK-SAME: identifier: ".?AUFoo@@"
>>
>> +// CHECK: distinct !DICompositeType(tag: DW_TAG_structure_type, name:
>> "Nested",
>> +// CHECK-SAME: identifier: ".?AUNested at Foo@@"
>> +
>>  // CHECK: !DISubprogram(name: "f",
>>  // CHECK-SAME: containingType: ![[Foo]], virtuality:
>> DW_VIRTUALITY_virtual, virtualIndex: 0,
>>  // CHECK-SAME: flags: DIFlagPrototyped | DIFlagIntroducedVirtual,
>> @@ -25,6 +28,3 @@ Foo::Nested n;
>>  // CHECK: !DISubprogram(name: "h",
>>  // CHECK-SAME: containingType: ![[Foo]], virtuality:
>> DW_VIRTUALITY_virtual, virtualIndex: 2,
>>  // CHECK-SAME: flags: DIFlagPrototyped | DIFlagIntroducedVirtual,
>> -
>> -// CHECK: distinct !DICompositeType(tag: DW_TAG_structure_type, name:
>> "Nested",
>> -// CHECK-SAME: identifier: ".?AUNested at Foo@@"
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160707/493056d9/attachment-0001.html>


More information about the cfe-commits mailing list