llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Craig Topper (topperc) <details> <summary>Changes</summary> This introduces a new file, RISCVISAUtils.cpp and moves the rest of RISCVISAInfo to the TargetParser library. This will allow us to generate part of RISCVISAInfo.cpp using tablegen. --- Patch is 43.02 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/89684.diff 25 Files Affected: - (modified) clang/lib/Basic/Targets/RISCV.h (+1-1) - (modified) clang/lib/CodeGen/CodeGenModule.cpp (+1-1) - (modified) clang/lib/Driver/Driver.cpp (+1-1) - (modified) clang/lib/Driver/ToolChains/Arch/RISCV.cpp (+1-1) - (modified) clang/lib/Driver/ToolChains/Clang.cpp (+1-1) - (modified) clang/lib/Driver/ToolChains/Flang.cpp (+1-1) - (modified) clang/lib/Driver/ToolChains/Gnu.cpp (+1-1) - (modified) clang/tools/driver/cc1_main.cpp (+1-1) - (modified) lld/ELF/Arch/RISCV.cpp (+1-1) - (added) llvm/include/llvm/Support/RISCVISAUtils.h (+42) - (renamed) llvm/include/llvm/TargetParser/RISCVISAInfo.h (+4-17) - (modified) llvm/lib/Object/ELFObjectFile.cpp (+1-1) - (modified) llvm/lib/Support/CMakeLists.txt (+1-1) - (added) llvm/lib/Support/RISCVISAUtils.cpp (+88) - (modified) llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp (+1-1) - (modified) llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.cpp (-1) - (modified) llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h (+1-1) - (modified) llvm/lib/Target/RISCV/MCTargetDesc/RISCVTargetStreamer.cpp (+1-1) - (modified) llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp (+1-1) - (modified) llvm/lib/TargetParser/CMakeLists.txt (+1) - (renamed) llvm/lib/TargetParser/RISCVISAInfo.cpp (+11-85) - (modified) llvm/lib/TargetParser/RISCVTargetParser.cpp (+1-1) - (added) llvm/test/TableGen/riscv-target-def.td (+96) - (modified) llvm/unittests/Support/RISCVISAInfoTest.cpp (+37-37) - (modified) llvm/utils/TableGen/RISCVTargetDefEmitter.cpp (+33-24) ``````````diff diff --git a/clang/lib/Basic/Targets/RISCV.h b/clang/lib/Basic/Targets/RISCV.h index 78580b5b1c1063..9fa42e75bbfd14 100644 --- a/clang/lib/Basic/Targets/RISCV.h +++ b/clang/lib/Basic/Targets/RISCV.h @@ -16,7 +16,7 @@ #include "clang/Basic/TargetInfo.h" #include "clang/Basic/TargetOptions.h" #include "llvm/Support/Compiler.h" -#include "llvm/Support/RISCVISAInfo.h" +#include "llvm/TargetParser/RISCVISAInfo.h" #include "llvm/TargetParser/Triple.h" #include <optional> diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 0c447b20cef40d..d085e735ecb443 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -68,9 +68,9 @@ #include "llvm/Support/CommandLine.h" #include "llvm/Support/ConvertUTF.h" #include "llvm/Support/ErrorHandling.h" -#include "llvm/Support/RISCVISAInfo.h" #include "llvm/Support/TimeProfiler.h" #include "llvm/Support/xxhash.h" +#include "llvm/TargetParser/RISCVISAInfo.h" #include "llvm/TargetParser/Triple.h" #include "llvm/TargetParser/X86TargetParser.h" #include <optional> diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 0da92001e08c27..76b7b9fdfb4f9b 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -87,12 +87,12 @@ #include "llvm/Support/PrettyStackTrace.h" #include "llvm/Support/Process.h" #include "llvm/Support/Program.h" -#include "llvm/Support/RISCVISAInfo.h" #include "llvm/Support/Regex.h" #include "llvm/Support/StringSaver.h" #include "llvm/Support/VirtualFileSystem.h" #include "llvm/Support/raw_ostream.h" #include "llvm/TargetParser/Host.h" +#include "llvm/TargetParser/RISCVISAInfo.h" #include <cstdlib> // ::getenv #include <map> #include <memory> diff --git a/clang/lib/Driver/ToolChains/Arch/RISCV.cpp b/clang/lib/Driver/ToolChains/Arch/RISCV.cpp index 96b3cc3bb8ffb1..2e2bce8494672f 100644 --- a/clang/lib/Driver/ToolChains/Arch/RISCV.cpp +++ b/clang/lib/Driver/ToolChains/Arch/RISCV.cpp @@ -15,9 +15,9 @@ #include "clang/Driver/Options.h" #include "llvm/Option/ArgList.h" #include "llvm/Support/Error.h" -#include "llvm/Support/RISCVISAInfo.h" #include "llvm/Support/raw_ostream.h" #include "llvm/TargetParser/Host.h" +#include "llvm/TargetParser/RISCVISAInfo.h" #include "llvm/TargetParser/RISCVTargetParser.h" using namespace clang::driver; diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index f8a81ee8ab56bc..e43da1e78d9ef5 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -54,11 +54,11 @@ #include "llvm/Support/FileSystem.h" #include "llvm/Support/Path.h" #include "llvm/Support/Process.h" -#include "llvm/Support/RISCVISAInfo.h" #include "llvm/Support/YAMLParser.h" #include "llvm/TargetParser/ARMTargetParserCommon.h" #include "llvm/TargetParser/Host.h" #include "llvm/TargetParser/LoongArchTargetParser.h" +#include "llvm/TargetParser/RISCVISAInfo.h" #include "llvm/TargetParser/RISCVTargetParser.h" #include <cctype> diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp index abe0b931676005..6d93c1f3d7034a 100644 --- a/clang/lib/Driver/ToolChains/Flang.cpp +++ b/clang/lib/Driver/ToolChains/Flang.cpp @@ -15,7 +15,7 @@ #include "llvm/Frontend/Debug/Options.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/Path.h" -#include "llvm/Support/RISCVISAInfo.h" +#include "llvm/TargetParser/RISCVISAInfo.h" #include "llvm/TargetParser/RISCVTargetParser.h" #include <cassert> diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp index dedbfac6cb25d2..f55b8bf48c13f7 100644 --- a/clang/lib/Driver/ToolChains/Gnu.cpp +++ b/clang/lib/Driver/ToolChains/Gnu.cpp @@ -30,8 +30,8 @@ #include "llvm/Option/ArgList.h" #include "llvm/Support/CodeGen.h" #include "llvm/Support/Path.h" -#include "llvm/Support/RISCVISAInfo.h" #include "llvm/Support/VirtualFileSystem.h" +#include "llvm/TargetParser/RISCVISAInfo.h" #include "llvm/TargetParser/TargetParser.h" #include <system_error> diff --git a/clang/tools/driver/cc1_main.cpp b/clang/tools/driver/cc1_main.cpp index b5c6be3c557bb3..2aebc6d3c01782 100644 --- a/clang/tools/driver/cc1_main.cpp +++ b/clang/tools/driver/cc1_main.cpp @@ -39,7 +39,6 @@ #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/Path.h" #include "llvm/Support/Process.h" -#include "llvm/Support/RISCVISAInfo.h" #include "llvm/Support/Signals.h" #include "llvm/Support/TargetSelect.h" #include "llvm/Support/TimeProfiler.h" @@ -48,6 +47,7 @@ #include "llvm/Target/TargetMachine.h" #include "llvm/TargetParser/AArch64TargetParser.h" #include "llvm/TargetParser/ARMTargetParser.h" +#include "llvm/TargetParser/RISCVISAInfo.h" #include <cstdio> #ifdef CLANG_HAVE_RLIMITS diff --git a/lld/ELF/Arch/RISCV.cpp b/lld/ELF/Arch/RISCV.cpp index 20de1b9b7bde96..20088d92bafa2f 100644 --- a/lld/ELF/Arch/RISCV.cpp +++ b/lld/ELF/Arch/RISCV.cpp @@ -15,8 +15,8 @@ #include "llvm/Support/LEB128.h" #include "llvm/Support/RISCVAttributeParser.h" #include "llvm/Support/RISCVAttributes.h" -#include "llvm/Support/RISCVISAInfo.h" #include "llvm/Support/TimeProfiler.h" +#include "llvm/TargetParser/RISCVISAInfo.h" using namespace llvm; using namespace llvm::object; diff --git a/llvm/include/llvm/Support/RISCVISAUtils.h b/llvm/include/llvm/Support/RISCVISAUtils.h new file mode 100644 index 00000000000000..94aedb75faa256 --- /dev/null +++ b/llvm/include/llvm/Support/RISCVISAUtils.h @@ -0,0 +1,42 @@ +//===-- RISCVISAUtils.h - RISC-V ISA Utilities ------------------*- C++ -*-===// +// +// 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 +// +//===----------------------------------------------------------------------===// +// +// Utilities shared by TableGen and RISCVISAInfo. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_SUPPORT_RISCVISAUTILS_H +#define LLVM_SUPPORT_RISCVISAUTILS_H + +#include "llvm/ADT/StringRef.h" +#include <string> + +namespace llvm { + +namespace RISCVISAUtils { +constexpr StringLiteral AllStdExts = "mafdqlcbkjtpvnh"; + +/// Represents the major and version number components of a RISC-V extension. +struct ExtensionVersion { + unsigned Major; + unsigned Minor; +}; + +bool compareExtension(const std::string &LHS, const std::string &RHS); + +/// Helper class for OrderedExtensionMap. +struct ExtensionComparator { + bool operator()(const std::string &LHS, const std::string &RHS) const { + return compareExtension(LHS, RHS); + } +}; +} // namespace RISCVISAUtils + +} // namespace llvm + +#endif diff --git a/llvm/include/llvm/Support/RISCVISAInfo.h b/llvm/include/llvm/TargetParser/RISCVISAInfo.h similarity index 86% rename from llvm/include/llvm/Support/RISCVISAInfo.h rename to llvm/include/llvm/TargetParser/RISCVISAInfo.h index 46df93d7522602..83c4f1e620fc85 100644 --- a/llvm/include/llvm/Support/RISCVISAInfo.h +++ b/llvm/include/llvm/TargetParser/RISCVISAInfo.h @@ -12,6 +12,7 @@ #include "llvm/ADT/StringMap.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/Error.h" +#include "llvm/Support/RISCVISAUtils.h" #include <map> #include <string> @@ -25,24 +26,10 @@ class RISCVISAInfo { RISCVISAInfo(const RISCVISAInfo &) = delete; RISCVISAInfo &operator=(const RISCVISAInfo &) = delete; - /// Represents the major and version number components of a RISC-V extension. - struct ExtensionVersion { - unsigned Major; - unsigned Minor; - }; - - static bool compareExtension(const std::string &LHS, const std::string &RHS); - - /// Helper class for OrderedExtensionMap. - struct ExtensionComparator { - bool operator()(const std::string &LHS, const std::string &RHS) const { - return compareExtension(LHS, RHS); - } - }; - /// OrderedExtensionMap is std::map, it's specialized to keep entries /// in canonical order of extension. - typedef std::map<std::string, ExtensionVersion, ExtensionComparator> + typedef std::map<std::string, RISCVISAUtils::ExtensionVersion, + RISCVISAUtils::ExtensionComparator> OrderedExtensionMap; RISCVISAInfo(unsigned XLen, OrderedExtensionMap &Exts) @@ -105,7 +92,7 @@ class RISCVISAInfo { OrderedExtensionMap Exts; - void addExtension(StringRef ExtName, ExtensionVersion Version); + void addExtension(StringRef ExtName, RISCVISAUtils::ExtensionVersion Version); Error checkDependency(); diff --git a/llvm/lib/Object/ELFObjectFile.cpp b/llvm/lib/Object/ELFObjectFile.cpp index efec612957de33..24d7a7a280fd9a 100644 --- a/llvm/lib/Object/ELFObjectFile.cpp +++ b/llvm/lib/Object/ELFObjectFile.cpp @@ -24,7 +24,7 @@ #include "llvm/Support/MathExtras.h" #include "llvm/Support/RISCVAttributeParser.h" #include "llvm/Support/RISCVAttributes.h" -#include "llvm/Support/RISCVISAInfo.h" +#include "llvm/TargetParser/RISCVISAInfo.h" #include "llvm/TargetParser/SubtargetFeature.h" #include "llvm/TargetParser/Triple.h" #include <algorithm> diff --git a/llvm/lib/Support/CMakeLists.txt b/llvm/lib/Support/CMakeLists.txt index e18beddf7bc5b7..03e888958a0711 100644 --- a/llvm/lib/Support/CMakeLists.txt +++ b/llvm/lib/Support/CMakeLists.txt @@ -219,7 +219,7 @@ add_llvm_component_library(LLVMSupport Regex.cpp RISCVAttributes.cpp RISCVAttributeParser.cpp - RISCVISAInfo.cpp + RISCVISAUtils.cpp ScaledNumber.cpp ScopedPrinter.cpp SHA1.cpp diff --git a/llvm/lib/Support/RISCVISAUtils.cpp b/llvm/lib/Support/RISCVISAUtils.cpp new file mode 100644 index 00000000000000..ca7518f71907b5 --- /dev/null +++ b/llvm/lib/Support/RISCVISAUtils.cpp @@ -0,0 +1,88 @@ +//===-- RISCVISAUtils.cpp - RISC-V ISA Utilities --------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// +// +// Utilities shared by TableGen and RISCVISAInfo. +// +//===----------------------------------------------------------------------===// + +#include "llvm/Support/RISCVISAUtils.h" +#include <cassert> + +using namespace llvm; + +// We rank extensions in the following order: +// -Single letter extensions in canonical order. +// -Unknown single letter extensions in alphabetical order. +// -Multi-letter extensions starting with 'z' sorted by canonical order of +// the second letter then sorted alphabetically. +// -Multi-letter extensions starting with 's' in alphabetical order. +// -(TODO) Multi-letter extensions starting with 'zxm' in alphabetical order. +// -X extensions in alphabetical order. +// These flags are used to indicate the category. The first 6 bits store the +// single letter extension rank for single letter and multi-letter extensions +// starting with 'z'. +enum RankFlags { + RF_Z_EXTENSION = 1 << 6, + RF_S_EXTENSION = 1 << 7, + RF_X_EXTENSION = 1 << 8, +}; + +// Get the rank for single-letter extension, lower value meaning higher +// priority. +static unsigned singleLetterExtensionRank(char Ext) { + assert(Ext >= 'a' && Ext <= 'z'); + switch (Ext) { + case 'i': + return 0; + case 'e': + return 1; + } + + size_t Pos = RISCVISAUtils::AllStdExts.find(Ext); + if (Pos != StringRef::npos) + return Pos + 2; // Skip 'e' and 'i' from above. + + // If we got an unknown extension letter, then give it an alphabetical + // order, but after all known standard extensions. + return 2 + RISCVISAUtils::AllStdExts.size() + (Ext - 'a'); +} + +// Get the rank for multi-letter extension, lower value meaning higher +// priority/order in canonical order. +static unsigned getExtensionRank(const std::string &ExtName) { + assert(ExtName.size() >= 1); + switch (ExtName[0]) { + case 's': + return RF_S_EXTENSION; + case 'z': + assert(ExtName.size() >= 2); + // `z` extension must be sorted by canonical order of second letter. + // e.g. zmx has higher rank than zax. + return RF_Z_EXTENSION | singleLetterExtensionRank(ExtName[1]); + case 'x': + return RF_X_EXTENSION; + default: + assert(ExtName.size() == 1); + return singleLetterExtensionRank(ExtName[0]); + } +} + +// Compare function for extension. +// Only compare the extension name, ignore version comparison. +bool llvm::RISCVISAUtils::compareExtension(const std::string &LHS, + const std::string &RHS) { + unsigned LHSRank = getExtensionRank(LHS); + unsigned RHSRank = getExtensionRank(RHS); + + // If the ranks differ, pick the lower rank. + if (LHSRank != RHSRank) + return LHSRank < RHSRank; + + // If the rank is same, it must be sorted by lexicographic order. + return LHS < RHS; +} diff --git a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp index d926ccdb59e19b..da5170ceeab01a 100644 --- a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp +++ b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp @@ -38,7 +38,7 @@ #include "llvm/Support/CommandLine.h" #include "llvm/Support/MathExtras.h" #include "llvm/Support/RISCVAttributes.h" -#include "llvm/Support/RISCVISAInfo.h" +#include "llvm/TargetParser/RISCVISAInfo.h" #include <limits> diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.cpp b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.cpp index 67c9060b515772..4c59474df88358 100644 --- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.cpp +++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.cpp @@ -16,7 +16,6 @@ #include "llvm/MC/MCInst.h" #include "llvm/MC/MCRegisterInfo.h" #include "llvm/MC/MCSubtargetInfo.h" -#include "llvm/Support/RISCVISAInfo.h" #include "llvm/Support/raw_ostream.h" #include "llvm/TargetParser/TargetParser.h" #include "llvm/TargetParser/Triple.h" diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h index aa641bc866aa5e..08f056f78979af 100644 --- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h +++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h @@ -19,7 +19,7 @@ #include "llvm/ADT/StringRef.h" #include "llvm/ADT/StringSwitch.h" #include "llvm/MC/MCInstrDesc.h" -#include "llvm/Support/RISCVISAInfo.h" +#include "llvm/TargetParser/RISCVISAInfo.h" #include "llvm/TargetParser/RISCVTargetParser.h" #include "llvm/TargetParser/SubtargetFeature.h" diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVTargetStreamer.cpp b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVTargetStreamer.cpp index 4a4b1e13c2b9ec..0f92e9ed6a64d3 100644 --- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVTargetStreamer.cpp +++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVTargetStreamer.cpp @@ -16,7 +16,7 @@ #include "llvm/MC/MCSymbol.h" #include "llvm/Support/FormattedStream.h" #include "llvm/Support/RISCVAttributes.h" -#include "llvm/Support/RISCVISAInfo.h" +#include "llvm/TargetParser/RISCVISAInfo.h" using namespace llvm; diff --git a/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp b/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp index 779f179dff619f..6eceaddc747d15 100644 --- a/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp +++ b/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp @@ -37,8 +37,8 @@ #include "llvm/MC/MCStreamer.h" #include "llvm/MC/MCSymbol.h" #include "llvm/MC/TargetRegistry.h" -#include "llvm/Support/RISCVISAInfo.h" #include "llvm/Support/raw_ostream.h" +#include "llvm/TargetParser/RISCVISAInfo.h" #include "llvm/Transforms/Instrumentation/HWAddressSanitizer.h" using namespace llvm; diff --git a/llvm/lib/TargetParser/CMakeLists.txt b/llvm/lib/TargetParser/CMakeLists.txt index da1e352b037338..c100746c8c333f 100644 --- a/llvm/lib/TargetParser/CMakeLists.txt +++ b/llvm/lib/TargetParser/CMakeLists.txt @@ -20,6 +20,7 @@ add_llvm_component_library(LLVMTargetParser CSKYTargetParser.cpp Host.cpp LoongArchTargetParser.cpp + RISCVISAInfo.cpp RISCVTargetParser.cpp SubtargetFeature.cpp TargetParser.cpp diff --git a/llvm/lib/Support/RISCVISAInfo.cpp b/llvm/lib/TargetParser/RISCVISAInfo.cpp similarity index 93% rename from llvm/lib/Support/RISCVISAInfo.cpp rename to llvm/lib/TargetParser/RISCVISAInfo.cpp index fa967403ea449c..c103449f8067b7 100644 --- a/llvm/lib/Support/RISCVISAInfo.cpp +++ b/llvm/lib/TargetParser/RISCVISAInfo.cpp @@ -1,4 +1,4 @@ -//===-- RISCVISAInfo.cpp - RISC-V Arch String Parser ------------*- C++ -*-===// +//===-- RISCVISAInfo.cpp - RISC-V Arch String Parser ----------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -#include "llvm/Support/RISCVISAInfo.h" +#include "llvm/TargetParser/RISCVISAInfo.h" #include "llvm/ADT/MapVector.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SetVector.h" @@ -29,7 +29,7 @@ namespace { struct RISCVSupportedExtension { const char *Name; /// Supported version. - RISCVISAInfo::ExtensionVersion Version; + RISCVISAUtils::ExtensionVersion Version; bool operator<(const RISCVSupportedExtension &RHS) const { return StringRef(Name) < StringRef(RHS.Name); @@ -43,8 +43,6 @@ struct RISCVProfile { } // end anonymous namespace -static constexpr StringLiteral AllStdExts = "mafdqlcbkjtpvnh"; - static const char *RISCVGImplications[] = { "i", "m", "a", "f", "d", "zicsr", "zifencei" }; @@ -370,7 +368,7 @@ struct LessExtName { }; } // namespace -static std::optional<RISCVISAInfo::ExtensionVersion> +static std::optional<RISCVISAUtils::ExtensionVersion> findDefaultVersion(StringRef ExtName) { // Find default version of an extension. // TODO: We might set default version based on profile or ISA spec. @@ -387,7 +385,7 @@ findDefaultVersion(StringRef ExtName) { } void RISCVISAInfo::addExtension(StringRef ExtName, - RISCVISAInfo::ExtensionVersion Version) { + RISCVISAUtils::ExtensionVersion Version) { Exts[ExtName.str()] = Version; } @@ -411,7 +409,7 @@ static StringRef getExtensionType(StringRef Ext) { return StringRef(); } -static std::optional<RISCVISAInfo::ExtensionVersion> +static std::optional<RISCVISAUtils::ExtensionVersion> isExperimentalExtension(StringRef Ext) { auto I = llvm::lower_bound(SupportedExperimentalExtensions, Ext, LessExtName()); @@ -468,78 +466,6 @@ bool RISCVISAInfo::hasExtension(StringRef Ext) const { return Exts.count(Ext.str()) != 0; } -// We rank extensions in the following order: -// -Single letter extensions in canonical order. -// -Unknown single letter extensions in alphabetical order. -// -Multi-letter extensions starting with 'z' sorted by canonical order of -// the second letter then sorted alphabetically. -// -Multi-letter extensions starting with 's' in alphabetical order. -// -(TODO) Multi-letter extensions starting with 'zxm' in alphabetical order. -// -X extensions in alphabetical order. -// These flags are used to indicate the category. The first 6 bits store the -// single letter extension rank for single letter and multi-letter extensions -// starting with 'z'. -enum RankFlags { - RF_Z_EXTENSION = 1 << 6, - RF_S_EXTENSION = 1 << 7, - RF_X_EXTENSION = 1 << 8, -}; - -// Get the rank for single-letter extension, lower value meaning higher -// priority. -static unsigned singleLetterExtensionRank(char Ext) { - assert(Ext >= 'a' && Ext <= 'z'); - switch (Ext) { - case 'i': - return 0; - case 'e': - return 1; - } - - size_t Pos = AllStdExts.find(Ext); - if (Pos != StringRef::npos) - return Pos + 2; // Skip 'e' and 'i' from above. - - // If we got an unknown extension letter, then give it an alphabetical - // order, but after all known standard extensions. - return 2 + AllStdExts.size() + (Ext - 'a'); -} - -// Get the rank for multi-letter extension, lower value meaning higher -// priority/order in canonical order. -static unsigned getExtensionRank(const std::string &ExtName) { - assert(ExtName.size() >= 1); - switch (ExtName[0]) { - case 's': - return RF_S_EXTENSION; - case 'z': - assert(ExtName.size() >= 2); - // `z` extension must be sorted by canonical order of seco... [truncated] `````````` </details> https://github.com/llvm/llvm-project/pull/89684 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits