Author: Timm Baeder Date: 2024-12-13T12:19:27+01:00 New Revision: 30cbd09f4b8f7e94663631f0240d11bb754ea25b
URL: https://github.com/llvm/llvm-project/commit/30cbd09f4b8f7e94663631f0240d11bb754ea25b DIFF: https://github.com/llvm/llvm-project/commit/30cbd09f4b8f7e94663631f0240d11bb754ea25b.diff LOG: [clang][bytecode] Fix memcmp/bcmp failures on big-endian hosts (#119851) See the discussion in https://github.com/llvm/llvm-project/pull/119678#issuecomment-2539680746 and https://github.com/llvm/llvm-project/pull/119544#issuecomment-2539678561 Added: Modified: clang/lib/AST/ByteCode/InterpBuiltin.cpp clang/lib/AST/ByteCode/InterpBuiltinBitCast.cpp clang/lib/AST/ByteCode/InterpBuiltinBitCast.h Removed: ################################################################################ diff --git a/clang/lib/AST/ByteCode/InterpBuiltin.cpp b/clang/lib/AST/ByteCode/InterpBuiltin.cpp index 21baedf832eeac..c1c43672176add 100644 --- a/clang/lib/AST/ByteCode/InterpBuiltin.cpp +++ b/clang/lib/AST/ByteCode/InterpBuiltin.cpp @@ -1943,10 +1943,18 @@ static bool interp__builtin_memcmp(InterpState &S, CodePtr OpPC, BitcastBuffer BufferA( Bits(S.getASTContext().getTypeSize(PtrA.getFieldDesc()->getType()))); readPointerToBuffer(S.getContext(), PtrA, BufferA, false); + // FIXME: The swapping here is UNDOING something we do when reading the + // data into the buffer. + if (S.getASTContext().getTargetInfo().isBigEndian()) + swapBytes(BufferA.Data.get(), BufferA.byteSize().getQuantity()); BitcastBuffer BufferB( Bits(S.getASTContext().getTypeSize(PtrB.getFieldDesc()->getType()))); readPointerToBuffer(S.getContext(), PtrB, BufferB, false); + // FIXME: The swapping here is UNDOING something we do when reading the + // data into the buffer. + if (S.getASTContext().getTargetInfo().isBigEndian()) + swapBytes(BufferB.Data.get(), BufferB.byteSize().getQuantity()); size_t MinBufferSize = std::min(BufferA.byteSize().getQuantity(), BufferB.byteSize().getQuantity()); diff --git a/clang/lib/AST/ByteCode/InterpBuiltinBitCast.cpp b/clang/lib/AST/ByteCode/InterpBuiltinBitCast.cpp index c87993b8739a77..07f76943708216 100644 --- a/clang/lib/AST/ByteCode/InterpBuiltinBitCast.cpp +++ b/clang/lib/AST/ByteCode/InterpBuiltinBitCast.cpp @@ -73,11 +73,6 @@ using DataFunc = } \ } while (0) -static void swapBytes(std::byte *M, size_t N) { - for (size_t I = 0; I != (N / 2); ++I) - std::swap(M[I], M[N - 1 - I]); -} - /// We use this to recursively iterate over all fields and elements of a pointer /// and extract relevant data for a bitcast. static bool enumerateData(const Pointer &P, const Context &Ctx, Bits Offset, diff --git a/clang/lib/AST/ByteCode/InterpBuiltinBitCast.h b/clang/lib/AST/ByteCode/InterpBuiltinBitCast.h index 08c207c7415dfa..b45613b2f21e20 100644 --- a/clang/lib/AST/ByteCode/InterpBuiltinBitCast.h +++ b/clang/lib/AST/ByteCode/InterpBuiltinBitCast.h @@ -19,6 +19,11 @@ class InterpState; class CodePtr; class Context; +inline static void swapBytes(std::byte *M, size_t N) { + for (size_t I = 0; I != (N / 2); ++I) + std::swap(M[I], M[N - 1 - I]); +} + bool DoBitCast(InterpState &S, CodePtr OpPC, const Pointer &Ptr, std::byte *Buff, Bits BitWidth, Bits FullBitWidth, bool &HasIndeterminateBits); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits