Index: clang/include/clang/Driver/Options.td =================================================================== --- clang/include/clang/Driver/Options.td +++ clang/include/clang/Driver/Options.td @@ -2033,9 +2033,14 @@ def mfancy_math_387 : Flag<["-"], "mfancy-math-387">, Group; def mlong_calls : Flag<["-"], "mlong-calls">, Group, HelpText<"Generate branches with extended addressability, usually via indirect jumps.">; -def mlong_double_64 : Flag<["-"], "mlong-double-64">, Group, Flags<[CC1Option]>, +def LongDouble_Group : OptionGroup<"">, Group, + DocName<"Long double flags">, + DocBrief<[{Selects the long double implementation}]>; +def mlong_double_64 : Flag<["-"], "mlong-double-64">, Group, Flags<[CC1Option]>, HelpText<"Force long double to be 64 bits">; -def mlong_double_128 : Flag<["-"], "mlong-double-128">, Group, Flags<[CC1Option]>, +def mlong_double_80 : Flag<["-"], "mlong-double-80">, 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, Flags<[CC1Option]>, HelpText<"Force long double to be 128 bits">; def mno_long_calls : Flag<["-"], "mno-long-calls">, Group, HelpText<"Restore the default behaviour of not generating long calls">; Index: clang/lib/Driver/ToolChains/Clang.cpp =================================================================== --- clang/lib/Driver/ToolChains/Clang.cpp +++ clang/lib/Driver/ToolChains/Clang.cpp @@ -4046,8 +4046,7 @@ 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()) Index: clang/test/CodeGen/x86-long-double.cpp =================================================================== --- clang/test/CodeGen/x86-long-double.cpp +++ clang/test/CodeGen/x86-long-double.cpp @@ -16,6 +16,26 @@ // RUN: %clang_cc1 %s -emit-llvm -o - -triple=x86_64-apple-darwin -mlong-double-64 | \ // RUN: FileCheck --check-prefixes=FP64,FP64-X64 %s +// Check that the last option wins. +// RUN: %clang_cc1 %s -emit-llvm -o - -triple=i686 -mlong-double-64 -mlong-double-80 | \ +// RUN: FileCheck --check-prefixes=FP80,FP80-ELF32 %s +// RUN: %clang_cc1 %s -emit-llvm -o - -triple=i686-apple-darwin -mlong-double-64 -mlong-double-80 | \ +// RUN: FileCheck --check-prefixes=FP80,FP80-DARWIN %s +// RUN: %clang_cc1 %s -emit-llvm -o - -triple=x86_64 -mlong-double-64 -mlong-double-80 | \ +// RUN: FileCheck --check-prefixes=FP80,FP80-ELF64 %s +// RUN: %clang_cc1 %s -emit-llvm -o - -triple=x86_64-apple-darwin -mlong-double-64 -mlong-double-80 | \ +// RUN: FileCheck --check-prefixes=FP80,FP80-DARWIN %s + +// Check that the last option wins. +// RUN: %clang_cc1 %s -emit-llvm -o - -triple=i686 -mlong-double-128 -mlong-double-80 | \ +// RUN: FileCheck --check-prefixes=FP80,FP80-ELF32 %s +// RUN: %clang_cc1 %s -emit-llvm -o - -triple=i686-apple-darwin -mlong-double-128 -mlong-double-80 | \ +// RUN: FileCheck --check-prefixes=FP80,FP80-DARWIN %s +// RUN: %clang_cc1 %s -emit-llvm -o - -triple=x86_64 -mlong-double-128 -mlong-double-80 | \ +// RUN: FileCheck --check-prefixes=FP80,FP80-ELF64 %s +// RUN: %clang_cc1 %s -emit-llvm -o - -triple=x86_64-apple-darwin -mlong-double-128 -mlong-double-80 | \ +// RUN: FileCheck --check-prefixes=FP80,FP80-DARWIN %s + // RUN: %clang_cc1 %s -emit-llvm -o - -triple=i686 -mlong-double-128 | \ // RUN: FileCheck --check-prefix=FP128 %s // RUN: %clang_cc1 %s -emit-llvm -o - -triple=i686-apple-darwin -mlong-double-128 | \