Author: majnemer Date: Wed Oct 7 23:53:31 2015 New Revision: 249656 URL: http://llvm.org/viewvc/llvm-project?rev=249656&view=rev Log: [MSVC Compat] Enable ABI impacting non-conforming behavior independently of -fms-compatibility
No ABI for C++ currently makes it possible to implement the standard 100% perfectly. We wrongly hid some of our compatible behavior behind -fms-compatibility instead of tying it to the compiler ABI. Modified: cfe/trunk/lib/AST/ASTContext.cpp cfe/trunk/lib/AST/Decl.cpp cfe/trunk/lib/CodeGen/CodeGenModule.cpp cfe/trunk/lib/CodeGen/ModuleBuilder.cpp cfe/trunk/lib/Sema/SemaDecl.cpp cfe/trunk/test/CodeGen/inline.c cfe/trunk/test/CodeGenCXX/inline-functions.cpp Modified: cfe/trunk/lib/AST/ASTContext.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=249656&r1=249655&r2=249656&view=diff ============================================================================== --- cfe/trunk/lib/AST/ASTContext.cpp (original) +++ cfe/trunk/lib/AST/ASTContext.cpp Wed Oct 7 23:53:31 2015 @@ -5033,9 +5033,10 @@ CharUnits ASTContext::getObjCEncodingTyp } bool ASTContext::isMSStaticDataMemberInlineDefinition(const VarDecl *VD) const { - return getLangOpts().MSVCCompat && VD->isStaticDataMember() && - VD->getType()->isIntegralOrEnumerationType() && - VD->isFirstDecl() && !VD->isOutOfLine() && VD->hasInit(); + return getTargetInfo().getCXXABI().isMicrosoft() && + VD->isStaticDataMember() && + VD->getType()->isIntegralOrEnumerationType() && VD->isFirstDecl() && + !VD->isOutOfLine() && VD->hasInit(); } static inline @@ -8270,7 +8271,8 @@ static GVALinkage basicGVALinkageForFunc if (!FD->isInlined()) return External; - if ((!Context.getLangOpts().CPlusPlus && !Context.getLangOpts().MSVCCompat && + if ((!Context.getLangOpts().CPlusPlus && + !Context.getTargetInfo().getCXXABI().isMicrosoft() && !FD->hasAttr<DLLExportAttr>()) || FD->hasAttr<GNUInlineAttr>()) { // FIXME: This doesn't match gcc's behavior for dllexport inline functions. @@ -8346,7 +8348,8 @@ static GVALinkage basicGVALinkageForVari return GVA_StrongExternal; case TSK_ExplicitSpecialization: - return Context.getLangOpts().MSVCCompat && VD->isStaticDataMember() + return Context.getTargetInfo().getCXXABI().isMicrosoft() && + VD->isStaticDataMember() ? GVA_StrongODR : GVA_StrongExternal; Modified: cfe/trunk/lib/AST/Decl.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Decl.cpp?rev=249656&r1=249655&r2=249656&view=diff ============================================================================== --- cfe/trunk/lib/AST/Decl.cpp (original) +++ cfe/trunk/lib/AST/Decl.cpp Wed Oct 7 23:53:31 2015 @@ -2703,7 +2703,8 @@ bool FunctionDecl::isMSExternInline() co assert(isInlined() && "expected to get called on an inlined function!"); const ASTContext &Context = getASTContext(); - if (!Context.getLangOpts().MSVCCompat && !hasAttr<DLLExportAttr>()) + if (!Context.getTargetInfo().getCXXABI().isMicrosoft() && + !hasAttr<DLLExportAttr>()) return false; for (const FunctionDecl *FD = getMostRecentDecl(); FD; Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=249656&r1=249655&r2=249656&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original) +++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Wed Oct 7 23:53:31 2015 @@ -2386,7 +2386,7 @@ static bool isVarDeclStrongDefinition(co // Declarations with a required alignment do not have common linakge in MSVC // mode. - if (Context.getLangOpts().MSVCCompat) { + if (Context.getTargetInfo().getCXXABI().isMicrosoft()) { if (D->hasAttr<AlignedAttr>()) return true; QualType VarType = D->getType(); Modified: cfe/trunk/lib/CodeGen/ModuleBuilder.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/ModuleBuilder.cpp?rev=249656&r1=249655&r2=249656&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/ModuleBuilder.cpp (original) +++ cfe/trunk/lib/CodeGen/ModuleBuilder.cpp Wed Oct 7 23:53:31 2015 @@ -175,7 +175,7 @@ namespace { // For MSVC compatibility, treat declarations of static data members with // inline initializers as definitions. - if (Ctx->getLangOpts().MSVCCompat) { + if (Ctx->getTargetInfo().getCXXABI().isMicrosoft()) { for (Decl *Member : D->decls()) { if (VarDecl *VD = dyn_cast<VarDecl>(Member)) { if (Ctx->isMSStaticDataMemberInlineDefinition(VD) && Modified: cfe/trunk/lib/Sema/SemaDecl.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=249656&r1=249655&r2=249656&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaDecl.cpp (original) +++ cfe/trunk/lib/Sema/SemaDecl.cpp Wed Oct 7 23:53:31 2015 @@ -11768,9 +11768,10 @@ Decl *Sema::ActOnTag(Scope *S, unsigned UPPC_FixedUnderlyingType)) EnumUnderlying = Context.IntTy.getTypePtr(); - } else if (getLangOpts().MSVCCompat) + } else if (Context.getTargetInfo().getCXXABI().isMicrosoft()) { // Microsoft enums are always of int type. EnumUnderlying = Context.IntTy.getTypePtr(); + } } DeclContext *SearchDC = CurContext; Modified: cfe/trunk/test/CodeGen/inline.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/inline.c?rev=249656&r1=249655&r2=249656&view=diff ============================================================================== --- cfe/trunk/test/CodeGen/inline.c (original) +++ cfe/trunk/test/CodeGen/inline.c Wed Oct 7 23:53:31 2015 @@ -53,7 +53,7 @@ // CHECK3-LABEL: define linkonce_odr i32 @_Z2eiv() // RUN: echo "MS C Mode tests:" -// RUN: %clang_cc1 %s -triple i386-unknown-unknown -O1 -disable-llvm-optzns -emit-llvm -o - -std=c99 -fms-compatibility | FileCheck %s --check-prefix=CHECK4 +// RUN: %clang_cc1 %s -triple i386-pc-win32 -O1 -disable-llvm-optzns -emit-llvm -o - -std=c99 | FileCheck %s --check-prefix=CHECK4 // CHECK4-NOT: define weak_odr void @_Exit( // CHECK4-LABEL: define weak_odr i32 @ei() // CHECK4-LABEL: define i32 @bar() Modified: cfe/trunk/test/CodeGenCXX/inline-functions.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/inline-functions.cpp?rev=249656&r1=249655&r2=249656&view=diff ============================================================================== --- cfe/trunk/test/CodeGenCXX/inline-functions.cpp (original) +++ cfe/trunk/test/CodeGenCXX/inline-functions.cpp Wed Oct 7 23:53:31 2015 @@ -1,12 +1,13 @@ // RUN: %clang_cc1 %s -std=c++11 -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s --check-prefix=CHECK --check-prefix=NORMAL -// RUN: %clang_cc1 %s -std=c++11 -fms-compatibility -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s --check-prefix=CHECK --check-prefix=MSVCCOMPAT +// RUN: %clang_cc1 %s -std=c++11 -fms-compatibility -triple=x86_64-pc-win32 -emit-llvm -o - | FileCheck %s --check-prefix=CHECK --check-prefix=MSVCCOMPAT // CHECK: ; ModuleID struct A { inline void f(); }; -// CHECK-NOT: define void @_ZN1A1fEv +// NORMAL-NOT: define void @_ZN1A1fEv +// MSVCCOMPAT-NOT: define void @"\01?f@A@@QEAAXXZ" void A::f() { } template<typename> struct B { }; @@ -15,18 +16,21 @@ template<> struct B<char> { inline void f(); }; -// CHECK-NOT: _ZN1BIcE1fEv +// NORMAL-NOT: _ZN1BIcE1fEv +// MSVCCOMPAT-NOT: @"\01?f@?$B@D@@QEAAXXZ" void B<char>::f() { } // We need a final CHECK line here. -// CHECK-LABEL: define void @_Z1fv +// NORMAL-LABEL: define void @_Z1fv +// MSVCCOMPAT-LABEL: define void @"\01?f@@YAXXZ" void f() { } // <rdar://problem/8740363> inline void f1(int); -// CHECK-LABEL: define linkonce_odr void @_Z2f1i +// NORMAL-LABEL: define linkonce_odr void @_Z2f1i +// MSVCCOMPAT-LABEL: define linkonce_odr void @"\01?f1@@YAXH@Z" void f1(int) { } void test_f1() { f1(17); } @@ -39,7 +43,8 @@ namespace test1 { void g() {} }; - // CHECK-LABEL: define linkonce_odr void @_ZN5test11C4funcEv( + // NORMAL-LABEL: define linkonce_odr void @_ZN5test11C4funcEv( + // MSVCCOMPAT-LABEL: define linkonce_odr void @"\01?func@C@test1@@QEAAXXZ"( class C { public: @@ -66,59 +71,65 @@ namespace test2 { A a; f(a); } - // CHECK-LABEL: define linkonce_odr void @_ZN5test21fERKNS_1AE + // NORMAL-LABEL: define linkonce_odr void @_ZN5test21fERKNS_1AE + // MSVCCOMPAT-LABEL: define linkonce_odr void @"\01?f@test2@@YAXAEBUA@1@@Z" } -// MSVCCOMPAT-LABEL: define weak_odr void @_Z17ExternAndInlineFnv // NORMAL-NOT: _Z17ExternAndInlineFnv +// MSVCCOMPAT-LABEL: define weak_odr void @"\01?ExternAndInlineFn@@YAXXZ" extern inline void ExternAndInlineFn() {} -// MSVCCOMPAT-LABEL: define weak_odr void @_Z18InlineThenExternFnv // NORMAL-NOT: _Z18InlineThenExternFnv +// MSVCCOMPAT-LABEL: define weak_odr void @"\01?InlineThenExternFn@@YAXXZ" inline void InlineThenExternFn() {} extern void InlineThenExternFn(); -// CHECK-LABEL: define void @_Z18ExternThenInlineFnv +// NORMAL-LABEL: define void @_Z18ExternThenInlineFnv +// MSVCCOMPAT-LABEL: define void @"\01?ExternThenInlineFn@@YAXXZ" extern void ExternThenInlineFn() {} -// MSVCCOMPAT-LABEL: define weak_odr void @_Z25ExternThenInlineThenDefFnv // NORMAL-NOT: _Z25ExternThenInlineThenDefFnv +// MSVCCOMPAT-LABEL: define weak_odr void @"\01?ExternThenInlineThenDefFn@@YAXXZ" extern void ExternThenInlineThenDefFn(); inline void ExternThenInlineThenDefFn(); void ExternThenInlineThenDefFn() {} -// MSVCCOMPAT-LABEL: define weak_odr void @_Z25InlineThenExternThenDefFnv // NORMAL-NOT: _Z25InlineThenExternThenDefFnv +// MSVCCOMPAT-LABEL: define weak_odr void @"\01?InlineThenExternThenDefFn@@YAXXZ" inline void InlineThenExternThenDefFn(); extern void InlineThenExternThenDefFn(); void InlineThenExternThenDefFn() {} -// MSVCCOMPAT-LABEL: define weak_odr i32 @_Z20ExternAndConstexprFnv // NORMAL-NOT: _Z17ExternAndConstexprFnv +// MSVCCOMPAT-LABEL: define weak_odr i32 @"\01?ExternAndConstexprFn@@YAHXZ" extern constexpr int ExternAndConstexprFn() { return 0; } -// CHECK-NOT: _Z11ConstexprFnv +// NORMAL-NOT: _Z11ConstexprFnv +// MSVCCOMPAT-NOT: @"\01?ConstexprFn@@YAHXZ" constexpr int ConstexprFn() { return 0; } template <typename T> extern inline void ExternInlineOnPrimaryTemplate(T); -// CHECK-LABEL: define void @_Z29ExternInlineOnPrimaryTemplateIiEvT_ +// NORMAL-LABEL: define void @_Z29ExternInlineOnPrimaryTemplateIiEvT_ +// MSVCCOMPAT-LABEL: define void @"\01??$ExternInlineOnPrimaryTemplate@H@@YAXH@Z" template <> void ExternInlineOnPrimaryTemplate(int) {} template <typename T> extern inline void ExternInlineOnPrimaryTemplateAndSpecialization(T); -// MSVCCOMPAT-LABEL: define weak_odr void @_Z46ExternInlineOnPrimaryTemplateAndSpecializationIiEvT_ // NORMAL-NOT: _Z46ExternInlineOnPrimaryTemplateAndSpecializationIiEvT_ +// MSVCCOMPAT-LABEL: define weak_odr void @"\01??$ExternInlineOnPrimaryTemplateAndSpecialization@H@@YAXH@Z" template <> extern inline void ExternInlineOnPrimaryTemplateAndSpecialization(int) {} struct TypeWithInlineMethods { - // CHECK-NOT: _ZN21TypeWithInlineMethods9StaticFunEv + // NORMAL-NOT: _ZN21TypeWithInlineMethods9StaticFunEv + // MSVCCOMPAT-NOT: @"\01?StaticFun@TypeWithInlineMethods@@SAXXZ" static void StaticFun() {} - // CHECK-NOT: _ZN21TypeWithInlineMethods12NonStaticFunEv + // NORMAL-NOT: _ZN21TypeWithInlineMethods12NonStaticFunEv + // MSVCCOMPAT-NOT: @"\01?NonStaticFun@TypeWithInlineMethods@@QEAAXXZ" void NonStaticFun() { StaticFun(); } }; @@ -134,5 +145,6 @@ struct S { }; __attribute__((used)) inline S<int> Foo() { return S<int>(); } -// CHECK-LABEL: define linkonce_odr void @_ZN7PR229593FooEv( +// NORMAL-LABEL: define linkonce_odr void @_ZN7PR229593FooEv( +// MSVCCOMPAT-LABEL: define linkonce_odr i8 @"\01?Foo@PR22959@@YA?AU?$S@H@1@XZ"( } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits