diff --git a/llvm/include/llvm/Support/Endian.h b/llvm/include/llvm/Support/Endian.h index 574f9508420a0..02a3194e09784 100644 --- a/llvm/include/llvm/Support/Endian.h +++ b/llvm/include/llvm/Support/Endian.h @@ -223,10 +223,11 @@ struct packed_endian_specific_integral { explicit packed_endian_specific_integral(value_type val) { *this = val; } - operator value_type() const { + value_type value() const { return endian::read( (const void*)Value.buffer); } + operator value_type() const { return value(); } void operator=(value_type newValue) { endian::write( diff --git a/llvm/lib/ExecutionEngine/JITLink/aarch32.cpp b/llvm/lib/ExecutionEngine/JITLink/aarch32.cpp index 1e325d76bd515..12d31f809f882 100644 --- a/llvm/lib/ExecutionEngine/JITLink/aarch32.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/aarch32.cpp @@ -239,15 +239,14 @@ Error makeUnexpectedOpcodeError(const LinkGraph &G, const ThumbRelocation &R, Edge::Kind Kind) { return make_error( formatv("Invalid opcode [ {0:x4}, {1:x4} ] for relocation: {2}", - static_cast(R.Hi), static_cast(R.Lo), - G.getEdgeKindName(Kind))); + R.Hi.value(), R.Lo.value(), G.getEdgeKindName(Kind))); } Error makeUnexpectedOpcodeError(const LinkGraph &G, const ArmRelocation &R, Edge::Kind Kind) { return make_error( - formatv("Invalid opcode {0:x8} for relocation: {1}", - static_cast(R.Wd), G.getEdgeKindName(Kind))); + formatv("Invalid opcode {0:x8} for relocation: {1}", R.Wd.value(), + G.getEdgeKindName(Kind))); } template constexpr bool isArm() { diff --git a/llvm/unittests/Support/EndianTest.cpp b/llvm/unittests/Support/EndianTest.cpp index bba1a56168f70..59281c0ed5444 100644 --- a/llvm/unittests/Support/EndianTest.cpp +++ b/llvm/unittests/Support/EndianTest.cpp @@ -237,6 +237,7 @@ TEST(Endian, PackedEndianSpecificIntegral) { reinterpret_cast(little + 1); EXPECT_EQ(*big_val, *little_val); + EXPECT_EQ(big_val->value(), little_val->value()); } TEST(Endian, PacketEndianSpecificIntegralAsEnum) {