diff --git a/clang/lib/Driver/ToolChains/Arch/X86.cpp b/clang/lib/Driver/ToolChains/Arch/X86.cpp index 5d9a7234b027d2..c49aaadc42aea3 100644 --- a/clang/lib/Driver/ToolChains/Arch/X86.cpp +++ b/clang/lib/Driver/ToolChains/Arch/X86.cpp @@ -23,41 +23,42 @@ using namespace llvm::opt; std::string x86::getX86TargetCPU(const ArgList &Args, const llvm::Triple &Triple) { if (const Arg *A = Args.getLastArg(clang::driver::options::OPT_march_EQ)) { - if (StringRef(A->getValue()) != "native") - return A->getValue(); + StringRef CPU = A->getValue(); + if (CPU != "native") + return std::string(CPU); // FIXME: Reject attempts to use -march=native unless the target matches // the host. // // FIXME: We should also incorporate the detected target features for use // with -native. - std::string CPU = std::string(llvm::sys::getHostCPUName()); + CPU = llvm::sys::getHostCPUName(); if (!CPU.empty() && CPU != "generic") - return CPU; + return std::string(CPU); } if (const Arg *A = Args.getLastArgNoClaim(options::OPT__SLASH_arch)) { // Mapping built by looking at lib/Basic's X86TargetInfo::initFeatureMap(). StringRef Arch = A->getValue(); - const char *CPU = nullptr; + StringRef CPU; if (Triple.getArch() == llvm::Triple::x86) { // 32-bit-only /arch: flags. - CPU = llvm::StringSwitch(Arch) + CPU = llvm::StringSwitch(Arch) .Case("IA32", "i386") .Case("SSE", "pentium3") .Case("SSE2", "pentium4") - .Default(nullptr); + .Default(""); } - if (CPU == nullptr) { // 32-bit and 64-bit /arch: flags. - CPU = llvm::StringSwitch(Arch) + if (CPU.empty()) { // 32-bit and 64-bit /arch: flags. + CPU = llvm::StringSwitch(Arch) .Case("AVX", "sandybridge") .Case("AVX2", "haswell") .Case("AVX512F", "knl") .Case("AVX512", "skylake-avx512") - .Default(nullptr); + .Default(""); } - if (CPU) { + if (!CPU.empty()) { A->claim(); - return CPU; + return std::string(CPU); } }