|
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