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) {...@@ -6491,12 +6491,12 @@ static void define_builtin_compile_vars(CodeGen *g) {
6491 " is_pub: bool,\n"6491 " is_pub: bool,\n"
6492 " data: Data,\n"6492 " data: Data,\n"
6493 "\n"6493 "\n"
6494 " const Data = union(enum) {\n"6494 " pub const Data = union(enum) {\n"
6495 " Type: type,\n"6495 " Type: type,\n"
6496 " Var: type,\n"6496 " Var: type,\n"
6497 " Fn: FnDef,\n"6497 " Fn: FnDef,\n"
6498 "\n"6498 "\n"
6499 " const FnDef = struct {\n"6499 " pub const FnDef = struct {\n"
6500 " fn_type: type,\n"6500 " fn_type: type,\n"
6501 " inline_type: Inline,\n"6501 " inline_type: Inline,\n"
6502 " calling_convention: CallingConvention,\n"6502 " calling_convention: CallingConvention,\n"
...@@ -6504,8 +6504,10 @@ static void define_builtin_compile_vars(CodeGen *g) {...@@ -6504,8 +6504,10 @@ static void define_builtin_compile_vars(CodeGen *g) {
6504 " is_extern: bool,\n"6504 " is_extern: bool,\n"
6505 " is_export: bool,\n"6505 " is_export: bool,\n"
6506 " lib_name: ?[]const u8,\n"6506 " lib_name: ?[]const u8,\n"
6507 " return_type: type,\n"
6508 " arg_names: [][] const u8,\n"
6507 "\n"6509 "\n"
6508 " const Inline = enum {\n"6510 " pub const Inline = enum {\n"
6509 " Auto,\n"6511 " Auto,\n"
6510 " Always,\n"6512 " Always,\n"
6511 " Never,\n"6513 " Never,\n"
src/ir.cpp+40-7
...@@ -15911,6 +15911,10 @@ static void ir_make_type_info_defs(IrAnalyze *ira, ConstExprValue *out_val, Scop...@@ -15911,6 +15911,10 @@ static void ir_make_type_info_defs(IrAnalyze *ira, ConstExprValue *out_val, Scop
15911 FnTableEntry *fn_entry = ((TldFn *)curr_entry->value)->fn_entry;15911 FnTableEntry *fn_entry = ((TldFn *)curr_entry->value)->fn_entry;
15912 assert(!fn_entry->is_test);15912 assert(!fn_entry->is_test);
1591315913
15914 analyze_fn_body(ira->codegen, fn_entry);
15915 if (fn_entry->anal_state == FnAnalStateInvalid)
15916 return;
15917
15914 AstNodeFnProto *fn_node = (AstNodeFnProto *)(fn_entry->proto_node);15918 AstNodeFnProto *fn_node = (AstNodeFnProto *)(fn_entry->proto_node);
1591515919
15916 ConstExprValue *fn_def_val = create_const_vals(1);15920 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...@@ -15919,8 +15923,7 @@ static void ir_make_type_info_defs(IrAnalyze *ira, ConstExprValue *out_val, Scop
15919 fn_def_val->data.x_struct.parent.id = ConstParentIdUnion;15923 fn_def_val->data.x_struct.parent.id = ConstParentIdUnion;
15920 fn_def_val->data.x_struct.parent.data.p_union.union_val = &inner_fields[2];15924 fn_def_val->data.x_struct.parent.data.p_union.union_val = &inner_fields[2];
1592115925
15922 // @TODO Add fields15926 ConstExprValue *fn_def_fields = create_const_vals(9);
15923 ConstExprValue *fn_def_fields = create_const_vals(7);
15924 fn_def_val->data.x_struct.fields = fn_def_fields;15927 fn_def_val->data.x_struct.fields = fn_def_fields;
1592515928
15926 // fn_type: type15929 // fn_type: type
...@@ -15940,9 +15943,10 @@ static void ir_make_type_info_defs(IrAnalyze *ira, ConstExprValue *out_val, Scop...@@ -15940,9 +15943,10 @@ static void ir_make_type_info_defs(IrAnalyze *ira, ConstExprValue *out_val, Scop
15940 bigint_init_unsigned(&fn_def_fields[2].data.x_enum_tag, fn_node->cc);15943 bigint_init_unsigned(&fn_def_fields[2].data.x_enum_tag, fn_node->cc);
15941 // is_var_args: bool15944 // is_var_args: bool
15942 ensure_field_index(fn_def_val->type, "is_var_args", 3);15945 ensure_field_index(fn_def_val->type, "is_var_args", 3);
15946 bool is_varargs = fn_node->is_var_args;
15943 fn_def_fields[3].special = ConstValSpecialStatic;15947 fn_def_fields[3].special = ConstValSpecialStatic;
15944 fn_def_fields[3].type = ira->codegen->builtin_types.entry_bool;15948 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;
15946 // is_extern: bool15950 // is_extern: bool
15947 ensure_field_index(fn_def_val->type, "is_extern", 4);15951 ensure_field_index(fn_def_val->type, "is_extern", 4);
15948 fn_def_fields[4].special = ConstValSpecialStatic;15952 fn_def_fields[4].special = ConstValSpecialStatic;
...@@ -15959,18 +15963,47 @@ static void ir_make_type_info_defs(IrAnalyze *ira, ConstExprValue *out_val, Scop...@@ -15959,18 +15963,47 @@ static void ir_make_type_info_defs(IrAnalyze *ira, ConstExprValue *out_val, Scop
15959 fn_def_fields[6].type = get_maybe_type(ira->codegen,15963 fn_def_fields[6].type = get_maybe_type(ira->codegen,
15960 get_slice_type(ira->codegen, get_pointer_to_type(ira->codegen,15964 get_slice_type(ira->codegen, get_pointer_to_type(ira->codegen,
15961 ira->codegen->builtin_types.entry_u8, true)));15965 ira->codegen->builtin_types.entry_u8, true)));
15962
15963
15964 if (fn_node->is_extern && buf_len(fn_node->lib_name) > 0)15966 if (fn_node->is_extern && buf_len(fn_node->lib_name) > 0)
15965 {15967 {
15966 fn_def_fields[6].data.x_maybe = create_const_vals(1);15968 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.
15968 ConstExprValue *lib_name = create_const_str_lit(ira->codegen, fn_node->lib_name);15969 ConstExprValue *lib_name = create_const_str_lit(ira->codegen, fn_node->lib_name);
15969 init_const_slice(ira->codegen, fn_def_fields[6].data.x_maybe, lib_name, 0, buf_len(fn_node->lib_name), true);15970 init_const_slice(ira->codegen, fn_def_fields[6].data.x_maybe, lib_name, 0, buf_len(fn_node->lib_name), true);
15970 }15971 }
15971 else15972 else
15972 {
15973 fn_def_fields[6].data.x_maybe = nullptr;15973 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;
15974 }16007 }
1597516008
15976 inner_fields[2].data.x_union.payload = fn_def_val;16009 inner_fields[2].data.x_union.payload = fn_def_val;