From 6a29f674f649197780a4c60602cd08f491022ac8 Mon Sep 17 00:00:00 2001 From: David Blaikie Date: Thu, 22 Aug 2013 15:23:05 +0000 Subject: [PATCH] DebugInfo: emit the definition of types when construction vtables are required as these types may never end up emitting the full class data This might be able to be optimized further by only doing this in the absence of a key function, but it doesn't look like GCC is doing that so I'm not rushing to do it just yet. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@189022 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGVTables.cpp | 9 ++++++--- test/CodeGenCXX/debug-info-class.cpp | 11 +++++++++-- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/lib/CodeGen/CGVTables.cpp b/lib/CodeGen/CGVTables.cpp index 6649578fc0..848fbbbecd 100644 --- a/lib/CodeGen/CGVTables.cpp +++ b/lib/CodeGen/CGVTables.cpp @@ -685,6 +685,9 @@ CodeGenVTables::GenerateConstructionVTable(const CXXRecordDecl *RD, bool BaseIsVirtual, llvm::GlobalVariable::LinkageTypes Linkage, VTableAddressPointsMapTy& AddressPoints) { + if (CGDebugInfo *DI = CGM.getModuleDebugInfo()) + DI->completeClassData(Base.getBase()); + OwningPtr VTLayout( VTContext.createConstructionVTableLayout(Base.getBase(), Base.getBaseOffset(), @@ -822,15 +825,15 @@ void CodeGenModule::EmitVTable(CXXRecordDecl *theClass, bool isRequired) { void CodeGenVTables::GenerateClassData(const CXXRecordDecl *RD) { + if (CGDebugInfo *DI = CGM.getModuleDebugInfo()) + DI->completeClassData(RD); + if (VFTContext.isValid()) { // FIXME: This is a temporary solution to force generation of vftables in // Microsoft ABI. Remove when we thread VFTableContext through CodeGen. VFTContext->getVFPtrOffsets(RD); } - if (CGDebugInfo *DI = CGM.getModuleDebugInfo()) - DI->completeClassData(RD); - // First off, check whether we've already emitted the v-table and // associated stuff. llvm::GlobalVariable *VTable = GetAddrOfVTable(RD); diff --git a/test/CodeGenCXX/debug-info-class.cpp b/test/CodeGenCXX/debug-info-class.cpp index e63eeb5eae..63fce06219 100644 --- a/test/CodeGenCXX/debug-info-class.cpp +++ b/test/CodeGenCXX/debug-info-class.cpp @@ -52,6 +52,11 @@ struct G { }; }; +struct H {}; +struct I : virtual H {}; +struct J : I {}; +J j; + struct A { int one; static const int HdrSize = 52; @@ -103,6 +108,8 @@ int main(int argc, char **argv) { // CHECK: [[D_MEM]] = metadata !{metadata [[D_FUNC:![0-9]*]]} // CHECK: [[D_FUNC]] = {{.*}} ; [ DW_TAG_subprogram ] {{.*}} [func] +// CHECK: ; [ DW_TAG_structure_type ] [I] {{.*}} [def] + // CHECK: [[F_I_DEF:![0-9]*]] = {{.*}}, metadata [[F_I:![0-9]*]]} ; [ DW_TAG_variable ] [i] // CHECK: [[F_I]] = {{.*}} ; [ DW_TAG_member ] [i] // CHECK: [[F:![0-9]*]] = {{.*}} metadata [[F_MEM:![0-9]*]], i32 0, null, null} ; [ DW_TAG_structure_type ] [F] {{.*}} [def] @@ -117,5 +124,5 @@ int main(int argc, char **argv) { // CHECK: [[G_INNER_MEM]] = metadata !{metadata [[G_INNER_I:![0-9]*]]} // CHECK: [[G_INNER_I]] = {{.*}} ; [ DW_TAG_member ] [j] {{.*}} [from int] -// CHECK: ![[EXCEPTLOC]] = metadata !{i32 79, -// CHECK: ![[RETLOC]] = metadata !{i32 78, +// CHECK: ![[EXCEPTLOC]] = metadata !{i32 84, +// CHECK: ![[RETLOC]] = metadata !{i32 83, -- 2.40.0