Update ODS variadic segments "magic" attributes to use native Properties
The operand_segment_sizes and result_segment_sizes Attributes are now inlined
in the operation as native propertie. We continue to support building an
Attribute on the fly for `getAttr("operand_segment_sizes")` and setting the
property from an attribute with `setAttr("operand_segment_sizes", attr)`.
A new bytecode version is introduced to support backward compatibility and
backdeployments.
Differential Revision: https://reviews.llvm.org/D155919
This commit is contained in:
@@ -796,9 +796,10 @@ class AttrTypeReader {
|
||||
|
||||
public:
|
||||
AttrTypeReader(StringSectionReader &stringReader,
|
||||
ResourceSectionReader &resourceReader, Location fileLoc)
|
||||
ResourceSectionReader &resourceReader, Location fileLoc,
|
||||
uint64_t &bytecodeVersion)
|
||||
: stringReader(stringReader), resourceReader(resourceReader),
|
||||
fileLoc(fileLoc) {}
|
||||
fileLoc(fileLoc), bytecodeVersion(bytecodeVersion) {}
|
||||
|
||||
/// Initialize the attribute and type information within the reader.
|
||||
LogicalResult initialize(MutableArrayRef<BytecodeDialect> dialects,
|
||||
@@ -883,23 +884,30 @@ private:
|
||||
|
||||
/// A location used for error emission.
|
||||
Location fileLoc;
|
||||
|
||||
/// Current bytecode version being used.
|
||||
uint64_t &bytecodeVersion;
|
||||
};
|
||||
|
||||
class DialectReader : public DialectBytecodeReader {
|
||||
public:
|
||||
DialectReader(AttrTypeReader &attrTypeReader,
|
||||
StringSectionReader &stringReader,
|
||||
ResourceSectionReader &resourceReader, EncodingReader &reader)
|
||||
ResourceSectionReader &resourceReader, EncodingReader &reader,
|
||||
uint64_t &bytecodeVersion)
|
||||
: attrTypeReader(attrTypeReader), stringReader(stringReader),
|
||||
resourceReader(resourceReader), reader(reader) {}
|
||||
resourceReader(resourceReader), reader(reader),
|
||||
bytecodeVersion(bytecodeVersion) {}
|
||||
|
||||
InFlightDiagnostic emitError(const Twine &msg) override {
|
||||
return reader.emitError(msg);
|
||||
}
|
||||
|
||||
uint64_t getBytecodeVersion() const override { return bytecodeVersion; }
|
||||
|
||||
DialectReader withEncodingReader(EncodingReader &encReader) {
|
||||
return DialectReader(attrTypeReader, stringReader, resourceReader,
|
||||
encReader);
|
||||
encReader, bytecodeVersion);
|
||||
}
|
||||
|
||||
Location getLoc() const { return reader.getLoc(); }
|
||||
@@ -1003,6 +1011,7 @@ private:
|
||||
StringSectionReader &stringReader;
|
||||
ResourceSectionReader &resourceReader;
|
||||
EncodingReader &reader;
|
||||
uint64_t &bytecodeVersion;
|
||||
};
|
||||
|
||||
/// Wraps the properties section and handles reading properties out of it.
|
||||
@@ -1207,7 +1216,8 @@ template <typename T>
|
||||
LogicalResult AttrTypeReader::parseCustomEntry(Entry<T> &entry,
|
||||
EncodingReader &reader,
|
||||
StringRef entryType) {
|
||||
DialectReader dialectReader(*this, stringReader, resourceReader, reader);
|
||||
DialectReader dialectReader(*this, stringReader, resourceReader, reader,
|
||||
bytecodeVersion);
|
||||
if (failed(entry.dialect->load(dialectReader, fileLoc.getContext())))
|
||||
return failure();
|
||||
// Ensure that the dialect implements the bytecode interface.
|
||||
@@ -1252,7 +1262,7 @@ public:
|
||||
llvm::MemoryBufferRef buffer,
|
||||
const std::shared_ptr<llvm::SourceMgr> &bufferOwnerRef)
|
||||
: config(config), fileLoc(fileLoc), lazyLoading(lazyLoading),
|
||||
attrTypeReader(stringReader, resourceReader, fileLoc),
|
||||
attrTypeReader(stringReader, resourceReader, fileLoc, version),
|
||||
// Use the builtin unrealized conversion cast operation to represent
|
||||
// forward references to values that aren't yet defined.
|
||||
forwardRefOpState(UnknownLoc::get(config.getContext()),
|
||||
@@ -1782,7 +1792,7 @@ BytecodeReader::Impl::parseOpName(EncodingReader &reader,
|
||||
if (!opName->opName) {
|
||||
// Load the dialect and its version.
|
||||
DialectReader dialectReader(attrTypeReader, stringReader, resourceReader,
|
||||
reader);
|
||||
reader, version);
|
||||
if (failed(opName->dialect->load(dialectReader, getContext())))
|
||||
return failure();
|
||||
// If the opName is empty, this is because we use to accept names such as
|
||||
@@ -1825,7 +1835,7 @@ LogicalResult BytecodeReader::Impl::parseResourceSection(
|
||||
|
||||
// Initialize the resource reader with the resource sections.
|
||||
DialectReader dialectReader(attrTypeReader, stringReader, resourceReader,
|
||||
reader);
|
||||
reader, version);
|
||||
return resourceReader.initialize(fileLoc, config, dialects, stringReader,
|
||||
*resourceData, *resourceOffsetData,
|
||||
dialectReader, bufferOwnerRef);
|
||||
@@ -2186,7 +2196,7 @@ BytecodeReader::Impl::parseOpWithoutRegions(EncodingReader &reader,
|
||||
// interface and control the serialization.
|
||||
if (wasRegistered) {
|
||||
DialectReader dialectReader(attrTypeReader, stringReader, resourceReader,
|
||||
reader);
|
||||
reader, version);
|
||||
if (failed(
|
||||
propertiesReader.read(fileLoc, dialectReader, &*opName, opState)))
|
||||
return failure();
|
||||
|
||||
Reference in New Issue
Block a user