diff options
Diffstat (limited to 'lib/Driver/ToolChains/Arch/RISCV.cpp')
-rw-r--r-- | lib/Driver/ToolChains/Arch/RISCV.cpp | 55 |
1 files changed, 28 insertions, 27 deletions
diff --git a/lib/Driver/ToolChains/Arch/RISCV.cpp b/lib/Driver/ToolChains/Arch/RISCV.cpp index 1321fedcec51..b6768de4d299 100644 --- a/lib/Driver/ToolChains/Arch/RISCV.cpp +++ b/lib/Driver/ToolChains/Arch/RISCV.cpp @@ -1,9 +1,8 @@ //===--- RISCV.cpp - RISCV Helpers for Tools --------------------*- C++ -*-===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// @@ -55,20 +54,14 @@ static bool isSupportedExtension(StringRef Ext) { static bool getExtensionVersion(const Driver &D, StringRef MArch, StringRef Ext, StringRef In, std::string &Major, std::string &Minor) { - auto I = In.begin(); - auto E = In.end(); - - while (I != E && isDigit(*I)) - Major.append(1, *I++); - + Major = In.take_while(isDigit); + In = In.substr(Major.size()); if (Major.empty()) return true; - if (I != E && *I == 'p') { - ++I; - - while (I != E && isDigit(*I)) - Minor.append(1, *I++); + if (In.consume_front("p")) { + Minor = In.take_while(isDigit); + In = In.substr(Major.size()); // Expected 'p' to be followed by minor version number. if (Minor.empty()) { @@ -111,17 +104,13 @@ static void getExtensionFeatures(const Driver &D, SmallVector<StringRef, 8> Split; Exts.split(Split, StringRef("_")); - SmallVector<StringRef, 3> Prefix; - Prefix.push_back("x"); - Prefix.push_back("s"); - Prefix.push_back("sx"); + SmallVector<StringRef, 3> Prefix{"x", "s", "sx"}; auto I = Prefix.begin(); auto E = Prefix.end(); SmallVector<StringRef, 8> AllExts; for (StringRef Ext : Split) { - if (Ext.empty()) { D.Diag(diag::err_drv_invalid_riscv_arch_name) << MArch << "extension name missing after separator '_'"; @@ -171,7 +160,7 @@ static void getExtensionFeatures(const Driver &D, } // Check if duplicated extension. - if (std::find(AllExts.begin(), AllExts.end(), Ext) != AllExts.end()) { + if (llvm::is_contained(AllExts, Ext)) { std::string Error = "duplicated "; Error += Desc; D.Diag(diag::err_drv_invalid_riscv_ext_arch_name) @@ -206,11 +195,9 @@ void riscv::getRISCVTargetFeatures(const Driver &D, const ArgList &Args, StringRef MArch = A->getValue(); // RISC-V ISA strings must be lowercase. - if (std::any_of(std::begin(MArch), std::end(MArch), - [](char c) { return isupper(c); })) { - - D.Diag(diag::err_drv_invalid_riscv_arch_name) << MArch - << "string must be lowercase"; + if (llvm::any_of(MArch, [](char c) { return isupper(c); })) { + D.Diag(diag::err_drv_invalid_riscv_arch_name) + << MArch << "string must be lowercase"; return; } @@ -222,7 +209,7 @@ void riscv::getRISCVTargetFeatures(const Driver &D, const ArgList &Args, return; } - bool HasRV64 = MArch.startswith("rv64") ? true : false; + bool HasRV64 = MArch.startswith("rv64"); // The canonical order specified in ISA manual. // Ref: Table 22.1 in RISC-V User-Level ISA V2.2 @@ -365,6 +352,20 @@ void riscv::getRISCVTargetFeatures(const Driver &D, const ArgList &Args, getExtensionFeatures(D, Args, Features, MArch, OtherExts); } + // -mrelax is default, unless -mno-relax is specified. + if (Args.hasFlag(options::OPT_mrelax, options::OPT_mno_relax, true)) + Features.push_back("+relax"); + else + Features.push_back("-relax"); + + // GCC Compatibility: -mno-save-restore is default, unless -msave-restore is + // specified... + if (Args.hasFlag(options::OPT_msave_restore, options::OPT_mno_save_restore, false)) { + // ... but we don't support -msave-restore, so issue a warning. + D.Diag(diag::warn_drv_clang_unsupported) + << Args.getLastArg(options::OPT_msave_restore)->getAsString(Args); + } + // Now add any that the user explicitly requested on the command line, // which may override the defaults. handleTargetFeaturesGroup(Args, Features, options::OPT_m_riscv_Features_Group); |