Browse Source

Update Tilde for testing reg spill stuff

gingerBill 2 years ago
parent
commit
e2593a6883
6 changed files with 125 additions and 104 deletions
  1. 16 99
      src/tilde.cpp
  2. 3 0
      src/tilde.hpp
  3. BIN
      src/tilde/tb.lib
  4. 2 2
      src/tilde_expr.cpp
  5. 27 3
      src/tilde_proc.cpp
  6. 77 0
      src/tilde_type_info.cpp

+ 16 - 99
src/tilde.cpp

@@ -411,28 +411,27 @@ gb_internal bool cg_global_variables_create(cgModule *m) {
 			// LLVMSetSection(g.value, alloc_cstring(permanent_allocator(), e->Variable.link_section));
 			// LLVMSetSection(g.value, alloc_cstring(permanent_allocator(), e->Variable.link_section));
 		}
 		}
 
 
-		size_t max_objects = 0;
-		tb_global_set_storage(m->mod, section, global, type_size_of(e->type), type_align_of(e->type), max_objects);
 
 
 		cgGlobalVariable var = {};
 		cgGlobalVariable var = {};
 		var.var = g;
 		var.var = g;
 		var.decl = decl;
 		var.decl = decl;
 
 
 		if (decl->init_expr != nullptr) {
 		if (decl->init_expr != nullptr) {
-			// TypeAndValue tav = type_and_value_of_expr(decl->init_expr);
-			// if (!is_type_any(e->type) && !is_type_union(e->type)) {
-			// 	if (tav.mode != Addressing_Invalid) {
-			// 		if (tav.value.kind != ExactValue_Invalid) {
-			// 			ExactValue v = tav.value;
-			// 			lbValue init = lb_const_value(m, tav.type, v);
-			// 			LLVMSetInitializer(g.value, init.value);
-			// 			var.is_initialized = true;
-			// 		}
-			// 	}
-			// }
-			// if (!var.is_initialized && is_type_untyped_nil(tav.type)) {
-			// 	var.is_initialized = true;
-			// }
+			TypeAndValue tav = type_and_value_of_expr(decl->init_expr);
+
+			isize max_regions = cg_global_const_calculate_region_count(tav.value, e->type);
+			tb_global_set_storage(m->mod, section, global, type_size_of(e->type), type_align_of(e->type), max_regions);
+
+			if (tav.mode != Addressing_Invalid &&
+			    tav.value.kind != ExactValue_Invalid) {
+				cg_global_const_add_region(m, tav.value, e->type, global, 0);
+				var.is_initialized = true;
+			}
+			if (!var.is_initialized && is_type_untyped_nil(tav.type)) {
+				var.is_initialized = true;
+			}
+		} else {
+			tb_global_set_storage(m->mod, section, global, type_size_of(e->type), type_align_of(e->type), 0);
 		}
 		}
 
 
 		array_add(&global_variables, var);
 		array_add(&global_variables, var);
@@ -443,89 +442,7 @@ gb_internal bool cg_global_variables_create(cgModule *m) {
 
 
 
 
 
 
-	if (build_context.no_rtti) {
-		return already_has_entry_point;
-	}
-
-	CheckerInfo *info = m->info;
-	{ // Add type info data
-		isize max_type_info_count = info->minimum_dependency_type_info_set.count+1;
-		// gb_printf_err("max_type_info_count: %td\n", max_type_info_count);
-		Type *t = alloc_type_array(t_type_info, max_type_info_count);
-
-		TB_Global *g = tb_global_create(m->mod, -1, CG_TYPE_INFO_DATA_NAME, nullptr, TB_LINKAGE_PRIVATE);
-		tb_global_set_storage(m->mod, tb_module_get_rdata(m->mod), g, type_size_of(t), 16, max_type_info_count);
-
-		cgValue value = cg_value(g, alloc_type_pointer(t));
-		cg_global_type_info_data_entity = alloc_entity_variable(nullptr, make_token_ident(CG_TYPE_INFO_DATA_NAME), t, EntityState_Resolved);
-		cg_add_entity(m, cg_global_type_info_data_entity, value);
-	}
-
-	{ // Type info member buffer
-		// NOTE(bill): Removes need for heap allocation by making it global memory
-		isize count = 0;
-
-		for (Type *t : m->info->type_info_types) {
-			isize index = cg_type_info_index(m->info, t, false);
-			if (index < 0) {
-				continue;
-			}
-
-			switch (t->kind) {
-			case Type_Union:
-				count += t->Union.variants.count;
-				break;
-			case Type_Struct:
-				count += t->Struct.fields.count;
-				break;
-			case Type_Tuple:
-				count += t->Tuple.variables.count;
-				break;
-			}
-		}
-
-		if (count > 0) {
-			{
-				char const *name = CG_TYPE_INFO_TYPES_NAME;
-				Type *t = alloc_type_array(t_type_info_ptr, count);
-				TB_Global *g = tb_global_create(m->mod, -1, name, nullptr, TB_LINKAGE_PRIVATE);
-				tb_global_set_storage(m->mod, tb_module_get_rdata(m->mod), g, type_size_of(t), 16, count*2);
-				cg_global_type_info_member_types = cg_addr(cg_value(g, alloc_type_pointer(t)));
-			}
-			{
-				char const *name = CG_TYPE_INFO_NAMES_NAME;
-				Type *t = alloc_type_array(t_string, count);
-				TB_Global *g = tb_global_create(m->mod, -1, name, nullptr, TB_LINKAGE_PRIVATE);
-				tb_global_set_storage(m->mod, tb_module_get_rdata(m->mod), g, type_size_of(t), 16, count*2);
-				cg_global_type_info_member_names = cg_addr(cg_value(g, alloc_type_pointer(t)));
-			}
-			{
-				char const *name = CG_TYPE_INFO_OFFSETS_NAME;
-				Type *t = alloc_type_array(t_uintptr, count);
-				TB_Global *g = tb_global_create(m->mod, -1, name, nullptr, TB_LINKAGE_PRIVATE);
-				tb_global_set_storage(m->mod, tb_module_get_rdata(m->mod), g, type_size_of(t), 16, count);
-				cg_global_type_info_member_offsets = cg_addr(cg_value(g, alloc_type_pointer(t)));
-			}
-
-			{
-				char const *name = CG_TYPE_INFO_USINGS_NAME;
-				Type *t = alloc_type_array(t_bool, count);
-				TB_Global *g = tb_global_create(m->mod, -1, name, nullptr, TB_LINKAGE_PRIVATE);
-				tb_global_set_storage(m->mod, tb_module_get_rdata(m->mod), g, type_size_of(t), 16, count);
-				cg_global_type_info_member_usings = cg_addr(cg_value(g, alloc_type_pointer(t)));
-			}
-
-			{
-				char const *name = CG_TYPE_INFO_TAGS_NAME;
-				Type *t = alloc_type_array(t_string, count);
-				TB_Global *g = tb_global_create(m->mod, -1, name, nullptr, TB_LINKAGE_PRIVATE);
-				tb_global_set_storage(m->mod, tb_module_get_rdata(m->mod), g, type_size_of(t), 16, count*2);
-				cg_global_type_info_member_tags = cg_addr(cg_value(g, alloc_type_pointer(t)));
-			}
-		}
-
-		cg_setup_type_info_data(m);
-	}
+	cg_setup_type_info_data(m);
 
 
 	return already_has_entry_point;
 	return already_has_entry_point;
 }
 }

+ 3 - 0
src/tilde.hpp

@@ -256,6 +256,9 @@ gb_internal TB_Arena *cg_arena(void);
 gb_internal void cg_add_procedure_to_queue(cgProcedure *p);
 gb_internal void cg_add_procedure_to_queue(cgProcedure *p);
 gb_internal void cg_setup_type_info_data(cgModule *m);
 gb_internal void cg_setup_type_info_data(cgModule *m);
 
 
+gb_internal isize cg_global_const_calculate_region_count(ExactValue const &value, Type *type);
+gb_internal bool  cg_global_const_add_region(cgModule *m, ExactValue const &value, Type *type, TB_Global *global, i64 offset);
+
 gb_internal cgValue cg_value(TB_Global *  g,    Type *type);
 gb_internal cgValue cg_value(TB_Global *  g,    Type *type);
 gb_internal cgValue cg_value(TB_External *e,    Type *type);
 gb_internal cgValue cg_value(TB_External *e,    Type *type);
 gb_internal cgValue cg_value(TB_Function *f,    Type *type);
 gb_internal cgValue cg_value(TB_Function *f,    Type *type);

BIN
src/tilde/tb.lib


+ 2 - 2
src/tilde_expr.cpp

@@ -547,7 +547,7 @@ gb_internal cgValue cg_emit_comp(cgProcedure *p, TokenKind op_kind, cgValue left
 		case Token_Gt:    res = tb_inst_cmp_igt(p->func, lhs, rhs, is_signed); break;
 		case Token_Gt:    res = tb_inst_cmp_igt(p->func, lhs, rhs, is_signed); break;
 		case Token_GtEq:  res = tb_inst_cmp_ige(p->func, lhs, rhs, is_signed); break;
 		case Token_GtEq:  res = tb_inst_cmp_ige(p->func, lhs, rhs, is_signed); break;
 		case Token_Lt:    res = tb_inst_cmp_ilt(p->func, lhs, rhs, is_signed); break;
 		case Token_Lt:    res = tb_inst_cmp_ilt(p->func, lhs, rhs, is_signed); break;
-		case Token_LtEq:  res = tb_inst_cmp_ige(p->func, lhs, rhs, is_signed); break;
+		case Token_LtEq:  res = tb_inst_cmp_ile(p->func, lhs, rhs, is_signed); break;
 		}
 		}
 
 
 		GB_ASSERT(res != nullptr);
 		GB_ASSERT(res != nullptr);
@@ -562,7 +562,7 @@ gb_internal cgValue cg_emit_comp(cgProcedure *p, TokenKind op_kind, cgValue left
 		case Token_Gt:    res = tb_inst_cmp_fgt(p->func, lhs, rhs); break;
 		case Token_Gt:    res = tb_inst_cmp_fgt(p->func, lhs, rhs); break;
 		case Token_GtEq:  res = tb_inst_cmp_fge(p->func, lhs, rhs); break;
 		case Token_GtEq:  res = tb_inst_cmp_fge(p->func, lhs, rhs); break;
 		case Token_Lt:    res = tb_inst_cmp_flt(p->func, lhs, rhs); break;
 		case Token_Lt:    res = tb_inst_cmp_flt(p->func, lhs, rhs); break;
-		case Token_LtEq:  res = tb_inst_cmp_fge(p->func, lhs, rhs); break;
+		case Token_LtEq:  res = tb_inst_cmp_fle(p->func, lhs, rhs); break;
 		}
 		}
 		GB_ASSERT(res != nullptr);
 		GB_ASSERT(res != nullptr);
 		return cg_value(res, t_bool);
 		return cg_value(res, t_bool);

+ 27 - 3
src/tilde_proc.cpp

@@ -235,7 +235,24 @@ gb_internal void cg_procedure_begin(cgProcedure *p) {
 		if (e != nullptr && e->token.string.len > 0 && e->token.string != "_") {
 		if (e != nullptr && e->token.string.len > 0 && e->token.string != "_") {
 			// NOTE(bill): for debugging purposes only
 			// NOTE(bill): for debugging purposes only
 			String name = e->token.string;
 			String name = e->token.string;
-			tb_node_append_attrib(param_ptr, tb_function_attrib_variable(p->func, name.len, cast(char const *)name.text, debug_type));
+			TB_DebugType *param_debug_type = debug_type;
+			TB_Node *     param_ptr_to_use = param_ptr;
+			if (rule == TB_PASSING_INDIRECT) {
+				// HACK TODO(bill): this is just to get the debug information
+				TB_CharUnits ptr_size = cast(TB_CharUnits)build_context.ptr_size;
+				TB_Node *dummy_param = tb_inst_local(p->func, ptr_size, ptr_size);
+				tb_inst_store(p->func, TB_TYPE_PTR, dummy_param, param_ptr, ptr_size, false);
+				param_ptr_to_use = dummy_param;
+				param_debug_type = tb_debug_create_ptr(p->module->mod, param_debug_type);
+			}
+			tb_node_append_attrib(
+				param_ptr_to_use,
+				tb_function_attrib_variable(
+					p->func,
+					name.len, cast(char const *)name.text,
+					param_debug_type
+				)
+			);
 		}
 		}
 		cgAddr addr = cg_addr(local);
 		cgAddr addr = cg_addr(local);
 		if (e) {
 		if (e) {
@@ -332,13 +349,20 @@ gb_internal WORKER_TASK_PROC(cg_procedure_compile_worker_proc) {
 
 
 	bool emit_asm = false;
 	bool emit_asm = false;
 
 
+	if (
+	    string_starts_with(p->name, str_lit("runtime@_os_write")) ||
+	    false
+	) {
+		emit_asm = true;
+	}
+
 	TB_FunctionOutput *output = tb_module_compile_function(p->module->mod, p->func, TB_ISEL_FAST, emit_asm);
 	TB_FunctionOutput *output = tb_module_compile_function(p->module->mod, p->func, TB_ISEL_FAST, emit_asm);
 	if (emit_asm) {
 	if (emit_asm) {
 		TB_Assembly *assembly = tb_output_get_asm(output);
 		TB_Assembly *assembly = tb_output_get_asm(output);
 		for (TB_Assembly *node = assembly; node != nullptr; node = node->next) {
 		for (TB_Assembly *node = assembly; node != nullptr; node = node->next) {
-			gb_printf_err("%.*s", cast(int)node->length, node->data);
+			fprintf(stdout, "%.*s", cast(int)node->length, node->data);
 		}
 		}
-		gb_printf_err("\n");
+		fprintf(stdout, "\n");
 	}
 	}
 
 
 	return 0;
 	return 0;

+ 77 - 0
src/tilde_type_info.cpp

@@ -2,7 +2,84 @@ gb_internal void cg_setup_type_info_data(cgModule *m) {
 	if (build_context.no_rtti) {
 	if (build_context.no_rtti) {
 		return;
 		return;
 	}
 	}
+
 	CheckerInfo *info = m->info;
 	CheckerInfo *info = m->info;
+	{ // Add type info data
+		isize max_type_info_count = info->minimum_dependency_type_info_set.count+1;
+		// gb_printf_err("max_type_info_count: %td\n", max_type_info_count);
+		Type *t = alloc_type_array(t_type_info, max_type_info_count);
+
+		TB_Global *g = tb_global_create(m->mod, -1, CG_TYPE_INFO_DATA_NAME, nullptr, TB_LINKAGE_PRIVATE);
+		tb_global_set_storage(m->mod, tb_module_get_rdata(m->mod), g, type_size_of(t), 16, max_type_info_count);
+
+		cgValue value = cg_value(g, alloc_type_pointer(t));
+		cg_global_type_info_data_entity = alloc_entity_variable(nullptr, make_token_ident(CG_TYPE_INFO_DATA_NAME), t, EntityState_Resolved);
+		cg_add_entity(m, cg_global_type_info_data_entity, value);
+	}
+
+	{ // Type info member buffer
+		// NOTE(bill): Removes need for heap allocation by making it global memory
+		isize count = 0;
+
+		for (Type *t : m->info->type_info_types) {
+			isize index = cg_type_info_index(m->info, t, false);
+			if (index < 0) {
+				continue;
+			}
+
+			switch (t->kind) {
+			case Type_Union:
+				count += t->Union.variants.count;
+				break;
+			case Type_Struct:
+				count += t->Struct.fields.count;
+				break;
+			case Type_Tuple:
+				count += t->Tuple.variables.count;
+				break;
+			}
+		}
+
+		if (count > 0) {
+			{
+				char const *name = CG_TYPE_INFO_TYPES_NAME;
+				Type *t = alloc_type_array(t_type_info_ptr, count);
+				TB_Global *g = tb_global_create(m->mod, -1, name, nullptr, TB_LINKAGE_PRIVATE);
+				tb_global_set_storage(m->mod, tb_module_get_rdata(m->mod), g, type_size_of(t), 16, count*2);
+				cg_global_type_info_member_types = cg_addr(cg_value(g, alloc_type_pointer(t)));
+			}
+			{
+				char const *name = CG_TYPE_INFO_NAMES_NAME;
+				Type *t = alloc_type_array(t_string, count);
+				TB_Global *g = tb_global_create(m->mod, -1, name, nullptr, TB_LINKAGE_PRIVATE);
+				tb_global_set_storage(m->mod, tb_module_get_rdata(m->mod), g, type_size_of(t), 16, count*2);
+				cg_global_type_info_member_names = cg_addr(cg_value(g, alloc_type_pointer(t)));
+			}
+			{
+				char const *name = CG_TYPE_INFO_OFFSETS_NAME;
+				Type *t = alloc_type_array(t_uintptr, count);
+				TB_Global *g = tb_global_create(m->mod, -1, name, nullptr, TB_LINKAGE_PRIVATE);
+				tb_global_set_storage(m->mod, tb_module_get_rdata(m->mod), g, type_size_of(t), 16, count);
+				cg_global_type_info_member_offsets = cg_addr(cg_value(g, alloc_type_pointer(t)));
+			}
+
+			{
+				char const *name = CG_TYPE_INFO_USINGS_NAME;
+				Type *t = alloc_type_array(t_bool, count);
+				TB_Global *g = tb_global_create(m->mod, -1, name, nullptr, TB_LINKAGE_PRIVATE);
+				tb_global_set_storage(m->mod, tb_module_get_rdata(m->mod), g, type_size_of(t), 16, count);
+				cg_global_type_info_member_usings = cg_addr(cg_value(g, alloc_type_pointer(t)));
+			}
+
+			{
+				char const *name = CG_TYPE_INFO_TAGS_NAME;
+				Type *t = alloc_type_array(t_string, count);
+				TB_Global *g = tb_global_create(m->mod, -1, name, nullptr, TB_LINKAGE_PRIVATE);
+				tb_global_set_storage(m->mod, tb_module_get_rdata(m->mod), g, type_size_of(t), 16, count*2);
+				cg_global_type_info_member_tags = cg_addr(cg_value(g, alloc_type_pointer(t)));
+			}
+		}
+	}
 	gb_unused(info);
 	gb_unused(info);