@@ -39,6 +39,9 @@ struct BytecodeWriterConfig::Impl {
3939 // / Note: This only differs from kVersion if a specific version is set.
4040 int64_t bytecodeVersion = bytecode::kVersion ;
4141
42+ // / A map containing dialect version information for each dialect to emit.
43+ llvm::StringMap<std::unique_ptr<DialectVersion>> dialectVersionMap;
44+
4245 // / The producer of the bytecode.
4346 StringRef producer;
4447
@@ -94,6 +97,19 @@ int64_t BytecodeWriterConfig::getDesiredBytecodeVersion() const {
9497 return impl->bytecodeVersion ;
9598}
9699
100+ llvm::StringMap<std::unique_ptr<DialectVersion>> &
101+ BytecodeWriterConfig::getDialectVersionMap () const {
102+ return impl->dialectVersionMap ;
103+ }
104+
105+ void BytecodeWriterConfig::setDialectVersion (
106+ llvm::StringRef dialectName,
107+ std::unique_ptr<DialectVersion> dialectVersion) const {
108+ assert (!impl->dialectVersionMap .contains (dialectName) &&
109+ " cannot override a previously set dialect version" );
110+ impl->dialectVersionMap .insert ({dialectName, std::move (dialectVersion)});
111+ }
112+
97113// ===----------------------------------------------------------------------===//
98114// EncodingEmitter
99115// ===----------------------------------------------------------------------===//
@@ -340,12 +356,16 @@ class StringSectionBuilder {
340356} // namespace
341357
342358class DialectWriter : public DialectBytecodeWriter {
359+ using DialectVersionMapT = llvm::StringMap<std::unique_ptr<DialectVersion>>;
360+
343361public:
344362 DialectWriter (int64_t bytecodeVersion, EncodingEmitter &emitter,
345363 IRNumberingState &numberingState,
346- StringSectionBuilder &stringSection)
364+ StringSectionBuilder &stringSection,
365+ const DialectVersionMapT &dialectVersionMap)
347366 : bytecodeVersion(bytecodeVersion), emitter(emitter),
348- numberingState (numberingState), stringSection(stringSection) {}
367+ numberingState (numberingState), stringSection(stringSection),
368+ dialectVersionMap(dialectVersionMap) {}
349369
350370 // ===--------------------------------------------------------------------===//
351371 // IR
@@ -421,11 +441,20 @@ class DialectWriter : public DialectBytecodeWriter {
421441
422442 int64_t getBytecodeVersion () const override { return bytecodeVersion; }
423443
444+ FailureOr<const DialectVersion *>
445+ getDialectVersion (StringRef dialectName) const override {
446+ auto dialectEntry = dialectVersionMap.find (dialectName);
447+ if (dialectEntry == dialectVersionMap.end ())
448+ return failure ();
449+ return dialectEntry->getValue ().get ();
450+ }
451+
424452private:
425453 int64_t bytecodeVersion;
426454 EncodingEmitter &emitter;
427455 IRNumberingState &numberingState;
428456 StringSectionBuilder &stringSection;
457+ const DialectVersionMapT &dialectVersionMap;
429458};
430459
431460namespace {
@@ -458,7 +487,8 @@ class PropertiesSectionBuilder {
458487
459488 EncodingEmitter emitter;
460489 DialectWriter propertiesWriter (config.bytecodeVersion , emitter,
461- numberingState, stringSection);
490+ numberingState, stringSection,
491+ config.dialectVersionMap );
462492 auto iface = cast<BytecodeOpInterface>(op);
463493 iface.writeProperties (propertiesWriter);
464494 scratch.clear ();
@@ -751,7 +781,8 @@ void BytecodeWriter::writeDialectSection(EncodingEmitter &emitter) {
751781 if (dialect.interface ) {
752782 // The writer used when emitting using a custom bytecode encoding.
753783 DialectWriter versionWriter (config.bytecodeVersion , versionEmitter,
754- numberingState, stringSection);
784+ numberingState, stringSection,
785+ config.dialectVersionMap );
755786 dialect.interface ->writeVersion (versionWriter);
756787 }
757788
@@ -809,7 +840,8 @@ void BytecodeWriter::writeAttrTypeSection(EncodingEmitter &emitter) {
809840 }
810841
811842 DialectWriter dialectWriter (config.bytecodeVersion , attrTypeEmitter,
812- numberingState, stringSection);
843+ numberingState, stringSection,
844+ config.dialectVersionMap );
813845 if constexpr (std::is_same_v<std::decay_t <decltype (entryValue)>, Type>) {
814846 for (const auto &callback : config.typeWriterCallbacks ) {
815847 if (succeeded (callback->write (entryValue, dialectWriter)))
0 commit comments