Struct cranelift_codegen::Context
source · pub struct Context {
pub func: Function,
pub cfg: ControlFlowGraph,
pub domtree: DominatorTree,
pub loop_analysis: LoopAnalysis,
pub want_disasm: bool,
/* private fields */
}
Expand description
Persistent data structures and compilation pipeline.
Fields§
§func: Function
The function we’re compiling.
cfg: ControlFlowGraph
The control flow graph of func
.
domtree: DominatorTree
Dominator tree for func
.
loop_analysis: LoopAnalysis
Loop analysis of func
.
want_disasm: bool
Flag: do we want a disassembly with the CompiledCode?
Implementations§
source§impl Context
impl Context
sourcepub fn new() -> Self
pub fn new() -> Self
Allocate a new compilation context.
The returned instance should be reused for compiling multiple functions in order to avoid needless allocator thrashing.
sourcepub fn for_function(func: Function) -> Self
pub fn for_function(func: Function) -> Self
Allocate a new compilation context with an existing Function.
The returned instance should be reused for compiling multiple functions in order to avoid needless allocator thrashing.
sourcepub fn compiled_code(&self) -> Option<&CompiledCode>
pub fn compiled_code(&self) -> Option<&CompiledCode>
Returns the compilation result for this function, available after any compile
function
has been called.
sourcepub fn set_disasm(&mut self, val: bool)
pub fn set_disasm(&mut self, val: bool)
Set the flag to request a disassembly when compiling with a
MachBackend
backend.
sourcepub fn compile_and_emit(
&mut self,
isa: &dyn TargetIsa,
mem: &mut Vec<u8>
) -> Result<&CompiledCode, CompileError<'_>>
pub fn compile_and_emit( &mut self, isa: &dyn TargetIsa, mem: &mut Vec<u8> ) -> Result<&CompiledCode, CompileError<'_>>
Compile the function, and emit machine code into a Vec<u8>
.
Run the function through all the passes necessary to generate code for the target ISA
represented by isa
, as well as the final step of emitting machine code into a
Vec<u8>
. The machine code is not relocated. Instead, any relocations can be obtained
from compiled_code()
.
This function calls compile
, taking care to resize mem
as
needed, so it provides a safe interface.
Returns information about the function’s code and read-only data.
sourcepub fn compile_stencil(
&mut self,
isa: &dyn TargetIsa
) -> CodegenResult<CompiledCodeBase<Stencil>>
pub fn compile_stencil( &mut self, isa: &dyn TargetIsa ) -> CodegenResult<CompiledCodeBase<Stencil>>
Internally compiles the function into a stencil.
Public only for testing and fuzzing purposes.
sourcepub fn compile(
&mut self,
isa: &dyn TargetIsa
) -> Result<&CompiledCode, CompileError<'_>>
pub fn compile( &mut self, isa: &dyn TargetIsa ) -> Result<&CompiledCode, CompileError<'_>>
Compile the function.
Run the function through all the passes necessary to generate code for the target ISA
represented by isa
. This does not include the final step of emitting machine code into a
code sink.
Returns information about the function’s code and read-only data.
sourcepub fn get_code_bb_layout(&self) -> Option<(Vec<usize>, Vec<(usize, usize)>)>
pub fn get_code_bb_layout(&self) -> Option<(Vec<usize>, Vec<(usize, usize)>)>
If available, return information about the code layout in the final machine code: the offsets (in bytes) of each basic-block start, and all basic-block edges.
sourcepub fn create_unwind_info(
&self,
isa: &dyn TargetIsa
) -> CodegenResult<Option<UnwindInfo>>
pub fn create_unwind_info( &self, isa: &dyn TargetIsa ) -> CodegenResult<Option<UnwindInfo>>
Creates unwind information for the function.
Returns None
if the function has no unwind information.
sourcepub fn verify<'a, FOI: Into<FlagsOrIsa<'a>>>(
&self,
fisa: FOI
) -> VerifierResult<()>
pub fn verify<'a, FOI: Into<FlagsOrIsa<'a>>>( &self, fisa: FOI ) -> VerifierResult<()>
Run the verifier on the function.
Also check that the dominator tree and control flow graph are consistent with the function.
sourcepub fn verify_if<'a, FOI: Into<FlagsOrIsa<'a>>>(
&self,
fisa: FOI
) -> CodegenResult<()>
pub fn verify_if<'a, FOI: Into<FlagsOrIsa<'a>>>( &self, fisa: FOI ) -> CodegenResult<()>
Run the verifier only if the enable_verifier
setting is true.
sourcepub fn dce<'a, FOI: Into<FlagsOrIsa<'a>>>(
&mut self,
fisa: FOI
) -> CodegenResult<()>
pub fn dce<'a, FOI: Into<FlagsOrIsa<'a>>>( &mut self, fisa: FOI ) -> CodegenResult<()>
Perform dead-code elimination on the function.
sourcepub fn remove_constant_phis<'a, FOI: Into<FlagsOrIsa<'a>>>(
&mut self,
fisa: FOI
) -> CodegenResult<()>
pub fn remove_constant_phis<'a, FOI: Into<FlagsOrIsa<'a>>>( &mut self, fisa: FOI ) -> CodegenResult<()>
Perform constant-phi removal on the function.
sourcepub fn preopt(&mut self, isa: &dyn TargetIsa) -> CodegenResult<()>
pub fn preopt(&mut self, isa: &dyn TargetIsa) -> CodegenResult<()>
Perform pre-legalization rewrites on the function.
sourcepub fn canonicalize_nans(&mut self, isa: &dyn TargetIsa) -> CodegenResult<()>
pub fn canonicalize_nans(&mut self, isa: &dyn TargetIsa) -> CodegenResult<()>
Perform NaN canonicalizing rewrites on the function.
sourcepub fn legalize(&mut self, isa: &dyn TargetIsa) -> CodegenResult<()>
pub fn legalize(&mut self, isa: &dyn TargetIsa) -> CodegenResult<()>
Run the legalizer for isa
on the function.
sourcepub fn compute_cfg(&mut self)
pub fn compute_cfg(&mut self)
Compute the control flow graph.
sourcepub fn compute_domtree(&mut self)
pub fn compute_domtree(&mut self)
Compute dominator tree.
sourcepub fn compute_loop_analysis(&mut self)
pub fn compute_loop_analysis(&mut self)
Compute the loop analysis.
sourcepub fn simple_gvn<'a, FOI: Into<FlagsOrIsa<'a>>>(
&mut self,
fisa: FOI
) -> CodegenResult<()>
pub fn simple_gvn<'a, FOI: Into<FlagsOrIsa<'a>>>( &mut self, fisa: FOI ) -> CodegenResult<()>
Perform simple GVN on the function.
sourcepub fn licm(&mut self, isa: &dyn TargetIsa) -> CodegenResult<()>
pub fn licm(&mut self, isa: &dyn TargetIsa) -> CodegenResult<()>
Perform LICM on the function.
sourcepub fn eliminate_unreachable_code<'a, FOI>(
&mut self,
fisa: FOI
) -> CodegenResult<()>where
FOI: Into<FlagsOrIsa<'a>>,
pub fn eliminate_unreachable_code<'a, FOI>( &mut self, fisa: FOI ) -> CodegenResult<()>where FOI: Into<FlagsOrIsa<'a>>,
Perform unreachable code elimination.
sourcepub fn replace_redundant_loads(&mut self) -> CodegenResult<()>
pub fn replace_redundant_loads(&mut self) -> CodegenResult<()>
Replace all redundant loads with the known values in memory. These are loads whose values were already loaded by other loads earlier, as well as loads whose values were stored by a store instruction to the same instruction (so-called “store-to-load forwarding”).