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