[PATCH] D64283: [PowerPC] Support -mabi=ieeelongdouble and -mabi=ibmlongdouble
This revision was automatically updated to reflect the committed changes. Closed by commit rL366044: [PowerPC] Support -mabi=ieeelongdouble and -mabi=ibmlongdouble (authored by MaskRay, committed by ). Herald added a project: LLVM. Herald added a subscriber: llvm-commits. Repository: rL LLVM CHANGES SINCE LAST ACTION https://reviews.llvm.org/D64283/new/ https://reviews.llvm.org/D64283 Files: cfe/trunk/include/clang/Basic/LangOptions.def cfe/trunk/include/clang/Driver/CC1Options.td cfe/trunk/lib/Basic/Targets/PPC.cpp cfe/trunk/lib/Driver/ToolChains/Clang.cpp cfe/trunk/lib/Frontend/CompilerInvocation.cpp cfe/trunk/test/CodeGen/ppc64-long-double.cpp cfe/trunk/test/Driver/ppc-abi.c Index: cfe/trunk/include/clang/Basic/LangOptions.def === --- cfe/trunk/include/clang/Basic/LangOptions.def +++ cfe/trunk/include/clang/Basic/LangOptions.def @@ -172,6 +172,7 @@ "default maximum alignment for types") VALUE_LANGOPT(AlignDouble, 1, 0, "Controls if doubles should be aligned to 8 bytes (x86 only)") VALUE_LANGOPT(LongDoubleSize, 32, 0, "width of long double") +LANGOPT(PPCIEEELongDouble, 1, 0, "use IEEE 754 quadruple-precision for long double") COMPATIBLE_VALUE_LANGOPT(PICLevel, 2, 0, "__PIC__ level") COMPATIBLE_VALUE_LANGOPT(PIE , 1, 0, "is pie") LANGOPT(ROPI , 1, 0, "Read-only position independence") Index: cfe/trunk/include/clang/Driver/CC1Options.td === --- cfe/trunk/include/clang/Driver/CC1Options.td +++ cfe/trunk/include/clang/Driver/CC1Options.td @@ -298,6 +298,8 @@ "precision">; def mreassociate : Flag<["-"], "mreassociate">, HelpText<"Allow reassociation transformations for floating-point instructions">; +def mabi_EQ_ieeelongdouble : Flag<["-"], "mabi=ieeelongdouble">, + HelpText<"Use IEEE 754 quadruple-precision for long double">; def mfloat_abi : Separate<["-"], "mfloat-abi">, HelpText<"The float ABI to use">; def mtp : Separate<["-"], "mtp">, Index: cfe/trunk/test/CodeGen/ppc64-long-double.cpp === --- cfe/trunk/test/CodeGen/ppc64-long-double.cpp +++ cfe/trunk/test/CodeGen/ppc64-long-double.cpp @@ -3,6 +3,14 @@ // RUN: %clang_cc1 -triple powerpc64-linux-gnu -emit-llvm -o - %s -mlong-double-64 | \ // RUN: FileCheck --check-prefix=FP64 %s +// musl defaults to -mlong-double-64, so -mlong-double-128 is needed to make +// -mabi=ieeelongdouble effective. +// RUN: %clang_cc1 -triple powerpc64-linux-musl -emit-llvm -o - %s -mlong-double-128 \ +// RUN: -mabi=ieeelongdouble | FileCheck --check-prefix=FP128 %s +// RUN: %clang_cc1 -triple powerpc64-linux-gnu -emit-llvm -o - %s \ +// RUN: -mabi=ieeelongdouble | FileCheck --check-prefix=FP128 %s + +// IBM extended double is the default. // RUN: %clang_cc1 -triple powerpc64-linux-gnu -emit-llvm -o - %s | \ // RUN: FileCheck --check-prefix=IBM128 %s // RUN: %clang_cc1 -triple powerpc64-linux-musl -emit-llvm -o - -mlong-double-128 %s | \ @@ -13,10 +21,13 @@ // FP64: @x = global double {{.*}}, align 8 // FP64: @size = global i32 8 +// FP128: @x = global fp128 {{.*}}, align 16 +// FP128: @size = global i32 16 // IBM128: @x = global ppc_fp128 {{.*}}, align 16 // IBM128: @size = global i32 16 long double foo(long double d) { return d; } // FP64: double @_Z3fooe(double %d) +// FP128: fp128 @_Z3foou9__ieee128(fp128 %d) // IBM128: ppc_fp128 @_Z3foog(ppc_fp128 %d) Index: cfe/trunk/test/Driver/ppc-abi.c === --- cfe/trunk/test/Driver/ppc-abi.c +++ cfe/trunk/test/Driver/ppc-abi.c @@ -66,4 +66,22 @@ // CHECK-ELFv2-PIC: "-mrelocation-model" "pic" "-pic-level" "2" // CHECK-ELFv2-PIC: "-target-abi" "elfv2" +// Check -mabi=ieeelongdouble is passed through but it does not change -target-abi. +// RUN: %clang -target powerpc64le-linux-gnu %s -mabi=ieeelongdouble -mabi=elfv1 -### 2>&1 \ +// RUN: | FileCheck -check-prefix=CHECK-ELFv1-IEEE %s +// RUN: %clang -target powerpc64le-linux-gnu %s -mabi=elfv1 -mabi=ieeelongdouble -### 2>&1 \ +// RUN: | FileCheck -check-prefix=CHECK-ELFv1-IEEE %s +// RUN: %clang -target powerpc64le-linux-gnu %s -mabi=elfv2 -mabi=elfv1 -mabi=ibmlongdouble -mabi=ieeelongdouble -### 2>&1 \ +// RUN: | FileCheck -check-prefix=CHECK-ELFv1-IEEE %s + +// CHECK-ELFv1-IEEE: "-mabi=ieeelongdouble" +// CHECK-ELFv1-IEEE: "-target-abi" "elfv1" + +// Check -mabi=ibmlongdouble is the default. +// RUN: %clang -target powerpc64le-linux-gnu %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=CHECK-ELFv2-IBM128 %s +// RUN: %clang -target powerpc64le-linux-gnu %s -mabi=ibmlongdouble -### 2>&1 \ +// RUN: | FileCheck -check-prefix=CHECK-ELFv2-IBM128 %s +// CHECK-ELFv2-IBM128-NOT: "-mabi=ieeelongdouble" +// CHECK-ELFv2-IBM128: "-target-abi" "elfv2" Index:
[PATCH] D64283: [PowerPC] Support -mabi=ieeelongdouble and -mabi=ibmlongdouble
hfinkel accepted this revision. hfinkel added a comment. This revision is now accepted and ready to land. LGTM Repository: rC Clang CHANGES SINCE LAST ACTION https://reviews.llvm.org/D64283/new/ https://reviews.llvm.org/D64283 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D64283: [PowerPC] Support -mabi=ieeelongdouble and -mabi=ibmlongdouble
MaskRay added a comment. Woohoo, this is the last :) Repository: rC Clang CHANGES SINCE LAST ACTION https://reviews.llvm.org/D64283/new/ https://reviews.llvm.org/D64283 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D64283: [PowerPC] Support -mabi=ieeelongdouble and -mabi=ibmlongdouble
MaskRay updated this revision to Diff 209114. MaskRay added a comment. Make -mabi=ieeelongdouble a pure CC1 option so that we can simplify the -mabi= loop Repository: rC Clang CHANGES SINCE LAST ACTION https://reviews.llvm.org/D64283/new/ https://reviews.llvm.org/D64283 Files: include/clang/Basic/LangOptions.def include/clang/Driver/CC1Options.td lib/Basic/Targets/PPC.cpp lib/Driver/ToolChains/Clang.cpp lib/Frontend/CompilerInvocation.cpp test/CodeGen/ppc64-long-double.cpp test/Driver/ppc-abi.c Index: test/Driver/ppc-abi.c === --- test/Driver/ppc-abi.c +++ test/Driver/ppc-abi.c @@ -66,4 +66,22 @@ // CHECK-ELFv2-PIC: "-mrelocation-model" "pic" "-pic-level" "2" // CHECK-ELFv2-PIC: "-target-abi" "elfv2" +// Check -mabi=ieeelongdouble is passed through but it does not change -target-abi. +// RUN: %clang -target powerpc64le-linux-gnu %s -mabi=ieeelongdouble -mabi=elfv1 -### 2>&1 \ +// RUN: | FileCheck -check-prefix=CHECK-ELFv1-IEEE %s +// RUN: %clang -target powerpc64le-linux-gnu %s -mabi=elfv1 -mabi=ieeelongdouble -### 2>&1 \ +// RUN: | FileCheck -check-prefix=CHECK-ELFv1-IEEE %s +// RUN: %clang -target powerpc64le-linux-gnu %s -mabi=elfv2 -mabi=elfv1 -mabi=ibmlongdouble -mabi=ieeelongdouble -### 2>&1 \ +// RUN: | FileCheck -check-prefix=CHECK-ELFv1-IEEE %s +// CHECK-ELFv1-IEEE: "-mabi=ieeelongdouble" +// CHECK-ELFv1-IEEE: "-target-abi" "elfv1" + +// Check -mabi=ibmlongdouble is the default. +// RUN: %clang -target powerpc64le-linux-gnu %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=CHECK-ELFv2-IBM128 %s +// RUN: %clang -target powerpc64le-linux-gnu %s -mabi=ibmlongdouble -### 2>&1 \ +// RUN: | FileCheck -check-prefix=CHECK-ELFv2-IBM128 %s + +// CHECK-ELFv2-IBM128-NOT: "-mabi=ieeelongdouble" +// CHECK-ELFv2-IBM128: "-target-abi" "elfv2" Index: test/CodeGen/ppc64-long-double.cpp === --- test/CodeGen/ppc64-long-double.cpp +++ test/CodeGen/ppc64-long-double.cpp @@ -3,6 +3,14 @@ // RUN: %clang_cc1 -triple powerpc64-linux-gnu -emit-llvm -o - %s -mlong-double-64 | \ // RUN: FileCheck --check-prefix=FP64 %s +// musl defaults to -mlong-double-64, so -mlong-double-128 is needed to make +// -mabi=ieeelongdouble effective. +// RUN: %clang_cc1 -triple powerpc64-linux-musl -emit-llvm -o - %s -mlong-double-128 \ +// RUN: -mabi=ieeelongdouble | FileCheck --check-prefix=FP128 %s +// RUN: %clang_cc1 -triple powerpc64-linux-gnu -emit-llvm -o - %s \ +// RUN: -mabi=ieeelongdouble | FileCheck --check-prefix=FP128 %s + +// IBM extended double is the default. // RUN: %clang_cc1 -triple powerpc64-linux-gnu -emit-llvm -o - %s | \ // RUN: FileCheck --check-prefix=IBM128 %s // RUN: %clang_cc1 -triple powerpc64-linux-musl -emit-llvm -o - -mlong-double-128 %s | \ @@ -13,10 +21,13 @@ // FP64: @x = global double {{.*}}, align 8 // FP64: @size = global i32 8 +// FP128: @x = global fp128 {{.*}}, align 16 +// FP128: @size = global i32 16 // IBM128: @x = global ppc_fp128 {{.*}}, align 16 // IBM128: @size = global i32 16 long double foo(long double d) { return d; } // FP64: double @_Z3fooe(double %d) +// FP128: fp128 @_Z3foou9__ieee128(fp128 %d) // IBM128: ppc_fp128 @_Z3foog(ppc_fp128 %d) Index: lib/Frontend/CompilerInvocation.cpp === --- lib/Frontend/CompilerInvocation.cpp +++ lib/Frontend/CompilerInvocation.cpp @@ -2745,6 +2745,7 @@ Opts.LongDoubleSize = Args.hasArg(OPT_mlong_double_128) ? 128 : Args.hasArg(OPT_mlong_double_64) ? 64 : 0; + Opts.PPCIEEELongDouble = Args.hasArg(OPT_mabi_EQ_ieeelongdouble); Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags); Opts.ROPI = Args.hasArg(OPT_fropi); Opts.RWPI = Args.hasArg(OPT_frwpi); Index: lib/Driver/ToolChains/Clang.cpp === --- lib/Driver/ToolChains/Clang.cpp +++ lib/Driver/ToolChains/Clang.cpp @@ -1808,12 +1808,21 @@ break; } - if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) -// The ppc64 linux abis are all "altivec" abis by default. Accept and ignore -// the option if given as we don't have backend support for any targets -// that don't use the altivec abi. -if (StringRef(A->getValue()) != "altivec") + bool IEEELongDouble = false; + for (const Arg *A : Args.filtered(options::OPT_mabi_EQ)) { +StringRef V = A->getValue(); +if (V == "ieeelongdouble") + IEEELongDouble = true; +else if (V == "ibmlongdouble") + IEEELongDouble = false; +else if (V != "altivec") + // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore + // the option if given as we don't have backend support for any targets + // that don't use the altivec abi. ABIName = A->getValue(); + } + if (IEEELongDouble) +
[PATCH] D64283: [PowerPC] Support -mabi=ieeelongdouble and -mabi=ibmlongdouble
MaskRay updated this revision to Diff 208875. MaskRay edited the summary of this revision. MaskRay added a comment. Add another test: -mabi=elfv2 -mabi=elfv1 -mabi=ibmlongdouble -mabi=ieeelongdouble Try fixing the markdown in the description Repository: rC Clang CHANGES SINCE LAST ACTION https://reviews.llvm.org/D64283/new/ https://reviews.llvm.org/D64283 Files: include/clang/Basic/LangOptions.def include/clang/Driver/Options.td lib/Basic/Targets/PPC.cpp lib/Driver/ToolChains/Clang.cpp lib/Frontend/CompilerInvocation.cpp test/CodeGen/ppc64-long-double.cpp test/Driver/ppc-abi.c Index: test/Driver/ppc-abi.c === --- test/Driver/ppc-abi.c +++ test/Driver/ppc-abi.c @@ -66,4 +66,22 @@ // CHECK-ELFv2-PIC: "-mrelocation-model" "pic" "-pic-level" "2" // CHECK-ELFv2-PIC: "-target-abi" "elfv2" +// Check -mabi=ieeelongdouble is passed through but it does not change -target-abi. +// RUN: %clang -target powerpc64le-linux-gnu %s -mabi=ieeelongdouble -mabi=elfv1 -### 2>&1 \ +// RUN: | FileCheck -check-prefix=CHECK-ELFv1-IEEE %s +// RUN: %clang -target powerpc64le-linux-gnu %s -mabi=elfv1 -mabi=ieeelongdouble -### 2>&1 \ +// RUN: | FileCheck -check-prefix=CHECK-ELFv1-IEEE %s +// RUN: %clang -target powerpc64le-linux-gnu %s -mabi=elfv2 -mabi=elfv1 -mabi=ibmlongdouble -mabi=ieeelongdouble -### 2>&1 \ +// RUN: | FileCheck -check-prefix=CHECK-ELFv1-IEEE %s +// CHECK-ELFv1-IEEE: "-mabi=ieeelongdouble" +// CHECK-ELFv1-IEEE: "-target-abi" "elfv1" + +// Check -mabi=ibmlongdouble is the default. +// RUN: %clang -target powerpc64le-linux-gnu %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=CHECK-ELFv2-IBM128 %s +// RUN: %clang -target powerpc64le-linux-gnu %s -mabi=ibmlongdouble -### 2>&1 \ +// RUN: | FileCheck -check-prefix=CHECK-ELFv2-IBM128 %s + +// CHECK-ELFv2-IBM128-NOT: "-mabi=ieeelongdouble" +// CHECK-ELFv2-IBM128: "-target-abi" "elfv2" Index: test/CodeGen/ppc64-long-double.cpp === --- test/CodeGen/ppc64-long-double.cpp +++ test/CodeGen/ppc64-long-double.cpp @@ -3,6 +3,14 @@ // RUN: %clang_cc1 -triple powerpc64-linux-gnu -emit-llvm -o - %s -mlong-double-64 | \ // RUN: FileCheck --check-prefix=FP64 %s +// musl defaults to -mlong-double-64, so -mlong-double-128 is needed to make +// -mabi=ieeelongdouble effective. +// RUN: %clang_cc1 -triple powerpc64-linux-musl -emit-llvm -o - %s -mlong-double-128 \ +// RUN: -mabi=ieeelongdouble | FileCheck --check-prefix=FP128 %s +// RUN: %clang_cc1 -triple powerpc64-linux-gnu -emit-llvm -o - %s \ +// RUN: -mabi=ieeelongdouble | FileCheck --check-prefix=FP128 %s + +// IBM extended double is the default. // RUN: %clang_cc1 -triple powerpc64-linux-gnu -emit-llvm -o - %s | \ // RUN: FileCheck --check-prefix=IBM128 %s // RUN: %clang_cc1 -triple powerpc64-linux-musl -emit-llvm -o - -mlong-double-128 %s | \ @@ -13,10 +21,13 @@ // FP64: @x = global double {{.*}}, align 8 // FP64: @size = global i32 8 +// FP128: @x = global fp128 {{.*}}, align 16 +// FP128: @size = global i32 16 // IBM128: @x = global ppc_fp128 {{.*}}, align 16 // IBM128: @size = global i32 16 long double foo(long double d) { return d; } // FP64: double @_Z3fooe(double %d) +// FP128: fp128 @_Z3foou9__ieee128(fp128 %d) // IBM128: ppc_fp128 @_Z3foog(ppc_fp128 %d) Index: lib/Frontend/CompilerInvocation.cpp === --- lib/Frontend/CompilerInvocation.cpp +++ lib/Frontend/CompilerInvocation.cpp @@ -2745,6 +2745,7 @@ Opts.LongDoubleSize = Args.hasArg(OPT_mlong_double_128) ? 128 : Args.hasArg(OPT_mlong_double_64) ? 64 : 0; + Opts.PPCIEEELongDouble = Args.hasArg(OPT_mabi_EQ_ieeelongdouble); Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags); Opts.ROPI = Args.hasArg(OPT_fropi); Opts.RWPI = Args.hasArg(OPT_frwpi); Index: lib/Driver/ToolChains/Clang.cpp === --- lib/Driver/ToolChains/Clang.cpp +++ lib/Driver/ToolChains/Clang.cpp @@ -1808,12 +1808,27 @@ break; } - if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) -// The ppc64 linux abis are all "altivec" abis by default. Accept and ignore -// the option if given as we don't have backend support for any targets -// that don't use the altivec abi. -if (StringRef(A->getValue()) != "altivec") - ABIName = A->getValue(); + bool IEEELongDouble = false, SeenLongDouble = false, SeenOther = false; + for (Arg *A : Args.filtered_reverse(options::OPT_mabi_EQ, + options::OPT_mabi_EQ_ieeelongdouble)) { +if (A->getOption().matches(options::OPT_mabi_EQ_ieeelongdouble)) { + A->claim(); + if (!SeenLongDouble) +IEEELongDouble = true; + SeenLongDouble = true; +} else if (StringRef(A->getValue()) ==
[PATCH] D64283: [PowerPC] Support -mabi=ieeelongdouble and -mabi=ibmlongdouble
MaskRay marked an inline comment as done. MaskRay added inline comments. Comment at: lib/Driver/ToolChains/Clang.cpp:1825 + // that don't use the altivec abi. + if (!SeenOther) +ABIName = A->getValue(); hfinkel wrote: > This seems like an unintentional behavior change on top of the existing > behavior (which may have also been not quite right). As best I can tell, > we're trying to set ABIName equal to the last ABI type specified, unless that > type is "altivec", in which case the ABI name should be its default value > (either a nullptr or something like "elfv2"). With this change, we'll now > take the first ABI name seen, not the last (as we'll get SeenOther to true > after the first name). > > Maybe we should loop over the list multiple times, once to get the > long-double format, once to get the basic ABI name (where we save the > default, and then if the last name found is "altivec", then reset to the > default)? > My understanding (could be wrong) is that "ibmlongdouble", "ieeelongdouble", and "altivec" cannot be ABIName, so I write it this way (filtered_reverse + SeenLongDouble + SeenOther). e.g. with -mabi=elfv2 -mabi=ieeelongdouble, ABIName should be "elfv2". With -mabi=elfv1 -mabi=ieeelongdouble, ABIName should be "elfv1" (no local entry). This matches the behavior I observed from powerpc64le-linux-gnu-gcc. Before the change, ABIName is "ieeelongdouble". I think that is not desired. Repository: rC Clang CHANGES SINCE LAST ACTION https://reviews.llvm.org/D64283/new/ https://reviews.llvm.org/D64283 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D64283: [PowerPC] Support -mabi=ieeelongdouble and -mabi=ibmlongdouble
hfinkel added a comment. Ah, fun with overloaded, legacy command-line options... Comment at: lib/Driver/ToolChains/Clang.cpp:1825 + // that don't use the altivec abi. + if (!SeenOther) +ABIName = A->getValue(); This seems like an unintentional behavior change on top of the existing behavior (which may have also been not quite right). As best I can tell, we're trying to set ABIName equal to the last ABI type specified, unless that type is "altivec", in which case the ABI name should be its default value (either a nullptr or something like "elfv2"). With this change, we'll now take the first ABI name seen, not the last (as we'll get SeenOther to true after the first name). Maybe we should loop over the list multiple times, once to get the long-double format, once to get the basic ABI name (where we save the default, and then if the last name found is "altivec", then reset to the default)? Repository: rC Clang CHANGES SINCE LAST ACTION https://reviews.llvm.org/D64283/new/ https://reviews.llvm.org/D64283 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D64283: [PowerPC] Support -mabi=ieeelongdouble and -mabi=ibmlongdouble
MaskRay updated this revision to Diff 208315. MaskRay edited the summary of this revision. MaskRay added a comment. Herald added subscribers: krytarowski, emaste. Update description. Fix the mangled code: U10__float128 -> u9__ieee128 Repository: rC Clang CHANGES SINCE LAST ACTION https://reviews.llvm.org/D64283/new/ https://reviews.llvm.org/D64283 Files: include/clang/Basic/LangOptions.def include/clang/Driver/Options.td lib/Basic/Targets/PPC.cpp lib/Driver/ToolChains/Clang.cpp lib/Frontend/CompilerInvocation.cpp test/CodeGen/ppc64-long-double.cpp test/Driver/ppc-abi.c Index: test/Driver/ppc-abi.c === --- test/Driver/ppc-abi.c +++ test/Driver/ppc-abi.c @@ -66,4 +66,20 @@ // CHECK-ELFv2-PIC: "-mrelocation-model" "pic" "-pic-level" "2" // CHECK-ELFv2-PIC: "-target-abi" "elfv2" +// Check -mabi=ieeelongdouble is passed through but it does not change -target-abi. +// RUN: %clang -target powerpc64le-linux-gnu %s -mabi=ieeelongdouble -mabi=elfv1 -### 2>&1 \ +// RUN: | FileCheck -check-prefix=CHECK-ELFv1-IEEE %s +// RUN: %clang -target powerpc64le-linux-gnu %s -mabi=elfv1 -mabi=ieeelongdouble -### 2>&1 \ +// RUN: | FileCheck -check-prefix=CHECK-ELFv1-IEEE %s +// CHECK-ELFv1-IEEE: "-mabi=ieeelongdouble" +// CHECK-ELFv1-IEEE: "-target-abi" "elfv1" + +// Check -mabi=ibmlongdouble is the default. +// RUN: %clang -target powerpc64le-linux-gnu %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=CHECK-ELFv2-IBM128 %s +// RUN: %clang -target powerpc64le-linux-gnu %s -mabi=ibmlongdouble -### 2>&1 \ +// RUN: | FileCheck -check-prefix=CHECK-ELFv2-IBM128 %s + +// CHECK-ELFv2-IBM128-NOT: "-mabi=ieeelongdouble" +// CHECK-ELFv2-IBM128: "-target-abi" "elfv2" Index: test/CodeGen/ppc64-long-double.cpp === --- test/CodeGen/ppc64-long-double.cpp +++ test/CodeGen/ppc64-long-double.cpp @@ -3,6 +3,14 @@ // RUN: %clang_cc1 -triple powerpc64-linux-gnu -emit-llvm -o - %s -mlong-double-64 | \ // RUN: FileCheck --check-prefix=FP64 %s +// musl defaults to -mlong-double-64, so -mlong-double-128 is needed to make +// -mabi=ieeelongdouble effective. +// RUN: %clang_cc1 -triple powerpc64-linux-musl -emit-llvm -o - %s -mlong-double-128 \ +// RUN: -mabi=ieeelongdouble | FileCheck --check-prefix=FP128 %s +// RUN: %clang_cc1 -triple powerpc64-linux-gnu -emit-llvm -o - %s \ +// RUN: -mabi=ieeelongdouble | FileCheck --check-prefix=FP128 %s + +// IBM extended double is the default. // RUN: %clang_cc1 -triple powerpc64-linux-gnu -emit-llvm -o - %s | \ // RUN: FileCheck --check-prefix=IBM128 %s // RUN: %clang_cc1 -triple powerpc64-linux-musl -emit-llvm -o - -mlong-double-128 %s | \ @@ -13,10 +21,13 @@ // FP64: @x = global double {{.*}}, align 8 // FP64: @size = global i32 8 +// FP128: @x = global fp128 {{.*}}, align 16 +// FP128: @size = global i32 16 // IBM128: @x = global ppc_fp128 {{.*}}, align 16 // IBM128: @size = global i32 16 long double foo(long double d) { return d; } // FP64: double @_Z3fooe(double %d) +// FP128: fp128 @_Z3foou9__ieee128(fp128 %d) // IBM128: ppc_fp128 @_Z3foog(ppc_fp128 %d) Index: lib/Frontend/CompilerInvocation.cpp === --- lib/Frontend/CompilerInvocation.cpp +++ lib/Frontend/CompilerInvocation.cpp @@ -2745,6 +2745,7 @@ Opts.LongDoubleSize = Args.hasArg(OPT_mlong_double_128) ? 128 : Args.hasArg(OPT_mlong_double_64) ? 64 : 0; + Opts.PPCIEEELongDouble = Args.hasArg(OPT_mabi_EQ_ieeelongdouble); Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags); Opts.ROPI = Args.hasArg(OPT_fropi); Opts.RWPI = Args.hasArg(OPT_frwpi); Index: lib/Driver/ToolChains/Clang.cpp === --- lib/Driver/ToolChains/Clang.cpp +++ lib/Driver/ToolChains/Clang.cpp @@ -1808,12 +1808,27 @@ break; } - if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) -// The ppc64 linux abis are all "altivec" abis by default. Accept and ignore -// the option if given as we don't have backend support for any targets -// that don't use the altivec abi. -if (StringRef(A->getValue()) != "altivec") - ABIName = A->getValue(); + bool IEEELongDouble = false, SeenLongDouble = false, SeenOther = false; + for (Arg *A : Args.filtered_reverse(options::OPT_mabi_EQ, + options::OPT_mabi_EQ_ieeelongdouble)) { +if (A->getOption().matches(options::OPT_mabi_EQ_ieeelongdouble)) { + A->claim(); + if (!SeenLongDouble) +IEEELongDouble = true; + SeenLongDouble = true; +} else if (StringRef(A->getValue()) == "ibmlongdouble") { + SeenLongDouble = true; +} else if (StringRef(A->getValue()) != "altivec") { + // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore + //
[PATCH] D64283: [PowerPC] Support -mabi=ieeelongdouble and -mabi=ibmlongdouble
MaskRay created this revision. MaskRay added reviewers: awilfox, dalias, echristo, hfinkel, nemanjai, jsji, kbarton. Herald added a project: clang. Herald added a subscriber: cfe-commits. MaskRay added parent revisions: D64282: [PowerPC] Support fp128 libcalls, D64277: [X86][PowerPC] Support -mlong-double-128. In -mlong-double-128 mode (default on Linux glibc), - -mabi=ibmlongdouble (default): use IBM extended double format for long double - -mabi=ieeelongdouble: use IEEE 754 quadruple-precision format for long double Repository: rC Clang https://reviews.llvm.org/D64283 Files: include/clang/Basic/LangOptions.def include/clang/Driver/Options.td lib/Basic/Targets/PPC.cpp lib/Driver/ToolChains/Clang.cpp lib/Frontend/CompilerInvocation.cpp test/CodeGen/ppc64-long-double.cpp test/Driver/ppc-abi.c Index: test/Driver/ppc-abi.c === --- test/Driver/ppc-abi.c +++ test/Driver/ppc-abi.c @@ -66,4 +66,20 @@ // CHECK-ELFv2-PIC: "-mrelocation-model" "pic" "-pic-level" "2" // CHECK-ELFv2-PIC: "-target-abi" "elfv2" +// Check -mabi=ieeelongdouble is passed through but it does not change -target-abi. +// RUN: %clang -target powerpc64le-linux-gnu %s -mabi=ieeelongdouble -mabi=elfv1 -### 2>&1 \ +// RUN: | FileCheck -check-prefix=CHECK-ELFv1-IEEE %s +// RUN: %clang -target powerpc64le-linux-gnu %s -mabi=elfv1 -mabi=ieeelongdouble -### 2>&1 \ +// RUN: | FileCheck -check-prefix=CHECK-ELFv1-IEEE %s +// CHECK-ELFv1-IEEE: "-mabi=ieeelongdouble" +// CHECK-ELFv1-IEEE: "-target-abi" "elfv1" + +// Check -mabi=ibmlongdouble is the default. +// RUN: %clang -target powerpc64le-linux-gnu %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=CHECK-ELFv2-IBM128 %s +// RUN: %clang -target powerpc64le-linux-gnu %s -mabi=ibmlongdouble -### 2>&1 \ +// RUN: | FileCheck -check-prefix=CHECK-ELFv2-IBM128 %s + +// CHECK-ELFv2-IBM128-NOT: "-mabi=ieeelongdouble" +// CHECK-ELFv2-IBM128: "-target-abi" "elfv2" Index: test/CodeGen/ppc64-long-double.cpp === --- test/CodeGen/ppc64-long-double.cpp +++ test/CodeGen/ppc64-long-double.cpp @@ -3,6 +3,14 @@ // RUN: %clang_cc1 -triple powerpc64-linux-gnu -emit-llvm -o - %s -mlong-double-64 | \ // RUN: FileCheck --check-prefix=FP64 %s +// musl defaults to -mlong-double-64, so -mlong-double-128 is needed to make +// -mabi=ieeelongdouble effective. +// RUN: %clang_cc1 -triple powerpc64-linux-musl -emit-llvm -o - %s -mlong-double-128 \ +// RUN: -mabi=ieeelongdouble | FileCheck --check-prefix=FP128 %s +// RUN: %clang_cc1 -triple powerpc64-linux-gnu -emit-llvm -o - %s \ +// RUN: -mabi=ieeelongdouble | FileCheck --check-prefix=FP128 %s + +// IBM extended double is the default. // RUN: %clang_cc1 -triple powerpc64-linux-gnu -emit-llvm -o - %s | \ // RUN: FileCheck --check-prefix=IBM128 %s // RUN: %clang_cc1 -triple powerpc64-linux-musl -emit-llvm -o - -mlong-double-128 %s | \ @@ -13,10 +21,13 @@ // FP64: @x = global double {{.*}}, align 8 // FP64: @size = global i32 8 +// FP128: @x = global fp128 {{.*}}, align 16 +// FP128: @size = global i32 16 // IBM128: @x = global ppc_fp128 {{.*}}, align 16 // IBM128: @size = global i32 16 long double foo(long double d) { return d; } // FP64: double @_Z3fooe(double %d) +// FP128: fp128 @_Z3fooU10__float128(fp128 %d) // IBM128: ppc_fp128 @_Z3foog(ppc_fp128 %d) Index: lib/Frontend/CompilerInvocation.cpp === --- lib/Frontend/CompilerInvocation.cpp +++ lib/Frontend/CompilerInvocation.cpp @@ -2745,6 +2745,7 @@ Opts.LongDoubleSize = Args.hasArg(OPT_mlong_double_128) ? 128 : Args.hasArg(OPT_mlong_double_64) ? 64 : 0; + Opts.PPCIEEELongDouble = Args.hasArg(OPT_mabi_EQ_ieeelongdouble); Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags); Opts.ROPI = Args.hasArg(OPT_fropi); Opts.RWPI = Args.hasArg(OPT_frwpi); Index: lib/Driver/ToolChains/Clang.cpp === --- lib/Driver/ToolChains/Clang.cpp +++ lib/Driver/ToolChains/Clang.cpp @@ -1808,12 +1808,27 @@ break; } - if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) -// The ppc64 linux abis are all "altivec" abis by default. Accept and ignore -// the option if given as we don't have backend support for any targets -// that don't use the altivec abi. -if (StringRef(A->getValue()) != "altivec") - ABIName = A->getValue(); + bool IEEELongDouble = false, SeenLongDouble = false, SeenOther = false; + for (Arg *A : Args.filtered_reverse(options::OPT_mabi_EQ, + options::OPT_mabi_EQ_ieeelongdouble)) { +if (A->getOption().matches(options::OPT_mabi_EQ_ieeelongdouble)) { + A->claim(); + if (!SeenLongDouble) +IEEELongDouble = true; + SeenLongDouble = true; +} else if