@@ -6,6 +6,7 @@ use crate::prelude::*;
6
6
use rustc_ast:: expand:: allocator:: { AllocatorKind , AllocatorTy , ALLOCATOR_METHODS } ;
7
7
use rustc_codegen_ssa:: base:: allocator_kind_for_codegen;
8
8
use rustc_session:: config:: OomStrategy ;
9
+ use rustc_span:: symbol:: sym;
9
10
10
11
/// Returns whether an allocator shim was created
11
12
pub ( crate ) fn codegen (
@@ -14,14 +15,21 @@ pub(crate) fn codegen(
14
15
unwind_context : & mut UnwindContext ,
15
16
) -> bool {
16
17
let Some ( kind) = allocator_kind_for_codegen ( tcx) else { return false } ;
17
- codegen_inner ( module, unwind_context, kind, tcx. sess . opts . unstable_opts . oom ) ;
18
+ codegen_inner (
19
+ module,
20
+ unwind_context,
21
+ kind,
22
+ tcx. alloc_error_handler_kind ( ( ) ) . unwrap ( ) ,
23
+ tcx. sess . opts . unstable_opts . oom ,
24
+ ) ;
18
25
true
19
26
}
20
27
21
28
fn codegen_inner (
22
29
module : & mut impl Module ,
23
30
unwind_context : & mut UnwindContext ,
24
31
kind : AllocatorKind ,
32
+ alloc_error_handler_kind : AllocatorKind ,
25
33
oom_strategy : OomStrategy ,
26
34
) {
27
35
let usize_ty = module. target_config ( ) . pointer_type ( ) ;
@@ -63,6 +71,19 @@ fn codegen_inner(
63
71
) ;
64
72
}
65
73
74
+ let sig = Signature {
75
+ call_conv : module. target_config ( ) . default_call_conv ,
76
+ params : vec ! [ AbiParam :: new( usize_ty) , AbiParam :: new( usize_ty) ] ,
77
+ returns : vec ! [ ] ,
78
+ } ;
79
+ crate :: common:: create_wrapper_function (
80
+ module,
81
+ unwind_context,
82
+ sig,
83
+ "__rust_alloc_error_handler" ,
84
+ & alloc_error_handler_kind. fn_name ( sym:: oom) ,
85
+ ) ;
86
+
66
87
let data_id = module. declare_data ( OomStrategy :: SYMBOL , Linkage :: Export , false , false ) . unwrap ( ) ;
67
88
let mut data_ctx = DataContext :: new ( ) ;
68
89
data_ctx. set_align ( 1 ) ;
0 commit comments