Generate version validation function from SupportedVersion records.
| 825 | |
| 826 | /// Generate version validation function from SupportedVersion records. |
| 827 | static void generateVersionValidation(const RecordKeeper &records, |
| 828 | raw_ostream &os) { |
| 829 | emitSourceFileHeader("Generated Version Validation", os); |
| 830 | auto versionRecords = records.getAllDerivedDefinitions("SupportedVersion"); |
| 831 | // Group versions by major version. |
| 832 | std::map<uint8_t, std::vector<uint8_t>> versionMap; |
| 833 | |
| 834 | for (const Record *record : versionRecords) { |
| 835 | unsigned major = record->getValueAsInt("majorVersion"); |
| 836 | unsigned minor = record->getValueAsInt("minorVersion"); |
| 837 | versionMap[uint8_t(major)].push_back(uint8_t(minor)); |
| 838 | } |
| 839 | |
| 840 | os << "// Auto-generated version validation from SupportedVersion records\n"; |
| 841 | |
| 842 | for (const auto &[major, minors] : versionMap) { |
| 843 | bool isTestingVersion = (major == 250); |
| 844 | |
| 845 | if (isTestingVersion) { |
| 846 | os << "#ifdef TILE_IR_INCLUDE_TESTS\n"; |
| 847 | os << " // Testing versions - only available when TILE_IR_INCLUDE_TESTS " |
| 848 | "is defined.\n"; |
| 849 | } |
| 850 | |
| 851 | os << " if (verMajor == " << static_cast<int>(major) << ") {\n"; |
| 852 | |
| 853 | auto minIt = std::min_element(minors.begin(), minors.end()); |
| 854 | auto maxIt = std::max_element(minors.begin(), minors.end()); |
| 855 | |
| 856 | if (*minIt == *maxIt) |
| 857 | os << " if (verMinor == " << static_cast<int>(*minIt) << ")\n"; |
| 858 | else if (*minIt == 0) |
| 859 | os << " if (verMinor <= " << static_cast<int>(*maxIt) << ")\n"; |
| 860 | else |
| 861 | os << " if (verMinor >= " << static_cast<int>(*minIt) |
| 862 | << " && verMinor <= " << static_cast<int>(*maxIt) << ")\n"; |
| 863 | |
| 864 | os << " return BytecodeVersion(verMajor, verMinor, verTag);\n"; |
| 865 | os << " }\n"; |
| 866 | |
| 867 | if (isTestingVersion) |
| 868 | os << "#endif // TILE_IR_INCLUDE_TESTS\n"; |
| 869 | } |
| 870 | |
| 871 | os << " return std::nullopt;\n"; |
| 872 | } |
| 873 | |
| 874 | /// Generate getSupportedVersions() function from SupportedVersion records. |
| 875 | static void generateSupportedVersionsList(const RecordKeeper &records, |