diff options
Diffstat (limited to 'contrib/llvm-project/clang/lib/Driver/ToolChains/Arch/LoongArch.cpp')
-rw-r--r-- | contrib/llvm-project/clang/lib/Driver/ToolChains/Arch/LoongArch.cpp | 43 |
1 files changed, 27 insertions, 16 deletions
diff --git a/contrib/llvm-project/clang/lib/Driver/ToolChains/Arch/LoongArch.cpp b/contrib/llvm-project/clang/lib/Driver/ToolChains/Arch/LoongArch.cpp index 856ad58f3bd9..65925e9ed610 100644 --- a/contrib/llvm-project/clang/lib/Driver/ToolChains/Arch/LoongArch.cpp +++ b/contrib/llvm-project/clang/lib/Driver/ToolChains/Arch/LoongArch.cpp @@ -12,6 +12,7 @@ #include "clang/Driver/Driver.h" #include "clang/Driver/DriverDiagnostic.h" #include "clang/Driver/Options.h" +#include "llvm/TargetParser/Host.h" #include "llvm/TargetParser/LoongArchTargetParser.h" using namespace clang::driver; @@ -126,23 +127,11 @@ void loongarch::getLoongArchTargetFeatures(const Driver &D, const llvm::Triple &Triple, const ArgList &Args, std::vector<StringRef> &Features) { - StringRef ArchName; - if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) { - if (!llvm::LoongArch::isValidArchName(A->getValue())) { - D.Diag(clang::diag::err_drv_invalid_arch_name) << A->getAsString(Args); - return; - } + std::string ArchName; + if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) ArchName = A->getValue(); - } - - // TODO: handle -march=native and -mtune=xx. - - // Select a default arch name. - if (ArchName.empty() && Triple.isLoongArch64()) - ArchName = "loongarch64"; - - if (!ArchName.empty()) - llvm::LoongArch::getArchFeatures(ArchName, Features); + ArchName = postProcessTargetCPUString(ArchName, Triple); + llvm::LoongArch::getArchFeatures(ArchName, Features); // Select floating-point features determined by -mdouble-float, // -msingle-float, -msoft-float and -mfpu. @@ -187,3 +176,25 @@ void loongarch::getLoongArchTargetFeatures(const Driver &D, if (Arg *A = Args.getLastArgNoClaim(options::OPT_mfpu_EQ)) A->ignoreTargetSpecific(); } + +std::string loongarch::postProcessTargetCPUString(const std::string &CPU, + const llvm::Triple &Triple) { + std::string CPUString = CPU; + if (CPUString == "native") { + CPUString = llvm::sys::getHostCPUName(); + if (CPUString == "generic") + CPUString = llvm::LoongArch::getDefaultArch(Triple.isLoongArch64()); + } + if (CPUString.empty()) + CPUString = llvm::LoongArch::getDefaultArch(Triple.isLoongArch64()); + return CPUString; +} + +std::string loongarch::getLoongArchTargetCPU(const llvm::opt::ArgList &Args, + const llvm::Triple &Triple) { + std::string CPU; + // If we have -march, use that. + if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) + CPU = A->getValue(); + return postProcessTargetCPUString(CPU, Triple); +} |