aboutsummaryrefslogtreecommitdiff
path: root/src/tilde_expr.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2023-07-25 15:15:35 +0100
committergingerBill <bill@gingerbill.org>2023-07-25 15:15:35 +0100
commit0f217c715ecd9fc265b1c6a3d579b99ecf849139 (patch)
treeaf3a2b1847c5066e89d7c11365c45945800b464d /src/tilde_expr.cpp
parentc4033c215e01343709a0d7928c277a6425f53524 (diff)
Fix dependency issue; Allow polymorphic procedures in tilde
Diffstat (limited to 'src/tilde_expr.cpp')
-rw-r--r--src/tilde_expr.cpp278
1 files changed, 137 insertions, 141 deletions
diff --git a/src/tilde_expr.cpp b/src/tilde_expr.cpp
index 96f17bfcf..1966dcd8e 100644
--- a/src/tilde_expr.cpp
+++ b/src/tilde_expr.cpp
@@ -2399,7 +2399,12 @@ cgAddr cg_build_addr_compound_lit(cgProcedure *p, Ast *expr) {
Type *type = type_of_expr(expr);
Type *bt = base_type(type);
- cgAddr v = cg_add_local(p, type, nullptr, true);
+ cgAddr v = {};
+ if (p->is_startup) {
+ v = cg_add_global(p, type, nullptr);
+ } else {
+ v = cg_add_local(p, type, nullptr, true);
+ }
if (cl->elems.count == 0) {
// No need to create it
@@ -2424,8 +2429,6 @@ cgAddr cg_build_addr_compound_lit(cgProcedure *p, Ast *expr) {
}
TokenPos pos = ast_token(expr).pos;
- if (cl->elems.count == 0) {
- }
switch (bt->kind) {
default: GB_PANIC("Unknown CompoundLit type: %s", type_to_string(type)); break;
@@ -2493,21 +2496,22 @@ cgAddr cg_build_addr_compound_lit(cgProcedure *p, Ast *expr) {
return v;
}
- // case Type_Map: {
- // GB_ASSERT(!build_context.no_dynamic_literals);
+ case Type_Map: {
+ GB_ASSERT(!build_context.no_dynamic_literals);
+ GB_PANIC("TODO(bill): map literals");
- // cgValue err = cg_dynamic_map_reserve(p, v.addr, 2*cl->elems.count, pos);
- // gb_unused(err);
+ // cgValue err = cg_dynamic_map_reserve(p, v.addr, 2*cl->elems.count, pos);
+ // gb_unused(err);
- // for (Ast *elem : cl->elems) {
- // ast_node(fv, FieldValue, elem);
+ // for (Ast *elem : cl->elems) {
+ // ast_node(fv, FieldValue, elem);
- // cgValue key = cg_build_expr(p, fv->field);
- // cgValue value = cg_build_expr(p, fv->value);
- // cg_internal_dynamic_map_set(p, v.addr, type, key, value, elem);
- // }
- // break;
- // }
+ // cgValue key = cg_build_expr(p, fv->field);
+ // cgValue value = cg_build_expr(p, fv->value);
+ // cg_internal_dynamic_map_set(p, v.addr, type, key, value, elem);
+ // }
+ break;
+ }
case Type_Array: {
auto temp_data = array_make<cgCompoundLitElemTempData>(temporary_allocator(), 0, cl->elems.count);
@@ -2523,23 +2527,21 @@ cgAddr cg_build_addr_compound_lit(cgProcedure *p, Ast *expr) {
assign_array(p, temp_data);
break;
}
- // case Type_EnumeratedArray: {
- // cg_addr_store(p, v, cg_const_value(p->module, type, exact_value_compound(expr)));
-
- // auto temp_data = array_make<cgCompoundLitElemTempData>(temporary_allocator(), 0, cl->elems.count);
+ case Type_EnumeratedArray: {
+ auto temp_data = array_make<cgCompoundLitElemTempData>(temporary_allocator(), 0, cl->elems.count);
- // populate(p, cl->elems, &temp_data, type);
+ populate(p, cl->elems, &temp_data, type);
- // cgValue dst_ptr = cg_addr_get_ptr(p, v);
- // i64 index_offset = exact_value_to_i64(*bt->EnumeratedArray.min_value);
- // for_array(i, temp_data) {
- // i32 index = cast(i32)(temp_data[i].elem_index - index_offset);
- // temp_data[i].gep = cg_emit_array_epi(p, dst_ptr, index);
- // }
+ cgValue dst_ptr = cg_addr_get_ptr(p, v);
+ i64 index_offset = exact_value_to_i64(*bt->EnumeratedArray.min_value);
+ for_array(i, temp_data) {
+ i32 index = cast(i32)(temp_data[i].elem_index - index_offset);
+ temp_data[i].gep = cg_emit_array_epi(p, dst_ptr, index);
+ }
- // assign_array(p, temp_data);
- // break;
- // }
+ assign_array(p, temp_data);
+ break;
+ }
case Type_Slice: {
isize count = gb_max(cl->elems.count, cl->max_count);
@@ -2570,88 +2572,89 @@ cgAddr cg_build_addr_compound_lit(cgProcedure *p, Ast *expr) {
return v;
}
- // case Type_DynamicArray: {
- // GB_ASSERT(!build_context.no_dynamic_literals);
+ case Type_DynamicArray: {
+ GB_ASSERT(!build_context.no_dynamic_literals);
- // Type *et = bt->DynamicArray.elem;
- // cgValue size = cg_const_int(p->module, t_int, type_size_of(et));
- // cgValue align = cg_const_int(p->module, t_int, type_align_of(et));
+ Type *et = bt->DynamicArray.elem;
+ cgValue size = cg_const_int(p, t_int, type_size_of(et));
+ cgValue align = cg_const_int(p, t_int, type_align_of(et));
- // i64 item_count = gb_max(cl->max_count, cl->elems.count);
- // {
+ i64 item_count = gb_max(cl->max_count, cl->elems.count);
+ {
- // auto args = array_make<cgValue>(temporary_allocator(), 5);
- // args[0] = cg_emit_conv(p, cg_addr_get_ptr(p, v), t_rawptr);
- // args[1] = size;
- // args[2] = align;
- // args[3] = cg_const_int(p->module, t_int, item_count);
- // args[4] = cg_emit_source_code_location_as_global(p, proc_name, pos);
- // cg_emit_runtime_call(p, "__dynamic_array_reserve", args);
- // }
+ auto args = slice_make<cgValue>(temporary_allocator(), 5);
+ args[0] = cg_emit_conv(p, cg_addr_get_ptr(p, v), t_rawptr);
+ args[1] = size;
+ args[2] = align;
+ args[3] = cg_const_int(p, t_int, item_count);
+ args[4] = cg_emit_source_code_location_as_global(p, proc_name, pos);
+ cg_emit_runtime_call(p, "__dynamic_array_reserve", args);
+ }
- // cgValue items = cg_generate_local_array(p, et, item_count);
+ Type *array_type = alloc_type_array(et, item_count);
+ cgAddr items_addr = cg_add_local(p, array_type, nullptr, true);
+ cgValue items = cg_addr_get_ptr(p, items_addr);
- // auto temp_data = array_make<cgCompoundLitElemTempData>(temporary_allocator(), 0, cl->elems.count);
- // populate(p, cl->elems, &temp_data, type);
+ auto temp_data = array_make<cgCompoundLitElemTempData>(temporary_allocator(), 0, cl->elems.count);
+ populate(p, cl->elems, &temp_data, type);
- // for_array(i, temp_data) {
- // temp_data[i].gep = cg_emit_array_epi(p, items, temp_data[i].elem_index);
- // }
- // assign_array(p, temp_data);
-
- // {
- // auto args = array_make<cgValue>(temporary_allocator(), 6);
- // args[0] = cg_emit_conv(p, v.addr, t_rawptr);
- // args[1] = size;
- // args[2] = align;
- // args[3] = cg_emit_conv(p, items, t_rawptr);
- // args[4] = cg_const_int(p->module, t_int, item_count);
- // args[5] = cg_emit_source_code_location_as_global(p, proc_name, pos);
- // cg_emit_runtime_call(p, "__dynamic_array_append", args);
- // }
- // break;
- // }
+ for_array(i, temp_data) {
+ temp_data[i].gep = cg_emit_array_epi(p, items, temp_data[i].elem_index);
+ }
+ assign_array(p, temp_data);
- // case Type_Basic: {
- // GB_ASSERT(is_type_any(bt));
- // cg_addr_store(p, v, cg_const_value(p->module, type, exact_value_compound(expr)));
- // String field_names[2] = {
- // str_lit("data"),
- // str_lit("id"),
- // };
- // Type *field_types[2] = {
- // t_rawptr,
- // t_typeid,
- // };
-
- // for_array(field_index, cl->elems) {
- // Ast *elem = cl->elems[field_index];
-
- // cgValue field_expr = {};
- // isize index = field_index;
-
- // if (elem->kind == Ast_FieldValue) {
- // ast_node(fv, FieldValue, elem);
- // Selection sel = lookup_field(bt, fv->field->Ident.token.string, false);
- // index = sel.index[0];
- // elem = fv->value;
- // } else {
- // TypeAndValue tav = type_and_value_of_expr(elem);
- // Selection sel = lookup_field(bt, field_names[field_index], false);
- // index = sel.index[0];
- // }
-
- // field_expr = cg_build_expr(p, elem);
-
- // GB_ASSERT(field_expr.type->kind != Type_Tuple);
-
- // Type *ft = field_types[index];
- // cgValue fv = cg_emit_conv(p, field_expr, ft);
- // cgValue gep = cg_emit_struct_ep(p, cg_addr_get_ptr(p, v), cast(i32)index);
- // cg_emit_store(p, gep, fv);
- // }
- // break;
- // }
+ {
+ auto args = slice_make<cgValue>(temporary_allocator(), 6);
+ args[0] = cg_emit_conv(p, v.addr, t_rawptr);
+ args[1] = size;
+ args[2] = align;
+ args[3] = cg_emit_conv(p, items, t_rawptr);
+ args[4] = cg_const_int(p, t_int, item_count);
+ args[5] = cg_emit_source_code_location_as_global(p, proc_name, pos);
+ cg_emit_runtime_call(p, "__dynamic_array_append", args);
+ }
+ break;
+ }
+
+ case Type_Basic: {
+ GB_ASSERT(is_type_any(bt));
+ String field_names[2] = {
+ str_lit("data"),
+ str_lit("id"),
+ };
+ Type *field_types[2] = {
+ t_rawptr,
+ t_typeid,
+ };
+
+ for_array(field_index, cl->elems) {
+ Ast *elem = cl->elems[field_index];
+
+ cgValue field_expr = {};
+ isize index = field_index;
+
+ if (elem->kind == Ast_FieldValue) {
+ ast_node(fv, FieldValue, elem);
+ Selection sel = lookup_field(bt, fv->field->Ident.token.string, false);
+ index = sel.index[0];
+ elem = fv->value;
+ } else {
+ TypeAndValue tav = type_and_value_of_expr(elem);
+ Selection sel = lookup_field(bt, field_names[field_index], false);
+ index = sel.index[0];
+ }
+
+ field_expr = cg_build_expr(p, elem);
+
+ GB_ASSERT(field_expr.type->kind != Type_Tuple);
+
+ Type *ft = field_types[index];
+ cgValue fv = cg_emit_conv(p, field_expr, ft);
+ cgValue gep = cg_emit_struct_ep(p, cg_addr_get_ptr(p, v), index);
+ cg_emit_store(p, gep, fv);
+ }
+ break;
+ }
case Type_BitSet: {
i64 sz = type_size_of(type);
@@ -2679,48 +2682,41 @@ cgAddr cg_build_addr_compound_lit(cgProcedure *p, Ast *expr) {
return v;
}
- // case Type_Matrix: {
- // cg_addr_store(p, v, cg_const_value(p->module, type, exact_value_compound(expr)));
+ case Type_Matrix: {
+ auto temp_data = array_make<cgCompoundLitElemTempData>(temporary_allocator(), 0, cl->elems.count);
- // auto temp_data = array_make<cgCompoundLitElemTempData>(temporary_allocator(), 0, cl->elems.count);
+ populate(p, cl->elems, &temp_data, type);
- // populate(p, cl->elems, &temp_data, type);
+ cgValue dst_ptr = cg_addr_get_ptr(p, v);
+ for_array(i, temp_data) {
+ temp_data[i].gep = cg_emit_array_epi(p, dst_ptr, temp_data[i].elem_index);
+ }
- // cgValue dst_ptr = cg_addr_get_ptr(p, v);
- // for_array(i, temp_data) {
- // temp_data[i].gep = cg_emit_array_epi(p, dst_ptr, temp_data[i].elem_index);
- // }
+ assign_array(p, temp_data);
+ break;
+ }
- // assign_array(p, temp_data);
- // break;
- // }
+ case Type_SimdVector: {
+ // auto temp_data = array_make<cgCompoundLitElemTempData>(temporary_allocator(), 0, cl->elems.count);
- // case Type_SimdVector: {
- // cgValue vector_value = cg_const_value(p->module, type, exact_value_compound(expr));
- // defer (cg_addr_store(p, v, vector_value));
-
- // auto temp_data = array_make<cgCompoundLitElemTempData>(temporary_allocator(), 0, cl->elems.count);
-
- // populate(p, cl->elems, &temp_data, type);
-
- // // TODO(bill): reduce the need for individual `insertelement` if a `shufflevector`
- // // might be a better option
- // for (auto const &td : temp_data) {
- // if (td.value.value != nullptr) {
- // if (td.elem_length > 0) {
- // for (i64 k = 0; k < td.elem_length; k++) {
- // LLVMValueRef index = cg_const_int(p->module, t_u32, td.elem_index + k).value;
- // vector_value.value = LLVMBuildInsertElement(p->builder, vector_value.value, td.value.value, index, "");
- // }
- // } else {
- // LLVMValueRef index = cg_const_int(p->module, t_u32, td.elem_index).value;
- // vector_value.value = LLVMBuildInsertElement(p->builder, vector_value.value, td.value.value, index, "");
-
- // }
- // }
- // }
- // break;
- // }
+ // populate(p, cl->elems, &temp_data, type);
+
+ // // TODO(bill): reduce the need for individual `insertelement` if a `shufflevector`
+ // // might be a better option
+ // for (auto const &td : temp_data) if (td.value.node != nullptr) {
+ // if (td.elem_length > 0) {
+ // for (i64 k = 0; k < td.elem_length; k++) {
+ // LLVMValueRef index = cg_const_int(p->module, t_u32, td.elem_index + k).value;
+ // vector_value.value = LLVMBuildInsertElement(p->builder, vector_value.value, td.value.value, index, "");
+ // }
+ // } else {
+ // LLVMValueRef index = cg_const_int(p->module, t_u32, td.elem_index).value;
+ // vector_value.value = LLVMBuildInsertElement(p->builder, vector_value.value, td.value.value, index, "");
+
+ // }
+ // }
+ break;
+ }
}
return v;