@@ -98,11 +98,12 @@ cfg_if::cfg_if! {
98
98
not( all( target_vendor = "apple" , not( target_os = "watchos" ) ) ) ,
99
99
not( target_os = "netbsd" ) ,
100
100
) ) ] {
101
- // ARM EHABI personality routine.
102
- // https://web.archive.org/web/20190728160938/https://infocenter.arm.com/help/topic/com.arm.doc.ihi0038b/IHI0038B_ehabi.pdf
103
- //
104
- // Apple 32-bit ARM (but not watchOS) uses the default routine instead
105
- // since it uses SjLj unwinding.
101
+ /// personality fn called by [ARM EHABI][armeabi-eh]
102
+ ///
103
+ /// Apple 32-bit ARM (but not watchOS) uses the default routine instead
104
+ /// since it uses "setjmp-longjmp" unwinding.
105
+ ///
106
+ /// [armeabi-eh]: https://web.archive.org/web/20190728160938/https://infocenter.arm.com/help/topic/com.arm.doc.ihi0038b/IHI0038B_ehabi.pdf
106
107
#[ lang = "eh_personality" ]
107
108
unsafe extern "C" fn rust_eh_personality(
108
109
state: uw:: _Unwind_State,
@@ -200,8 +201,8 @@ cfg_if::cfg_if! {
200
201
}
201
202
}
202
203
} else {
203
- // Default personality routine, which is used directly on most targets
204
- // and indirectly on Windows x86_64 via SEH.
204
+ /// Default personality routine, which is used directly on most targets
205
+ /// and indirectly on Windows x86_64 and AArch64 via SEH.
205
206
unsafe extern "C" fn rust_eh_personality_impl(
206
207
version: c_int,
207
208
actions: uw:: _Unwind_Action,
@@ -246,8 +247,12 @@ cfg_if::cfg_if! {
246
247
247
248
cfg_if:: cfg_if! {
248
249
if #[ cfg( all( windows, any( target_arch = "aarch64" , target_arch = "x86_64" ) , target_env = "gnu" ) ) ] {
249
- // On x86_64 MinGW targets, the unwinding mechanism is SEH however the unwind
250
- // handler data (aka LSDA) uses GCC-compatible encoding.
250
+ /// personality fn called by [Windows Structured Exception Handling][windows-eh]
251
+ ///
252
+ /// On x86_64 and AArch64 MinGW targets, the unwinding mechanism is SEH,
253
+ /// however the unwind handler data (aka LSDA) uses GCC-compatible encoding
254
+ ///
255
+ /// [windows-eh]: https://learn.microsoft.com/en-us/cpp/cpp/structured-exception-handling-c-cpp?view=msvc-170
251
256
#[ lang = "eh_personality" ]
252
257
#[ allow( nonstandard_style) ]
253
258
unsafe extern "C" fn rust_eh_personality(
@@ -256,6 +261,9 @@ cfg_if::cfg_if! {
256
261
contextRecord: * mut uw:: CONTEXT ,
257
262
dispatcherContext: * mut uw:: DISPATCHER_CONTEXT ,
258
263
) -> uw:: EXCEPTION_DISPOSITION {
264
+ // SAFETY: the cfg is still target_os = "windows" and target_env = "gnu",
265
+ // which means that this is the correct function to call, passing our impl fn
266
+ // as the callback which gets actually used
259
267
unsafe {
260
268
uw:: _GCC_specific_handler(
261
269
exceptionRecord,
@@ -267,7 +275,19 @@ cfg_if::cfg_if! {
267
275
}
268
276
}
269
277
} else {
270
- // The personality routine for most of our targets.
278
+ /// personality fn called by [Itanium C++ ABI Exception Handling][itanium-eh]
279
+ ///
280
+ /// The personality routine for most non-Windows targets. This will be called by
281
+ /// the unwinding library:
282
+ /// - "In the search phase, the framework repeatedly calls the personality routine,
283
+ /// with the _UA_SEARCH_PHASE flag as described below, first for the current PC
284
+ /// and register state, and then unwinding a frame to a new PC at each step..."
285
+ /// - "If the search phase reports success, the framework restarts in the cleanup
286
+ /// phase. Again, it repeatedly calls the personality routine, with the
287
+ /// _UA_CLEANUP_PHASE flag as described below, first for the current PC and
288
+ /// register state, and then unwinding a frame to a new PC at each step..."i
289
+ ///
290
+ /// [itanium-eh]: https://itanium-cxx-abi.github.io/cxx-abi/abi-eh.html
271
291
#[ lang = "eh_personality" ]
272
292
unsafe extern "C" fn rust_eh_personality(
273
293
version: c_int,
@@ -276,6 +296,8 @@ cfg_if::cfg_if! {
276
296
exception_object: * mut uw:: _Unwind_Exception,
277
297
context: * mut uw:: _Unwind_Context,
278
298
) -> uw:: _Unwind_Reason_Code {
299
+ // SAFETY: the platform support must modify the cfg for the inner fn
300
+ // if it needs something different than what is currently invoked.
279
301
unsafe {
280
302
rust_eh_personality_impl(
281
303
version,
0 commit comments