14 #include "llvm/ADT/StringSwitch.h" 15 #include "llvm/Option/ArgList.h" 19 using namespace clang;
23 const llvm::Triple &Triple) {
24 if (
const Arg *A = Args.getLastArg(clang::driver::options::OPT_march_EQ)) {
25 if (StringRef(A->getValue()) !=
"native")
33 std::string CPU = llvm::sys::getHostCPUName();
34 if (!CPU.empty() && CPU !=
"generic")
35 return Args.MakeArgString(CPU);
38 if (
const Arg *A = Args.getLastArgNoClaim(options::OPT__SLASH_arch)) {
40 StringRef Arch = A->getValue();
41 const char *CPU =
nullptr;
42 if (Triple.getArch() == llvm::Triple::x86) {
43 CPU = llvm::StringSwitch<const char *>(Arch)
45 .Case(
"SSE",
"pentium3")
46 .Case(
"SSE2",
"pentium4")
50 CPU = llvm::StringSwitch<const char *>(Arch)
51 .Case(
"AVX",
"sandybridge")
52 .Case(
"AVX2",
"haswell")
53 .Case(
"AVX512F",
"knl")
54 .Case(
"AVX512",
"skylake-avx512")
65 if (Triple.getArch() != llvm::Triple::x86_64 &&
66 Triple.getArch() != llvm::Triple::x86)
69 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
72 if (Triple.isOSDarwin()) {
73 if (Triple.getArchName() ==
"x86_64h")
77 if (Triple.isMacOSX() && !Triple.isOSVersionLT(10, 12))
80 return Is64Bit ?
"core2" :
"yonah";
84 if (Triple.isPS4CPU())
88 if (Triple.isAndroid())
89 return Is64Bit ?
"x86-64" :
"i686";
95 switch (Triple.getOS()) {
96 case llvm::Triple::FreeBSD:
97 case llvm::Triple::NetBSD:
98 case llvm::Triple::OpenBSD:
100 case llvm::Triple::Haiku:
110 std::vector<StringRef> &Features) {
112 if (
const Arg *A = Args.getLastArg(clang::driver::options::OPT_march_EQ)) {
113 if (StringRef(A->getValue()) ==
"native") {
114 llvm::StringMap<bool> HostFeatures;
115 if (llvm::sys::getHostCPUFeatures(HostFeatures))
116 for (
auto &F : HostFeatures)
118 Args.MakeArgString((F.second ?
"+" :
"-") + F.first()));
122 if (Triple.getArchName() ==
"x86_64h") {
125 Features.push_back(
"-rdrnd");
126 Features.push_back(
"-aes");
127 Features.push_back(
"-pclmul");
128 Features.push_back(
"-rtm");
129 Features.push_back(
"-fsgsbase");
132 const llvm::Triple::ArchType ArchType = Triple.getArch();
134 if (Triple.isAndroid()) {
135 if (ArchType == llvm::Triple::x86_64) {
136 Features.push_back(
"+sse4.2");
137 Features.push_back(
"+popcnt");
138 Features.push_back(
"+cx16");
140 Features.push_back(
"+ssse3");
149 if (Args.hasArgNoClaim(options::OPT_mretpoline, options::OPT_mno_retpoline,
150 options::OPT_mspeculative_load_hardening,
151 options::OPT_mno_speculative_load_hardening)) {
152 if (Args.hasFlag(options::OPT_mretpoline, options::OPT_mno_retpoline,
154 Features.push_back(
"+retpoline-indirect-calls");
155 Features.push_back(
"+retpoline-indirect-branches");
156 }
else if (Args.hasFlag(options::OPT_mspeculative_load_hardening,
157 options::OPT_mno_speculative_load_hardening,
161 Features.push_back(
"+retpoline-indirect-calls");
163 }
else if (Args.hasFlag(options::OPT_mretpoline_external_thunk,
164 options::OPT_mno_retpoline_external_thunk,
false)) {
167 Features.push_back(
"+retpoline-indirect-calls");
168 Features.push_back(
"+retpoline-indirect-branches");
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
Dataflow Directional Tag Classes.