From f5a8e6c5ab1390e7c9d347451c6276bc52443abf Mon Sep 17 00:00:00 2001 From: Alexandros Lamprineas Date: Fri, 2 Oct 2015 14:56:37 +0000 Subject: [PATCH] Implement ACLE 2.0 macros of chapters 6.6 and 6.7 for [ARM] and [Aarch64] targets. Differential Revision: http://reviews.llvm.org/D12633 llvm-svn: 249140 --- clang/include/clang/Basic/LangOptions.def | 1 + clang/lib/Basic/Targets.cpp | 12 ++++++------ clang/lib/Frontend/CompilerInvocation.cpp | 3 +++ clang/test/Preprocessor/aarch64-target-features.c | 6 +++++- clang/test/Preprocessor/arm-target-features.c | 9 +++++++++ 5 files changed, 24 insertions(+), 7 deletions(-) diff --git a/clang/include/clang/Basic/LangOptions.def b/clang/include/clang/Basic/LangOptions.def index 3e3aa43494c1..2bc0f83ea55d 100644 --- a/clang/include/clang/Basic/LangOptions.def +++ b/clang/include/clang/Basic/LangOptions.def @@ -146,6 +146,7 @@ COMPATIBLE_LANGOPT(NoInlineDefine , 1, 0, "__NO_INLINE__ predefined macro") COMPATIBLE_LANGOPT(Deprecated , 1, 0, "__DEPRECATED predefined macro") LANGOPT(FastMath , 1, 0, "__FAST_MATH__ predefined macro") LANGOPT(FiniteMathOnly , 1, 0, "__FINITE_MATH_ONLY__ predefined macro") +LANGOPT(UnsafeFPMath , 1, 0, "Unsafe Floating Point Math") BENIGN_LANGOPT(ObjCGCBitmapPrint , 1, 0, "printing of GC's bitmap layout for __weak/__strong ivars") diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index 6ac6987694e7..3458a804f04f 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -4751,6 +4751,9 @@ public: // ACLE 6.4.6 Q (saturation) flag if (DSP || SAT) Builder.defineMacro("__ARM_FEATURE_QBIT", "1"); + + if (Opts.UnsafeFPMath) + Builder.defineMacro("__ARM_FP_FAST", "1"); } void getTargetBuiltins(const Builtin::Info *&Records, @@ -5204,7 +5207,7 @@ public: Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'"); Builder.defineMacro("__ARM_64BIT_STATE", "1"); - Builder.defineMacro("__ARM_PCS_AAPCS64"); + Builder.defineMacro("__ARM_PCS_AAPCS64", "1"); Builder.defineMacro("__ARM_ARCH_ISA_A64", "1"); Builder.defineMacro("__ARM_FEATURE_CLZ", "1"); @@ -5225,11 +5228,8 @@ public: Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1"); Builder.defineMacro("__ARM_FP16_ARGS", "1"); - if (Opts.FastMath || Opts.FiniteMathOnly) - Builder.defineMacro("__ARM_FP_FAST"); - - if (Opts.C99 && !Opts.Freestanding) - Builder.defineMacro("__ARM_FP_FENV_ROUNDING"); + if (Opts.UnsafeFPMath) + Builder.defineMacro("__ARM_FP_FAST", "1"); Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4"); diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index a90713390384..5f81ce268cf1 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -1708,6 +1708,9 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK, Opts.FiniteMathOnly = Args.hasArg(OPT_ffinite_math_only) || Args.hasArg(OPT_cl_finite_math_only) || Args.hasArg(OPT_cl_fast_relaxed_math); + Opts.UnsafeFPMath = Args.hasArg(OPT_menable_unsafe_fp_math) || + Args.hasArg(OPT_cl_unsafe_math_optimizations) || + Args.hasArg(OPT_cl_fast_relaxed_math); Opts.RetainCommentsFromSystemHeaders = Args.hasArg(OPT_fretain_comments_from_system_headers); diff --git a/clang/test/Preprocessor/aarch64-target-features.c b/clang/test/Preprocessor/aarch64-target-features.c index 21152bfe1c68..b5864db16297 100644 --- a/clang/test/Preprocessor/aarch64-target-features.c +++ b/clang/test/Preprocessor/aarch64-target-features.c @@ -30,10 +30,11 @@ // CHECK: __ARM_FP16_ARGS 1 // CHECK: __ARM_FP16_FORMAT_IEEE 1 // CHECK-NOT: __ARM_FP_FAST 1 -// CHECK: __ARM_FP_FENV_ROUNDING 1 // CHECK: __ARM_NEON 1 // CHECK: __ARM_NEON_FP 0xE // CHECK: __ARM_PCS_AAPCS64 1 +// CHECK-NOT: __ARM_PCS 1 +// CHECK-NOT: __ARM_PCS_VFP 1 // CHECK-NOT: __ARM_SIZEOF_MINIMAL_ENUM 1 // CHECK-NOT: __ARM_SIZEOF_WCHAR_T 2 @@ -50,6 +51,9 @@ // RUN: %clang -target arm64-none-linux-gnu -march=armv8-a+crc -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-CRC32 %s // CHECK-CRC32: __ARM_FEATURE_CRC32 1 +// RUN: %clang -target aarch64-none-linux-gnu -fno-math-errno -fno-signed-zeros\ +// RUN: -fno-trapping-math -fassociative-math -freciprocal-math\ +// RUN: -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-FASTMATH %s // RUN: %clang -target aarch64-none-linux-gnu -ffast-math -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-FASTMATH %s // RUN: %clang -target arm64-none-linux-gnu -ffast-math -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-FASTMATH %s // CHECK-FASTMATH: __ARM_FP_FAST 1 diff --git a/clang/test/Preprocessor/arm-target-features.c b/clang/test/Preprocessor/arm-target-features.c index 0cc909444fc4..59f180b1911f 100644 --- a/clang/test/Preprocessor/arm-target-features.c +++ b/clang/test/Preprocessor/arm-target-features.c @@ -32,6 +32,7 @@ // CHECK-V8-BAREHF: __ARM_FEATURE_DIRECTED_ROUNDING 1 // CHECK-V8-BAREHF: __ARM_FEATURE_NUMERIC_MAXMIN 1 // CHECK-V8-BAREHF: __ARM_NEON__ 1 +// CHECK-V8-BAREHF: __ARM_PCS_VFP 1 // CHECK-V8-BAREHF: __VFP_FP__ 1 // RUN: %clang -target armv8a -mfloat-abi=hard -mfpu=fp-armv8 -x c -E -dM %s | FileCheck --check-prefix=CHECK-V8-BAREHF-FP %s @@ -85,9 +86,17 @@ // THUMBV8A-EABI:#define __ARM_ARCH_EXT_IDIV__ 1 // RUN: %clang -target arm-none-linux-gnu -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-DEFS %s +// CHECK-DEFS:#define __ARM_PCS 1 // CHECK-DEFS:#define __ARM_SIZEOF_MINIMAL_ENUM 4 // CHECK-DEFS:#define __ARM_SIZEOF_WCHAR_T 4 +// RUN: %clang -target arm-none-linux-gnu -fno-math-errno -fno-signed-zeros\ +// RUN: -fno-trapping-math -fassociative-math -freciprocal-math\ +// RUN: -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-FASTMATH %s +// RUN: %clang -target arm-none-linux-gnu -ffast-math -x c -E -dM %s -o -\ +// RUN: | FileCheck --check-prefix=CHECK-FASTMATH %s +// CHECK-FASTMATH: __ARM_FP_FAST 1 + // RUN: %clang -target arm-none-linux-gnu -fshort-wchar -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SHORTWCHAR %s // CHECK-SHORTWCHAR:#define __ARM_SIZEOF_WCHAR_T 2