Author: joerg Date: Mon Nov 9 17:39:45 2015 New Revision: 252545 URL: http://llvm.org/viewvc/llvm-project?rev=252545&view=rev Log: Reorganise CPU handling for Sparc. When using -mcpu=v9 and co, __sparcv8 is not defined for 32bit mode, but __sparcv9 is. Pass down the correct -target-cpu flags to the backend, so that instruction restrictions are applied correctly. Pass down the correct -A flag when not using IAS. The latter is limited to NetBSD targets in this commit.
Added: cfe/trunk/test/Driver/sparc-as.c cfe/trunk/test/Driver/sparcv9-as.c Modified: cfe/trunk/lib/Basic/Targets.cpp cfe/trunk/lib/Driver/Tools.cpp cfe/trunk/test/Driver/netbsd.c cfe/trunk/test/Preprocessor/predefined-arch-macros.c Modified: cfe/trunk/lib/Basic/Targets.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets.cpp?rev=252545&r1=252544&r2=252545&view=diff ============================================================================== --- cfe/trunk/lib/Basic/Targets.cpp (original) +++ cfe/trunk/lib/Basic/Targets.cpp Mon Nov 9 17:39:45 2015 @@ -5792,6 +5792,79 @@ public: // FIXME: Implement! return ""; } + + // No Sparc V7 for now, the backend doesn't support it anyway. + enum CPUKind { + CK_GENERIC, + CK_V8, + CK_SUPERSPARC, + CK_SPARCLITE, + CK_F934, + CK_HYPERSPARC, + CK_SPARCLITE86X, + CK_SPARCLET, + CK_TSC701, + CK_V9, + CK_ULTRASPARC, + CK_ULTRASPARC3, + CK_NIAGARA, + CK_NIAGARA2, + CK_NIAGARA3, + CK_NIAGARA4 + } CPU = CK_GENERIC; + + enum CPUGeneration { + CG_V8, + CG_V9, + }; + + CPUGeneration getCPUGeneration(CPUKind Kind) const { + switch (Kind) { + case CK_GENERIC: + case CK_V8: + case CK_SUPERSPARC: + case CK_SPARCLITE: + case CK_F934: + case CK_HYPERSPARC: + case CK_SPARCLITE86X: + case CK_SPARCLET: + case CK_TSC701: + return CG_V8; + case CK_V9: + case CK_ULTRASPARC: + case CK_ULTRASPARC3: + case CK_NIAGARA: + case CK_NIAGARA2: + case CK_NIAGARA3: + case CK_NIAGARA4: + return CG_V9; + } + } + + CPUKind getCPUKind(StringRef Name) const { + return llvm::StringSwitch<CPUKind>(Name) + .Case("v8", CK_V8) + .Case("supersparc", CK_SUPERSPARC) + .Case("sparclite", CK_SPARCLITE) + .Case("f934", CK_F934) + .Case("hypersparc", CK_HYPERSPARC) + .Case("sparclite86x", CK_SPARCLITE86X) + .Case("sparclet", CK_SPARCLET) + .Case("tsc701", CK_TSC701) + .Case("v9", CK_V9) + .Case("ultrasparc", CK_ULTRASPARC) + .Case("ultrasparc3", CK_ULTRASPARC3) + .Case("niagara", CK_NIAGARA) + .Case("niagara2", CK_NIAGARA2) + .Case("niagara3", CK_NIAGARA3) + .Case("niagara4", CK_NIAGARA4) + .Default(CK_GENERIC); + } + + bool setCPU(const std::string &Name) override { + CPU = getCPUKind(Name); + return CPU != CK_GENERIC; + } }; const char * const SparcTargetInfo::GCCRegNames[] = { @@ -5868,7 +5941,18 @@ public: void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override { SparcTargetInfo::getTargetDefines(Opts, Builder); - Builder.defineMacro("__sparcv8"); + switch (getCPUGeneration(CPU)) { + case CG_V8: + Builder.defineMacro("__sparcv8"); + if (getTriple().getOS() != llvm::Triple::Solaris) + Builder.defineMacro("__sparcv8__"); + break; + case CG_V9: + Builder.defineMacro("__sparcv9"); + if (getTriple().getOS() != llvm::Triple::Solaris) + Builder.defineMacro("__sparcv9__"); + break; + } } }; @@ -5919,19 +6003,9 @@ public: } bool setCPU(const std::string &Name) override { - bool CPUKnown = llvm::StringSwitch<bool>(Name) - .Case("v9", true) - .Case("ultrasparc", true) - .Case("ultrasparc3", true) - .Case("niagara", true) - .Case("niagara2", true) - .Case("niagara3", true) - .Case("niagara4", true) - .Default(false); - - // No need to store the CPU yet. There aren't any CPU-specific - // macros to define. - return CPUKnown; + if (!SparcTargetInfo::setCPU(Name)) + return false; + return getCPUGeneration(CPU) == CG_V9; } }; Modified: cfe/trunk/lib/Driver/Tools.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=252545&r1=252544&r2=252545&view=diff ============================================================================== --- cfe/trunk/lib/Driver/Tools.cpp (original) +++ cfe/trunk/lib/Driver/Tools.cpp Mon Nov 9 17:39:45 2015 @@ -52,6 +52,36 @@ using namespace clang::driver::tools; using namespace clang; using namespace llvm::opt; +static const char *getSparcAsmModeForCPU(StringRef Name, + const llvm::Triple &Triple) { + if (Triple.getArch() == llvm::Triple::sparcv9) { + return llvm::StringSwitch<const char *>(Name) + .Case("niagara", "-Av9b") + .Case("niagara2", "-Av9b") + .Case("niagara3", "-Av9d") + .Case("niagara4", "-Av9d") + .Default("-Av9"); + } else { + return llvm::StringSwitch<const char *>(Name) + .Case("v8", "-Av8") + .Case("supersparc", "-Av8") + .Case("sparclite", "-Asparclite") + .Case("f934", "-Asparclite") + .Case("hypersparc", "-Av8") + .Case("sparclite86x", "-Asparclite") + .Case("sparclet", "-Asparclet") + .Case("tsc701", "-Asparclet") + .Case("v9", "-Av8plus") + .Case("ultrasparc", "-Av8plus") + .Case("ultrasparc3", "-Av8plus") + .Case("niagara", "-Av8plusb") + .Case("niagara2", "-Av8plusb") + .Case("niagara3", "-Av8plusd") + .Case("niagara4", "-Av8plusd") + .Default("-Av8"); + } +} + /// CheckPreprocessingOptions - Perform some validation of preprocessing /// arguments that is shared with gcc. static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) { @@ -7762,16 +7792,21 @@ void netbsd::Assembler::ConstructJob(Com } case llvm::Triple::sparc: - case llvm::Triple::sparcel: + case llvm::Triple::sparcel: { CmdArgs.push_back("-32"); + std::string CPU = getCPUName(Args, getToolChain().getTriple()); + CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple())); AddAssemblerKPIC(getToolChain(), Args, CmdArgs); break; + } - case llvm::Triple::sparcv9: + case llvm::Triple::sparcv9: { CmdArgs.push_back("-64"); - CmdArgs.push_back("-Av9"); + std::string CPU = getCPUName(Args, getToolChain().getTriple()); + CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple())); AddAssemblerKPIC(getToolChain(), Args, CmdArgs); break; + } default: break; Modified: cfe/trunk/test/Driver/netbsd.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/netbsd.c?rev=252545&r1=252544&r2=252545&view=diff ============================================================================== --- cfe/trunk/test/Driver/netbsd.c (original) +++ cfe/trunk/test/Driver/netbsd.c Mon Nov 9 17:39:45 2015 @@ -206,7 +206,7 @@ // ARM-6: "{{.*}}/usr/lib{{/|\\\\}}crtend.o" "{{.*}}/usr/lib{{/|\\\\}}crtn.o" // SPARC: clang{{.*}}" "-cc1" "-triple" "sparc--netbsd" -// SPARC: as{{.*}}" "-32" "-o" +// SPARC: as{{.*}}" "-32" "-Av8" "-o" // SPARC: ld{{.*}}" "--eh-frame-hdr" "-dynamic-linker" "/libexec/ld.elf_so" // SPARC: "-m" "elf32_sparc" // SPARC: "-o" "a.out" "{{.*}}/usr/lib{{/|\\\\}}crt0.o" Added: cfe/trunk/test/Driver/sparc-as.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/sparc-as.c?rev=252545&view=auto ============================================================================== --- cfe/trunk/test/Driver/sparc-as.c (added) +++ cfe/trunk/test/Driver/sparc-as.c Mon Nov 9 17:39:45 2015 @@ -0,0 +1,71 @@ +// RUN: %clang -no-canonical-prefixes -target sparc--netbsd \ +// RUN: -no-integrated-as --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=SPARC %s + +// RUN: %clang -mcpu=v8 -no-canonical-prefixes -target sparc--netbsd \ +// RUN: -no-integrated-as --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=SPARC-V8 %s + +// RUN: %clang -mcpu=supersparc -no-canonical-prefixes -target sparc--netbsd \ +// RUN: -no-integrated-as --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=SPARC-V8 %s + +// RUN: %clang -mcpu=sparclite -no-canonical-prefixes -target sparc--netbsd \ +// RUN: -no-integrated-as --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=SPARC-SPARCLITE %s + +// RUN: %clang -mcpu=f934 -no-canonical-prefixes -target sparc--netbsd \ +// RUN: -no-integrated-as --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=SPARC-SPARCLITE %s + +// RUN: %clang -mcpu=hypersparc -no-canonical-prefixes -target sparc--netbsd \ +// RUN: -no-integrated-as --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=SPARC-V8 %s + +// RUN: %clang -mcpu=sparclite86x -no-canonical-prefixes -target sparc--netbsd \ +// RUN: -no-integrated-as --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=SPARC-SPARCLITE %s + +// RUN: %clang -mcpu=sparclet -no-canonical-prefixes -target sparc--netbsd \ +// RUN: -no-integrated-as --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=SPARC-SPARCLET %s + +// RUN: %clang -mcpu=tsc701 -no-canonical-prefixes -target sparc--netbsd \ +// RUN: -no-integrated-as --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=SPARC-SPARCLET %s + +// RUN: %clang -mcpu=v9 -no-canonical-prefixes -target sparc--netbsd \ +// RUN: -no-integrated-as --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=SPARC-V8PLUS %s + +// RUN: %clang -mcpu=ultrasparc -no-canonical-prefixes -target sparc--netbsd \ +// RUN: -no-integrated-as --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=SPARC-V8PLUS %s + +// RUN: %clang -mcpu=ultrasparc3 -no-canonical-prefixes -target sparc--netbsd \ +// RUN: -no-integrated-as --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=SPARC-V8PLUS %s + +// RUN: %clang -mcpu=niagara -no-canonical-prefixes -target sparc--netbsd \ +// RUN: -no-integrated-as --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=SPARC-V8PLUSB %s + +// RUN: %clang -mcpu=niagara2 -no-canonical-prefixes -target sparc--netbsd \ +// RUN: -no-integrated-as --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=SPARC-V8PLUSB %s + +// RUN: %clang -mcpu=niagara3 -no-canonical-prefixes -target sparc--netbsd \ +// RUN: -no-integrated-as --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=SPARC-V8PLUSD %s + +// RUN: %clang -mcpu=niagara4 -no-canonical-prefixes -target sparc--netbsd \ +// RUN: -no-integrated-as --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=SPARC-V8PLUSD %s + +// SPARC: as{{.*}}" "-32" "-Av8" "-o" +// SPARC-V8: as{{.*}}" "-32" "-Av8" "-o" +// SPARC-SPARCLITE: as{{.*}}" "-32" "-Asparclite" "-o" +// SPARC-SPARCLET: as{{.*}}" "-32" "-Asparclet" "-o" +// SPARC-V8PLUS: as{{.*}}" "-32" "-Av8plus" "-o" +// SPARC-V8PLUSB: as{{.*}}" "-32" "-Av8plusb" "-o" +// SPARC-V8PLUSD: as{{.*}}" "-32" "-Av8plusd" "-o" Added: cfe/trunk/test/Driver/sparcv9-as.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/sparcv9-as.c?rev=252545&view=auto ============================================================================== --- cfe/trunk/test/Driver/sparcv9-as.c (added) +++ cfe/trunk/test/Driver/sparcv9-as.c Mon Nov 9 17:39:45 2015 @@ -0,0 +1,72 @@ +// RUN: %clang -no-canonical-prefixes -target sparcv9--netbsd \ +// RUN: -no-integrated-as --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=SPARC %s + +// RUN: %clang -mcpu=v9 -no-canonical-prefixes -target sparcv9--netbsd \ +// RUN: -no-integrated-as --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=SPARC-V9 %s + +// RUN: %clang -mcpu=ultrasparc -no-canonical-prefixes -target sparcv9--netbsd \ +// RUN: -no-integrated-as --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=SPARC-V9 %s + +// RUN: %clang -mcpu=ultrasparc3 -no-canonical-prefixes -target sparcv9--netbsd \ +// RUN: -no-integrated-as --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=SPARC-V9 %s + +// RUN: %clang -mcpu=niagara -no-canonical-prefixes -target sparcv9--netbsd \ +// RUN: -no-integrated-as --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=SPARC-V9B %s + +// RUN: %clang -mcpu=niagara2 -no-canonical-prefixes -target sparcv9--netbsd \ +// RUN: -no-integrated-as --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=SPARC-V9B %s + +// RUN: %clang -mcpu=niagara3 -no-canonical-prefixes -target sparcv9--netbsd \ +// RUN: -no-integrated-as --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=SPARC-V9D %s + +// RUN: %clang -mcpu=niagara4 -no-canonical-prefixes -target sparcv9--netbsd \ +// RUN: -no-integrated-as --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=SPARC-V9D %s + +// SPARC: as{{.*}}" "-64" "-Av9" "-o" +// SPARC-V9: as{{.*}}" "-64" "-Av9" "-o" +// SPARC-V9B: as{{.*}}" "-64" "-Av9b" "-o" +// SPARC-V9D: as{{.*}}" "-64" "-Av9d" "-o" + +// RUN: not %clang -mcpu=v8 -no-canonical-prefixes -target sparcv9--netbsd \ +// RUN: -no-integrated-as --sysroot=%S/Inputs/basic_netbsd_tree %s -c 2>&1 \ +// RUN: | FileCheck -check-prefix=SPARC-V8 %s + +// RUN: not %clang -mcpu=supersparc -no-canonical-prefixes -target sparcv9--netbsd \ +// RUN: -no-integrated-as --sysroot=%S/Inputs/basic_netbsd_tree %s -c 2>&1 \ +// RUN: | FileCheck -check-prefix=SPARC-V8 %s + +// RUN: not %clang -mcpu=sparclite -no-canonical-prefixes -target sparcv9--netbsd \ +// RUN: -no-integrated-as --sysroot=%S/Inputs/basic_netbsd_tree %s -c 2>&1 \ +// RUN: | FileCheck -check-prefix=SPARC-V8 %s + +// RUN: not %clang -mcpu=f934 -no-canonical-prefixes -target sparcv9--netbsd \ +// RUN: -no-integrated-as --sysroot=%S/Inputs/basic_netbsd_tree %s -c 2>&1 \ +// RUN: | FileCheck -check-prefix=SPARC-V8 %s + +// RUN: not %clang -mcpu=hypersparc -no-canonical-prefixes -target sparcv9--netbsd \ +// RUN: -no-integrated-as --sysroot=%S/Inputs/basic_netbsd_tree %s -c 2>&1 \ +// RUN: | FileCheck -check-prefix=SPARC-V8 %s + +// RUN: not %clang -mcpu=sparclite86x -no-canonical-prefixes -target sparcv9--netbsd \ +// RUN: -no-integrated-as --sysroot=%S/Inputs/basic_netbsd_tree %s -c 2>&1 \ +// RUN: | FileCheck -check-prefix=SPARC-V8 %s + +// RUN: not %clang -mcpu=sparclet -no-canonical-prefixes -target sparcv9--netbsd \ +// RUN: -no-integrated-as --sysroot=%S/Inputs/basic_netbsd_tree %s -c 2>&1 \ +// RUN: | FileCheck -check-prefix=SPARC-V8 %s + +// RUN: not %clang -mcpu=tsc701 -no-canonical-prefixes -target sparcv9--netbsd \ +// RUN: -no-integrated-as --sysroot=%S/Inputs/basic_netbsd_tree %s -c 2>&1 \ +// RUN: | FileCheck -check-prefix=SPARC-V8 %s + +// SPARC-V8: error: unknown target CPU + +int x; Modified: cfe/trunk/test/Preprocessor/predefined-arch-macros.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Preprocessor/predefined-arch-macros.c?rev=252545&r1=252544&r2=252545&view=diff ============================================================================== --- cfe/trunk/test/Preprocessor/predefined-arch-macros.c (original) +++ cfe/trunk/test/Preprocessor/predefined-arch-macros.c Mon Nov 9 17:39:45 2015 @@ -1741,11 +1741,20 @@ // RUN: %clang -E -dM %s -o - 2>&1 \ // RUN: -target sparc-unknown-linux \ // RUN: | FileCheck %s -check-prefix=CHECK_SPARC +// RUN: %clang -mcpu=v9 -E -dM %s -o - 2>&1 \ +// RUN: -target sparc-unknown-linux \ +// RUN: | FileCheck %s -check-prefix=CHECK_SPARC-V9 // // CHECK_SPARC: #define __BIG_ENDIAN__ 1 // CHECK_SPARC: #define __sparc 1 // CHECK_SPARC: #define __sparc__ 1 +// CHECK_SPARC-NOT: #define __sparcv9 1 // CHECK_SPARC: #define __sparcv8 1 +// CHECK_SPARC-NOT: #define __sparcv9 1 + +// CHECK_SPARC-V9-NOT: #define __sparcv8 1 +// CHECK_SPARC-V9: #define __sparcv9 1 +// CHECK_SPARC-V9-NOT: #define __sparcv8 1 // // RUN: %clang -E -dM %s -o - 2>&1 \ _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits