faster boot by refactor qbe_emit

This commit is contained in:
2026-02-23 11:16:13 -06:00
parent a18584afd3
commit 76552c6854
6 changed files with 32037 additions and 27739 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -123,4 +123,4 @@ log.console("")
log.console("Run 'cell help <command>' for more information.") log.console("Run 'cell help <command>' for more information.")
} }
$stop() $$stop()

View File

@@ -147,21 +147,38 @@ function compile_native_cached(name, source_path) {
return return
} }
var t0 = null
var t1 = null
os.print("bootstrap: compiling native: " + name + "\n") os.print("bootstrap: compiling native: " + name + "\n")
t0 = os.now()
ast = analyze(src, source_path) ast = analyze(src, source_path)
compiled = streamline_mod(mcode_mod(ast)) compiled = streamline_mod(mcode_mod(ast))
t1 = os.now()
os.print(" [" + name + "] pipeline (tok+parse+fold+mcode+streamline): " + text((t1 - t0) / 1000000) + "ms\n")
t0 = os.now()
il_parts = _qbe_emit_mod(compiled, _qbe_mod, null) il_parts = _qbe_emit_mod(compiled, _qbe_mod, null)
t1 = os.now()
os.print(" [" + name + "] qbe_emit: " + text((t1 - t0) / 1000000) + "ms\n")
helpers_il = (il_parts.helpers && length(il_parts.helpers) > 0) helpers_il = (il_parts.helpers && length(il_parts.helpers) > 0)
? text(il_parts.helpers, "\n") : "" ? text(il_parts.helpers, "\n") : ""
all_fns = text(il_parts.functions, "\n") all_fns = text(il_parts.functions, "\n")
full_il = il_parts.data + "\n\n" + helpers_il + "\n\n" + all_fns full_il = il_parts.data + "\n\n" + helpers_il + "\n\n" + all_fns
t0 = os.now()
asm_text = os.qbe(full_il) asm_text = os.qbe(full_il)
t1 = os.now()
os.print(" [" + name + "] os.qbe (QBE compile): " + text((t1 - t0) / 1000000) + "ms\n")
tmp = '/tmp/cell_boot_' + name tmp = '/tmp/cell_boot_' + name
fd.slurpwrite(tmp + '.s', stone(blob(asm_text))) fd.slurpwrite(tmp + '.s', stone(blob(asm_text)))
t0 = os.now()
rc = os.system(_cc + ' -c ' + tmp + '.s -o ' + tmp + '.o') rc = os.system(_cc + ' -c ' + tmp + '.s -o ' + tmp + '.o')
t1 = os.now()
os.print(" [" + name + "] clang -c: " + text((t1 - t0) / 1000000) + "ms\n")
if (rc != 0) { if (rc != 0) {
os.print("error: assembly failed for " + name + "\n") os.print("error: assembly failed for " + name + "\n")
disrupt disrupt
@@ -186,7 +203,10 @@ function compile_native_cached(name, source_path) {
link_cmd = link_cmd + ' -undefined dynamic_lookup' link_cmd = link_cmd + ' -undefined dynamic_lookup'
link_cmd = link_cmd + ' ' + tmp + '.o ' + rt_o + ' -o ' + dylib_path link_cmd = link_cmd + ' ' + tmp + '.o ' + rt_o + ' -o ' + dylib_path
t0 = os.now()
rc = os.system(link_cmd) rc = os.system(link_cmd)
t1 = os.now()
os.print(" [" + name + "] clang -shared (link): " + text((t1 - t0) / 1000000) + "ms\n")
if (rc != 0) { if (rc != 0) {
os.print("error: linking failed for " + name + "\n") os.print("error: linking failed for " + name + "\n")
disrupt disrupt

File diff suppressed because it is too large Load Diff

View File

@@ -10,6 +10,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <time.h>
/* QBE headers */ /* QBE headers */
#include "all.h" #include "all.h"
@@ -154,6 +155,8 @@ JSValue js_os_qbe(JSContext *js, JSValue self, int argc, JSValue *argv) {
} }
/* Run the QBE pipeline */ /* Run the QBE pipeline */
struct timespec t0, t1;
clock_gettime(CLOCK_MONOTONIC, &t0);
parse(inf, "<ir>", qbe_dbgfile, qbe_data, qbe_func); parse(inf, "<ir>", qbe_dbgfile, qbe_data, qbe_func);
fclose(inf); fclose(inf);
@@ -162,6 +165,11 @@ JSValue js_os_qbe(JSContext *js, JSValue self, int argc, JSValue *argv) {
fflush(qbe_outf); fflush(qbe_outf);
fclose(qbe_outf); fclose(qbe_outf);
qbe_outf = NULL; qbe_outf = NULL;
clock_gettime(CLOCK_MONOTONIC, &t1);
double ms = (t1.tv_sec - t0.tv_sec) * 1000.0 +
(t1.tv_nsec - t0.tv_nsec) / 1e6;
fprintf(stderr, "[qbe_backend] os.qbe: %.1fms (%zu bytes IL -> %zu bytes asm)\n",
ms, ir_len, out_len);
JS_FreeCString(js, ir); JS_FreeCString(js, ir);