https://github.com/akash-manna-sky updated https://github.com/llvm/llvm-project/pull/215859
>From 60b92bdceda13df2e73db7dfa7254533db992ec0 Mon Sep 17 00:00:00 2001 From: Akash Manna <[email protected]> Date: Wed, 12 Aug 2026 23:34:24 +0530 Subject: [PATCH 1/3] [clang][CodeGen] Don't emit hidden dllexport RTTI --- clang/lib/CodeGen/ItaniumCXXABI.cpp | 16 +++++- .../CodeGenCXX/dllexport-rtti-visibility.cpp | 50 +++++++++++++++++++ 2 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 clang/test/CodeGenCXX/dllexport-rtti-visibility.cpp diff --git a/clang/lib/CodeGen/ItaniumCXXABI.cpp b/clang/lib/CodeGen/ItaniumCXXABI.cpp index c17813140b10f..41913e1891f39 100644 --- a/clang/lib/CodeGen/ItaniumCXXABI.cpp +++ b/clang/lib/CodeGen/ItaniumCXXABI.cpp @@ -4237,6 +4237,18 @@ llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo(QualType Ty) { return BuildTypeInfo(Ty, Linkage, llvmVisibility, DLLStorageClass); } +/// Returns the visibility to use for an RTTI global. A dllexported global must +/// not be hidden, so dllexport takes precedence over the visibility implied by +/// -fvisibility=hidden, as CodeGenModule::setGlobalVisibility does elsewhere. +static llvm::GlobalValue::VisibilityTypes +getRTTIVisibility(llvm::GlobalValue::VisibilityTypes Visibility, + llvm::GlobalValue::DLLStorageClassTypes DLLStorageClass) { + if (DLLStorageClass == llvm::GlobalValue::DLLExportStorageClass && + Visibility == llvm::GlobalValue::HiddenVisibility) + return llvm::GlobalValue::DefaultVisibility; + return Visibility; +} + llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo( QualType Ty, llvm::GlobalVariable::LinkageTypes Linkage, @@ -4419,10 +4431,10 @@ llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo( // All of this is to say that it's important that both the type_info // object and the type_info name be uniqued when weakly emitted. - TypeName->setVisibility(Visibility); + TypeName->setVisibility(getRTTIVisibility(Visibility, DLLStorageClass)); CGM.setDSOLocal(TypeName); - GV->setVisibility(Visibility); + GV->setVisibility(getRTTIVisibility(Visibility, GVDLLStorageClass)); CGM.setDSOLocal(GV); TypeName->setDLLStorageClass(DLLStorageClass); diff --git a/clang/test/CodeGenCXX/dllexport-rtti-visibility.cpp b/clang/test/CodeGenCXX/dllexport-rtti-visibility.cpp new file mode 100644 index 0000000000000..0081a8f8cac3b --- /dev/null +++ b/clang/test/CodeGenCXX/dllexport-rtti-visibility.cpp @@ -0,0 +1,50 @@ +/// dllexport expresses non-hidden intention and takes precedence over the +/// visibility implied by -fvisibility=hidden. Check that this holds for RTTI. + +// RUN: %clang_cc1 -emit-llvm -triple x86_64-windows-gnu -fdeclspec -fvisibility=hidden -o - %s | FileCheck %s --check-prefixes=CHECK,GNU +// RUN: %clang_cc1 -emit-llvm -triple x86_64-windows-itanium -fdeclspec -fvisibility=hidden -o - %s | FileCheck %s --check-prefixes=CHECK,ITANIUM + +// GNU-DAG: @_ZTI5plain = linkonce_odr hidden constant +// GNU-DAG: @_ZTS5plain = linkonce_odr hidden constant +// ITANIUM-DAG: @_ZTI5plain = hidden constant +// ITANIUM-DAG: @_ZTS5plain = hidden constant +struct plain { + virtual ~plain(); +}; +plain::~plain() {} + +/// RTTI is only dllexported for Windows Itanium. +// GNU-DAG: @_ZTI8exported = linkonce_odr hidden constant +// GNU-DAG: @_ZTS8exported = linkonce_odr hidden constant +// ITANIUM-DAG: @_ZTI8exported = dso_local dllexport constant +// ITANIUM-DAG: @_ZTS8exported = dso_local dllexport constant +struct __declspec(dllexport) exported { + virtual ~exported(); +}; +exported::~exported() {} + +/// Defining __cxxabiv1::__fundamental_type_info makes Clang implicitly emit the +/// RTTI descriptors for the fundamental types, with the class' storage class. +// GNU-DAG: @_ZTIN10__cxxabiv123__fundamental_type_infoE = linkonce_odr hidden constant +// GNU-DAG: @_ZTSN10__cxxabiv123__fundamental_type_infoE = linkonce_odr hidden constant +// ITANIUM-DAG: @_ZTIN10__cxxabiv123__fundamental_type_infoE = dso_local dllexport constant +// ITANIUM-DAG: @_ZTSN10__cxxabiv123__fundamental_type_infoE = dso_local dllexport constant + +// CHECK-DAG: @_ZTIv = dso_local dllexport constant +// CHECK-DAG: @_ZTSv = dso_local dllexport constant +// CHECK-DAG: @_ZTIPv = dso_local dllexport constant +// CHECK-DAG: @_ZTSPv = dso_local dllexport constant +// CHECK-DAG: @_ZTIPKv = dso_local dllexport constant +// CHECK-DAG: @_ZTSPKv = dso_local dllexport constant +// CHECK-DAG: @_ZTIi = dso_local dllexport constant +// CHECK-DAG: @_ZTSi = dso_local dllexport constant +// CHECK-DAG: @_ZTIPi = dso_local dllexport constant +// CHECK-DAG: @_ZTSPi = dso_local dllexport constant +// CHECK-DAG: @_ZTIPKi = dso_local dllexport constant +// CHECK-DAG: @_ZTSPKi = dso_local dllexport constant +namespace __cxxabiv1 { +struct __declspec(dllexport) __fundamental_type_info { + virtual ~__fundamental_type_info(); +}; +__fundamental_type_info::~__fundamental_type_info() {} +} // namespace __cxxabiv1 >From 84b86bba56e9870044d52785d8ea1d7be924077e Mon Sep 17 00:00:00 2001 From: Akash Manna <[email protected]> Date: Thu, 13 Aug 2026 00:41:30 +0530 Subject: [PATCH 2/3] [clang][CodeGen] Reconcile RTTI visibility where the DLL storage class is computed --- clang/lib/CodeGen/ItaniumCXXABI.cpp | 40 +++++++++++-------- .../CodeGenCXX/dllexport-rtti-visibility.cpp | 14 ++++++- 2 files changed, 36 insertions(+), 18 deletions(-) diff --git a/clang/lib/CodeGen/ItaniumCXXABI.cpp b/clang/lib/CodeGen/ItaniumCXXABI.cpp index 41913e1891f39..e5e4b102ba92b 100644 --- a/clang/lib/CodeGen/ItaniumCXXABI.cpp +++ b/clang/lib/CodeGen/ItaniumCXXABI.cpp @@ -4187,6 +4187,19 @@ static llvm::GlobalVariable::LinkageTypes getTypeInfoLinkage(CodeGenModule &CGM, llvm_unreachable("Invalid linkage!"); } +/// Returns the visibility to use for an RTTI global with the given DLL storage +/// class. A dllexported global must not be hidden, so dllexport takes +/// precedence over the visibility implied by -fvisibility=hidden, as +/// CodeGenModule::setGlobalVisibility does for other globals. +static llvm::GlobalValue::VisibilityTypes +getRTTIVisibility(llvm::GlobalValue::VisibilityTypes Visibility, + llvm::GlobalValue::DLLStorageClassTypes DLLStorageClass) { + if (DLLStorageClass == llvm::GlobalValue::DLLExportStorageClass && + Visibility == llvm::GlobalValue::HiddenVisibility) + return llvm::GlobalValue::DefaultVisibility; + return Visibility; +} + llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo(QualType Ty) { // We want to operate on the canonical type. Ty = Ty.getCanonicalType(); @@ -4234,19 +4247,9 @@ llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo(QualType Ty) { llvmVisibility == llvm::GlobalValue::DefaultVisibility)) DLLStorageClass = llvm::GlobalValue::DLLExportStorageClass; } - return BuildTypeInfo(Ty, Linkage, llvmVisibility, DLLStorageClass); -} + llvmVisibility = getRTTIVisibility(llvmVisibility, DLLStorageClass); -/// Returns the visibility to use for an RTTI global. A dllexported global must -/// not be hidden, so dllexport takes precedence over the visibility implied by -/// -fvisibility=hidden, as CodeGenModule::setGlobalVisibility does elsewhere. -static llvm::GlobalValue::VisibilityTypes -getRTTIVisibility(llvm::GlobalValue::VisibilityTypes Visibility, - llvm::GlobalValue::DLLStorageClassTypes DLLStorageClass) { - if (DLLStorageClass == llvm::GlobalValue::DLLExportStorageClass && - Visibility == llvm::GlobalValue::HiddenVisibility) - return llvm::GlobalValue::DefaultVisibility; - return Visibility; + return BuildTypeInfo(Ty, Linkage, llvmVisibility, DLLStorageClass); } llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo( @@ -4391,14 +4394,17 @@ llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo( // Export the typeinfo in the same circumstances as the vtable is exported. auto GVDLLStorageClass = DLLStorageClass; + auto GVVisibility = Visibility; if (CGM.getTarget().hasPS4DLLImportExport() && GVDLLStorageClass != llvm::GlobalVariable::DLLExportStorageClass) { if (const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) { const auto *RD = cast<CXXRecordDecl>(RecordTy->getDecl())->getDefinitionOrSelf(); if (RD->hasAttr<DLLExportAttr>() || - CXXRecordNonInlineHasAttr<DLLExportAttr>(RD)) + CXXRecordNonInlineHasAttr<DLLExportAttr>(RD)) { GVDLLStorageClass = llvm::GlobalVariable::DLLExportStorageClass; + GVVisibility = getRTTIVisibility(GVVisibility, GVDLLStorageClass); + } } } @@ -4431,10 +4437,10 @@ llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo( // All of this is to say that it's important that both the type_info // object and the type_info name be uniqued when weakly emitted. - TypeName->setVisibility(getRTTIVisibility(Visibility, DLLStorageClass)); + TypeName->setVisibility(Visibility); CGM.setDSOLocal(TypeName); - GV->setVisibility(getRTTIVisibility(Visibility, GVDLLStorageClass)); + GV->setVisibility(GVVisibility); CGM.setDSOLocal(GV); TypeName->setDLLStorageClass(DLLStorageClass); @@ -4734,8 +4740,8 @@ void ItaniumCXXABI::EmitFundamentalRTTIDescriptors(const CXXRecordDecl *RD) { RD->hasAttr<DLLExportAttr>() || CGM.shouldMapVisibilityToDLLExport(RD) ? llvm::GlobalValue::DLLExportStorageClass : llvm::GlobalValue::DefaultStorageClass; - llvm::GlobalValue::VisibilityTypes Visibility = - CodeGenModule::GetLLVMVisibility(RD->getVisibility()); + llvm::GlobalValue::VisibilityTypes Visibility = getRTTIVisibility( + CodeGenModule::GetLLVMVisibility(RD->getVisibility()), DLLStorageClass); for (const QualType &FundamentalType : FundamentalTypes) { QualType PointerType = getContext().getPointerType(FundamentalType); QualType PointerTypeConst = getContext().getPointerType( diff --git a/clang/test/CodeGenCXX/dllexport-rtti-visibility.cpp b/clang/test/CodeGenCXX/dllexport-rtti-visibility.cpp index 0081a8f8cac3b..ff0bb9b139678 100644 --- a/clang/test/CodeGenCXX/dllexport-rtti-visibility.cpp +++ b/clang/test/CodeGenCXX/dllexport-rtti-visibility.cpp @@ -3,21 +3,28 @@ // RUN: %clang_cc1 -emit-llvm -triple x86_64-windows-gnu -fdeclspec -fvisibility=hidden -o - %s | FileCheck %s --check-prefixes=CHECK,GNU // RUN: %clang_cc1 -emit-llvm -triple x86_64-windows-itanium -fdeclspec -fvisibility=hidden -o - %s | FileCheck %s --check-prefixes=CHECK,ITANIUM +// RUN: %clang_cc1 -emit-llvm -triple x86_64-scei-ps4 -fdeclspec -fvisibility=hidden -o - %s | FileCheck %s --check-prefix=PS +// RUN: %clang_cc1 -emit-llvm -triple x86_64-sie-ps5 -fdeclspec -fvisibility=hidden -o - %s | FileCheck %s --check-prefix=PS // GNU-DAG: @_ZTI5plain = linkonce_odr hidden constant // GNU-DAG: @_ZTS5plain = linkonce_odr hidden constant // ITANIUM-DAG: @_ZTI5plain = hidden constant // ITANIUM-DAG: @_ZTS5plain = hidden constant +// PS-DAG: @_ZTI5plain = {{(linkonce_odr )?}}hidden constant +// PS-DAG: @_ZTS5plain = {{(linkonce_odr )?}}hidden constant struct plain { virtual ~plain(); }; plain::~plain() {} -/// RTTI is only dllexported for Windows Itanium. +/// RTTI is only dllexported for Windows Itanium; PS4/PS5 export the type info +/// but not the type name. // GNU-DAG: @_ZTI8exported = linkonce_odr hidden constant // GNU-DAG: @_ZTS8exported = linkonce_odr hidden constant // ITANIUM-DAG: @_ZTI8exported = dso_local dllexport constant // ITANIUM-DAG: @_ZTS8exported = dso_local dllexport constant +// PS-DAG: @_ZTI8exported = {{(dso_local )?}}dllexport constant +// PS-DAG: @_ZTS8exported = {{(linkonce_odr )?}}hidden constant struct __declspec(dllexport) exported { virtual ~exported(); }; @@ -29,6 +36,11 @@ exported::~exported() {} // GNU-DAG: @_ZTSN10__cxxabiv123__fundamental_type_infoE = linkonce_odr hidden constant // ITANIUM-DAG: @_ZTIN10__cxxabiv123__fundamental_type_infoE = dso_local dllexport constant // ITANIUM-DAG: @_ZTSN10__cxxabiv123__fundamental_type_infoE = dso_local dllexport constant +// PS-DAG: @_ZTIN10__cxxabiv123__fundamental_type_infoE = {{(dso_local )?}}dllexport constant +// PS-DAG: @_ZTSN10__cxxabiv123__fundamental_type_infoE = {{(linkonce_odr )?}}hidden constant + +// PS-DAG: @_ZTIv = {{(dso_local )?}}dllexport constant +// PS-DAG: @_ZTSv = {{(dso_local )?}}dllexport constant // CHECK-DAG: @_ZTIv = dso_local dllexport constant // CHECK-DAG: @_ZTSv = dso_local dllexport constant >From a32efdf73ac2e0823cd78312ccce38f72a6cd24f Mon Sep 17 00:00:00 2001 From: Akash Manna <[email protected]> Date: Sat, 29 Aug 2026 23:06:03 +0530 Subject: [PATCH 3/3] [clang][CodeGen] Move PS4 RTTI export decision to BuildTypeInfo(QualType) --- clang/docs/ReleaseNotes.md | 1 + clang/lib/CodeGen/ItaniumCXXABI.cpp | 64 +++++++++---------- .../CodeGenCXX/dllexport-rtti-visibility.cpp | 13 ++++ 3 files changed, 46 insertions(+), 32 deletions(-) diff --git a/clang/docs/ReleaseNotes.md b/clang/docs/ReleaseNotes.md index 64979e07021dc..6a5f12371dbd4 100644 --- a/clang/docs/ReleaseNotes.md +++ b/clang/docs/ReleaseNotes.md @@ -422,6 +422,7 @@ features cannot lower the translation-unit ABI level; - Fixed a bug where preprocessor directives following comments were not correctly recognized when using -C. (#GH48361) - Fixed a crash when declaring a member template within a local class inside an OpenMP region. (#GH216052) - Fixed a bug where repeated #imports of modular headers in non-modular compilation were translated to #pragma clang module import. (#GH216924) +- Fixed a crash when emitting RTTI for a `dllexport` class, or the fundamental type descriptors for `__cxxabiv1::__fundamental_type_info`, under `-fvisibility=hidden`. (#GH207963) #### Bug Fixes to Compiler Builtins diff --git a/clang/lib/CodeGen/ItaniumCXXABI.cpp b/clang/lib/CodeGen/ItaniumCXXABI.cpp index e5e4b102ba92b..7060d30c7d899 100644 --- a/clang/lib/CodeGen/ItaniumCXXABI.cpp +++ b/clang/lib/CodeGen/ItaniumCXXABI.cpp @@ -3641,12 +3641,14 @@ class ItaniumRTTIBuilder { /// link to an existing RTTI descriptor if one already exists. llvm::Constant *BuildTypeInfo(QualType Ty); - /// BuildTypeInfo - Build the RTTI type info struct for the given type. + /// BuildTypeInfo - Build the RTTI type info struct for the given type. The + /// TypeInfo* properties apply to the type info, the others to the type name. llvm::Constant *BuildTypeInfo( - QualType Ty, - llvm::GlobalVariable::LinkageTypes Linkage, + QualType Ty, llvm::GlobalVariable::LinkageTypes Linkage, llvm::GlobalValue::VisibilityTypes Visibility, - llvm::GlobalValue::DLLStorageClassTypes DLLStorageClass); + llvm::GlobalValue::DLLStorageClassTypes DLLStorageClass, + llvm::GlobalValue::VisibilityTypes TypeInfoVisibility, + llvm::GlobalValue::DLLStorageClassTypes TypeInfoDLLStorageClass); }; } @@ -4187,10 +4189,8 @@ static llvm::GlobalVariable::LinkageTypes getTypeInfoLinkage(CodeGenModule &CGM, llvm_unreachable("Invalid linkage!"); } -/// Returns the visibility to use for an RTTI global with the given DLL storage -/// class. A dllexported global must not be hidden, so dllexport takes -/// precedence over the visibility implied by -fvisibility=hidden, as -/// CodeGenModule::setGlobalVisibility does for other globals. +/// A dllexported global must not be hidden, so dllexport takes precedence over +/// the visibility implied by -fvisibility=hidden, as elsewhere in CodeGen. static llvm::GlobalValue::VisibilityTypes getRTTIVisibility(llvm::GlobalValue::VisibilityTypes Visibility, llvm::GlobalValue::DLLStorageClassTypes DLLStorageClass) { @@ -4249,14 +4249,30 @@ llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo(QualType Ty) { } llvmVisibility = getRTTIVisibility(llvmVisibility, DLLStorageClass); - return BuildTypeInfo(Ty, Linkage, llvmVisibility, DLLStorageClass); + // Export the typeinfo in the same circumstances as the vtable is exported. + llvm::GlobalValue::DLLStorageClassTypes TypeInfoDLLStorageClass = + DLLStorageClass; + if (CGM.getTarget().hasPS4DLLImportExport() && + TypeInfoDLLStorageClass != llvm::GlobalValue::DLLExportStorageClass) { + if (auto RD = Ty->getAsCXXRecordDecl()) { + if (RD->hasAttr<DLLExportAttr>() || + CXXRecordNonInlineHasAttr<DLLExportAttr>(RD)) + TypeInfoDLLStorageClass = llvm::GlobalValue::DLLExportStorageClass; + } + } + llvm::GlobalValue::VisibilityTypes TypeInfoVisibility = + getRTTIVisibility(llvmVisibility, TypeInfoDLLStorageClass); + + return BuildTypeInfo(Ty, Linkage, llvmVisibility, DLLStorageClass, + TypeInfoVisibility, TypeInfoDLLStorageClass); } llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo( - QualType Ty, - llvm::GlobalVariable::LinkageTypes Linkage, - llvm::GlobalValue::VisibilityTypes Visibility, - llvm::GlobalValue::DLLStorageClassTypes DLLStorageClass) { + QualType Ty, llvm::GlobalVariable::LinkageTypes Linkage, + llvm::GlobalValue::VisibilityTypes Visibility, + llvm::GlobalValue::DLLStorageClassTypes DLLStorageClass, + llvm::GlobalValue::VisibilityTypes TypeInfoVisibility, + llvm::GlobalValue::DLLStorageClassTypes TypeInfoDLLStorageClass) { SmallString<256> Name; llvm::raw_svector_ostream Out(Name); CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty, Out); @@ -4392,22 +4408,6 @@ llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo( GV->replaceInitializer(llvm::ConstantStruct::getAnon(Fields)); - // Export the typeinfo in the same circumstances as the vtable is exported. - auto GVDLLStorageClass = DLLStorageClass; - auto GVVisibility = Visibility; - if (CGM.getTarget().hasPS4DLLImportExport() && - GVDLLStorageClass != llvm::GlobalVariable::DLLExportStorageClass) { - if (const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) { - const auto *RD = - cast<CXXRecordDecl>(RecordTy->getDecl())->getDefinitionOrSelf(); - if (RD->hasAttr<DLLExportAttr>() || - CXXRecordNonInlineHasAttr<DLLExportAttr>(RD)) { - GVDLLStorageClass = llvm::GlobalVariable::DLLExportStorageClass; - GVVisibility = getRTTIVisibility(GVVisibility, GVDLLStorageClass); - } - } - } - // If there's already an old global variable, replace it with the new one. if (OldGV) { GV->takeName(OldGV); @@ -4440,11 +4440,11 @@ llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo( TypeName->setVisibility(Visibility); CGM.setDSOLocal(TypeName); - GV->setVisibility(GVVisibility); + GV->setVisibility(TypeInfoVisibility); CGM.setDSOLocal(GV); TypeName->setDLLStorageClass(DLLStorageClass); - GV->setDLLStorageClass(GVDLLStorageClass); + GV->setDLLStorageClass(TypeInfoDLLStorageClass); TypeName->setPartition(CGM.getCodeGenOpts().SymbolPartition); GV->setPartition(CGM.getCodeGenOpts().SymbolPartition); @@ -4748,7 +4748,7 @@ void ItaniumCXXABI::EmitFundamentalRTTIDescriptors(const CXXRecordDecl *RD) { FundamentalType.withConst()); for (QualType Type : {FundamentalType, PointerType, PointerTypeConst}) ItaniumRTTIBuilder(*this).BuildTypeInfo( - Type, llvm::GlobalValue::ExternalLinkage, + Type, llvm::GlobalValue::ExternalLinkage, Visibility, DLLStorageClass, Visibility, DLLStorageClass); } } diff --git a/clang/test/CodeGenCXX/dllexport-rtti-visibility.cpp b/clang/test/CodeGenCXX/dllexport-rtti-visibility.cpp index ff0bb9b139678..89685716380aa 100644 --- a/clang/test/CodeGenCXX/dllexport-rtti-visibility.cpp +++ b/clang/test/CodeGenCXX/dllexport-rtti-visibility.cpp @@ -30,6 +30,19 @@ struct __declspec(dllexport) exported { }; exported::~exported() {} +/// PS4/PS5 also export the type info when a non-inline method is dllexported. +// GNU-DAG: @_ZTI10partExport = linkonce_odr hidden constant +// GNU-DAG: @_ZTS10partExport = linkonce_odr hidden constant +// ITANIUM-DAG: @_ZTI10partExport = hidden constant +// ITANIUM-DAG: @_ZTS10partExport = hidden constant +// PS-DAG: @_ZTI10partExport = {{(dso_local )?}}dllexport constant +// PS-DAG: @_ZTS10partExport = {{(linkonce_odr )?}}hidden constant +struct partExport { + virtual ~partExport(); + __declspec(dllexport) void f(); +}; +partExport::~partExport() {} + /// Defining __cxxabiv1::__fundamental_type_info makes Clang implicitly emit the /// RTTI descriptors for the fundamental types, with the class' storage class. // GNU-DAG: @_ZTIN10__cxxabiv123__fundamental_type_infoE = linkonce_odr hidden constant _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
