authorgravatar for alex_naskos@hotmail.comAlexandros Naskos <alex_naskos@hotmail.com> 2018-04-29 15:40:26+03:00
committergravatar for alex_naskos@hotmail.comAlexandros Naskos <alex_naskos@hotmail.com> 2018-04-29 15:40:26+03:00
log013f548202ae1ffb584c211a0ea2cea53b745583
tree6a5844ea22b0078f1ccc41c4f5176886d0f54c7c
parent66aa760f83529cf932d35090adfa6fb84264ff7a

Finished FnDef TypeInfo generation (warning: may be buggy).


2 files changed, 45 insertions(+), 10 deletions(-)

src/codegen.cpp+5-3
......@@ -6491,12 +6491,12 @@ static void define_builtin_compile_vars(CodeGen *g) {
64916491 " is_pub: bool,\n"
64926492 " data: Data,\n"
64936493 "\n"
6494 " const Data = union(enum) {\n"
6494 " pub const Data = union(enum) {\n"
64956495 " Type: type,\n"
64966496 " Var: type,\n"
64976497 " Fn: FnDef,\n"
64986498 "\n"
6499 " const FnDef = struct {\n"
6499 " pub const FnDef = struct {\n"
65006500 " fn_type: type,\n"
65016501 " inline_type: Inline,\n"
65026502 " calling_convention: CallingConvention,\n"
......@@ -6504,8 +6504,10 @@ static void define_builtin_compile_vars(CodeGen *g) {
65046504 " is_extern: bool,\n"
65056505 " is_export: bool,\n"
65066506 " lib_name: ?[]const u8,\n"
6507 " return_type: type,\n"
6508 " arg_names: [][] const u8,\n"
65076509 "\n"
6508 " const Inline = enum {\n"
6510 " pub const Inline = enum {\n"
65096511 " Auto,\n"
65106512 " Always,\n"
65116513 " Never,\n"
src/ir.cpp+40-7
......@@ -15911,6 +15911,10 @@ static void ir_make_type_info_defs(IrAnalyze *ira, ConstExprValue *out_val, Scop
1591115911 FnTableEntry *fn_entry = ((TldFn *)curr_entry->value)->fn_entry;
1591215912 assert(!fn_entry->is_test);
1591315913
15914 analyze_fn_body(ira->codegen, fn_entry);
15915 if (fn_entry->anal_state == FnAnalStateInvalid)
15916 return;
15917
1591415918 AstNodeFnProto *fn_node = (AstNodeFnProto *)(fn_entry->proto_node);
1591515919
1591615920 ConstExprValue *fn_def_val = create_const_vals(1);
......@@ -15919,8 +15923,7 @@ static void ir_make_type_info_defs(IrAnalyze *ira, ConstExprValue *out_val, Scop
1591915923 fn_def_val->data.x_struct.parent.id = ConstParentIdUnion;
1592015924 fn_def_val->data.x_struct.parent.data.p_union.union_val = &inner_fields[2];
1592115925
15922 // @TODO Add fields
15923 ConstExprValue *fn_def_fields = create_const_vals(7);
15926 ConstExprValue *fn_def_fields = create_const_vals(9);
1592415927 fn_def_val->data.x_struct.fields = fn_def_fields;
1592515928
1592615929 // fn_type: type
......@@ -15940,9 +15943,10 @@ static void ir_make_type_info_defs(IrAnalyze *ira, ConstExprValue *out_val, Scop
1594015943 bigint_init_unsigned(&fn_def_fields[2].data.x_enum_tag, fn_node->cc);
1594115944 // is_var_args: bool
1594215945 ensure_field_index(fn_def_val->type, "is_var_args", 3);
15946 bool is_varargs = fn_node->is_var_args;
1594315947 fn_def_fields[3].special = ConstValSpecialStatic;
1594415948 fn_def_fields[3].type = ira->codegen->builtin_types.entry_bool;
15945 fn_def_fields[3].data.x_bool = fn_node->is_var_args;
15949 fn_def_fields[3].data.x_bool = is_varargs;
1594615950 // is_extern: bool
1594715951 ensure_field_index(fn_def_val->type, "is_extern", 4);
1594815952 fn_def_fields[4].special = ConstValSpecialStatic;
......@@ -15959,18 +15963,47 @@ static void ir_make_type_info_defs(IrAnalyze *ira, ConstExprValue *out_val, Scop
1595915963 fn_def_fields[6].type = get_maybe_type(ira->codegen,
1596015964 get_slice_type(ira->codegen, get_pointer_to_type(ira->codegen,
1596115965 ira->codegen->builtin_types.entry_u8, true)));
15962
15963
1596415966 if (fn_node->is_extern && buf_len(fn_node->lib_name) > 0)
1596515967 {
1596615968 fn_def_fields[6].data.x_maybe = create_const_vals(1);
15967 // @TODO Figure out if lib_name is always non-null for extern fns.
1596815969 ConstExprValue *lib_name = create_const_str_lit(ira->codegen, fn_node->lib_name);
1596915970 init_const_slice(ira->codegen, fn_def_fields[6].data.x_maybe, lib_name, 0, buf_len(fn_node->lib_name), true);
1597015971 }
1597115972 else
15972 {
1597315973 fn_def_fields[6].data.x_maybe = nullptr;
15974 // return_type: type
15975 ensure_field_index(fn_def_val->type, "return_type", 7);
15976 fn_def_fields[7].special = ConstValSpecialStatic;
15977 fn_def_fields[7].type = ira->codegen->builtin_types.entry_type;
15978 // @TODO Check whether this is correct.
15979 if (fn_entry->src_implicit_return_type != nullptr)
15980 fn_def_fields[7].data.x_type = fn_entry->src_implicit_return_type;
15981 else if (fn_entry->type_entry->data.fn.gen_return_type != nullptr)
15982 fn_def_fields[7].data.x_type = fn_entry->type_entry->data.fn.gen_return_type;
15983 else
15984 fn_def_fields[7].data.x_type = fn_entry->type_entry->data.fn.fn_type_id.return_type;
15985 // arg_names: [][] const u8
15986 ensure_field_index(fn_def_val->type, "arg_names", 8);
15987 size_t fn_arg_count = fn_entry->variable_list.length;
15988 ConstExprValue *fn_arg_name_array = create_const_vals(1);
15989 fn_arg_name_array->special = ConstValSpecialStatic;
15990 fn_arg_name_array->type = get_array_type(ira->codegen, get_slice_type(ira->codegen,
15991 get_pointer_to_type(ira->codegen, ira->codegen->builtin_types.entry_u8, true)), fn_arg_count);
15992 fn_arg_name_array->data.x_array.special = ConstArraySpecialNone;
15993 fn_arg_name_array->data.x_array.s_none.parent.id = ConstParentIdNone;
15994 fn_arg_name_array->data.x_array.s_none.elements = create_const_vals(fn_arg_count);
15995
15996 init_const_slice(ira->codegen, &fn_def_fields[8], fn_arg_name_array, 0, fn_arg_count, false);
15997
15998 for (size_t fn_arg_index = 0; fn_arg_index < fn_arg_count; fn_arg_index++)
15999 {
16000 VariableTableEntry *arg_var = fn_entry->variable_list.at(fn_arg_index);
16001 ConstExprValue *fn_arg_name_val = &fn_arg_name_array->data.x_array.s_none.elements[fn_arg_index];
16002 ConstExprValue *arg_name = create_const_str_lit(ira->codegen, &arg_var->name);
16003 init_const_slice(ira->codegen, fn_arg_name_val, arg_name, 0, buf_len(&arg_var->name), true);
16004 fn_arg_name_val->data.x_struct.parent.id = ConstParentIdArray;
16005 fn_arg_name_val->data.x_struct.parent.data.p_array.array_val = fn_arg_name_array;
16006 fn_arg_name_val->data.x_struct.parent.data.p_array.elem_index = fn_arg_index;
1597416007 }
1597516008
1597616009 inner_fields[2].data.x_union.payload = fn_def_val;