@@ -41,26 +41,34 @@ extern bool EnableARCOpts;
4141// / Test if the given module looks interesting to run ARC optimization
4242// / on.
4343inline bool ModuleHasARC (const Module &M) {
44- return M.getNamedValue (" llvm.objc.retain" ) ||
45- M.getNamedValue (" llvm.objc.release" ) ||
46- M.getNamedValue (" llvm.objc.autorelease" ) ||
47- M.getNamedValue (" llvm.objc.retainAutoreleasedReturnValue" ) ||
48- M.getNamedValue (" llvm.objc.unsafeClaimAutoreleasedReturnValue" ) ||
49- M.getNamedValue (" llvm.objc.retainBlock" ) ||
50- M.getNamedValue (" llvm.objc.autoreleaseReturnValue" ) ||
51- M.getNamedValue (" llvm.objc.autoreleasePoolPush" ) ||
52- M.getNamedValue (" llvm.objc.loadWeakRetained" ) ||
53- M.getNamedValue (" llvm.objc.loadWeak" ) ||
54- M.getNamedValue (" llvm.objc.destroyWeak" ) ||
55- M.getNamedValue (" llvm.objc.storeWeak" ) ||
56- M.getNamedValue (" llvm.objc.initWeak" ) ||
57- M.getNamedValue (" llvm.objc.moveWeak" ) ||
58- M.getNamedValue (" llvm.objc.copyWeak" ) ||
59- M.getNamedValue (" llvm.objc.retainedObject" ) ||
60- M.getNamedValue (" llvm.objc.unretainedObject" ) ||
61- M.getNamedValue (" llvm.objc.unretainedPointer" ) ||
62- M.getNamedValue (" llvm.objc.clang.arc.noop.use" ) ||
63- M.getNamedValue (" llvm.objc.clang.arc.use" );
44+ std::initializer_list<Intrinsic::ID> Intrinsics = {
45+ Intrinsic::objc_retain,
46+ Intrinsic::objc_release,
47+ Intrinsic::objc_autorelease,
48+ Intrinsic::objc_retainAutoreleasedReturnValue,
49+ Intrinsic::objc_retainBlock,
50+ Intrinsic::objc_autoreleaseReturnValue,
51+ Intrinsic::objc_autoreleasePoolPush,
52+ Intrinsic::objc_loadWeakRetained,
53+ Intrinsic::objc_loadWeak,
54+ Intrinsic::objc_destroyWeak,
55+ Intrinsic::objc_initWeak,
56+ Intrinsic::objc_copyWeak,
57+ Intrinsic::objc_retainedObject,
58+ Intrinsic::objc_unretainedObject,
59+ Intrinsic::objc_unretainedPointer,
60+ Intrinsic::objc_clang_arc_noop_use,
61+ Intrinsic::objc_clang_arc_use,
62+ };
63+ #ifndef NDEBUG
64+ for (Intrinsic::ID IID : Intrinsics)
65+ assert (!Intrinsic::isOverloaded (IID) &&
66+ " Can only check non-overloaded intrinsics" );
67+ #endif
68+ for (Intrinsic::ID IID : Intrinsics)
69+ if (Intrinsic::getDeclarationIfExists (&M, IID))
70+ return true ;
71+ return false ;
6472}
6573
6674// / This is a wrapper around getUnderlyingObject which also knows how to
0 commit comments