diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -164,6 +164,8 @@ Group, DocName<"ARM">; def m_hexagon_Features_Group : OptionGroup<"">, Group, DocName<"Hexagon">; +def m_sparc_Features_Group : OptionGroup<"">, + Group, DocName<"SPARC">; // The features added by this group will not be added to target features. // These are explicitly handled. def m_hexagon_Features_HVX_Group : OptionGroup<"">, @@ -4525,6 +4527,22 @@ def mno_nvs : Flag<["-"], "mno-nvs">, Group, Flags<[CC1Option]>, HelpText<"Disable generation of new-value stores">; +// SPARC feature flags +def mfpu : Flag<["-"], "mfpu">, Group; +def mno_fpu : Flag<["-"], "mno-fpu">, Group; +def mfsmuld : Flag<["-"], "mfsmuld">, Group; +def mno_fsmuld : Flag<["-"], "mno-fsmuld">, Group; +def mpopc : Flag<["-"], "mpopc">, Group; +def mno_popc : Flag<["-"], "mno-popc">, Group; +def mvis : Flag<["-"], "mvis">, Group; +def mno_vis : Flag<["-"], "mno-vis">, Group; +def mvis2 : Flag<["-"], "mvis2">, Group; +def mno_vis2 : Flag<["-"], "mno-vis2">, Group; +def mvis3 : Flag<["-"], "mvis3">, Group; +def mno_vis3 : Flag<["-"], "mno-vis3">, Group; +def mhard_quad_float : Flag<["-"], "mhard-quad-float">, Group; +def msoft_quad_float : Flag<["-"], "msoft-quad-float">, Group; + // M68k features flags def m68000 : Flag<["-"], "m68000">, Group; def m68010 : Flag<["-"], "m68010">, Group; diff --git a/clang/lib/Driver/ToolChains/Arch/Sparc.cpp b/clang/lib/Driver/ToolChains/Arch/Sparc.cpp --- a/clang/lib/Driver/ToolChains/Arch/Sparc.cpp +++ b/clang/lib/Driver/ToolChains/Arch/Sparc.cpp @@ -82,12 +82,14 @@ sparc::FloatABI sparc::getSparcFloatABI(const Driver &D, const ArgList &Args) { sparc::FloatABI ABI = sparc::FloatABI::Invalid; - if (Arg *A = Args.getLastArg(clang::driver::options::OPT_msoft_float, - options::OPT_mhard_float, + if (Arg *A = Args.getLastArg(options::OPT_msoft_float, options::OPT_mno_fpu, + options::OPT_mhard_float, options::OPT_mfpu, options::OPT_mfloat_abi_EQ)) { - if (A->getOption().matches(clang::driver::options::OPT_msoft_float)) + if (A->getOption().matches(options::OPT_msoft_float) || + A->getOption().matches(options::OPT_mno_fpu)) ABI = sparc::FloatABI::Soft; - else if (A->getOption().matches(options::OPT_mhard_float)) + else if (A->getOption().matches(options::OPT_mhard_float) || + A->getOption().matches(options::OPT_mfpu)) ABI = sparc::FloatABI::Hard; else { ABI = llvm::StringSwitch(A->getValue()) @@ -143,4 +145,47 @@ sparc::FloatABI FloatABI = sparc::getSparcFloatABI(D, Args); if (FloatABI == sparc::FloatABI::Soft) Features.push_back("+soft-float"); + + if (Arg *A = Args.getLastArg(options::OPT_mfsmuld, options::OPT_mno_fsmuld)) { + if (A->getOption().matches(options::OPT_mfsmuld)) + Features.push_back("+fsmuld"); + else + Features.push_back("-fsmuld"); + } + + if (Arg *A = Args.getLastArg(options::OPT_mpopc, options::OPT_mno_popc)) { + if (A->getOption().matches(options::OPT_mpopc)) + Features.push_back("+popc"); + else + Features.push_back("-popc"); + } + + if (Arg *A = Args.getLastArg(options::OPT_mvis, options::OPT_mno_vis)) { + if (A->getOption().matches(options::OPT_mvis)) + Features.push_back("+vis"); + else + Features.push_back("-vis"); + } + + if (Arg *A = Args.getLastArg(options::OPT_mvis2, options::OPT_mno_vis2)) { + if (A->getOption().matches(options::OPT_mvis2)) + Features.push_back("+vis2"); + else + Features.push_back("-vis2"); + } + + if (Arg *A = Args.getLastArg(options::OPT_mvis3, options::OPT_mno_vis3)) { + if (A->getOption().matches(options::OPT_mvis3)) + Features.push_back("+vis3"); + else + Features.push_back("-vis3"); + } + + if (Arg *A = Args.getLastArg(options::OPT_mhard_quad_float, + options::OPT_msoft_quad_float)) { + if (A->getOption().matches(options::OPT_mhard_quad_float)) + Features.push_back("+hard-quad-float"); + else + Features.push_back("-hard-quad-float"); + } } diff --git a/clang/test/Driver/sparc-target-features.c b/clang/test/Driver/sparc-target-features.c new file mode 100644 --- /dev/null +++ b/clang/test/Driver/sparc-target-features.c @@ -0,0 +1,34 @@ +// RUN: %clang --target=sparc -mfpu %s -### 2>&1 | FileCheck -check-prefix=FPU %s +// RUN: %clang --target=sparc -mno-fpu %s -### 2>&1 | FileCheck -check-prefix=NO-FPU %s +// FPU: "-mfloat-abi" "hard" +// NO-FPU: "-mfloat-abi" "soft" + +// RUN: %clang --target=sparc -mfsmuld %s -### 2>&1 | FileCheck -check-prefix=FSMULD %s +// RUN: %clang --target=sparc -mno-fsmuld %s -### 2>&1 | FileCheck -check-prefix=NO-FSMULD %s +// FSMULD: "-target-feature" "+fsmuld" +// NO-FSMULD: "-target-feature" "-fsmuld" + +// RUN: %clang --target=sparc -mpopc %s -### 2>&1 | FileCheck -check-prefix=POPC %s +// RUN: %clang --target=sparc -mno-popc %s -### 2>&1 | FileCheck -check-prefix=NO-POPC %s +// POPC: "-target-feature" "+popc" +// NO-POPC: "-target-feature" "-popc" + +// RUN: %clang --target=sparc -mvis %s -### 2>&1 | FileCheck -check-prefix=VIS %s +// RUN: %clang --target=sparc -mno-vis %s -### 2>&1 | FileCheck -check-prefix=NO-VIS %s +// VIS: "-target-feature" "+vis" +// NO-VIS: "-target-feature" "-vis" + +// RUN: %clang --target=sparc -mvis2 %s -### 2>&1 | FileCheck -check-prefix=VIS2 %s +// RUN: %clang --target=sparc -mno-vis2 %s -### 2>&1 | FileCheck -check-prefix=NO-VIS2 %s +// VIS2: "-target-feature" "+vis2" +// NO-VIS2: "-target-feature" "-vis2" + +// RUN: %clang --target=sparc -mvis3 %s -### 2>&1 | FileCheck -check-prefix=VIS3 %s +// RUN: %clang --target=sparc -mno-vis3 %s -### 2>&1 | FileCheck -check-prefix=NO-VIS3 %s +// VIS3: "-target-feature" "+vis3" +// NO-VIS3: "-target-feature" "-vis3" + +// RUN: %clang --target=sparc -mhard-quad-float %s -### 2>&1 | FileCheck -check-prefix=HARD-QUAD-FLOAT %s +// RUN: %clang --target=sparc -msoft-quad-float %s -### 2>&1 | FileCheck -check-prefix=SOFT-QUAD-FLOAT %s +// HARD-QUAD-FLOAT: "-target-feature" "+hard-quad-float" +// SOFT-QUAD-FLOAT: "-target-feature" "-hard-quad-float"