271 lines
7.6 KiB
Rust
271 lines
7.6 KiB
Rust
#![allow(non_camel_case_types, dead_code, non_upper_case_globals, improper_ctypes)]
|
|
// Auto-generated Rust bindings from assembly source
|
|
|
|
unsafe extern "C" {
|
|
pub unsafe fn parse_func(ast: *mut Ast) -> u64;
|
|
pub unsafe fn parse_args(ast: *mut Ast) -> (*const u64, usize);
|
|
pub unsafe fn parse_primary_expr(ast: *mut Ast) -> (u64, bool);
|
|
pub unsafe fn parse_binary_expr(ast: *mut Ast, precedence: u8) -> (u64, bool);
|
|
pub unsafe fn parse_expr(ast: *mut Ast) -> u64;
|
|
pub unsafe fn parse_statement(ast: *mut Ast) -> u64;
|
|
pub unsafe fn parse_block(ast: *mut Ast) -> u64;
|
|
pub unsafe fn parse_type(ast: *mut Ast) -> Type;
|
|
pub unsafe fn parse_prefix_expr(ast: *mut Ast) -> (u64, bool);
|
|
pub unsafe fn parse_assignment(ast: *mut Ast) -> (u64, bool);
|
|
pub unsafe fn ast_parse_let(ast: *mut Ast) -> (u64, bool);
|
|
pub unsafe fn symkey_cmp(a: *const SymKey, b: *const SymKey) -> i32;
|
|
pub unsafe fn ast_build_symtable(ast: *mut Ast, root_index: u64, symtable: *mut core::mem::MaybeUninit<SymbolTable>);
|
|
pub unsafe fn ast_walk_for_each(ast: *mut Ast, start_index: u64, ctx: *mut (), for_each: unsafe extern "C" fn(ctx: *mut (), *mut Ast, node_index: u64, scope: u64));
|
|
pub unsafe fn ast_resolve_var_refs(ast: *mut Ast, ctx: *mut SymbolTable, root_index: u64);
|
|
pub unsafe fn get_register_name(reg_idx: u8, width: u8, buffer: *mut u8) -> FFISlice;
|
|
pub unsafe fn stackvar_cmp(a: *const (u64, u64), b: *const (u64, u64)) -> i32;
|
|
pub unsafe fn codegen_allocate_register(ctx: *mut FunctionCtx) -> u8;
|
|
pub unsafe fn codegen_allocate_place(ctx: *mut FunctionCtx, width: u16) -> Operand;
|
|
pub unsafe fn codegen_allocate_value(ctx: *mut FunctionCtx, width: u16) -> Operand;
|
|
pub unsafe fn codegen_free_operand(ctx: *mut FunctionCtx, operand: *const Operand) -> ();
|
|
pub unsafe fn codegen_function(ast: *const CodegenCtx, func_idx: u64) -> ();
|
|
pub unsafe fn codegen_push_pop_used_registers(text: *mut Vec<u8>, function_ctx: &FunctionCtx, pop: bool) -> u8;
|
|
pub unsafe fn codegen_expr(ctx: *const CodegenCtx, function_ctx: &FunctionCtx, expr_idx: u64) -> (u64, bool);
|
|
pub unsafe fn vec_insert_many(vec: *mut BlobVec, index: usize, data: *const u8, count: usize);
|
|
pub unsafe fn vec_extend(vec: *mut BlobVec, elements: *const u8, count: usize) -> ();
|
|
}
|
|
|
|
pub const SYM_KEY_SCOPE: u8 = 1;
|
|
pub const SYM_KEY_SCOPE_NAME: u8 = 2;
|
|
pub const SYM_KEY_PARENT_SCOPE: u8 = 3;
|
|
pub const SYM_KEY_START_LOCALS: u8 = 4;
|
|
pub const SYM_KEY_ARG: u8 = 5;
|
|
pub const SYM_KEY_VAR: u8 = 6;
|
|
pub const SYM_KEY_END_LOCALS: u8 = 7;
|
|
pub const AST_FUNCTION: u8 = 1;
|
|
pub const AST_BLOCK: u8 = 2;
|
|
pub const AST_VARIABLE: u8 = 3;
|
|
pub const AST_NUMBER: u8 = 4;
|
|
pub const AST_BINARY_OP: u8 = 5;
|
|
pub const AST_RETURN_STATEMENT: u8 = 6;
|
|
pub const AST_VALUE_TO_PLACE: u8 = 7;
|
|
pub const AST_PLACE_TO_VALUE: u8 = 8;
|
|
pub const AST_ASSIGNMENT: u8 = 9;
|
|
pub const AST_DEREF: u8 = 10;
|
|
pub const AST_ADDRESS_OF: u8 = 11;
|
|
pub const AST_VAR_DECL: u8 = 12;
|
|
pub const AST_VAR_REF: u8 = 13;
|
|
pub const AST_ARG: u8 = 14;
|
|
pub const TYPE_VOID: u8 = 1;
|
|
pub const TYPE_BOOL: u8 = 2;
|
|
pub const TYPE_I32: u8 = 3;
|
|
pub const TYPE_U32: u8 = 4;
|
|
pub const TYPE_STR: u8 = 5;
|
|
pub const TYPE_POINTER: u8 = 6;
|
|
pub const OPERAND_REGISTER: u32 = 1;
|
|
pub const OPERAND_RBP_OFFSET: u32 = 2;
|
|
pub const OPERAND_RSP_OFFSET: u32 = 3;
|
|
pub const OPERAND_ADDRESS: u32 = 4;
|
|
pub const OPERAND_IMMEDIATE: u32 = 5;
|
|
pub const OPERAND_CONSTANT: u32 = 6;
|
|
pub const OPERAND_LABEL: u32 = 7;
|
|
pub const OPERAND_REGISTER_PLACE: u32 = 8;
|
|
pub const OPERAND_RBP_PLACE: u32 = 9;
|
|
pub const TOKEN_EOF: u8 = 0;
|
|
pub const TOKEN_LET: u8 = 1;
|
|
pub const TOKEN_IF: u8 = 2;
|
|
pub const TOKEN_ELSE: u8 = 3;
|
|
pub const TOKEN_FN: u8 = 4;
|
|
pub const TOKEN_RETURN: u8 = 5;
|
|
pub const TOKEN_LOOP: u8 = 6;
|
|
pub const TOKEN_BREAK: u8 = 7;
|
|
pub const TOKEN_CONTINUE: u8 = 8;
|
|
pub const TOKEN_TRUE: u8 = 9;
|
|
pub const TOKEN_FALSE: u8 = 10;
|
|
pub const TOKEN_BOOL: u8 = 11;
|
|
pub const TOKEN_ARROW: u8 = 12;
|
|
pub const TOKEN_I32: u8 = 13;
|
|
pub const TOKEN_U32: u8 = 14;
|
|
pub const TOKEN_EQEQ: u8 = 15;
|
|
pub const TOKEN_EQUALS: u8 = 16;
|
|
pub const TOKEN_PLUS: u8 = 17;
|
|
pub const TOKEN_MINUS: u8 = 18;
|
|
pub const TOKEN_RPARENS: u8 = 19;
|
|
pub const TOKEN_LPARENS: u8 = 20;
|
|
pub const TOKEN_RBRACE: u8 = 21;
|
|
pub const TOKEN_LBRACE: u8 = 22;
|
|
pub const TOKEN_COLON: u8 = 23;
|
|
pub const TOKEN_COLON2: u8 = 24;
|
|
pub const TOKEN_SEMI: u8 = 25;
|
|
pub const TOKEN_COMMA: u8 = 26;
|
|
pub const TOKEN_PIPE: u8 = 27;
|
|
pub const TOKEN_PIPE2: u8 = 28;
|
|
pub const TOKEN_AMP: u8 = 29;
|
|
pub const TOKEN_AMP2: u8 = 30;
|
|
pub const TOKEN_LBRACKET: u8 = 31;
|
|
pub const TOKEN_RBRACKET: u8 = 32;
|
|
pub const TOKEN_VOID: u8 = 33;
|
|
pub const TOKEN_SLASH: u8 = 34;
|
|
pub const TOKEN_STAR: u8 = 35;
|
|
pub const TOKEN_U8: u8 = 36;
|
|
pub const TOKEN_I8: u8 = 37;
|
|
pub const TOKEN_U16: u8 = 38;
|
|
pub const TOKEN_I16: u8 = 39;
|
|
pub const TOKEN_U64: u8 = 40;
|
|
pub const TOKEN_I64: u8 = 41;
|
|
pub const TOKEN_USIZE: u8 = 42;
|
|
pub const TOKEN_ISIZE: u8 = 43;
|
|
pub const TOKEN_F32: u8 = 44;
|
|
pub const TOKEN_F64: u8 = 45;
|
|
pub const TOKEN_PERCENT: u8 = 46;
|
|
pub const TOKEN_CARET: u8 = 47;
|
|
pub const TOKEN_BANGEQ: u8 = 48;
|
|
pub const TOKEN_BANG: u8 = 49;
|
|
pub const TOKEN_TILDE: u8 = 50;
|
|
pub const TOKEN_LEQ: u8 = 51;
|
|
pub const TOKEN_GEQ: u8 = 52;
|
|
pub const TOKEN_LESSLESS: u8 = 53;
|
|
pub const TOKEN_GTGT: u8 = 54;
|
|
pub const TOKEN_LT: u8 = 55;
|
|
pub const TOKEN_GT: u8 = 56;
|
|
pub const TOKEN_DOT3: u8 = 57;
|
|
pub const TOKEN_DOT2: u8 = 58;
|
|
pub const TOKEN_DOT: u8 = 59;
|
|
pub const TOKEN_BACKTICK: u8 = 60;
|
|
pub const TOKEN_IDENT: u8 = 61;
|
|
pub const TOKEN_NUMBER: u8 = 62;
|
|
pub const TOKEN_STRING: u8 = 63;
|
|
pub const TOKEN_COMMENT: u8 = 64;
|
|
|
|
#[repr(C)]
|
|
#[derive(Debug)]
|
|
pub struct Ast {
|
|
pub nodes: Vec<AstNode>,
|
|
}
|
|
|
|
#[repr(C)]
|
|
#[derive(Debug)]
|
|
pub struct AstNode {
|
|
pub kind: u8,
|
|
pub data: *const (),
|
|
pub extra: usize,
|
|
pub span: u64,
|
|
}
|
|
|
|
#[repr(C)]
|
|
#[derive(Debug)]
|
|
pub struct AstArgument {
|
|
pub name: *const u8,
|
|
pub name_len: usize,
|
|
pub arg_type: Type,
|
|
}
|
|
|
|
#[repr(C)]
|
|
#[derive(Debug)]
|
|
pub struct Type {
|
|
pub kind: u8,
|
|
pub data: u64,
|
|
}
|
|
|
|
#[repr(C)]
|
|
#[derive(Debug)]
|
|
pub struct AstFunction {
|
|
pub name: *const u8,
|
|
pub name_len: usize,
|
|
pub args: *const u64,
|
|
pub args_len: usize,
|
|
pub return_type: Type,
|
|
pub body: u64,
|
|
}
|
|
|
|
#[repr(C)]
|
|
#[derive(Debug)]
|
|
pub struct AstVarRef {
|
|
pub resolved: u64,
|
|
pub name: *const u8,
|
|
pub name_len: usize,
|
|
}
|
|
|
|
#[repr(C)]
|
|
#[derive(Debug)]
|
|
pub struct BinaryExpr {
|
|
pub left: u64,
|
|
pub operator: u8,
|
|
pub right: u64,
|
|
}
|
|
|
|
#[repr(C)]
|
|
#[derive(Debug)]
|
|
pub struct AstVarDecl {
|
|
pub name: *const u8,
|
|
pub name_len: usize,
|
|
pub var_type: Type,
|
|
}
|
|
|
|
#[repr(C)]
|
|
#[derive(Debug)]
|
|
pub struct AstAssignment {
|
|
pub variable: u64,
|
|
pub expr: u64,
|
|
}
|
|
|
|
#[repr(C)]
|
|
#[derive(Debug)]
|
|
pub struct SymbolTable {
|
|
pub symtable: Vec<SymEntry>,
|
|
}
|
|
|
|
#[repr(C)]
|
|
#[derive(Debug)]
|
|
pub struct SymKey {
|
|
pub kind: u8,
|
|
pub scope_index: u64,
|
|
pub span: u64,
|
|
pub ident: *const u8,
|
|
pub ident_len: usize,
|
|
}
|
|
|
|
#[repr(C)]
|
|
#[derive(Debug)]
|
|
pub struct SymEntry {
|
|
pub key: SymKey,
|
|
pub index: u64,
|
|
pub extra: u64,
|
|
}
|
|
|
|
#[repr(C)]
|
|
#[derive(Debug)]
|
|
pub struct CodegenCtx {
|
|
pub ast: *const Ast,
|
|
pub text: Vec<u8>,
|
|
}
|
|
|
|
#[repr(C)]
|
|
#[derive(Debug)]
|
|
pub struct FunctionCtx {
|
|
pub current_stack_size: u32,
|
|
pub max_stack_size: u32,
|
|
pub stack_vars: Vec<(u64, u64)>,
|
|
pub register_bitset: u16,
|
|
pub dirtied_register_bitset: u16,
|
|
}
|
|
|
|
#[repr(C)]
|
|
#[derive(Debug)]
|
|
pub struct Operand {
|
|
pub kind: u8,
|
|
pub register: u8,
|
|
pub width: u16,
|
|
pub len: u16,
|
|
pub value: u64,
|
|
}
|
|
|
|
#[repr(C)]
|
|
#[derive(Debug)]
|
|
pub struct BlobVec {
|
|
pub data: *mut u8,
|
|
pub len: usize,
|
|
pub cap: usize,
|
|
pub elem_size: usize,
|
|
pub drop: Option<extern "C" fn(*mut u8)>,
|
|
}
|
|
|
|
use super::vec::Vec;
|
|
|
|
use super::FFISlice;
|