@@ -60,48 +60,51 @@ impl UnwindContext {
60
60
gimli:: DwEhPe ( gimli:: DW_EH_PE_indirect . 0 | gimli:: DW_EH_PE_absptr . 0 )
61
61
} ;
62
62
63
+ cie. fde_address_encoding = ptr_encoding;
64
+
63
65
// FIXME only add personality function and lsda when necessary: https://github.com/rust-lang/rust/blob/1f76d219c906f0112bb1872f33aa977164c53fa6/compiler/rustc_codegen_ssa/src/mir/mod.rs#L200-L204
66
+ if cfg ! ( feature = "unwinding" ) {
67
+ cie. lsda_encoding = Some ( ptr_encoding) ;
68
+
69
+ // FIXME use eh_personality lang item instead
70
+ let personality = module
71
+ . declare_function (
72
+ "rust_eh_personality" ,
73
+ Linkage :: Import ,
74
+ & Signature {
75
+ params : vec ! [
76
+ AbiParam :: new( types:: I32 ) ,
77
+ AbiParam :: new( types:: I32 ) ,
78
+ AbiParam :: new( types:: I64 ) ,
79
+ AbiParam :: new( module. target_config( ) . pointer_type( ) ) ,
80
+ AbiParam :: new( module. target_config( ) . pointer_type( ) ) ,
81
+ ] ,
82
+ returns : vec ! [ AbiParam :: new( types:: I32 ) ] ,
83
+ call_conv : module. target_config ( ) . default_call_conv ,
84
+ } ,
85
+ )
86
+ . unwrap ( ) ;
87
+
88
+ // Use indirection here to support PIC the case where rust_eh_personality is defined in
89
+ // another DSO.
90
+ let personality_ref = module
91
+ . declare_data ( "DW.ref.rust_eh_personality" , Linkage :: Local , false , false )
92
+ . unwrap ( ) ;
93
+
94
+ let mut personality_ref_data = DataDescription :: new ( ) ;
95
+ // Note: Must not use define_zeroinit. The unwinder can't handle this being in the .bss
96
+ // section.
97
+ let pointer_bytes = usize:: from ( module. target_config ( ) . pointer_bytes ( ) ) ;
98
+ personality_ref_data. define ( vec ! [ 0 ; pointer_bytes] . into_boxed_slice ( ) ) ;
99
+ let personality_func_ref =
100
+ module. declare_func_in_data ( personality, & mut personality_ref_data) ;
101
+ personality_ref_data. write_function_addr ( 0 , personality_func_ref) ;
102
+
103
+ module. define_data ( personality_ref, & personality_ref_data) . unwrap ( ) ;
104
+
105
+ cie. personality = Some ( ( code_ptr_encoding, address_for_data ( personality_ref) ) ) ;
106
+ }
64
107
65
- cie. fde_address_encoding = ptr_encoding;
66
- cie. lsda_encoding = Some ( ptr_encoding) ;
67
-
68
- // FIXME use eh_personality lang item instead
69
- let personality = module
70
- . declare_function (
71
- "rust_eh_personality" ,
72
- Linkage :: Import ,
73
- & Signature {
74
- params : vec ! [
75
- AbiParam :: new( types:: I32 ) ,
76
- AbiParam :: new( types:: I32 ) ,
77
- AbiParam :: new( types:: I64 ) ,
78
- AbiParam :: new( module. target_config( ) . pointer_type( ) ) ,
79
- AbiParam :: new( module. target_config( ) . pointer_type( ) ) ,
80
- ] ,
81
- returns : vec ! [ AbiParam :: new( types:: I32 ) ] ,
82
- call_conv : module. target_config ( ) . default_call_conv ,
83
- } ,
84
- )
85
- . unwrap ( ) ;
86
-
87
- // Use indirection here to support PIC the case where rust_eh_personality is defined in
88
- // another DSO.
89
- let personality_ref = module
90
- . declare_data ( "DW.ref.rust_eh_personality" , Linkage :: Local , false , false )
91
- . unwrap ( ) ;
92
-
93
- let mut personality_ref_data = DataDescription :: new ( ) ;
94
- // Note: Must not use define_zeroinit. The unwinder can't handle this being in the .bss
95
- // section.
96
- let pointer_bytes = usize:: from ( module. target_config ( ) . pointer_bytes ( ) ) ;
97
- personality_ref_data. define ( vec ! [ 0 ; pointer_bytes] . into_boxed_slice ( ) ) ;
98
- let personality_func_ref =
99
- module. declare_func_in_data ( personality, & mut personality_ref_data) ;
100
- personality_ref_data. write_function_addr ( 0 , personality_func_ref) ;
101
-
102
- module. define_data ( personality_ref, & personality_ref_data) . unwrap ( ) ;
103
-
104
- cie. personality = Some ( ( code_ptr_encoding, address_for_data ( personality_ref) ) ) ;
105
108
Some ( frame_table. add_cie ( cie) )
106
109
} else {
107
110
None
@@ -137,89 +140,94 @@ impl UnwindContext {
137
140
match unwind_info {
138
141
UnwindInfo :: SystemV ( unwind_info) => {
139
142
let mut fde = unwind_info. to_fde ( address_for_func ( func_id) ) ;
140
- // FIXME use unique symbol name derived from function name
141
- let lsda = module. declare_anonymous_data ( false , false ) . unwrap ( ) ;
142
-
143
- let encoding = Encoding {
144
- format : Format :: Dwarf32 ,
145
- version : 1 ,
146
- address_size : module. isa ( ) . frontend_config ( ) . pointer_bytes ( ) ,
147
- } ;
148
-
149
- let mut gcc_except_table_data = GccExceptTable {
150
- call_sites : CallSiteTable ( vec ! [ ] ) ,
151
- actions : ActionTable :: new ( ) ,
152
- type_info : TypeInfoTable :: new ( gimli:: DW_EH_PE_udata4 ) ,
153
- exception_specs : ExceptionSpecTable :: new ( ) ,
154
- } ;
155
-
156
- let catch_type = gcc_except_table_data. type_info . add ( Address :: Constant ( 0 ) ) ;
157
- let catch_action = gcc_except_table_data
158
- . actions
159
- . add ( Action { kind : ActionKind :: Catch ( catch_type) , next_action : None } ) ;
160
-
161
- for call_site in context. compiled_code ( ) . unwrap ( ) . buffer . call_sites ( ) {
162
- if call_site. exception_handlers . is_empty ( ) {
163
- gcc_except_table_data. call_sites . 0 . push ( CallSite {
164
- start : u64:: from ( call_site. ret_addr - 1 ) ,
165
- length : 1 ,
166
- landing_pad : 0 ,
167
- action_entry : None ,
168
- } ) ;
169
- }
170
- for & ( tag, landingpad) in call_site. exception_handlers {
171
- match tag. expand ( ) . unwrap ( ) . as_u32 ( ) {
172
- EXCEPTION_HANDLER_CLEANUP => {
173
- gcc_except_table_data. call_sites . 0 . push ( CallSite {
174
- start : u64:: from ( call_site. ret_addr - 1 ) ,
175
- length : 1 ,
176
- landing_pad : u64:: from ( landingpad) ,
177
- action_entry : None ,
178
- } )
179
- }
180
- EXCEPTION_HANDLER_CATCH => {
181
- gcc_except_table_data. call_sites . 0 . push ( CallSite {
182
- start : u64:: from ( call_site. ret_addr - 1 ) ,
183
- length : 1 ,
184
- landing_pad : u64:: from ( landingpad) ,
185
- action_entry : Some ( catch_action) ,
186
- } )
143
+
144
+ // FIXME only add personality function and lsda when necessary: https://github.com/rust-lang/rust/blob/1f76d219c906f0112bb1872f33aa977164c53fa6/compiler/rustc_codegen_ssa/src/mir/mod.rs#L200-L204
145
+ if cfg ! ( feature = "unwinding" ) {
146
+ // FIXME use unique symbol name derived from function name
147
+ let lsda = module. declare_anonymous_data ( false , false ) . unwrap ( ) ;
148
+
149
+ let encoding = Encoding {
150
+ format : Format :: Dwarf32 ,
151
+ version : 1 ,
152
+ address_size : module. isa ( ) . frontend_config ( ) . pointer_bytes ( ) ,
153
+ } ;
154
+
155
+ let mut gcc_except_table_data = GccExceptTable {
156
+ call_sites : CallSiteTable ( vec ! [ ] ) ,
157
+ actions : ActionTable :: new ( ) ,
158
+ type_info : TypeInfoTable :: new ( gimli:: DW_EH_PE_udata4 ) ,
159
+ exception_specs : ExceptionSpecTable :: new ( ) ,
160
+ } ;
161
+
162
+ let catch_type = gcc_except_table_data. type_info . add ( Address :: Constant ( 0 ) ) ;
163
+ let catch_action = gcc_except_table_data
164
+ . actions
165
+ . add ( Action { kind : ActionKind :: Catch ( catch_type) , next_action : None } ) ;
166
+
167
+ for call_site in context. compiled_code ( ) . unwrap ( ) . buffer . call_sites ( ) {
168
+ if call_site. exception_handlers . is_empty ( ) {
169
+ gcc_except_table_data. call_sites . 0 . push ( CallSite {
170
+ start : u64:: from ( call_site. ret_addr - 1 ) ,
171
+ length : 1 ,
172
+ landing_pad : 0 ,
173
+ action_entry : None ,
174
+ } ) ;
175
+ }
176
+ for & ( tag, landingpad) in call_site. exception_handlers {
177
+ match tag. expand ( ) . unwrap ( ) . as_u32 ( ) {
178
+ EXCEPTION_HANDLER_CLEANUP => {
179
+ gcc_except_table_data. call_sites . 0 . push ( CallSite {
180
+ start : u64:: from ( call_site. ret_addr - 1 ) ,
181
+ length : 1 ,
182
+ landing_pad : u64:: from ( landingpad) ,
183
+ action_entry : None ,
184
+ } )
185
+ }
186
+ EXCEPTION_HANDLER_CATCH => {
187
+ gcc_except_table_data. call_sites . 0 . push ( CallSite {
188
+ start : u64:: from ( call_site. ret_addr - 1 ) ,
189
+ length : 1 ,
190
+ landing_pad : u64:: from ( landingpad) ,
191
+ action_entry : Some ( catch_action) ,
192
+ } )
193
+ }
194
+ _ => unreachable ! ( ) ,
187
195
}
188
- _ => unreachable ! ( ) ,
189
196
}
190
197
}
191
- }
192
198
193
- let mut gcc_except_table = super :: emit:: WriterRelocate :: new ( self . endian ) ;
194
-
195
- gcc_except_table_data. write ( & mut gcc_except_table, encoding) . unwrap ( ) ;
196
-
197
- let mut data = DataDescription :: new ( ) ;
198
- data. define ( gcc_except_table. writer . into_vec ( ) . into_boxed_slice ( ) ) ;
199
- data. set_segment_section ( "" , ".gcc_except_table" ) ;
200
-
201
- for reloc in & gcc_except_table. relocs {
202
- match reloc. name {
203
- DebugRelocName :: Section ( _id) => unreachable ! ( ) ,
204
- DebugRelocName :: Symbol ( id) => {
205
- let id = id. try_into ( ) . unwrap ( ) ;
206
- if id & 1 << 31 == 0 {
207
- let func_ref =
208
- module. declare_func_in_data ( FuncId :: from_u32 ( id) , & mut data) ;
209
- data. write_function_addr ( reloc. offset , func_ref) ;
210
- } else {
211
- let gv = module. declare_data_in_data (
212
- DataId :: from_u32 ( id & !( 1 << 31 ) ) ,
213
- & mut data,
214
- ) ;
215
- data. write_data_addr ( reloc. offset , gv, 0 ) ;
199
+ let mut gcc_except_table = super :: emit:: WriterRelocate :: new ( self . endian ) ;
200
+
201
+ gcc_except_table_data. write ( & mut gcc_except_table, encoding) . unwrap ( ) ;
202
+
203
+ let mut data = DataDescription :: new ( ) ;
204
+ data. define ( gcc_except_table. writer . into_vec ( ) . into_boxed_slice ( ) ) ;
205
+ data. set_segment_section ( "" , ".gcc_except_table" ) ;
206
+
207
+ for reloc in & gcc_except_table. relocs {
208
+ match reloc. name {
209
+ DebugRelocName :: Section ( _id) => unreachable ! ( ) ,
210
+ DebugRelocName :: Symbol ( id) => {
211
+ let id = id. try_into ( ) . unwrap ( ) ;
212
+ if id & 1 << 31 == 0 {
213
+ let func_ref = module
214
+ . declare_func_in_data ( FuncId :: from_u32 ( id) , & mut data) ;
215
+ data. write_function_addr ( reloc. offset , func_ref) ;
216
+ } else {
217
+ let gv = module. declare_data_in_data (
218
+ DataId :: from_u32 ( id & !( 1 << 31 ) ) ,
219
+ & mut data,
220
+ ) ;
221
+ data. write_data_addr ( reloc. offset , gv, 0 ) ;
222
+ }
216
223
}
217
- }
218
- } ;
224
+ } ;
225
+ }
226
+
227
+ module. define_data ( lsda, & data) . unwrap ( ) ;
228
+ fde. lsda = Some ( address_for_data ( lsda) ) ;
219
229
}
220
230
221
- module. define_data ( lsda, & data) . unwrap ( ) ;
222
- fde. lsda = Some ( address_for_data ( lsda) ) ;
223
231
self . frame_table . add_fde ( self . cie_id . unwrap ( ) , fde) ;
224
232
}
225
233
UnwindInfo :: WindowsX64 ( _) | UnwindInfo :: WindowsArm64 ( _) => {
0 commit comments