X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=ast2firm.c;h=a908ab7c38f06b1b40de86a87f80effc26e958f1;hb=688d947320fffe9930ea01d84f57d261baea6d2a;hp=714e0131d94bfe35672e4ecfb3477a9633534fc0;hpb=97eab8fd5a7b2f996a286496643a87203d706364;p=cparser diff --git a/ast2firm.c b/ast2firm.c index 714e013..a908ab7 100644 --- a/ast2firm.c +++ b/ast2firm.c @@ -2797,8 +2797,9 @@ struct compound_graph_path_entry_t { compound_graph_path_entry_t *prev; }; -static void create_initializer_object(initializer_t *initializer, type_t *type, - ir_entity *entity, compound_graph_path_entry_t *entry, int len); +static void create_ir_initializer_object(initializer_t *initializer, + type_t *type, ir_entity *entity, compound_graph_path_entry_t *entry, + int len); static compound_graph_path *create_compound_path(ir_type *type, compound_graph_path_entry_t *entry, int len) @@ -2820,10 +2821,10 @@ static compound_graph_path *create_compound_path(ir_type *type, return path; } -static void create_initializer_value(initializer_value_t *initializer, - ir_entity *entity, - compound_graph_path_entry_t *entry, - int len) +static void create_ir_initializer_value(initializer_value_t *initializer, + ir_entity *entity, + compound_graph_path_entry_t *entry, + int len) { ir_node *node = expression_to_firm(initializer->value); ir_type *type = get_entity_type(entity); @@ -2831,11 +2832,9 @@ static void create_initializer_value(initializer_value_t *initializer, add_compound_ent_value_w_path(entity, node, path); } -static void create_initializer_compound(initializer_list_t *initializer, - compound_type_t *type, - ir_entity *entity, - compound_graph_path_entry_t *last_entry, - int len) +static void create_ir_initializer_compound(initializer_list_t *initializer, + compound_type_t *type, ir_entity *entity, + compound_graph_path_entry_t *last_entry, int len) { declaration_t *compound_declaration = type->declaration; @@ -2865,22 +2864,22 @@ static void create_initializer_compound(initializer_list_t *initializer, == DECLARATION_KIND_COMPOUND_MEMBER); if(sub_initializer->kind == INITIALIZER_VALUE) { - create_initializer_value(&sub_initializer->value, - entity, &entry, len); + create_ir_initializer_value(&sub_initializer->value, + entity, &entry, len); } else { type_t *entry_type = skip_typeref(compound_entry->type); - create_initializer_object(sub_initializer, entry_type, entity, - &entry, len); + create_ir_initializer_object(sub_initializer, entry_type, entity, + &entry, len); } ++i; } } -static void create_initializer_array(initializer_list_t *initializer, - array_type_t *type, ir_entity *entity, - compound_graph_path_entry_t *last_entry, - int len) +static void create_ir_initializer_array(initializer_list_t *initializer, + array_type_t *type, ir_entity *entity, + compound_graph_path_entry_t *last_entry, + int len) { type_t *element_type = type->element_type; element_type = skip_typeref(element_type); @@ -2897,10 +2896,10 @@ static void create_initializer_array(initializer_list_t *initializer, initializer_t *sub_initializer = initializer->initializers[i]; if(sub_initializer->kind == INITIALIZER_VALUE) { - create_initializer_value(&sub_initializer->value, + create_ir_initializer_value(&sub_initializer->value, entity, &entry, len); } else { - create_initializer_object(sub_initializer, element_type, entity, + create_ir_initializer_object(sub_initializer, element_type, entity, &entry, len); } } @@ -2916,10 +2915,9 @@ static void create_initializer_array(initializer_list_t *initializer, #endif } -static void create_initializer_string(initializer_string_t *initializer, - array_type_t *type, ir_entity *entity, - compound_graph_path_entry_t *last_entry, - int len) +static void create_ir_initializer_string(initializer_string_t *initializer, + array_type_t *type, ir_entity *entity, + compound_graph_path_entry_t *last_entry, int len) { type_t *element_type = type->element_type; element_type = skip_typeref(element_type); @@ -2944,10 +2942,10 @@ static void create_initializer_string(initializer_string_t *initializer, } } -static void create_initializer_wide_string( - const initializer_wide_string_t *const initializer, array_type_t *const type, - ir_entity *const entity, compound_graph_path_entry_t *const last_entry, - int len) +static void create_ir_initializer_wide_string( + const initializer_wide_string_t *const initializer, + array_type_t *const type, ir_entity *const entity, + compound_graph_path_entry_t *const last_entry, int len) { type_t *element_type = type->element_type; element_type = skip_typeref(element_type); @@ -2970,8 +2968,9 @@ static void create_initializer_wide_string( } } -static void create_initializer_object(initializer_t *initializer, type_t *type, - ir_entity *entity, compound_graph_path_entry_t *entry, int len) +static void create_ir_initializer_object(initializer_t *initializer, + type_t *type, ir_entity *entity, compound_graph_path_entry_t *entry, + int len) { if(is_type_array(type)) { array_type_t *array_type = &type->array; @@ -2979,19 +2978,23 @@ static void create_initializer_object(initializer_t *initializer, type_t *type, switch (initializer->kind) { case INITIALIZER_STRING: { initializer_string_t *const string = &initializer->string; - create_initializer_string(string, array_type, entity, entry, len); + create_ir_initializer_string(string, array_type, entity, entry, + len); return; } case INITIALIZER_WIDE_STRING: { - initializer_wide_string_t *const string = &initializer->wide_string; - create_initializer_wide_string(string, array_type, entity, entry, len); + initializer_wide_string_t *const string + = &initializer->wide_string; + create_ir_initializer_wide_string(string, array_type, entity, + entry, len); return; } case INITIALIZER_LIST: { initializer_list_t *const list = &initializer->list; - create_initializer_array(list, array_type, entity, entry, len); + create_ir_initializer_array(list, array_type, entity, entry, + len); return; } @@ -3005,7 +3008,7 @@ static void create_initializer_object(initializer_t *initializer, type_t *type, assert(is_type_compound(type)); compound_type_t *compound_type = &type->compound; - create_initializer_compound(list, compound_type, entity, entry, len); + create_ir_initializer_compound(list, compound_type, entity, entry, len); } } @@ -3043,7 +3046,7 @@ static void create_initializer_local_variable_entity(declaration_t *declaration) current_ir_graph = get_const_code_irg(); type_t *const type = skip_typeref(declaration->type); - create_initializer_object(initializer, type, init_entity, NULL, 0); + create_ir_initializer_object(initializer, type, init_entity, NULL, 0); assert(current_ir_graph == get_const_code_irg()); current_ir_graph = old_current_ir_graph; @@ -3055,7 +3058,7 @@ static void create_initializer_local_variable_entity(declaration_t *declaration) set_store(copyb_mem); } -static void create_initializer(declaration_t *declaration) +static void create_ir_initializer(declaration_t *declaration) { initializer_t *initializer = declaration->init.initializer; if(initializer == NULL) @@ -3091,7 +3094,7 @@ static void create_initializer(declaration_t *declaration) set_entity_variability(entity, variability_initialized); type_t *type = skip_typeref(declaration->type); - create_initializer_object(initializer, type, entity, NULL, 0); + create_ir_initializer_object(initializer, type, entity, NULL, 0); } } @@ -3121,7 +3124,7 @@ static void create_local_variable(declaration_t *declaration) ++next_value_number_function; } - create_initializer(declaration); + create_ir_initializer(declaration); } static void create_local_static_variable(declaration_t *declaration) @@ -3145,7 +3148,7 @@ static void create_local_static_variable(declaration_t *declaration) ir_graph *const old_current_ir_graph = current_ir_graph; current_ir_graph = get_const_code_irg(); - create_initializer(declaration); + create_ir_initializer(declaration); assert(current_ir_graph == get_const_code_irg()); current_ir_graph = old_current_ir_graph; @@ -3225,6 +3228,60 @@ static ir_node *compound_statement_to_firm(compound_statement_t *compound) return result; } +static void create_global_variable(declaration_t *declaration) +{ + ir_visibility vis; + ir_type *var_type; + switch ((storage_class_tag_t)declaration->storage_class) { + case STORAGE_CLASS_STATIC: + vis = visibility_local; + goto global_var; + + case STORAGE_CLASS_EXTERN: + vis = visibility_external_allocated; + goto global_var; + + case STORAGE_CLASS_NONE: + vis = visibility_external_visible; + goto global_var; + + case STORAGE_CLASS_THREAD: + vis = visibility_external_visible; + goto tls_var; + + case STORAGE_CLASS_THREAD_EXTERN: + vis = visibility_external_allocated; + goto tls_var; + + case STORAGE_CLASS_THREAD_STATIC: + vis = visibility_local; + goto tls_var; + +tls_var: + var_type = get_tls_type(); + goto create_var; + +global_var: + var_type = get_glob_type(); + goto create_var; + +create_var: + create_declaration_entity(declaration, + DECLARATION_KIND_GLOBAL_VARIABLE, + var_type); + set_entity_visibility(declaration->v.entity, vis); + + return; + + case STORAGE_CLASS_TYPEDEF: + case STORAGE_CLASS_AUTO: + case STORAGE_CLASS_REGISTER: + case STORAGE_CLASS_ENUM_ENTRY: + break; + } + panic("Invalid storage class for global variable"); +} + static void create_local_declaration(declaration_t *declaration) { if(declaration->symbol == NULL) @@ -3239,12 +3296,18 @@ static void create_local_declaration(declaration_t *declaration) case STORAGE_CLASS_ENUM_ENTRY: panic("enum entry declaration in local block found"); case STORAGE_CLASS_EXTERN: - panic("extern declaration in local block found"); + create_global_variable(declaration); + create_ir_initializer(declaration); + return; case STORAGE_CLASS_NONE: case STORAGE_CLASS_AUTO: case STORAGE_CLASS_REGISTER: if(is_type_function(type)) { - panic("nested functions not supported yet"); + if(declaration->init.statement != NULL) { + panic("nested functions not supported yet"); + } else { + get_function_entity(declaration); + } } else { create_local_variable(declaration); } @@ -3841,6 +3904,14 @@ static int count_decls_in_expression(const expression_t *expression) { } EXPR_UNARY_CASES return count_decls_in_expression(expression->unary.value); + case EXPR_CALL: { + int count = 0; + call_argument_t *argument = expression->call.arguments; + for( ; argument != NULL; argument = argument->next) { + count += count_decls_in_expression(argument->expression); + } + return count; + } default: break; @@ -4145,62 +4216,6 @@ static void create_function(declaration_t *declaration) irg_vrfy(irg); } -static void create_global_variable(declaration_t *declaration) -{ - ir_visibility vis; - ir_type *var_type; - switch ((storage_class_tag_t)declaration->storage_class) { - case STORAGE_CLASS_STATIC: - vis = visibility_local; - goto global_var; - - case STORAGE_CLASS_EXTERN: - vis = visibility_external_allocated; - goto global_var; - - case STORAGE_CLASS_NONE: - vis = visibility_external_visible; - goto global_var; - - case STORAGE_CLASS_THREAD: - vis = visibility_external_visible; - goto tls_var; - - case STORAGE_CLASS_THREAD_EXTERN: - vis = visibility_external_allocated; - goto tls_var; - - case STORAGE_CLASS_THREAD_STATIC: - vis = visibility_local; - goto tls_var; - -tls_var: - var_type = get_tls_type(); - goto create_var; - -global_var: - var_type = get_glob_type(); - goto create_var; - -create_var: - create_declaration_entity(declaration, - DECLARATION_KIND_GLOBAL_VARIABLE, - var_type); - set_entity_visibility(declaration->v.entity, vis); - - current_ir_graph = get_const_code_irg(); - create_initializer(declaration); - return; - - case STORAGE_CLASS_TYPEDEF: - case STORAGE_CLASS_AUTO: - case STORAGE_CLASS_REGISTER: - case STORAGE_CLASS_ENUM_ENTRY: - break; - } - panic("Invalid storage class for global variable"); -} - static void scope_to_firm(scope_t *scope) { /* first pass: create declarations */ @@ -4222,7 +4237,7 @@ static void scope_to_firm(scope_t *scope) } } - /* second pass: create code */ + /* second pass: create code/initializers */ declaration = scope->declarations; for( ; declaration != NULL; declaration = declaration->next) { if(declaration->namespc != NAMESPACE_NORMAL) @@ -4234,10 +4249,14 @@ static void scope_to_firm(scope_t *scope) continue; type_t *type = declaration->type; - if(type->kind != TYPE_FUNCTION) - continue; - - create_function(declaration); + if(type->kind == TYPE_FUNCTION) { + create_function(declaration); + } else { + assert(declaration->declaration_kind + == DECLARATION_KIND_GLOBAL_VARIABLE); + current_ir_graph = get_const_code_irg(); + create_ir_initializer(declaration); + } } }