stage2 提供近乎完整的功能但出现严重性能问题 添加stage0的原生性能记录 stage1添加更多内置函数 nob重构代码使其更加健壮
This commit is contained in:
1 parent
b5a7a811b3
commit
e02b0c633a
35 files changed
+14018
-216
No files matched your search
@@ -72,6 +72,9 @@ static spl_ir_node_ref_t ast2ir_intrin_call(spl_ast2ir_t *a, spl_ast_node_t *n,
|
||||
spl_ast_node_ref_vec_t *args);
|
||||
static spl_ir_node_ref_t ast2ir_intrin_field(spl_ast2ir_t *a, spl_ast_node_t *n, spl_intrin_t in);
|
||||
static spl_ir_node_ref_t ast2ir_intrin_len(spl_ast2ir_t *a, spl_ast_node_t *n);
|
||||
static spl_ir_node_ref_t ast2ir_intrin_pos(spl_ast2ir_t *a, spl_ast_node_t *n, int which);
|
||||
static spl_ir_node_ref_t ast2ir_intrin_file_name(spl_ast2ir_t *a, spl_ast_node_t *n);
|
||||
static spl_ir_node_ref_t ast2ir_intrin_fn_name(spl_ast2ir_t *a, spl_ast_node_t *n);
|
||||
|
||||
static spl_ir_node_ref_t emit_zero_value(spl_ast2ir_t *a, spl_type_id_t tid) {
|
||||
spl_type_node_t *tn = spl_type_node(&a->sema->type->ir, tid);
|
||||
@@ -461,6 +464,14 @@ static spl_ir_node_ref_t ast2ir_intrin_call(spl_ast2ir_t *a, spl_ast_node_t *n,
|
||||
case SPL_INTRIN_INT2PTR:
|
||||
case SPL_INTRIN_PTR_CAST:
|
||||
return ast2ir_intrin_cast(a, n, in, args);
|
||||
case SPL_INTRIN_LINE:
|
||||
return ast2ir_intrin_pos(a, n, 0);
|
||||
case SPL_INTRIN_COL:
|
||||
return ast2ir_intrin_pos(a, n, 1);
|
||||
case SPL_INTRIN_FILE_NAME:
|
||||
return ast2ir_intrin_file_name(a, n);
|
||||
case SPL_INTRIN_FN_NAME:
|
||||
return ast2ir_intrin_fn_name(a, n);
|
||||
case SPL_INTRIN_BREAKPOINT:
|
||||
return spl_ir_builder_dbg_breakpoint(a->ir);
|
||||
default:
|
||||
@@ -469,6 +480,67 @@ static spl_ir_node_ref_t ast2ir_intrin_call(spl_ast2ir_t *a, spl_ast_node_t *n,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* @line() / @col():把调用点位置降为 usize 常量。which: 0=line, 1=col。 */
|
||||
static spl_ir_node_ref_t ast2ir_intrin_pos(spl_ast2ir_t *a, spl_ast_node_t *n, int which) {
|
||||
spl_lang_type_id_t usize_lang = spl_lang_make_int(a->sema->type, sizeof(void *) * 8, 0);
|
||||
spl_type_id_t usize_ir = to_ir_type(a, usize_lang);
|
||||
usize v = which == 0 ? (usize)n->dbg.line : (usize)n->dbg.col;
|
||||
return spl_ir_builder_type_const_int(a->ir, usize_ir, v);
|
||||
}
|
||||
|
||||
/* @file_name():把调用点所在文件路径降为 []u8(同字符串字面量的构造方式)。 */
|
||||
static spl_ir_node_ref_t ast2ir_intrin_file_name(spl_ast2ir_t *a, spl_ast_node_t *n) {
|
||||
const char *fname = n->dbg.fname ? n->dbg.fname : "?";
|
||||
usize len = strlen(fname);
|
||||
|
||||
spl_lang_type_id_t u8_lang = spl_lang_make_int(a->sema->type, 8, 0);
|
||||
spl_type_id_t u8_ir = to_ir_type(a, u8_lang);
|
||||
spl_type_id_t ptr_u8_ir = spl_type_builder_ptr(&a->sema->type->ir, u8_ir);
|
||||
spl_lang_type_id_t usize_lang = spl_lang_make_int(a->sema->type, sizeof(void *) * 8, 0);
|
||||
spl_type_id_t usize_ir = to_ir_type(a, usize_lang);
|
||||
spl_lang_type_id_t arr_lang = spl_lang_make_array(a->sema->type, u8_lang, len);
|
||||
spl_type_id_t arr_ir = to_ir_type(a, arr_lang);
|
||||
|
||||
spl_ir_node_ref_t raw =
|
||||
spl_ir_builder_type_const_bytes(a->ir, arr_ir, (void *)fname, len);
|
||||
spl_ir_node_ref_t ptr = spl_ir_builder_mem_global_alloc(a->ir, ptr_u8_ir, raw);
|
||||
spl_ir_node_ref_t len_c = spl_ir_builder_type_const_int(a->ir, usize_ir, len);
|
||||
|
||||
spl_type_id_t slice_ir = node_ir(a, n);
|
||||
spl_ir_node_ref_t node = spl_ir_builder_agg_construct(a->ir, slice_ir);
|
||||
spl_ir_builder_agg_construct_field(a->ir, node, ptr);
|
||||
spl_ir_builder_agg_construct_field(a->ir, node, len_c);
|
||||
return node;
|
||||
}
|
||||
|
||||
/* @fn_name():把当前函数名降为 []u8(同字符串字面量的构造方式)。 */
|
||||
static spl_ir_node_ref_t ast2ir_intrin_fn_name(spl_ast2ir_t *a, spl_ast_node_t *n) {
|
||||
const char *name = "?";
|
||||
spl_ir_func_t *f = spl_ir_func(&a->ir->ir, a->ir->current_fn);
|
||||
if (f && f->name)
|
||||
name = f->name;
|
||||
usize len = strlen(name);
|
||||
|
||||
spl_lang_type_id_t u8_lang = spl_lang_make_int(a->sema->type, 8, 0);
|
||||
spl_type_id_t u8_ir = to_ir_type(a, u8_lang);
|
||||
spl_type_id_t ptr_u8_ir = spl_type_builder_ptr(&a->sema->type->ir, u8_ir);
|
||||
spl_lang_type_id_t usize_lang = spl_lang_make_int(a->sema->type, sizeof(void *) * 8, 0);
|
||||
spl_type_id_t usize_ir = to_ir_type(a, usize_lang);
|
||||
spl_lang_type_id_t arr_lang = spl_lang_make_array(a->sema->type, u8_lang, len);
|
||||
spl_type_id_t arr_ir = to_ir_type(a, arr_lang);
|
||||
|
||||
spl_ir_node_ref_t raw =
|
||||
spl_ir_builder_type_const_bytes(a->ir, arr_ir, (void *)name, len);
|
||||
spl_ir_node_ref_t ptr = spl_ir_builder_mem_global_alloc(a->ir, ptr_u8_ir, raw);
|
||||
spl_ir_node_ref_t len_c = spl_ir_builder_type_const_int(a->ir, usize_ir, len);
|
||||
|
||||
spl_type_id_t slice_ir = node_ir(a, n);
|
||||
spl_ir_node_ref_t node = spl_ir_builder_agg_construct(a->ir, slice_ir);
|
||||
spl_ir_builder_agg_construct_field(a->ir, node, ptr);
|
||||
spl_ir_builder_agg_construct_field(a->ir, node, len_c);
|
||||
return node;
|
||||
}
|
||||
|
||||
static spl_ir_node_ref_t ast2ir_intrin_field(spl_ast2ir_t *a, spl_ast_node_t *n, spl_intrin_t in) {
|
||||
switch (in) {
|
||||
case SPL_INTRIN_LEN:
|
||||
|
||||
Reference in new issue
Block a user