Author: Yeting Kuo Date: 2024-05-06T13:55:37+08:00 New Revision: d70267fbae228990c47b5bdbce7aa659e8b5146e
URL: https://github.com/llvm/llvm-project/commit/d70267fbae228990c47b5bdbce7aa659e8b5146e DIFF: https://github.com/llvm/llvm-project/commit/d70267fbae228990c47b5bdbce7aa659e8b5146e.diff LOG: [RISCV] Teach .option arch to support experimental extensions. (#89727) Previously `.option arch` denied extenions are not belongs to RISC-V features. But experimental features have experimental- prefix, so `.option arch` can not serve for experimental extension. This patch uses the features of extensions to identify extension existance. Added: clang/test/Driver/riscv-option-arch.c clang/test/Driver/riscv-option-arch.s Modified: llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp llvm/test/MC/RISCV/option-arch.s Removed: ################################################################################ diff --git a/clang/test/Driver/riscv-option-arch.c b/clang/test/Driver/riscv-option-arch.c new file mode 100644 index 00000000000000..e583e9fd62b08c --- /dev/null +++ b/clang/test/Driver/riscv-option-arch.c @@ -0,0 +1,7 @@ +// RUN: %clang --target=riscv64 -menable-experimental-extensions -c -o /dev/null %s +// RUN: ! %clang --target=riscv64 -c -o /dev/null %s 2>&1 | FileCheck -check-prefixes=CHECK-ERR %s + +void foo() { + asm volatile (".option arch, +zicfiss"); + // CHECK-ERR: Unexpected experimental extensions. +} diff --git a/clang/test/Driver/riscv-option-arch.s b/clang/test/Driver/riscv-option-arch.s new file mode 100644 index 00000000000000..8ce84dd8ffe79d --- /dev/null +++ b/clang/test/Driver/riscv-option-arch.s @@ -0,0 +1,5 @@ +# RUN: %clang --target=riscv64 -menable-experimental-extensions -c -o /dev/null %s +# RUN: ! %clang --target=riscv64 -c -o /dev/null %s 2>&1 | FileCheck -check-prefixes=CHECK-ERR %s + +.option arch, +zicfiss +# CHECK-ERR: Unexpected experimental extensions. diff --git a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp index 8ac79ddce595e0..6af1d5010d3a47 100644 --- a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp +++ b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp @@ -84,6 +84,9 @@ class RISCVAsmParser : public MCTargetAsmParser { SMLoc getLoc() const { return getParser().getTok().getLoc(); } bool isRV64() const { return getSTI().hasFeature(RISCV::Feature64Bit); } bool isRVE() const { return getSTI().hasFeature(RISCV::FeatureStdExtE); } + bool enableExperimentalExtension() const { + return getSTI().hasFeature(RISCV::Experimental); + } RISCVTargetStreamer &getTargetStreamer() { assert(getParser().getStreamer().getTargetStreamer() && @@ -2824,17 +2827,19 @@ bool RISCVAsmParser::parseDirectiveOption() { break; } - auto Ext = llvm::lower_bound(RISCVFeatureKV, Arch); - if (Ext == std::end(RISCVFeatureKV) || StringRef(Ext->Key) != Arch || - !RISCVISAInfo::isSupportedExtension(Arch)) { - if (isDigit(Arch.back())) - return Error( - Loc, - "Extension version number parsing not currently implemented"); + if (isDigit(Arch.back())) + return Error( + Loc, "Extension version number parsing not currently implemented"); + + std::string Feature = RISCVISAInfo::getTargetFeatureForExtension(Arch); + if (!enableExperimentalExtension() && + StringRef(Feature).starts_with("experimental-")) + return Error(Loc, "Unexpected experimental extensions."); + auto Ext = llvm::lower_bound(RISCVFeatureKV, Feature); + if (Ext == std::end(RISCVFeatureKV) || StringRef(Ext->Key) != Feature) return Error(Loc, "unknown extension feature"); - } - Args.emplace_back(Type, Ext->Key); + Args.emplace_back(Type, Arch.str()); if (Type == RISCVOptionArchArgType::Plus) { FeatureBitset OldFeatureBits = STI->getFeatureBits(); diff --git a/llvm/test/MC/RISCV/option-arch.s b/llvm/test/MC/RISCV/option-arch.s index 6ee133c7159a27..7826252f66e6c8 100644 --- a/llvm/test/MC/RISCV/option-arch.s +++ b/llvm/test/MC/RISCV/option-arch.s @@ -1,7 +1,7 @@ -# RUN: llvm-mc -triple riscv32 -show-encoding < %s \ +# RUN: llvm-mc -triple riscv32 -mattr=+experimental -show-encoding < %s \ # RUN: | FileCheck -check-prefixes=CHECK %s -# RUN: llvm-mc -triple riscv32 -filetype=obj < %s \ -# RUN: | llvm-objdump --triple=riscv32 --mattr=+c,+m,+a,+f,+zba -d -M no-aliases - \ +# RUN: llvm-mc -triple riscv32 -mattr=+experimental -filetype=obj < %s \ +# RUN: | llvm-objdump --triple=riscv32 --mattr=+c,+m,+a,+f,+zba,+experimental-zicfiss -d -M no-aliases - \ # RUN: | FileCheck -check-prefixes=CHECK-INST %s # Test '.option arch, +' and '.option arch, -' directive @@ -78,6 +78,13 @@ lr.w t0, (t1) # CHECK: encoding: [0xb3,0x22,0x73,0x20] sh1add t0, t1, t2 +# Test experimental extension +# CHECK: .option arch, +zicfiss +.option arch, +zicfiss +# CHECK-INST: sspopchk ra +# CHECK: encoding: [0x73,0xc0,0xc0,0xcd] +sspopchk ra + # Test '.option arch, <arch-string>' directive # CHECK: .option arch, rv32i2p1_m2p0_a2p1_c2p0 .option arch, rv32i2p1_m2p0_a2p1_c2p0 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits