xref: /llvm-project/clang/lib/AST/ByteCode/InterpBuiltinBitCast.h (revision 1f2d934525833c4aae5f0436fd99551c776fd246)
1ef2a104cSTimm Baeder //===------------------ InterpBuiltinBitCast.h ------------------*- C++ -*-===//
2ef2a104cSTimm Baeder //
3ef2a104cSTimm Baeder // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4ef2a104cSTimm Baeder // See https://llvm.org/LICENSE.txt for license information.
5ef2a104cSTimm Baeder // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6ef2a104cSTimm Baeder //
7ef2a104cSTimm Baeder //===----------------------------------------------------------------------===//
8ef2a104cSTimm Baeder 
98713914dSTimm Baeder #ifndef LLVM_CLANG_AST_INTERP_BUILTIN_BIT_CAST_H
108713914dSTimm Baeder #define LLVM_CLANG_AST_INTERP_BUILTIN_BIT_CAST_H
11ef2a104cSTimm Baeder 
121fbbf4c4STimm Baeder #include "BitcastBuffer.h"
13ef2a104cSTimm Baeder #include <cstddef>
14ef2a104cSTimm Baeder 
15ef2a104cSTimm Baeder namespace clang {
16ef2a104cSTimm Baeder namespace interp {
17ef2a104cSTimm Baeder class Pointer;
18ef2a104cSTimm Baeder class InterpState;
19ef2a104cSTimm Baeder class CodePtr;
208713914dSTimm Baeder class Context;
21ef2a104cSTimm Baeder 
2230cbd09fSTimm Baeder inline static void swapBytes(std::byte *M, size_t N) {
2330cbd09fSTimm Baeder   for (size_t I = 0; I != (N / 2); ++I)
2430cbd09fSTimm Baeder     std::swap(M[I], M[N - 1 - I]);
2530cbd09fSTimm Baeder }
2630cbd09fSTimm Baeder 
27ef2a104cSTimm Baeder bool DoBitCast(InterpState &S, CodePtr OpPC, const Pointer &Ptr,
281fbbf4c4STimm Baeder                std::byte *Buff, Bits BitWidth, Bits FullBitWidth,
291fbbf4c4STimm Baeder                bool &HasIndeterminateBits);
302588b8beSTimm Baeder bool DoBitCastPtr(InterpState &S, CodePtr OpPC, const Pointer &FromPtr,
312588b8beSTimm Baeder                   Pointer &ToPtr);
32abc27039STimm Baeder bool DoBitCastPtr(InterpState &S, CodePtr OpPC, const Pointer &FromPtr,
33abc27039STimm Baeder                   Pointer &ToPtr, size_t Size);
348713914dSTimm Baeder bool readPointerToBuffer(const Context &Ctx, const Pointer &FromPtr,
358713914dSTimm Baeder                          BitcastBuffer &Buffer, bool ReturnOnUninit);
36*1f2d9345STimm Baeder 
37*1f2d9345STimm Baeder bool DoMemcpy(InterpState &S, CodePtr OpPC, const Pointer &SrcPtr,
38*1f2d9345STimm Baeder               const Pointer &DestPtr, Bits Size);
39*1f2d9345STimm Baeder 
40ef2a104cSTimm Baeder } // namespace interp
41ef2a104cSTimm Baeder } // namespace clang
42ef2a104cSTimm Baeder 
43ef2a104cSTimm Baeder #endif
44