@@ -264,22 +264,20 @@ fn data_id_for_static(
264
264
265
265
fn define_all_allocs ( tcx : TyCtxt < ' _ > , module : & mut Module < impl Backend > , cx : & mut ConstantCx ) {
266
266
while let Some ( todo_item) = cx. todo . pop ( ) {
267
- let ( data_id, alloc) = match todo_item {
267
+ let ( data_id, alloc, section_name ) = match todo_item {
268
268
TodoItem :: Alloc ( alloc_id) => {
269
269
//println!("alloc_id {}", alloc_id);
270
270
let alloc = match tcx. get_global_alloc ( alloc_id) . unwrap ( ) {
271
271
GlobalAlloc :: Memory ( alloc) => alloc,
272
272
GlobalAlloc :: Function ( _) | GlobalAlloc :: Static ( _) => unreachable ! ( ) ,
273
273
} ;
274
274
let data_id = data_id_for_alloc_id ( module, alloc_id, alloc. align ) ;
275
- ( data_id, alloc)
275
+ ( data_id, alloc, None )
276
276
}
277
277
TodoItem :: Static ( def_id) => {
278
278
//println!("static {:?}", def_id);
279
279
280
- if tcx. is_foreign_item ( def_id) {
281
- continue ;
282
- }
280
+ let section_name = tcx. codegen_fn_attrs ( def_id) . link_section . map ( |s| s. as_str ( ) ) ;
283
281
284
282
let const_ = tcx. const_eval_poly ( def_id) . unwrap ( ) ;
285
283
@@ -298,7 +296,7 @@ fn define_all_allocs(tcx: TyCtxt<'_>, module: &mut Module<impl Backend>, cx: &mu
298
296
Linkage :: Export // FIXME Set hidden visibility
299
297
} ,
300
298
) ;
301
- ( data_id, alloc)
299
+ ( data_id, alloc, section_name )
302
300
}
303
301
} ;
304
302
@@ -309,6 +307,11 @@ fn define_all_allocs(tcx: TyCtxt<'_>, module: &mut Module<impl Backend>, cx: &mu
309
307
310
308
let mut data_ctx = DataContext :: new ( ) ;
311
309
310
+ if let Some ( section_name) = section_name {
311
+ // FIXME set correct segment for Mach-O files
312
+ data_ctx. set_segment_section ( "" , & * section_name) ;
313
+ }
314
+
312
315
let bytes = alloc. inspect_with_undef_and_ptr_outside_interpreter ( 0 ..alloc. len ( ) ) . to_vec ( ) ;
313
316
data_ctx. define ( bytes. into_boxed_slice ( ) ) ;
314
317
0 commit comments