aboutsummaryrefslogtreecommitdiff
path: root/mlir/lib/Bytecode/Reader/BytecodeReader.cpp
diff options
context:
space:
mode:
authorUlrich Weigand <ulrich.weigand@de.ibm.com>2023-06-23 09:17:53 +0200
committerUlrich Weigand <ulrich.weigand@de.ibm.com>2023-06-23 09:22:55 +0200
commitbb0bbed610d86ba155f9c066c23038f7f34e2dbb (patch)
tree76ace19cf3abeab8a0da72e9b4d6f81d599d59a5 /mlir/lib/Bytecode/Reader/BytecodeReader.cpp
parent7298bcf7f06145e2d4dfdb177b94dc42fc95dc55 (diff)
downloadllvm-bb0bbed610d86ba155f9c066c23038f7f34e2dbb.zip
llvm-bb0bbed610d86ba155f9c066c23038f7f34e2dbb.tar.gz
llvm-bb0bbed610d86ba155f9c066c23038f7f34e2dbb.tar.bz2
Fix bytecode reader/writer on big-endian platforms
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
Diffstat (limited to 'mlir/lib/Bytecode/Reader/BytecodeReader.cpp')
-rw-r--r--mlir/lib/Bytecode/Reader/BytecodeReader.cpp18
1 files changed, 12 insertions, 6 deletions
diff --git a/mlir/lib/Bytecode/Reader/BytecodeReader.cpp b/mlir/lib/Bytecode/Reader/BytecodeReader.cpp
index 177372c..5aa24ba 100644
--- a/mlir/lib/Bytecode/Reader/BytecodeReader.cpp
+++ b/mlir/lib/Bytecode/Reader/BytecodeReader.cpp
@@ -6,8 +6,6 @@
//
//===----------------------------------------------------------------------===//
-// TODO: Support for big-endian architectures.
-
#include "mlir/Bytecode/BytecodeReader.h"
#include "mlir/AsmParser/AsmParser.h"
#include "mlir/Bytecode/BytecodeImplementation.h"
@@ -27,6 +25,7 @@
#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"
@@ -203,8 +202,14 @@ public:
// 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);
}
@@ -305,12 +310,13 @@ private:
"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();
}