9 #ifndef LLVM_CLANG_LIB_CODEGEN_CGBUILDER_H
10 #define LLVM_CLANG_LIB_CODEGEN_CGBUILDER_H
15 #include "llvm/Analysis/Utils/Local.h"
16 #include "llvm/IR/DataLayout.h"
17 #include "llvm/IR/IRBuilder.h"
18 #include "llvm/IR/Type.h"
24 class CodeGenFunction;
37 void InsertHelper(llvm::Instruction *I,
const llvm::Twine &Name,
39 llvm::BasicBlock::iterator InsertPt)
const override;
47 typedef llvm::IRBuilder<llvm::ConstantFolder, CGBuilderInserterTy>
59 llvm::Value *emitRawPointerFromAddress(
Address Addr)
const {
63 template <
bool IsInBounds>
64 Address createConstGEP2_32(
Address Addr,
unsigned Idx0,
unsigned Idx1,
65 const llvm::Twine &Name) {
66 const llvm::DataLayout &DL = BB->getParent()->getParent()->getDataLayout();
67 llvm::GetElementPtrInst *GEP;
70 Addr.getElementType(), emitRawPointerFromAddress(Addr), Idx0, Idx1,
74 Addr.getElementType(), emitRawPointerFromAddress(Addr), Idx0, Idx1,
77 DL.getIndexSizeInBits(Addr.getType()->getPointerAddressSpace()), 0,
79 if (!GEP->accumulateConstantOffset(DL,
Offset))
80 llvm_unreachable(
"offset of GEP with constants is always computable");
81 return Address(GEP, GEP->getResultElementType(),
82 Addr.getAlignment().alignmentAtOffset(
91 const llvm::ConstantFolder &F,
103 return llvm::ConstantInt::get(TypeCache.
SizeTy, N);
110 emitRawPointerFromAddress(Addr),
117 emitRawPointerFromAddress(Addr),
121 const llvm::Twine &Name =
"") {
127 using CGBuilderBaseTy::CreateAlignedLoad;
130 const llvm::Twine &Name =
"") {
137 bool IsVolatile =
false) {
142 using CGBuilderBaseTy::CreateAlignedStore;
145 bool IsVolatile =
false) {
153 bool IsVolatile =
false) {
154 return CGBuilderBaseTy::CreateStore(Val, Addr, IsVolatile);
159 const llvm::Twine &Name =
"") {
168 llvm::AtomicCmpXchgInst *
170 llvm::AtomicOrdering SuccessOrdering,
171 llvm::AtomicOrdering FailureOrdering,
173 return CGBuilderBaseTy::CreateAtomicCmpXchg(
179 llvm::AtomicRMWInst *
181 llvm::AtomicOrdering Ordering,
183 return CGBuilderBaseTy::CreateAtomicRMW(
188 using CGBuilderBaseTy::CreateAddrSpaceCast;
190 llvm::Type *ElementTy,
191 const llvm::Twine &Name =
"") {
202 using CGBuilderBaseTy::CreatePointerBitCastOrAddrSpaceCast;
204 llvm::Type *ElementTy,
205 const llvm::Twine &Name =
"") {
206 if (Addr.
getType()->getAddressSpace() == Ty->getPointerAddressSpace())
218 using CGBuilderBaseTy::CreateStructGEP;
220 const llvm::Twine &Name =
"") {
221 llvm::StructType *ElTy = cast<llvm::StructType>(Addr.
getElementType());
222 const llvm::DataLayout &DL = BB->getParent()->getParent()->getDataLayout();
223 const llvm::StructLayout *Layout = DL.getStructLayout(ElTy);
242 const llvm::Twine &Name =
"") {
243 llvm::ArrayType *ElTy = cast<llvm::ArrayType>(Addr.
getElementType());
244 const llvm::DataLayout &DL = BB->getParent()->getParent()->getDataLayout();
250 {getSize(CharUnits::Zero()), getSize(Index)}, Name),
262 const llvm::Twine &Name =
"") {
264 const llvm::DataLayout &DL = BB->getParent()->getParent()->getDataLayout();
279 const llvm::Twine &Name =
"") {
281 const llvm::DataLayout &DL = BB->getParent()->getParent()->getDataLayout();
291 using CGBuilderBaseTy::CreateGEP;
293 const llvm::Twine &Name =
"") {
294 const llvm::DataLayout &DL = BB->getParent()->getParent()->getDataLayout();
306 const llvm::Twine &Name =
"") {
316 const llvm::Twine &Name =
"") {
324 using CGBuilderBaseTy::CreateConstInBoundsGEP2_32;
326 const llvm::Twine &Name =
"") {
327 return createConstGEP2_32<true>(Addr, Idx0, Idx1, Name);
330 using CGBuilderBaseTy::CreateConstGEP2_32;
332 const llvm::Twine &Name =
"") {
333 return createConstGEP2_32<false>(Addr, Idx0, Idx1, Name);
337 llvm::Type *ElementType,
CharUnits Align,
338 const Twine &Name =
"") {
339 llvm::Value *Ptr = emitRawPointerFromAddress(Addr);
344 using CGBuilderBaseTy::CreateInBoundsGEP;
346 llvm::Type *ElementType,
CharUnits Align,
347 const Twine &Name =
"") {
349 emitRawPointerFromAddress(Addr),
354 using CGBuilderBaseTy::CreateIsNull;
360 return llvm::ConstantInt::getFalse(Context);
363 using CGBuilderBaseTy::CreateMemCpy;
365 bool IsVolatile =
false) {
366 llvm::Value *DestPtr = emitRawPointerFromAddress(Dest);
367 llvm::Value *SrcPtr = emitRawPointerFromAddress(Src);
372 bool IsVolatile =
false) {
373 llvm::Value *DestPtr = emitRawPointerFromAddress(Dest);
374 llvm::Value *SrcPtr = emitRawPointerFromAddress(Src);
379 using CGBuilderBaseTy::CreateMemCpyInline;
381 llvm::Value *DestPtr = emitRawPointerFromAddress(Dest);
382 llvm::Value *SrcPtr = emitRawPointerFromAddress(Src);
387 using CGBuilderBaseTy::CreateMemMove;
389 bool IsVolatile =
false) {
390 llvm::Value *DestPtr = emitRawPointerFromAddress(Dest);
391 llvm::Value *SrcPtr = emitRawPointerFromAddress(Src);
396 using CGBuilderBaseTy::CreateMemSet;
398 llvm::Value *Size,
bool IsVolatile =
false) {
403 using CGBuilderBaseTy::CreateMemSetInline;
411 using CGBuilderBaseTy::CreatePreserveStructAccessIndex;
414 llvm::MDNode *DbgInfo) {
415 llvm::StructType *ElTy = cast<llvm::StructType>(Addr.
getElementType());
416 const llvm::DataLayout &DL = BB->getParent()->getParent()->getDataLayout();
417 const llvm::StructLayout *Layout = DL.getStructLayout(ElTy);
422 Index, FieldIndex, DbgInfo),
427 using CGBuilderBaseTy::CreatePreserveUnionAccessIndex;
429 llvm::MDNode *DbgInfo) {
435 using CGBuilderBaseTy::CreateLaunderInvariantGroup;
441 using CGBuilderBaseTy::CreateStripInvariantGroup;
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.
Like RawAddress, an abstract representation of an aligned address, but the pointer contained in this ...
llvm::Value * emitRawPointer(CodeGenFunction &CGF) const
Return the pointer contained in this class after authenticating it and adding offset to it if necessa...
CharUnits getAlignment() const
llvm::Type * getElementType() const
Return the type of the values stored in this address.
Address withElementType(llvm::Type *ElemTy) const
Return address with different element type, but same pointer and alignment.
KnownNonNull_t isKnownNonNull() const
Whether the pointer is known not to be null.
llvm::PointerType * getType() const
Return the type of the pointer value.
llvm::Value * getBasePointer() const
void replaceBasePointer(llvm::Value *P)
This function is used in situations where the caller is doing some sort of opaque "laundering" of the...
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)
Address CreateConstInBoundsByteGEP(Address Addr, CharUnits Offset, const llvm::Twine &Name="")
Given a pointer to i8, adjust it by a given constant offset.
llvm::LoadInst * CreateAlignedLoad(llvm::Type *Ty, llvm::Value *Addr, CharUnits Align, const llvm::Twine &Name="")
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::LoadInst * CreateLoad(Address Addr, bool IsVolatile, const llvm::Twine &Name="")
llvm::CallInst * CreateMemSet(Address Dest, llvm::Value *Value, llvm::Value *Size, bool IsVolatile=false)
llvm::CallInst * CreateMemMove(Address Dest, Address Src, llvm::Value *Size, bool IsVolatile=false)
Address CreateGEP(CodeGenFunction &CGF, Address Addr, llvm::Value *Index, const llvm::Twine &Name="")
llvm::AtomicRMWInst * CreateAtomicRMW(llvm::AtomicRMWInst::BinOp Op, Address Addr, llvm::Value *Val, llvm::AtomicOrdering Ordering, llvm::SyncScope::ID SSID=llvm::SyncScope::System)
llvm::StoreInst * CreateAlignedStore(llvm::Value *Val, llvm::Value *Addr, CharUnits Align, 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::CallInst * CreateMemSetInline(Address Dest, llvm::Value *Value, uint64_t Size)
llvm::StoreInst * CreateStore(llvm::Value *Val, Address Addr, bool IsVolatile=false)
llvm::ConstantInt * getSize(uint64_t N)
Address CreateConstGEP2_32(Address Addr, unsigned Idx0, unsigned Idx1, const llvm::Twine &Name="")
Address CreateConstArrayGEP(Address Addr, uint64_t Index, const llvm::Twine &Name="")
Given addr = [n x T]* ...
llvm::LoadInst * CreateFlagLoad(llvm::Value *Addr, const llvm::Twine &Name="")
Emit a load from an i1 flag variable.
Address CreateStructGEP(Address Addr, unsigned Index, const llvm::Twine &Name="")
CGBuilderTy(const CodeGenTypeCache &TypeCache, llvm::LLVMContext &C)
CGBuilderTy(const CodeGenTypeCache &TypeCache, llvm::Instruction *I)
Address CreateConstByteGEP(Address Addr, CharUnits Offset, const llvm::Twine &Name="")
llvm::Value * CreateIsNull(Address Addr, const Twine &Name="")
llvm::CallInst * CreateMemCpy(Address Dest, Address Src, uint64_t Size, bool IsVolatile=false)
Address CreatePreserveStructAccessIndex(Address Addr, unsigned Index, unsigned FieldIndex, llvm::MDNode *DbgInfo)
llvm::StoreInst * CreateDefaultAlignedStore(llvm::Value *Val, llvm::Value *Addr, bool IsVolatile=false)
llvm::LoadInst * CreateLoad(Address Addr, const char *Name)
Address CreateLaunderInvariantGroup(Address Addr)
llvm::ConstantInt * getSize(CharUnits N)
CGBuilderTy(const CodeGenTypeCache &TypeCache, llvm::BasicBlock *BB)
Address CreateConstGEP(Address Addr, uint64_t Index, const llvm::Twine &Name="")
Given addr = T* ...
llvm::AtomicCmpXchgInst * CreateAtomicCmpXchg(Address Addr, llvm::Value *Cmp, llvm::Value *New, llvm::AtomicOrdering SuccessOrdering, llvm::AtomicOrdering FailureOrdering, llvm::SyncScope::ID SSID=llvm::SyncScope::System)
Address CreatePreserveUnionAccessIndex(Address Addr, unsigned FieldIndex, llvm::MDNode *DbgInfo)
Address CreateStripInvariantGroup(Address Addr)
Address CreateAddrSpaceCast(Address Addr, llvm::Type *Ty, llvm::Type *ElementTy, const llvm::Twine &Name="")
Address CreateConstInBoundsGEP(Address Addr, uint64_t Index, const llvm::Twine &Name="")
Given addr = T* ...
Address CreateInBoundsGEP(Address Addr, ArrayRef< llvm::Value * > IdxList, llvm::Type *ElementType, CharUnits Align, const Twine &Name="")
llvm::StoreInst * CreateFlagStore(bool Value, llvm::Value *Addr)
Emit a store to an i1 flag variable.
llvm::LoadInst * CreateLoad(Address Addr, const llvm::Twine &Name="")
llvm::CallInst * CreateMemCpy(Address Dest, Address Src, llvm::Value *Size, bool IsVolatile=false)
Address CreateGEP(Address Addr, ArrayRef< llvm::Value * > IdxList, llvm::Type *ElementType, CharUnits Align, const Twine &Name="")
CodeGenFunction - This class organizes the per-function state that is used while generating LLVM code...
An abstract representation of an aligned address.
llvm::IRBuilder< llvm::ConstantFolder, CGBuilderInserterTy > CGBuilderBaseTy
CGBuilderInserter CGBuilderInserterTy
@ System
Like Angled, but marks system directories.
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