Skip to content

Commit b00211d

Browse files
rorthtstellar
authored andcommitted
[clang][Driver] Handle SPARC -mcpu=native etc.
To make use of SPARC support in `getHostCPUName` as implemented by D130272 <https://reviews.llvm.org/D130272>, this patch uses it to handle `-mcpu=native` and `-mtune=native`. To match GCC, this patch rejects `-march` instead of silently treating it as a no-op. Tested on `sparcv9-sun-solaris2.11` and checking that those options are passed on as `-target-cpu` resp. `-tune-cpu` as expected. Differential Revision: https://reviews.llvm.org/D130273 (cherry picked from commit bf37148)
1 parent 0b96bce commit b00211d

File tree

7 files changed

+92
-5
lines changed

7 files changed

+92
-5
lines changed

clang/lib/Driver/ToolChains/Arch/Sparc.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "clang/Driver/Options.h"
1313
#include "llvm/ADT/StringSwitch.h"
1414
#include "llvm/Option/ArgList.h"
15+
#include "llvm/Support/Host.h"
1516

1617
using namespace clang::driver;
1718
using namespace clang::driver::tools;
@@ -113,6 +114,30 @@ sparc::FloatABI sparc::getSparcFloatABI(const Driver &D,
113114
return ABI;
114115
}
115116

117+
std::string sparc::getSparcTargetCPU(const Driver &D, const ArgList &Args,
118+
const llvm::Triple &Triple) {
119+
if (const Arg *A = Args.getLastArg(clang::driver::options::OPT_march_EQ)) {
120+
D.Diag(diag::err_drv_unsupported_opt_for_target)
121+
<< A->getSpelling() << Triple.getTriple();
122+
return "";
123+
}
124+
125+
if (const Arg *A = Args.getLastArg(clang::driver::options::OPT_mcpu_EQ)) {
126+
StringRef CPUName = A->getValue();
127+
if (CPUName == "native") {
128+
std::string CPU = std::string(llvm::sys::getHostCPUName());
129+
if (!CPU.empty() && CPU != "generic")
130+
return CPU;
131+
return "";
132+
}
133+
return std::string(CPUName);
134+
}
135+
136+
if (Triple.getArch() == llvm::Triple::sparc && Triple.isOSSolaris())
137+
return "v9";
138+
return "";
139+
}
140+
116141
void sparc::getSparcTargetFeatures(const Driver &D, const ArgList &Args,
117142
std::vector<StringRef> &Features) {
118143
sparc::FloatABI FloatABI = sparc::getSparcFloatABI(D, Args);

clang/lib/Driver/ToolChains/Arch/Sparc.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ enum class FloatABI {
2828

2929
FloatABI getSparcFloatABI(const Driver &D, const llvm::opt::ArgList &Args);
3030

31+
std::string getSparcTargetCPU(const Driver &D, const llvm::opt::ArgList &Args,
32+
const llvm::Triple &Triple);
33+
3134
void getSparcTargetFeatures(const Driver &D, const llvm::opt::ArgList &Args,
3235
std::vector<llvm::StringRef> &Features);
3336
const char *getSparcAsmModeForCPU(llvm::StringRef Name,

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2205,6 +2205,18 @@ void Clang::AddSparcTargetArgs(const ArgList &Args,
22052205
CmdArgs.push_back("-mfloat-abi");
22062206
CmdArgs.push_back("hard");
22072207
}
2208+
2209+
if (const Arg *A = Args.getLastArg(clang::driver::options::OPT_mtune_EQ)) {
2210+
StringRef Name = A->getValue();
2211+
std::string TuneCPU;
2212+
if (Name == "native")
2213+
TuneCPU = std::string(llvm::sys::getHostCPUName());
2214+
else
2215+
TuneCPU = std::string(Name);
2216+
2217+
CmdArgs.push_back("-tune-cpu");
2218+
CmdArgs.push_back(Args.MakeArgString(TuneCPU));
2219+
}
22082220
}
22092221

22102222
void Clang::AddSystemZTargetArgs(const ArgList &Args,

clang/lib/Driver/ToolChains/CommonArgs.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "Arch/M68k.h"
1313
#include "Arch/Mips.h"
1414
#include "Arch/PPC.h"
15+
#include "Arch/Sparc.h"
1516
#include "Arch/SystemZ.h"
1617
#include "Arch/VE.h"
1718
#include "Arch/X86.h"
@@ -431,15 +432,15 @@ std::string tools::getCPUName(const Driver &D, const ArgList &Args,
431432

432433
case llvm::Triple::bpfel:
433434
case llvm::Triple::bpfeb:
434-
case llvm::Triple::sparc:
435-
case llvm::Triple::sparcel:
436-
case llvm::Triple::sparcv9:
437435
if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
438436
return A->getValue();
439-
if (T.getArch() == llvm::Triple::sparc && T.isOSSolaris())
440-
return "v9";
441437
return "";
442438

439+
case llvm::Triple::sparc:
440+
case llvm::Triple::sparcel:
441+
case llvm::Triple::sparcv9:
442+
return sparc::getSparcTargetCPU(D, Args, T);
443+
443444
case llvm::Triple::x86:
444445
case llvm::Triple::x86_64:
445446
return x86::getX86TargetCPU(D, Args, T);

clang/test/Driver/sparc-march.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
// RUN: %clang -target sparcv9 -march=v9 -### -c %s 2>&1 | FileCheck %s
2+
// RUN: %clang -target sparc64 -march=v9 -### -c %s 2>&1 | FileCheck %s
3+
// RUN: %clang -target sparc -march=v9 -### -c %s 2>&1 | FileCheck %s
4+
// CHECK: error: unsupported option '-march=' for target

clang/test/Driver/sparc-mcpu.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// RUN: %clang -target sparcv9 -### -c %s 2>&1 | FileCheck -check-prefix=SPARCV9 %s
2+
// SPARCV9: "-cc1"{{.*}} "-triple" "sparcv9"
3+
4+
// RUN: %clang -target sparc64 -### -c %s 2>&1 | FileCheck -check-prefix=SPARC64 %s
5+
// SPARC64: "-cc1"{{.*}} "-triple" "sparc64"
6+
7+
// RUN: %clang -target sparcv9 -mcpu=v9 -### -c %s 2>&1 | FileCheck -check-prefix=SPARCV9_V9 %s
8+
// SPARCV9_V9: "-cc1"{{.*}} "-triple" "sparcv9"{{.*}} "-target-cpu" "v9"
9+
10+
// RUN: %clang -target sparcv9 -mcpu=ultrasparc -### -c %s 2>&1 | FileCheck -check-prefix=SPARCV9_US %s
11+
// SPARCV9_US: "-cc1"{{.*}} "-triple" "sparcv9"{{.*}} "-target-cpu" "ultrasparc"
12+
13+
// RUN: %clang -target sparc -### -c %s 2>&1 | FileCheck -check-prefix=SPARC %s
14+
// SPARC: "-cc1"{{.*}} "-triple" "sparc"
15+
16+
// RUN: %clang -target sparc -mcpu=v9 -### -c %s 2>&1 | FileCheck -check-prefix=SPARC_V9 %s
17+
// SPARC_V9: "-cc1"{{.*}} "-triple" "sparc"{{.*}} "-target-cpu" "v9"
18+
19+
// RUN: %clang -target sparc -mcpu=ultrasparc -### -c %s 2>&1 | FileCheck -check-prefix=SPARC_US %s
20+
// SPARC_US: "-cc1"{{.*}} "-triple" "sparc"{{.*}} "-target-cpu" "ultrasparc"
21+

clang/test/Driver/sparc-mtune.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// RUN: %clang -target sparcv9 -### -c %s 2>&1 | FileCheck -check-prefix=SPARCV9 %s
2+
// SPARCV9: "-cc1"{{.*}} "-triple" "sparcv9"
3+
4+
// RUN: %clang -target sparc64 -### -c %s 2>&1 | FileCheck -check-prefix=SPARC64 %s
5+
// SPARC64: "-cc1"{{.*}} "-triple" "sparc64"
6+
7+
// RUN: %clang -target sparcv9 -mtune=v9 -### -c %s 2>&1 | FileCheck -check-prefix=SPARCV9_V9 %s
8+
// SPARCV9_V9: "-cc1"{{.*}} "-triple" "sparcv9"{{.*}} "-tune-cpu" "v9"
9+
10+
// RUN: %clang -target sparcv9 -mtune=ultrasparc -### -c %s 2>&1 | FileCheck -check-prefix=SPARCV9_US %s
11+
// SPARCV9_US: "-cc1"{{.*}} "-triple" "sparcv9"{{.*}} "-tune-cpu" "ultrasparc"
12+
13+
// RUN: %clang -target sparc -### -c %s 2>&1 | FileCheck -check-prefix=SPARC %s
14+
// SPARC: "-cc1"{{.*}} "-triple" "sparc"
15+
16+
// RUN: %clang -target sparc -mtune=v9 -### -c %s 2>&1 | FileCheck -check-prefix=SPARC_V9 %s
17+
// SPARC_V9: "-cc1"{{.*}} "-triple" "sparc"{{.*}} "-tune-cpu" "v9"
18+
19+
// RUN: %clang -target sparc -mtune=ultrasparc -### -c %s 2>&1 | FileCheck -check-prefix=SPARC_US %s
20+
// SPARC_US: "-cc1"{{.*}} "-triple" "sparc"{{.*}} "-tune-cpu" "ultrasparc"
21+

0 commit comments

Comments
 (0)