diff options
| author | bjorn3 <17426603+bjorn3@users.noreply.github.com> | 2023-02-09 12:38:16 +0100 |
|---|---|---|
| committer | bjorn3 <17426603+bjorn3@users.noreply.github.com> | 2023-02-09 12:38:16 +0100 |
| commit | e25566e20b079b7eae57518768dee44fb53c8cbb (patch) | |
| tree | a686ce563f3fd3c1798e637246957090540cbe8a /compiler/rustc_codegen_cranelift/src/common.rs | |
| parent | c40919b7a75f93ed7ef040361e82c656d246d41e (diff) | |
| parent | 7d53619064ab7045c383644cb445052d2a3d46db (diff) | |
| download | rust-e25566e20b079b7eae57518768dee44fb53c8cbb.tar.gz rust-e25566e20b079b7eae57518768dee44fb53c8cbb.zip | |
Merge commit '7d53619064ab7045c383644cb445052d2a3d46db' into sync_cg_clif-2023-02-09
Diffstat (limited to 'compiler/rustc_codegen_cranelift/src/common.rs')
| -rw-r--r-- | compiler/rustc_codegen_cranelift/src/common.rs | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/compiler/rustc_codegen_cranelift/src/common.rs b/compiler/rustc_codegen_cranelift/src/common.rs index f41af3a9e63..a8be0d32cc8 100644 --- a/compiler/rustc_codegen_cranelift/src/common.rs +++ b/compiler/rustc_codegen_cranelift/src/common.rs @@ -254,6 +254,44 @@ pub(crate) fn type_sign(ty: Ty<'_>) -> bool { } } +pub(crate) fn create_wrapper_function( + module: &mut dyn Module, + unwind_context: &mut UnwindContext, + sig: Signature, + wrapper_name: &str, + callee_name: &str, +) { + let wrapper_func_id = module.declare_function(wrapper_name, Linkage::Export, &sig).unwrap(); + let callee_func_id = module.declare_function(callee_name, Linkage::Import, &sig).unwrap(); + + let mut ctx = Context::new(); + ctx.func.signature = sig; + { + let mut func_ctx = FunctionBuilderContext::new(); + let mut bcx = FunctionBuilder::new(&mut ctx.func, &mut func_ctx); + + let block = bcx.create_block(); + bcx.switch_to_block(block); + let func = &mut bcx.func.stencil; + let args = func + .signature + .params + .iter() + .map(|param| func.dfg.append_block_param(block, param.value_type)) + .collect::<Vec<Value>>(); + + let callee_func_ref = module.declare_func_in_func(callee_func_id, &mut bcx.func); + let call_inst = bcx.ins().call(callee_func_ref, &args); + let results = bcx.inst_results(call_inst).to_vec(); // Clone to prevent borrow error + + bcx.ins().return_(&results); + bcx.seal_all_blocks(); + bcx.finalize(); + } + module.define_function(wrapper_func_id, &mut ctx).unwrap(); + unwind_context.add_function(wrapper_func_id, &ctx, module.isa()); +} + pub(crate) struct FunctionCx<'m, 'clif, 'tcx: 'm> { pub(crate) cx: &'clif mut crate::CodegenCx, pub(crate) module: &'m mut dyn Module, |
