forked from OSchip/llvm-project
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. llvm-svn: 252545
This commit is contained in:
parent
7068fc369d
commit
ec353d3fc6
|
@ -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;
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -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(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;
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
|
@ -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;
|
|
@ -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 \
|
||||
|
|
Loading…
Reference in New Issue