diff --git a/clang/test/Driver/riscv-arch.c b/clang/test/Driver/riscv-arch.c index abbe8612b3780..8c701a736fc7e 100644 --- a/clang/test/Driver/riscv-arch.c +++ b/clang/test/Driver/riscv-arch.c @@ -204,7 +204,7 @@ // RUN: not %clang --target=riscv32-unknown-elf -march=unknown -### %s \ // RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32-STR %s // RV32-STR: error: invalid arch name 'unknown', -// RV32-STR: string must begin with rv32{i,e,g} or rv64{i,e,g} +// RV32-STR: string must begin with rv32{i,e,g}, rv64{i,e,g}, or a supported profile name // RUN: not %clang --target=riscv32-unknown-elf -march=rv32q -### %s \ // RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32-LETTER %s diff --git a/clang/test/Driver/riscv-profiles.c b/clang/test/Driver/riscv-profiles.c index 647567d4c971f..298f301de3feb 100644 --- a/clang/test/Driver/riscv-profiles.c +++ b/clang/test/Driver/riscv-profiles.c @@ -318,7 +318,7 @@ // PROFILE-WITH-ADDITIONAL: "-target-feature" "+zkt" // RUN: not %clang --target=riscv64 -### -c %s 2>&1 -march=rva19u64_zfa | FileCheck -check-prefix=INVALID-PROFILE %s -// INVALID-PROFILE: error: invalid arch name 'rva19u64_zfa', unsupported profile +// INVALID-PROFILE: error: invalid arch name 'rva19u64_zfa', string must begin with rv32{i,e,g}, rv64{i,e,g}, or a supported profile name // RUN: not %clang --target=riscv64 -### -c %s 2>&1 -march=rva22u64zfa | FileCheck -check-prefix=INVALID-ADDITIONAL %s // INVALID-ADDITIONAL: error: invalid arch name 'rva22u64zfa', additional extensions must be after separator '_' diff --git a/llvm/lib/TargetParser/RISCVISAInfo.cpp b/llvm/lib/TargetParser/RISCVISAInfo.cpp index 3b0cf8fab25f4..d154c00a78592 100644 --- a/llvm/lib/TargetParser/RISCVISAInfo.cpp +++ b/llvm/lib/TargetParser/RISCVISAInfo.cpp @@ -592,40 +592,39 @@ RISCVISAInfo::parseArchString(StringRef Arch, bool EnableExperimentalExtension, return createStringError(errc::invalid_argument, "string must be lowercase"); - if (Arch.starts_with("rvi") || Arch.starts_with("rva") || - Arch.starts_with("rvb") || Arch.starts_with("rvm")) { + // ISA string must begin with rv32, rv64, or a profile. + unsigned XLen = 0; + if (Arch.consume_front("rv32")) { + XLen = 32; + } else if (Arch.consume_front("rv64")) { + XLen = 64; + } else { + // Try parsing as a profile. const auto *FoundProfile = llvm::find_if(SupportedProfiles, [Arch](const RISCVProfile &Profile) { return Arch.starts_with(Profile.Name); }); - if (FoundProfile == std::end(SupportedProfiles)) - return createStringError(errc::invalid_argument, "unsupported profile"); - - std::string NewArch = FoundProfile->MArch.str(); - StringRef ArchWithoutProfile = Arch.substr(FoundProfile->Name.size()); - if (!ArchWithoutProfile.empty()) { - if (!ArchWithoutProfile.starts_with("_")) - return createStringError( - errc::invalid_argument, - "additional extensions must be after separator '_'"); - NewArch += ArchWithoutProfile.str(); + if (FoundProfile != std::end(SupportedProfiles)) { + std::string NewArch = FoundProfile->MArch.str(); + StringRef ArchWithoutProfile = Arch.drop_front(FoundProfile->Name.size()); + if (!ArchWithoutProfile.empty()) { + if (ArchWithoutProfile.front() != '_') + return createStringError( + errc::invalid_argument, + "additional extensions must be after separator '_'"); + NewArch += ArchWithoutProfile.str(); + } + return parseArchString(NewArch, EnableExperimentalExtension, + ExperimentalExtensionVersionCheck, IgnoreUnknown); } - return parseArchString(NewArch, EnableExperimentalExtension, - ExperimentalExtensionVersionCheck, IgnoreUnknown); } - // ISA string must begin with rv32 or rv64. - unsigned XLen = 0; - if (Arch.consume_front("rv32")) - XLen = 32; - else if (Arch.consume_front("rv64")) - XLen = 64; - if (XLen == 0 || Arch.empty()) return createStringError( errc::invalid_argument, - "string must begin with rv32{i,e,g} or rv64{i,e,g}"); + "string must begin with rv32{i,e,g}, rv64{i,e,g}, or a supported " + "profile name"); std::unique_ptr ISAInfo(new RISCVISAInfo(XLen)); MapVector