]> granicus.if.org Git - clang/commitdiff
CodeGen: fix windows itanium RTTI in EH mode
authorSaleem Abdulrasool <compnerd@compnerd.org>
Mon, 5 Dec 2016 22:40:20 +0000 (22:40 +0000)
committerSaleem Abdulrasool <compnerd@compnerd.org>
Mon, 5 Dec 2016 22:40:20 +0000 (22:40 +0000)
When emitting RTTI for EH only, we would mark the locally defined (LinkOnceODR)
RTTI definition as dllimport, which is incorrect.  Ensure that if we are
generating the type information for EH only, it is marked as LinkOnceODR and we
do not make it dllimport.

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

lib/CodeGen/ItaniumCXXABI.cpp
test/CodeGenCXX/windows-itanium-type-info.cpp

index 48d47d2359919b0102fbe22d9eaf47d9b79c6753..db648f23327c720d8502395e13e4acdef8176a0b 100644 (file)
@@ -3133,7 +3133,7 @@ llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo(QualType Ty, bool Force,
     if (DLLExport || (RD && RD->hasAttr<DLLExportAttr>())) {
       TypeName->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
       GV->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
-    } else if (RD && RD->hasAttr<DLLImportAttr>()) {
+    } else if (CGM.getLangOpts().RTTI && RD && RD->hasAttr<DLLImportAttr>()) {
       TypeName->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
       GV->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
 
index ecc227d5b63c4f3a10910c03adf4e244ecde0d89..ad89318f599e62e83f3f3edc59bc07dbaef9a816 100644 (file)
@@ -1,4 +1,5 @@
-// RUN: %clang_cc1 -triple i686-windows-itanium -fdeclspec -emit-llvm %s -o - | FileCheck %s
+// RUN: %clang_cc1 -triple i686-windows-itanium -fdeclspec -fcxx-exceptions -emit-llvm %s -o - | FileCheck %s
+// RUN: %clang_cc1 -triple i686-windows-itanium -fdeclspec -fcxx-exceptions -fno-rtti -emit-llvm %s -o - | FileCheck %s -check-prefix CHECK-EH-IMPORT
 
 namespace __cxxabiv1 {
 class __declspec(dllexport) __fundamental_type_info {
@@ -19,6 +20,10 @@ derived::~derived() {
   method();
 }
 
+void f() {
+  throw base();
+}
+
 // CHECK-DAG: @_ZTIi = dllexport constant
 // CHECK-DAG: @_ZTSi = dllexport constant
 
@@ -30,3 +35,6 @@ derived::~derived() {
 // CHECK-DAG: @_ZTS4base = external dllimport constant
 // CHECK-NOT: @_ZTV4base = external dllimport constant
 
+// CHECK-EH-IMPORT: @_ZTS4base = linkonce_odr constant
+// CHECK-EH-IMPORT: @_ZTI4base = linkonce_odr constant
+