diff options
Diffstat (limited to 'clang/lib/CodeGen/CGBuilder.h')
| -rw-r--r-- | clang/lib/CodeGen/CGBuilder.h | 75 |
1 files changed, 41 insertions, 34 deletions
diff --git a/clang/lib/CodeGen/CGBuilder.h b/clang/lib/CodeGen/CGBuilder.h index 7c9f41e84eaf..2fcfea64ede6 100644 --- a/clang/lib/CodeGen/CGBuilder.h +++ b/clang/lib/CodeGen/CGBuilder.h @@ -9,10 +9,11 @@ #ifndef LLVM_CLANG_LIB_CODEGEN_CGBUILDER_H #define LLVM_CLANG_LIB_CODEGEN_CGBUILDER_H -#include "llvm/IR/DataLayout.h" -#include "llvm/IR/IRBuilder.h" #include "Address.h" #include "CodeGenTypeCache.h" +#include "llvm/IR/DataLayout.h" +#include "llvm/IR/IRBuilder.h" +#include "llvm/IR/Type.h" namespace clang { namespace CodeGen { @@ -31,6 +32,7 @@ public: void InsertHelper(llvm::Instruction *I, const llvm::Twine &Name, llvm::BasicBlock *BB, llvm::BasicBlock::iterator InsertPt) const override; + private: CodeGenFunction *CGF = nullptr; }; @@ -44,17 +46,18 @@ class CGBuilderTy : public CGBuilderBaseTy { /// Storing a reference to the type cache here makes it a lot easier /// to build natural-feeling, target-specific IR. const CodeGenTypeCache &TypeCache; + public: CGBuilderTy(const CodeGenTypeCache &TypeCache, llvm::LLVMContext &C) - : CGBuilderBaseTy(C), TypeCache(TypeCache) {} - CGBuilderTy(const CodeGenTypeCache &TypeCache, - llvm::LLVMContext &C, const llvm::ConstantFolder &F, + : CGBuilderBaseTy(C), TypeCache(TypeCache) {} + CGBuilderTy(const CodeGenTypeCache &TypeCache, llvm::LLVMContext &C, + const llvm::ConstantFolder &F, const CGBuilderInserterTy &Inserter) - : CGBuilderBaseTy(C, F, Inserter), TypeCache(TypeCache) {} + : CGBuilderBaseTy(C, F, Inserter), TypeCache(TypeCache) {} CGBuilderTy(const CodeGenTypeCache &TypeCache, llvm::Instruction *I) - : CGBuilderBaseTy(I), TypeCache(TypeCache) {} + : CGBuilderBaseTy(I), TypeCache(TypeCache) {} CGBuilderTy(const CodeGenTypeCache &TypeCache, llvm::BasicBlock *BB) - : CGBuilderBaseTy(BB), TypeCache(TypeCache) {} + : CGBuilderBaseTy(BB), TypeCache(TypeCache) {} llvm::ConstantInt *getSize(CharUnits N) { return llvm::ConstantInt::get(TypeCache.SizeTy, N.getQuantity()); @@ -101,7 +104,8 @@ public: using CGBuilderBaseTy::CreateAlignedStore; llvm::StoreInst *CreateAlignedStore(llvm::Value *Val, llvm::Value *Addr, - CharUnits Align, bool IsVolatile = false) { + CharUnits Align, + bool IsVolatile = false) { return CreateAlignedStore(Val, Addr, Align.getAsAlign(), IsVolatile); } @@ -150,18 +154,13 @@ public: Ordering, SSID); } - using CGBuilderBaseTy::CreateBitCast; - Address CreateBitCast(Address Addr, llvm::Type *Ty, - const llvm::Twine &Name = "") { - return Address(CreateBitCast(Addr.getPointer(), Ty, Name), - Addr.getAlignment()); - } - using CGBuilderBaseTy::CreateAddrSpaceCast; Address CreateAddrSpaceCast(Address Addr, llvm::Type *Ty, const llvm::Twine &Name = "") { - return Address(CreateAddrSpaceCast(Addr.getPointer(), Ty, Name), - Addr.getAlignment()); + assert(cast<llvm::PointerType>(Ty)->isOpaqueOrPointeeTypeMatches( + Addr.getElementType()) && + "Should not change the element type"); + return Addr.withPointer(CreateAddrSpaceCast(Addr.getPointer(), Ty, Name)); } /// Cast the element type of the given address to a different type, @@ -169,16 +168,17 @@ public: Address CreateElementBitCast(Address Addr, llvm::Type *Ty, const llvm::Twine &Name = "") { auto *PtrTy = Ty->getPointerTo(Addr.getAddressSpace()); - return Address(CreateBitCast(Addr.getPointer(), PtrTy, Name), - Ty, Addr.getAlignment()); + return Address(CreateBitCast(Addr.getPointer(), PtrTy, Name), Ty, + Addr.getAlignment()); } using CGBuilderBaseTy::CreatePointerBitCastOrAddrSpaceCast; Address CreatePointerBitCastOrAddrSpaceCast(Address Addr, llvm::Type *Ty, + llvm::Type *ElementTy, const llvm::Twine &Name = "") { llvm::Value *Ptr = - CreatePointerBitCastOrAddrSpaceCast(Addr.getPointer(), Ty, Name); - return Address(Ptr, Addr.getAlignment()); + CreatePointerBitCastOrAddrSpaceCast(Addr.getPointer(), Ty, Name); + return Address(Ptr, ElementTy, Addr.getAlignment()); } /// Given @@ -196,10 +196,10 @@ public: const llvm::StructLayout *Layout = DL.getStructLayout(ElTy); auto Offset = CharUnits::fromQuantity(Layout->getElementOffset(Index)); - return Address(CreateStructGEP(Addr.getElementType(), - Addr.getPointer(), Index, Name), - ElTy->getElementType(Index), - Addr.getAlignment().alignmentAtOffset(Offset)); + return Address( + CreateStructGEP(Addr.getElementType(), Addr.getPointer(), Index, Name), + ElTy->getElementType(Index), + Addr.getAlignment().alignmentAtOffset(Offset)); } /// Given @@ -267,10 +267,10 @@ public: CharUnits EltSize = CharUnits::fromQuantity(DL.getTypeAllocSize(Addr.getElementType())); - return Address(CreateGEP(Addr.getElementType(), Addr.getPointer(), Index, - Name), - Addr.getElementType(), - Addr.getAlignment().alignmentOfArrayElement(EltSize)); + return Address( + CreateGEP(Addr.getElementType(), Addr.getPointer(), Index, Name), + Addr.getElementType(), + Addr.getAlignment().alignmentOfArrayElement(EltSize)); } /// Given a pointer to i8, adjust it by a given constant offset. @@ -344,9 +344,16 @@ public: Dest.getAlignment().getAsAlign(), IsVolatile); } + using CGBuilderBaseTy::CreateMemSetInline; + llvm::CallInst *CreateMemSetInline(Address Dest, llvm::Value *Value, + uint64_t Size) { + return CreateMemSetInline(Dest.getPointer(), + Dest.getAlignment().getAsAlign(), Value, + getInt64(Size)); + } + using CGBuilderBaseTy::CreatePreserveStructAccessIndex; - Address CreatePreserveStructAccessIndex(Address Addr, - unsigned Index, + Address CreatePreserveStructAccessIndex(Address Addr, unsigned Index, unsigned FieldIndex, llvm::MDNode *DbgInfo) { llvm::StructType *ElTy = cast<llvm::StructType>(Addr.getElementType()); @@ -366,7 +373,7 @@ public: } }; -} // end namespace CodeGen -} // end namespace clang +} // end namespace CodeGen +} // end namespace clang #endif |
