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/GEPNoWrapFlags.h"
18#include "llvm/IR/IRBuilder.h"
19#include "llvm/IR/Type.h"
38 void InsertHelper(llvm::Instruction *I,
const llvm::Twine &Name,
39 llvm::BasicBlock::iterator InsertPt)
const override;
47typedef llvm::IRBuilder<llvm::ConstantFolder, CGBuilderInserterTy>
59 llvm::Value *emitRawPointerFromAddress(
Address Addr)
const {
60 return Addr.getBasePointer();
63 template <
bool IsInBounds>
65 const llvm::Twine &Name) {
66 const llvm::DataLayout &DL = BB->getDataLayout();
70 emitRawPointerFromAddress(
Addr), Idx0,
74 emitRawPointerFromAddress(
Addr), Idx0, Idx1, Name);
76 DL.getIndexSizeInBits(
Addr.getType()->getPointerAddressSpace()), 0,
78 if (!llvm::GEPOperator::accumulateConstantOffset(
79 Addr.getElementType(), {getInt32(Idx0), getInt32(Idx1)}, DL,
82 "accumulateConstantOffset with constant indices should not fail.");
83 llvm::Type *ElementTy = llvm::GetElementPtrInst::getIndexedType(
84 Addr.getElementType(), {Idx0, Idx1});
86 Addr.getAlignment().alignmentAtOffset(
95 const llvm::ConstantFolder &F,
107 return llvm::ConstantInt::get(TypeCache.
SizeTy, N);
114 emitRawPointerFromAddress(
Addr),
115 Addr.getAlignment().getAsAlign(), Name);
121 emitRawPointerFromAddress(
Addr),
122 Addr.getAlignment().getAsAlign(), Name);
125 const llvm::Twine &Name =
"") {
127 Addr.getElementType(), emitRawPointerFromAddress(
Addr),
128 Addr.getAlignment().getAsAlign(), IsVolatile, Name);
131 using CGBuilderBaseTy::CreateAlignedLoad;
134 const llvm::Twine &Name =
"") {
141 bool IsVolatile =
false) {
143 Addr.getAlignment().getAsAlign(), IsVolatile);
146 using CGBuilderBaseTy::CreateAlignedStore;
149 bool IsVolatile =
false) {
157 bool IsVolatile =
false) {
158 return CGBuilderBaseTy::CreateStore(Val,
Addr, IsVolatile);
163 const llvm::Twine &Name =
"") {
172 llvm::AtomicCmpXchgInst *
174 llvm::AtomicOrdering SuccessOrdering,
175 llvm::AtomicOrdering FailureOrdering,
176 llvm::SyncScope::ID SSID = llvm::SyncScope::System) {
177 return CGBuilderBaseTy::CreateAtomicCmpXchg(
178 Addr.emitRawPointer(*getCGF()), Cmp,
New,
179 Addr.getAlignment().getAsAlign(), SuccessOrdering, FailureOrdering,
183 llvm::AtomicRMWInst *
185 llvm::AtomicOrdering Ordering,
186 llvm::SyncScope::ID SSID = llvm::SyncScope::System) {
187 return CGBuilderBaseTy::CreateAtomicRMW(
188 Op,
Addr.emitRawPointer(*getCGF()), Val,
189 Addr.getAlignment().getAsAlign(), Ordering, SSID);
192 using CGBuilderBaseTy::CreateAddrSpaceCast;
194 llvm::Type *ElementTy,
195 const llvm::Twine &Name =
"") {
196 if (!
Addr.hasOffset())
198 ElementTy,
Addr.getAlignment(),
Addr.getPointerAuthInfo(),
199 nullptr,
Addr.isKnownNonNull());
203 ElementTy,
Addr.getAlignment(),
Addr.isKnownNonNull());
206 using CGBuilderBaseTy::CreatePointerBitCastOrAddrSpaceCast;
208 llvm::Type *ElementTy,
209 const llvm::Twine &Name =
"") {
210 if (
Addr.getType()->getAddressSpace() == Ty->getPointerAddressSpace())
211 return Addr.withElementType(ElementTy);
222 using CGBuilderBaseTy::CreateStructGEP;
224 const llvm::Twine &Name =
"") {
225 llvm::StructType *ElTy = cast<llvm::StructType>(
Addr.getElementType());
226 const llvm::DataLayout &DL = BB->getDataLayout();
227 const llvm::StructLayout *Layout = DL.getStructLayout(ElTy);
233 Addr.getAlignment().alignmentAtOffset(Offset),
234 Addr.isKnownNonNull());
246 const llvm::Twine &Name =
"") {
247 llvm::ArrayType *ElTy = cast<llvm::ArrayType>(
Addr.getElementType());
248 const llvm::DataLayout &DL = BB->getDataLayout();
254 {getSize(CharUnits::Zero()), getSize(Index)}, Name),
256 Addr.getAlignment().alignmentAtOffset(Index * EltSize),
257 Addr.isKnownNonNull());
266 const llvm::Twine &Name =
"") {
267 llvm::Type *ElTy =
Addr.getElementType();
268 const llvm::DataLayout &DL = BB->getDataLayout();
273 ElTy,
Addr.getAlignment().alignmentAtOffset(Index * EltSize),
274 Addr.isKnownNonNull());
283 const llvm::Twine &Name =
"") {
284 llvm::Type *ElTy =
Addr.getElementType();
285 const llvm::DataLayout &DL = BB->getDataLayout();
289 Addr.getElementType(),
290 Addr.getAlignment().alignmentAtOffset(Index * EltSize));
295 using CGBuilderBaseTy::CreateGEP;
297 const llvm::Twine &Name =
"") {
298 const llvm::DataLayout &DL = BB->getDataLayout();
304 Addr.getElementType(),
305 Addr.getAlignment().alignmentOfArrayElement(EltSize));
310 const llvm::Twine &Name =
"") {
311 assert(
Addr.getElementType() == TypeCache.
Int8Ty);
315 Addr.getElementType(),
Addr.getAlignment().alignmentAtOffset(Offset),
316 Addr.isKnownNonNull());
320 const llvm::Twine &Name =
"") {
321 assert(
Addr.getElementType() == TypeCache.
Int8Ty);
324 Addr.getElementType(),
325 Addr.getAlignment().alignmentAtOffset(Offset));
328 using CGBuilderBaseTy::CreateConstInBoundsGEP2_32;
330 const llvm::Twine &Name =
"") {
331 return createConstGEP2_32<true>(
Addr, Idx0, Idx1, Name);
334 using CGBuilderBaseTy::CreateConstGEP2_32;
336 const llvm::Twine &Name =
"") {
337 return createConstGEP2_32<false>(
Addr, Idx0, Idx1, Name);
341 llvm::Type *ElementType,
CharUnits Align,
342 const Twine &Name =
"",
343 llvm::GEPNoWrapFlags NW = llvm::GEPNoWrapFlags::none()) {
344 llvm::Value *Ptr = emitRawPointerFromAddress(
Addr);
349 using CGBuilderBaseTy::CreateInBoundsGEP;
351 llvm::Type *ElementType,
CharUnits Align,
352 const Twine &Name =
"") {
354 emitRawPointerFromAddress(
Addr),
356 ElementType, Align,
Addr.isKnownNonNull());
359 using CGBuilderBaseTy::CreateIsNull;
361 if (!
Addr.hasOffset())
365 return llvm::ConstantInt::getFalse(Context);
368 using CGBuilderBaseTy::CreateMemCpy;
370 bool IsVolatile =
false) {
371 llvm::Value *DestPtr = emitRawPointerFromAddress(Dest);
372 llvm::Value *SrcPtr = emitRawPointerFromAddress(Src);
377 bool IsVolatile =
false) {
378 llvm::Value *DestPtr = emitRawPointerFromAddress(Dest);
379 llvm::Value *SrcPtr = emitRawPointerFromAddress(Src);
384 using CGBuilderBaseTy::CreateMemCpyInline;
386 llvm::Value *DestPtr = emitRawPointerFromAddress(Dest);
387 llvm::Value *SrcPtr = emitRawPointerFromAddress(Src);
392 using CGBuilderBaseTy::CreateMemMove;
394 bool IsVolatile =
false) {
395 llvm::Value *DestPtr = emitRawPointerFromAddress(Dest);
396 llvm::Value *SrcPtr = emitRawPointerFromAddress(Src);
401 using CGBuilderBaseTy::CreateMemSet;
403 llvm::Value *Size,
bool IsVolatile =
false) {
408 using CGBuilderBaseTy::CreateMemSetInline;
416 using CGBuilderBaseTy::CreatePreserveStructAccessIndex;
419 llvm::MDNode *DbgInfo) {
420 llvm::StructType *ElTy = cast<llvm::StructType>(
Addr.getElementType());
421 const llvm::DataLayout &DL = BB->getDataLayout();
422 const llvm::StructLayout *Layout = DL.getStructLayout(ElTy);
427 Index, FieldIndex, DbgInfo),
429 Addr.getAlignment().alignmentAtOffset(Offset));
432 using CGBuilderBaseTy::CreatePreserveUnionAccessIndex;
434 llvm::MDNode *DbgInfo) {
436 Addr.getBasePointer(), FieldIndex, DbgInfo));
440 using CGBuilderBaseTy::CreateLaunderInvariantGroup;
446 using CGBuilderBaseTy::CreateStripInvariantGroup;
CharUnits - This is an opaque type for sizes expressed in character units.
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.
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 ...
CharUnits getAlignment() const
llvm::Type * getElementType() const
Return the type of the values stored in this address.
This is an IRBuilder insertion helper that forwards to CodeGenFunction::InsertHelper,...
CGBuilderInserter()=default
CGBuilderInserter(CodeGenFunction *CGF)
void InsertHelper(llvm::Instruction *I, const llvm::Twine &Name, llvm::BasicBlock::iterator InsertPt) const override
This forwards to CodeGenFunction::InsertHelper.
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="")
llvm::Value * CreateIsNull(Address Addr, const 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)
Address CreateGEP(CodeGenFunction &CGF, Address Addr, llvm::Value *Index, const llvm::Twine &Name="")
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 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]* ... 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 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* ... produce name = getelementptr inbounds addr, i64 index where i64 is actually the t...
Address CreateInBoundsGEP(Address Addr, ArrayRef< llvm::Value * > IdxList, llvm::Type *ElementType, CharUnits Align, const Twine &Name="")
llvm::ConstantInt * getSize(uint64_t N)
Address CreateGEP(Address Addr, ArrayRef< llvm::Value * > IdxList, llvm::Type *ElementType, CharUnits Align, const Twine &Name="", llvm::GEPNoWrapFlags NW=llvm::GEPNoWrapFlags::none())
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
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