[llvm] [RISCV] Generate RISCVISAInfo table from RISCVFeatures.td. (PR #89955)
Pengcheng Wang via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 24 22:22:31 PDT 2024
================
@@ -17,6 +17,102 @@
using namespace llvm;
+static StringRef getExtensionName(const Record *R) {
+ StringRef Name = R->getValueAsString("Name");
+ Name.consume_front("experimental-");
+ return Name;
+}
+
+namespace {
+
+struct LessRecordExtensionName {
+ bool operator()(const Record *Rec1, const Record *Rec2) const {
+ return getExtensionName(Rec1) < getExtensionName(Rec2);
+ }
+};
+
+} // end anonymous namespace
+
+static void printExtensionTable(raw_ostream &OS,
+ const std::vector<Record *> &Extensions,
+ bool Experimental) {
+ OS << "static const RISCVSupportedExtension Supported";
+ if (Experimental)
+ OS << "Experimental";
+ OS << "Extensions[] = {\n";
+
+ for (Record *R : Extensions) {
+ if (R->getValueAsBit("Experimental") != Experimental)
+ continue;
+
+ OS << " {\"" << getExtensionName(R) << "\", {"
+ << R->getValueAsInt("MajorVersion") << ", "
+ << R->getValueAsInt("MinorVersion") << "}},\n";
+ }
+
+ OS << "};\n\n";
+}
+
+// Get the extension name from the Record name. This gives the canonical
+// capitalization.
+static StringRef getExtensionNameFromRecordName(const Record *R) {
+ StringRef Name = R->getName();
+ if (!Name.consume_front("FeatureStdExt"))
+ Name.consume_front("FeatureVendor");
+
+ return Name;
+}
+
+static void emitRISCVExtensions(RecordKeeper &Records, raw_ostream &OS) {
+ OS << "#ifdef GET_SUPPORTED_EXTENSIONS\n";
+ OS << "#undef GET_SUPPORTED_EXTENSIONS\n\n";
+
+ std::vector<Record *> Extensions =
+ Records.getAllDerivedDefinitions("RISCVExtension");
+ llvm::sort(Extensions, LessRecordExtensionName());
----------------
wangpc-pp wrote:
Use lambda?
https://github.com/llvm/llvm-project/pull/89955
More information about the llvm-commits
mailing list