v3.ssa #
Parallel-SSA worker support, ported from v2's module.v and adapted to v3's raw-block-id operand model: branch/phi/switch operands that name blocks are remapped by the block offset, while ordinary value operands are remapped by the value offset.
fn build #
fn build(a_ &flat.FlatAst) &Module
build supports build handling for ssa.
fn build_with_options #
fn build_with_options(a_ &flat.FlatAst, used_fns map[string]bool, tc &types.TypeChecker, opts BuildOptions) &Module
build_with_options builds with options data for ssa.
fn build_with_used #
fn build_with_used(a_ &flat.FlatAst, used_fns map[string]bool, tc &types.TypeChecker) &Module
build_with_used builds with used data for ssa.
fn AtomicOrdering.from #
fn AtomicOrdering.from[W](input W) !AtomicOrdering
fn CallConv.from #
fn CallConv.from[W](input W) !CallConv
fn InlineHint.from #
fn InlineHint.from[W](input W) !InlineHint
fn Linkage.from #
fn Linkage.from[W](input W) !Linkage
fn Module.new #
fn Module.new() &Module
new creates a Module value for ssa.
fn OpCode.from #
fn OpCode.from[W](input W) !OpCode
fn TypeKind.from #
fn TypeKind.from[W](input W) !TypeKind
fn TypeStore.new #
fn TypeStore.new() TypeStore
new creates a TypeStore value for ssa.
fn ValueKind.from #
fn ValueKind.from[W](input W) !ValueKind
type BlockID #
type BlockID = int
BlockID aliases block id values used by ssa.
type TypeID #
type TypeID = int
TypeID aliases type id values used by ssa.
type ValueID #
type ValueID = int
ValueID aliases value id values used by ssa.
enum AtomicOrdering #
enum AtomicOrdering {
not_atomic
unordered
monotonic
acquire
release
acq_rel
seq_cst
}
AtomicOrdering lists atomic ordering values used by ssa.
enum CallConv #
enum CallConv {
c_decl
fast_call
wasm_std
}
CallConv lists call conv values used by ssa.
enum InlineHint #
enum InlineHint {
none_ // No hint, let optimizer decide
always // Always inline (e.g. V's [inline] attribute)
never // Never inline (e.g. V's [noinline] attribute)
hint // Suggest inlining (optimizer may ignore)
}
InlineHint lists inline hint values used by ssa.
enum Linkage #
enum Linkage {
external
private
internal
}
Linkage lists linkage values used by ssa.
enum OpCode #
enum OpCode {
// Terminators
ret
br
jmp
switch_ // Multi-way branch: switch_ %val, default_block, [case_val, block]...
unreachable
// Binary (integer)
add
sub
mul
sdiv
srem
udiv
urem
// Binary (float)
fadd
fsub
fmul
fdiv
frem
// Bitwise
shl
ashr
lshr
and_
or_
xor
// Memory
alloca
load
store
get_element_ptr
heap_alloc // Heap allocate memory for a type (malloc+zero): returns ptr
fence // Memory ordering barrier
cmpxchg // Atomic compare-exchange
atomicrmw // Atomic read-modify-write
// Comparisons
lt
gt
le
ge
ult
ugt
ule
uge
eq
ne
// Other
call
call_indirect // Indirect call through function pointer
call_sret // Call with struct return (x8 indirect return on ARM64)
neg
trunc
sext
zext
fptoui
fptosi
uitofp
sitofp
bitcast
phi
select
assign // Copy op used during phi elimination
inline_string_init // Build a string struct by value: (string){str, len}
// Concurrency
go_call // Launch goroutine: go_call fn_ref, args...
spawn_call // Launch OS thread: spawn_call fn_ref, args...
// Aggregate (struct/tuple) operations
extractvalue
insertvalue
struct_init
}
OpCode lists op code values used by ssa.
enum TypeKind #
enum TypeKind {
void_t
int_t
float_t
ptr_t
array_t
struct_t
func_t
label_t
metadata_t
}
TypeKind lists type kind values used by ssa.
enum ValueKind #
enum ValueKind {
unknown
constant
argument
global
instruction
phi_result
basic_block
string_literal // V string struct literal (by value)
c_string_literal // C string literal (raw char pointer)
func_ref
}
ValueKind lists value kind values used by ssa.
struct BasicBlock #
struct BasicBlock {
pub mut:
id BlockID
val_id ValueID // SSA value representing the block (0 in v3's raw-block-id model)
name string
parent int
instrs []ValueID
preds []BlockID
succs []BlockID
// Dominators
idom BlockID
dom_tree []BlockID
}
BasicBlock represents basic block data used by ssa.
struct BuildOptions #
struct BuildOptions {
pub:
hot_fn string // build only this function's body (hot reload)
skip_fn_bodies bool // register signatures only, mark them prototypes
skip_modules []string // skip all functions declared in these modules
}
BuildOptions controls which functions a build materializes. The zero value reproduces the default whole-program build.
struct Builder #
struct Builder {
mut:
m &Module = unsafe { nil }
a &flat.FlatAst = unsafe { nil }
tc &types.TypeChecker = unsafe { nil }
used_fns map[string]bool
cur_module string
cur_func int
cur_func_ret_type string
cur_block BlockID
vars map[string]ValueID
var_type_names map[string]string
i64_type TypeID
i32_type TypeID
i8_type TypeID
i1_type TypeID
u64_type TypeID
u32_type TypeID
u16_type TypeID
u8_type TypeID
f32_type TypeID
f64_type TypeID
void_type TypeID
str_type TypeID
array_type TypeID
map_type TypeID
map_state_type TypeID
fn_types map[string]TypeID
fn_ids map[string]int
const_exprs map[string]flat.NodeId
struct_types map[string]TypeID
struct_field_types map[string]string
option_types map[string]TypeID
sum_type_variants map[string][]string
sum_type_canonical map[string]string
enum_types map[string]bool
flag_enum_types map[string]bool
enum_values map[string]int
enum_member_values map[string]int
enum_member_dupes map[string]bool
c_fn_ids map[string]int
c_fn_types map[string]TypeID
label_blocks map[string]BlockID
defer_body_ids []flat.NodeId
break_targets []BlockID
continue_targets []BlockID
top_level_main bool
// --- Build-control machinery (ported from v2 build_all) ---
// When set, build_functions only materializes this one function body (hot reload).
hot_fn string
// When set, build_functions registers signatures only and marks them prototypes.
skip_fn_bodies bool
// When non-empty, all functions declared in these modules are skipped (dead
// code elimination for unused backends/modules).
skip_modules map[string]bool
// SSA-level type alias name -> resolved base TypeID. Supplements the checker's
// alias map (used when building without a checker).
type_aliases map[string]TypeID
}
Builder stores state for SSA construction.
struct ConstantData #
struct ConstantData {
pub:
int_val i64
float_val f64
str_val string
}
ConstantData carries the typed payload of a constant value. It mirrors v2's representation so backends can recover the original int/float/string value instead of re-parsing Value.name.
struct FuncSSAData #
struct FuncSSAData {
pub:
func_idx int // index into the main module's funcs[]
blocks []BlockID // worker-local block ids
params []ValueID // worker-local param value ids
}
FuncSSAData holds the SSA a worker produced for a single function.
struct Function #
struct Function {
pub mut:
id int
name string
typ TypeID
blocks []BlockID
params []ValueID
is_c_extern bool // C-language extern function (no V body)
is_prototype bool // Registered declaration/signature whose body is not materialized yet
linkage Linkage
call_conv CallConv
}
Function represents function data used by ssa.
struct GlobalVar #
struct GlobalVar {
pub mut:
name string
typ TypeID
linkage Linkage
alignment int
is_constant bool
initial_value i64 // For constants/enums, the initial integer value
initial_data []u8 // For constant arrays: serialized element data
}
GlobalVar represents global var data used by ssa.
struct Instruction #
struct Instruction {
pub mut:
op OpCode
operands []ValueID
block BlockID
typ TypeID
pos token.Pos
atomic_ord AtomicOrdering
inline InlineHint // Inline hint for call instructions
}
Instruction represents instruction data used by ssa.
fn (Instruction) is_block_operand #
fn (i &Instruction) is_block_operand(idx int) bool
is_block_operand reports whether operand idx names a basic block rather than an SSA value. Keep all mixed-layout instruction knowledge here so CFG, optimizer, verifier, and worker code cannot disagree about operand roles.
fn (Instruction) is_value_operand #
fn (i &Instruction) is_value_operand(idx int) bool
is_value_operand reports whether operand idx names an SSA value.
fn (Instruction) is_definition_operand #
fn (i &Instruction) is_definition_operand(idx int) bool
is_definition_operand reports whether operand idx is defined by an instruction rather than read by it. Phi lowering represents copies as assign destination, source, so the destination must never participate in use lists or replacement walks.
fn (Instruction) is_successor_operand #
fn (i &Instruction) is_successor_operand(idx int) bool
is_successor_operand reports whether operand idx is a CFG successor. Phi block operands are predecessors, so they intentionally do not match here.
struct Module #
struct Module {
pub mut:
name string
target TargetData
type_store TypeStore
values []Value
instrs []Instruction
blocks []BasicBlock
funcs []Function
globals []GlobalVar
// C struct names: TypeID -> C struct name (e.g. for `struct stat`). Used by
// codegen to emit `typedef struct <name> ...;` and preserve the C layout.
c_struct_names map[int]string
// C structs marked @[typedef] — already a C typedef, not a struct tag.
c_typedef_structs map[int]bool
// Constant cache: "type:name" -> ValueID for deduplication.
const_cache map[string]ValueID
}
Module represents module data used by ssa.
fn (Module) add_block #
fn (mut m Module) add_block(func_id int, name string) BlockID
add_block updates add block state for Module.
fn (Module) add_external_global #
fn (mut m Module) add_external_global(name string, typ TypeID) ValueID
add_external_global registers (or reuses) a global defined outside this module (e.g. C runtime globals such as __stdoutp). Returns the global pointer value.
fn (Module) add_global #
fn (mut m Module) add_global(name string, typ TypeID) ValueID
add_global updates add global state for Module.
fn (Module) add_global_with_data #
fn (mut m Module) add_global_with_data(name string, elem_type TypeID, is_const bool, data []u8) ValueID
add_global_with_data registers a private global initialized from raw bytes (used for const arrays serialized to element data).
fn (Module) add_instr #
fn (mut m Module) add_instr(op OpCode, block BlockID, typ TypeID, operands []ValueID) ValueID
add_instr updates add instr state for Module.
fn (Module) add_instr_front #
fn (mut m Module) add_instr_front(op OpCode, block BlockID, typ TypeID, operands []ValueID) ValueID
add_instr_front creates an instruction and prepends it to the block (used for phi insertion by mem2reg, which requires phis at the top of a block).
fn (Module) add_value #
fn (mut m Module) add_value(kind ValueKind, typ TypeID, name string, index int) ValueID
add_value updates add value state for Module.
fn (Module) add_value_user #
fn (mut m Module) add_value_user(value_id ValueID, user_id ValueID)
add_value_user records one instruction in a value's unique user list.
fn (Module) append_phi_operands #
fn (mut m Module) append_phi_operands(phi_val_id ValueID, val ValueID, block_id BlockID)
append_phi_operands appends a (val, block_id) pair to a phi instruction.
fn (Module) block_add_pred #
fn (mut m Module) block_add_pred(to BlockID, from BlockID)
block_add_pred supports block add pred handling for Module.
fn (Module) block_add_succ #
fn (mut m Module) block_add_succ(from BlockID, to BlockID)
block_add_succ supports block add succ handling for Module.
fn (Module) detach_instruction_uses #
fn (mut m Module) detach_instruction_uses(value_id ValueID)
detach_instruction_uses removes every use edge contributed by an instruction that is about to leave its block.
fn (Module) func_add_param #
fn (mut m Module) func_add_param(func_id int, param_val ValueID)
func_add_param supports func add param handling for Module.
fn (Module) func_set_c_extern #
fn (mut m Module) func_set_c_extern(func_id int, val bool)
func_set_c_extern supports func set c extern handling for Module.
fn (Module) func_set_prototype #
fn (mut m Module) func_set_prototype(func_id int, val bool)
func_set_prototype supports func set prototype handling for Module.
fn (Module) get_block_from_val #
fn (m &Module) get_block_from_val(val_id int) int
get_block_from_val converts a basic-block value operand to its block index.
fn (Module) get_or_add_const #
fn (mut m Module) get_or_add_const(typ TypeID, name string) ValueID
get_or_add_const returns get or add const data for Module.
fn (Module) merge_worker_module #
fn (mut m Module) merge_worker_module(w &Module, func_data []FuncSSAData, seed_values int, seed_instrs int, seed_blocks int, seed_types int, seed_funcs int)
merge_worker_module folds a worker's freshly-built SSA (everything beyond the seed lengths) back into the main module, remapping type/value/instr/block/func ids. func_data carries each built function's worker-local blocks/params.
fn (Module) new_function #
fn (mut m Module) new_function(name string, ret TypeID) int
new_function supports new function handling for Module.
fn (Module) new_worker_module #
fn (mut m Module) new_worker_module() &Module
new_worker_module creates a lightweight Module for parallel SSA building. The worker gets a deep copy of the type store and is seeded with the main module's values/instrs/blocks so ids produced in earlier (serial) phases stay valid.
fn (Module) remove_value_user #
fn (mut m Module) remove_value_user(value_id ValueID, user_id ValueID)
remove_value_user removes one instruction from a value's unique user list.
fn (Module) replace_uses #
fn (mut m Module) replace_uses(old_id ValueID, new_id ValueID)
replace_uses supports replace uses handling for Module.
fn (Module) rewrite_instruction #
fn (mut m Module) rewrite_instruction(value_id ValueID, op OpCode, operands []ValueID)
rewrite_instruction changes an instruction while maintaining its value-use edges. CFG edges remain the responsibility of callers that change a terminator; they can rebuild or update the CFG once after batching edits.
fn (Module) struct_field_offset #
fn (m &Module) struct_field_offset(typ_id TypeID, field_idx int) int
struct_field_offset returns the byte offset of a field in a struct type.
fn (Module) struct_field_size #
fn (m &Module) struct_field_size(typ_id TypeID, field_idx int) int
struct_field_size returns the byte size of a field in a struct type.
fn (Module) type_align #
fn (m &Module) type_align(typ_id TypeID) int
type_align returns the ABI alignment for an SSA type on the current target.
fn (Module) type_size #
fn (m &Module) type_size(typ_id TypeID) int
type_size returns the byte size for an SSA type on the current target.
struct TargetData #
struct TargetData {
pub:
ptr_size int = 8
endian_little bool = true
}
TargetData represents target data data used by ssa.
struct Type #
struct Type {
pub:
kind TypeKind
width int
is_unsigned bool
elem_type TypeID // For Ptr, Array
len int // For Array
fields []TypeID
field_names []string
params []TypeID
ret_type TypeID
is_c_struct bool // True for C interop structs (raw field names, typedef to C struct)
is_union bool // True for union types (all fields overlap at offset 0)
}
Type represents type data used by ssa.
struct TypeStore #
struct TypeStore {
pub mut:
types []Type
cache map[string]TypeID
}
TypeStore represents type store data used by ssa.
fn (TypeStore) get_int #
fn (mut ts TypeStore) get_int(width int) TypeID
get_int returns get int data for TypeStore.
fn (TypeStore) get_uint #
fn (mut ts TypeStore) get_uint(width int) TypeID
get_uint returns get uint data for TypeStore.
fn (TypeStore) get_float #
fn (mut ts TypeStore) get_float(width int) TypeID
get_float returns get float data for TypeStore.
fn (TypeStore) get_ptr #
fn (mut ts TypeStore) get_ptr(elem TypeID) TypeID
get_ptr returns get ptr data for TypeStore.
fn (TypeStore) get_array #
fn (mut ts TypeStore) get_array(elem TypeID, length int) TypeID
get_array returns the cached fixed-array type for (elem, length).
fn (TypeStore) get_tuple #
fn (mut ts TypeStore) get_tuple(elem_types []TypeID) TypeID
get_tuple returns a cached anonymous struct type holding the given element types.
fn (TypeStore) register #
fn (mut ts TypeStore) register(t Type) TypeID
register supports register handling for TypeStore.
struct Value #
struct Value {
pub mut:
id ValueID
kind ValueKind
typ TypeID
name string
index int
uses []ValueID
}
Value represents value data used by ssa.
- README
- fn build
- fn build_with_options
- fn build_with_used
- fn AtomicOrdering.from
- fn CallConv.from
- fn InlineHint.from
- fn Linkage.from
- fn Module.new
- fn OpCode.from
- fn TypeKind.from
- fn TypeStore.new
- fn ValueKind.from
- type BlockID
- type TypeID
- type ValueID
- enum AtomicOrdering
- enum CallConv
- enum InlineHint
- enum Linkage
- enum OpCode
- enum TypeKind
- enum ValueKind
- struct BasicBlock
- struct BuildOptions
- struct Builder
- struct ConstantData
- struct FuncSSAData
- struct Function
- struct GlobalVar
- struct Instruction
- struct Module
- fn add_block
- fn add_external_global
- fn add_global
- fn add_global_with_data
- fn add_instr
- fn add_instr_front
- fn add_value
- fn add_value_user
- fn append_phi_operands
- fn block_add_pred
- fn block_add_succ
- fn detach_instruction_uses
- fn func_add_param
- fn func_set_c_extern
- fn func_set_prototype
- fn get_block_from_val
- fn get_or_add_const
- fn merge_worker_module
- fn new_function
- fn new_worker_module
- fn remove_value_user
- fn replace_uses
- fn rewrite_instruction
- fn struct_field_offset
- fn struct_field_size
- fn type_align
- fn type_size
- struct TargetData
- struct Type
- struct TypeStore
- struct Value