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")
34 std::string CPU = llvm::sys::getHostCPUName();
35 if (!CPU.empty() && CPU !=
"generic")
36 return Args.MakeArgString(CPU);
39 if (
const Arg *A = Args.getLastArgNoClaim(options::OPT__SLASH_arch)) {
41 StringRef Arch = A->getValue();
42 const char *CPU =
nullptr;
43 if (Triple.getArch() == llvm::Triple::x86) {
44 CPU = llvm::StringSwitch<const char *>(Arch)
46 .Case(
"SSE",
"pentium3")
47 .Case(
"SSE2",
"pentium4")
51 CPU = llvm::StringSwitch<const char *>(Arch)
52 .Case(
"AVX",
"sandybridge")
53 .Case(
"AVX2",
"haswell")
54 .Case(
"AVX512F",
"knl")
55 .Case(
"AVX512",
"skylake-avx512")
66 if (Triple.getArch() != llvm::Triple::x86_64 &&
67 Triple.getArch() != llvm::Triple::x86)
70 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
73 if (Triple.isOSDarwin()) {
74 if (Triple.getArchName() ==
"x86_64h")
78 if (Triple.isMacOSX() && !Triple.isOSVersionLT(10, 12))
81 return Is64Bit ?
"core2" :
"yonah";
85 if (Triple.isPS4CPU())
89 if (Triple.isAndroid())
90 return Is64Bit ?
"x86-64" :
"i686";
96 switch (Triple.getOS()) {
97 case llvm::Triple::FreeBSD:
98 case llvm::Triple::NetBSD:
99 case llvm::Triple::OpenBSD:
101 case llvm::Triple::Haiku:
111 std::vector<StringRef> &Features) {
113 if (
const Arg *A = Args.getLastArg(clang::driver::options::OPT_march_EQ)) {
114 if (StringRef(A->getValue()) ==
"native") {
115 llvm::StringMap<bool> HostFeatures;
116 if (llvm::sys::getHostCPUFeatures(HostFeatures))
117 for (
auto &F : HostFeatures)
119 Args.MakeArgString((F.second ?
"+" :
"-") + F.first()));
123 if (Triple.getArchName() ==
"x86_64h") {
126 Features.push_back(
"-rdrnd");
127 Features.push_back(
"-aes");
128 Features.push_back(
"-pclmul");
129 Features.push_back(
"-rtm");
130 Features.push_back(
"-fsgsbase");
133 const llvm::Triple::ArchType ArchType = Triple.getArch();
135 if (Triple.isAndroid()) {
136 if (ArchType == llvm::Triple::x86_64) {
137 Features.push_back(
"+sse4.2");
138 Features.push_back(
"+popcnt");
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.