|
25 | 25 | #include "llvm/IR/Instructions.h"
|
26 | 26 | #include "llvm/IR/IntrinsicInst.h"
|
27 | 27 | #include "llvm/IR/Module.h"
|
| 28 | +#include "llvm/IR/RuntimeLibcalls.h" |
28 | 29 | #include "llvm/IR/Type.h"
|
29 | 30 | #include "llvm/IR/Use.h"
|
30 | 31 | #include "llvm/InitializePasses.h"
|
@@ -135,17 +136,22 @@ static CallInst::TailCallKind getOverridingTailCallKind(const Function &F) {
|
135 | 136 | return CallInst::TCK_None;
|
136 | 137 | }
|
137 | 138 |
|
138 |
| -static bool lowerObjCCall(Function &F, const char *NewFn, |
| 139 | +static bool lowerObjCCall(Function &F, RTLIB::LibcallImpl NewFn, |
139 | 140 | bool setNonLazyBind = false) {
|
140 | 141 | assert(IntrinsicInst::mayLowerToFunctionCall(F.getIntrinsicID()) &&
|
141 | 142 | "Pre-ISel intrinsics do lower into regular function calls");
|
142 | 143 | if (F.use_empty())
|
143 | 144 | return false;
|
144 | 145 |
|
| 146 | + // FIXME: When RuntimeLibcalls is an analysis, check if the function is really |
| 147 | + // supported, and go through RTLIB::Libcall. |
| 148 | + const char *NewFnName = RTLIB::RuntimeLibcallsInfo::getLibcallImplName(NewFn); |
| 149 | + |
145 | 150 | // If we haven't already looked up this function, check to see if the
|
146 | 151 | // program already contains a function with this name.
|
147 | 152 | Module *M = F.getParent();
|
148 |
| - FunctionCallee FCache = M->getOrInsertFunction(NewFn, F.getFunctionType()); |
| 153 | + FunctionCallee FCache = |
| 154 | + M->getOrInsertFunction(NewFnName, F.getFunctionType()); |
149 | 155 |
|
150 | 156 | if (Function *Fn = dyn_cast<Function>(FCache.getCallee())) {
|
151 | 157 | Fn->setLinkage(F.getLinkage());
|
@@ -501,82 +507,83 @@ bool PreISelIntrinsicLowering::lowerIntrinsics(Module &M) const {
|
501 | 507 | });
|
502 | 508 | break;
|
503 | 509 | case Intrinsic::objc_autorelease:
|
504 |
| - Changed |= lowerObjCCall(F, "objc_autorelease"); |
| 510 | + Changed |= lowerObjCCall(F, RTLIB::objc_autorelease); |
505 | 511 | break;
|
506 | 512 | case Intrinsic::objc_autoreleasePoolPop:
|
507 |
| - Changed |= lowerObjCCall(F, "objc_autoreleasePoolPop"); |
| 513 | + Changed |= lowerObjCCall(F, RTLIB::objc_autoreleasePoolPop); |
508 | 514 | break;
|
509 | 515 | case Intrinsic::objc_autoreleasePoolPush:
|
510 |
| - Changed |= lowerObjCCall(F, "objc_autoreleasePoolPush"); |
| 516 | + Changed |= lowerObjCCall(F, RTLIB::objc_autoreleasePoolPush); |
511 | 517 | break;
|
512 | 518 | case Intrinsic::objc_autoreleaseReturnValue:
|
513 |
| - Changed |= lowerObjCCall(F, "objc_autoreleaseReturnValue"); |
| 519 | + Changed |= lowerObjCCall(F, RTLIB::objc_autoreleaseReturnValue); |
514 | 520 | break;
|
515 | 521 | case Intrinsic::objc_copyWeak:
|
516 |
| - Changed |= lowerObjCCall(F, "objc_copyWeak"); |
| 522 | + Changed |= lowerObjCCall(F, RTLIB::objc_copyWeak); |
517 | 523 | break;
|
518 | 524 | case Intrinsic::objc_destroyWeak:
|
519 |
| - Changed |= lowerObjCCall(F, "objc_destroyWeak"); |
| 525 | + Changed |= lowerObjCCall(F, RTLIB::objc_destroyWeak); |
520 | 526 | break;
|
521 | 527 | case Intrinsic::objc_initWeak:
|
522 |
| - Changed |= lowerObjCCall(F, "objc_initWeak"); |
| 528 | + Changed |= lowerObjCCall(F, RTLIB::objc_initWeak); |
523 | 529 | break;
|
524 | 530 | case Intrinsic::objc_loadWeak:
|
525 |
| - Changed |= lowerObjCCall(F, "objc_loadWeak"); |
| 531 | + Changed |= lowerObjCCall(F, RTLIB::objc_loadWeak); |
526 | 532 | break;
|
527 | 533 | case Intrinsic::objc_loadWeakRetained:
|
528 |
| - Changed |= lowerObjCCall(F, "objc_loadWeakRetained"); |
| 534 | + Changed |= lowerObjCCall(F, RTLIB::objc_loadWeakRetained); |
529 | 535 | break;
|
530 | 536 | case Intrinsic::objc_moveWeak:
|
531 |
| - Changed |= lowerObjCCall(F, "objc_moveWeak"); |
| 537 | + Changed |= lowerObjCCall(F, RTLIB::objc_moveWeak); |
532 | 538 | break;
|
533 | 539 | case Intrinsic::objc_release:
|
534 |
| - Changed |= lowerObjCCall(F, "objc_release", true); |
| 540 | + Changed |= lowerObjCCall(F, RTLIB::objc_release, true); |
535 | 541 | break;
|
536 | 542 | case Intrinsic::objc_retain:
|
537 |
| - Changed |= lowerObjCCall(F, "objc_retain", true); |
| 543 | + Changed |= lowerObjCCall(F, RTLIB::objc_retain, true); |
538 | 544 | break;
|
539 | 545 | case Intrinsic::objc_retainAutorelease:
|
540 |
| - Changed |= lowerObjCCall(F, "objc_retainAutorelease"); |
| 546 | + Changed |= lowerObjCCall(F, RTLIB::objc_retainAutorelease); |
541 | 547 | break;
|
542 | 548 | case Intrinsic::objc_retainAutoreleaseReturnValue:
|
543 |
| - Changed |= lowerObjCCall(F, "objc_retainAutoreleaseReturnValue"); |
| 549 | + Changed |= lowerObjCCall(F, RTLIB::objc_retainAutoreleaseReturnValue); |
544 | 550 | break;
|
545 | 551 | case Intrinsic::objc_retainAutoreleasedReturnValue:
|
546 |
| - Changed |= lowerObjCCall(F, "objc_retainAutoreleasedReturnValue"); |
| 552 | + Changed |= lowerObjCCall(F, RTLIB::objc_retainAutoreleasedReturnValue); |
547 | 553 | break;
|
548 | 554 | case Intrinsic::objc_claimAutoreleasedReturnValue:
|
549 |
| - Changed |= lowerObjCCall(F, "objc_claimAutoreleasedReturnValue"); |
| 555 | + Changed |= lowerObjCCall(F, RTLIB::objc_claimAutoreleasedReturnValue); |
550 | 556 | break;
|
551 | 557 | case Intrinsic::objc_retainBlock:
|
552 |
| - Changed |= lowerObjCCall(F, "objc_retainBlock"); |
| 558 | + Changed |= lowerObjCCall(F, RTLIB::objc_retainBlock); |
553 | 559 | break;
|
554 | 560 | case Intrinsic::objc_storeStrong:
|
555 |
| - Changed |= lowerObjCCall(F, "objc_storeStrong"); |
| 561 | + Changed |= lowerObjCCall(F, RTLIB::objc_storeStrong); |
556 | 562 | break;
|
557 | 563 | case Intrinsic::objc_storeWeak:
|
558 |
| - Changed |= lowerObjCCall(F, "objc_storeWeak"); |
| 564 | + Changed |= lowerObjCCall(F, RTLIB::objc_storeWeak); |
559 | 565 | break;
|
560 | 566 | case Intrinsic::objc_unsafeClaimAutoreleasedReturnValue:
|
561 |
| - Changed |= lowerObjCCall(F, "objc_unsafeClaimAutoreleasedReturnValue"); |
| 567 | + Changed |= |
| 568 | + lowerObjCCall(F, RTLIB::objc_unsafeClaimAutoreleasedReturnValue); |
562 | 569 | break;
|
563 | 570 | case Intrinsic::objc_retainedObject:
|
564 |
| - Changed |= lowerObjCCall(F, "objc_retainedObject"); |
| 571 | + Changed |= lowerObjCCall(F, RTLIB::objc_retainedObject); |
565 | 572 | break;
|
566 | 573 | case Intrinsic::objc_unretainedObject:
|
567 |
| - Changed |= lowerObjCCall(F, "objc_unretainedObject"); |
| 574 | + Changed |= lowerObjCCall(F, RTLIB::objc_unretainedObject); |
568 | 575 | break;
|
569 | 576 | case Intrinsic::objc_unretainedPointer:
|
570 |
| - Changed |= lowerObjCCall(F, "objc_unretainedPointer"); |
| 577 | + Changed |= lowerObjCCall(F, RTLIB::objc_unretainedPointer); |
571 | 578 | break;
|
572 | 579 | case Intrinsic::objc_retain_autorelease:
|
573 |
| - Changed |= lowerObjCCall(F, "objc_retain_autorelease"); |
| 580 | + Changed |= lowerObjCCall(F, RTLIB::objc_retain_autorelease); |
574 | 581 | break;
|
575 | 582 | case Intrinsic::objc_sync_enter:
|
576 |
| - Changed |= lowerObjCCall(F, "objc_sync_enter"); |
| 583 | + Changed |= lowerObjCCall(F, RTLIB::objc_sync_enter); |
577 | 584 | break;
|
578 | 585 | case Intrinsic::objc_sync_exit:
|
579 |
| - Changed |= lowerObjCCall(F, "objc_sync_exit"); |
| 586 | + Changed |= lowerObjCCall(F, RTLIB::objc_sync_exit); |
580 | 587 | break;
|
581 | 588 | case Intrinsic::exp:
|
582 | 589 | case Intrinsic::exp2:
|
|
0 commit comments