xref: /freebsd/contrib/llvm-project/clang/lib/CodeGen/CGBuiltin.h (revision 700637cbb5e582861067a11aaca4d053546871d2)
1 //===------ CGBuiltin.h - Emit LLVM Code for builtins ---------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef LLVM_CLANG_LIB_CODEGEN_CGBUILTIN_H
10 #define LLVM_CLANG_LIB_CODEGEN_CGBUILTIN_H
11 
12 #include "CodeGenFunction.h"
13 
14 // Many of MSVC builtins are on x64, ARM and AArch64; to avoid repeating code,
15 // we handle them here.
16 enum class clang::CodeGen::CodeGenFunction::MSVCIntrin {
17   _BitScanForward,
18   _BitScanReverse,
19   _InterlockedAnd,
20   _InterlockedCompareExchange,
21   _InterlockedDecrement,
22   _InterlockedExchange,
23   _InterlockedExchangeAdd,
24   _InterlockedExchangeSub,
25   _InterlockedIncrement,
26   _InterlockedOr,
27   _InterlockedXor,
28   _InterlockedExchangeAdd_acq,
29   _InterlockedExchangeAdd_rel,
30   _InterlockedExchangeAdd_nf,
31   _InterlockedExchange_acq,
32   _InterlockedExchange_rel,
33   _InterlockedExchange_nf,
34   _InterlockedCompareExchange_acq,
35   _InterlockedCompareExchange_rel,
36   _InterlockedCompareExchange_nf,
37   _InterlockedCompareExchange128,
38   _InterlockedCompareExchange128_acq,
39   _InterlockedCompareExchange128_rel,
40   _InterlockedCompareExchange128_nf,
41   _InterlockedOr_acq,
42   _InterlockedOr_rel,
43   _InterlockedOr_nf,
44   _InterlockedXor_acq,
45   _InterlockedXor_rel,
46   _InterlockedXor_nf,
47   _InterlockedAnd_acq,
48   _InterlockedAnd_rel,
49   _InterlockedAnd_nf,
50   _InterlockedIncrement_acq,
51   _InterlockedIncrement_rel,
52   _InterlockedIncrement_nf,
53   _InterlockedDecrement_acq,
54   _InterlockedDecrement_rel,
55   _InterlockedDecrement_nf,
56   __fastfail,
57 };
58 
59 // Emit a simple intrinsic that has N scalar arguments and a return type
60 // matching the argument type. It is assumed that only the first argument is
61 // overloaded.
62 template <unsigned N>
63 llvm::Value *emitBuiltinWithOneOverloadedType(clang::CodeGen::CodeGenFunction &CGF,
64                                               const clang::CallExpr *E,
65                                               unsigned IntrinsicID,
66                                               llvm::StringRef Name = "") {
67   static_assert(N, "expect non-empty argument");
68   clang::SmallVector<llvm::Value *, N> Args;
69   for (unsigned I = 0; I < N; ++I)
70     Args.push_back(CGF.EmitScalarExpr(E->getArg(I)));
71   llvm::Function *F = CGF.CGM.getIntrinsic(IntrinsicID, Args[0]->getType());
72   return CGF.Builder.CreateCall(F, Args, Name);
73 }
74 
75 llvm::Value *emitUnaryMaybeConstrainedFPBuiltin(clang::CodeGen::CodeGenFunction &CGF,
76                                                 const clang::CallExpr *E,
77                                                 unsigned IntrinsicID,
78                                                 unsigned ConstrainedIntrinsicID);
79 
80 llvm::Value *EmitToInt(clang::CodeGen::CodeGenFunction &CGF, llvm::Value *V,
81                        clang::QualType T, llvm::IntegerType *IntType);
82 
83 llvm::Value *EmitFromInt(clang::CodeGen::CodeGenFunction &CGF, llvm::Value *V,
84                          clang::QualType T, llvm::Type *ResultType);
85 
86 clang::CodeGen::Address CheckAtomicAlignment(clang::CodeGen::CodeGenFunction &CGF,
87                                              const clang::CallExpr *E);
88 
89 llvm::Value *MakeBinaryAtomicValue(clang::CodeGen::CodeGenFunction &CGF,
90                                    llvm::AtomicRMWInst::BinOp Kind,
91                                    const clang::CallExpr *E,
92                                    llvm::AtomicOrdering Ordering =
93                                       llvm::AtomicOrdering::SequentiallyConsistent);
94 
95 llvm::Value *EmitOverflowIntrinsic(clang::CodeGen::CodeGenFunction &CGF,
96                                    const llvm::Intrinsic::ID IntrinsicID,
97                                    llvm::Value *X,
98                                    llvm::Value *Y,
99                                    llvm::Value *&Carry);
100 
101 llvm::Value *MakeAtomicCmpXchgValue(clang::CodeGen::CodeGenFunction &CGF,
102                                     const clang::CallExpr *E,
103                                     bool ReturnBool);
104 
105 #endif
106