diff options
Diffstat (limited to 'clang/lib/Driver/ToolChains/Arch/ARM.cpp')
-rw-r--r-- | clang/lib/Driver/ToolChains/Arch/ARM.cpp | 59 |
1 files changed, 29 insertions, 30 deletions
diff --git a/clang/lib/Driver/ToolChains/Arch/ARM.cpp b/clang/lib/Driver/ToolChains/Arch/ARM.cpp index a1923e731489..afe896b4a65b 100644 --- a/clang/lib/Driver/ToolChains/Arch/ARM.cpp +++ b/clang/lib/Driver/ToolChains/Arch/ARM.cpp @@ -57,7 +57,7 @@ void arm::getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch, static void getARMHWDivFeatures(const Driver &D, const Arg *A, const ArgList &Args, StringRef HWDiv, std::vector<StringRef> &Features) { - unsigned HWDivID = llvm::ARM::parseHWDiv(HWDiv); + uint64_t HWDivID = llvm::ARM::parseHWDiv(HWDiv); if (!llvm::ARM::getHWDivFeatures(HWDivID, Features)) D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args); } @@ -91,7 +91,7 @@ static void DecodeARMFeaturesFromCPU(const Driver &D, StringRef CPU, CPU = CPU.split("+").first; if (CPU != "generic") { llvm::ARM::ArchKind ArchKind = llvm::ARM::parseCPUArch(CPU); - unsigned Extension = llvm::ARM::getDefaultExtensions(CPU, ArchKind); + uint64_t Extension = llvm::ARM::getDefaultExtensions(CPU, ArchKind); llvm::ARM::getExtensionFeatures(Extension, Features); } } @@ -137,9 +137,8 @@ bool arm::useAAPCSForMachO(const llvm::Triple &T) { } // Select mode for reading thread pointer (-mtp=soft/cp15). -arm::ReadTPMode arm::getReadTPMode(const ToolChain &TC, const ArgList &Args) { +arm::ReadTPMode arm::getReadTPMode(const Driver &D, const ArgList &Args) { if (Arg *A = Args.getLastArg(options::OPT_mtp_mode_EQ)) { - const Driver &D = TC.getDriver(); arm::ReadTPMode ThreadPointer = llvm::StringSwitch<arm::ReadTPMode>(A->getValue()) .Case("cp15", ReadTPMode::Cp15) @@ -156,11 +155,14 @@ arm::ReadTPMode arm::getReadTPMode(const ToolChain &TC, const ArgList &Args) { return ReadTPMode::Soft; } +arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) { + return arm::getARMFloatABI(TC.getDriver(), TC.getEffectiveTriple(), Args); +} + // Select the float ABI as determined by -msoft-float, -mhard-float, and // -mfloat-abi=. -arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) { - const Driver &D = TC.getDriver(); - const llvm::Triple &Triple = TC.getEffectiveTriple(); +arm::FloatABI arm::getARMFloatABI(const Driver &D, const llvm::Triple &Triple, + const ArgList &Args) { auto SubArch = getARMSubArchVersionNumber(Triple); arm::FloatABI ABI = FloatABI::Invalid; if (Arg *A = @@ -276,18 +278,20 @@ arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) { return ABI; } -void arm::getARMTargetFeatures(const ToolChain &TC, - const llvm::Triple &Triple, - const ArgList &Args, - ArgStringList &CmdArgs, - std::vector<StringRef> &Features, - bool ForAS) { - const Driver &D = TC.getDriver(); +static bool hasIntegerMVE(const std::vector<StringRef> &F) { + auto MVE = llvm::find(llvm::reverse(F), "+mve"); + auto NoMVE = llvm::find(llvm::reverse(F), "-mve"); + return MVE != F.rend() && + (NoMVE == F.rend() || std::distance(MVE, NoMVE) > 0); +} +void arm::getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple, + const ArgList &Args, ArgStringList &CmdArgs, + std::vector<StringRef> &Features, bool ForAS) { bool KernelOrKext = Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext); - arm::FloatABI ABI = arm::getARMFloatABI(TC, Args); - arm::ReadTPMode ThreadPointer = arm::getReadTPMode(TC, Args); + arm::FloatABI ABI = arm::getARMFloatABI(D, Triple, Args); + arm::ReadTPMode ThreadPointer = arm::getReadTPMode(D, Args); const Arg *WaCPU = nullptr, *WaFPU = nullptr; const Arg *WaHDiv = nullptr, *WaArch = nullptr; @@ -459,18 +463,13 @@ fp16_fml_fallthrough: // Disable all features relating to hardware FP, not already disabled by the // above call. - Features.insert(Features.end(), {"-neon", "-crypto", "-dotprod", "-fp16fml", - "-mve", "-mve.fp", "-fpregs"}); + Features.insert(Features.end(), + {"-dotprod", "-fp16fml", "-mve", "-mve.fp", "-fpregs"}); } else if (FPUID == llvm::ARM::FK_NONE) { // -mfpu=none is *very* similar to -mfloat-abi=soft, only that it should not // disable MVE-I. - Features.insert(Features.end(), - {"-neon", "-crypto", "-dotprod", "-fp16fml", "-mve.fp"}); - // Even though we remove MVE-FP, we still need to check if it was originally - // present among the requested extensions, because it implies MVE-I, which - // should not be disabled by -mfpu-none. - if (!llvm::is_contained(Features, "+mve") && - !llvm::is_contained(Features, "+mve.fp")) + Features.insert(Features.end(), {"-dotprod", "-fp16fml", "-mve.fp"}); + if (!hasIntegerMVE(Features)) Features.emplace_back("-fpregs"); } @@ -612,14 +611,14 @@ fp16_fml_fallthrough: const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) { std::string MArch; if (!Arch.empty()) - MArch = Arch; + MArch = std::string(Arch); else - MArch = Triple.getArchName(); + MArch = std::string(Triple.getArchName()); MArch = StringRef(MArch).split("+").first.lower(); // Handle -march=native. if (MArch == "native") { - std::string CPU = llvm::sys::getHostCPUName(); + std::string CPU = std::string(llvm::sys::getHostCPUName()); if (CPU != "generic") { // Translate the native cpu into the architecture suffix for that CPU. StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple); @@ -657,12 +656,12 @@ std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch, std::string MCPU = StringRef(CPU).split("+").first.lower(); // Handle -mcpu=native. if (MCPU == "native") - return llvm::sys::getHostCPUName(); + return std::string(llvm::sys::getHostCPUName()); else return MCPU; } - return getARMCPUForMArch(Arch, Triple); + return std::string(getARMCPUForMArch(Arch, Triple)); } /// getLLVMArchSuffixForARM - Get the LLVM ArchKind value to use for a |