faster boot by refactor qbe_emit
This commit is contained in:
File diff suppressed because one or more lines are too long
51874
boot/qbe_emit.cm.mcode
51874
boot/qbe_emit.cm.mcode
File diff suppressed because one or more lines are too long
2
help.ce
2
help.ce
@@ -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()
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
3000
qbe_emit.cm
3000
qbe_emit.cm
File diff suppressed because it is too large
Load Diff
@@ -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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user