9#ifndef LLVM_CLANG_LIB_CODEGEN_CGBUILDER_H
10#define LLVM_CLANG_LIB_CODEGEN_CGBUILDER_H
14#include "llvm/IR/DataLayout.h"
15#include "llvm/IR/IRBuilder.h"
16#include "llvm/IR/Type.h"
32 void InsertHelper(llvm::Instruction *I,
const llvm::Twine &Name,
34 llvm::BasicBlock::iterator InsertPt)
const override;
42typedef llvm::IRBuilder<llvm::ConstantFolder, CGBuilderInserterTy>
54 const llvm::ConstantFolder &F,
66 return llvm::ConstantInt::get(TypeCache.
SizeTy, N);
82 const llvm::Twine &Name =
"") {
88 using CGBuilderBaseTy::CreateAlignedLoad;
91 const llvm::Twine &Name =
"") {
98 bool IsVolatile =
false) {
103 using CGBuilderBaseTy::CreateAlignedStore;
106 bool IsVolatile =
false) {
114 bool IsVolatile =
false) {
115 return CGBuilderBaseTy::CreateStore(Val, Addr, IsVolatile);
120 const llvm::Twine &Name =
"") {
129 llvm::AtomicCmpXchgInst *
131 llvm::AtomicOrdering SuccessOrdering,
132 llvm::AtomicOrdering FailureOrdering,
133 llvm::SyncScope::ID SSID = llvm::SyncScope::System) {
134 return CGBuilderBaseTy::CreateAtomicCmpXchg(
136 SuccessOrdering, FailureOrdering, SSID);
139 llvm::AtomicRMWInst *
141 llvm::AtomicOrdering Ordering,
142 llvm::SyncScope::ID SSID = llvm::SyncScope::System) {
143 return CGBuilderBaseTy::CreateAtomicRMW(Op, Addr.
getPointer(), Val,
148 using CGBuilderBaseTy::CreateAddrSpaceCast;
150 const llvm::Twine &Name =
"") {
155 using CGBuilderBaseTy::CreatePointerBitCastOrAddrSpaceCast;
157 llvm::Type *ElementTy,
158 const llvm::Twine &Name =
"") {
171 using CGBuilderBaseTy::CreateStructGEP;
173 const llvm::Twine &Name =
"") {
174 llvm::StructType *ElTy = cast<llvm::StructType>(Addr.
getElementType());
175 const llvm::DataLayout &DL = BB->getParent()->getParent()->getDataLayout();
176 const llvm::StructLayout *Layout = DL.getStructLayout(ElTy);
194 const llvm::Twine &Name =
"") {
195 llvm::ArrayType *ElTy = cast<llvm::ArrayType>(Addr.
getElementType());
196 const llvm::DataLayout &DL = BB->getParent()->getParent()->getDataLayout();
202 {getSize(CharUnits::Zero()), getSize(Index)}, Name),
203 ElTy->getElementType(),
214 const llvm::Twine &Name =
"") {
216 const llvm::DataLayout &DL = BB->getParent()->getParent()->getDataLayout();
231 const llvm::Twine &Name =
"") {
232 const llvm::DataLayout &DL = BB->getParent()->getParent()->getDataLayout();
245 using CGBuilderBaseTy::CreateGEP;
247 const llvm::Twine &Name =
"") {
248 const llvm::DataLayout &DL = BB->getParent()->getParent()->getDataLayout();
260 const llvm::Twine &Name =
"") {
269 const llvm::Twine &Name =
"") {
278 using CGBuilderBaseTy::CreateConstInBoundsGEP2_32;
280 const llvm::Twine &Name =
"") {
281 const llvm::DataLayout &DL = BB->getParent()->getParent()->getDataLayout();
286 DL.getIndexSizeInBits(Addr.
getType()->getPointerAddressSpace()), 0,
288 if (!GEP->accumulateConstantOffset(DL, Offset))
289 llvm_unreachable(
"offset of GEP with constants is always computable");
290 return Address(GEP, GEP->getResultElementType(),
296 using CGBuilderBaseTy::CreateMemCpy;
298 bool IsVolatile =
false) {
304 bool IsVolatile =
false) {
310 using CGBuilderBaseTy::CreateMemCpyInline;
317 using CGBuilderBaseTy::CreateMemMove;
319 bool IsVolatile =
false) {
325 using CGBuilderBaseTy::CreateMemSet;
327 llvm::Value *Size,
bool IsVolatile =
false) {
332 using CGBuilderBaseTy::CreateMemSetInline;
340 using CGBuilderBaseTy::CreatePreserveStructAccessIndex;
343 llvm::MDNode *DbgInfo) {
344 llvm::StructType *ElTy = cast<llvm::StructType>(Addr.
getElementType());
345 const llvm::DataLayout &DL = BB->getParent()->getParent()->getDataLayout();
346 const llvm::StructLayout *Layout = DL.getStructLayout(ElTy);
350 Index, FieldIndex, DbgInfo),
355 using CGBuilderBaseTy::CreateLaunderInvariantGroup;
CharUnits - This is an opaque type for sizes expressed in character units.
CharUnits alignmentAtOffset(CharUnits offset) const
Given that this is a non-zero alignment value, what is the alignment at the given offset?
llvm::Align getAsAlign() const
getAsAlign - Returns Quantity as a valid llvm::Align, Beware llvm::Align assumes power of two 8-bit b...
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
static CharUnits One()
One - Construct a CharUnits quantity of one.
CharUnits alignmentOfArrayElement(CharUnits elementSize) const
Given that this is the alignment of the first element of an array, return the minimum alignment of an...
static CharUnits fromQuantity(QuantityType Quantity)
fromQuantity - Construct a CharUnits quantity from a raw integer type.
CharUnits getAlignment() const
Return the alignment of this pointer.
llvm::Type * getElementType() const
Return the type of the values stored in this address.
Address withPointer(llvm::Value *NewPointer, KnownNonNull_t IsKnownNonNull) const
Return address with different pointer, but same element type and alignment.
KnownNonNull_t isKnownNonNull() const
Whether the pointer is known not to be null.
llvm::Value * getPointer() const
llvm::PointerType * getType() const
Return the type of the pointer value.
This is an IRBuilder insertion helper that forwards to CodeGenFunction::InsertHelper,...
CGBuilderInserter()=default
void InsertHelper(llvm::Instruction *I, const llvm::Twine &Name, llvm::BasicBlock *BB, llvm::BasicBlock::iterator InsertPt) const override
This forwards to CodeGenFunction::InsertHelper.
CGBuilderInserter(CodeGenFunction *CGF)
llvm::LoadInst * CreateLoad(Address Addr, bool IsVolatile, const llvm::Twine &Name="")
llvm::StoreInst * CreateFlagStore(bool Value, llvm::Value *Addr)
Emit a store to an i1 flag variable.
llvm::StoreInst * CreateStore(llvm::Value *Val, Address Addr, bool IsVolatile=false)
Address CreateConstInBoundsByteGEP(Address Addr, CharUnits Offset, const llvm::Twine &Name="")
Given a pointer to i8, adjust it by a given constant offset.
llvm::CallInst * CreateMemCpy(Address Dest, Address Src, uint64_t Size, bool IsVolatile=false)
Address CreateConstInBoundsGEP2_32(Address Addr, unsigned Idx0, unsigned Idx1, const llvm::Twine &Name="")
CGBuilderTy(const CodeGenTypeCache &TypeCache, llvm::LLVMContext &C, const llvm::ConstantFolder &F, const CGBuilderInserterTy &Inserter)
llvm::StoreInst * CreateAlignedStore(llvm::Value *Val, llvm::Value *Addr, CharUnits Align, bool IsVolatile=false)
llvm::CallInst * CreateMemMove(Address Dest, Address Src, llvm::Value *Size, bool IsVolatile=false)
Address CreatePointerBitCastOrAddrSpaceCast(Address Addr, llvm::Type *Ty, llvm::Type *ElementTy, const llvm::Twine &Name="")
llvm::CallInst * CreateMemCpyInline(Address Dest, Address Src, uint64_t Size)
llvm::AtomicRMWInst * CreateAtomicRMW(llvm::AtomicRMWInst::BinOp Op, Address Addr, llvm::Value *Val, llvm::AtomicOrdering Ordering, llvm::SyncScope::ID SSID=llvm::SyncScope::System)
Address CreateConstArrayGEP(Address Addr, uint64_t Index, const llvm::Twine &Name="")
Given addr = [n x T]* ... produce name = getelementptr inbounds addr, i64 0, i64 index where i64 is a...
llvm::CallInst * CreateMemSetInline(Address Dest, llvm::Value *Value, uint64_t Size)
llvm::StoreInst * CreateDefaultAlignedStore(llvm::Value *Val, llvm::Value *Addr, bool IsVolatile=false)
llvm::CallInst * CreateMemSet(Address Dest, llvm::Value *Value, llvm::Value *Size, bool IsVolatile=false)
Address CreateStructGEP(Address Addr, unsigned Index, const llvm::Twine &Name="")
CGBuilderTy(const CodeGenTypeCache &TypeCache, llvm::LLVMContext &C)
CGBuilderTy(const CodeGenTypeCache &TypeCache, llvm::Instruction *I)
llvm::AtomicCmpXchgInst * CreateAtomicCmpXchg(Address Addr, llvm::Value *Cmp, llvm::Value *New, llvm::AtomicOrdering SuccessOrdering, llvm::AtomicOrdering FailureOrdering, llvm::SyncScope::ID SSID=llvm::SyncScope::System)
llvm::LoadInst * CreateLoad(Address Addr, const llvm::Twine &Name="")
Address CreateConstByteGEP(Address Addr, CharUnits Offset, const llvm::Twine &Name="")
Address CreatePreserveStructAccessIndex(Address Addr, unsigned Index, unsigned FieldIndex, llvm::MDNode *DbgInfo)
llvm::LoadInst * CreateFlagLoad(llvm::Value *Addr, const llvm::Twine &Name="")
Emit a load from an i1 flag variable.
Address CreateLaunderInvariantGroup(Address Addr)
llvm::CallInst * CreateMemCpy(Address Dest, Address Src, llvm::Value *Size, bool IsVolatile=false)
llvm::LoadInst * CreateAlignedLoad(llvm::Type *Ty, llvm::Value *Addr, CharUnits Align, const llvm::Twine &Name="")
CGBuilderTy(const CodeGenTypeCache &TypeCache, llvm::BasicBlock *BB)
Address CreateConstGEP(Address Addr, uint64_t Index, const llvm::Twine &Name="")
Given addr = T* ... produce name = getelementptr inbounds addr, i64 index where i64 is actually the t...
llvm::ConstantInt * getSize(CharUnits N)
llvm::LoadInst * CreateLoad(Address Addr, const char *Name)
Address CreateConstInBoundsGEP(Address Addr, uint64_t Index, const llvm::Twine &Name="")
Given addr = T* ... produce name = getelementptr inbounds addr, i64 index where i64 is actually the t...
Address CreateAddrSpaceCast(Address Addr, llvm::Type *Ty, const llvm::Twine &Name="")
llvm::ConstantInt * getSize(uint64_t N)
Address CreateGEP(Address Addr, llvm::Value *Index, const llvm::Twine &Name="")
CodeGenFunction - This class organizes the per-function state that is used while generating LLVM code...
llvm::IRBuilder< llvm::ConstantFolder, CGBuilderInserterTy > CGBuilderBaseTy
CGBuilderInserter CGBuilderInserterTy
The JSON file list parser is used to communicate input to InstallAPI.
This structure provides a set of types that are commonly used during IR emission.
llvm::IntegerType * Int8Ty
i8, i16, i32, and i64
llvm::IntegerType * SizeTy