Skip to content

Commit ce32847

Browse files
author
Joe Shajrawi
authored
Merge pull request #15693 from shajrawi/large_load_bugfix_small
LargeLoadableTypes: Support applies of objc applies
2 parents 18b28b9 + 774b084 commit ce32847

File tree

2 files changed

+53
-0
lines changed

2 files changed

+53
-0
lines changed

lib/IRGen/LoadableByAddress.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -627,6 +627,10 @@ static bool modifiableApply(ApplySite applySite, irgen::IRGenModule &Mod) {
627627
if (applySite.getSubstCalleeType()->getLanguage() == SILFunctionLanguage::C) {
628628
return false;
629629
}
630+
SILValue callee = applySite.getCallee();
631+
if (auto site = ApplySite::isa(callee)) {
632+
return modifiableApply(site, Mod);
633+
}
630634
return true;
631635
}
632636

test/IRGen/big_types_corner_cases.sil

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,3 +282,52 @@ sil_vtable SuperBase {
282282
sil_vtable SuperSub {
283283
}
284284

285+
class X {
286+
@objc func foo() -> BitfieldOne
287+
}
288+
sil_vtable X {}
289+
290+
sil @$S22big_types_corner_cases1XC3fooSo11BitfieldOneVyFTo : $@convention(objc_method) (X) -> BitfieldOne {
291+
bb0(%1 : $X):
292+
%4 = function_ref @$getLargeObjCType : $@convention(thin) () -> BitfieldOne
293+
%7 = apply %4() : $@convention(thin) () -> BitfieldOne
294+
return %7 : $BitfieldOne
295+
}
296+
297+
sil @$getLargeObjCType : $@convention(thin) () -> BitfieldOne
298+
299+
// CHECK-LABAL: define {{.*}} swiftcc void @"$crash_on_objc_apply"(%objc_object*)
300+
// CHECK: entry:
301+
// CHECK: [[LOADS:%.*]] = load i8*, i8** @"\01L_selector(foo)"
302+
// CHECK: [[RESS:%.*]] = load i8*, i8** @"\01L_selector(respondsToSelector:)"
303+
// CHECK: call i1 bitcast (void ()* @objc_msgSend to i1 (%objc_object*, i8*, i8*)*)(%objc_object* %0, i8* [[RESS]], i8* [[LOADS]])
304+
sil @$crash_on_objc_apply : $@convention(thin) (@guaranteed AnyObject) -> () {
305+
// %0 // users: %2, %1
306+
bb0(%0 : $AnyObject):
307+
debug_value %0 : $AnyObject, let, name "object", argno 1
308+
%2 = open_existential_ref %0 : $AnyObject to $@opened("E5D03528-36AD-11E8-A0AB-D0817AD47398") AnyObject
309+
strong_retain %2 : $@opened("E5D03528-36AD-11E8-A0AB-D0817AD47398") AnyObject
310+
%4 = alloc_stack $Optional<BitfieldOne>
311+
dynamic_method_br %2 : $@opened("E5D03528-36AD-11E8-A0AB-D0817AD47398") AnyObject, #X.foo!1.foreign, bb1, bb2
312+
313+
bb1(%6 : $@convention(objc_method) (@opened("E5D03528-36AD-11E8-A0AB-D0817AD47398") AnyObject) -> BitfieldOne): // Preds: bb0
314+
strong_retain %2 : $@opened("E5D03528-36AD-11E8-A0AB-D0817AD47398") AnyObject
315+
%8 = partial_apply [callee_guaranteed] %6(%2) : $@convention(objc_method) (@opened("E5D03528-36AD-11E8-A0AB-D0817AD47398") AnyObject) -> BitfieldOne
316+
%9 = apply %8() : $@callee_guaranteed () -> BitfieldOne
317+
%10 = init_enum_data_addr %4 : $*Optional<BitfieldOne>, #Optional.some!enumelt.1
318+
store %9 to %10 : $*BitfieldOne
319+
inject_enum_addr %4 : $*Optional<BitfieldOne>, #Optional.some!enumelt.1
320+
strong_release %8 : $@callee_guaranteed () -> BitfieldOne
321+
br bb3
322+
323+
bb2: // Preds: bb0
324+
inject_enum_addr %4 : $*Optional<BitfieldOne>, #Optional.none!enumelt
325+
br bb3
326+
327+
bb3: // Preds: bb2 bb1
328+
%17 = load %4 : $*Optional<BitfieldOne>
329+
dealloc_stack %4 : $*Optional<BitfieldOne>
330+
strong_release %2 : $@opened("E5D03528-36AD-11E8-A0AB-D0817AD47398") AnyObject
331+
%20 = tuple ()
332+
return %20 : $()
333+
} // end sil function '$crash_on_objc_apply'

0 commit comments

Comments
 (0)