================ @@ -785,153 +878,61 @@ RISCVISAInfo::parseArchString(StringRef Arch, bool EnableExperimentalExtension, Minor = Version->Minor; } - ISAInfo->addExtension(StringRef(&Baseline, 1), {Major, Minor}); + // Postpone AddExtension until end of this function + SeenExts.push_back(StringRef(&Baseline, 1).str()); + ExtsVersion.push_back({Major, Minor}); } // Consume the base ISA version number and any '_' between rvxxx and the // first extension Exts = Exts.drop_front(ConsumeLength); Exts.consume_front("_"); - auto StdExtsItr = StdExts.begin(); - auto StdExtsEnd = StdExts.end(); - auto GoToNextExt = [](StringRef::iterator &I, unsigned ConsumeLength, - StringRef::iterator E) { - I += 1 + ConsumeLength; - if (I != E && *I == '_') - ++I; - }; - for (auto I = Exts.begin(), E = Exts.end(); I != E;) { - char C = *I; - - // Check ISA extensions are specified in the canonical order. - while (StdExtsItr != StdExtsEnd && *StdExtsItr != C) - ++StdExtsItr; - - if (StdExtsItr == StdExtsEnd) { - // Either c contains a valid extension but it was not given in - // canonical order or it is an invalid extension. - if (StdExts.contains(C)) { - return createStringError( - errc::invalid_argument, - "standard user-level extension not given in canonical order '%c'", - C); - } - - return createStringError(errc::invalid_argument, - "invalid standard user-level extension '%c'", C); - } - - // Move to next char to prevent repeated letter. - ++StdExtsItr; - - StringRef Next; - unsigned Major, Minor, ConsumeLength; - if (std::next(I) != E) - Next = StringRef(std::next(I), E - std::next(I)); - if (auto E = getExtensionVersion(StringRef(&C, 1), Next, Major, Minor, - ConsumeLength, EnableExperimentalExtension, - ExperimentalExtensionVersionCheck)) { - if (IgnoreUnknown) { - consumeError(std::move(E)); - GoToNextExt(I, ConsumeLength, Exts.end()); - continue; - } - return std::move(E); - } - - // The order is OK, then push it into features. - // Currently LLVM supports only "mafdcvh". - if (!isSupportedExtension(StringRef(&C, 1))) { - if (IgnoreUnknown) { - GoToNextExt(I, ConsumeLength, Exts.end()); - continue; - } - return createStringError(errc::invalid_argument, - "unsupported standard user-level extension '%c'", - C); - } - ISAInfo->addExtension(StringRef(&C, 1), {Major, Minor}); - - // Consume full extension name and version, including any optional '_' - // between this extension and the next - GoToNextExt(I, ConsumeLength, Exts.end()); - } - - // 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', 's', 'x' prefixes, might have a version ---------------- MaskRay wrote:
This comment appears to be removed. Consider retaining it. https://github.com/llvm/llvm-project/pull/78120 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits