1 //===- BuildLibCalls.cpp - Utility builder for libcalls -------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file implements some functions that will create standard C libcalls.
11 //===----------------------------------------------------------------------===//
13 #include "llvm/Transforms/Utils/BuildLibCalls.h"
14 #include "llvm/ADT/SmallString.h"
15 #include "llvm/ADT/Statistic.h"
16 #include "llvm/Analysis/TargetLibraryInfo.h"
17 #include "llvm/IR/Constants.h"
18 #include "llvm/IR/DataLayout.h"
19 #include "llvm/IR/Function.h"
20 #include "llvm/IR/IRBuilder.h"
21 #include "llvm/IR/Intrinsics.h"
22 #include "llvm/IR/LLVMContext.h"
23 #include "llvm/IR/Module.h"
24 #include "llvm/IR/Type.h"
25 #include "llvm/Analysis/MemoryBuiltins.h"
29 #define DEBUG_TYPE "build-libcalls"
31 //- Infer Attributes ---------------------------------------------------------//
33 STATISTIC(NumReadNone, "Number of functions inferred as readnone");
34 STATISTIC(NumInaccessibleMemOnly,
35 "Number of functions inferred as inaccessiblememonly");
36 STATISTIC(NumReadOnly, "Number of functions inferred as readonly");
37 STATISTIC(NumArgMemOnly, "Number of functions inferred as argmemonly");
38 STATISTIC(NumInaccessibleMemOrArgMemOnly,
39 "Number of functions inferred as inaccessiblemem_or_argmemonly");
40 STATISTIC(NumNoUnwind, "Number of functions inferred as nounwind");
41 STATISTIC(NumNoCapture, "Number of arguments inferred as nocapture");
42 STATISTIC(NumWriteOnlyArg, "Number of arguments inferred as writeonly");
43 STATISTIC(NumSExtArg, "Number of arguments inferred as signext");
44 STATISTIC(NumReadOnlyArg, "Number of arguments inferred as readonly");
45 STATISTIC(NumNoAlias, "Number of function returns inferred as noalias");
46 STATISTIC(NumNoUndef, "Number of function returns inferred as noundef returns");
47 STATISTIC(NumNonNull, "Number of function returns inferred as nonnull returns");
48 STATISTIC(NumReturnedArg, "Number of arguments inferred as returned");
49 STATISTIC(NumWillReturn, "Number of functions inferred as willreturn");
51 static bool setDoesNotAccessMemory(Function &F) {
52 if (F.doesNotAccessMemory())
54 F.setDoesNotAccessMemory();
59 static bool setOnlyAccessesInaccessibleMemory(Function &F) {
60 if (F.onlyAccessesInaccessibleMemory())
62 F.setOnlyAccessesInaccessibleMemory();
63 ++NumInaccessibleMemOnly;
67 static bool setOnlyReadsMemory(Function &F) {
68 if (F.onlyReadsMemory())
70 F.setOnlyReadsMemory();
75 static bool setOnlyAccessesArgMemory(Function &F) {
76 if (F.onlyAccessesArgMemory())
78 F.setOnlyAccessesArgMemory();
83 static bool setOnlyAccessesInaccessibleMemOrArgMem(Function &F) {
84 if (F.onlyAccessesInaccessibleMemOrArgMem())
86 F.setOnlyAccessesInaccessibleMemOrArgMem();
87 ++NumInaccessibleMemOrArgMemOnly;
91 static bool setDoesNotThrow(Function &F) {
99 static bool setRetDoesNotAlias(Function &F) {
100 if (F.hasAttribute(AttributeList::ReturnIndex, Attribute::NoAlias))
102 F.addAttribute(AttributeList::ReturnIndex, Attribute::NoAlias);
107 static bool setDoesNotCapture(Function &F, unsigned ArgNo) {
108 if (F.hasParamAttribute(ArgNo, Attribute::NoCapture))
110 F.addParamAttr(ArgNo, Attribute::NoCapture);
115 static bool setDoesNotAlias(Function &F, unsigned ArgNo) {
116 if (F.hasParamAttribute(ArgNo, Attribute::NoAlias))
118 F.addParamAttr(ArgNo, Attribute::NoAlias);
123 static bool setOnlyReadsMemory(Function &F, unsigned ArgNo) {
124 if (F.hasParamAttribute(ArgNo, Attribute::ReadOnly))
126 F.addParamAttr(ArgNo, Attribute::ReadOnly);
131 static bool setOnlyWritesMemory(Function &F, unsigned ArgNo) {
132 if (F.hasParamAttribute(ArgNo, Attribute::WriteOnly))
134 F.addParamAttr(ArgNo, Attribute::WriteOnly);
139 static bool setSignExtendedArg(Function &F, unsigned ArgNo) {
140 if (F.hasParamAttribute(ArgNo, Attribute::SExt))
142 F.addParamAttr(ArgNo, Attribute::SExt);
147 static bool setRetNoUndef(Function &F) {
148 if (!F.getReturnType()->isVoidTy() &&
149 !F.hasAttribute(AttributeList::ReturnIndex, Attribute::NoUndef)) {
150 F.addAttribute(AttributeList::ReturnIndex, Attribute::NoUndef);
157 static bool setArgsNoUndef(Function &F) {
158 bool Changed = false;
159 for (unsigned ArgNo = 0; ArgNo < F.arg_size(); ++ArgNo) {
160 if (!F.hasParamAttribute(ArgNo, Attribute::NoUndef)) {
161 F.addParamAttr(ArgNo, Attribute::NoUndef);
169 static bool setRetAndArgsNoUndef(Function &F) {
170 return setRetNoUndef(F) | setArgsNoUndef(F);
173 static bool setRetNonNull(Function &F) {
174 assert(F.getReturnType()->isPointerTy() &&
175 "nonnull applies only to pointers");
176 if (F.hasAttribute(AttributeList::ReturnIndex, Attribute::NonNull))
178 F.addAttribute(AttributeList::ReturnIndex, Attribute::NonNull);
183 static bool setReturnedArg(Function &F, unsigned ArgNo) {
184 if (F.hasParamAttribute(ArgNo, Attribute::Returned))
186 F.addParamAttr(ArgNo, Attribute::Returned);
191 static bool setNonLazyBind(Function &F) {
192 if (F.hasFnAttribute(Attribute::NonLazyBind))
194 F.addFnAttr(Attribute::NonLazyBind);
198 static bool setDoesNotFreeMemory(Function &F) {
199 if (F.hasFnAttribute(Attribute::NoFree))
201 F.addFnAttr(Attribute::NoFree);
205 static bool setWillReturn(Function &F) {
206 if (F.hasFnAttribute(Attribute::WillReturn))
208 F.addFnAttr(Attribute::WillReturn);
213 bool llvm::inferLibFuncAttributes(Module *M, StringRef Name,
214 const TargetLibraryInfo &TLI) {
215 Function *F = M->getFunction(Name);
218 return inferLibFuncAttributes(*F, TLI);
221 bool llvm::inferLibFuncAttributes(Function &F, const TargetLibraryInfo &TLI) {
223 if (!(TLI.getLibFunc(F, TheLibFunc) && TLI.has(TheLibFunc)))
226 bool Changed = false;
228 if(!isLibFreeFunction(&F, TheLibFunc) && !isReallocLikeFn(&F, &TLI))
229 Changed |= setDoesNotFreeMemory(F);
231 if (F.getParent() != nullptr && F.getParent()->getRtLibUseGOT())
232 Changed |= setNonLazyBind(F);
234 switch (TheLibFunc) {
237 Changed |= setOnlyReadsMemory(F);
238 Changed |= setDoesNotThrow(F);
239 Changed |= setOnlyAccessesArgMemory(F);
240 Changed |= setWillReturn(F);
241 Changed |= setDoesNotCapture(F, 0);
244 case LibFunc_strrchr:
245 Changed |= setOnlyAccessesArgMemory(F);
246 Changed |= setOnlyReadsMemory(F);
247 Changed |= setDoesNotThrow(F);
248 Changed |= setWillReturn(F);
253 case LibFunc_strtoul:
254 case LibFunc_strtoll:
255 case LibFunc_strtold:
256 case LibFunc_strtoull:
257 Changed |= setDoesNotThrow(F);
258 Changed |= setWillReturn(F);
259 Changed |= setDoesNotCapture(F, 1);
260 Changed |= setOnlyReadsMemory(F, 0);
263 case LibFunc_strncpy:
265 case LibFunc_strncat:
266 Changed |= setWillReturn(F);
267 Changed |= setReturnedArg(F, 0);
270 case LibFunc_stpncpy:
271 Changed |= setOnlyAccessesArgMemory(F);
272 Changed |= setDoesNotThrow(F);
273 Changed |= setWillReturn(F);
274 Changed |= setDoesNotCapture(F, 1);
275 Changed |= setOnlyWritesMemory(F, 0);
276 Changed |= setOnlyReadsMemory(F, 1);
277 Changed |= setDoesNotAlias(F, 0);
278 Changed |= setDoesNotAlias(F, 1);
280 case LibFunc_strxfrm:
281 Changed |= setDoesNotThrow(F);
282 Changed |= setWillReturn(F);
283 Changed |= setDoesNotCapture(F, 0);
284 Changed |= setDoesNotCapture(F, 1);
285 Changed |= setOnlyReadsMemory(F, 1);
287 case LibFunc_strcmp: // 0,1
288 case LibFunc_strspn: // 0,1
289 case LibFunc_strncmp: // 0,1
290 case LibFunc_strcspn: // 0,1
291 Changed |= setDoesNotThrow(F);
292 Changed |= setOnlyAccessesArgMemory(F);
293 Changed |= setWillReturn(F);
294 Changed |= setOnlyReadsMemory(F);
295 Changed |= setDoesNotCapture(F, 0);
296 Changed |= setDoesNotCapture(F, 1);
298 case LibFunc_strcoll:
299 case LibFunc_strcasecmp: // 0,1
300 case LibFunc_strncasecmp: //
301 // Those functions may depend on the locale, which may be accessed through
303 Changed |= setOnlyReadsMemory(F);
304 Changed |= setDoesNotThrow(F);
305 Changed |= setWillReturn(F);
306 Changed |= setDoesNotCapture(F, 0);
307 Changed |= setDoesNotCapture(F, 1);
310 case LibFunc_strpbrk:
311 Changed |= setOnlyAccessesArgMemory(F);
312 Changed |= setOnlyReadsMemory(F);
313 Changed |= setDoesNotThrow(F);
314 Changed |= setWillReturn(F);
315 Changed |= setDoesNotCapture(F, 1);
318 case LibFunc_strtok_r:
319 Changed |= setDoesNotThrow(F);
320 Changed |= setWillReturn(F);
321 Changed |= setDoesNotCapture(F, 1);
322 Changed |= setOnlyReadsMemory(F, 1);
325 Changed |= setRetAndArgsNoUndef(F);
326 Changed |= setDoesNotThrow(F);
327 Changed |= setDoesNotCapture(F, 0);
328 Changed |= setOnlyReadsMemory(F, 0);
331 case LibFunc_setvbuf:
332 Changed |= setRetAndArgsNoUndef(F);
333 Changed |= setDoesNotThrow(F);
334 Changed |= setDoesNotCapture(F, 0);
337 case LibFunc_strndup:
338 Changed |= setOnlyAccessesInaccessibleMemOrArgMem(F);
339 Changed |= setDoesNotThrow(F);
340 Changed |= setRetDoesNotAlias(F);
341 Changed |= setWillReturn(F);
342 Changed |= setDoesNotCapture(F, 0);
343 Changed |= setOnlyReadsMemory(F, 0);
346 case LibFunc_statvfs:
347 Changed |= setRetAndArgsNoUndef(F);
348 Changed |= setDoesNotThrow(F);
349 Changed |= setDoesNotCapture(F, 0);
350 Changed |= setDoesNotCapture(F, 1);
351 Changed |= setOnlyReadsMemory(F, 0);
354 Changed |= setRetAndArgsNoUndef(F);
355 Changed |= setDoesNotThrow(F);
356 Changed |= setDoesNotCapture(F, 0);
357 Changed |= setDoesNotCapture(F, 1);
358 Changed |= setOnlyReadsMemory(F, 0);
359 Changed |= setOnlyReadsMemory(F, 1);
361 case LibFunc_sprintf:
362 Changed |= setRetAndArgsNoUndef(F);
363 Changed |= setDoesNotThrow(F);
364 Changed |= setDoesNotCapture(F, 0);
365 Changed |= setDoesNotAlias(F, 0);
366 Changed |= setOnlyWritesMemory(F, 0);
367 Changed |= setDoesNotCapture(F, 1);
368 Changed |= setOnlyReadsMemory(F, 1);
370 case LibFunc_snprintf:
371 Changed |= setRetAndArgsNoUndef(F);
372 Changed |= setDoesNotThrow(F);
373 Changed |= setDoesNotCapture(F, 0);
374 Changed |= setDoesNotAlias(F, 0);
375 Changed |= setOnlyWritesMemory(F, 0);
376 Changed |= setDoesNotCapture(F, 2);
377 Changed |= setOnlyReadsMemory(F, 2);
379 case LibFunc_setitimer:
380 Changed |= setRetAndArgsNoUndef(F);
381 Changed |= setDoesNotThrow(F);
382 Changed |= setWillReturn(F);
383 Changed |= setDoesNotCapture(F, 1);
384 Changed |= setDoesNotCapture(F, 2);
385 Changed |= setOnlyReadsMemory(F, 1);
388 // May throw; "system" is a valid pthread cancellation point.
389 Changed |= setRetAndArgsNoUndef(F);
390 Changed |= setDoesNotCapture(F, 0);
391 Changed |= setOnlyReadsMemory(F, 0);
394 Changed |= setOnlyAccessesInaccessibleMemory(F);
395 Changed |= setRetNoUndef(F);
396 Changed |= setDoesNotThrow(F);
397 Changed |= setRetDoesNotAlias(F);
398 Changed |= setWillReturn(F);
401 Changed |= setOnlyAccessesArgMemory(F);
402 Changed |= setOnlyReadsMemory(F);
403 Changed |= setDoesNotThrow(F);
404 Changed |= setWillReturn(F);
405 Changed |= setDoesNotCapture(F, 0);
406 Changed |= setDoesNotCapture(F, 1);
409 case LibFunc_memrchr:
410 Changed |= setDoesNotThrow(F);
411 Changed |= setOnlyAccessesArgMemory(F);
412 Changed |= setOnlyReadsMemory(F);
413 Changed |= setWillReturn(F);
418 Changed |= setDoesNotThrow(F);
419 Changed |= setWillReturn(F);
420 Changed |= setDoesNotCapture(F, 1);
423 Changed |= setDoesNotThrow(F);
424 Changed |= setOnlyAccessesArgMemory(F);
425 Changed |= setWillReturn(F);
426 Changed |= setDoesNotAlias(F, 0);
427 Changed |= setReturnedArg(F, 0);
428 Changed |= setOnlyWritesMemory(F, 0);
429 Changed |= setDoesNotAlias(F, 1);
430 Changed |= setDoesNotCapture(F, 1);
431 Changed |= setOnlyReadsMemory(F, 1);
433 case LibFunc_memmove:
434 Changed |= setDoesNotThrow(F);
435 Changed |= setOnlyAccessesArgMemory(F);
436 Changed |= setWillReturn(F);
437 Changed |= setReturnedArg(F, 0);
438 Changed |= setOnlyWritesMemory(F, 0);
439 Changed |= setDoesNotCapture(F, 1);
440 Changed |= setOnlyReadsMemory(F, 1);
442 case LibFunc_mempcpy:
443 case LibFunc_memccpy:
444 Changed |= setDoesNotThrow(F);
445 Changed |= setOnlyAccessesArgMemory(F);
446 Changed |= setWillReturn(F);
447 Changed |= setDoesNotAlias(F, 0);
448 Changed |= setOnlyWritesMemory(F, 0);
449 Changed |= setDoesNotAlias(F, 1);
450 Changed |= setDoesNotCapture(F, 1);
451 Changed |= setOnlyReadsMemory(F, 1);
453 case LibFunc_memcpy_chk:
454 Changed |= setDoesNotThrow(F);
456 case LibFunc_memalign:
457 Changed |= setOnlyAccessesInaccessibleMemory(F);
458 Changed |= setRetNoUndef(F);
459 Changed |= setDoesNotThrow(F);
460 Changed |= setRetDoesNotAlias(F);
461 Changed |= setWillReturn(F);
464 Changed |= setRetAndArgsNoUndef(F);
465 Changed |= setDoesNotThrow(F);
466 Changed |= setDoesNotCapture(F, 0);
467 Changed |= setOnlyReadsMemory(F, 0);
470 Changed |= setRetAndArgsNoUndef(F);
471 Changed |= setDoesNotThrow(F);
472 Changed |= setWillReturn(F);
473 Changed |= setDoesNotCapture(F, 0);
475 case LibFunc_realloc:
476 Changed |= setOnlyAccessesInaccessibleMemOrArgMem(F);
477 Changed |= setRetNoUndef(F);
478 Changed |= setDoesNotThrow(F);
479 Changed |= setRetDoesNotAlias(F);
480 Changed |= setWillReturn(F);
481 Changed |= setDoesNotCapture(F, 0);
483 case LibFunc_reallocf:
484 Changed |= setRetNoUndef(F);
485 Changed |= setWillReturn(F);
488 // May throw; "read" is a valid pthread cancellation point.
489 Changed |= setRetAndArgsNoUndef(F);
490 Changed |= setDoesNotCapture(F, 1);
493 Changed |= setRetAndArgsNoUndef(F);
494 Changed |= setDoesNotThrow(F);
495 Changed |= setDoesNotCapture(F, 0);
499 case LibFunc_realpath:
500 Changed |= setRetAndArgsNoUndef(F);
501 Changed |= setDoesNotThrow(F);
502 Changed |= setDoesNotCapture(F, 0);
503 Changed |= setOnlyReadsMemory(F, 0);
506 Changed |= setRetAndArgsNoUndef(F);
507 Changed |= setDoesNotThrow(F);
508 Changed |= setDoesNotCapture(F, 0);
509 Changed |= setDoesNotCapture(F, 1);
510 Changed |= setOnlyReadsMemory(F, 0);
511 Changed |= setOnlyReadsMemory(F, 1);
513 case LibFunc_readlink:
514 Changed |= setRetAndArgsNoUndef(F);
515 Changed |= setDoesNotThrow(F);
516 Changed |= setDoesNotCapture(F, 0);
517 Changed |= setDoesNotCapture(F, 1);
518 Changed |= setOnlyReadsMemory(F, 0);
521 // May throw; "write" is a valid pthread cancellation point.
522 Changed |= setRetAndArgsNoUndef(F);
523 Changed |= setDoesNotCapture(F, 1);
524 Changed |= setOnlyReadsMemory(F, 1);
526 case LibFunc_aligned_alloc:
527 Changed |= setOnlyAccessesInaccessibleMemory(F);
528 Changed |= setRetNoUndef(F);
529 Changed |= setDoesNotThrow(F);
530 Changed |= setRetDoesNotAlias(F);
531 Changed |= setWillReturn(F);
534 Changed |= setDoesNotThrow(F);
535 Changed |= setOnlyAccessesArgMemory(F);
536 Changed |= setWillReturn(F);
537 Changed |= setDoesNotCapture(F, 0);
538 Changed |= setOnlyReadsMemory(F, 0);
539 Changed |= setOnlyWritesMemory(F, 1);
540 Changed |= setDoesNotCapture(F, 1);
543 Changed |= setDoesNotThrow(F);
544 Changed |= setOnlyAccessesArgMemory(F);
545 Changed |= setOnlyReadsMemory(F);
546 Changed |= setWillReturn(F);
547 Changed |= setDoesNotCapture(F, 0);
548 Changed |= setDoesNotCapture(F, 1);
551 Changed |= setDoesNotThrow(F);
552 Changed |= setOnlyAccessesArgMemory(F);
553 Changed |= setWillReturn(F);
554 Changed |= setDoesNotCapture(F, 0);
555 Changed |= setOnlyWritesMemory(F, 0);
558 Changed |= setOnlyAccessesInaccessibleMemory(F);
559 Changed |= setRetNoUndef(F);
560 Changed |= setDoesNotThrow(F);
561 Changed |= setRetDoesNotAlias(F);
562 Changed |= setWillReturn(F);
566 Changed |= setRetAndArgsNoUndef(F);
567 Changed |= setDoesNotThrow(F);
568 Changed |= setDoesNotCapture(F, 0);
569 Changed |= setOnlyReadsMemory(F, 0);
571 case LibFunc_ctermid:
572 case LibFunc_clearerr:
573 case LibFunc_closedir:
574 Changed |= setRetAndArgsNoUndef(F);
575 Changed |= setDoesNotThrow(F);
576 Changed |= setDoesNotCapture(F, 0);
582 Changed |= setDoesNotThrow(F);
583 Changed |= setOnlyReadsMemory(F);
584 Changed |= setWillReturn(F);
585 Changed |= setDoesNotCapture(F, 0);
588 Changed |= setRetAndArgsNoUndef(F);
589 Changed |= setDoesNotThrow(F);
590 Changed |= setDoesNotCapture(F, 0);
591 Changed |= setOnlyReadsMemory(F, 0);
594 Changed |= setRetAndArgsNoUndef(F);
595 Changed |= setDoesNotThrow(F);
596 Changed |= setRetDoesNotAlias(F);
597 Changed |= setDoesNotCapture(F, 0);
598 Changed |= setDoesNotCapture(F, 1);
599 Changed |= setOnlyReadsMemory(F, 0);
600 Changed |= setOnlyReadsMemory(F, 1);
603 Changed |= setRetAndArgsNoUndef(F);
604 Changed |= setDoesNotThrow(F);
605 Changed |= setRetDoesNotAlias(F);
606 Changed |= setDoesNotCapture(F, 1);
607 Changed |= setOnlyReadsMemory(F, 1);
610 Changed |= setRetAndArgsNoUndef(F);
611 Changed |= setDoesNotThrow(F);
612 Changed |= setDoesNotCapture(F, 0);
615 Changed |= setOnlyAccessesInaccessibleMemOrArgMem(F);
616 Changed |= setArgsNoUndef(F);
617 Changed |= setDoesNotThrow(F);
618 Changed |= setWillReturn(F);
619 Changed |= setDoesNotCapture(F, 0);
624 case LibFunc_fgetc_unlocked:
630 case LibFunc_fsetpos:
631 case LibFunc_flockfile:
632 case LibFunc_funlockfile:
633 case LibFunc_ftrylockfile:
634 Changed |= setRetAndArgsNoUndef(F);
635 Changed |= setDoesNotThrow(F);
636 Changed |= setDoesNotCapture(F, 0);
639 Changed |= setRetAndArgsNoUndef(F);
640 Changed |= setDoesNotThrow(F);
641 Changed |= setDoesNotCapture(F, 0);
642 Changed |= setOnlyReadsMemory(F);
645 case LibFunc_fputc_unlocked:
647 Changed |= setRetAndArgsNoUndef(F);
648 Changed |= setDoesNotThrow(F);
649 Changed |= setDoesNotCapture(F, 1);
654 Changed |= setDoesNotThrow(F);
655 Changed |= setWillReturn(F);
656 Changed |= setDoesNotCapture(F, 1);
658 case LibFunc_fstatvfs:
659 Changed |= setRetAndArgsNoUndef(F);
660 Changed |= setDoesNotThrow(F);
661 Changed |= setDoesNotCapture(F, 1);
664 case LibFunc_fgets_unlocked:
665 Changed |= setRetAndArgsNoUndef(F);
666 Changed |= setDoesNotThrow(F);
667 Changed |= setDoesNotCapture(F, 2);
670 case LibFunc_fread_unlocked:
671 Changed |= setRetAndArgsNoUndef(F);
672 Changed |= setDoesNotThrow(F);
673 Changed |= setDoesNotCapture(F, 0);
674 Changed |= setDoesNotCapture(F, 3);
677 case LibFunc_fwrite_unlocked:
678 Changed |= setRetAndArgsNoUndef(F);
679 Changed |= setDoesNotThrow(F);
680 Changed |= setDoesNotCapture(F, 0);
681 Changed |= setDoesNotCapture(F, 3);
682 // FIXME: readonly #1?
685 case LibFunc_fputs_unlocked:
686 Changed |= setRetAndArgsNoUndef(F);
687 Changed |= setDoesNotThrow(F);
688 Changed |= setDoesNotCapture(F, 0);
689 Changed |= setDoesNotCapture(F, 1);
690 Changed |= setOnlyReadsMemory(F, 0);
693 case LibFunc_fprintf:
694 Changed |= setRetAndArgsNoUndef(F);
695 Changed |= setDoesNotThrow(F);
696 Changed |= setDoesNotCapture(F, 0);
697 Changed |= setDoesNotCapture(F, 1);
698 Changed |= setOnlyReadsMemory(F, 1);
700 case LibFunc_fgetpos:
701 Changed |= setRetAndArgsNoUndef(F);
702 Changed |= setDoesNotThrow(F);
703 Changed |= setDoesNotCapture(F, 0);
704 Changed |= setDoesNotCapture(F, 1);
707 Changed |= setRetAndArgsNoUndef(F);
708 Changed |= setDoesNotThrow(F);
709 Changed |= setDoesNotCapture(F, 0);
711 case LibFunc_getlogin_r:
712 Changed |= setRetAndArgsNoUndef(F);
713 Changed |= setDoesNotThrow(F);
714 Changed |= setDoesNotCapture(F, 0);
716 case LibFunc_getc_unlocked:
717 Changed |= setRetAndArgsNoUndef(F);
718 Changed |= setDoesNotThrow(F);
719 Changed |= setDoesNotCapture(F, 0);
722 Changed |= setRetAndArgsNoUndef(F);
723 Changed |= setDoesNotThrow(F);
724 Changed |= setOnlyReadsMemory(F);
725 Changed |= setDoesNotCapture(F, 0);
728 case LibFunc_getchar:
729 case LibFunc_getchar_unlocked:
730 Changed |= setRetAndArgsNoUndef(F);
731 Changed |= setDoesNotThrow(F);
733 case LibFunc_getitimer:
734 Changed |= setRetAndArgsNoUndef(F);
735 Changed |= setDoesNotThrow(F);
736 Changed |= setDoesNotCapture(F, 1);
738 case LibFunc_getpwnam:
739 Changed |= setRetAndArgsNoUndef(F);
740 Changed |= setDoesNotThrow(F);
741 Changed |= setDoesNotCapture(F, 0);
742 Changed |= setOnlyReadsMemory(F, 0);
745 Changed |= setRetAndArgsNoUndef(F);
746 Changed |= setDoesNotThrow(F);
747 Changed |= setDoesNotCapture(F, 1);
750 Changed |= setRetAndArgsNoUndef(F);
751 Changed |= setDoesNotThrow(F);
752 Changed |= setDoesNotCapture(F, 0);
755 Changed |= setRetAndArgsNoUndef(F);
756 Changed |= setDoesNotThrow(F);
757 Changed |= setDoesNotCapture(F, 0);
758 Changed |= setOnlyReadsMemory(F, 0);
760 case LibFunc_unsetenv:
761 Changed |= setRetAndArgsNoUndef(F);
762 Changed |= setDoesNotThrow(F);
763 Changed |= setDoesNotCapture(F, 0);
764 Changed |= setOnlyReadsMemory(F, 0);
768 Changed |= setRetAndArgsNoUndef(F);
769 Changed |= setDoesNotThrow(F);
770 Changed |= setDoesNotCapture(F, 0);
771 Changed |= setDoesNotCapture(F, 1);
772 Changed |= setOnlyReadsMemory(F, 0);
773 Changed |= setOnlyReadsMemory(F, 1);
776 case LibFunc_putc_unlocked:
777 Changed |= setRetAndArgsNoUndef(F);
778 Changed |= setDoesNotThrow(F);
779 Changed |= setDoesNotCapture(F, 1);
784 Changed |= setRetAndArgsNoUndef(F);
785 Changed |= setDoesNotThrow(F);
786 Changed |= setDoesNotCapture(F, 0);
787 Changed |= setOnlyReadsMemory(F, 0);
790 // May throw; "pread" is a valid pthread cancellation point.
791 Changed |= setRetAndArgsNoUndef(F);
792 Changed |= setDoesNotCapture(F, 1);
795 // May throw; "pwrite" is a valid pthread cancellation point.
796 Changed |= setRetAndArgsNoUndef(F);
797 Changed |= setDoesNotCapture(F, 1);
798 Changed |= setOnlyReadsMemory(F, 1);
800 case LibFunc_putchar:
801 case LibFunc_putchar_unlocked:
802 Changed |= setRetAndArgsNoUndef(F);
803 Changed |= setDoesNotThrow(F);
806 Changed |= setRetAndArgsNoUndef(F);
807 Changed |= setDoesNotThrow(F);
808 Changed |= setRetDoesNotAlias(F);
809 Changed |= setDoesNotCapture(F, 0);
810 Changed |= setDoesNotCapture(F, 1);
811 Changed |= setOnlyReadsMemory(F, 0);
812 Changed |= setOnlyReadsMemory(F, 1);
815 Changed |= setRetAndArgsNoUndef(F);
816 Changed |= setDoesNotThrow(F);
817 Changed |= setDoesNotCapture(F, 0);
820 Changed |= setRetAndArgsNoUndef(F);
821 Changed |= setDoesNotThrow(F);
822 Changed |= setDoesNotCapture(F, 0);
823 Changed |= setOnlyReadsMemory(F, 0);
825 case LibFunc_vsscanf:
826 Changed |= setRetAndArgsNoUndef(F);
827 Changed |= setDoesNotThrow(F);
828 Changed |= setDoesNotCapture(F, 0);
829 Changed |= setDoesNotCapture(F, 1);
830 Changed |= setOnlyReadsMemory(F, 0);
831 Changed |= setOnlyReadsMemory(F, 1);
833 case LibFunc_vfscanf:
834 Changed |= setRetAndArgsNoUndef(F);
835 Changed |= setDoesNotThrow(F);
836 Changed |= setDoesNotCapture(F, 0);
837 Changed |= setDoesNotCapture(F, 1);
838 Changed |= setOnlyReadsMemory(F, 1);
841 Changed |= setOnlyAccessesInaccessibleMemory(F);
842 Changed |= setRetNoUndef(F);
843 Changed |= setDoesNotThrow(F);
844 Changed |= setRetDoesNotAlias(F);
845 Changed |= setWillReturn(F);
847 case LibFunc_vprintf:
848 Changed |= setRetAndArgsNoUndef(F);
849 Changed |= setDoesNotThrow(F);
850 Changed |= setDoesNotCapture(F, 0);
851 Changed |= setOnlyReadsMemory(F, 0);
853 case LibFunc_vfprintf:
854 case LibFunc_vsprintf:
855 Changed |= setRetAndArgsNoUndef(F);
856 Changed |= setDoesNotThrow(F);
857 Changed |= setDoesNotCapture(F, 0);
858 Changed |= setDoesNotCapture(F, 1);
859 Changed |= setOnlyReadsMemory(F, 1);
861 case LibFunc_vsnprintf:
862 Changed |= setRetAndArgsNoUndef(F);
863 Changed |= setDoesNotThrow(F);
864 Changed |= setDoesNotCapture(F, 0);
865 Changed |= setDoesNotCapture(F, 2);
866 Changed |= setOnlyReadsMemory(F, 2);
869 // May throw; "open" is a valid pthread cancellation point.
870 Changed |= setRetAndArgsNoUndef(F);
871 Changed |= setDoesNotCapture(F, 0);
872 Changed |= setOnlyReadsMemory(F, 0);
874 case LibFunc_opendir:
875 Changed |= setRetAndArgsNoUndef(F);
876 Changed |= setDoesNotThrow(F);
877 Changed |= setRetDoesNotAlias(F);
878 Changed |= setDoesNotCapture(F, 0);
879 Changed |= setOnlyReadsMemory(F, 0);
881 case LibFunc_tmpfile:
882 Changed |= setRetAndArgsNoUndef(F);
883 Changed |= setDoesNotThrow(F);
884 Changed |= setRetDoesNotAlias(F);
887 Changed |= setRetAndArgsNoUndef(F);
888 Changed |= setDoesNotThrow(F);
889 Changed |= setDoesNotCapture(F, 0);
895 Changed |= setDoesNotThrow(F);
896 Changed |= setDoesNotAccessMemory(F);
899 Changed |= setRetAndArgsNoUndef(F);
900 Changed |= setDoesNotThrow(F);
901 Changed |= setDoesNotCapture(F, 0);
902 Changed |= setDoesNotCapture(F, 1);
903 Changed |= setOnlyReadsMemory(F, 0);
906 Changed |= setRetAndArgsNoUndef(F);
907 Changed |= setDoesNotThrow(F);
908 Changed |= setDoesNotCapture(F, 0);
909 Changed |= setOnlyReadsMemory(F, 0);
912 // May throw; places call through function pointer.
913 // Cannot give undef pointer/size
914 Changed |= setRetAndArgsNoUndef(F);
915 Changed |= setDoesNotCapture(F, 3);
917 case LibFunc_dunder_strdup:
918 case LibFunc_dunder_strndup:
919 Changed |= setDoesNotThrow(F);
920 Changed |= setRetDoesNotAlias(F);
921 Changed |= setWillReturn(F);
922 Changed |= setDoesNotCapture(F, 0);
923 Changed |= setOnlyReadsMemory(F, 0);
925 case LibFunc_dunder_strtok_r:
926 Changed |= setDoesNotThrow(F);
927 Changed |= setDoesNotCapture(F, 1);
928 Changed |= setOnlyReadsMemory(F, 1);
930 case LibFunc_under_IO_getc:
931 Changed |= setRetAndArgsNoUndef(F);
932 Changed |= setDoesNotThrow(F);
933 Changed |= setDoesNotCapture(F, 0);
935 case LibFunc_under_IO_putc:
936 Changed |= setRetAndArgsNoUndef(F);
937 Changed |= setDoesNotThrow(F);
938 Changed |= setDoesNotCapture(F, 1);
940 case LibFunc_dunder_isoc99_scanf:
941 Changed |= setRetAndArgsNoUndef(F);
942 Changed |= setDoesNotThrow(F);
943 Changed |= setDoesNotCapture(F, 0);
944 Changed |= setOnlyReadsMemory(F, 0);
947 case LibFunc_lstat64:
948 case LibFunc_statvfs64:
949 Changed |= setRetAndArgsNoUndef(F);
950 Changed |= setDoesNotThrow(F);
951 Changed |= setDoesNotCapture(F, 0);
952 Changed |= setDoesNotCapture(F, 1);
953 Changed |= setOnlyReadsMemory(F, 0);
955 case LibFunc_dunder_isoc99_sscanf:
956 Changed |= setRetAndArgsNoUndef(F);
957 Changed |= setDoesNotThrow(F);
958 Changed |= setDoesNotCapture(F, 0);
959 Changed |= setDoesNotCapture(F, 1);
960 Changed |= setOnlyReadsMemory(F, 0);
961 Changed |= setOnlyReadsMemory(F, 1);
963 case LibFunc_fopen64:
964 Changed |= setRetAndArgsNoUndef(F);
965 Changed |= setDoesNotThrow(F);
966 Changed |= setRetDoesNotAlias(F);
967 Changed |= setDoesNotCapture(F, 0);
968 Changed |= setDoesNotCapture(F, 1);
969 Changed |= setOnlyReadsMemory(F, 0);
970 Changed |= setOnlyReadsMemory(F, 1);
972 case LibFunc_fseeko64:
973 case LibFunc_ftello64:
974 Changed |= setRetAndArgsNoUndef(F);
975 Changed |= setDoesNotThrow(F);
976 Changed |= setDoesNotCapture(F, 0);
978 case LibFunc_tmpfile64:
979 Changed |= setRetAndArgsNoUndef(F);
980 Changed |= setDoesNotThrow(F);
981 Changed |= setRetDoesNotAlias(F);
983 case LibFunc_fstat64:
984 case LibFunc_fstatvfs64:
985 Changed |= setRetAndArgsNoUndef(F);
986 Changed |= setDoesNotThrow(F);
987 Changed |= setDoesNotCapture(F, 1);
990 // May throw; "open" is a valid pthread cancellation point.
991 Changed |= setRetAndArgsNoUndef(F);
992 Changed |= setDoesNotCapture(F, 0);
993 Changed |= setOnlyReadsMemory(F, 0);
995 case LibFunc_gettimeofday:
996 // Currently some platforms have the restrict keyword on the arguments to
997 // gettimeofday. To be conservative, do not add noalias to gettimeofday's
999 Changed |= setRetAndArgsNoUndef(F);
1000 Changed |= setDoesNotThrow(F);
1001 Changed |= setDoesNotCapture(F, 0);
1002 Changed |= setDoesNotCapture(F, 1);
1004 case LibFunc_Znwj: // new(unsigned int)
1005 case LibFunc_Znwm: // new(unsigned long)
1006 case LibFunc_Znaj: // new[](unsigned int)
1007 case LibFunc_Znam: // new[](unsigned long)
1008 case LibFunc_msvc_new_int: // new(unsigned int)
1009 case LibFunc_msvc_new_longlong: // new(unsigned long long)
1010 case LibFunc_msvc_new_array_int: // new[](unsigned int)
1011 case LibFunc_msvc_new_array_longlong: // new[](unsigned long long)
1012 Changed |= setOnlyAccessesInaccessibleMemory(F);
1013 // Operator new always returns a nonnull noalias pointer
1014 Changed |= setRetNoUndef(F);
1015 Changed |= setRetNonNull(F);
1016 Changed |= setRetDoesNotAlias(F);
1017 Changed |= setWillReturn(F);
1019 // TODO: add LibFunc entries for:
1020 // case LibFunc_memset_pattern4:
1021 // case LibFunc_memset_pattern8:
1022 case LibFunc_memset_pattern16:
1023 Changed |= setOnlyAccessesArgMemory(F);
1024 Changed |= setDoesNotCapture(F, 0);
1025 Changed |= setOnlyWritesMemory(F, 0);
1026 Changed |= setDoesNotCapture(F, 1);
1027 Changed |= setOnlyReadsMemory(F, 1);
1029 case LibFunc_memset:
1030 Changed |= setOnlyAccessesArgMemory(F);
1031 Changed |= setWillReturn(F);
1032 Changed |= setDoesNotThrow(F);
1033 Changed |= setOnlyWritesMemory(F, 0);
1035 // int __nvvm_reflect(const char *)
1036 case LibFunc_nvvm_reflect:
1037 Changed |= setRetAndArgsNoUndef(F);
1038 Changed |= setDoesNotAccessMemory(F);
1039 Changed |= setDoesNotThrow(F);
1042 case LibFunc_ldexpf:
1043 case LibFunc_ldexpl:
1044 Changed |= setSignExtendedArg(F, 1);
1045 Changed |= setWillReturn(F);
1051 case LibFunc_acoshf:
1052 case LibFunc_acoshl:
1057 case LibFunc_asinhf:
1058 case LibFunc_asinhl:
1062 case LibFunc_atan2f:
1063 case LibFunc_atan2l:
1066 case LibFunc_atanhf:
1067 case LibFunc_atanhl:
1075 case LibFunc_copysign:
1076 case LibFunc_copysignf:
1077 case LibFunc_copysignl:
1085 case LibFunc_cospif:
1093 case LibFunc_expm1f:
1094 case LibFunc_expm1l:
1102 case LibFunc_floorf:
1103 case LibFunc_floorl:
1116 case LibFunc_isascii:
1117 case LibFunc_isdigit:
1122 case LibFunc_log10f:
1123 case LibFunc_log10l:
1125 case LibFunc_log1pf:
1126 case LibFunc_log1pl:
1135 case LibFunc_nearbyint:
1136 case LibFunc_nearbyintf:
1137 case LibFunc_nearbyintl:
1145 case LibFunc_roundf:
1146 case LibFunc_roundl:
1148 case LibFunc_sincospif_stret:
1155 case LibFunc_sinpif:
1159 case LibFunc_strnlen:
1166 case LibFunc_toascii:
1168 case LibFunc_truncf:
1169 case LibFunc_truncl:
1170 Changed |= setDoesNotThrow(F);
1171 Changed |= setDoesNotFreeMemory(F);
1172 Changed |= setWillReturn(F);
1175 // FIXME: It'd be really nice to cover all the library functions we're
1181 bool llvm::hasFloatFn(const TargetLibraryInfo *TLI, Type *Ty,
1182 LibFunc DoubleFn, LibFunc FloatFn, LibFunc LongDoubleFn) {
1183 switch (Ty->getTypeID()) {
1184 case Type::HalfTyID:
1186 case Type::FloatTyID:
1187 return TLI->has(FloatFn);
1188 case Type::DoubleTyID:
1189 return TLI->has(DoubleFn);
1191 return TLI->has(LongDoubleFn);
1195 StringRef llvm::getFloatFnName(const TargetLibraryInfo *TLI, Type *Ty,
1196 LibFunc DoubleFn, LibFunc FloatFn,
1197 LibFunc LongDoubleFn) {
1198 assert(hasFloatFn(TLI, Ty, DoubleFn, FloatFn, LongDoubleFn) &&
1199 "Cannot get name for unavailable function!");
1201 switch (Ty->getTypeID()) {
1202 case Type::HalfTyID:
1203 llvm_unreachable("No name for HalfTy!");
1204 case Type::FloatTyID:
1205 return TLI->getName(FloatFn);
1206 case Type::DoubleTyID:
1207 return TLI->getName(DoubleFn);
1209 return TLI->getName(LongDoubleFn);
1213 //- Emit LibCalls ------------------------------------------------------------//
1215 Value *llvm::castToCStr(Value *V, IRBuilderBase &B) {
1216 unsigned AS = V->getType()->getPointerAddressSpace();
1217 return B.CreateBitCast(V, B.getInt8PtrTy(AS), "cstr");
1220 static Value *emitLibCall(LibFunc TheLibFunc, Type *ReturnType,
1221 ArrayRef<Type *> ParamTypes,
1222 ArrayRef<Value *> Operands, IRBuilderBase &B,
1223 const TargetLibraryInfo *TLI,
1224 bool IsVaArgs = false) {
1225 if (!TLI->has(TheLibFunc))
1228 Module *M = B.GetInsertBlock()->getModule();
1229 StringRef FuncName = TLI->getName(TheLibFunc);
1230 FunctionType *FuncType = FunctionType::get(ReturnType, ParamTypes, IsVaArgs);
1231 FunctionCallee Callee = M->getOrInsertFunction(FuncName, FuncType);
1232 inferLibFuncAttributes(M, FuncName, *TLI);
1233 CallInst *CI = B.CreateCall(Callee, Operands, FuncName);
1234 if (const Function *F =
1235 dyn_cast<Function>(Callee.getCallee()->stripPointerCasts()))
1236 CI->setCallingConv(F->getCallingConv());
1240 Value *llvm::emitStrLen(Value *Ptr, IRBuilderBase &B, const DataLayout &DL,
1241 const TargetLibraryInfo *TLI) {
1242 LLVMContext &Context = B.GetInsertBlock()->getContext();
1243 return emitLibCall(LibFunc_strlen, DL.getIntPtrType(Context),
1244 B.getInt8PtrTy(), castToCStr(Ptr, B), B, TLI);
1247 Value *llvm::emitStrDup(Value *Ptr, IRBuilderBase &B,
1248 const TargetLibraryInfo *TLI) {
1249 return emitLibCall(LibFunc_strdup, B.getInt8PtrTy(), B.getInt8PtrTy(),
1250 castToCStr(Ptr, B), B, TLI);
1253 Value *llvm::emitStrChr(Value *Ptr, char C, IRBuilderBase &B,
1254 const TargetLibraryInfo *TLI) {
1255 Type *I8Ptr = B.getInt8PtrTy();
1256 Type *I32Ty = B.getInt32Ty();
1257 return emitLibCall(LibFunc_strchr, I8Ptr, {I8Ptr, I32Ty},
1258 {castToCStr(Ptr, B), ConstantInt::get(I32Ty, C)}, B, TLI);
1261 Value *llvm::emitStrNCmp(Value *Ptr1, Value *Ptr2, Value *Len, IRBuilderBase &B,
1262 const DataLayout &DL, const TargetLibraryInfo *TLI) {
1263 LLVMContext &Context = B.GetInsertBlock()->getContext();
1265 LibFunc_strncmp, B.getInt32Ty(),
1266 {B.getInt8PtrTy(), B.getInt8PtrTy(), DL.getIntPtrType(Context)},
1267 {castToCStr(Ptr1, B), castToCStr(Ptr2, B), Len}, B, TLI);
1270 Value *llvm::emitStrCpy(Value *Dst, Value *Src, IRBuilderBase &B,
1271 const TargetLibraryInfo *TLI) {
1272 Type *I8Ptr = B.getInt8PtrTy();
1273 return emitLibCall(LibFunc_strcpy, I8Ptr, {I8Ptr, I8Ptr},
1274 {castToCStr(Dst, B), castToCStr(Src, B)}, B, TLI);
1277 Value *llvm::emitStpCpy(Value *Dst, Value *Src, IRBuilderBase &B,
1278 const TargetLibraryInfo *TLI) {
1279 Type *I8Ptr = B.getInt8PtrTy();
1280 return emitLibCall(LibFunc_stpcpy, I8Ptr, {I8Ptr, I8Ptr},
1281 {castToCStr(Dst, B), castToCStr(Src, B)}, B, TLI);
1284 Value *llvm::emitStrNCpy(Value *Dst, Value *Src, Value *Len, IRBuilderBase &B,
1285 const TargetLibraryInfo *TLI) {
1286 Type *I8Ptr = B.getInt8PtrTy();
1287 return emitLibCall(LibFunc_strncpy, I8Ptr, {I8Ptr, I8Ptr, Len->getType()},
1288 {castToCStr(Dst, B), castToCStr(Src, B), Len}, B, TLI);
1291 Value *llvm::emitStpNCpy(Value *Dst, Value *Src, Value *Len, IRBuilderBase &B,
1292 const TargetLibraryInfo *TLI) {
1293 Type *I8Ptr = B.getInt8PtrTy();
1294 return emitLibCall(LibFunc_stpncpy, I8Ptr, {I8Ptr, I8Ptr, Len->getType()},
1295 {castToCStr(Dst, B), castToCStr(Src, B), Len}, B, TLI);
1298 Value *llvm::emitMemCpyChk(Value *Dst, Value *Src, Value *Len, Value *ObjSize,
1299 IRBuilderBase &B, const DataLayout &DL,
1300 const TargetLibraryInfo *TLI) {
1301 if (!TLI->has(LibFunc_memcpy_chk))
1304 Module *M = B.GetInsertBlock()->getModule();
1306 AS = AttributeList::get(M->getContext(), AttributeList::FunctionIndex,
1307 Attribute::NoUnwind);
1308 LLVMContext &Context = B.GetInsertBlock()->getContext();
1309 FunctionCallee MemCpy = M->getOrInsertFunction(
1310 "__memcpy_chk", AttributeList::get(M->getContext(), AS), B.getInt8PtrTy(),
1311 B.getInt8PtrTy(), B.getInt8PtrTy(), DL.getIntPtrType(Context),
1312 DL.getIntPtrType(Context));
1313 Dst = castToCStr(Dst, B);
1314 Src = castToCStr(Src, B);
1315 CallInst *CI = B.CreateCall(MemCpy, {Dst, Src, Len, ObjSize});
1316 if (const Function *F =
1317 dyn_cast<Function>(MemCpy.getCallee()->stripPointerCasts()))
1318 CI->setCallingConv(F->getCallingConv());
1322 Value *llvm::emitMemPCpy(Value *Dst, Value *Src, Value *Len, IRBuilderBase &B,
1323 const DataLayout &DL, const TargetLibraryInfo *TLI) {
1324 LLVMContext &Context = B.GetInsertBlock()->getContext();
1326 LibFunc_mempcpy, B.getInt8PtrTy(),
1327 {B.getInt8PtrTy(), B.getInt8PtrTy(), DL.getIntPtrType(Context)},
1328 {Dst, Src, Len}, B, TLI);
1331 Value *llvm::emitMemChr(Value *Ptr, Value *Val, Value *Len, IRBuilderBase &B,
1332 const DataLayout &DL, const TargetLibraryInfo *TLI) {
1333 LLVMContext &Context = B.GetInsertBlock()->getContext();
1335 LibFunc_memchr, B.getInt8PtrTy(),
1336 {B.getInt8PtrTy(), B.getInt32Ty(), DL.getIntPtrType(Context)},
1337 {castToCStr(Ptr, B), Val, Len}, B, TLI);
1340 Value *llvm::emitMemCmp(Value *Ptr1, Value *Ptr2, Value *Len, IRBuilderBase &B,
1341 const DataLayout &DL, const TargetLibraryInfo *TLI) {
1342 LLVMContext &Context = B.GetInsertBlock()->getContext();
1344 LibFunc_memcmp, B.getInt32Ty(),
1345 {B.getInt8PtrTy(), B.getInt8PtrTy(), DL.getIntPtrType(Context)},
1346 {castToCStr(Ptr1, B), castToCStr(Ptr2, B), Len}, B, TLI);
1349 Value *llvm::emitBCmp(Value *Ptr1, Value *Ptr2, Value *Len, IRBuilderBase &B,
1350 const DataLayout &DL, const TargetLibraryInfo *TLI) {
1351 LLVMContext &Context = B.GetInsertBlock()->getContext();
1353 LibFunc_bcmp, B.getInt32Ty(),
1354 {B.getInt8PtrTy(), B.getInt8PtrTy(), DL.getIntPtrType(Context)},
1355 {castToCStr(Ptr1, B), castToCStr(Ptr2, B), Len}, B, TLI);
1358 Value *llvm::emitMemCCpy(Value *Ptr1, Value *Ptr2, Value *Val, Value *Len,
1359 IRBuilderBase &B, const TargetLibraryInfo *TLI) {
1361 LibFunc_memccpy, B.getInt8PtrTy(),
1362 {B.getInt8PtrTy(), B.getInt8PtrTy(), B.getInt32Ty(), Len->getType()},
1363 {Ptr1, Ptr2, Val, Len}, B, TLI);
1366 Value *llvm::emitSNPrintf(Value *Dest, Value *Size, Value *Fmt,
1367 ArrayRef<Value *> VariadicArgs, IRBuilderBase &B,
1368 const TargetLibraryInfo *TLI) {
1369 SmallVector<Value *, 8> Args{castToCStr(Dest, B), Size, castToCStr(Fmt, B)};
1370 llvm::append_range(Args, VariadicArgs);
1371 return emitLibCall(LibFunc_snprintf, B.getInt32Ty(),
1372 {B.getInt8PtrTy(), Size->getType(), B.getInt8PtrTy()},
1373 Args, B, TLI, /*IsVaArgs=*/true);
1376 Value *llvm::emitSPrintf(Value *Dest, Value *Fmt,
1377 ArrayRef<Value *> VariadicArgs, IRBuilderBase &B,
1378 const TargetLibraryInfo *TLI) {
1379 SmallVector<Value *, 8> Args{castToCStr(Dest, B), castToCStr(Fmt, B)};
1380 llvm::append_range(Args, VariadicArgs);
1381 return emitLibCall(LibFunc_sprintf, B.getInt32Ty(),
1382 {B.getInt8PtrTy(), B.getInt8PtrTy()}, Args, B, TLI,
1386 Value *llvm::emitStrCat(Value *Dest, Value *Src, IRBuilderBase &B,
1387 const TargetLibraryInfo *TLI) {
1388 return emitLibCall(LibFunc_strcat, B.getInt8PtrTy(),
1389 {B.getInt8PtrTy(), B.getInt8PtrTy()},
1390 {castToCStr(Dest, B), castToCStr(Src, B)}, B, TLI);
1393 Value *llvm::emitStrLCpy(Value *Dest, Value *Src, Value *Size, IRBuilderBase &B,
1394 const TargetLibraryInfo *TLI) {
1395 return emitLibCall(LibFunc_strlcpy, Size->getType(),
1396 {B.getInt8PtrTy(), B.getInt8PtrTy(), Size->getType()},
1397 {castToCStr(Dest, B), castToCStr(Src, B), Size}, B, TLI);
1400 Value *llvm::emitStrLCat(Value *Dest, Value *Src, Value *Size, IRBuilderBase &B,
1401 const TargetLibraryInfo *TLI) {
1402 return emitLibCall(LibFunc_strlcat, Size->getType(),
1403 {B.getInt8PtrTy(), B.getInt8PtrTy(), Size->getType()},
1404 {castToCStr(Dest, B), castToCStr(Src, B), Size}, B, TLI);
1407 Value *llvm::emitStrNCat(Value *Dest, Value *Src, Value *Size, IRBuilderBase &B,
1408 const TargetLibraryInfo *TLI) {
1409 return emitLibCall(LibFunc_strncat, B.getInt8PtrTy(),
1410 {B.getInt8PtrTy(), B.getInt8PtrTy(), Size->getType()},
1411 {castToCStr(Dest, B), castToCStr(Src, B), Size}, B, TLI);
1414 Value *llvm::emitVSNPrintf(Value *Dest, Value *Size, Value *Fmt, Value *VAList,
1415 IRBuilderBase &B, const TargetLibraryInfo *TLI) {
1417 LibFunc_vsnprintf, B.getInt32Ty(),
1418 {B.getInt8PtrTy(), Size->getType(), B.getInt8PtrTy(), VAList->getType()},
1419 {castToCStr(Dest, B), Size, castToCStr(Fmt, B), VAList}, B, TLI);
1422 Value *llvm::emitVSPrintf(Value *Dest, Value *Fmt, Value *VAList,
1423 IRBuilderBase &B, const TargetLibraryInfo *TLI) {
1424 return emitLibCall(LibFunc_vsprintf, B.getInt32Ty(),
1425 {B.getInt8PtrTy(), B.getInt8PtrTy(), VAList->getType()},
1426 {castToCStr(Dest, B), castToCStr(Fmt, B), VAList}, B, TLI);
1429 /// Append a suffix to the function name according to the type of 'Op'.
1430 static void appendTypeSuffix(Value *Op, StringRef &Name,
1431 SmallString<20> &NameBuffer) {
1432 if (!Op->getType()->isDoubleTy()) {
1435 if (Op->getType()->isFloatTy())
1444 static Value *emitUnaryFloatFnCallHelper(Value *Op, StringRef Name,
1446 const AttributeList &Attrs) {
1447 assert((Name != "") && "Must specify Name to emitUnaryFloatFnCall");
1449 Module *M = B.GetInsertBlock()->getModule();
1450 FunctionCallee Callee =
1451 M->getOrInsertFunction(Name, Op->getType(), Op->getType());
1452 CallInst *CI = B.CreateCall(Callee, Op, Name);
1454 // The incoming attribute set may have come from a speculatable intrinsic, but
1455 // is being replaced with a library call which is not allowed to be
1457 CI->setAttributes(Attrs.removeAttribute(B.getContext(),
1458 AttributeList::FunctionIndex,
1459 Attribute::Speculatable));
1460 if (const Function *F =
1461 dyn_cast<Function>(Callee.getCallee()->stripPointerCasts()))
1462 CI->setCallingConv(F->getCallingConv());
1467 Value *llvm::emitUnaryFloatFnCall(Value *Op, StringRef Name, IRBuilderBase &B,
1468 const AttributeList &Attrs) {
1469 SmallString<20> NameBuffer;
1470 appendTypeSuffix(Op, Name, NameBuffer);
1472 return emitUnaryFloatFnCallHelper(Op, Name, B, Attrs);
1475 Value *llvm::emitUnaryFloatFnCall(Value *Op, const TargetLibraryInfo *TLI,
1476 LibFunc DoubleFn, LibFunc FloatFn,
1477 LibFunc LongDoubleFn, IRBuilderBase &B,
1478 const AttributeList &Attrs) {
1479 // Get the name of the function according to TLI.
1480 StringRef Name = getFloatFnName(TLI, Op->getType(),
1481 DoubleFn, FloatFn, LongDoubleFn);
1483 return emitUnaryFloatFnCallHelper(Op, Name, B, Attrs);
1486 static Value *emitBinaryFloatFnCallHelper(Value *Op1, Value *Op2,
1487 StringRef Name, IRBuilderBase &B,
1488 const AttributeList &Attrs,
1489 const TargetLibraryInfo *TLI = nullptr) {
1490 assert((Name != "") && "Must specify Name to emitBinaryFloatFnCall");
1492 Module *M = B.GetInsertBlock()->getModule();
1493 FunctionCallee Callee = M->getOrInsertFunction(Name, Op1->getType(),
1494 Op1->getType(), Op2->getType());
1496 inferLibFuncAttributes(M, Name, *TLI);
1497 CallInst *CI = B.CreateCall(Callee, { Op1, Op2 }, Name);
1499 // The incoming attribute set may have come from a speculatable intrinsic, but
1500 // is being replaced with a library call which is not allowed to be
1502 CI->setAttributes(Attrs.removeAttribute(B.getContext(),
1503 AttributeList::FunctionIndex,
1504 Attribute::Speculatable));
1505 if (const Function *F =
1506 dyn_cast<Function>(Callee.getCallee()->stripPointerCasts()))
1507 CI->setCallingConv(F->getCallingConv());
1512 Value *llvm::emitBinaryFloatFnCall(Value *Op1, Value *Op2, StringRef Name,
1514 const AttributeList &Attrs) {
1515 assert((Name != "") && "Must specify Name to emitBinaryFloatFnCall");
1517 SmallString<20> NameBuffer;
1518 appendTypeSuffix(Op1, Name, NameBuffer);
1520 return emitBinaryFloatFnCallHelper(Op1, Op2, Name, B, Attrs);
1523 Value *llvm::emitBinaryFloatFnCall(Value *Op1, Value *Op2,
1524 const TargetLibraryInfo *TLI,
1525 LibFunc DoubleFn, LibFunc FloatFn,
1526 LibFunc LongDoubleFn, IRBuilderBase &B,
1527 const AttributeList &Attrs) {
1528 // Get the name of the function according to TLI.
1529 StringRef Name = getFloatFnName(TLI, Op1->getType(),
1530 DoubleFn, FloatFn, LongDoubleFn);
1532 return emitBinaryFloatFnCallHelper(Op1, Op2, Name, B, Attrs, TLI);
1535 Value *llvm::emitPutChar(Value *Char, IRBuilderBase &B,
1536 const TargetLibraryInfo *TLI) {
1537 if (!TLI->has(LibFunc_putchar))
1540 Module *M = B.GetInsertBlock()->getModule();
1541 StringRef PutCharName = TLI->getName(LibFunc_putchar);
1542 FunctionCallee PutChar =
1543 M->getOrInsertFunction(PutCharName, B.getInt32Ty(), B.getInt32Ty());
1544 inferLibFuncAttributes(M, PutCharName, *TLI);
1545 CallInst *CI = B.CreateCall(PutChar,
1546 B.CreateIntCast(Char,
1552 if (const Function *F =
1553 dyn_cast<Function>(PutChar.getCallee()->stripPointerCasts()))
1554 CI->setCallingConv(F->getCallingConv());
1558 Value *llvm::emitPutS(Value *Str, IRBuilderBase &B,
1559 const TargetLibraryInfo *TLI) {
1560 if (!TLI->has(LibFunc_puts))
1563 Module *M = B.GetInsertBlock()->getModule();
1564 StringRef PutsName = TLI->getName(LibFunc_puts);
1565 FunctionCallee PutS =
1566 M->getOrInsertFunction(PutsName, B.getInt32Ty(), B.getInt8PtrTy());
1567 inferLibFuncAttributes(M, PutsName, *TLI);
1568 CallInst *CI = B.CreateCall(PutS, castToCStr(Str, B), PutsName);
1569 if (const Function *F =
1570 dyn_cast<Function>(PutS.getCallee()->stripPointerCasts()))
1571 CI->setCallingConv(F->getCallingConv());
1575 Value *llvm::emitFPutC(Value *Char, Value *File, IRBuilderBase &B,
1576 const TargetLibraryInfo *TLI) {
1577 if (!TLI->has(LibFunc_fputc))
1580 Module *M = B.GetInsertBlock()->getModule();
1581 StringRef FPutcName = TLI->getName(LibFunc_fputc);
1582 FunctionCallee F = M->getOrInsertFunction(FPutcName, B.getInt32Ty(),
1583 B.getInt32Ty(), File->getType());
1584 if (File->getType()->isPointerTy())
1585 inferLibFuncAttributes(M, FPutcName, *TLI);
1586 Char = B.CreateIntCast(Char, B.getInt32Ty(), /*isSigned*/true,
1588 CallInst *CI = B.CreateCall(F, {Char, File}, FPutcName);
1590 if (const Function *Fn =
1591 dyn_cast<Function>(F.getCallee()->stripPointerCasts()))
1592 CI->setCallingConv(Fn->getCallingConv());
1596 Value *llvm::emitFPutS(Value *Str, Value *File, IRBuilderBase &B,
1597 const TargetLibraryInfo *TLI) {
1598 if (!TLI->has(LibFunc_fputs))
1601 Module *M = B.GetInsertBlock()->getModule();
1602 StringRef FPutsName = TLI->getName(LibFunc_fputs);
1603 FunctionCallee F = M->getOrInsertFunction(FPutsName, B.getInt32Ty(),
1604 B.getInt8PtrTy(), File->getType());
1605 if (File->getType()->isPointerTy())
1606 inferLibFuncAttributes(M, FPutsName, *TLI);
1607 CallInst *CI = B.CreateCall(F, {castToCStr(Str, B), File}, FPutsName);
1609 if (const Function *Fn =
1610 dyn_cast<Function>(F.getCallee()->stripPointerCasts()))
1611 CI->setCallingConv(Fn->getCallingConv());
1615 Value *llvm::emitFWrite(Value *Ptr, Value *Size, Value *File, IRBuilderBase &B,
1616 const DataLayout &DL, const TargetLibraryInfo *TLI) {
1617 if (!TLI->has(LibFunc_fwrite))
1620 Module *M = B.GetInsertBlock()->getModule();
1621 LLVMContext &Context = B.GetInsertBlock()->getContext();
1622 StringRef FWriteName = TLI->getName(LibFunc_fwrite);
1623 FunctionCallee F = M->getOrInsertFunction(
1624 FWriteName, DL.getIntPtrType(Context), B.getInt8PtrTy(),
1625 DL.getIntPtrType(Context), DL.getIntPtrType(Context), File->getType());
1627 if (File->getType()->isPointerTy())
1628 inferLibFuncAttributes(M, FWriteName, *TLI);
1630 B.CreateCall(F, {castToCStr(Ptr, B), Size,
1631 ConstantInt::get(DL.getIntPtrType(Context), 1), File});
1633 if (const Function *Fn =
1634 dyn_cast<Function>(F.getCallee()->stripPointerCasts()))
1635 CI->setCallingConv(Fn->getCallingConv());
1639 Value *llvm::emitMalloc(Value *Num, IRBuilderBase &B, const DataLayout &DL,
1640 const TargetLibraryInfo *TLI) {
1641 if (!TLI->has(LibFunc_malloc))
1644 Module *M = B.GetInsertBlock()->getModule();
1645 StringRef MallocName = TLI->getName(LibFunc_malloc);
1646 LLVMContext &Context = B.GetInsertBlock()->getContext();
1647 FunctionCallee Malloc = M->getOrInsertFunction(MallocName, B.getInt8PtrTy(),
1648 DL.getIntPtrType(Context));
1649 inferLibFuncAttributes(M, MallocName, *TLI);
1650 CallInst *CI = B.CreateCall(Malloc, Num, MallocName);
1652 if (const Function *F =
1653 dyn_cast<Function>(Malloc.getCallee()->stripPointerCasts()))
1654 CI->setCallingConv(F->getCallingConv());
1659 Value *llvm::emitCalloc(Value *Num, Value *Size, const AttributeList &Attrs,
1660 IRBuilderBase &B, const TargetLibraryInfo &TLI) {
1661 if (!TLI.has(LibFunc_calloc))
1664 Module *M = B.GetInsertBlock()->getModule();
1665 StringRef CallocName = TLI.getName(LibFunc_calloc);
1666 const DataLayout &DL = M->getDataLayout();
1667 IntegerType *PtrType = DL.getIntPtrType((B.GetInsertBlock()->getContext()));
1668 FunctionCallee Calloc = M->getOrInsertFunction(
1669 CallocName, Attrs, B.getInt8PtrTy(), PtrType, PtrType);
1670 inferLibFuncAttributes(M, CallocName, TLI);
1671 CallInst *CI = B.CreateCall(Calloc, {Num, Size}, CallocName);
1674 dyn_cast<Function>(Calloc.getCallee()->stripPointerCasts()))
1675 CI->setCallingConv(F->getCallingConv());