Struct cranelift_codegen::Context
source · pub struct Context {
pub func: Function,
pub cfg: ControlFlowGraph,
pub domtree: DominatorTree,
pub regalloc: Context,
pub loop_analysis: LoopAnalysis,
}
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
.
regalloc: Context
Register allocation context.
loop_analysis: LoopAnalysis
Loop analysis of func
.
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 compile_and_emit(
&mut self,
isa: &dyn TargetIsa,
mem: &mut Vec<u8>,
relocs: &mut dyn RelocSink,
traps: &mut dyn TrapSink
) -> CodegenResult<()>
pub fn compile_and_emit(
&mut self,
isa: &dyn TargetIsa,
mem: &mut Vec<u8>,
relocs: &mut dyn RelocSink,
traps: &mut dyn TrapSink
) -> CodegenResult<()>
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 are emitted
into relocs
.
This function calls compile
and emit_to_memory
, taking care to resize mem
as
needed, so it provides a safe interface.
sourcepub fn compile(&mut self, isa: &dyn TargetIsa) -> CodegenResult<CodeOffset>
pub fn compile(&mut self, isa: &dyn TargetIsa) -> CodegenResult<CodeOffset>
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 the size of the function’s code.
sourcepub unsafe fn emit_to_memory(
&self,
isa: &dyn TargetIsa,
mem: *mut u8,
relocs: &mut dyn RelocSink,
traps: &mut dyn TrapSink
)
pub unsafe fn emit_to_memory(
&self,
isa: &dyn TargetIsa,
mem: *mut u8,
relocs: &mut dyn RelocSink,
traps: &mut dyn TrapSink
)
Emit machine code directly into raw memory.
Write all of the function’s machine code to the memory at mem
. The size of the machine
code is returned by compile
above.
The machine code is not relocated. Instead, any relocations are emitted into relocs
.
This function is unsafe since it does not perform bounds checking on the memory buffer,
and it can’t guarantee that the mem
pointer is valid.
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 verify_locations(&self, isa: &dyn TargetIsa) -> VerifierResult<()>
pub fn verify_locations(&self, isa: &dyn TargetIsa) -> VerifierResult<()>
Run the locations verifier on the function.
sourcepub fn verify_locations_if(&self, isa: &dyn TargetIsa) -> CodegenResult<()>
pub fn verify_locations_if(&self, isa: &dyn TargetIsa) -> CodegenResult<()>
Run the locations 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 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 postopt(&mut self, isa: &dyn TargetIsa) -> CodegenResult<()>
pub fn postopt(&mut self, isa: &dyn TargetIsa) -> CodegenResult<()>
Perform post-legalization rewrites 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 regalloc(&mut self, isa: &dyn TargetIsa) -> CodegenResult<()>
pub fn regalloc(&mut self, isa: &dyn TargetIsa) -> CodegenResult<()>
Run the register allocator.
sourcepub fn prologue_epilogue(&mut self, isa: &dyn TargetIsa) -> CodegenResult<()>
pub fn prologue_epilogue(&mut self, isa: &dyn TargetIsa) -> CodegenResult<()>
Insert prologue and epilogues after computing the stack frame layout.
sourcepub fn shrink_instructions(&mut self, isa: &dyn TargetIsa) -> CodegenResult<()>
pub fn shrink_instructions(&mut self, isa: &dyn TargetIsa) -> CodegenResult<()>
Run the instruction shrinking pass.
sourcepub fn relax_branches(
&mut self,
isa: &dyn TargetIsa
) -> CodegenResult<CodeOffset>
pub fn relax_branches(
&mut self,
isa: &dyn TargetIsa
) -> CodegenResult<CodeOffset>
Run the branch relaxation pass and return the final code size.