<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, Jul 1, 2014 at 1:30 PM, David Majnemer <span dir="ltr"><<a href="mailto:david.majnemer@gmail.com" target="_blank">david.majnemer@gmail.com</a>></span> wrote:<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

Modified: cfe/trunk/lib/CodeGen/CGVTables.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGVTables.cpp?rev=212125&r1=212124&r2=212125&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGVTables.cpp?rev=212125&r1=212124&r2=212125&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/CodeGen/CGVTables.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/CGVTables.cpp Tue Jul  1 15:30:31 2014<br>
@@ -431,12 +431,10 @@ void CodeGenVTables::EmitThunks(GlobalDe<br>
     emitThunk(GD, (*ThunkInfoVector)[I], /*ForVTable=*/false);<br>
 }<br>
<br>
-llvm::Constant *<br>
-CodeGenVTables::CreateVTableInitializer(const CXXRecordDecl *RD,<br>
-                                        const VTableComponent *Components,<br>
-                                        unsigned NumComponents,<br>
-                                const VTableLayout::VTableThunkTy *VTableThunks,<br>
-                                        unsigned NumVTableThunks) {<br>
+llvm::Constant *CodeGenVTables::CreateVTableInitializer(<br>
+    const CXXRecordDecl *RD, const VTableComponent *Components,<br>
+    unsigned NumComponents, const VTableLayout::VTableThunkTy *VTableThunks,<br>
+    unsigned NumVTableThunks, llvm::Constant *RTTI) {<br>
   SmallVector<llvm::Constant *, 64> Inits;<br>
<br>
   llvm::Type *Int8PtrTy = CGM.Int8PtrTy;<br>
@@ -444,9 +442,6 @@ CodeGenVTables::CreateVTableInitializer(<br>
   llvm::Type *PtrDiffTy =<br>
     CGM.getTypes().ConvertType(CGM.getContext().getPointerDiffType());<br>
<br>
-  QualType ClassType = CGM.getContext().getTagDeclType(RD);<br>
-  llvm::Constant *RTTI = CGM.GetAddrOfRTTIDescriptor(ClassType);<br>
-<br>
   unsigned NextVTableThunkIndex = 0;<br>
<br>
   llvm::Constant *PureVirtualFn = nullptr, *DeletedVirtualFn = nullptr;<br>
@@ -594,13 +589,14 @@ CodeGenVTables::GenerateConstructionVTab<br>
   // V-tables are always unnamed_addr.<br>
   VTable->setUnnamedAddr(true);<br>
<br>
+  llvm::Constant *RTTI = CGM.GetAddrOfRTTIDescriptor(<br>
+      CGM.getContext().getTagDeclType(Base.getBase()));<br>
+<br>
   // Create and set the initializer.<br>
-  llvm::Constant *Init =<br>
-    CreateVTableInitializer(Base.getBase(),<br>
-                            VTLayout->vtable_component_begin(),<br>
-                            VTLayout->getNumVTableComponents(),<br>
-                            VTLayout->vtable_thunk_begin(),<br>
-                            VTLayout->getNumVTableThunks());<br>
+  llvm::Constant *Init = CreateVTableInitializer(<br>
+      Base.getBase(), VTLayout->vtable_component_begin(),<br>
+      VTLayout->getNumVTableComponents(), VTLayout->vtable_thunk_begin(),<br>
+      VTLayout->getNumVTableThunks(), RTTI);<br>
   VTable->setInitializer(Init);<br>
<br>
   return VTable;<br></blockquote><div><br></div><div>Why hoist this out to callers?</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Modified: cfe/trunk/test/CodeGenCXX/dllexport.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/dllexport.cpp?rev=212125&r1=212124&r2=212125&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/dllexport.cpp?rev=212125&r1=212124&r2=212125&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/test/CodeGenCXX/dllexport.cpp (original)<br>
+++ cfe/trunk/test/CodeGenCXX/dllexport.cpp Tue Jul  1 15:30:31 2014<br>
@@ -24,6 +24,9 @@ struct External { int v; };<br>
 #define INSTVAR(var) template int var;<br>
 #define INST(func) template void func();<br>
<br>
+// The vftable for struct W is comdat largest because we have RTTI.<br>
+// M32-DAG: $"\01??_7W@@6B@" = comdat largest<br>
+<br>
<br>
 //===----------------------------------------------------------------------===//<br>
 // Globals<br>
@@ -518,7 +521,8 @@ struct __declspec(dllexport) W { virtual<br>
 // Copy ctor:<br>
 // M32-DAG: define weak_odr dllexport x86_thiscallcc %struct.W* @"\01??0W@@QAE@ABU0@@Z"<br>
 // vftable:<br>
-// M32-DAG: @"\01??_7W@@6B@" = weak_odr dllexport unnamed_addr constant [1 x i8*] [i8* bitcast (void (%struct.W*)* @"\01?foo@W@@UAEXXZ" to i8*)]<br>
+// M32-DAG: [[W_VTABLE:@.*]] = private unnamed_addr constant [2 x i8*] [i8* bitcast (%MSRTTICompleteObjectLocator* @"\01??_R4W@@6B@" to i8*), i8* bitcast (void (%struct.W*)* @"\01?foo@W@@UAEXXZ" to i8*)], comdat $"\01??_7W@@6B@"<br>

+// M32-DAG: @"\01??_7W@@6B@" = dllexport unnamed_addr alias getelementptr inbounds ([2 x i8*]* [[W_VTABLE]], i32 0, i32 1), comdat $"\01??_7W@@6B@"<br>
 // G32-DAG: @_ZTV1W = weak_odr dllexport unnamed_addr constant [3 x i8*] [i8* null, i8* bitcast ({ i8*, i8* }* @_ZTI1W to i8*), i8* bitcast (void (%struct.W*)* @_ZN1W3fooEv to i8*)]<br>
<br>
 struct __declspec(dllexport) X : public virtual W {};<br></blockquote><div><br></div><div>This seems like not enough tests, did you forget to add a file? </div></div></div></div>