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.getLastArg(options::OPT__SLASH_arch)) {
45 StringRef Arch = A->getValue();
47 if (Triple.getArch() == llvm::Triple::x86) {
48 CPU = llvm::StringSwitch<const char *>(Arch)
50 .Case(
"SSE",
"pentium3")
51 .Case(
"SSE2",
"pentium4")
52 .Case(
"AVX",
"sandybridge")
53 .Case(
"AVX2",
"haswell")
56 CPU = llvm::StringSwitch<const char *>(Arch)
57 .Case(
"AVX",
"sandybridge")
58 .Case(
"AVX2",
"haswell")
67 if (Triple.getArch() != llvm::Triple::x86_64 &&
68 Triple.getArch() != llvm::Triple::x86)
71 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
74 if (Triple.isOSDarwin()) {
75 if (Triple.getArchName() ==
"x86_64h")
79 if (Triple.isMacOSX() && !Triple.isOSVersionLT(10, 12))
82 return Is64Bit ?
"core2" :
"yonah";
86 if (Triple.isPS4CPU())
90 if (Triple.isAndroid())
91 return Is64Bit ?
"x86-64" :
"i686";
97 switch (Triple.getOS()) {
98 case llvm::Triple::FreeBSD:
99 case llvm::Triple::NetBSD:
100 case llvm::Triple::OpenBSD:
102 case llvm::Triple::Haiku:
112 std::vector<StringRef> &Features) {
114 if (
const Arg *A = Args.getLastArg(clang::driver::options::OPT_march_EQ)) {
115 if (StringRef(A->getValue()) ==
"native") {
116 llvm::StringMap<bool> HostFeatures;
117 if (llvm::sys::getHostCPUFeatures(HostFeatures))
118 for (
auto &F : HostFeatures)
120 Args.MakeArgString((F.second ?
"+" :
"-") + F.first()));
124 if (Triple.getArchName() ==
"x86_64h") {
127 Features.push_back(
"-rdrnd");
128 Features.push_back(
"-aes");
129 Features.push_back(
"-pclmul");
130 Features.push_back(
"-rtm");
131 Features.push_back(
"-fsgsbase");
134 const llvm::Triple::ArchType ArchType = Triple.getArch();
136 if (Triple.isAndroid()) {
137 if (ArchType == llvm::Triple::x86_64) {
138 Features.push_back(
"+sse4.2");
139 Features.push_back(
"+popcnt");
141 Features.push_back(
"+ssse3");
145 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
146 StringRef Arch = A->getValue();
147 bool ArchUsed =
false;
149 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
150 if (Arch ==
"AVX" || Arch ==
"AVX2") {
152 Features.push_back(Args.MakeArgString(
"+" + Arch.lower()));
156 if (ArchType == llvm::Triple::x86) {
157 if (Arch ==
"IA32") {
159 }
else if (Arch ==
"SSE" || Arch ==
"SSE2") {
161 Features.push_back(Args.MakeArgString(
"+" + Arch.lower()));
165 D.
Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
DiagnosticBuilder Diag(unsigned DiagID) const
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
Dataflow Directional Tag Classes.