]> granicus.if.org Git - clang/commitdiff
Enable __float128 for mingw for GCC compatibility and define __SIZEOF_FLOAT128__...
authorReid Kleckner <rnk@google.com>
Fri, 26 May 2017 17:38:15 +0000 (17:38 +0000)
committerReid Kleckner <rnk@google.com>
Fri, 26 May 2017 17:38:15 +0000 (17:38 +0000)
GCC defines __FLOAT128__ on Power and __SIZEOF_FLOAT128__ on x86. We're
just following the inconsistency for now so users have some way to test.

Effectively merges this patch as requested by Martell Malone:
https://github.com/Alexpux/MINGW-packages/blob/master/mingw-w64-clang/0107-enable-__float128-for-X86-MinGW.patch

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

lib/Basic/Targets.cpp
lib/Frontend/InitPreprocessor.cpp
test/Sema/128bitfloat.cpp

index b35033876da1dc21fc4d32c116920304356a6354..636be1f92c71a1d8c0ab969aaeaa6b7cf90eb7ec 100644 (file)
@@ -4644,7 +4644,9 @@ static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
 class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
 public:
   MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
-      : WindowsX86_32TargetInfo(Triple, Opts) {}
+      : WindowsX86_32TargetInfo(Triple, Opts) {
+    HasFloat128 = true;
+  }
   void getTargetDefines(const LangOptions &Opts,
                         MacroBuilder &Builder) const override {
     WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
@@ -4936,6 +4938,7 @@ public:
     // with x86 FP ops. Weird.
     LongDoubleWidth = LongDoubleAlign = 128;
     LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
+    HasFloat128 = true;
   }
 
   void getTargetDefines(const LangOptions &Opts,
index 08befb33c96267b5a2ccddf65a27605ecb606bb2..fb788c43a2ffd637a69d44f2beafc67ce5e18f71 100644 (file)
@@ -750,6 +750,8 @@ static void InitializePredefinedMacros(const TargetInfo &TI,
                    TI.getTypeWidth(TI.getWIntType()), TI, Builder);
   if (TI.hasInt128Type())
     DefineTypeSizeof("__SIZEOF_INT128__", 128, TI, Builder);
+  if (TI.hasFloat128Type())
+    DefineTypeSizeof("__SIZEOF_FLOAT128__", 128, TI, Builder);
 
   DefineType("__INTMAX_TYPE__", TI.getIntMaxType(), Builder);
   DefineFmt("__INTMAX", TI.getIntMaxType(), TI, Builder);
index 2449cb6b6596f5d602dac8ac0b41ff57efa62c9c..4a826b479d017637afc758e999ef4cf0eeec592a 100644 (file)
@@ -1,7 +1,11 @@
-// RUN: %clang_cc1 -fsyntax-only -verify -std=gnu++11 %s
-// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
+// RUN: %clang_cc1 -verify -std=gnu++11 %s
+// RUN: %clang_cc1 -verify -std=c++11 %s
+// RUN: %clang_cc1 -triple powerpc64-linux -verify -std=c++11 %s
+// RUN: %clang_cc1 -triple i686-windows-gnu -verify -std=c++11 %s
+// RUN: %clang_cc1 -triple x86_64-windows-gnu -verify -std=c++11 %s
+// RUN: %clang_cc1 -triple x86_64-windows-msvc -verify -std=c++11 %s
 
-#ifdef __FLOAT128__
+#if defined(__FLOAT128__) || defined(__SIZEOF_FLOAT128__)
 __float128 f;
 template<typename> struct __is_floating_point_helper {};
 template<> struct __is_floating_point_helper<__float128> {};