A CallConv enum on every function signature makes it possible to
generate calls to functions with different calling conventions within
the same ISA / within a single function.
The calling conventions also serve as a way of customizing Cretonne's
behavior when embedded inside a VM. As an example, the SpiderWASM
calling convention is used to compile WebAssembly functions that run
inside the SpiderMonkey virtual machine.
All function signatures must have a calling convention at the end, so
this changes the textual IL syntax.
Before:
sig1 = signature(i32, f64) -> f64
After
sig1 = (i32, f64) -> f64 native
sig2 = (i32) spiderwasm
When printing functions, the signature goes after the return types:
function %r1() -> i32, f32 spiderwasm {
ebb1:
...
}
In the parser, this calling convention is optional and defaults to
"native". This is mostly to avoid updating all the existing test cases
under filetests/. When printing a function, the calling convention is
always included, including for "native" functions.
52 lines
1.5 KiB
Rust
52 lines
1.5 KiB
Rust
//! Representation of Cretonne IL functions.
|
|
|
|
pub mod types;
|
|
pub mod entities;
|
|
pub mod condcodes;
|
|
pub mod immediates;
|
|
pub mod instructions;
|
|
pub mod stackslot;
|
|
pub mod jumptable;
|
|
pub mod dfg;
|
|
pub mod layout;
|
|
pub mod function;
|
|
mod builder;
|
|
mod extfunc;
|
|
mod funcname;
|
|
mod memflags;
|
|
mod progpoint;
|
|
mod valueloc;
|
|
|
|
pub use ir::funcname::FunctionName;
|
|
pub use ir::extfunc::{Signature, CallConv, ArgumentType, ArgumentExtension, ArgumentPurpose,
|
|
ExtFuncData};
|
|
pub use ir::types::Type;
|
|
pub use ir::entities::{Ebb, Inst, Value, StackSlot, JumpTable, FuncRef, SigRef};
|
|
pub use ir::instructions::{Opcode, InstructionData, VariableArgs, ValueList, ValueListPool};
|
|
pub use ir::stackslot::{StackSlots, StackSlotKind, StackSlotData};
|
|
pub use ir::jumptable::JumpTableData;
|
|
pub use ir::valueloc::{ValueLoc, ArgumentLoc};
|
|
pub use ir::dfg::{DataFlowGraph, ValueDef};
|
|
pub use ir::layout::{Layout, Cursor};
|
|
pub use ir::function::Function;
|
|
pub use ir::builder::InstBuilder;
|
|
pub use ir::progpoint::{ProgramPoint, ProgramOrder, ExpandedProgramPoint};
|
|
pub use ir::memflags::MemFlags;
|
|
pub use ir::builder::InstBuilderBase;
|
|
|
|
use binemit;
|
|
use entity_map::EntityMap;
|
|
use isa;
|
|
|
|
/// Map of value locations.
|
|
pub type ValueLocations = EntityMap<Value, ValueLoc>;
|
|
|
|
/// Map of jump tables.
|
|
pub type JumpTables = EntityMap<JumpTable, JumpTableData>;
|
|
|
|
/// Map of instruction encodings.
|
|
pub type InstEncodings = EntityMap<Inst, isa::Encoding>;
|
|
|
|
/// Code offsets for EBBs.
|
|
pub type EbbOffsets = EntityMap<Ebb, binemit::CodeOffset>;
|