diff --git a/clang/lib/Driver/ToolChains/Arch/RISCV.cpp b/clang/lib/Driver/ToolChains/Arch/RISCV.cpp --- a/clang/lib/Driver/ToolChains/Arch/RISCV.cpp +++ b/clang/lib/Driver/ToolChains/Arch/RISCV.cpp @@ -31,26 +31,26 @@ } // end anonymous namespace static StringRef getExtensionTypeDesc(StringRef Ext) { - if (Ext.startswith("sx")) - return "non-standard supervisor-level extension"; if (Ext.startswith("s")) return "standard supervisor-level extension"; - if (Ext.startswith("x")) - return "non-standard user-level extension"; + if (Ext.startswith("h")) + return "standard hypervisor-level extension"; if (Ext.startswith("z")) - return "standard user-level extension"; + return "standard machine-level extension"; + if (Ext.startswith("x")) + return "non-standard extension"; return StringRef(); } static StringRef getExtensionType(StringRef Ext) { - if (Ext.startswith("sx")) - return "sx"; if (Ext.startswith("s")) return "s"; - if (Ext.startswith("x")) - return "x"; + if (Ext.startswith("h")) + return "h"; if (Ext.startswith("z")) return "z"; + if (Ext.startswith("x")) + return "x"; return StringRef(); } @@ -74,7 +74,7 @@ if (isExperimentalExtension(Ext)) return true; - // LLVM does not support "sx", "s" nor "x" extensions. + // LLVM does not support "s", "h" nor "x" extensions. return false; } @@ -161,10 +161,10 @@ // Handle other types of extensions other than the standard // general purpose and standard user-level extensions. -// Parse the ISA string containing non-standard user-level -// extensions, standard supervisor-level extensions and -// non-standard supervisor-level extensions. -// These extensions start with 'z', 'x', 's', 'sx' prefixes, follow a +// Parse the ISA string containing standard supervisor-level +// extensions, standard hypervisor-level extensions, +// standard machine-level extensions and non-standard extensions. +// These extensions start with 's', 'h', 'z', 'x' prefixes, follow a // canonical order, might have a version number (major, minor) // and are separated by a single underscore '_'. // Set the hardware features for the extensions that are supported. @@ -176,11 +176,11 @@ return; // Multi-letter extensions are seperated by a single underscore - // as described in RISC-V User-Level ISA V2.2. + // as described in RISC-V User-Level ISA 20191213. SmallVector Split; Exts.split(Split, StringRef("_")); - SmallVector Prefix{"z", "x", "s", "sx"}; + SmallVector Prefix{"s", "h", "z", "x"}; auto I = Prefix.begin(); auto E = Prefix.end(); @@ -330,12 +330,13 @@ // Skip rvxxx StringRef Exts = MArch.substr(5); - // Remove multi-letter standard extensions, non-standard extensions and - // supervisor-level extensions. They have 'z', 'x', 's', 'sx' prefixes. + // Remove multi-letter supervisor-level extensions, hypervisor-level + // extensions, machine-level extensions and non-standard extensions. + // They have 's', 'h', 'z', 'x' prefixes. // Parse them at the end. - // Find the very first occurrence of 's', 'x' or 'z'. + // Find the very first occurrence of 's', 'h', 'z' or 'x'. StringRef OtherExts; - size_t Pos = Exts.find_first_of("zsx"); + size_t Pos = Exts.find_first_of("shzx"); if (Pos != StringRef::npos) { OtherExts = Exts.substr(Pos); Exts = Exts.substr(0, Pos); diff --git a/clang/test/Driver/riscv-arch.c b/clang/test/Driver/riscv-arch.c --- a/clang/test/Driver/riscv-arch.c +++ b/clang/test/Driver/riscv-arch.c @@ -181,31 +181,25 @@ // RV32-STD: error: invalid arch name 'rv32imqc', // RV32-STD: unsupported standard user-level extension 'q' -// RUN: %clang -target riscv32-unknown-elf -march=rv32xabc -### %s \ -// RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32X %s -// RV32X: error: invalid arch name 'rv32xabc', -// RV32X: first letter should be 'e', 'i' or 'g' - -// RUN: %clang -target riscv32-unknown-elf -march=rv32sxabc -### %s \ -// RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32SX %s -// RV32SX: error: invalid arch name 'rv32sxabc', -// RV32SX: first letter should be 'e', 'i' or 'g' - // RUN: %clang -target riscv32-unknown-elf -march=rv32sabc -### %s \ // RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32S %s // RV32S: error: invalid arch name 'rv32sabc', // RV32S: first letter should be 'e', 'i' or 'g' -// RUN: %clang -target riscv32-unknown-elf -march=rv32ix -### %s \ -// RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32X-NAME %s -// RV32X-NAME: error: invalid arch name 'rv32ix', -// RV32X-NAME: non-standard user-level extension name missing after 'x' +// RUN: %clang -target riscv32-unknown-elf -march=rv32habc -### %s \ +// RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32H %s +// RV32H: error: invalid arch name 'rv32habc', +// RV32H: first letter should be 'e', 'i' or 'g' -// RUN: %clang -target riscv32-unknown-elf -march=rv32isx -### %s \ -// RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32SX-NAME %s -// RV32SX-NAME: error: invalid arch name 'rv32isx', -// RV32SX-NAME: non-standard supervisor-level extension -// RV32SX-NAME: name missing after 'sx' +// RUN: %clang -target riscv32-unknown-elf -march=rv32zabc -### %s \ +// RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32Z %s +// RV32Z: error: invalid arch name 'rv32zabc', +// RV32Z: first letter should be 'e', 'i' or 'g' + +// RUN: %clang -target riscv32-unknown-elf -march=rv32xabc -### %s \ +// RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32X %s +// RV32X: error: invalid arch name 'rv32xabc', +// RV32X: first letter should be 'e', 'i' or 'g' // RUN: %clang -target riscv32-unknown-elf -march=rv32is -### %s \ // RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32S-NAME %s @@ -213,31 +207,53 @@ // RV32S-NAME: standard supervisor-level extension // RV32S-NAME: name missing after 's' -// RUN: %clang -target riscv32-unknown-elf -march=rv32ix_s_sx -### %s \ -// RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32ALL-NAME %s -// RV32ALL-NAME: error: invalid arch name 'rv32ix_s_sx', -// RV32ALL-NAME: non-standard user-level extension -// RV32ALL-NAME: name missing after 'x' +// RUN: %clang -target riscv32-unknown-elf -march=rv32ih -### %s \ +// RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32H-NAME %s +// RV32H-NAME: error: invalid arch name 'rv32ih', +// RV32H-NAME: standard hypervisor-level extension +// RV32H-NAME: name missing after 'h' -// RUN: %clang -target riscv32-unknown-elf -march=rv32ixabc -### %s \ -// RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32X-UNS %s -// RV32X-UNS: error: invalid arch name 'rv32ixabc', -// RV32X-UNS: unsupported non-standard user-level extension 'xabc' +// RUN: %clang -target riscv32-unknown-elf -march=rv32iz -### %s \ +// RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32Z-NAME %s +// RV32Z-NAME: error: invalid arch name 'rv32iz', +// RV32Z-NAME: standard machine-level extension +// RV32Z-NAME: name missing after 'z' + +// RUN: %clang -target riscv32-unknown-elf -march=rv32ix -### %s \ +// RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32X-NAME %s +// RV32X-NAME: error: invalid arch name 'rv32ix', +// RV32X-NAME: non-standard extension name missing after 'x' + +// RUN: %clang -target riscv32-unknown-elf -march=rv32is_h_z_x -### %s \ +// RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32ALL-NAME %s +// RV32ALL-NAME: error: invalid arch name 'rv32is_h_z_x', +// RV32ALL-NAME: standard supervisor-level extension +// RV32ALL-NAME: name missing after 's' // RUN: %clang -target riscv32-unknown-elf -march=rv32isa -### %s \ // RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32S-UNS %s // RV32S-UNS: error: invalid arch name 'rv32isa', // RV32S-UNS: unsupported standard supervisor-level extension 'sa' -// RUN: %clang -target riscv32-unknown-elf -march=rv32isxabc -### %s \ -// RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32SX-UNS %s -// RV32SX-UNS: error: invalid arch name 'rv32isxabc', -// RV32SX-UNS: unsupported non-standard supervisor-level extension 'sxabc' +// RUN: %clang -target riscv32-unknown-elf -march=rv32ihab -### %s \ +// RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32H-UNS %s +// RV32H-UNS: error: invalid arch name 'rv32ihab', +// RV32H-UNS: unsupported standard hypervisor-level extension 'hab' -// RUN: %clang -target riscv32-unknown-elf -march=rv32ixabc_sp_sxlw -### %s \ +// RUN: %clang -target riscv32-unknown-elf -march=rv32izabc -### %s \ +// RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32Z-UNS %s +// RV32Z-UNS: error: invalid arch name 'rv32izabc', +// RV32Z-UNS: unsupported standard machine-level extension 'zabc' + +// RUN: %clang -target riscv32-unknown-elf -march=rv32ixabcd -### %s \ +// RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32X-UNS %s +// RV32X-UNS: error: invalid arch name 'rv32ixabcd', +// RV32X-UNS: unsupported non-standard extension 'xabcd' + +// RUN: %clang -target riscv32-unknown-elf -march=rv32isabc_hp_zxlw_xno -### %s \ // RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32ALL %s -// RV32ALL: error: invalid arch name 'rv32ixabc_sp_sxlw', -// RV32ALL: unsupported non-standard user-level extension 'xabc' +// RV32ALL: error: invalid arch name 'rv32isabc_hp_zxlw_xno', +// RV32ALL: unsupported standard supervisor-level extension 'sabc' // RUN: %clang -target riscv32-unknown-elf -march=rv32i20 -### %s \ // RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32-IVER %s @@ -264,20 +280,25 @@ // RV32-IMINOR1: error: invalid arch name 'rv32i2p1', unsupported // RV32-IMINOR1: version number 2.1 for extension 'i' -// RUN: %clang -target riscv32-unknown-elf -march=rv32ixt2p -### %s \ -// RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32-XMINOR-MISS %s -// RV32-XMINOR-MISS: error: invalid arch name 'rv32ixt2p', -// RV32-XMINOR-MISS: minor version number missing after 'p' for extension 'xt' +// RUN: %clang -target riscv32-unknown-elf -march=rv32ist2p -### %s \ +// RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32-SMINOR-MISS %s +// RV32-SMINOR-MISS: error: invalid arch name 'rv32ist2p', +// RV32-SMINOR-MISS: minor version number missing after 'p' for extension 'st' + +// RUN: %clang -target riscv32-unknown-elf -march=rv32iht2p -### %s \ +// RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32-HMINOR-MISS %s +// RV32-HMINOR-MISS: error: invalid arch name 'rv32iht2p', +// RV32-HMINOR-MISS: minor version number missing after 'p' for extension 'ht' -// RUN: %clang -target riscv32-unknown-elf -march=rv32ist2p0 -### %s \ -// RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32-SMINOR0 %s -// RV32-SMINOR0: error: invalid arch name 'rv32ist2p0', -// RV32-SMINOR0: unsupported version number 2.0 for extension 'st' +// RUN: %clang -target riscv32-unknown-elf -march=rv32izt2p0 -### %s \ +// RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32-ZMINOR0 %s +// RV32-ZMINOR0: error: invalid arch name 'rv32izt2p0', +// RV32-ZMINOR0: unsupported version number 2.0 for extension 'zt' -// RUN: %clang -target riscv32-unknown-elf -march=rv32isxt2p1 -### %s \ -// RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32-SXMINOR1 %s -// RV32-SXMINOR1: error: invalid arch name 'rv32isxt2p1', unsupported -// RV32-SXMINOR1: version number 2.1 for extension 'sxt' +// RUN: %clang -target riscv32-unknown-elf -march=rv32ixt2p1 -### %s \ +// RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32-XMINOR1 %s +// RV32-XMINOR1: error: invalid arch name 'rv32ixt2p1', unsupported +// RV32-XMINOR1: version number 2.1 for extension 'xt' // RUN: %clang -target riscv32-unknown-elf -march=rv32ixabc_ -### %s \ // RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32-XSEP %s @@ -289,32 +310,38 @@ // RV32-PREFIX: error: invalid arch name 'rv32ixabc_a', // RV32-PREFIX: invalid extension prefix 'a' -// RUN: %clang -target riscv32-unknown-elf -march=rv32isabc_xdef -### %s \ -// RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32-X-ORDER %s -// RV32-X-ORDER: error: invalid arch name 'rv32isabc_xdef', -// RV32-X-ORDER: non-standard user-level extension not given -// RV32-X-ORDER: in canonical order 'xdef' - -// RUN: %clang -target riscv32-unknown-elf -march=rv32isxabc_sdef -### %s \ +// RUN: %clang -target riscv32-unknown-elf -march=rv32ihabc_sdef -### %s \ // RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32-S-ORDER %s -// RV32-S-ORDER: error: invalid arch name 'rv32isxabc_sdef', +// RV32-S-ORDER: error: invalid arch name 'rv32ihabc_sdef', // RV32-S-ORDER: standard supervisor-level extension not given // RV32-S-ORDER: in canonical order 'sdef' +// RUN: %clang -target riscv32-unknown-elf -march=rv32izabc_hdef -### %s \ +// RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32-H-ORDER %s +// RV32-H-ORDER: error: invalid arch name 'rv32izabc_hdef', +// RV32-H-ORDER: standard hypervisor-level extension not given +// RV32-H-ORDER: in canonical order 'hdef' + +// RUN: %clang -target riscv32-unknown-elf -march=rv32ixabc_zdef -### %s \ +// RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32-Z-ORDER %s +// RV32-Z-ORDER: error: invalid arch name 'rv32ixabc_zdef', +// RV32-Z-ORDER: standard machine-level extension not given +// RV32-Z-ORDER: in canonical order 'zdef' + // RUN: %clang -target riscv32-unknown-elf -march=rv32ixabc_xabc -### %s \ // RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32-XDUP %s // RV32-XDUP: error: invalid arch name 'rv32ixabc_xabc', -// RV32-XDUP: duplicated non-standard user-level extension 'xabc' +// RV32-XDUP: duplicated non-standard extension 'xabc' // RUN: %clang -target riscv32-unknown-elf -march=rv32ixabc_xdef -### %s \ // RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32-X-X-INVAL %s // RV32-X-X-INVAL: error: invalid arch name 'rv32ixabc_xdef', unsupported -// RV32-X-X-INVAL: non-standard user-level extension 'xabc' +// RV32-X-X-INVAL: non-standard extension 'xabc' -// RUN: %clang -target riscv32-unknown-elf -march=rv32ixabc_sdef_sxghi -### %s \ -// RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32-X-S-SX-INVAL %s -// RV32-X-S-SX-INVAL: error: invalid arch name 'rv32ixabc_sdef_sxghi', -// RV32-X-S-SX-INVAL: unsupported non-standard user-level extension 'xabc' +// RUN: %clang -target riscv32-unknown-elf -march=rv32isabc_hdef_zghi_xjkl -### %s \ +// RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32-S-H-Z-X-INVAL %s +// RV32-S-H-Z-X-INVAL: error: invalid arch name 'rv32isabc_hdef_zghi_xjkl', +// RV32-S-H-Z-X-INVAL: unsupported standard supervisor-level extension 'sabc' // RUN: %clang -target riscv32-unknown-elf -march=rv32i -### %s \ // RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32-TARGET %s