r249656 - [MSVC Compat] Enable ABI impacting non-conforming behavior independently of -fms-compatibility

David Majnemer via cfe-commits cfe-commits at lists.llvm.org
Wed Oct 7 21:53:31 PDT 2015


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 at 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 at 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 at 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 at 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 at test2@@YAXAEBUA at 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 at H@@YAXH at 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 at H@@YAXH at Z"
 template <>
 extern inline void ExternInlineOnPrimaryTemplateAndSpecialization(int) {}
 
 struct TypeWithInlineMethods {
-  // CHECK-NOT: _ZN21TypeWithInlineMethods9StaticFunEv
+  // NORMAL-NOT: _ZN21TypeWithInlineMethods9StaticFunEv
+  // MSVCCOMPAT-NOT: @"\01?StaticFun at TypeWithInlineMethods@@SAXXZ"
   static void StaticFun() {}
-  // CHECK-NOT: _ZN21TypeWithInlineMethods12NonStaticFunEv
+  // NORMAL-NOT: _ZN21TypeWithInlineMethods12NonStaticFunEv
+  // MSVCCOMPAT-NOT: @"\01?NonStaticFun at 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 at PR22959@@YA?AU?$S at H@1 at XZ"(
 }




More information about the cfe-commits mailing list