@@ -21,8 +21,8 @@ bool operator==(const RISCVISAUtils::ExtensionVersion &A,
21
21
}
22
22
23
23
TEST (ParseNormalizedArchString, RejectsInvalidChars) {
24
- for (StringRef Input :
25
- { " RV32 " , " rV64 " , " rv32i2P0 " , " rv64i2p0_A2p0 " , " rv32e2.0" }) {
24
+ for (StringRef Input : { " RV32 " , " rV64 " , " rv32i2P0 " , " rv64i2p0_A2p0 " ,
25
+ " rv32e2.0" , " rva20u64+zbc " }) {
26
26
EXPECT_EQ (
27
27
toString (RISCVISAInfo::parseNormalizedArchString (Input).takeError ()),
28
28
" string may only contain [a-z0-9_]" );
@@ -667,6 +667,65 @@ TEST(ParseArchString, RejectsConflictingExtensions) {
667
667
}
668
668
}
669
669
670
+ TEST (ParseArchString, RejectsUnrecognizedProfileNames) {
671
+ for (StringRef Input : {" rvi23u99" , " rvz23u64" , " rva99u32" }) {
672
+ EXPECT_EQ (toString (RISCVISAInfo::parseArchString (Input, true ).takeError ()),
673
+ " string must begin with rv32{i,e,g}, rv64{i,e,g}, or a supported "
674
+ " profile name" );
675
+ }
676
+ }
677
+
678
+ TEST (ParseArchString, RejectsProfilesWithUnseparatedExtraExtensions) {
679
+ for (StringRef Input : {" rvi20u32m" , " rvi20u64c" }) {
680
+ EXPECT_EQ (toString (RISCVISAInfo::parseArchString (Input, true ).takeError ()),
681
+ " additional extensions must be after separator '_'" );
682
+ }
683
+ }
684
+
685
+ TEST (ParseArchString, AcceptsBareProfileNames) {
686
+ auto MaybeRVA20U64 = RISCVISAInfo::parseArchString (" rva20u64" , true );
687
+ ASSERT_THAT_EXPECTED (MaybeRVA20U64, Succeeded ());
688
+ const auto &Exts = (*MaybeRVA20U64)->getExtensions ();
689
+ EXPECT_EQ (Exts.size (), 13UL );
690
+ EXPECT_EQ (Exts.count (" i" ), 1U );
691
+ EXPECT_EQ (Exts.count (" m" ), 1U );
692
+ EXPECT_EQ (Exts.count (" f" ), 1U );
693
+ EXPECT_EQ (Exts.count (" a" ), 1U );
694
+ EXPECT_EQ (Exts.count (" d" ), 1U );
695
+ EXPECT_EQ (Exts.count (" c" ), 1U );
696
+ EXPECT_EQ (Exts.count (" za128rs" ), 1U );
697
+ EXPECT_EQ (Exts.count (" zicntr" ), 1U );
698
+ EXPECT_EQ (Exts.count (" ziccif" ), 1U );
699
+ EXPECT_EQ (Exts.count (" zicsr" ), 1U );
700
+ EXPECT_EQ (Exts.count (" ziccrse" ), 1U );
701
+ EXPECT_EQ (Exts.count (" ziccamoa" ), 1U );
702
+ EXPECT_EQ (Exts.count (" zicclsm" ), 1U );
703
+
704
+ auto MaybeRVA23U64 = RISCVISAInfo::parseArchString (" rva23u64" , true );
705
+ ASSERT_THAT_EXPECTED (MaybeRVA23U64, Succeeded ());
706
+ EXPECT_GT ((*MaybeRVA23U64)->getExtensions ().size (), 13UL );
707
+ }
708
+
709
+ TEST (ParseArchSTring, AcceptsProfileNamesWithSeparatedAdditionalExtensions) {
710
+ auto MaybeRVI20U64 = RISCVISAInfo::parseArchString (" rvi20u64_m_zba" , true );
711
+ ASSERT_THAT_EXPECTED (MaybeRVI20U64, Succeeded ());
712
+ const auto &Exts = (*MaybeRVI20U64)->getExtensions ();
713
+ EXPECT_EQ (Exts.size (), 3UL );
714
+ EXPECT_EQ (Exts.count (" i" ), 1U );
715
+ EXPECT_EQ (Exts.count (" m" ), 1U );
716
+ EXPECT_EQ (Exts.count (" zba" ), 1U );
717
+ }
718
+
719
+ TEST (ParseArchString,
720
+ RejectsProfilesWithAdditionalExtensionsGivenAlreadyInProfile) {
721
+ // This test was added to document the current behaviour. Discussion isn't
722
+ // believed to have taken place about if this is desirable or not.
723
+ EXPECT_EQ (
724
+ toString (
725
+ RISCVISAInfo::parseArchString (" rva20u64_zicntr" , true ).takeError ()),
726
+ " duplicated standard user-level extension 'zicntr'" );
727
+ }
728
+
670
729
TEST (ToFeatures, IIsDroppedAndExperimentalExtensionsArePrefixed) {
671
730
auto MaybeISAInfo1 =
672
731
RISCVISAInfo::parseArchString (" rv64im_ztso" , true , false );
0 commit comments