Skip to content

Commit 2b1c1a2

Browse files
authored
Merge pull request #28455 from kitaisreal/willthrow-only-on-throw
[SILGEN] Inject "willThrow" hooks after foreign error propagation.
2 parents 022ccd7 + 149331d commit 2b1c1a2

File tree

7 files changed

+37
-15
lines changed

7 files changed

+37
-15
lines changed

lib/SILGen/SILGenApply.cpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4608,9 +4608,6 @@ SILValue SILGenFunction::emitApplyWithRethrow(SILLocation loc, SILValue fn,
46084608
SILValue error = errorBB->createPhiArgument(fnConv.getSILErrorType(),
46094609
ValueOwnershipKind::Owned);
46104610

4611-
B.createBuiltin(loc, SGM.getASTContext().getIdentifier("willThrow"),
4612-
SGM.Types.getEmptyTupleType(), {}, {error});
4613-
46144611
Cleanups.emitCleanupsForReturn(CleanupLocation::get(loc), IsForUnwind);
46154612
B.createThrow(loc, error);
46164613
}

lib/SILGen/SILGenForeignError.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ void SILGenFunction::emitForeignErrorBlock(SILLocation loc,
279279

280280
// Propagate.
281281
FullExpr throwScope(Cleanups, CleanupLocation::get(loc));
282-
emitThrow(loc, error);
282+
emitThrow(loc, error, true);
283283
}
284284

285285
/// Perform a foreign error check by testing whether the call result is zero.

lib/SILOptimizer/IPO/EagerSpecializer.cpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -172,12 +172,6 @@ emitApplyWithRethrow(SILBuilder &Builder,
172172
SILValue Error = ErrorBB->createPhiArgument(fnConv.getSILErrorType(),
173173
ValueOwnershipKind::Owned);
174174

175-
Builder.createBuiltin(Loc,
176-
Builder.getASTContext().getIdentifier("willThrow"),
177-
Builder.getModule().Types.getEmptyTupleType(),
178-
SubstitutionMap(),
179-
{Error});
180-
181175
EmitCleanup(Builder, Loc);
182176
addThrowValue(ErrorBB, Error);
183177
}

test/SILGen/errors.swift

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,6 @@ class HasThrowingInit {
269269
// CHECK: bb1([[SELF:%.*]] : @owned $HasThrowingInit):
270270
// CHECK-NEXT: return [[SELF]]
271271
// CHECK: bb2([[ERROR:%.*]] : @owned $Error):
272-
// CHECK-NEXT: builtin "willThrow"
273272
// CHECK-NEXT: throw [[ERROR]]
274273

275274
// CHECK-LABEL: sil hidden [ossa] @$s6errors15HasThrowingInit{{.*}} : $@convention(method) (Int, @owned HasThrowingInit) -> (@owned HasThrowingInit, @error Error) {
@@ -320,7 +319,6 @@ protocol Doomed {
320319
// CHECK: [[T0:%.*]] = tuple ()
321320
// CHECK: return [[T0]] : $()
322321
// CHECK: bb2([[T0:%.*]] : @owned $Error):
323-
// CHECK: builtin "willThrow"([[T0]] : $Error)
324322
// CHECK: throw [[T0]] : $Error
325323
struct DoomedStruct : Doomed {
326324
func check() throws {}
@@ -335,7 +333,6 @@ struct DoomedStruct : Doomed {
335333
// CHECK: end_borrow [[BORROWED_SELF]]
336334
// CHECK: return [[T0]] : $()
337335
// CHECK: bb2([[T0:%.*]] : @owned $Error):
338-
// CHECK: builtin "willThrow"([[T0]] : $Error)
339336
// CHECK: end_borrow [[BORROWED_SELF]]
340337
// CHECK: throw [[T0]] : $Error
341338
class DoomedClass : Doomed {
@@ -376,7 +373,6 @@ func testThunk(_ fn: () throws -> Int) throws -> Int {
376373
// CHECK: [[T0:%.*]] = tuple ()
377374
// CHECK: return [[T0]]
378375
// CHECK: bb2([[T0:%.*]] : @owned $Error):
379-
// CHECK: builtin "willThrow"([[T0]] : $Error)
380376
// CHECK: throw [[T0]] : $Error
381377

382378
func createInt(_ fn: () -> Int) throws {}

test/SILGen/foreign_errors.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ func test0() throws {
5151
// CHECK: [[T0:%.*]] = load [take] [[ERR_TEMP0]]
5252
// CHECK: [[T1:%.*]] = function_ref @$s10Foundation22_convertNSErrorToErrorys0E0_pSo0C0CSgF : $@convention(thin) (@guaranteed Optional<NSError>) -> @owned Error
5353
// CHECK: [[T2:%.*]] = apply [[T1]]([[T0]])
54+
// CHECK: "willThrow"([[T2]] : $Error)
5455
// CHECK: throw [[T2]] : $Error
5556
}
5657

@@ -161,6 +162,7 @@ let fn = ErrorProne.fail
161162
// CHECK: return
162163
// CHECK: [[T0:%.*]] = load [take] [[TEMP]]
163164
// CHECK: [[T1:%.*]] = apply {{%.*}}([[T0]])
165+
// CHECK: "willThrow"([[T1]] : $Error)
164166
// CHECK: throw [[T1]]
165167

166168
func testArgs() throws {

test/SILGen/objc_factory_init.swift

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,40 @@ extension Hive {
4242
convenience init(otherQueen other: Bee) {
4343
self.init(queen: other)
4444
}
45+
46+
// CHECK-LABEL: sil hidden [ossa] @$sSo4HiveC17objc_factory_initE15otherFlakyQueenABSo3BeeC_tKcfC
47+
// CHECK: bb0([[QUEEN:%.*]] : @owned $Bee, [[META:%.*]] : $@thick Hive.Type):
48+
// CHECK: [[SELF_BOX:%.*]] = alloc_box ${ var Hive }, let, name "self"
49+
// CHECK: [[MU:%.*]] = mark_uninitialized [delegatingself] [[SELF_BOX]]
50+
// CHECK: [[PB_BOX:%.*]] = project_box [[MU]] : ${ var Hive }, 0
51+
// CHECK: [[FOREIGN_ERROR_STACK:%.*]] = alloc_stack $Optional<NSError>
52+
// CHECK: [[OBJC_META:%[0-9]+]] = thick_to_objc_metatype [[META]] : $@thick Hive.Type to $@objc_metatype Hive.Type
53+
// CHECK: [[BORROWED_QUEEN:%.*]] = begin_borrow [[QUEEN]]
54+
// CHECK: [[COPIED_BORROWED_QUEEN:%.*]] = copy_value [[BORROWED_QUEEN]]
55+
// CHECK: [[OPT_COPIED_BORROWED_QUEEN:%.*]] = enum $Optional<Bee>, #Optional.some!enumelt.1, [[COPIED_BORROWED_QUEEN]]
56+
// CHECK: [[FACTORY:%[0-9]+]] = objc_method [[OBJC_META]] : $@objc_metatype Hive.Type, #Hive.init!allocator.1.foreign : (Hive.Type) -> (Bee?) throws -> Hive, $@convention(objc_method) (Optional<Bee>, Optional<AutoreleasingUnsafeMutablePointer<Optional<NSError>>>, @objc_metatype Hive.Type) -> @autoreleased Optional<Hive> // user: %25
57+
// CHECK: [[ERROR_PTR_STACK:%.*]] = alloc_stack $AutoreleasingUnsafeMutablePointer<Optional<NSError>>
58+
// CHECK: [[ERROR_PTR:%.*]] = load [trivial] [[ERROR_PTR_STACK]]
59+
// CHECK: [[OPT_ERROR_PTR:%.*]] = enum $Optional<AutoreleasingUnsafeMutablePointer<Optional<NSError>>>, #Optional.some!enumelt.1, [[ERROR_PTR]]
60+
// CHECK: [[OPT_NEW_HIVE:%.*]] = apply [[FACTORY]]([[OPT_COPIED_BORROWED_QUEEN]], [[OPT_ERROR_PTR]], [[OBJC_META]]) : $@convention(objc_method) (Optional<Bee>, Optional<AutoreleasingUnsafeMutablePointer<Optional<NSError>>>, @objc_metatype Hive.Type) -> @autoreleased Optional<Hive>
61+
// CHECK: switch_enum [[OPT_NEW_HIVE]] : $Optional<Hive>, case #Optional.some!enumelt.1: [[NORMAL_BB:bb[0-9]+]], case #Optional.none!enumelt: [[ERROR_BB:bb[0-9]+]] // id: %34
62+
//
63+
// CHECK: bb1([[HIVE:%.*]] : @owned $Hive):
64+
// CHECK: assign [[HIVE]] to [[PB_BOX]]
65+
// CHECK: dealloc_stack [[FOREIGN_ERROR_STACK]]
66+
// CHECK: [[HIVE_COPY:%.*]] = load [copy] [[PB_BOX]]
67+
// CHECK: return [[HIVE_COPY]]
68+
// CHECK: bb2:
69+
// CHECK: [[OPTIONAL_NSERROR:%.*]] = load [take] [[FOREIGN_ERROR_STACK]] : $*Optional<NSError>
70+
// CHECK: [[CONVERT_NSERROR_TO_ERROR_FUNC:%.*]] = function_ref @$s10Foundation22_convertNSErrorToErrorys0E0_pSo0C0CSgF : $@convention(thin) (@guaranteed Optional<NSError>) -> @owned Error
71+
// CHECK: [[ERROR:%.*]] = apply [[CONVERT_NSERROR_TO_ERROR_FUNC]]([[OPTIONAL_NSERROR]]) : $@convention(thin) (@guaranteed Optional<NSError>) -> @owned Error
72+
// CHECK: "willThrow"([[ERROR]] : $Error)
73+
// CHECK: dealloc_stack [[FOREIGN_ERROR_STACK]]
74+
// CHECK: throw [[ERROR]] : $Error
75+
// CHECK: } // end sil function '$sSo4HiveC17objc_factory_initE15otherFlakyQueenABSo3BeeC_tKcfC'
76+
convenience init(otherFlakyQueen other: Bee) throws {
77+
try self.init(flakyQueen: other)
78+
}
4579
}
4680

4781
extension SomeClass {

test/SILOptimizer/eager_specialize.sil

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,6 @@ bb2:
228228
// CHECK: try_apply %{{.*}}(%{{.*}}, %{{.*}}) : $@convention(thin) (Int, Int) -> (Int, @error Error), normal bb8, error bb7
229229

230230
// CHECK: bb7(%{{.*}} : $Error):
231-
// CHECK: %{{.*}} = builtin "willThrow"(%{{.*}} : $Error) : $()
232231
// CHECK: br bb3(%{{.*}} : $Error)
233232

234233
// CHECK: bb8(%{{.*}} : $Int):

0 commit comments

Comments
 (0)