forked from OSchip/llvm-project
[X86] Support -mlong-double-80
Add an option group for all of the -mlong-double-* options and make -mlong-double-80 restore the default long double behavior for X86. The motivations are that GNU accepts the -mlong-double-80 option and that complex Makefiles often need a way of undoing earlier options. Prior to this commit, if one chooses 64-bit or 128-bit long double for X86, there is no way to undo that choice and restore the 80-bit behavior. Differential Revision: https://reviews.llvm.org/D66055 llvm-svn: 369152
This commit is contained in:
parent
a17d1d2250
commit
250aafa2c4
|
@ -2040,9 +2040,14 @@ def malign_jumps_EQ : Joined<["-"], "malign-jumps=">, Group<clang_ignored_m_Grou
|
|||
def mfancy_math_387 : Flag<["-"], "mfancy-math-387">, Group<clang_ignored_m_Group>;
|
||||
def mlong_calls : Flag<["-"], "mlong-calls">, Group<m_Group>,
|
||||
HelpText<"Generate branches with extended addressability, usually via indirect jumps.">;
|
||||
def mlong_double_64 : Flag<["-"], "mlong-double-64">, Group<f_Group>, Flags<[CC1Option]>,
|
||||
def LongDouble_Group : OptionGroup<"<LongDouble group>">, Group<m_Group>,
|
||||
DocName<"Long double flags">,
|
||||
DocBrief<[{Selects the long double implementation}]>;
|
||||
def mlong_double_64 : Flag<["-"], "mlong-double-64">, Group<LongDouble_Group>, Flags<[CC1Option]>,
|
||||
HelpText<"Force long double to be 64 bits">;
|
||||
def mlong_double_128 : Flag<["-"], "mlong-double-128">, Group<f_Group>, Flags<[CC1Option]>,
|
||||
def mlong_double_80 : Flag<["-"], "mlong-double-80">, Group<LongDouble_Group>, Flags<[CC1Option]>,
|
||||
HelpText<"Force long double to be 80 bits, padded to 128 bits for storage">;
|
||||
def mlong_double_128 : Flag<["-"], "mlong-double-128">, Group<LongDouble_Group>, Flags<[CC1Option]>,
|
||||
HelpText<"Force long double to be 128 bits">;
|
||||
def mno_long_calls : Flag<["-"], "mno-long-calls">, Group<m_Group>,
|
||||
HelpText<"Restore the default behaviour of not generating long calls">;
|
||||
|
|
|
@ -4057,11 +4057,13 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
|
|||
|
||||
RenderFloatingPointOptions(TC, D, OFastEnabled, Args, CmdArgs);
|
||||
|
||||
if (Arg *A = Args.getLastArg(options::OPT_mlong_double_64,
|
||||
options::OPT_mlong_double_128)) {
|
||||
if (Arg *A = Args.getLastArg(options::OPT_LongDouble_Group)) {
|
||||
if (TC.getArch() == llvm::Triple::x86 ||
|
||||
TC.getArch() == llvm::Triple::x86_64 ||
|
||||
TC.getArch() == llvm::Triple::ppc || TC.getTriple().isPPC64())
|
||||
TC.getArch() == llvm::Triple::x86_64)
|
||||
A->render(Args, CmdArgs);
|
||||
else if ((TC.getArch() == llvm::Triple::ppc ||
|
||||
TC.getArch() == TC.getTriple().isPPC64()) &&
|
||||
(A->getOption().getID() != options::OPT_mlong_double_80))
|
||||
A->render(Args, CmdArgs);
|
||||
else
|
||||
D.Diag(diag::err_drv_unsupported_opt_for_target)
|
||||
|
|
|
@ -2,10 +2,14 @@
|
|||
// RUN: %clang -target powerpc64-pc-freebsd12 -c -### %s -mlong-double-128 2>&1 | FileCheck %s
|
||||
// RUN: %clang -target powerpc64le-linux-musl -c -### %s -mlong-double-128 2>&1 | FileCheck %s
|
||||
// RUN: %clang -target i686-linux-gnu -c -### %s -mlong-double-128 2>&1 | FileCheck %s
|
||||
// RUN: %clang -target x86_64-linux-musl -c -### %s -mlong-double-128 2>&1 | FileCheck %s
|
||||
|
||||
// RUN: %clang -target x86_64-linux-musl -c -### %s -mlong-double-128 -mlong-double-80 2>&1 | FileCheck --implicit-check-not=-mlong-double- /dev/null
|
||||
// RUN: %clang -target x86_64-linux-musl -c -### %s -mlong-double-80 -mlong-double-128 2>&1 | FileCheck %s
|
||||
|
||||
// CHECK: "-mlong-double-128"
|
||||
|
||||
// RUN: %clang -target aarch64 -c -### %s -mlong-double-128 2>&1 | FileCheck --check-prefix=ERR %s
|
||||
// RUN: %clang -target powerpc -c -### %s -mlong-double-80 2>&1 | FileCheck --check-prefix=ERR2 %s
|
||||
|
||||
// ERR: error: unsupported option '-mlong-double-128' for target 'aarch64'
|
||||
// ERR2: error: unsupported option '-mlong-double-80' for target 'powerpc-linux-musl'
|
||||
|
|
Loading…
Reference in New Issue