clang 22.0.0git
CGBuiltin.h
Go to the documentation of this file.
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.
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.
62template <unsigned N>
64 const clang::CallExpr *E,
65 unsigned IntrinsicID,
66 llvm::StringRef Name = "") {
67 static_assert(N, "expect non-empty argument");
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
76 const clang::CallExpr *E,
77 unsigned IntrinsicID,
78 unsigned ConstrainedIntrinsicID);
79
80llvm::Value *EmitToInt(clang::CodeGen::CodeGenFunction &CGF, llvm::Value *V,
81 clang::QualType T, llvm::IntegerType *IntType);
82
83llvm::Value *EmitFromInt(clang::CodeGen::CodeGenFunction &CGF, llvm::Value *V,
84 clang::QualType T, llvm::Type *ResultType);
85
87 const clang::CallExpr *E);
88
90 llvm::AtomicRMWInst::BinOp Kind,
91 const clang::CallExpr *E,
92 llvm::AtomicOrdering Ordering =
93 llvm::AtomicOrdering::SequentiallyConsistent);
94
96 const llvm::Intrinsic::ID IntrinsicID,
97 llvm::Value *X,
98 llvm::Value *Y,
99 llvm::Value *&Carry);
100
102 const clang::CallExpr *E,
103 bool ReturnBool);
104
105#endif
#define V(N, I)
Definition: ASTContext.h:3597
llvm::Value * emitBuiltinWithOneOverloadedType(clang::CodeGen::CodeGenFunction &CGF, const clang::CallExpr *E, unsigned IntrinsicID, llvm::StringRef Name="")
Definition: CGBuiltin.h:63
clang::CodeGen::Address CheckAtomicAlignment(clang::CodeGen::CodeGenFunction &CGF, const clang::CallExpr *E)
Definition: CGBuiltin.cpp:274
llvm::Value * EmitToInt(clang::CodeGen::CodeGenFunction &CGF, llvm::Value *V, clang::QualType T, llvm::IntegerType *IntType)
Emit the conversions required to turn the given value into an integer of the given size.
Definition: CGBuiltin.cpp:252
llvm::Value * MakeBinaryAtomicValue(clang::CodeGen::CodeGenFunction &CGF, llvm::AtomicRMWInst::BinOp Kind, const clang::CallExpr *E, llvm::AtomicOrdering Ordering=llvm::AtomicOrdering::SequentiallyConsistent)
llvm::Value * EmitOverflowIntrinsic(clang::CodeGen::CodeGenFunction &CGF, const llvm::Intrinsic::ID IntrinsicID, llvm::Value *X, llvm::Value *Y, llvm::Value *&Carry)
llvm::Value * EmitFromInt(clang::CodeGen::CodeGenFunction &CGF, llvm::Value *V, clang::QualType T, llvm::Type *ResultType)
Definition: CGBuiltin.cpp:263
llvm::Value * emitUnaryMaybeConstrainedFPBuiltin(clang::CodeGen::CodeGenFunction &CGF, const clang::CallExpr *E, unsigned IntrinsicID, unsigned ConstrainedIntrinsicID)
Definition: CGBuiltin.cpp:588
llvm::Value * MakeAtomicCmpXchgValue(clang::CodeGen::CodeGenFunction &CGF, const clang::CallExpr *E, bool ReturnBool)
Utility to insert an atomic cmpxchg instruction.
Definition: CGBuiltin.cpp:390
enum clang::sema::@1840::IndirectLocalPathEntry::EntryKind Kind
Expr * E
#define X(type, name)
Definition: Value.h:145
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Definition: Expr.h:2879
Like RawAddress, an abstract representation of an aligned address, but the pointer contained in this ...
Definition: Address.h:128
CodeGenFunction - This class organizes the per-function state that is used while generating LLVM code...
llvm::Value * EmitScalarExpr(const Expr *E, bool IgnoreResultAssign=false)
EmitScalarExpr - Emit the computation of the specified expression of LLVM scalar type,...
llvm::Function * getIntrinsic(unsigned IID, ArrayRef< llvm::Type * > Tys={})
A (possibly-)qualified type.
Definition: TypeBase.h:937