BuildLibCalls.cpp revision 204792
1204792Srdivacky//===- BuildLibCalls.cpp - Utility builder for libcalls -------------------===//
2204792Srdivacky//
3204792Srdivacky//                     The LLVM Compiler Infrastructure
4204792Srdivacky//
5204792Srdivacky// This file is distributed under the University of Illinois Open Source
6204792Srdivacky// License. See LICENSE.TXT for details.
7204792Srdivacky//
8204792Srdivacky//===----------------------------------------------------------------------===//
9204792Srdivacky//
10204792Srdivacky// This file implements some functions that will create standard C libcalls.
11204792Srdivacky//
12204792Srdivacky//===----------------------------------------------------------------------===//
13204792Srdivacky
14204792Srdivacky#include "llvm/Transforms/Utils/BuildLibCalls.h"
15204792Srdivacky#include "llvm/Type.h"
16204792Srdivacky#include "llvm/Constants.h"
17204792Srdivacky#include "llvm/Function.h"
18204792Srdivacky#include "llvm/Module.h"
19204792Srdivacky#include "llvm/Support/IRBuilder.h"
20204792Srdivacky#include "llvm/Target/TargetData.h"
21204792Srdivacky#include "llvm/LLVMContext.h"
22204792Srdivacky#include "llvm/Intrinsics.h"
23204792Srdivacky
24204792Srdivackyusing namespace llvm;
25204792Srdivacky
26204792Srdivacky/// CastToCStr - Return V if it is an i8*, otherwise cast it to i8*.
27204792SrdivackyValue *llvm::CastToCStr(Value *V, IRBuilder<> &B) {
28204792Srdivacky  return B.CreateBitCast(V, B.getInt8PtrTy(), "cstr");
29204792Srdivacky}
30204792Srdivacky
31204792Srdivacky/// EmitStrLen - Emit a call to the strlen function to the builder, for the
32204792Srdivacky/// specified pointer.  This always returns an integer value of size intptr_t.
33204792SrdivackyValue *llvm::EmitStrLen(Value *Ptr, IRBuilder<> &B, const TargetData *TD) {
34204792Srdivacky  Module *M = B.GetInsertBlock()->getParent()->getParent();
35204792Srdivacky  AttributeWithIndex AWI[2];
36204792Srdivacky  AWI[0] = AttributeWithIndex::get(1, Attribute::NoCapture);
37204792Srdivacky  AWI[1] = AttributeWithIndex::get(~0u, Attribute::ReadOnly |
38204792Srdivacky                                   Attribute::NoUnwind);
39204792Srdivacky
40204792Srdivacky  LLVMContext &Context = B.GetInsertBlock()->getContext();
41204792Srdivacky  Constant *StrLen = M->getOrInsertFunction("strlen", AttrListPtr::get(AWI, 2),
42204792Srdivacky                                            TD->getIntPtrType(Context),
43204792Srdivacky                                            B.getInt8PtrTy(),
44204792Srdivacky                                            NULL);
45204792Srdivacky  CallInst *CI = B.CreateCall(StrLen, CastToCStr(Ptr, B), "strlen");
46204792Srdivacky  if (const Function *F = dyn_cast<Function>(StrLen->stripPointerCasts()))
47204792Srdivacky    CI->setCallingConv(F->getCallingConv());
48204792Srdivacky
49204792Srdivacky  return CI;
50204792Srdivacky}
51204792Srdivacky
52204792Srdivacky/// EmitStrChr - Emit a call to the strchr function to the builder, for the
53204792Srdivacky/// specified pointer and character.  Ptr is required to be some pointer type,
54204792Srdivacky/// and the return value has 'i8*' type.
55204792SrdivackyValue *llvm::EmitStrChr(Value *Ptr, char C, IRBuilder<> &B,
56204792Srdivacky                        const TargetData *TD) {
57204792Srdivacky  Module *M = B.GetInsertBlock()->getParent()->getParent();
58204792Srdivacky  AttributeWithIndex AWI =
59204792Srdivacky    AttributeWithIndex::get(~0u, Attribute::ReadOnly | Attribute::NoUnwind);
60204792Srdivacky
61204792Srdivacky  const Type *I8Ptr = B.getInt8PtrTy();
62204792Srdivacky  const Type *I32Ty = B.getInt32Ty();
63204792Srdivacky  Constant *StrChr = M->getOrInsertFunction("strchr", AttrListPtr::get(&AWI, 1),
64204792Srdivacky                                            I8Ptr, I8Ptr, I32Ty, NULL);
65204792Srdivacky  CallInst *CI = B.CreateCall2(StrChr, CastToCStr(Ptr, B),
66204792Srdivacky                               ConstantInt::get(I32Ty, C), "strchr");
67204792Srdivacky  if (const Function *F = dyn_cast<Function>(StrChr->stripPointerCasts()))
68204792Srdivacky    CI->setCallingConv(F->getCallingConv());
69204792Srdivacky  return CI;
70204792Srdivacky}
71204792Srdivacky
72204792Srdivacky/// EmitStrCpy - Emit a call to the strcpy function to the builder, for the
73204792Srdivacky/// specified pointer arguments.
74204792SrdivackyValue *llvm::EmitStrCpy(Value *Dst, Value *Src, IRBuilder<> &B,
75204792Srdivacky                        const TargetData *TD) {
76204792Srdivacky  Module *M = B.GetInsertBlock()->getParent()->getParent();
77204792Srdivacky  AttributeWithIndex AWI[2];
78204792Srdivacky  AWI[0] = AttributeWithIndex::get(2, Attribute::NoCapture);
79204792Srdivacky  AWI[1] = AttributeWithIndex::get(~0u, Attribute::NoUnwind);
80204792Srdivacky  const Type *I8Ptr = B.getInt8PtrTy();
81204792Srdivacky  Value *StrCpy = M->getOrInsertFunction("strcpy", AttrListPtr::get(AWI, 2),
82204792Srdivacky                                         I8Ptr, I8Ptr, I8Ptr, NULL);
83204792Srdivacky  CallInst *CI = B.CreateCall2(StrCpy, CastToCStr(Dst, B), CastToCStr(Src, B),
84204792Srdivacky                               "strcpy");
85204792Srdivacky  if (const Function *F = dyn_cast<Function>(StrCpy->stripPointerCasts()))
86204792Srdivacky    CI->setCallingConv(F->getCallingConv());
87204792Srdivacky  return CI;
88204792Srdivacky}
89204792Srdivacky
90204792Srdivacky/// EmitMemCpy - Emit a call to the memcpy function to the builder.  This always
91204792Srdivacky/// expects that the size has type 'intptr_t' and Dst/Src are pointers.
92204792SrdivackyValue *llvm::EmitMemCpy(Value *Dst, Value *Src, Value *Len,
93204792Srdivacky                        unsigned Align, IRBuilder<> &B, const TargetData *TD) {
94204792Srdivacky  Module *M = B.GetInsertBlock()->getParent()->getParent();
95204792Srdivacky  const Type *Ty = Len->getType();
96204792Srdivacky  Value *MemCpy = Intrinsic::getDeclaration(M, Intrinsic::memcpy, &Ty, 1);
97204792Srdivacky  Dst = CastToCStr(Dst, B);
98204792Srdivacky  Src = CastToCStr(Src, B);
99204792Srdivacky  return B.CreateCall4(MemCpy, Dst, Src, Len,
100204792Srdivacky                       ConstantInt::get(B.getInt32Ty(), Align));
101204792Srdivacky}
102204792Srdivacky
103204792Srdivacky/// EmitMemMove - Emit a call to the memmove function to the builder.  This
104204792Srdivacky/// always expects that the size has type 'intptr_t' and Dst/Src are pointers.
105204792SrdivackyValue *llvm::EmitMemMove(Value *Dst, Value *Src, Value *Len,
106204792Srdivacky					               unsigned Align, IRBuilder<> &B, const TargetData *TD) {
107204792Srdivacky  Module *M = B.GetInsertBlock()->getParent()->getParent();
108204792Srdivacky  LLVMContext &Context = B.GetInsertBlock()->getContext();
109204792Srdivacky  const Type *Ty = TD->getIntPtrType(Context);
110204792Srdivacky  Value *MemMove = Intrinsic::getDeclaration(M, Intrinsic::memmove, &Ty, 1);
111204792Srdivacky  Dst = CastToCStr(Dst, B);
112204792Srdivacky  Src = CastToCStr(Src, B);
113204792Srdivacky  Value *A = ConstantInt::get(B.getInt32Ty(), Align);
114204792Srdivacky  return B.CreateCall4(MemMove, Dst, Src, Len, A);
115204792Srdivacky}
116204792Srdivacky
117204792Srdivacky/// EmitMemChr - Emit a call to the memchr function.  This assumes that Ptr is
118204792Srdivacky/// a pointer, Val is an i32 value, and Len is an 'intptr_t' value.
119204792SrdivackyValue *llvm::EmitMemChr(Value *Ptr, Value *Val,
120204792Srdivacky                        Value *Len, IRBuilder<> &B, const TargetData *TD) {
121204792Srdivacky  Module *M = B.GetInsertBlock()->getParent()->getParent();
122204792Srdivacky  AttributeWithIndex AWI;
123204792Srdivacky  AWI = AttributeWithIndex::get(~0u, Attribute::ReadOnly | Attribute::NoUnwind);
124204792Srdivacky  LLVMContext &Context = B.GetInsertBlock()->getContext();
125204792Srdivacky  Value *MemChr = M->getOrInsertFunction("memchr", AttrListPtr::get(&AWI, 1),
126204792Srdivacky                                         B.getInt8PtrTy(),
127204792Srdivacky                                         B.getInt8PtrTy(),
128204792Srdivacky                                         B.getInt32Ty(),
129204792Srdivacky                                         TD->getIntPtrType(Context),
130204792Srdivacky                                         NULL);
131204792Srdivacky  CallInst *CI = B.CreateCall3(MemChr, CastToCStr(Ptr, B), Val, Len, "memchr");
132204792Srdivacky
133204792Srdivacky  if (const Function *F = dyn_cast<Function>(MemChr->stripPointerCasts()))
134204792Srdivacky    CI->setCallingConv(F->getCallingConv());
135204792Srdivacky
136204792Srdivacky  return CI;
137204792Srdivacky}
138204792Srdivacky
139204792Srdivacky/// EmitMemCmp - Emit a call to the memcmp function.
140204792SrdivackyValue *llvm::EmitMemCmp(Value *Ptr1, Value *Ptr2,
141204792Srdivacky                        Value *Len, IRBuilder<> &B, const TargetData *TD) {
142204792Srdivacky  Module *M = B.GetInsertBlock()->getParent()->getParent();
143204792Srdivacky  AttributeWithIndex AWI[3];
144204792Srdivacky  AWI[0] = AttributeWithIndex::get(1, Attribute::NoCapture);
145204792Srdivacky  AWI[1] = AttributeWithIndex::get(2, Attribute::NoCapture);
146204792Srdivacky  AWI[2] = AttributeWithIndex::get(~0u, Attribute::ReadOnly |
147204792Srdivacky                                   Attribute::NoUnwind);
148204792Srdivacky
149204792Srdivacky  LLVMContext &Context = B.GetInsertBlock()->getContext();
150204792Srdivacky  Value *MemCmp = M->getOrInsertFunction("memcmp", AttrListPtr::get(AWI, 3),
151204792Srdivacky                                         B.getInt32Ty(),
152204792Srdivacky                                         B.getInt8PtrTy(),
153204792Srdivacky                                         B.getInt8PtrTy(),
154204792Srdivacky                                         TD->getIntPtrType(Context), NULL);
155204792Srdivacky  CallInst *CI = B.CreateCall3(MemCmp, CastToCStr(Ptr1, B), CastToCStr(Ptr2, B),
156204792Srdivacky                               Len, "memcmp");
157204792Srdivacky
158204792Srdivacky  if (const Function *F = dyn_cast<Function>(MemCmp->stripPointerCasts()))
159204792Srdivacky    CI->setCallingConv(F->getCallingConv());
160204792Srdivacky
161204792Srdivacky  return CI;
162204792Srdivacky}
163204792Srdivacky
164204792Srdivacky/// EmitMemSet - Emit a call to the memset function
165204792SrdivackyValue *llvm::EmitMemSet(Value *Dst, Value *Val,
166204792Srdivacky                        Value *Len, IRBuilder<> &B, const TargetData *TD) {
167204792Srdivacky Module *M = B.GetInsertBlock()->getParent()->getParent();
168204792Srdivacky Intrinsic::ID IID = Intrinsic::memset;
169204792Srdivacky const Type *Tys[1];
170204792Srdivacky Tys[0] = Len->getType();
171204792Srdivacky Value *MemSet = Intrinsic::getDeclaration(M, IID, Tys, 1);
172204792Srdivacky Value *Align = ConstantInt::get(B.getInt32Ty(), 1);
173204792Srdivacky return B.CreateCall4(MemSet, CastToCStr(Dst, B), Val, Len, Align);
174204792Srdivacky}
175204792Srdivacky
176204792Srdivacky/// EmitUnaryFloatFnCall - Emit a call to the unary function named 'Name' (e.g.
177204792Srdivacky/// 'floor').  This function is known to take a single of type matching 'Op' and
178204792Srdivacky/// returns one value with the same type.  If 'Op' is a long double, 'l' is
179204792Srdivacky/// added as the suffix of name, if 'Op' is a float, we add a 'f' suffix.
180204792SrdivackyValue *llvm::EmitUnaryFloatFnCall(Value *Op, const char *Name,
181204792Srdivacky                                  IRBuilder<> &B, const AttrListPtr &Attrs) {
182204792Srdivacky  char NameBuffer[20];
183204792Srdivacky  if (!Op->getType()->isDoubleTy()) {
184204792Srdivacky    // If we need to add a suffix, copy into NameBuffer.
185204792Srdivacky    unsigned NameLen = strlen(Name);
186204792Srdivacky    assert(NameLen < sizeof(NameBuffer)-2);
187204792Srdivacky    memcpy(NameBuffer, Name, NameLen);
188204792Srdivacky    if (Op->getType()->isFloatTy())
189204792Srdivacky      NameBuffer[NameLen] = 'f';  // floorf
190204792Srdivacky    else
191204792Srdivacky      NameBuffer[NameLen] = 'l';  // floorl
192204792Srdivacky    NameBuffer[NameLen+1] = 0;
193204792Srdivacky    Name = NameBuffer;
194204792Srdivacky  }
195204792Srdivacky
196204792Srdivacky  Module *M = B.GetInsertBlock()->getParent()->getParent();
197204792Srdivacky  Value *Callee = M->getOrInsertFunction(Name, Op->getType(),
198204792Srdivacky                                         Op->getType(), NULL);
199204792Srdivacky  CallInst *CI = B.CreateCall(Callee, Op, Name);
200204792Srdivacky  CI->setAttributes(Attrs);
201204792Srdivacky  if (const Function *F = dyn_cast<Function>(Callee->stripPointerCasts()))
202204792Srdivacky    CI->setCallingConv(F->getCallingConv());
203204792Srdivacky
204204792Srdivacky  return CI;
205204792Srdivacky}
206204792Srdivacky
207204792Srdivacky/// EmitPutChar - Emit a call to the putchar function.  This assumes that Char
208204792Srdivacky/// is an integer.
209204792SrdivackyValue *llvm::EmitPutChar(Value *Char, IRBuilder<> &B, const TargetData *TD) {
210204792Srdivacky  Module *M = B.GetInsertBlock()->getParent()->getParent();
211204792Srdivacky  Value *PutChar = M->getOrInsertFunction("putchar", B.getInt32Ty(),
212204792Srdivacky                                          B.getInt32Ty(), NULL);
213204792Srdivacky  CallInst *CI = B.CreateCall(PutChar,
214204792Srdivacky                              B.CreateIntCast(Char,
215204792Srdivacky                              B.getInt32Ty(),
216204792Srdivacky                              /*isSigned*/true,
217204792Srdivacky                              "chari"),
218204792Srdivacky                              "putchar");
219204792Srdivacky
220204792Srdivacky  if (const Function *F = dyn_cast<Function>(PutChar->stripPointerCasts()))
221204792Srdivacky    CI->setCallingConv(F->getCallingConv());
222204792Srdivacky  return CI;
223204792Srdivacky}
224204792Srdivacky
225204792Srdivacky/// EmitPutS - Emit a call to the puts function.  This assumes that Str is
226204792Srdivacky/// some pointer.
227204792Srdivackyvoid llvm::EmitPutS(Value *Str, IRBuilder<> &B, const TargetData *TD) {
228204792Srdivacky  Module *M = B.GetInsertBlock()->getParent()->getParent();
229204792Srdivacky  AttributeWithIndex AWI[2];
230204792Srdivacky  AWI[0] = AttributeWithIndex::get(1, Attribute::NoCapture);
231204792Srdivacky  AWI[1] = AttributeWithIndex::get(~0u, Attribute::NoUnwind);
232204792Srdivacky
233204792Srdivacky  Value *PutS = M->getOrInsertFunction("puts", AttrListPtr::get(AWI, 2),
234204792Srdivacky                                       B.getInt32Ty(),
235204792Srdivacky                                       B.getInt8PtrTy(),
236204792Srdivacky                                       NULL);
237204792Srdivacky  CallInst *CI = B.CreateCall(PutS, CastToCStr(Str, B), "puts");
238204792Srdivacky  if (const Function *F = dyn_cast<Function>(PutS->stripPointerCasts()))
239204792Srdivacky    CI->setCallingConv(F->getCallingConv());
240204792Srdivacky
241204792Srdivacky}
242204792Srdivacky
243204792Srdivacky/// EmitFPutC - Emit a call to the fputc function.  This assumes that Char is
244204792Srdivacky/// an integer and File is a pointer to FILE.
245204792Srdivackyvoid llvm::EmitFPutC(Value *Char, Value *File, IRBuilder<> &B,
246204792Srdivacky                     const TargetData *TD) {
247204792Srdivacky  Module *M = B.GetInsertBlock()->getParent()->getParent();
248204792Srdivacky  AttributeWithIndex AWI[2];
249204792Srdivacky  AWI[0] = AttributeWithIndex::get(2, Attribute::NoCapture);
250204792Srdivacky  AWI[1] = AttributeWithIndex::get(~0u, Attribute::NoUnwind);
251204792Srdivacky  Constant *F;
252204792Srdivacky  if (File->getType()->isPointerTy())
253204792Srdivacky    F = M->getOrInsertFunction("fputc", AttrListPtr::get(AWI, 2),
254204792Srdivacky                               B.getInt32Ty(),
255204792Srdivacky                               B.getInt32Ty(), File->getType(),
256204792Srdivacky                               NULL);
257204792Srdivacky  else
258204792Srdivacky    F = M->getOrInsertFunction("fputc",
259204792Srdivacky                               B.getInt32Ty(),
260204792Srdivacky                               B.getInt32Ty(),
261204792Srdivacky                               File->getType(), NULL);
262204792Srdivacky  Char = B.CreateIntCast(Char, B.getInt32Ty(), /*isSigned*/true,
263204792Srdivacky                         "chari");
264204792Srdivacky  CallInst *CI = B.CreateCall2(F, Char, File, "fputc");
265204792Srdivacky
266204792Srdivacky  if (const Function *Fn = dyn_cast<Function>(F->stripPointerCasts()))
267204792Srdivacky    CI->setCallingConv(Fn->getCallingConv());
268204792Srdivacky}
269204792Srdivacky
270204792Srdivacky/// EmitFPutS - Emit a call to the puts function.  Str is required to be a
271204792Srdivacky/// pointer and File is a pointer to FILE.
272204792Srdivackyvoid llvm::EmitFPutS(Value *Str, Value *File, IRBuilder<> &B,
273204792Srdivacky                     const TargetData *TD) {
274204792Srdivacky  Module *M = B.GetInsertBlock()->getParent()->getParent();
275204792Srdivacky  AttributeWithIndex AWI[3];
276204792Srdivacky  AWI[0] = AttributeWithIndex::get(1, Attribute::NoCapture);
277204792Srdivacky  AWI[1] = AttributeWithIndex::get(2, Attribute::NoCapture);
278204792Srdivacky  AWI[2] = AttributeWithIndex::get(~0u, Attribute::NoUnwind);
279204792Srdivacky  Constant *F;
280204792Srdivacky  if (File->getType()->isPointerTy())
281204792Srdivacky    F = M->getOrInsertFunction("fputs", AttrListPtr::get(AWI, 3),
282204792Srdivacky                               B.getInt32Ty(),
283204792Srdivacky                               B.getInt8PtrTy(),
284204792Srdivacky                               File->getType(), NULL);
285204792Srdivacky  else
286204792Srdivacky    F = M->getOrInsertFunction("fputs", B.getInt32Ty(),
287204792Srdivacky                               B.getInt8PtrTy(),
288204792Srdivacky                               File->getType(), NULL);
289204792Srdivacky  CallInst *CI = B.CreateCall2(F, CastToCStr(Str, B), File, "fputs");
290204792Srdivacky
291204792Srdivacky  if (const Function *Fn = dyn_cast<Function>(F->stripPointerCasts()))
292204792Srdivacky    CI->setCallingConv(Fn->getCallingConv());
293204792Srdivacky}
294204792Srdivacky
295204792Srdivacky/// EmitFWrite - Emit a call to the fwrite function.  This assumes that Ptr is
296204792Srdivacky/// a pointer, Size is an 'intptr_t', and File is a pointer to FILE.
297204792Srdivackyvoid llvm::EmitFWrite(Value *Ptr, Value *Size, Value *File,
298204792Srdivacky                      IRBuilder<> &B, const TargetData *TD) {
299204792Srdivacky  Module *M = B.GetInsertBlock()->getParent()->getParent();
300204792Srdivacky  AttributeWithIndex AWI[3];
301204792Srdivacky  AWI[0] = AttributeWithIndex::get(1, Attribute::NoCapture);
302204792Srdivacky  AWI[1] = AttributeWithIndex::get(4, Attribute::NoCapture);
303204792Srdivacky  AWI[2] = AttributeWithIndex::get(~0u, Attribute::NoUnwind);
304204792Srdivacky  LLVMContext &Context = B.GetInsertBlock()->getContext();
305204792Srdivacky  Constant *F;
306204792Srdivacky  if (File->getType()->isPointerTy())
307204792Srdivacky    F = M->getOrInsertFunction("fwrite", AttrListPtr::get(AWI, 3),
308204792Srdivacky                               TD->getIntPtrType(Context),
309204792Srdivacky                               B.getInt8PtrTy(),
310204792Srdivacky                               TD->getIntPtrType(Context),
311204792Srdivacky                               TD->getIntPtrType(Context),
312204792Srdivacky                               File->getType(), NULL);
313204792Srdivacky  else
314204792Srdivacky    F = M->getOrInsertFunction("fwrite", TD->getIntPtrType(Context),
315204792Srdivacky                               B.getInt8PtrTy(),
316204792Srdivacky                               TD->getIntPtrType(Context),
317204792Srdivacky                               TD->getIntPtrType(Context),
318204792Srdivacky                               File->getType(), NULL);
319204792Srdivacky  CallInst *CI = B.CreateCall4(F, CastToCStr(Ptr, B), Size,
320204792Srdivacky                        ConstantInt::get(TD->getIntPtrType(Context), 1), File);
321204792Srdivacky
322204792Srdivacky  if (const Function *Fn = dyn_cast<Function>(F->stripPointerCasts()))
323204792Srdivacky    CI->setCallingConv(Fn->getCallingConv());
324204792Srdivacky}
325