@@ -96,43 +96,47 @@ ARCInstKind llvm::objcarc::GetFunctionClass(const Function *F) {
96
96
97
97
// One argument.
98
98
const Argument *A0 = &*AI++;
99
- if (AI == AE)
99
+ if (AI == AE) {
100
100
// Argument is a pointer.
101
- if (PointerType *PTy = dyn_cast<PointerType>(A0->getType ())) {
102
- Type *ETy = PTy->getElementType ();
103
- // Argument is i8*.
104
- if (ETy->isIntegerTy (8 ))
101
+ PointerType *PTy = dyn_cast<PointerType>(A0->getType ());
102
+ if (!PTy)
103
+ return ARCInstKind::CallOrUser;
104
+
105
+ Type *ETy = PTy->getElementType ();
106
+ // Argument is i8*.
107
+ if (ETy->isIntegerTy (8 ))
108
+ return StringSwitch<ARCInstKind>(F->getName ())
109
+ .Case (" objc_retain" , ARCInstKind::Retain)
110
+ .Case (" objc_retainAutoreleasedReturnValue" , ARCInstKind::RetainRV)
111
+ .Case (" objc_unsafeClaimAutoreleasedReturnValue" , ARCInstKind::ClaimRV)
112
+ .Case (" objc_retainBlock" , ARCInstKind::RetainBlock)
113
+ .Case (" objc_release" , ARCInstKind::Release)
114
+ .Case (" objc_autorelease" , ARCInstKind::Autorelease)
115
+ .Case (" objc_autoreleaseReturnValue" , ARCInstKind::AutoreleaseRV)
116
+ .Case (" objc_autoreleasePoolPop" , ARCInstKind::AutoreleasepoolPop)
117
+ .Case (" objc_retainedObject" , ARCInstKind::NoopCast)
118
+ .Case (" objc_unretainedObject" , ARCInstKind::NoopCast)
119
+ .Case (" objc_unretainedPointer" , ARCInstKind::NoopCast)
120
+ .Case (" objc_retain_autorelease" , ARCInstKind::FusedRetainAutorelease)
121
+ .Case (" objc_retainAutorelease" , ARCInstKind::FusedRetainAutorelease)
122
+ .Case (" objc_retainAutoreleaseReturnValue" ,
123
+ ARCInstKind::FusedRetainAutoreleaseRV)
124
+ .Case (" objc_sync_enter" , ARCInstKind::User)
125
+ .Case (" objc_sync_exit" , ARCInstKind::User)
126
+ .Default (ARCInstKind::CallOrUser);
127
+
128
+ // Argument is i8**
129
+ if (PointerType *Pte = dyn_cast<PointerType>(ETy))
130
+ if (Pte->getElementType ()->isIntegerTy (8 ))
105
131
return StringSwitch<ARCInstKind>(F->getName ())
106
- .Case (" objc_retain" , ARCInstKind::Retain)
107
- .Case (" objc_retainAutoreleasedReturnValue" , ARCInstKind::RetainRV)
108
- .Case (" objc_unsafeClaimAutoreleasedReturnValue" ,
109
- ARCInstKind::ClaimRV)
110
- .Case (" objc_retainBlock" , ARCInstKind::RetainBlock)
111
- .Case (" objc_release" , ARCInstKind::Release)
112
- .Case (" objc_autorelease" , ARCInstKind::Autorelease)
113
- .Case (" objc_autoreleaseReturnValue" , ARCInstKind::AutoreleaseRV)
114
- .Case (" objc_autoreleasePoolPop" , ARCInstKind::AutoreleasepoolPop)
115
- .Case (" objc_retainedObject" , ARCInstKind::NoopCast)
116
- .Case (" objc_unretainedObject" , ARCInstKind::NoopCast)
117
- .Case (" objc_unretainedPointer" , ARCInstKind::NoopCast)
118
- .Case (" objc_retain_autorelease" ,
119
- ARCInstKind::FusedRetainAutorelease)
120
- .Case (" objc_retainAutorelease" , ARCInstKind::FusedRetainAutorelease)
121
- .Case (" objc_retainAutoreleaseReturnValue" ,
122
- ARCInstKind::FusedRetainAutoreleaseRV)
123
- .Case (" objc_sync_enter" , ARCInstKind::User)
124
- .Case (" objc_sync_exit" , ARCInstKind::User)
132
+ .Case (" objc_loadWeakRetained" , ARCInstKind::LoadWeakRetained)
133
+ .Case (" objc_loadWeak" , ARCInstKind::LoadWeak)
134
+ .Case (" objc_destroyWeak" , ARCInstKind::DestroyWeak)
125
135
.Default (ARCInstKind::CallOrUser);
126
136
127
- // Argument is i8**
128
- if (PointerType *Pte = dyn_cast<PointerType>(ETy))
129
- if (Pte->getElementType ()->isIntegerTy (8 ))
130
- return StringSwitch<ARCInstKind>(F->getName ())
131
- .Case (" objc_loadWeakRetained" , ARCInstKind::LoadWeakRetained)
132
- .Case (" objc_loadWeak" , ARCInstKind::LoadWeak)
133
- .Case (" objc_destroyWeak" , ARCInstKind::DestroyWeak)
134
- .Default (ARCInstKind::CallOrUser);
135
- }
137
+ // Anything else with one argument.
138
+ return ARCInstKind::CallOrUser;
139
+ }
136
140
137
141
// Two arguments, first is i8**.
138
142
const Argument *A1 = &*AI++;
0 commit comments