summary refs log tree commit diff
path: root/src/cimport.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/cimport.zig')
-rw-r--r--src/cimport.zig280
1 files changed, 280 insertions, 0 deletions
diff --git a/src/cimport.zig b/src/cimport.zig
new file mode 100644
index 0000000..65666b2
--- /dev/null
+++ b/src/cimport.zig
@@ -0,0 +1,280 @@
+pub const FILE = stdio.FILE;
+pub const fclose = stdio.fclose;
+pub const fopen = stdio.fopen;
+pub const fputs = stdio.fputs;
+pub const stdio = @cImport(@cInclude("stdio.h"));
+
+pub const bits = u64;
+
+pub const Target = extern struct {
+    name: [16:0]u8,
+    apple: u8,
+    /// First general-purpose register.
+    gpr0: c_int,
+    ngpr: c_int,
+    /// First floating-point register.
+    fpr0: c_int,
+    nfpr: c_int,
+    /// Globally live registers, e.g. sp, fp.
+    rglob: bits,
+    nrglob: c_int,
+    /// Caller-save.
+    rsave: [*c]c_int,
+    nrsave: [2]c_int,
+    retregs: *const fn (Ref, [*c]c_int) callconv(.C) bits,
+    argregs: *const fn (Ref, [*c]c_int) callconv(.C) bits,
+    memargs: *const fn (c_int) callconv(.C) c_int,
+    abi0: *const fn (?*Fn) callconv(.C) void,
+    abi1: *const fn (?*Fn) callconv(.C) void,
+    isel: *const fn (?*Fn) callconv(.C) void,
+    emitfn: *const fn (?*Fn, *FILE) callconv(.C) void,
+    emitfin: *const fn (*FILE) callconv(.C) void,
+    asloc: [4]u8,
+    assym: [4]u8,
+};
+
+pub const BSet = extern struct {
+    nt: c_uint,
+    t: [*c]bits,
+};
+
+pub const Ref = extern struct {
+    // type: u3,
+    // val: u29,
+    ref: u32,
+};
+
+pub const Ins = extern struct {
+    // op: u30,
+    // cls: u2,
+    op: u32,
+    to: Ref,
+    arg: [2]Ref,
+};
+
+pub const Phi = extern struct {
+    to: Ref,
+    arg: ?*Ref,
+    blk: [*c]?*Blk,
+    narg: c_uint,
+    cls: c_int,
+    link: ?*Phi,
+};
+
+pub const Blk = extern struct {
+    phi: ?*Phi,
+    ins: ?*Ins,
+    nins: c_uint,
+    jmp: extern struct {
+        type: c_short,
+        arg: Ref,
+    },
+    s1: ?*Blk,
+    s2: ?*Blk,
+    link: ?*Blk,
+    id: c_uint,
+    visit: c_uint,
+    idom: ?*Blk,
+    dom: ?*Blk,
+    dlink: ?*Blk,
+    fron: [*c]?*Blk,
+    nfron: c_uint,
+    pred: [*c]?*Blk,
+    npred: c_uint,
+    in: [1]BSet,
+    out: [1]BSet,
+    gen: [1]BSet,
+    nlive: [2]c_int,
+    loop: c_int,
+    name: [80]u8,
+};
+
+pub const Use = extern struct {
+    type: enum(c_uint) { UXXX, UPhi, UIns, UJmp },
+    bid: c_uint,
+    u: extern union {
+        ins: ?*Ins,
+        phi: ?*Phi,
+    },
+};
+
+pub const Sym = extern struct {
+    type: enum (c_uint) { SGlo, SThr },
+    id: u32,
+};
+
+pub const Alias = extern struct {
+    type: enum (c_uint) {
+        ABot = 0,
+        ALoc = 1, // stack local
+        ACon = 2,
+        AEsc = 3, // stack escaping
+        ASym = 4,
+        AUnk = 6,
+    },
+    base: c_int,
+    offset: i64,
+    u: extern union {
+        sym: Sym,
+        loc: extern struct {
+            sz: c_int,
+            m: bits,
+        },
+    },
+    slot: [*c]Alias,
+};
+
+pub const Tmp = extern struct {
+    name: [80]u8,
+    def: ?*Ins,
+    use: [*c]Use,
+    ndef: c_uint,
+    nuse: c_uint,
+    bid: c_uint,
+    cost: c_uint,
+    slot: c_int,
+    cls: c_short,
+    hint: extern struct {
+        r: c_int,
+        w: c_int,
+        m: bits,
+    },
+    phi: c_int,
+    alias: Alias,
+    width: c_uint,
+    visit: c_int,
+};
+
+pub const Con = extern struct {
+    type: enum (c_uint) { CUndef, CBits, CAddr },
+    sym: Sym,
+    bits: extern union {
+        i: i64,
+        d: f64,
+        s: f32,
+    },
+    flt: u8,
+};
+
+pub const Addr = extern struct {
+    offset: Con,
+    base: Ref,
+    index: Ref,
+    scale: c_int,
+};
+
+pub const Mem = Addr;
+
+pub const Lnk = extern struct {
+    @"export": u8,
+    thread: u8,
+    @"align": u8,
+    sec: [*c]u8,
+    secf: [*c]u8,
+};
+
+pub const Fn = extern struct {
+    start: ?*Blk,
+    tmp: [*c]Tmp,
+    con: [*c]Con,
+    mem: ?*Mem,
+    ntmp: c_int,
+    ncon: c_int,
+    nmem: c_int,
+    nblk: c_uint,
+    retty: c_int,
+    retr: Ref,
+    rpo: [*c]?*Blk,
+    reg: bits,
+    slot: c_int,
+    vararg: u8,
+    dynalloc: u8,
+    name: [80]u8,
+    lnk: Lnk,
+};
+
+pub const Dat = extern struct {
+    type: enum(c_uint) { DStart, DEnd, DB, DH, DW, DL, DZ },
+    name: [*:0]u8,
+    lnk: [*c]Lnk,
+    u: extern union {
+        num: i64,
+        fltd: f64,
+        flts: f32,
+        str: [*c]u8,
+        ref: extern struct {
+            name: [*:0]u8,
+            off: i64,
+        },
+    },
+    isref: u8,
+    isstr: u8,
+};
+
+pub extern const T_arm64_apple: Target;
+pub extern const T_amd64_apple: Target;
+pub extern const T_arm64: Target;
+pub extern const T_rv64: Target;
+pub extern const T_amd64_sysv: Target;
+pub export const targets = [_]*Target{
+    &T_amd64_sysv,
+    &T_amd64_apple,
+    &T_arm64,
+    &T_arm64_apple,
+    &T_rv64,
+};
+pub export var T: Target = undefined;
+pub export var debug = [_]bool{ false } ** ('Z' + 1);
+
+// util.c
+pub extern fn freeall() void;
+
+// parse.c
+pub extern fn parse(in: *FILE, path: [*:0]const u8, out: *FILE,
+    *const fn (*Dat, *FILE) callconv(.C) void,
+    *const fn (*Fn, *FILE) callconv(.C) void) void;
+pub extern fn printfn(fun: *Fn, out: *FILE) void;
+
+// cfg.c
+pub extern fn fillpreds(fun: *Fn) void;
+pub extern fn fillrpo(fun: *Fn) void;
+pub extern fn fillloop(fun: *Fn) void;
+pub extern fn simpljmp(fun: *Fn) void;
+
+// mem.c
+pub extern fn promote(fun: *Fn) void;
+pub extern fn coalesce(fun: *Fn) void;
+
+// alias.c
+pub extern fn fillalias(fun: *Fn) void;
+
+// load.c
+pub extern fn loadopt(fun: *Fn) void;
+
+// ssa.c
+pub extern fn filluse(fun: *Fn) void;
+pub extern fn ssa(fun: *Fn) void;
+pub extern fn ssacheck(fun: *Fn) void;
+
+// copy.c
+pub extern fn copy(fun: *Fn) void;
+
+// fold.c
+pub extern fn fold(fun: *Fn) void;
+
+// simpl.c
+pub extern fn simpl(fun: *Fn) void;
+
+// live.c
+pub extern fn filllive(fun: *Fn) void;
+
+// spill.c
+pub extern fn fillcost(fun: *Fn) void;
+pub extern fn spill(fun: *Fn) void;
+
+// rega.c
+pub extern fn rega(fun: *Fn) void;
+
+// emit.c
+pub extern fn emitdat(dat: *Dat, out: *FILE) void;
+pub extern fn emitdbgfile(fun: [*:0]const u8, out: *FILE) void;