[mlir] Fix bytecode reading of resource sections

This partially reverts #66380. The assertion that the underlying buffer
of an EncodingReader is aligned to any required alignments for resource
sections. Resources know their own alignment and pad their buffers
accordingly, but the bytecode reader doesn't know that ahead of time.
Consequently, it cannot give the resource EncodingReader a base buffer
aligned to the maximum required alignment.

A simple example from the test fails without this:

```mlir
module @TestDialectResources attributes {
  bytecode.test = dense_resource<resource> : tensor<4xi32>
} {}
{-#
  dialect_resources: {
    builtin: {
      resource: "0x2000000001000000020000000300000004000000",
      resource_2: "0x2000000001000000020000000300000004000000"
    }
  }
```
This commit is contained in:
Mogball
2023-09-29 18:31:12 -07:00
parent 204883623e
commit 2b5134f1b7
2 changed files with 4 additions and 45 deletions

View File

@@ -111,13 +111,6 @@ public:
return ((uintptr_t)ptr & (alignment - 1)) != 0;
};
// Ensure the data buffer was sufficiently aligned in the first place.
if (LLVM_UNLIKELY(isUnaligned(buffer.begin()))) {
return emitError("expected bytecode buffer to be aligned to ", alignment,
", but got pointer: '0x" +
llvm::utohexstr((uintptr_t)buffer.begin()) + "'");
}
// Shift the reader position to the next alignment boundary.
while (isUnaligned(dataIt)) {
uint8_t padding;
@@ -319,7 +312,8 @@ private:
// Parse in the remaining bytes of the value.
llvm::support::ulittle64_t resultLE(result);
if (failed(parseBytes(numBytes, reinterpret_cast<uint8_t *>(&resultLE) + 1)))
if (failed(
parseBytes(numBytes, reinterpret_cast<uint8_t *>(&resultLE) + 1)))
return failure();
// Shift out the low-order bits that were used to mark how the value was