diff --git a/codegen.c b/codegen.c index 2136a31..1cbe17a 100644 --- a/codegen.c +++ b/codegen.c @@ -534,6 +534,16 @@ void codegen_generate_global_variable_for_struct(struct node *node) { asm_keyword_for_size(variable_size(node), tmp_buf)); } +void codegen_generate_global_variable_for_union(struct node *node) { + if (node->var.val != NULL) { + compiler_error(current_process, "Unions with values not supported"); + } + + char tmp_buf[256]; + asm_push("%s: %s 0", node->var.name, + asm_keyword_for_size(variable_size(node), tmp_buf)); +} + void codegen_generate_global_variable(struct node *node) { asm_push("; %s %s", node->var.type.type_str, node->var.name); switch (node->var.type.type) { @@ -549,6 +559,10 @@ void codegen_generate_global_variable(struct node *node) { codegen_generate_global_variable_for_struct(node); break; + case DATA_TYPE_UNION: + codegen_generate_global_variable_for_union(node); + break; + case DATA_TYPE_DOUBLE: case DATA_TYPE_FLOAT: compiler_error(current_process, "Unsupported data type"); @@ -562,6 +576,12 @@ void codegen_generate_struct(struct node *node) { } } +void codegen_generate_union(struct node *node) { + if (node->flags & NODE_FLAG_HAS_VARIABLE_COMBINED) { + codegen_generate_global_variable(node->_union.var); + } +} + void codegen_generate_data_section_part(struct node *node) { switch (node->type) { case NODE_TYPE_VARIABLE: @@ -572,6 +592,10 @@ void codegen_generate_data_section_part(struct node *node) { codegen_generate_struct(node); break; + case NODE_TYPE_UNION: + codegen_generate_union(node); + break; + default: break; } diff --git a/test.c b/test.c index c643309..ea2596f 100644 --- a/test.c +++ b/test.c @@ -1,4 +1,11 @@ +union abc { + int x; + int y; +}; + +union abc a; + int main() { - int *x; - *x = 50; + a.x = 20; + return a.y; }