cranelift-module: Add support for passing a StackMapSink when defining functions

Fixes #2738

This follows the convention set by the existing method of passing a
TrapSink by adding another argument for a StackMapSink.
This commit is contained in:
Will Robson
2021-03-18 16:49:17 +00:00
parent 59dfe4b9f4
commit 38926fb1fc
6 changed files with 26 additions and 24 deletions

View File

@@ -1,5 +1,5 @@
use cranelift::prelude::*; use cranelift::prelude::*;
use cranelift_codegen::binemit::NullTrapSink; use cranelift_codegen::binemit::{NullStackMapSink, NullTrapSink};
use cranelift_codegen::settings::{self, Configurable}; use cranelift_codegen::settings::{self, Configurable};
use cranelift_jit::{JITBuilder, JITModule}; use cranelift_jit::{JITBuilder, JITModule};
use cranelift_module::{default_libcall_names, Linkage, Module}; use cranelift_module::{default_libcall_names, Linkage, Module};
@@ -49,8 +49,9 @@ fn main() {
bcx.finalize(); bcx.finalize();
} }
let mut trap_sink = NullTrapSink {}; let mut trap_sink = NullTrapSink {};
let mut stack_map_sink = NullStackMapSink {};
module module
.define_function(func_a, &mut ctx, &mut trap_sink) .define_function(func_a, &mut ctx, &mut trap_sink, &mut stack_map_sink)
.unwrap(); .unwrap();
module.clear_context(&mut ctx); module.clear_context(&mut ctx);
@@ -74,7 +75,7 @@ fn main() {
bcx.finalize(); bcx.finalize();
} }
module module
.define_function(func_b, &mut ctx, &mut trap_sink) .define_function(func_b, &mut ctx, &mut trap_sink, &mut stack_map_sink)
.unwrap(); .unwrap();
module.clear_context(&mut ctx); module.clear_context(&mut ctx);

View File

@@ -5,7 +5,7 @@ use cranelift_codegen::isa::TargetIsa;
use cranelift_codegen::settings::Configurable; use cranelift_codegen::settings::Configurable;
use cranelift_codegen::{self, ir, settings}; use cranelift_codegen::{self, ir, settings};
use cranelift_codegen::{ use cranelift_codegen::{
binemit::{self, Addend, CodeInfo, CodeOffset, Reloc, RelocSink, TrapSink}, binemit::{Addend, CodeInfo, CodeOffset, Reloc, RelocSink, StackMapSink, TrapSink},
CodegenError, CodegenError,
}; };
use cranelift_entity::SecondaryMap; use cranelift_entity::SecondaryMap;
@@ -601,6 +601,7 @@ impl Module for JITModule {
id: FuncId, id: FuncId,
ctx: &mut cranelift_codegen::Context, ctx: &mut cranelift_codegen::Context,
trap_sink: &mut dyn TrapSink, trap_sink: &mut dyn TrapSink,
stack_map_sink: &mut dyn StackMapSink,
) -> ModuleResult<ModuleCompiledFunction> { ) -> ModuleResult<ModuleCompiledFunction> {
info!("defining function {}: {}", id, ctx.func.display(self.isa())); info!("defining function {}: {}", id, ctx.func.display(self.isa()));
let CodeInfo { let CodeInfo {
@@ -625,16 +626,7 @@ impl Module for JITModule {
.expect("TODO: handle OOM etc."); .expect("TODO: handle OOM etc.");
let mut reloc_sink = JITRelocSink::default(); let mut reloc_sink = JITRelocSink::default();
let mut stack_map_sink = binemit::NullStackMapSink {}; unsafe { ctx.emit_to_memory(&*self.isa, ptr, &mut reloc_sink, trap_sink, stack_map_sink) };
unsafe {
ctx.emit_to_memory(
&*self.isa,
ptr,
&mut reloc_sink,
trap_sink,
&mut stack_map_sink,
)
};
self.record_function_for_perf(ptr, size, &decl.name); self.record_function_for_perf(ptr, size, &decl.name);
self.compiled_functions[id] = Some(CompiledBlob { self.compiled_functions[id] = Some(CompiledBlob {

View File

@@ -1,4 +1,4 @@
use cranelift_codegen::binemit::NullTrapSink; use cranelift_codegen::binemit::{NullStackMapSink, NullTrapSink};
use cranelift_codegen::ir::*; use cranelift_codegen::ir::*;
use cranelift_codegen::isa::CallConv; use cranelift_codegen::isa::CallConv;
use cranelift_codegen::settings::{self, Configurable}; use cranelift_codegen::settings::{self, Configurable};
@@ -57,8 +57,9 @@ fn define_simple_function(module: &mut JITModule) -> FuncId {
} }
let mut trap_sink = NullTrapSink {}; let mut trap_sink = NullTrapSink {};
let mut stack_map_sink = NullStackMapSink {};
module module
.define_function(func_id, &mut ctx, &mut trap_sink) .define_function(func_id, &mut ctx, &mut trap_sink, &mut stack_map_sink)
.unwrap(); .unwrap();
func_id func_id
@@ -205,8 +206,9 @@ fn libcall_function() {
} }
let mut trap_sink = NullTrapSink {}; let mut trap_sink = NullTrapSink {};
let mut stack_map_sink = NullStackMapSink {};
module module
.define_function(func_id, &mut ctx, &mut trap_sink) .define_function(func_id, &mut ctx, &mut trap_sink, &mut stack_map_sink)
.unwrap(); .unwrap();
module.finalize_definitions(); module.finalize_definitions();

View File

@@ -469,6 +469,7 @@ pub trait Module {
func: FuncId, func: FuncId,
ctx: &mut Context, ctx: &mut Context,
trap_sink: &mut dyn binemit::TrapSink, trap_sink: &mut dyn binemit::TrapSink,
stack_map_sink: &mut dyn binemit::StackMapSink,
) -> ModuleResult<ModuleCompiledFunction>; ) -> ModuleResult<ModuleCompiledFunction>;
/// Define a function, taking the function body from the given `bytes`. /// Define a function, taking the function body from the given `bytes`.
@@ -562,8 +563,9 @@ impl<M: Module> Module for &mut M {
func: FuncId, func: FuncId,
ctx: &mut Context, ctx: &mut Context,
trap_sink: &mut dyn binemit::TrapSink, trap_sink: &mut dyn binemit::TrapSink,
stack_map_sink: &mut dyn binemit::StackMapSink,
) -> ModuleResult<ModuleCompiledFunction> { ) -> ModuleResult<ModuleCompiledFunction> {
(**self).define_function(func, ctx, trap_sink) (**self).define_function(func, ctx, trap_sink, stack_map_sink)
} }
fn define_function_bytes( fn define_function_bytes(

View File

@@ -5,7 +5,7 @@ use cranelift_codegen::entity::SecondaryMap;
use cranelift_codegen::isa::TargetIsa; use cranelift_codegen::isa::TargetIsa;
use cranelift_codegen::{self, ir}; use cranelift_codegen::{self, ir};
use cranelift_codegen::{ use cranelift_codegen::{
binemit::{Addend, CodeInfo, CodeOffset, NullStackMapSink, Reloc, RelocSink, TrapSink}, binemit::{Addend, CodeInfo, CodeOffset, Reloc, RelocSink, StackMapSink, TrapSink},
CodegenError, CodegenError,
}; };
use cranelift_module::{ use cranelift_module::{
@@ -248,6 +248,7 @@ impl Module for ObjectModule {
func_id: FuncId, func_id: FuncId,
ctx: &mut cranelift_codegen::Context, ctx: &mut cranelift_codegen::Context,
trap_sink: &mut dyn TrapSink, trap_sink: &mut dyn TrapSink,
stack_map_sink: &mut dyn StackMapSink,
) -> ModuleResult<ModuleCompiledFunction> { ) -> ModuleResult<ModuleCompiledFunction> {
info!( info!(
"defining function {}: {}", "defining function {}: {}",
@@ -260,7 +261,6 @@ impl Module for ObjectModule {
} = ctx.compile(self.isa())?; } = ctx.compile(self.isa())?;
let mut code: Vec<u8> = vec![0; code_size as usize]; let mut code: Vec<u8> = vec![0; code_size as usize];
let mut reloc_sink = ObjectRelocSink::default(); let mut reloc_sink = ObjectRelocSink::default();
let mut stack_map_sink = NullStackMapSink {};
unsafe { unsafe {
ctx.emit_to_memory( ctx.emit_to_memory(
@@ -268,7 +268,7 @@ impl Module for ObjectModule {
code.as_mut_ptr(), code.as_mut_ptr(),
&mut reloc_sink, &mut reloc_sink,
trap_sink, trap_sink,
&mut stack_map_sink, stack_map_sink,
) )
}; };

View File

@@ -1,6 +1,9 @@
use cranelift_codegen::ir::*; use cranelift_codegen::ir::*;
use cranelift_codegen::isa::CallConv; use cranelift_codegen::isa::CallConv;
use cranelift_codegen::{binemit::NullTrapSink, settings}; use cranelift_codegen::{
binemit::{NullStackMapSink, NullTrapSink},
settings,
};
use cranelift_codegen::{ir::types::I16, Context}; use cranelift_codegen::{ir::types::I16, Context};
use cranelift_entity::EntityRef; use cranelift_entity::EntityRef;
use cranelift_frontend::*; use cranelift_frontend::*;
@@ -51,8 +54,9 @@ fn define_simple_function(module: &mut ObjectModule) -> FuncId {
} }
let mut trap_sink = NullTrapSink {}; let mut trap_sink = NullTrapSink {};
let mut stack_map_sink = NullStackMapSink {};
module module
.define_function(func_id, &mut ctx, &mut trap_sink) .define_function(func_id, &mut ctx, &mut trap_sink, &mut stack_map_sink)
.unwrap(); .unwrap();
func_id func_id
@@ -191,8 +195,9 @@ fn libcall_function() {
} }
let mut trap_sink = NullTrapSink {}; let mut trap_sink = NullTrapSink {};
let mut stack_map_sink = NullStackMapSink {};
module module
.define_function(func_id, &mut ctx, &mut trap_sink) .define_function(func_id, &mut ctx, &mut trap_sink, &mut stack_map_sink)
.unwrap(); .unwrap();
module.finish(); module.finish();