r212256 - MS ABI: Get linkage of RTTI data correct

David Majnemer david.majnemer at gmail.com
Wed Jul 2 22:51:28 PDT 2014


Author: majnemer
Date: Thu Jul  3 00:51:27 2014
New Revision: 212256

URL: http://llvm.org/viewvc/llvm-project?rev=212256&view=rev
Log:
MS ABI: Get linkage of RTTI data correct

The Itanium rules are not appropriate for the MS ABI.  RTTI data is
_never_ imported and thus is never available_externally.  It is either
internal (if the type's linkage is internal) or linkonce_odr.

This also means that classes which inherit from dllimport'd bases force
their translation unit to duplicate the entirety of the RTTI data of
that base.

Interestingly, the complete object locator can never be referenced by
translation units which import the class.

This fixes PR20106.

Added:
    cfe/trunk/test/CodeGenCXX/dllimport-rtti.cpp
Modified:
    cfe/trunk/lib/CodeGen/MicrosoftRTTI.cpp

Modified: cfe/trunk/lib/CodeGen/MicrosoftRTTI.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/MicrosoftRTTI.cpp?rev=212256&r1=212255&r2=212256&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/MicrosoftRTTI.cpp (original)
+++ cfe/trunk/lib/CodeGen/MicrosoftRTTI.cpp Thu Jul  3 00:51:27 2014
@@ -230,6 +230,20 @@ uint32_t MSRTTIClass::initialize(const M
   return NumBases;
 }
 
+static llvm::GlobalValue::LinkageTypes getLinkageForRTTI(QualType Ty) {
+  switch (Ty->getLinkage()) {
+  case NoLinkage:
+  case InternalLinkage:
+  case UniqueExternalLinkage:
+    return llvm::GlobalValue::InternalLinkage;
+
+  case VisibleNoLinkage:
+  case ExternalLinkage:
+    return llvm::GlobalValue::LinkOnceODRLinkage;
+  }
+  llvm_unreachable("Invalid linkage!");
+}
+
 /// \brief An ephemeral helper class for building MS RTTI types.  It caches some
 /// calls to the module and information about the most derived class in a
 /// hierarchy.
@@ -242,7 +256,8 @@ struct MSRTTIBuilder {
 
   MSRTTIBuilder(CodeGenModule &CGM, const CXXRecordDecl *RD)
       : CGM(CGM), Context(CGM.getContext()), VMContext(CGM.getLLVMContext()),
-        Module(CGM.getModule()), RD(RD), Linkage(CGM.getVTableLinkage(RD)),
+        Module(CGM.getModule()), RD(RD),
+        Linkage(getLinkageForRTTI(CGM.getContext().getTagDeclType(RD))),
         Mangler(
             cast<MicrosoftMangleContext>(CGM.getCXXABI().getMangleContext())) {}
 
@@ -499,7 +514,7 @@ llvm::Constant *CodeGenModule::getMSType
   return llvm::ConstantExpr::getBitCast(
       new llvm::GlobalVariable(
           getModule(), TypeDescriptorType, /*Constant=*/false,
-          getTypeInfoLinkage(Type),
+          getLinkageForRTTI(Type),
           llvm::ConstantStruct::get(TypeDescriptorType, Fields),
           MangledName.c_str()),
       Int8PtrTy);

Added: cfe/trunk/test/CodeGenCXX/dllimport-rtti.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/dllimport-rtti.cpp?rev=212256&view=auto
==============================================================================
--- cfe/trunk/test/CodeGenCXX/dllimport-rtti.cpp (added)
+++ cfe/trunk/test/CodeGenCXX/dllimport-rtti.cpp Thu Jul  3 00:51:27 2014
@@ -0,0 +1,13 @@
+// RUN: %clang_cc1 -triple i686-windows-msvc -emit-llvm -std=c++1y -O1 -disable-llvm-optzns -o - %s | FileCheck %s
+
+struct __declspec(dllimport) S {
+  virtual void f();
+} s;
+// CHECK-DAG: @"\01??_7S@@6B@" = available_externally dllimport
+// CHECK-DAG: @"\01??_R0?AUS@@@8" = linkonce_odr
+// CHECK-DAG: @"\01??_R1A@?0A at EA@S@@8" = linkonce_odr
+// CHECK-DAG: @"\01??_R2S@@8" = linkonce_odr
+// CHECK-DAG: @"\01??_R3S@@8" = linkonce_odr
+
+struct U : S {
+} u;





More information about the cfe-commits mailing list