1 //===---- IRBuilder.cpp - Builder for LLVM Instrs -------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
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.
13 //===----------------------------------------------------------------------===//
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"
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
26 Value
*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);
33 GV
->setUnnamedAddr(true);
37 const Type
*IRBuilderBase::getCurrentFunctionReturnType() const {
38 assert(BB
&& BB
->getParent() && "No current function!");
39 return BB
->getParent()->getReturnType();
42 Value
*IRBuilderBase::getCastedInt8PtrValue(Value
*Ptr
) {
43 const PointerType
*PT
= cast
<PointerType
>(Ptr
->getType());
44 if (PT
->getElementType()->isIntegerTy(8))
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
);
55 static CallInst
*createCallHelper(Value
*Callee
, Value
*const* Ops
,
56 unsigned NumOps
, IRBuilderBase
*Builder
) {
57 CallInst
*CI
= CallInst::Create(Callee
, Ops
, Ops
+ NumOps
, "");
58 Builder
->GetInsertBlock()->getInstList().insert(Builder
->GetInsertPoint(),CI
);
59 Builder
->SetInstDebugLocation(CI
);
63 CallInst
*IRBuilderBase::
64 CreateMemSet(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 const Type
*Tys
[] = { Ptr
->getType(), Size
->getType() };
69 Module
*M
= BB
->getParent()->getParent();
70 Value
*TheFn
= Intrinsic::getDeclaration(M
, Intrinsic::memset
, Tys
, 2);
72 CallInst
*CI
= createCallHelper(TheFn
, Ops
, 5, this);
74 // Set the TBAA info if present.
76 CI
->setMetadata(LLVMContext::MD_tbaa
, TBAATag
);
81 CallInst
*IRBuilderBase::
82 CreateMemCpy(Value
*Dst
, Value
*Src
, Value
*Size
, unsigned Align
,
83 bool isVolatile
, MDNode
*TBAATag
) {
84 Dst
= getCastedInt8PtrValue(Dst
);
85 Src
= getCastedInt8PtrValue(Src
);
87 Value
*Ops
[] = { Dst
, Src
, Size
, getInt32(Align
), getInt1(isVolatile
) };
88 const Type
*Tys
[] = { Dst
->getType(), Src
->getType(), Size
->getType() };
89 Module
*M
= BB
->getParent()->getParent();
90 Value
*TheFn
= Intrinsic::getDeclaration(M
, Intrinsic::memcpy
, Tys
, 3);
92 CallInst
*CI
= createCallHelper(TheFn
, Ops
, 5, this);
94 // Set the TBAA info if present.
96 CI
->setMetadata(LLVMContext::MD_tbaa
, TBAATag
);
101 CallInst
*IRBuilderBase::
102 CreateMemMove(Value
*Dst
, Value
*Src
, Value
*Size
, unsigned Align
,
103 bool isVolatile
, MDNode
*TBAATag
) {
104 Dst
= getCastedInt8PtrValue(Dst
);
105 Src
= getCastedInt8PtrValue(Src
);
107 Value
*Ops
[] = { Dst
, Src
, Size
, getInt32(Align
), getInt1(isVolatile
) };
108 const Type
*Tys
[] = { Dst
->getType(), Src
->getType(), Size
->getType() };
109 Module
*M
= BB
->getParent()->getParent();
110 Value
*TheFn
= Intrinsic::getDeclaration(M
, Intrinsic::memmove
, Tys
, 3);
112 CallInst
*CI
= createCallHelper(TheFn
, Ops
, 5, this);
114 // Set the TBAA info if present.
116 CI
->setMetadata(LLVMContext::MD_tbaa
, TBAATag
);
121 CallInst
*IRBuilderBase::CreateLifetimeStart(Value
*Ptr
, ConstantInt
*Size
) {
122 assert(isa
<PointerType
>(Ptr
->getType()) &&
123 "lifetime.start only applies to pointers.");
124 Ptr
= getCastedInt8PtrValue(Ptr
);
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
, 2, this);
136 CallInst
*IRBuilderBase::CreateLifetimeEnd(Value
*Ptr
, ConstantInt
*Size
) {
137 assert(isa
<PointerType
>(Ptr
->getType()) &&
138 "lifetime.end only applies to pointers.");
139 Ptr
= getCastedInt8PtrValue(Ptr
);
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
, 2, this);