================ @@ -695,6 +696,106 @@ RISCVISAInfo::parseNormalizedArchString(StringRef Arch) { return std::move(ISAInfo); } +static Error splitExtsByUnderscore(StringRef Exts, + std::vector<std::string> &SplitExts) { + SmallVector<StringRef, 8> Split; + if (Exts.empty()) + return Error::success(); + + Exts.split(Split, "_"); + + for (auto Ext : Split) { + if (Ext.empty()) + return createStringError(errc::invalid_argument, + "extension name missing after separator '_'"); + + SplitExts.push_back(Ext.str()); + } + return Error::success(); +} + +static Error processMultiLetterExtension( + StringRef RawExt, + MapVector<std::string, RISCVISAInfo::ExtensionVersion, + std::map<std::string, unsigned>> &SeenExtMap, + bool IgnoreUnknown, bool EnableExperimentalExtension, + bool ExperimentalExtensionVersionCheck) { + StringRef Type = getExtensionType(RawExt); + StringRef Desc = getExtensionTypeDesc(RawExt); + auto Pos = findLastNonVersionCharacter(RawExt) + 1; + StringRef Name(RawExt.substr(0, Pos)); + StringRef Vers(RawExt.substr(Pos)); + + if (Type.empty()) { + if (IgnoreUnknown) + return Error::success(); + return createStringError(errc::invalid_argument, + "invalid extension prefix '" + RawExt + "'"); + } + + if (!IgnoreUnknown && Name.size() == Type.size()) + return createStringError(errc::invalid_argument, + "%s name missing after '%s'", Desc.str().c_str(), + Type.str().c_str()); + + unsigned Major, Minor, ConsumeLength; + if (auto E = getExtensionVersion(Name, Vers, Major, Minor, ConsumeLength, + EnableExperimentalExtension, + ExperimentalExtensionVersionCheck)) { + if (IgnoreUnknown) { + consumeError(std::move(E)); + return Error::success(); + } + return E; + } + + // Check if duplicated extension. + if (!IgnoreUnknown && (SeenExtMap.find(Name.str()) != SeenExtMap.end())) + return createStringError(errc::invalid_argument, "duplicated %s '%s'", + Desc.str().c_str(), Name.str().c_str()); + + if (IgnoreUnknown && !RISCVISAInfo::isSupportedExtension(Name)) + return Error::success(); + + SeenExtMap[Name.str()] = {Major, Minor}; + return Error::success(); +} + +static Error processSingleLetterExtension( + StringRef &RawExt, + MapVector<std::string, RISCVISAInfo::ExtensionVersion, + std::map<std::string, unsigned>> &SeenExtMap, + bool IgnoreUnknown, bool EnableExperimentalExtension, + bool ExperimentalExtensionVersionCheck) { + unsigned Major, Minor, ConsumeLength; + StringRef Name = RawExt.take_front(1); + RawExt.consume_front(Name); + if (auto E = getExtensionVersion(Name, RawExt, Major, Minor, ConsumeLength, + EnableExperimentalExtension, + ExperimentalExtensionVersionCheck)) { + if (IgnoreUnknown) { + consumeError(std::move(E)); + RawExt = RawExt.substr(ConsumeLength); + return Error::success(); + } + return E; + } + + RawExt = RawExt.substr(ConsumeLength); + + // Check if duplicated extension. + if (!IgnoreUnknown && (SeenExtMap.find(Name.str()) != SeenExtMap.end())) ---------------- topperc wrote:
SeenExtMap.contains 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