1a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner//===---- IRBuilder.cpp - Builder for LLVM Instrs -------------------------===// 2a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner// 3a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner// The LLVM Compiler Infrastructure 4a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner// 5a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner// This file is distributed under the University of Illinois Open Source 6a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner// License. See LICENSE.TXT for details. 7a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner// 8a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner//===----------------------------------------------------------------------===// 9a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner// 10a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner// This file implements the IRBuilder class, which is used as a convenient way 11a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner// to create LLVM instructions with a consistent and simplified interface. 12a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner// 13a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner//===----------------------------------------------------------------------===// 14a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner 150b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Function.h" 160b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/GlobalVariable.h" 170b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/IRBuilder.h" 180b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Intrinsics.h" 190b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/LLVMContext.h" 20a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattnerusing namespace llvm; 21a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner 22a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner/// CreateGlobalString - Make a new global variable with an initializer that 23f3b11aa6a72e0c31066a60c2e888e7a5eb5f2399Dan Gohman/// has array of i8 type filled in with the nul terminated string value 24a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner/// specified. If Name is specified, it is the name of the global variable 25a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner/// created. 26cb4e4eae1afaa243c0654bc5dd668f9eb5085f06Nick LewyckyValue *IRBuilderBase::CreateGlobalString(StringRef Str, const Twine &Name) { 2718c7f80b3e83ab584bd8572695a3cde8bafd9d3cChris Lattner Constant *StrConstant = ConstantDataArray::getString(Context, Str); 28a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner Module &M = *BB->getParent()->getParent(); 29a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner GlobalVariable *GV = new GlobalVariable(M, StrConstant->getType(), 30b143ea3739a9f714fff3e11ec472edfe06368748Benjamin Kramer true, GlobalValue::PrivateLinkage, 31ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg StrConstant); 32a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner GV->setName(Name); 3384025ba08ff23711b9d3d33c6c21819d63d30865Nick Lewycky GV->setUnnamedAddr(true); 34a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner return GV; 35a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner} 3643469b6957140898709382082ef95dd4b77ac20aChris Lattner 37a17ce80a1e475ab3526a4787b878d55a42727d19Chris LattnerType *IRBuilderBase::getCurrentFunctionReturnType() const { 382ad32752b9a880902550c7c47f1b9ca175ee851cChris Lattner assert(BB && BB->getParent() && "No current function!"); 392ad32752b9a880902550c7c47f1b9ca175ee851cChris Lattner return BB->getParent()->getReturnType(); 402ad32752b9a880902550c7c47f1b9ca175ee851cChris Lattner} 41c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner 42c0d5496b8aa9993e61ac5770e58184dd32f709bfChris LattnerValue *IRBuilderBase::getCastedInt8PtrValue(Value *Ptr) { 43db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner PointerType *PT = cast<PointerType>(Ptr->getType()); 44c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner if (PT->getElementType()->isIntegerTy(8)) 45c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner return Ptr; 46c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner 47c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner // Otherwise, we need to insert a bitcast. 48c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner PT = getInt8PtrTy(PT->getAddressSpace()); 49c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner BitCastInst *BCI = new BitCastInst(Ptr, PT, ""); 50c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner BB->getInstList().insert(InsertPt, BCI); 51c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner SetInstDebugLocation(BCI); 52c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner return BCI; 53c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner} 54c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner 55a3efbb15ddd5aa9006564cd79086723640084878Jay Foadstatic CallInst *createCallHelper(Value *Callee, ArrayRef<Value *> Ops, 56a3efbb15ddd5aa9006564cd79086723640084878Jay Foad IRBuilderBase *Builder) { 57a3efbb15ddd5aa9006564cd79086723640084878Jay Foad CallInst *CI = CallInst::Create(Callee, Ops, ""); 58c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner Builder->GetInsertBlock()->getInstList().insert(Builder->GetInsertPoint(),CI); 59c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner Builder->SetInstDebugLocation(CI); 60c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner return CI; 61c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner} 62c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner 63c0d5496b8aa9993e61ac5770e58184dd32f709bfChris LattnerCallInst *IRBuilderBase:: 64c0d5496b8aa9993e61ac5770e58184dd32f709bfChris LattnerCreateMemSet(Value *Ptr, Value *Val, Value *Size, unsigned Align, 65c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner bool isVolatile, MDNode *TBAATag) { 66c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner Ptr = getCastedInt8PtrValue(Ptr); 67c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner Value *Ops[] = { Ptr, Val, Size, getInt32(Align), getInt1(isVolatile) }; 685fdd6c8793462549e3593890ec61573da06e3346Jay Foad Type *Tys[] = { Ptr->getType(), Size->getType() }; 69c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner Module *M = BB->getParent()->getParent(); 70eb9a85f09e18b3fe88499710404b38d3a9128f62Benjamin Kramer Value *TheFn = Intrinsic::getDeclaration(M, Intrinsic::memset, Tys); 71c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner 72a3efbb15ddd5aa9006564cd79086723640084878Jay Foad CallInst *CI = createCallHelper(TheFn, Ops, this); 73c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner 74c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner // Set the TBAA info if present. 75c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner if (TBAATag) 76c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner CI->setMetadata(LLVMContext::MD_tbaa, TBAATag); 77c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner 78c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner return CI; 79c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner} 80c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner 81c0d5496b8aa9993e61ac5770e58184dd32f709bfChris LattnerCallInst *IRBuilderBase:: 82c0d5496b8aa9993e61ac5770e58184dd32f709bfChris LattnerCreateMemCpy(Value *Dst, Value *Src, Value *Size, unsigned Align, 838a63f99f038e56245d0f5049966727cc87264c0cDan Gohman bool isVolatile, MDNode *TBAATag, MDNode *TBAAStructTag) { 84c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner Dst = getCastedInt8PtrValue(Dst); 85c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner Src = getCastedInt8PtrValue(Src); 86c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner 87c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner Value *Ops[] = { Dst, Src, Size, getInt32(Align), getInt1(isVolatile) }; 885fdd6c8793462549e3593890ec61573da06e3346Jay Foad Type *Tys[] = { Dst->getType(), Src->getType(), Size->getType() }; 89c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner Module *M = BB->getParent()->getParent(); 90eb9a85f09e18b3fe88499710404b38d3a9128f62Benjamin Kramer Value *TheFn = Intrinsic::getDeclaration(M, Intrinsic::memcpy, Tys); 91c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner 92a3efbb15ddd5aa9006564cd79086723640084878Jay Foad CallInst *CI = createCallHelper(TheFn, Ops, this); 93c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner 94c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner // Set the TBAA info if present. 95c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner if (TBAATag) 96c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner CI->setMetadata(LLVMContext::MD_tbaa, TBAATag); 978a63f99f038e56245d0f5049966727cc87264c0cDan Gohman 988a63f99f038e56245d0f5049966727cc87264c0cDan Gohman // Set the TBAA Struct info if present. 998a63f99f038e56245d0f5049966727cc87264c0cDan Gohman if (TBAAStructTag) 1008a63f99f038e56245d0f5049966727cc87264c0cDan Gohman CI->setMetadata(LLVMContext::MD_tbaa_struct, TBAAStructTag); 101c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner 102c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner return CI; 103c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner} 104c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner 105c0d5496b8aa9993e61ac5770e58184dd32f709bfChris LattnerCallInst *IRBuilderBase:: 106c0d5496b8aa9993e61ac5770e58184dd32f709bfChris LattnerCreateMemMove(Value *Dst, Value *Src, Value *Size, unsigned Align, 107c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner bool isVolatile, MDNode *TBAATag) { 108c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner Dst = getCastedInt8PtrValue(Dst); 109c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner Src = getCastedInt8PtrValue(Src); 110c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner 111c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner Value *Ops[] = { Dst, Src, Size, getInt32(Align), getInt1(isVolatile) }; 1125fdd6c8793462549e3593890ec61573da06e3346Jay Foad Type *Tys[] = { Dst->getType(), Src->getType(), Size->getType() }; 113c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner Module *M = BB->getParent()->getParent(); 114eb9a85f09e18b3fe88499710404b38d3a9128f62Benjamin Kramer Value *TheFn = Intrinsic::getDeclaration(M, Intrinsic::memmove, Tys); 115c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner 116a3efbb15ddd5aa9006564cd79086723640084878Jay Foad CallInst *CI = createCallHelper(TheFn, Ops, this); 117c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner 118c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner // Set the TBAA info if present. 119c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner if (TBAATag) 120c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner CI->setMetadata(LLVMContext::MD_tbaa, TBAATag); 121c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner 122c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner return CI; 123c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner} 1240cf51561eddd659a7b427f40144e22363fd95a57Nick Lewycky 1250cf51561eddd659a7b427f40144e22363fd95a57Nick LewyckyCallInst *IRBuilderBase::CreateLifetimeStart(Value *Ptr, ConstantInt *Size) { 1260cf51561eddd659a7b427f40144e22363fd95a57Nick Lewycky assert(isa<PointerType>(Ptr->getType()) && 12756cb2298663017eb77aa4f4dda8db7ecd1b58173Bill Wendling "lifetime.start only applies to pointers."); 1280cf51561eddd659a7b427f40144e22363fd95a57Nick Lewycky Ptr = getCastedInt8PtrValue(Ptr); 1290cf51561eddd659a7b427f40144e22363fd95a57Nick Lewycky if (!Size) 1300cf51561eddd659a7b427f40144e22363fd95a57Nick Lewycky Size = getInt64(-1); 1310cf51561eddd659a7b427f40144e22363fd95a57Nick Lewycky else 1320cf51561eddd659a7b427f40144e22363fd95a57Nick Lewycky assert(Size->getType() == getInt64Ty() && 13356cb2298663017eb77aa4f4dda8db7ecd1b58173Bill Wendling "lifetime.start requires the size to be an i64"); 1340cf51561eddd659a7b427f40144e22363fd95a57Nick Lewycky Value *Ops[] = { Size, Ptr }; 1350cf51561eddd659a7b427f40144e22363fd95a57Nick Lewycky Module *M = BB->getParent()->getParent(); 1360cf51561eddd659a7b427f40144e22363fd95a57Nick Lewycky Value *TheFn = Intrinsic::getDeclaration(M, Intrinsic::lifetime_start); 137a3efbb15ddd5aa9006564cd79086723640084878Jay Foad return createCallHelper(TheFn, Ops, this); 1380cf51561eddd659a7b427f40144e22363fd95a57Nick Lewycky} 1390cf51561eddd659a7b427f40144e22363fd95a57Nick Lewycky 1400cf51561eddd659a7b427f40144e22363fd95a57Nick LewyckyCallInst *IRBuilderBase::CreateLifetimeEnd(Value *Ptr, ConstantInt *Size) { 1410cf51561eddd659a7b427f40144e22363fd95a57Nick Lewycky assert(isa<PointerType>(Ptr->getType()) && 14256cb2298663017eb77aa4f4dda8db7ecd1b58173Bill Wendling "lifetime.end only applies to pointers."); 1430cf51561eddd659a7b427f40144e22363fd95a57Nick Lewycky Ptr = getCastedInt8PtrValue(Ptr); 1440cf51561eddd659a7b427f40144e22363fd95a57Nick Lewycky if (!Size) 1450cf51561eddd659a7b427f40144e22363fd95a57Nick Lewycky Size = getInt64(-1); 1460cf51561eddd659a7b427f40144e22363fd95a57Nick Lewycky else 1470cf51561eddd659a7b427f40144e22363fd95a57Nick Lewycky assert(Size->getType() == getInt64Ty() && 14856cb2298663017eb77aa4f4dda8db7ecd1b58173Bill Wendling "lifetime.end requires the size to be an i64"); 1490cf51561eddd659a7b427f40144e22363fd95a57Nick Lewycky Value *Ops[] = { Size, Ptr }; 1500cf51561eddd659a7b427f40144e22363fd95a57Nick Lewycky Module *M = BB->getParent()->getParent(); 1510cf51561eddd659a7b427f40144e22363fd95a57Nick Lewycky Value *TheFn = Intrinsic::getDeclaration(M, Intrinsic::lifetime_end); 152a3efbb15ddd5aa9006564cd79086723640084878Jay Foad return createCallHelper(TheFn, Ops, this); 1530cf51561eddd659a7b427f40144e22363fd95a57Nick Lewycky} 154