@@ -93,20 +93,43 @@ pub unsafe extern fn __rust_start_panic(_data: usize, _vtable: usize) -> u32 {
93
93
// Essentially this symbol is just defined to get wired up to libcore/libstd
94
94
// binaries, but it should never be called as we don't link in an unwinding
95
95
// runtime at all.
96
- #[ no_mangle]
97
96
#[ cfg( not( stage0) ) ]
98
- pub extern fn rust_eh_personality ( ) { }
97
+ pub mod personalities {
99
98
100
- // Similar to above, this corresponds to the `eh_unwind_resume` lang item that's
101
- // only used on Windows currently.
102
- # [ no_mangle ]
103
- # [ cfg ( all ( not ( stage0 ) , target_os = "windows" , target_env = "gnu" ) ) ]
104
- pub extern fn rust_eh_unwind_resume ( ) { }
99
+ # [ no_mangle ]
100
+ # [ cfg ( not ( all ( target_os = "windows" ,
101
+ target_env = "gnu" ,
102
+ target_arch = "x86_64" ) ) ) ]
103
+ pub extern fn rust_eh_personality ( ) { }
105
104
106
- #[ no_mangle]
107
- #[ cfg( all( target_os = "windows" , target_env = "gnu" , target_arch = "x86" ) ) ]
108
- pub extern fn rust_eh_register_frames ( ) { }
105
+ // On x86_64-pc-windows-gnu we use our own personality function that needs
106
+ // to return `ExceptionContinueSearch` as we're passing on all our frames.
107
+ #[ no_mangle]
108
+ #[ cfg( all( target_os = "windows" ,
109
+ target_env = "gnu" ,
110
+ target_arch = "x86_64" ) ) ]
111
+ pub extern fn rust_eh_personality ( _record : usize ,
112
+ _frame : usize ,
113
+ _context : usize ,
114
+ _dispatcher : usize ) -> u32 {
115
+ 1 // `ExceptionContinueSearch`
116
+ }
109
117
110
- #[ no_mangle]
111
- #[ cfg( all( target_os = "windows" , target_env = "gnu" , target_arch = "x86" ) ) ]
112
- pub extern fn rust_eh_unregister_frames ( ) { }
118
+ // Similar to above, this corresponds to the `eh_unwind_resume` lang item
119
+ // that's only used on Windows currently.
120
+ //
121
+ // Note that we don't execute landing pads, so this is never called, so it's
122
+ // body is empty.
123
+ #[ no_mangle]
124
+ #[ cfg( all( target_os = "windows" , target_env = "gnu" ) ) ]
125
+ pub extern fn rust_eh_unwind_resume ( ) { }
126
+
127
+ // These two are called by our startup objects on i686-pc-windows-gnu, but
128
+ // they don't need to do anything so the bodies are nops.
129
+ #[ no_mangle]
130
+ #[ cfg( all( target_os = "windows" , target_env = "gnu" , target_arch = "x86" ) ) ]
131
+ pub extern fn rust_eh_register_frames ( ) { }
132
+ #[ no_mangle]
133
+ #[ cfg( all( target_os = "windows" , target_env = "gnu" , target_arch = "x86" ) ) ]
134
+ pub extern fn rust_eh_unregister_frames ( ) { }
135
+ }
0 commit comments