33
44use  cranelift_frontend:: { FunctionBuilder ,  FunctionBuilderContext } ; 
55use  rustc_ast:: expand:: allocator:: { 
6-     ALLOCATOR_METHODS ,  AllocatorKind ,  AllocatorTy ,  NO_ALLOC_SHIM_IS_UNSTABLE , 
7-     alloc_error_handler_name,  default_fn_name,  global_fn_name, 
6+     AllocatorMethod ,  AllocatorTy ,  NO_ALLOC_SHIM_IS_UNSTABLE ,  default_fn_name,  global_fn_name, 
87} ; 
9- use  rustc_codegen_ssa:: base:: allocator_kind_for_codegen; 
8+ use  rustc_codegen_ssa:: base:: { allocator_kind_for_codegen,  allocator_shim_contents } ; 
109use  rustc_session:: config:: OomStrategy ; 
1110use  rustc_symbol_mangling:: mangle_internal_symbol; 
1211
@@ -15,75 +14,57 @@ use crate::prelude::*;
1514/// Returns whether an allocator shim was created 
1615pub ( crate )  fn  codegen ( tcx :  TyCtxt < ' _ > ,  module :  & mut  dyn  Module )  -> bool  { 
1716    let  Some ( kind)  = allocator_kind_for_codegen ( tcx)  else  {  return  false  } ; 
18-     codegen_inner ( 
19-         tcx, 
20-         module, 
21-         kind, 
22-         tcx. alloc_error_handler_kind ( ( ) ) . unwrap ( ) , 
23-         tcx. sess . opts . unstable_opts . oom , 
24-     ) ; 
17+     let  methods = allocator_shim_contents ( tcx,  kind) ; 
18+     codegen_inner ( tcx,  module,  & methods,  tcx. sess . opts . unstable_opts . oom ) ; 
2519    true 
2620} 
2721
2822fn  codegen_inner ( 
2923    tcx :  TyCtxt < ' _ > , 
3024    module :  & mut  dyn  Module , 
31-     kind :  AllocatorKind , 
32-     alloc_error_handler_kind :  AllocatorKind , 
25+     methods :  & [ AllocatorMethod ] , 
3326    oom_strategy :  OomStrategy , 
3427)  { 
3528    let  usize_ty = module. target_config ( ) . pointer_type ( ) ; 
3629
37-     if  kind == AllocatorKind :: Default  { 
38-         for  method in  ALLOCATOR_METHODS  { 
39-             let  mut  arg_tys = Vec :: with_capacity ( method. inputs . len ( ) ) ; 
40-             for  input in  method. inputs . iter ( )  { 
41-                 match  input. ty  { 
42-                     AllocatorTy :: Layout  => { 
43-                         arg_tys. push ( usize_ty) ;  // size 
44-                         arg_tys. push ( usize_ty) ;  // align 
45-                     } 
46-                     AllocatorTy :: Ptr  => arg_tys. push ( usize_ty) , 
47-                     AllocatorTy :: Usize  => arg_tys. push ( usize_ty) , 
30+     for  method in  methods { 
31+         let  mut  arg_tys = Vec :: with_capacity ( method. inputs . len ( ) ) ; 
32+         for  input in  method. inputs . iter ( )  { 
33+             match  input. ty  { 
34+                 AllocatorTy :: Layout  => { 
35+                     arg_tys. push ( usize_ty) ;  // size 
36+                     arg_tys. push ( usize_ty) ;  // align 
37+                 } 
38+                 AllocatorTy :: Ptr  => arg_tys. push ( usize_ty) , 
39+                 AllocatorTy :: Usize  => arg_tys. push ( usize_ty) , 
4840
49-                     AllocatorTy :: ResultPtr  | AllocatorTy :: Unit  => panic ! ( "invalid allocator arg" ) , 
41+                 AllocatorTy :: Never  | AllocatorTy :: ResultPtr  | AllocatorTy :: Unit  => { 
42+                     panic ! ( "invalid allocator arg" ) 
5043                } 
5144            } 
52-             let  output = match  method. output  { 
53-                 AllocatorTy :: ResultPtr  => Some ( usize_ty) , 
54-                 AllocatorTy :: Unit  => None , 
45+         } 
46+         let  output = match  method. output  { 
47+             AllocatorTy :: ResultPtr  => Some ( usize_ty) , 
48+             AllocatorTy :: Never  | AllocatorTy :: Unit  => None , 
5549
56-                  AllocatorTy :: Layout  | AllocatorTy :: Usize  | AllocatorTy :: Ptr  => { 
57-                      panic ! ( "invalid allocator output" ) 
58-                  } 
59-              } ; 
50+             AllocatorTy :: Layout  | AllocatorTy :: Usize  | AllocatorTy :: Ptr  => { 
51+                 panic ! ( "invalid allocator output" ) 
52+             } 
53+         } ; 
6054
61-             let  sig = Signature  { 
62-                 call_conv :  module. target_config ( ) . default_call_conv , 
63-                 params :  arg_tys. iter ( ) . cloned ( ) . map ( AbiParam :: new) . collect ( ) , 
64-                 returns :  output. into_iter ( ) . map ( AbiParam :: new) . collect ( ) , 
65-             } ; 
66-             crate :: common:: create_wrapper_function ( 
67-                 module, 
68-                 sig, 
69-                 & mangle_internal_symbol ( tcx,  & global_fn_name ( method. name ) ) , 
70-                 & mangle_internal_symbol ( tcx,  & default_fn_name ( method. name ) ) , 
71-             ) ; 
72-         } 
55+         let  sig = Signature  { 
56+             call_conv :  module. target_config ( ) . default_call_conv , 
57+             params :  arg_tys. iter ( ) . cloned ( ) . map ( AbiParam :: new) . collect ( ) , 
58+             returns :  output. into_iter ( ) . map ( AbiParam :: new) . collect ( ) , 
59+         } ; 
60+         crate :: common:: create_wrapper_function ( 
61+             module, 
62+             sig, 
63+             & mangle_internal_symbol ( tcx,  & global_fn_name ( method. name ) ) , 
64+             & mangle_internal_symbol ( tcx,  & default_fn_name ( method. name ) ) , 
65+         ) ; 
7366    } 
7467
75-     let  sig = Signature  { 
76-         call_conv :  module. target_config ( ) . default_call_conv , 
77-         params :  vec ! [ AbiParam :: new( usize_ty) ,  AbiParam :: new( usize_ty) ] , 
78-         returns :  vec ! [ ] , 
79-     } ; 
80-     crate :: common:: create_wrapper_function ( 
81-         module, 
82-         sig, 
83-         & mangle_internal_symbol ( tcx,  "__rust_alloc_error_handler" ) , 
84-         & mangle_internal_symbol ( tcx,  alloc_error_handler_name ( alloc_error_handler_kind) ) , 
85-     ) ; 
86- 
8768    { 
8869        let  sig = Signature  { 
8970            call_conv :  module. target_config ( ) . default_call_conv , 
0 commit comments