]> granicus.if.org Git - clang/commitdiff
DebugInfo: emit the definition of types when construction vtables are required as...
authorDavid Blaikie <dblaikie@gmail.com>
Thu, 22 Aug 2013 15:23:05 +0000 (15:23 +0000)
committerDavid Blaikie <dblaikie@gmail.com>
Thu, 22 Aug 2013 15:23:05 +0000 (15:23 +0000)
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
test/CodeGenCXX/debug-info-class.cpp

index 6649578fc09c0100e04442eb7701efe770cf9491..848fbbbecdc0b831730f41382d933e5b2ea4a2fe 100644 (file)
@@ -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<VTableLayout> 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);
index e63eeb5eae5316551ebb854ee790dc681370b5a1..63fce06219c103fb11c95069eff3147041ac5bbd 100644 (file)
@@ -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,