]> granicus.if.org Git - clang/commitdiff
[MS ABI] Don't emit RTTI descriptors for dllimport vtables
authorDavid Majnemer <david.majnemer@gmail.com>
Sun, 7 Feb 2016 22:42:05 +0000 (22:42 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Sun, 7 Feb 2016 22:42:05 +0000 (22:42 +0000)
A dllimport'd vtable always points one past the RTTI data, this means
that the initializer will never end up referencing the data.  Our
emission is a harmless waste.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@260062 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/MicrosoftCXXABI.cpp
test/CodeGenCXX/microsoft-abi-vftables.cpp

index 71fc207e595633bc9a2b2b37ee6a445a82b6f693..4cd4f8533b7f725ddba4721ef5be188f723ecdae 100644 (file)
@@ -1567,7 +1567,9 @@ void MicrosoftCXXABI::emitVTableDefinitions(CodeGenVTables &CGVT,
     if (VTable->hasInitializer())
       continue;
 
-    llvm::Constant *RTTI = getContext().getLangOpts().RTTIData
+    llvm::Constant *RTTI = getContext().getLangOpts().RTTIData &&
+                                   VTable->getDLLStorageClass() !=
+                                       llvm::GlobalValue::DLLImportStorageClass
                                ? getMSCompleteObjectLocator(RD, Info)
                                : nullptr;
 
index 340675b188d505e149fa6c829a2cfa42097959e9..f32bff09a8a354c75db9ac8eb14f68d5d06235e2 100644 (file)
@@ -4,6 +4,8 @@
 // RTTI-DAG: $"\01??_7S@@6B@" = comdat largest
 // RTTI-DAG: $"\01??_7V@@6B@" = comdat largest
 
+// RTTI-NOT: @"\01??_R4U@@6B@"
+
 struct S {
   virtual ~S();
 } s;