Changeset View
Changeset View
Standalone View
Standalone View
cfe/trunk/lib/Driver/Tools.cpp
- This file is larger than 256 KB, so syntax highlighting is disabled by default.
Show First 20 Lines • Show All 478 Lines • ▼ Show 20 Lines | |||||
} | } | ||||
static bool isNoCommonDefault(const llvm::Triple &Triple) { | static bool isNoCommonDefault(const llvm::Triple &Triple) { | ||||
switch (Triple.getArch()) { | switch (Triple.getArch()) { | ||||
default: | default: | ||||
return false; | return false; | ||||
case llvm::Triple::xcore: | case llvm::Triple::xcore: | ||||
case llvm::Triple::wasm32: | |||||
case llvm::Triple::wasm64: | |||||
return true; | return true; | ||||
} | } | ||||
} | } | ||||
// ARM tools start. | // ARM tools start. | ||||
// Get SubArch (vN). | // Get SubArch (vN). | ||||
static int getARMSubArchVersionNumber(const llvm::Triple &Triple) { | static int getARMSubArchVersionNumber(const llvm::Triple &Triple) { | ||||
▲ Show 20 Lines • Show All 1,053 Lines • ▼ Show 20 Lines | static const char *getX86TargetCPU(const ArgList &Args, | ||||
case llvm::Triple::Bitrig: | case llvm::Triple::Bitrig: | ||||
return "i686"; | return "i686"; | ||||
default: | default: | ||||
// Fallback to p4. | // Fallback to p4. | ||||
return "pentium4"; | return "pentium4"; | ||||
} | } | ||||
} | } | ||||
/// Get the (LLVM) name of the WebAssembly cpu we are targeting. | |||||
static StringRef getWebAssemblyTargetCPU(const ArgList &Args) { | |||||
// If we have -mcpu=, use that. | |||||
if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) { | |||||
StringRef CPU = A->getValue(); | |||||
#ifdef __wasm__ | |||||
// Handle "native" by examining the host. "native" isn't meaningful when | |||||
// cross compiling, so only support this when the host is also WebAssembly. | |||||
if (CPU == "native") | |||||
return llvm::sys::getHostCPUName(); | |||||
#endif | |||||
return CPU; | |||||
} | |||||
return "generic"; | |||||
} | |||||
static std::string getCPUName(const ArgList &Args, const llvm::Triple &T, | static std::string getCPUName(const ArgList &Args, const llvm::Triple &T, | ||||
bool FromAs = false) { | bool FromAs = false) { | ||||
switch (T.getArch()) { | switch (T.getArch()) { | ||||
default: | default: | ||||
return ""; | return ""; | ||||
case llvm::Triple::aarch64: | case llvm::Triple::aarch64: | ||||
case llvm::Triple::aarch64_be: | case llvm::Triple::aarch64_be: | ||||
▲ Show 20 Lines • Show All 56 Lines • ▼ Show 20 Lines | case llvm::Triple::hexagon: | ||||
return "hexagon" + toolchains::HexagonToolChain::GetTargetCPU(Args).str(); | return "hexagon" + toolchains::HexagonToolChain::GetTargetCPU(Args).str(); | ||||
case llvm::Triple::systemz: | case llvm::Triple::systemz: | ||||
return getSystemZTargetCPU(Args); | return getSystemZTargetCPU(Args); | ||||
case llvm::Triple::r600: | case llvm::Triple::r600: | ||||
case llvm::Triple::amdgcn: | case llvm::Triple::amdgcn: | ||||
return getR600TargetGPU(Args); | return getR600TargetGPU(Args); | ||||
case llvm::Triple::wasm32: | |||||
case llvm::Triple::wasm64: | |||||
return getWebAssemblyTargetCPU(Args); | |||||
} | } | ||||
} | } | ||||
static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args, | static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args, | ||||
ArgStringList &CmdArgs) { | ArgStringList &CmdArgs) { | ||||
// Tell the linker to load the plugin. This has to come before AddLinkerInputs | // Tell the linker to load the plugin. This has to come before AddLinkerInputs | ||||
// as gold requires -plugin to come before any -plugin-opt that -Wl might | // as gold requires -plugin to come before any -plugin-opt that -Wl might | ||||
// forward. | // forward. | ||||
▲ Show 20 Lines • Show All 433 Lines • ▼ Show 20 Lines | if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access, | ||||
options::OPT_munaligned_access)) | options::OPT_munaligned_access)) | ||||
if (A->getOption().matches(options::OPT_mno_unaligned_access)) | if (A->getOption().matches(options::OPT_mno_unaligned_access)) | ||||
Features.push_back("+strict-align"); | Features.push_back("+strict-align"); | ||||
if (Args.hasArg(options::OPT_ffixed_x18) || Triple.isOSDarwin()) | if (Args.hasArg(options::OPT_ffixed_x18) || Triple.isOSDarwin()) | ||||
Features.push_back("+reserve-x18"); | Features.push_back("+reserve-x18"); | ||||
} | } | ||||
static void getWebAssemblyTargetFeatures(const ArgList &Args, | |||||
std::vector<const char *> &Features) { | |||||
for (const Arg *A : Args.filtered(options::OPT_m_wasm_Features_Group)) { | |||||
StringRef Name = A->getOption().getName(); | |||||
A->claim(); | |||||
// Skip over "-m". | |||||
assert(Name.startswith("m") && "Invalid feature name."); | |||||
Name = Name.substr(1); | |||||
bool IsNegative = Name.startswith("no-"); | |||||
if (IsNegative) | |||||
Name = Name.substr(3); | |||||
Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name)); | |||||
} | |||||
} | |||||
static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple, | static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple, | ||||
const ArgList &Args, ArgStringList &CmdArgs, | const ArgList &Args, ArgStringList &CmdArgs, | ||||
bool ForAS) { | bool ForAS) { | ||||
std::vector<const char *> Features; | std::vector<const char *> Features; | ||||
switch (Triple.getArch()) { | switch (Triple.getArch()) { | ||||
default: | default: | ||||
break; | break; | ||||
case llvm::Triple::mips: | case llvm::Triple::mips: | ||||
Show All 21 Lines | static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple, | ||||
case llvm::Triple::aarch64: | case llvm::Triple::aarch64: | ||||
case llvm::Triple::aarch64_be: | case llvm::Triple::aarch64_be: | ||||
getAArch64TargetFeatures(D, Triple, Args, Features); | getAArch64TargetFeatures(D, Triple, Args, Features); | ||||
break; | break; | ||||
case llvm::Triple::x86: | case llvm::Triple::x86: | ||||
case llvm::Triple::x86_64: | case llvm::Triple::x86_64: | ||||
getX86TargetFeatures(D, Triple, Args, Features); | getX86TargetFeatures(D, Triple, Args, Features); | ||||
break; | break; | ||||
case llvm::Triple::wasm32: | |||||
case llvm::Triple::wasm64: | |||||
getWebAssemblyTargetFeatures(Args, Features); | |||||
break; | |||||
} | } | ||||
// Find the last of each feature. | // Find the last of each feature. | ||||
llvm::StringMap<unsigned> LastOpt; | llvm::StringMap<unsigned> LastOpt; | ||||
for (unsigned I = 0, N = Features.size(); I < N; ++I) { | for (unsigned I = 0, N = Features.size(); I < N; ++I) { | ||||
const char *Name = Features[I]; | const char *Name = Features[I]; | ||||
assert(Name[0] == '-' || Name[0] == '+'); | assert(Name[0] == '-' || Name[0] == '+'); | ||||
LastOpt[Name + 1] = I; | LastOpt[Name + 1] = I; | ||||
▲ Show 20 Lines • Show All 463 Lines • ▼ Show 20 Lines | static bool areOptimizationsEnabled(const ArgList &Args) { | ||||
if (Arg *A = Args.getLastArg(options::OPT_O_Group)) | if (Arg *A = Args.getLastArg(options::OPT_O_Group)) | ||||
return !A->getOption().matches(options::OPT_O0); | return !A->getOption().matches(options::OPT_O0); | ||||
// Defaults to -O0. | // Defaults to -O0. | ||||
return false; | return false; | ||||
} | } | ||||
static bool shouldUseFramePointerForTarget(const ArgList &Args, | static bool shouldUseFramePointerForTarget(const ArgList &Args, | ||||
const llvm::Triple &Triple) { | const llvm::Triple &Triple) { | ||||
switch (Triple.getArch()) { | |||||
case llvm::Triple::xcore: | |||||
case llvm::Triple::wasm32: | |||||
case llvm::Triple::wasm64: | |||||
// XCore never wants frame pointers, regardless of OS. | // XCore never wants frame pointers, regardless of OS. | ||||
if (Triple.getArch() == llvm::Triple::xcore) { | // WebAssembly never wants frame pointers. | ||||
return false; | return false; | ||||
default: | |||||
break; | |||||
} | } | ||||
if (Triple.isOSLinux()) { | if (Triple.isOSLinux()) { | ||||
switch (Triple.getArch()) { | switch (Triple.getArch()) { | ||||
// Don't use a frame pointer on linux if optimizing for certain targets. | // Don't use a frame pointer on linux if optimizing for certain targets. | ||||
case llvm::Triple::mips64: | case llvm::Triple::mips64: | ||||
case llvm::Triple::mips64el: | case llvm::Triple::mips64el: | ||||
case llvm::Triple::mips: | case llvm::Triple::mips: | ||||
▲ Show 20 Lines • Show All 7,067 Lines • Show Last 20 Lines |