From 6116fc0887d107536c17eeae9572851a8b34e963 Mon Sep 17 00:00:00 2001 From: Joerg Sonnenberger Date: Mon, 9 Nov 2015 23:39:45 +0000 Subject: [PATCH] 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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@252545 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Basic/Targets.cpp | 102 ++++++++++++++++++--- lib/Driver/Tools.cpp | 41 ++++++++- test/Driver/netbsd.c | 2 +- test/Driver/sparc-as.c | 71 ++++++++++++++ test/Driver/sparcv9-as.c | 72 +++++++++++++++ test/Preprocessor/predefined-arch-macros.c | 9 ++ 6 files changed, 279 insertions(+), 18 deletions(-) create mode 100644 test/Driver/sparc-as.c create mode 100644 test/Driver/sparcv9-as.c diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp index a88c614e1f..a6cda4b38c 100644 --- a/lib/Basic/Targets.cpp +++ b/lib/Basic/Targets.cpp @@ -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(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(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; } }; diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index b415ea5384..2d09e9537d 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -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(Name) + .Case("niagara", "-Av9b") + .Case("niagara2", "-Av9b") + .Case("niagara3", "-Av9d") + .Case("niagara4", "-Av9d") + .Default("-Av9"); + } else { + return llvm::StringSwitch(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(Compilation &C, const JobAction &JA, } 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; diff --git a/test/Driver/netbsd.c b/test/Driver/netbsd.c index 612935d981..ffaab36390 100644 --- a/test/Driver/netbsd.c +++ b/test/Driver/netbsd.c @@ -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" diff --git a/test/Driver/sparc-as.c b/test/Driver/sparc-as.c new file mode 100644 index 0000000000..d44e8453bd --- /dev/null +++ b/test/Driver/sparc-as.c @@ -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" diff --git a/test/Driver/sparcv9-as.c b/test/Driver/sparcv9-as.c new file mode 100644 index 0000000000..9e6249c575 --- /dev/null +++ b/test/Driver/sparcv9-as.c @@ -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; diff --git a/test/Preprocessor/predefined-arch-macros.c b/test/Preprocessor/predefined-arch-macros.c index 4130810399..1254ac4627 100644 --- a/test/Preprocessor/predefined-arch-macros.c +++ b/test/Preprocessor/predefined-arch-macros.c @@ -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 \ -- 2.50.1