22use gccjit:: FnAttribute ;
33use gccjit:: { Context , FunctionType , RValue , ToRValue , Type } ;
44use rustc_ast:: expand:: allocator:: {
5- ALLOC_ERROR_HANDLER , ALLOCATOR_METHODS , AllocatorKind , AllocatorTy , NO_ALLOC_SHIM_IS_UNSTABLE ,
6- default_fn_name, global_fn_name,
5+ AllocatorMethod , AllocatorTy , NO_ALLOC_SHIM_IS_UNSTABLE , default_fn_name, global_fn_name,
76} ;
87use rustc_middle:: bug;
98use rustc_middle:: ty:: TyCtxt ;
@@ -18,8 +17,7 @@ pub(crate) unsafe fn codegen(
1817 tcx : TyCtxt < ' _ > ,
1918 mods : & mut GccContext ,
2019 _module_name : & str ,
21- kind : AllocatorKind ,
22- alloc_error_handler_kind : AllocatorKind ,
20+ methods : & [ AllocatorMethod ] ,
2321) {
2422 let context = & mods. context ;
2523 let usize = match tcx. sess . target . pointer_width {
@@ -31,46 +29,34 @@ pub(crate) unsafe fn codegen(
3129 let i8 = context. new_type :: < i8 > ( ) ;
3230 let i8p = i8. make_pointer ( ) ;
3331
34- if kind == AllocatorKind :: Default {
35- for method in ALLOCATOR_METHODS {
36- let mut types = Vec :: with_capacity ( method. inputs . len ( ) ) ;
37- for input in method. inputs . iter ( ) {
38- match input. ty {
39- AllocatorTy :: Layout => {
40- types. push ( usize) ;
41- types. push ( usize) ;
42- }
43- AllocatorTy :: Ptr => types. push ( i8p) ,
44- AllocatorTy :: Usize => types. push ( usize) ,
45-
46- AllocatorTy :: ResultPtr | AllocatorTy :: Unit => panic ! ( "invalid allocator arg" ) ,
32+ for method in methods {
33+ let mut types = Vec :: with_capacity ( method. inputs . len ( ) ) ;
34+ for input in method. inputs . iter ( ) {
35+ match input. ty {
36+ AllocatorTy :: Layout => {
37+ types. push ( usize) ;
38+ types. push ( usize) ;
4739 }
48- }
49- let output = match method. output {
50- AllocatorTy :: ResultPtr => Some ( i8p) ,
51- AllocatorTy :: Unit => None ,
40+ AllocatorTy :: Ptr => types. push ( i8p) ,
41+ AllocatorTy :: Usize => types. push ( usize) ,
5242
53- AllocatorTy :: Layout | AllocatorTy :: Usize | AllocatorTy :: Ptr => {
54- panic ! ( "invalid allocator output " )
43+ AllocatorTy :: Never | AllocatorTy :: ResultPtr | AllocatorTy :: Unit => {
44+ panic ! ( "invalid allocator arg " )
5545 }
56- } ;
57- let from_name = mangle_internal_symbol ( tcx, & global_fn_name ( method. name ) ) ;
58- let to_name = mangle_internal_symbol ( tcx, & default_fn_name ( method. name ) ) ;
59-
60- create_wrapper_function ( tcx, context, & from_name, Some ( & to_name) , & types, output) ;
46+ }
6147 }
62- }
48+ let output = match method. output {
49+ AllocatorTy :: ResultPtr => Some ( i8p) ,
50+ AllocatorTy :: Never | AllocatorTy :: Unit => None ,
6351
64- if alloc_error_handler_kind == AllocatorKind :: Default {
65- // FIXME(bjorn3): Add noreturn attribute
66- create_wrapper_function (
67- tcx,
68- context,
69- & mangle_internal_symbol ( tcx, & global_fn_name ( ALLOC_ERROR_HANDLER ) ) ,
70- Some ( & mangle_internal_symbol ( tcx, & default_fn_name ( ALLOC_ERROR_HANDLER ) ) ) ,
71- & [ usize, usize] ,
72- None ,
73- ) ;
52+ AllocatorTy :: Layout | AllocatorTy :: Usize | AllocatorTy :: Ptr => {
53+ panic ! ( "invalid allocator output" )
54+ }
55+ } ;
56+ let from_name = mangle_internal_symbol ( tcx, & global_fn_name ( method. name ) ) ;
57+ let to_name = mangle_internal_symbol ( tcx, & default_fn_name ( method. name ) ) ;
58+
59+ create_wrapper_function ( tcx, context, & from_name, Some ( & to_name) , & types, output) ;
7460 }
7561
7662 create_const_value_function (
0 commit comments