1 //===- BuildLibCalls.cpp - Utility builder for libcalls -------------------===//
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 some functions that will create standard C libcalls.
12 //===----------------------------------------------------------------------===//
14 #include "llvm/Transforms/Utils/BuildLibCalls.h"
15 #include "llvm/ADT/SmallString.h"
16 #include "llvm/ADT/Statistic.h"
17 #include "llvm/Analysis/TargetLibraryInfo.h"
18 #include "llvm/IR/Constants.h"
19 #include "llvm/IR/DataLayout.h"
20 #include "llvm/IR/Function.h"
21 #include "llvm/IR/IRBuilder.h"
22 #include "llvm/IR/Intrinsics.h"
23 #include "llvm/IR/LLVMContext.h"
24 #include "llvm/IR/Module.h"
25 #include "llvm/IR/Type.h"
29 #define DEBUG_TYPE "build-libcalls"
31 //- Infer Attributes ---------------------------------------------------------//
33 STATISTIC(NumReadNone, "Number of functions inferred as readnone");
34 STATISTIC(NumReadOnly, "Number of functions inferred as readonly");
35 STATISTIC(NumArgMemOnly, "Number of functions inferred as argmemonly");
36 STATISTIC(NumNoUnwind, "Number of functions inferred as nounwind");
37 STATISTIC(NumNoCapture, "Number of arguments inferred as nocapture");
38 STATISTIC(NumReadOnlyArg, "Number of arguments inferred as readonly");
39 STATISTIC(NumNoAlias, "Number of function returns inferred as noalias");
40 STATISTIC(NumNonNull, "Number of function returns inferred as nonnull returns");
42 static bool setDoesNotAccessMemory(Function &F) {
43 if (F.doesNotAccessMemory())
45 F.setDoesNotAccessMemory();
50 static bool setOnlyReadsMemory(Function &F) {
51 if (F.onlyReadsMemory())
53 F.setOnlyReadsMemory();
58 static bool setOnlyAccessesArgMemory(Function &F) {
59 if (F.onlyAccessesArgMemory())
61 F.setOnlyAccessesArgMemory();
66 static bool setDoesNotThrow(Function &F) {
74 static bool setRetDoesNotAlias(Function &F) {
75 if (F.hasAttribute(AttributeList::ReturnIndex, Attribute::NoAlias))
77 F.addAttribute(AttributeList::ReturnIndex, Attribute::NoAlias);
82 static bool setDoesNotCapture(Function &F, unsigned ArgNo) {
83 if (F.hasParamAttribute(ArgNo, Attribute::NoCapture))
85 F.addParamAttr(ArgNo, Attribute::NoCapture);
90 static bool setOnlyReadsMemory(Function &F, unsigned ArgNo) {
91 if (F.hasParamAttribute(ArgNo, Attribute::ReadOnly))
93 F.addParamAttr(ArgNo, Attribute::ReadOnly);
98 static bool setRetNonNull(Function &F) {
99 assert(F.getReturnType()->isPointerTy() &&
100 "nonnull applies only to pointers");
101 if (F.hasAttribute(AttributeList::ReturnIndex, Attribute::NonNull))
103 F.addAttribute(AttributeList::ReturnIndex, Attribute::NonNull);
108 bool llvm::inferLibFuncAttributes(Function &F, const TargetLibraryInfo &TLI) {
110 if (!(TLI.getLibFunc(F, TheLibFunc) && TLI.has(TheLibFunc)))
113 bool Changed = false;
114 switch (TheLibFunc) {
116 Changed |= setOnlyReadsMemory(F);
117 Changed |= setDoesNotThrow(F);
118 Changed |= setDoesNotCapture(F, 0);
121 case LibFunc_strrchr:
122 Changed |= setOnlyReadsMemory(F);
123 Changed |= setDoesNotThrow(F);
128 case LibFunc_strtoul:
129 case LibFunc_strtoll:
130 case LibFunc_strtold:
131 case LibFunc_strtoull:
132 Changed |= setDoesNotThrow(F);
133 Changed |= setDoesNotCapture(F, 1);
134 Changed |= setOnlyReadsMemory(F, 0);
139 case LibFunc_strncat:
140 case LibFunc_strncpy:
141 case LibFunc_stpncpy:
142 Changed |= setDoesNotThrow(F);
143 Changed |= setDoesNotCapture(F, 1);
144 Changed |= setOnlyReadsMemory(F, 1);
146 case LibFunc_strxfrm:
147 Changed |= setDoesNotThrow(F);
148 Changed |= setDoesNotCapture(F, 0);
149 Changed |= setDoesNotCapture(F, 1);
150 Changed |= setOnlyReadsMemory(F, 1);
152 case LibFunc_strcmp: // 0,1
153 case LibFunc_strspn: // 0,1
154 case LibFunc_strncmp: // 0,1
155 case LibFunc_strcspn: // 0,1
156 case LibFunc_strcoll: // 0,1
157 case LibFunc_strcasecmp: // 0,1
158 case LibFunc_strncasecmp: //
159 Changed |= setOnlyReadsMemory(F);
160 Changed |= setDoesNotThrow(F);
161 Changed |= setDoesNotCapture(F, 0);
162 Changed |= setDoesNotCapture(F, 1);
165 case LibFunc_strpbrk:
166 Changed |= setOnlyReadsMemory(F);
167 Changed |= setDoesNotThrow(F);
168 Changed |= setDoesNotCapture(F, 1);
171 case LibFunc_strtok_r:
172 Changed |= setDoesNotThrow(F);
173 Changed |= setDoesNotCapture(F, 1);
174 Changed |= setOnlyReadsMemory(F, 1);
177 Changed |= setDoesNotThrow(F);
178 Changed |= setDoesNotCapture(F, 0);
179 Changed |= setOnlyReadsMemory(F, 0);
182 case LibFunc_setvbuf:
183 Changed |= setDoesNotThrow(F);
184 Changed |= setDoesNotCapture(F, 0);
187 case LibFunc_strndup:
188 Changed |= setDoesNotThrow(F);
189 Changed |= setRetDoesNotAlias(F);
190 Changed |= setDoesNotCapture(F, 0);
191 Changed |= setOnlyReadsMemory(F, 0);
194 case LibFunc_statvfs:
195 Changed |= setDoesNotThrow(F);
196 Changed |= setDoesNotCapture(F, 0);
197 Changed |= setDoesNotCapture(F, 1);
198 Changed |= setOnlyReadsMemory(F, 0);
201 Changed |= setDoesNotThrow(F);
202 Changed |= setDoesNotCapture(F, 0);
203 Changed |= setDoesNotCapture(F, 1);
204 Changed |= setOnlyReadsMemory(F, 0);
205 Changed |= setOnlyReadsMemory(F, 1);
207 case LibFunc_sprintf:
208 Changed |= setDoesNotThrow(F);
209 Changed |= setDoesNotCapture(F, 0);
210 Changed |= setDoesNotCapture(F, 1);
211 Changed |= setOnlyReadsMemory(F, 1);
213 case LibFunc_snprintf:
214 Changed |= setDoesNotThrow(F);
215 Changed |= setDoesNotCapture(F, 0);
216 Changed |= setDoesNotCapture(F, 2);
217 Changed |= setOnlyReadsMemory(F, 2);
219 case LibFunc_setitimer:
220 Changed |= setDoesNotThrow(F);
221 Changed |= setDoesNotCapture(F, 1);
222 Changed |= setDoesNotCapture(F, 2);
223 Changed |= setOnlyReadsMemory(F, 1);
226 // May throw; "system" is a valid pthread cancellation point.
227 Changed |= setDoesNotCapture(F, 0);
228 Changed |= setOnlyReadsMemory(F, 0);
231 Changed |= setDoesNotThrow(F);
232 Changed |= setRetDoesNotAlias(F);
235 Changed |= setOnlyReadsMemory(F);
236 Changed |= setDoesNotThrow(F);
237 Changed |= setDoesNotCapture(F, 0);
238 Changed |= setDoesNotCapture(F, 1);
241 case LibFunc_memrchr:
242 Changed |= setOnlyReadsMemory(F);
243 Changed |= setDoesNotThrow(F);
248 Changed |= setDoesNotThrow(F);
249 Changed |= setDoesNotCapture(F, 1);
252 case LibFunc_mempcpy:
253 case LibFunc_memccpy:
254 case LibFunc_memmove:
255 Changed |= setDoesNotThrow(F);
256 Changed |= setDoesNotCapture(F, 1);
257 Changed |= setOnlyReadsMemory(F, 1);
259 case LibFunc_memcpy_chk:
260 Changed |= setDoesNotThrow(F);
262 case LibFunc_memalign:
263 Changed |= setRetDoesNotAlias(F);
266 Changed |= setDoesNotThrow(F);
267 Changed |= setDoesNotCapture(F, 0);
268 Changed |= setOnlyReadsMemory(F, 0);
271 Changed |= setDoesNotThrow(F);
272 Changed |= setDoesNotCapture(F, 0);
274 case LibFunc_realloc:
275 Changed |= setDoesNotThrow(F);
276 Changed |= setRetDoesNotAlias(F);
277 Changed |= setDoesNotCapture(F, 0);
280 // May throw; "read" is a valid pthread cancellation point.
281 Changed |= setDoesNotCapture(F, 1);
284 Changed |= setDoesNotThrow(F);
285 Changed |= setDoesNotCapture(F, 0);
289 case LibFunc_realpath:
290 Changed |= setDoesNotThrow(F);
291 Changed |= setDoesNotCapture(F, 0);
292 Changed |= setOnlyReadsMemory(F, 0);
295 Changed |= setDoesNotThrow(F);
296 Changed |= setDoesNotCapture(F, 0);
297 Changed |= setDoesNotCapture(F, 1);
298 Changed |= setOnlyReadsMemory(F, 0);
299 Changed |= setOnlyReadsMemory(F, 1);
301 case LibFunc_readlink:
302 Changed |= setDoesNotThrow(F);
303 Changed |= setDoesNotCapture(F, 0);
304 Changed |= setDoesNotCapture(F, 1);
305 Changed |= setOnlyReadsMemory(F, 0);
308 // May throw; "write" is a valid pthread cancellation point.
309 Changed |= setDoesNotCapture(F, 1);
310 Changed |= setOnlyReadsMemory(F, 1);
313 Changed |= setDoesNotThrow(F);
314 Changed |= setDoesNotCapture(F, 0);
315 Changed |= setDoesNotCapture(F, 1);
316 Changed |= setOnlyReadsMemory(F, 0);
319 Changed |= setDoesNotThrow(F);
320 Changed |= setOnlyReadsMemory(F);
321 Changed |= setDoesNotCapture(F, 0);
322 Changed |= setDoesNotCapture(F, 1);
325 Changed |= setDoesNotThrow(F);
326 Changed |= setDoesNotCapture(F, 0);
329 Changed |= setDoesNotThrow(F);
330 Changed |= setRetDoesNotAlias(F);
334 Changed |= setDoesNotThrow(F);
335 Changed |= setDoesNotCapture(F, 0);
336 Changed |= setOnlyReadsMemory(F, 0);
338 case LibFunc_ctermid:
339 case LibFunc_clearerr:
340 case LibFunc_closedir:
341 Changed |= setDoesNotThrow(F);
342 Changed |= setDoesNotCapture(F, 0);
348 Changed |= setDoesNotThrow(F);
349 Changed |= setOnlyReadsMemory(F);
350 Changed |= setDoesNotCapture(F, 0);
353 Changed |= setDoesNotThrow(F);
354 Changed |= setDoesNotCapture(F, 0);
355 Changed |= setOnlyReadsMemory(F, 0);
358 Changed |= setDoesNotThrow(F);
359 Changed |= setRetDoesNotAlias(F);
360 Changed |= setDoesNotCapture(F, 0);
361 Changed |= setDoesNotCapture(F, 1);
362 Changed |= setOnlyReadsMemory(F, 0);
363 Changed |= setOnlyReadsMemory(F, 1);
366 Changed |= setDoesNotThrow(F);
367 Changed |= setRetDoesNotAlias(F);
368 Changed |= setDoesNotCapture(F, 1);
369 Changed |= setOnlyReadsMemory(F, 1);
381 case LibFunc_fsetpos:
382 case LibFunc_flockfile:
383 case LibFunc_funlockfile:
384 case LibFunc_ftrylockfile:
385 Changed |= setDoesNotThrow(F);
386 Changed |= setDoesNotCapture(F, 0);
389 Changed |= setDoesNotThrow(F);
390 Changed |= setDoesNotCapture(F, 0);
391 Changed |= setOnlyReadsMemory(F);
398 case LibFunc_fstatvfs:
399 Changed |= setDoesNotThrow(F);
400 Changed |= setDoesNotCapture(F, 1);
403 Changed |= setDoesNotThrow(F);
404 Changed |= setDoesNotCapture(F, 2);
407 Changed |= setDoesNotThrow(F);
408 Changed |= setDoesNotCapture(F, 0);
409 Changed |= setDoesNotCapture(F, 3);
412 Changed |= setDoesNotThrow(F);
413 Changed |= setDoesNotCapture(F, 0);
414 Changed |= setDoesNotCapture(F, 3);
415 // FIXME: readonly #1?
418 Changed |= setDoesNotThrow(F);
419 Changed |= setDoesNotCapture(F, 0);
420 Changed |= setDoesNotCapture(F, 1);
421 Changed |= setOnlyReadsMemory(F, 0);
424 case LibFunc_fprintf:
425 Changed |= setDoesNotThrow(F);
426 Changed |= setDoesNotCapture(F, 0);
427 Changed |= setDoesNotCapture(F, 1);
428 Changed |= setOnlyReadsMemory(F, 1);
430 case LibFunc_fgetpos:
431 Changed |= setDoesNotThrow(F);
432 Changed |= setDoesNotCapture(F, 0);
433 Changed |= setDoesNotCapture(F, 1);
436 case LibFunc_getlogin_r:
437 case LibFunc_getc_unlocked:
438 Changed |= setDoesNotThrow(F);
439 Changed |= setDoesNotCapture(F, 0);
442 Changed |= setDoesNotThrow(F);
443 Changed |= setOnlyReadsMemory(F);
444 Changed |= setDoesNotCapture(F, 0);
447 case LibFunc_getchar:
448 Changed |= setDoesNotThrow(F);
450 case LibFunc_getitimer:
451 Changed |= setDoesNotThrow(F);
452 Changed |= setDoesNotCapture(F, 1);
454 case LibFunc_getpwnam:
455 Changed |= setDoesNotThrow(F);
456 Changed |= setDoesNotCapture(F, 0);
457 Changed |= setOnlyReadsMemory(F, 0);
460 Changed |= setDoesNotThrow(F);
461 Changed |= setDoesNotCapture(F, 1);
464 Changed |= setDoesNotThrow(F);
465 Changed |= setDoesNotCapture(F, 0);
468 Changed |= setDoesNotThrow(F);
469 Changed |= setDoesNotCapture(F, 0);
470 Changed |= setOnlyReadsMemory(F, 0);
472 case LibFunc_unsetenv:
473 Changed |= setDoesNotThrow(F);
474 Changed |= setDoesNotCapture(F, 0);
475 Changed |= setOnlyReadsMemory(F, 0);
479 Changed |= setDoesNotThrow(F);
480 Changed |= setDoesNotCapture(F, 0);
481 Changed |= setDoesNotCapture(F, 1);
482 Changed |= setOnlyReadsMemory(F, 0);
483 Changed |= setOnlyReadsMemory(F, 1);
486 Changed |= setDoesNotThrow(F);
487 Changed |= setDoesNotCapture(F, 1);
492 Changed |= setDoesNotThrow(F);
493 Changed |= setDoesNotCapture(F, 0);
494 Changed |= setOnlyReadsMemory(F, 0);
497 // May throw; "pread" is a valid pthread cancellation point.
498 Changed |= setDoesNotCapture(F, 1);
501 // May throw; "pwrite" is a valid pthread cancellation point.
502 Changed |= setDoesNotCapture(F, 1);
503 Changed |= setOnlyReadsMemory(F, 1);
505 case LibFunc_putchar:
506 Changed |= setDoesNotThrow(F);
509 Changed |= setDoesNotThrow(F);
510 Changed |= setRetDoesNotAlias(F);
511 Changed |= setDoesNotCapture(F, 0);
512 Changed |= setDoesNotCapture(F, 1);
513 Changed |= setOnlyReadsMemory(F, 0);
514 Changed |= setOnlyReadsMemory(F, 1);
517 Changed |= setDoesNotThrow(F);
518 Changed |= setDoesNotCapture(F, 0);
521 Changed |= setDoesNotThrow(F);
522 Changed |= setDoesNotCapture(F, 0);
523 Changed |= setOnlyReadsMemory(F, 0);
525 case LibFunc_vsscanf:
526 Changed |= setDoesNotThrow(F);
527 Changed |= setDoesNotCapture(F, 0);
528 Changed |= setDoesNotCapture(F, 1);
529 Changed |= setOnlyReadsMemory(F, 0);
530 Changed |= setOnlyReadsMemory(F, 1);
532 case LibFunc_vfscanf:
533 Changed |= setDoesNotThrow(F);
534 Changed |= setDoesNotCapture(F, 0);
535 Changed |= setDoesNotCapture(F, 1);
536 Changed |= setOnlyReadsMemory(F, 1);
539 Changed |= setDoesNotThrow(F);
540 Changed |= setRetDoesNotAlias(F);
542 case LibFunc_vprintf:
543 Changed |= setDoesNotThrow(F);
544 Changed |= setDoesNotCapture(F, 0);
545 Changed |= setOnlyReadsMemory(F, 0);
547 case LibFunc_vfprintf:
548 case LibFunc_vsprintf:
549 Changed |= setDoesNotThrow(F);
550 Changed |= setDoesNotCapture(F, 0);
551 Changed |= setDoesNotCapture(F, 1);
552 Changed |= setOnlyReadsMemory(F, 1);
554 case LibFunc_vsnprintf:
555 Changed |= setDoesNotThrow(F);
556 Changed |= setDoesNotCapture(F, 0);
557 Changed |= setDoesNotCapture(F, 2);
558 Changed |= setOnlyReadsMemory(F, 2);
561 // May throw; "open" is a valid pthread cancellation point.
562 Changed |= setDoesNotCapture(F, 0);
563 Changed |= setOnlyReadsMemory(F, 0);
565 case LibFunc_opendir:
566 Changed |= setDoesNotThrow(F);
567 Changed |= setRetDoesNotAlias(F);
568 Changed |= setDoesNotCapture(F, 0);
569 Changed |= setOnlyReadsMemory(F, 0);
571 case LibFunc_tmpfile:
572 Changed |= setDoesNotThrow(F);
573 Changed |= setRetDoesNotAlias(F);
576 Changed |= setDoesNotThrow(F);
577 Changed |= setDoesNotCapture(F, 0);
583 Changed |= setDoesNotThrow(F);
584 Changed |= setDoesNotAccessMemory(F);
587 Changed |= setDoesNotThrow(F);
588 Changed |= setDoesNotCapture(F, 0);
589 Changed |= setDoesNotCapture(F, 1);
590 Changed |= setOnlyReadsMemory(F, 0);
593 Changed |= setDoesNotThrow(F);
594 Changed |= setDoesNotCapture(F, 0);
595 Changed |= setOnlyReadsMemory(F, 0);
598 // May throw; places call through function pointer.
599 Changed |= setDoesNotCapture(F, 3);
601 case LibFunc_dunder_strdup:
602 case LibFunc_dunder_strndup:
603 Changed |= setDoesNotThrow(F);
604 Changed |= setRetDoesNotAlias(F);
605 Changed |= setDoesNotCapture(F, 0);
606 Changed |= setOnlyReadsMemory(F, 0);
608 case LibFunc_dunder_strtok_r:
609 Changed |= setDoesNotThrow(F);
610 Changed |= setDoesNotCapture(F, 1);
611 Changed |= setOnlyReadsMemory(F, 1);
613 case LibFunc_under_IO_getc:
614 Changed |= setDoesNotThrow(F);
615 Changed |= setDoesNotCapture(F, 0);
617 case LibFunc_under_IO_putc:
618 Changed |= setDoesNotThrow(F);
619 Changed |= setDoesNotCapture(F, 1);
621 case LibFunc_dunder_isoc99_scanf:
622 Changed |= setDoesNotThrow(F);
623 Changed |= setDoesNotCapture(F, 0);
624 Changed |= setOnlyReadsMemory(F, 0);
627 case LibFunc_lstat64:
628 case LibFunc_statvfs64:
629 Changed |= setDoesNotThrow(F);
630 Changed |= setDoesNotCapture(F, 0);
631 Changed |= setDoesNotCapture(F, 1);
632 Changed |= setOnlyReadsMemory(F, 0);
634 case LibFunc_dunder_isoc99_sscanf:
635 Changed |= setDoesNotThrow(F);
636 Changed |= setDoesNotCapture(F, 0);
637 Changed |= setDoesNotCapture(F, 1);
638 Changed |= setOnlyReadsMemory(F, 0);
639 Changed |= setOnlyReadsMemory(F, 1);
641 case LibFunc_fopen64:
642 Changed |= setDoesNotThrow(F);
643 Changed |= setRetDoesNotAlias(F);
644 Changed |= setDoesNotCapture(F, 0);
645 Changed |= setDoesNotCapture(F, 1);
646 Changed |= setOnlyReadsMemory(F, 0);
647 Changed |= setOnlyReadsMemory(F, 1);
649 case LibFunc_fseeko64:
650 case LibFunc_ftello64:
651 Changed |= setDoesNotThrow(F);
652 Changed |= setDoesNotCapture(F, 0);
654 case LibFunc_tmpfile64:
655 Changed |= setDoesNotThrow(F);
656 Changed |= setRetDoesNotAlias(F);
658 case LibFunc_fstat64:
659 case LibFunc_fstatvfs64:
660 Changed |= setDoesNotThrow(F);
661 Changed |= setDoesNotCapture(F, 1);
664 // May throw; "open" is a valid pthread cancellation point.
665 Changed |= setDoesNotCapture(F, 0);
666 Changed |= setOnlyReadsMemory(F, 0);
668 case LibFunc_gettimeofday:
669 // Currently some platforms have the restrict keyword on the arguments to
670 // gettimeofday. To be conservative, do not add noalias to gettimeofday's
672 Changed |= setDoesNotThrow(F);
673 Changed |= setDoesNotCapture(F, 0);
674 Changed |= setDoesNotCapture(F, 1);
676 case LibFunc_Znwj: // new(unsigned int)
677 case LibFunc_Znwm: // new(unsigned long)
678 case LibFunc_Znaj: // new[](unsigned int)
679 case LibFunc_Znam: // new[](unsigned long)
680 case LibFunc_msvc_new_int: // new(unsigned int)
681 case LibFunc_msvc_new_longlong: // new(unsigned long long)
682 case LibFunc_msvc_new_array_int: // new[](unsigned int)
683 case LibFunc_msvc_new_array_longlong: // new[](unsigned long long)
684 // Operator new always returns a nonnull noalias pointer
685 Changed |= setRetNonNull(F);
686 Changed |= setRetDoesNotAlias(F);
688 //TODO: add LibFunc entries for:
689 //case LibFunc_memset_pattern4:
690 //case LibFunc_memset_pattern8:
691 case LibFunc_memset_pattern16:
692 Changed |= setOnlyAccessesArgMemory(F);
693 Changed |= setDoesNotCapture(F, 0);
694 Changed |= setDoesNotCapture(F, 1);
695 Changed |= setOnlyReadsMemory(F, 1);
697 // int __nvvm_reflect(const char *)
698 case LibFunc_nvvm_reflect:
699 Changed |= setDoesNotAccessMemory(F);
700 Changed |= setDoesNotThrow(F);
704 // FIXME: It'd be really nice to cover all the library functions we're
710 //- Emit LibCalls ------------------------------------------------------------//
712 Value *llvm::castToCStr(Value *V, IRBuilder<> &B) {
713 unsigned AS = V->getType()->getPointerAddressSpace();
714 return B.CreateBitCast(V, B.getInt8PtrTy(AS), "cstr");
717 Value *llvm::emitStrLen(Value *Ptr, IRBuilder<> &B, const DataLayout &DL,
718 const TargetLibraryInfo *TLI) {
719 if (!TLI->has(LibFunc_strlen))
722 Module *M = B.GetInsertBlock()->getModule();
723 LLVMContext &Context = B.GetInsertBlock()->getContext();
724 Constant *StrLen = M->getOrInsertFunction("strlen", DL.getIntPtrType(Context),
726 inferLibFuncAttributes(*M->getFunction("strlen"), *TLI);
727 CallInst *CI = B.CreateCall(StrLen, castToCStr(Ptr, B), "strlen");
728 if (const Function *F = dyn_cast<Function>(StrLen->stripPointerCasts()))
729 CI->setCallingConv(F->getCallingConv());
734 Value *llvm::emitStrChr(Value *Ptr, char C, IRBuilder<> &B,
735 const TargetLibraryInfo *TLI) {
736 if (!TLI->has(LibFunc_strchr))
739 Module *M = B.GetInsertBlock()->getModule();
740 Type *I8Ptr = B.getInt8PtrTy();
741 Type *I32Ty = B.getInt32Ty();
743 M->getOrInsertFunction("strchr", I8Ptr, I8Ptr, I32Ty);
744 inferLibFuncAttributes(*M->getFunction("strchr"), *TLI);
745 CallInst *CI = B.CreateCall(
746 StrChr, {castToCStr(Ptr, B), ConstantInt::get(I32Ty, C)}, "strchr");
747 if (const Function *F = dyn_cast<Function>(StrChr->stripPointerCasts()))
748 CI->setCallingConv(F->getCallingConv());
752 Value *llvm::emitStrNCmp(Value *Ptr1, Value *Ptr2, Value *Len, IRBuilder<> &B,
753 const DataLayout &DL, const TargetLibraryInfo *TLI) {
754 if (!TLI->has(LibFunc_strncmp))
757 Module *M = B.GetInsertBlock()->getModule();
758 LLVMContext &Context = B.GetInsertBlock()->getContext();
759 Value *StrNCmp = M->getOrInsertFunction("strncmp", B.getInt32Ty(),
760 B.getInt8PtrTy(), B.getInt8PtrTy(),
761 DL.getIntPtrType(Context));
762 inferLibFuncAttributes(*M->getFunction("strncmp"), *TLI);
763 CallInst *CI = B.CreateCall(
764 StrNCmp, {castToCStr(Ptr1, B), castToCStr(Ptr2, B), Len}, "strncmp");
766 if (const Function *F = dyn_cast<Function>(StrNCmp->stripPointerCasts()))
767 CI->setCallingConv(F->getCallingConv());
772 Value *llvm::emitStrCpy(Value *Dst, Value *Src, IRBuilder<> &B,
773 const TargetLibraryInfo *TLI, StringRef Name) {
774 if (!TLI->has(LibFunc_strcpy))
777 Module *M = B.GetInsertBlock()->getModule();
778 Type *I8Ptr = B.getInt8PtrTy();
779 Value *StrCpy = M->getOrInsertFunction(Name, I8Ptr, I8Ptr, I8Ptr);
780 inferLibFuncAttributes(*M->getFunction(Name), *TLI);
782 B.CreateCall(StrCpy, {castToCStr(Dst, B), castToCStr(Src, B)}, Name);
783 if (const Function *F = dyn_cast<Function>(StrCpy->stripPointerCasts()))
784 CI->setCallingConv(F->getCallingConv());
788 Value *llvm::emitStrNCpy(Value *Dst, Value *Src, Value *Len, IRBuilder<> &B,
789 const TargetLibraryInfo *TLI, StringRef Name) {
790 if (!TLI->has(LibFunc_strncpy))
793 Module *M = B.GetInsertBlock()->getModule();
794 Type *I8Ptr = B.getInt8PtrTy();
795 Value *StrNCpy = M->getOrInsertFunction(Name, I8Ptr, I8Ptr, I8Ptr,
797 inferLibFuncAttributes(*M->getFunction(Name), *TLI);
798 CallInst *CI = B.CreateCall(
799 StrNCpy, {castToCStr(Dst, B), castToCStr(Src, B), Len}, "strncpy");
800 if (const Function *F = dyn_cast<Function>(StrNCpy->stripPointerCasts()))
801 CI->setCallingConv(F->getCallingConv());
805 Value *llvm::emitMemCpyChk(Value *Dst, Value *Src, Value *Len, Value *ObjSize,
806 IRBuilder<> &B, const DataLayout &DL,
807 const TargetLibraryInfo *TLI) {
808 if (!TLI->has(LibFunc_memcpy_chk))
811 Module *M = B.GetInsertBlock()->getModule();
813 AS = AttributeList::get(M->getContext(), AttributeList::FunctionIndex,
814 Attribute::NoUnwind);
815 LLVMContext &Context = B.GetInsertBlock()->getContext();
816 Value *MemCpy = M->getOrInsertFunction(
817 "__memcpy_chk", AttributeList::get(M->getContext(), AS), B.getInt8PtrTy(),
818 B.getInt8PtrTy(), B.getInt8PtrTy(), DL.getIntPtrType(Context),
819 DL.getIntPtrType(Context));
820 Dst = castToCStr(Dst, B);
821 Src = castToCStr(Src, B);
822 CallInst *CI = B.CreateCall(MemCpy, {Dst, Src, Len, ObjSize});
823 if (const Function *F = dyn_cast<Function>(MemCpy->stripPointerCasts()))
824 CI->setCallingConv(F->getCallingConv());
828 Value *llvm::emitMemChr(Value *Ptr, Value *Val, Value *Len, IRBuilder<> &B,
829 const DataLayout &DL, const TargetLibraryInfo *TLI) {
830 if (!TLI->has(LibFunc_memchr))
833 Module *M = B.GetInsertBlock()->getModule();
834 LLVMContext &Context = B.GetInsertBlock()->getContext();
835 Value *MemChr = M->getOrInsertFunction("memchr", B.getInt8PtrTy(),
836 B.getInt8PtrTy(), B.getInt32Ty(),
837 DL.getIntPtrType(Context));
838 inferLibFuncAttributes(*M->getFunction("memchr"), *TLI);
839 CallInst *CI = B.CreateCall(MemChr, {castToCStr(Ptr, B), Val, Len}, "memchr");
841 if (const Function *F = dyn_cast<Function>(MemChr->stripPointerCasts()))
842 CI->setCallingConv(F->getCallingConv());
847 Value *llvm::emitMemCmp(Value *Ptr1, Value *Ptr2, Value *Len, IRBuilder<> &B,
848 const DataLayout &DL, const TargetLibraryInfo *TLI) {
849 if (!TLI->has(LibFunc_memcmp))
852 Module *M = B.GetInsertBlock()->getModule();
853 LLVMContext &Context = B.GetInsertBlock()->getContext();
854 Value *MemCmp = M->getOrInsertFunction("memcmp", B.getInt32Ty(),
855 B.getInt8PtrTy(), B.getInt8PtrTy(),
856 DL.getIntPtrType(Context));
857 inferLibFuncAttributes(*M->getFunction("memcmp"), *TLI);
858 CallInst *CI = B.CreateCall(
859 MemCmp, {castToCStr(Ptr1, B), castToCStr(Ptr2, B), Len}, "memcmp");
861 if (const Function *F = dyn_cast<Function>(MemCmp->stripPointerCasts()))
862 CI->setCallingConv(F->getCallingConv());
867 /// Append a suffix to the function name according to the type of 'Op'.
868 static void appendTypeSuffix(Value *Op, StringRef &Name,
869 SmallString<20> &NameBuffer) {
870 if (!Op->getType()->isDoubleTy()) {
873 if (Op->getType()->isFloatTy())
882 Value *llvm::emitUnaryFloatFnCall(Value *Op, StringRef Name, IRBuilder<> &B,
883 const AttributeList &Attrs) {
884 SmallString<20> NameBuffer;
885 appendTypeSuffix(Op, Name, NameBuffer);
887 Module *M = B.GetInsertBlock()->getModule();
888 Value *Callee = M->getOrInsertFunction(Name, Op->getType(),
890 CallInst *CI = B.CreateCall(Callee, Op, Name);
892 // The incoming attribute set may have come from a speculatable intrinsic, but
893 // is being replaced with a library call which is not allowed to be
895 CI->setAttributes(Attrs.removeAttribute(B.getContext(),
896 AttributeList::FunctionIndex,
897 Attribute::Speculatable));
898 if (const Function *F = dyn_cast<Function>(Callee->stripPointerCasts()))
899 CI->setCallingConv(F->getCallingConv());
904 Value *llvm::emitBinaryFloatFnCall(Value *Op1, Value *Op2, StringRef Name,
905 IRBuilder<> &B, const AttributeList &Attrs) {
906 SmallString<20> NameBuffer;
907 appendTypeSuffix(Op1, Name, NameBuffer);
909 Module *M = B.GetInsertBlock()->getModule();
910 Value *Callee = M->getOrInsertFunction(Name, Op1->getType(), Op1->getType(),
912 CallInst *CI = B.CreateCall(Callee, {Op1, Op2}, Name);
913 CI->setAttributes(Attrs);
914 if (const Function *F = dyn_cast<Function>(Callee->stripPointerCasts()))
915 CI->setCallingConv(F->getCallingConv());
920 Value *llvm::emitPutChar(Value *Char, IRBuilder<> &B,
921 const TargetLibraryInfo *TLI) {
922 if (!TLI->has(LibFunc_putchar))
925 Module *M = B.GetInsertBlock()->getModule();
926 Value *PutChar = M->getOrInsertFunction("putchar", B.getInt32Ty(), B.getInt32Ty());
927 inferLibFuncAttributes(*M->getFunction("putchar"), *TLI);
928 CallInst *CI = B.CreateCall(PutChar,
929 B.CreateIntCast(Char,
935 if (const Function *F = dyn_cast<Function>(PutChar->stripPointerCasts()))
936 CI->setCallingConv(F->getCallingConv());
940 Value *llvm::emitPutS(Value *Str, IRBuilder<> &B,
941 const TargetLibraryInfo *TLI) {
942 if (!TLI->has(LibFunc_puts))
945 Module *M = B.GetInsertBlock()->getModule();
947 M->getOrInsertFunction("puts", B.getInt32Ty(), B.getInt8PtrTy());
948 inferLibFuncAttributes(*M->getFunction("puts"), *TLI);
949 CallInst *CI = B.CreateCall(PutS, castToCStr(Str, B), "puts");
950 if (const Function *F = dyn_cast<Function>(PutS->stripPointerCasts()))
951 CI->setCallingConv(F->getCallingConv());
955 Value *llvm::emitFPutC(Value *Char, Value *File, IRBuilder<> &B,
956 const TargetLibraryInfo *TLI) {
957 if (!TLI->has(LibFunc_fputc))
960 Module *M = B.GetInsertBlock()->getModule();
961 Constant *F = M->getOrInsertFunction("fputc", B.getInt32Ty(), B.getInt32Ty(),
963 if (File->getType()->isPointerTy())
964 inferLibFuncAttributes(*M->getFunction("fputc"), *TLI);
965 Char = B.CreateIntCast(Char, B.getInt32Ty(), /*isSigned*/true,
967 CallInst *CI = B.CreateCall(F, {Char, File}, "fputc");
969 if (const Function *Fn = dyn_cast<Function>(F->stripPointerCasts()))
970 CI->setCallingConv(Fn->getCallingConv());
974 Value *llvm::emitFPutS(Value *Str, Value *File, IRBuilder<> &B,
975 const TargetLibraryInfo *TLI) {
976 if (!TLI->has(LibFunc_fputs))
979 Module *M = B.GetInsertBlock()->getModule();
980 StringRef FPutsName = TLI->getName(LibFunc_fputs);
981 Constant *F = M->getOrInsertFunction(
982 FPutsName, B.getInt32Ty(), B.getInt8PtrTy(), File->getType());
983 if (File->getType()->isPointerTy())
984 inferLibFuncAttributes(*M->getFunction(FPutsName), *TLI);
985 CallInst *CI = B.CreateCall(F, {castToCStr(Str, B), File}, "fputs");
987 if (const Function *Fn = dyn_cast<Function>(F->stripPointerCasts()))
988 CI->setCallingConv(Fn->getCallingConv());
992 Value *llvm::emitFWrite(Value *Ptr, Value *Size, Value *File, IRBuilder<> &B,
993 const DataLayout &DL, const TargetLibraryInfo *TLI) {
994 if (!TLI->has(LibFunc_fwrite))
997 Module *M = B.GetInsertBlock()->getModule();
998 LLVMContext &Context = B.GetInsertBlock()->getContext();
999 StringRef FWriteName = TLI->getName(LibFunc_fwrite);
1000 Constant *F = M->getOrInsertFunction(
1001 FWriteName, DL.getIntPtrType(Context), B.getInt8PtrTy(),
1002 DL.getIntPtrType(Context), DL.getIntPtrType(Context), File->getType());
1004 if (File->getType()->isPointerTy())
1005 inferLibFuncAttributes(*M->getFunction(FWriteName), *TLI);
1007 B.CreateCall(F, {castToCStr(Ptr, B), Size,
1008 ConstantInt::get(DL.getIntPtrType(Context), 1), File});
1010 if (const Function *Fn = dyn_cast<Function>(F->stripPointerCasts()))
1011 CI->setCallingConv(Fn->getCallingConv());