1//===---- IRBuilder.cpp - Builder for LLVM Instrs -------------------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file implements the IRBuilder class, which is used as a convenient way 11// to create LLVM instructions with a consistent and simplified interface. 12// 13//===----------------------------------------------------------------------===// 14 15#include "llvm/Support/IRBuilder.h" 16#include "llvm/GlobalVariable.h" 17#include "llvm/Function.h" 18#include "llvm/Intrinsics.h" 19#include "llvm/LLVMContext.h" 20using namespace llvm; 21 22/// CreateGlobalString - Make a new global variable with an initializer that 23/// has array of i8 type filled in with the nul terminated string value 24/// specified. If Name is specified, it is the name of the global variable 25/// created. 26Value *IRBuilderBase::CreateGlobalString(StringRef Str, const Twine &Name) { 27 Constant *StrConstant = ConstantArray::get(Context, Str, true); 28 Module &M = *BB->getParent()->getParent(); 29 GlobalVariable *GV = new GlobalVariable(M, StrConstant->getType(), 30 true, GlobalValue::InternalLinkage, 31 StrConstant, "", 0, false); 32 GV->setName(Name); 33 GV->setUnnamedAddr(true); 34 return GV; 35} 36 37Type *IRBuilderBase::getCurrentFunctionReturnType() const { 38 assert(BB && BB->getParent() && "No current function!"); 39 return BB->getParent()->getReturnType(); 40} 41 42Value *IRBuilderBase::getCastedInt8PtrValue(Value *Ptr) { 43 PointerType *PT = cast<PointerType>(Ptr->getType()); 44 if (PT->getElementType()->isIntegerTy(8)) 45 return Ptr; 46 47 // Otherwise, we need to insert a bitcast. 48 PT = getInt8PtrTy(PT->getAddressSpace()); 49 BitCastInst *BCI = new BitCastInst(Ptr, PT, ""); 50 BB->getInstList().insert(InsertPt, BCI); 51 SetInstDebugLocation(BCI); 52 return BCI; 53} 54 55static CallInst *createCallHelper(Value *Callee, ArrayRef<Value *> Ops, 56 IRBuilderBase *Builder) { 57 CallInst *CI = CallInst::Create(Callee, Ops, ""); 58 Builder->GetInsertBlock()->getInstList().insert(Builder->GetInsertPoint(),CI); 59 Builder->SetInstDebugLocation(CI); 60 return CI; 61} 62 63CallInst *IRBuilderBase:: 64CreateMemSet(Value *Ptr, Value *Val, Value *Size, unsigned Align, 65 bool isVolatile, MDNode *TBAATag) { 66 Ptr = getCastedInt8PtrValue(Ptr); 67 Value *Ops[] = { Ptr, Val, Size, getInt32(Align), getInt1(isVolatile) }; 68 Type *Tys[] = { Ptr->getType(), Size->getType() }; 69 Module *M = BB->getParent()->getParent(); 70 Value *TheFn = Intrinsic::getDeclaration(M, Intrinsic::memset, Tys); 71 72 CallInst *CI = createCallHelper(TheFn, Ops, this); 73 74 // Set the TBAA info if present. 75 if (TBAATag) 76 CI->setMetadata(LLVMContext::MD_tbaa, TBAATag); 77 78 return CI; 79} 80 81CallInst *IRBuilderBase:: 82CreateMemCpy(Value *Dst, Value *Src, Value *Size, unsigned Align, 83 bool isVolatile, MDNode *TBAATag) { 84 Dst = getCastedInt8PtrValue(Dst); 85 Src = getCastedInt8PtrValue(Src); 86 87 Value *Ops[] = { Dst, Src, Size, getInt32(Align), getInt1(isVolatile) }; 88 Type *Tys[] = { Dst->getType(), Src->getType(), Size->getType() }; 89 Module *M = BB->getParent()->getParent(); 90 Value *TheFn = Intrinsic::getDeclaration(M, Intrinsic::memcpy, Tys); 91 92 CallInst *CI = createCallHelper(TheFn, Ops, this); 93 94 // Set the TBAA info if present. 95 if (TBAATag) 96 CI->setMetadata(LLVMContext::MD_tbaa, TBAATag); 97 98 return CI; 99} 100 101CallInst *IRBuilderBase:: 102CreateMemMove(Value *Dst, Value *Src, Value *Size, unsigned Align, 103 bool isVolatile, MDNode *TBAATag) { 104 Dst = getCastedInt8PtrValue(Dst); 105 Src = getCastedInt8PtrValue(Src); 106 107 Value *Ops[] = { Dst, Src, Size, getInt32(Align), getInt1(isVolatile) }; 108 Type *Tys[] = { Dst->getType(), Src->getType(), Size->getType() }; 109 Module *M = BB->getParent()->getParent(); 110 Value *TheFn = Intrinsic::getDeclaration(M, Intrinsic::memmove, Tys); 111 112 CallInst *CI = createCallHelper(TheFn, Ops, this); 113 114 // Set the TBAA info if present. 115 if (TBAATag) 116 CI->setMetadata(LLVMContext::MD_tbaa, TBAATag); 117 118 return CI; 119} 120 121CallInst *IRBuilderBase::CreateLifetimeStart(Value *Ptr, ConstantInt *Size) { 122 assert(isa<PointerType>(Ptr->getType()) && 123 "lifetime.start only applies to pointers."); 124 Ptr = getCastedInt8PtrValue(Ptr); 125 if (!Size) 126 Size = getInt64(-1); 127 else 128 assert(Size->getType() == getInt64Ty() && 129 "lifetime.start requires the size to be an i64"); 130 Value *Ops[] = { Size, Ptr }; 131 Module *M = BB->getParent()->getParent(); 132 Value *TheFn = Intrinsic::getDeclaration(M, Intrinsic::lifetime_start); 133 return createCallHelper(TheFn, Ops, this); 134} 135 136CallInst *IRBuilderBase::CreateLifetimeEnd(Value *Ptr, ConstantInt *Size) { 137 assert(isa<PointerType>(Ptr->getType()) && 138 "lifetime.end only applies to pointers."); 139 Ptr = getCastedInt8PtrValue(Ptr); 140 if (!Size) 141 Size = getInt64(-1); 142 else 143 assert(Size->getType() == getInt64Ty() && 144 "lifetime.end requires the size to be an i64"); 145 Value *Ops[] = { Size, Ptr }; 146 Module *M = BB->getParent()->getParent(); 147 Value *TheFn = Intrinsic::getDeclaration(M, Intrinsic::lifetime_end); 148 return createCallHelper(TheFn, Ops, this); 149} 150