================ @@ -793,153 +887,69 @@ RISCVISAInfo::parseArchString(StringRef Arch, bool EnableExperimentalExtension, Minor = Version->Minor; } - ISAInfo->addExtension(StringRef(&Baseline, 1), {Major, Minor}); + // Postpone AddExtension until end of this function + SeenExtMap[StringRef(&Baseline, 1).str()] = {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; + std::vector<std::string> SplitedExts; + if (auto E = splitExtsByUnderscore(Exts, SplitedExts)) + return std::move(E); + + for (auto Ext : SplitedExts) { ---------------- topperc wrote:
`auto &Ext` 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