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(const char *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);
36 const Type
*IRBuilderBase::getCurrentFunctionReturnType() const {
37 assert(BB
&& BB
->getParent() && "No current function!");
38 return BB
->getParent()->getReturnType();
41 Value
*IRBuilderBase::getCastedInt8PtrValue(Value
*Ptr
) {
42 const PointerType
*PT
= cast
<PointerType
>(Ptr
->getType());
43 if (PT
->getElementType()->isIntegerTy(8))
46 // Otherwise, we need to insert a bitcast.
47 PT
= getInt8PtrTy(PT
->getAddressSpace());
48 BitCastInst
*BCI
= new BitCastInst(Ptr
, PT
, "");
49 BB
->getInstList().insert(InsertPt
, BCI
);
50 SetInstDebugLocation(BCI
);
54 static CallInst
*createCallHelper(Value
*Callee
, Value
*const* Ops
,
55 unsigned NumOps
, IRBuilderBase
*Builder
) {
56 CallInst
*CI
= CallInst::Create(Callee
, Ops
, Ops
+ NumOps
, "");
57 Builder
->GetInsertBlock()->getInstList().insert(Builder
->GetInsertPoint(),CI
);
58 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
);