15 #include "llvm/ADT/StringSwitch.h" 16 #include "llvm/Option/ArgList.h" 20 using namespace clang;
24 const llvm::Triple &Triple) {
25 if (
const Arg *A = Args.getLastArg(clang::driver::options::OPT_march_EQ)) {
26 if (StringRef(A->getValue()) !=
"native") {
27 if (Triple.isOSDarwin() && Triple.getArchName() ==
"x86_64h")
38 std::string CPU = llvm::sys::getHostCPUName();
39 if (!CPU.empty() && CPU !=
"generic")
40 return Args.MakeArgString(CPU);
43 if (
const Arg *A = Args.getLastArgNoClaim(options::OPT__SLASH_arch)) {
45 StringRef Arch = A->getValue();
46 const char *CPU =
nullptr;
47 if (Triple.getArch() == llvm::Triple::x86) {
48 CPU = llvm::StringSwitch<const char *>(Arch)
50 .Case(
"SSE",
"pentium3")
51 .Case(
"SSE2",
"pentium4")
55 CPU = llvm::StringSwitch<const char *>(Arch)
56 .Case(
"AVX",
"sandybridge")
57 .Case(
"AVX2",
"haswell")
58 .Case(
"AVX512F",
"knl")
59 .Case(
"AVX512",
"skylake-avx512")
70 if (Triple.getArch() != llvm::Triple::x86_64 &&
71 Triple.getArch() != llvm::Triple::x86)
74 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
77 if (Triple.isOSDarwin()) {
78 if (Triple.getArchName() ==
"x86_64h")
82 if (Triple.isMacOSX() && !Triple.isOSVersionLT(10, 12))
85 return Is64Bit ?
"core2" :
"yonah";
89 if (Triple.isPS4CPU())
93 if (Triple.isAndroid())
94 return Is64Bit ?
"x86-64" :
"i686";
100 switch (Triple.getOS()) {
101 case llvm::Triple::FreeBSD:
102 case llvm::Triple::NetBSD:
103 case llvm::Triple::OpenBSD:
105 case llvm::Triple::Haiku:
115 std::vector<StringRef> &Features) {
117 if (
const Arg *A = Args.getLastArg(clang::driver::options::OPT_march_EQ)) {
118 if (StringRef(A->getValue()) ==
"native") {
119 llvm::StringMap<bool> HostFeatures;
120 if (llvm::sys::getHostCPUFeatures(HostFeatures))
121 for (
auto &F : HostFeatures)
123 Args.MakeArgString((F.second ?
"+" :
"-") + F.first()));
127 if (Triple.getArchName() ==
"x86_64h") {
130 Features.push_back(
"-rdrnd");
131 Features.push_back(
"-aes");
132 Features.push_back(
"-pclmul");
133 Features.push_back(
"-rtm");
134 Features.push_back(
"-fsgsbase");
137 const llvm::Triple::ArchType ArchType = Triple.getArch();
139 if (Triple.isAndroid()) {
140 if (ArchType == llvm::Triple::x86_64) {
141 Features.push_back(
"+sse4.2");
142 Features.push_back(
"+popcnt");
144 Features.push_back(
"+ssse3");
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
Dataflow Directional Tag Classes.