[clang] 1e19f0f - [clang][bytecode] Implement IntegralAP bitcasting (#114471)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Nov 1 01:15:09 PDT 2024
Author: Timm Baeder
Date: 2024-11-01T09:15:05+01:00
New Revision: 1e19f0f9d92b5e9c43d53893e387341835d3d96b
URL: https://github.com/llvm/llvm-project/commit/1e19f0f9d92b5e9c43d53893e387341835d3d96b
DIFF: https://github.com/llvm/llvm-project/commit/1e19f0f9d92b5e9c43d53893e387341835d3d96b.diff
LOG: [clang][bytecode] Implement IntegralAP bitcasting (#114471)
Only for full-byte bitwidths for now.
Added:
Modified:
clang/lib/AST/ByteCode/IntegralAP.h
clang/test/AST/ByteCode/builtin-bit-cast.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/ByteCode/IntegralAP.h b/clang/lib/AST/ByteCode/IntegralAP.h
index 6a37d0a3ba4a51..8ee08dfb5cfe74 100644
--- a/clang/lib/AST/ByteCode/IntegralAP.h
+++ b/clang/lib/AST/ByteCode/IntegralAP.h
@@ -171,10 +171,14 @@ template <bool Signed> class IntegralAP final {
return IntegralAP<false>(Copy);
}
- void bitcastToMemory(std::byte *Dest) const { assert(false); }
+ void bitcastToMemory(std::byte *Dest) const {
+ llvm::StoreIntToMemory(V, (uint8_t *)Dest, bitWidth() / 8);
+ }
static IntegralAP bitcastFromMemory(const std::byte *Src, unsigned BitWidth) {
- return IntegralAP();
+ APInt V(BitWidth, static_cast<uint64_t>(0), Signed);
+ llvm::LoadIntFromMemory(V, (const uint8_t *)Src, BitWidth / 8);
+ return IntegralAP(V);
}
ComparisonCategoryResult compare(const IntegralAP &RHS) const {
diff --git a/clang/test/AST/ByteCode/builtin-bit-cast.cpp b/clang/test/AST/ByteCode/builtin-bit-cast.cpp
index 58cf486833412f..0e86da9133b33d 100644
--- a/clang/test/AST/ByteCode/builtin-bit-cast.cpp
+++ b/clang/test/AST/ByteCode/builtin-bit-cast.cpp
@@ -71,6 +71,11 @@ constexpr bool operator==(const struct bits<N, T, P>& lhs, const struct bits<N,
return lhs.bits == rhs.bits;
}
+#ifdef __SIZEOF_INT128__
+static_assert(check_round_trip<__int128_t>((__int128_t)34));
+static_assert(check_round_trip<__int128_t>((__int128_t)-34));
+#endif
+
namespace simple {
constexpr int A = __builtin_bit_cast(int, 10);
More information about the cfe-commits
mailing list