This makes the bytecode reader/writer work on big-endian platforms.
The only problem was related to encoding of multi-byte integers,
where both reader and writer code make implicit assumptions about
endianness of the host platform.
This fixes the current test failures on s390x, and in addition allows
to remove the UNSUPPORTED markers from all other bytecode-related
test cases - they now also all pass on s390x.
Also adding a GFAIL_SKIP to the MultiModuleWithResource unit test,
as this still fails due to an unrelated endian bug regarding
decoding of external resources.
Differential Revision: https://reviews.llvm.org/D153567
Reviewed By: mehdi_amini, jpienaar, rriddle
//
//===----------------------------------------------------------------------===//
-// TODO: Support for big-endian architectures.
-
#include "mlir/Bytecode/BytecodeReader.h"
#include "mlir/AsmParser/AsmParser.h"
#include "mlir/Bytecode/BytecodeImplementation.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringRef.h"
+#include "llvm/Support/Endian.h"
#include "llvm/Support/MemoryBufferRef.h"
#include "llvm/Support/SaveAndRestore.h"
#include "llvm/Support/SourceMgr.h"
// Handle the overwhelming uncommon case where the value required all 8
// bytes (i.e. a really really big number). In this case, the marker byte is
// all zeros: `00000000`.
- if (LLVM_UNLIKELY(result == 0))
- return parseBytes(sizeof(result), reinterpret_cast<uint8_t *>(&result));
+ if (LLVM_UNLIKELY(result == 0)) {
+ llvm::support::ulittle64_t resultLE;
+ if (failed(parseBytes(sizeof(resultLE),
+ reinterpret_cast<uint8_t *>(&resultLE))))
+ return failure();
+ result = resultLE;
+ return success();
+ }
return parseMultiByteVarInt(result);
}
"unexpected number of trailing zeros in varint encoding");
// Parse in the remaining bytes of the value.
- if (failed(parseBytes(numBytes, reinterpret_cast<uint8_t *>(&result) + 1)))
+ llvm::support::ulittle64_t resultLE(result);
+ 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
// encoded.
- result >>= (numBytes + 1);
+ result = resultLE >> (numBytes + 1);
return success();
}
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/Support/raw_ostream.h"
+#include "llvm/Support/Endian.h"
#include <cstddef>
#include <cstdint>
#include <cstring>
if (LLVM_LIKELY(it >>= 7) == 0) {
uint64_t encodedValue = (value << 1) | 0x1;
encodedValue <<= (numBytes - 1);
- emitBytes({reinterpret_cast<uint8_t *>(&encodedValue), numBytes});
+ llvm::support::ulittle64_t encodedValueLE(encodedValue);
+ emitBytes({reinterpret_cast<uint8_t *>(&encodedValueLE), numBytes});
return;
}
}
// If the value is too large to encode in a single byte, emit a special all
// zero marker byte and splat the value directly.
emitByte(0);
- emitBytes({reinterpret_cast<uint8_t *>(&value), sizeof(value)});
+ llvm::support::ulittle64_t valueLE(value);
+ emitBytes({reinterpret_cast<uint8_t *>(&valueLE), sizeof(valueLE)});
}
//===----------------------------------------------------------------------===//
// RUN: mlir-opt -allow-unregistered-dialect -emit-bytecode %s | mlir-opt -allow-unregistered-dialect | FileCheck %s
-// Bytecode currently does not support big-endian platforms
-// UNSUPPORTED: target=s390x-{{.*}}
-
// CHECK-LABEL: "bytecode.test1"
// CHECK-NEXT: "unregistered.op"() {test_attr = #test.dynamic_singleton} : () -> ()
// CHECK-NEXT: "bytecode.empty"() : () -> ()
// This file contains various failure test cases related to the structure of
// the dialect section.
-// Bytecode currently does not support big-endian platforms
-// UNSUPPORTED: target=s390x-{{.*}}
-
//===--------------------------------------------------------------------===//
// Dialect Name
//===--------------------------------------------------------------------===//
// This file contains various failure test cases related to the structure of
// the IR section.
-// Bytecode currently does not support big-endian platforms
-// UNSUPPORTED: target=s390x-{{.*}}
-
//===--------------------------------------------------------------------===//
// Operations
//===--------------------------------------------------------------------===//
// This file contains various failure test cases related to the structure of
// the string section.
-// Bytecode currently does not support big-endian platforms
-// UNSUPPORTED: target=s390x-{{.*}}
-
//===--------------------------------------------------------------------===//
// Count
//===--------------------------------------------------------------------===//
// This file contains various failure test cases related to the structure of
// a bytecode file.
-// Bytecode currently does not support big-endian platforms
-// UNSUPPORTED: target=s390x-{{.*}}
-
//===--------------------------------------------------------------------===//
// Version
//===--------------------------------------------------------------------===//
// This file contains various failure test cases related to the structure of
// the attribute/type offset section.
-// Bytecode currently does not support big-endian platforms
-// UNSUPPORTED: target=s390x-{{.*}}
-
//===--------------------------------------------------------------------===//
// Offset
//===--------------------------------------------------------------------===//
// This file contains various failure test cases related to the structure of
// the attribute/type offset section.
-// Bytecode currently does not support big-endian platforms
-// UNSUPPORTED: target=s390x-{{.*}}
-
//===--------------------------------------------------------------------===//
// Index
//===--------------------------------------------------------------------===//
// RUN: mlir-opt -emit-bytecode %s | mlir-opt | FileCheck %s
-// Bytecode currently does not support big-endian platforms
-// UNSUPPORTED: target=s390x-{{.*}}
-
// CHECK-LABEL: @TestDialectResources
module @TestDialectResources attributes {
// CHECK: bytecode.test = dense_resource<decl_resource> : tensor<2xui32>
// This file contains a test case representative of a dialect parsing an
// attribute with versioned custom encoding.
-// Bytecode currently does not support big-endian platforms
-// UNSUPPORTED: target=s390x-{{.*}}
-
//===--------------------------------------------------------------------===//
// Test attribute upgrade
//===--------------------------------------------------------------------===//
// This file contains test cases related to roundtripping.
-// Bytecode currently does not support big-endian platforms
-// UNSUPPORTED: target=s390x-{{.*}}
-
//===--------------------------------------------------------------------===//
// Test roundtrip
//===--------------------------------------------------------------------===//
// This file contains test cases related to the dialect post-parsing upgrade
// mechanism.
-// Bytecode currently does not support big-endian platforms
-// UNSUPPORTED: target=s390x-{{.*}}
-
//===--------------------------------------------------------------------===//
// Test generic
//===--------------------------------------------------------------------===//
// RUN: mlir-opt -emit-bytecode -allow-unregistered-dialect %s | mlir-opt -allow-unregistered-dialect -mlir-print-local-scope | FileCheck %s
-// Bytecode currently does not support big-endian platforms
-// UNSUPPORTED: target=s390x-{{.*}}
-
//===----------------------------------------------------------------------===//
// ArrayAttr
//===----------------------------------------------------------------------===//
// RUN: mlir-opt -emit-bytecode %s | mlir-opt | FileCheck %s
-// Bytecode currently does not support big-endian platforms
-// UNSUPPORTED: target=s390x-{{.*}}
-
//===----------------------------------------------------------------------===//
// ComplexType
//===----------------------------------------------------------------------===//
// RUN: mlir-opt -emit-bytecode %s | mlir-opt | FileCheck %s
-// Bytecode currently does not support big-endian platforms
-// UNSUPPORTED: target=s390x-{{.*}}
-
//===----------------------------------------------------------------------===//
// AnyQuantized
//===----------------------------------------------------------------------===//
#include "mlir/Parser/Parser.h"
#include "llvm/ADT/StringRef.h"
+#include "llvm/Support/Endian.h"
#include "gmock/gmock.h"
#include "gtest/gtest.h"
parseSourceString<Operation *>(ostream.str(), parseConfig);
ASSERT_TRUE(roundTripModule);
+ // FIXME: Parsing external resources does not work on big-endian
+ // platforms currently.
+ if (llvm::support::endian::system_endianness() ==
+ llvm::support::endianness::big)
+ GTEST_SKIP();
+
// Try to see if we have a valid resource in the parsed module.
auto checkResourceAttribute = [&](Operation *op) {
Attribute attr = roundTripModule->getAttr("bytecode.test");