zig ir.cpp details: remove the mem_slot mechanism
Previously, there was hacky code to deal with result locations and how they work with regards to comptime values and runtime values. In addition, there was a hacky "mem_slot" mechanism that managed the memory for local variables, and acted differently depending on comptime vs runtime situations. All that is deleted in this commit, and as a result, result locations code has one less complication. Importantly, this means that a comptime result location is now passed to a function when it is evaluated at comptime. This test causes many regressions, and some of the behavior tests are disabled (commented out) in this commit. Future commits will re-enable the tests before merging the branch.
This commit is contained in:
@@ -1102,11 +1102,28 @@ ZigType *get_partial_container_type(CodeGen *g, Scope *scope, ContainerKind kind
|
||||
ZigValue *analyze_const_value(CodeGen *g, Scope *scope, AstNode *node, ZigType *type_entry,
|
||||
Buf *type_name, UndefAllowed undef)
|
||||
{
|
||||
Error err;
|
||||
|
||||
ZigValue *result = create_const_vals(1);
|
||||
ZigValue *result_ptr = create_const_vals(1);
|
||||
result->special = ConstValSpecialUndef;
|
||||
result->type = (type_entry == nullptr) ? g->builtin_types.entry_var : type_entry;
|
||||
result_ptr->special = ConstValSpecialStatic;
|
||||
result_ptr->type = get_pointer_to_type(g, result->type, false);
|
||||
result_ptr->data.x_ptr.mut = ConstPtrMutComptimeVar;
|
||||
result_ptr->data.x_ptr.special = ConstPtrSpecialRef;
|
||||
result_ptr->data.x_ptr.data.ref.pointee = result;
|
||||
|
||||
size_t backward_branch_count = 0;
|
||||
size_t backward_branch_quota = default_backward_branch_quota;
|
||||
return ir_eval_const_value(g, scope, node, type_entry,
|
||||
if ((err = ir_eval_const_value(g, scope, node, result_ptr,
|
||||
&backward_branch_count, &backward_branch_quota,
|
||||
nullptr, nullptr, node, type_name, nullptr, nullptr, undef);
|
||||
nullptr, nullptr, node, type_name, nullptr, nullptr, undef)))
|
||||
{
|
||||
return g->invalid_instruction->value;
|
||||
}
|
||||
destroy(result_ptr, "ZigValue");
|
||||
return result;
|
||||
}
|
||||
|
||||
Error type_val_resolve_zero_bits(CodeGen *g, ZigValue *type_val, ZigType *parent_type,
|
||||
@@ -3805,7 +3822,6 @@ ZigVar *add_variable(CodeGen *g, AstNode *source_node, Scope *parent_scope, Buf
|
||||
variable_entry->var_type = var_type;
|
||||
variable_entry->parent_scope = parent_scope;
|
||||
variable_entry->shadowable = false;
|
||||
variable_entry->mem_slot_index = SIZE_MAX;
|
||||
variable_entry->src_arg_index = SIZE_MAX;
|
||||
|
||||
assert(name);
|
||||
@@ -3906,7 +3922,7 @@ static void resolve_decl_var(CodeGen *g, TldVar *tld_var, bool allow_lazy) {
|
||||
|
||||
// TODO more validation for types that can't be used for export/extern variables
|
||||
ZigType *implicit_type = nullptr;
|
||||
if (explicit_type && explicit_type->id == ZigTypeIdInvalid) {
|
||||
if (explicit_type != nullptr && explicit_type->id == ZigTypeIdInvalid) {
|
||||
implicit_type = explicit_type;
|
||||
} else if (var_decl->expr) {
|
||||
init_value = analyze_const_value(g, tld_var->base.parent_scope, var_decl->expr, explicit_type,
|
||||
@@ -4694,8 +4710,14 @@ static void analyze_fn_ir(CodeGen *g, ZigFn *fn, AstNode *return_type_node) {
|
||||
assert(!fn_type->data.fn.is_generic);
|
||||
FnTypeId *fn_type_id = &fn_type->data.fn.fn_type_id;
|
||||
|
||||
if (fn->analyzed_executable.begin_scope == nullptr) {
|
||||
fn->analyzed_executable.begin_scope = &fn->def_scope->base;
|
||||
}
|
||||
if (fn->analyzed_executable.source_node == nullptr) {
|
||||
fn->analyzed_executable.source_node = fn->body_node;
|
||||
}
|
||||
ZigType *block_return_type = ir_analyze(g, fn->ir_executable,
|
||||
&fn->analyzed_executable, fn_type_id->return_type, return_type_node);
|
||||
&fn->analyzed_executable, fn_type_id->return_type, return_type_node, nullptr);
|
||||
fn->src_implicit_return_type = block_return_type;
|
||||
|
||||
if (type_is_invalid(block_return_type) || fn->analyzed_executable.first_err_trace_msg != nullptr) {
|
||||
@@ -6850,6 +6872,7 @@ static void render_const_val_array(CodeGen *g, Buf *buf, Buf *type_name, ZigValu
|
||||
}
|
||||
case ConstArraySpecialNone: {
|
||||
ZigValue *base = &array->data.s_none.elements[start];
|
||||
assert(base != nullptr);
|
||||
assert(start + len <= const_val->type->data.array.len);
|
||||
|
||||
buf_appendf(buf, "%s{", buf_ptr(type_name));
|
||||
@@ -6865,6 +6888,10 @@ static void render_const_val_array(CodeGen *g, Buf *buf, Buf *type_name, ZigValu
|
||||
}
|
||||
|
||||
void render_const_value(CodeGen *g, Buf *buf, ZigValue *const_val) {
|
||||
if (const_val == nullptr) {
|
||||
buf_appendf(buf, "(invalid nullptr value)");
|
||||
return;
|
||||
}
|
||||
switch (const_val->special) {
|
||||
case ConstValSpecialRuntime:
|
||||
buf_appendf(buf, "(runtime value)");
|
||||
|
||||
Reference in New Issue
Block a user