X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ast2firm.c;h=864255ee20c33e4b3fac2d001e5574ce78ac06bc;hb=12203c8feed97a48d4b4326eda40451ba3a736d0;hp=cf08613b6d0ced97beb91f9218439f14c8df9ba5;hpb=f0fc6838cda19af299d3f23d4b29c41ce4dbba05;p=cparser diff --git a/ast2firm.c b/ast2firm.c index cf08613..864255e 100644 --- a/ast2firm.c +++ b/ast2firm.c @@ -63,7 +63,7 @@ ir_node *uninitialized_local_var(ir_graph *irg, ir_mode *mode, int pos) { const declaration_t *declaration = get_irg_loc_description(irg, pos); - warningf(declaration->source_position, "variable '%#T' might be used uninitialized\n", + warningf(declaration->source_position, "variable '%#T' might be used uninitialized", declaration->type, declaration->symbol); return new_r_Unknown(irg, mode); } @@ -241,8 +241,8 @@ static void init_atomic_modes(void) { static ir_mode *get_atomic_mode(const atomic_type_t* atomic_type) { ir_mode *res = NULL; - if ((unsigned)atomic_type->atype < (unsigned)ATOMIC_TYPE_LAST) - res = _atomic_modes[(unsigned)atomic_type->atype]; + if ((unsigned)atomic_type->akind < (unsigned)ATOMIC_TYPE_LAST) + res = _atomic_modes[(unsigned)atomic_type->akind]; if (res == NULL) panic("Encountered unknown atomic type"); return res; @@ -252,7 +252,7 @@ static unsigned get_type_size(type_t *type); static unsigned get_atomic_type_size(const atomic_type_t *type) { - switch(type->atype) { + switch(type->akind) { case ATOMIC_TYPE_CHAR: case ATOMIC_TYPE_SCHAR: case ATOMIC_TYPE_UCHAR: @@ -312,6 +312,8 @@ static unsigned get_type_size(type_t *type) type = skip_typeref(type); switch(type->kind) { + case TYPE_ERROR: + panic("error type occured"); case TYPE_ATOMIC: return get_atomic_type_size(&type->atomic); case TYPE_ENUM: @@ -361,8 +363,8 @@ static ir_type *create_atomic_type(const atomic_type_t *type) ident *id = get_mode_ident(mode); ir_type *irtype = new_type_primitive(id, mode); - if(type->atype == ATOMIC_TYPE_LONG_DOUBLE - || type->atype == ATOMIC_TYPE_DOUBLE) { + if(type->akind == ATOMIC_TYPE_LONG_DOUBLE + || type->akind == ATOMIC_TYPE_DOUBLE) { set_type_alignment_bytes(irtype, 4); } @@ -521,7 +523,7 @@ static ir_type *create_bitfield_type(bitfield_type_t *const type) unsigned size = fold_constant(type->size); - assert(!is_type_floating(base)); + assert(!is_type_float(base)); if(is_type_signed(base)) { return get_signed_int_type_for_bit_size(irbase, size); } else { @@ -547,7 +549,7 @@ static ir_type *create_struct_type(compound_type_t *type) size_t align_all = 1; size_t offset = 0; size_t bit_offset = 0; - declaration_t *entry = type->declaration->context.declarations; + declaration_t *entry = type->declaration->scope.declarations; for( ; entry != NULL; entry = entry->next) { if(entry->namespc != NAMESPACE_NORMAL) continue; @@ -650,7 +652,7 @@ static ir_type *create_union_type(compound_type_t *type) int align_all = 1; int size = 0; - declaration_t *entry = declaration->context.declarations; + declaration_t *entry = declaration->scope.declarations; for( ; entry != NULL; entry = entry->next) { if(entry->namespc != NAMESPACE_NORMAL) continue; @@ -733,6 +735,8 @@ static ir_type *get_ir_type(type_t *type) ir_type *firm_type = NULL; switch(type->kind) { + case TYPE_ERROR: + panic("error type occured"); case TYPE_ATOMIC: firm_type = create_atomic_type(&type->atomic); break; @@ -960,7 +964,7 @@ static ir_node *create_symconst(dbg_info *dbgi, ir_mode *mode, static ir_node *string_to_firm(const source_position_t *const src_pos, const char *const id_prefix, - const char *const string) + const string_t *const value) { ir_type *const global_type = get_glob_type(); ir_type *const type = new_type_array(unique_ident("strtype"), 1, @@ -976,7 +980,8 @@ static ir_node *string_to_firm(const source_position_t *const src_pos, ir_type *const elem_type = ir_type_const_char; ir_mode *const mode = get_type_mode(elem_type); - const size_t slen = strlen(string) + 1; + const char* const string = value->begin; + const size_t slen = value->size; set_array_lower_bound_int(type, 0, 0); set_array_upper_bound_int(type, 0, slen); @@ -998,7 +1003,7 @@ static ir_node *string_literal_to_firm( const string_literal_expression_t* literal) { return string_to_firm(&literal->expression.source_position, "Lstr", - literal->value); + &literal->value); } static ir_node *wide_string_literal_to_firm( @@ -2127,11 +2132,14 @@ static ir_node *array_access_to_firm( return deref_address(irtype, addr, dbgi); } -static ir_node *sizeof_to_firm(const sizeof_expression_t *expression) +/** + * Transform a sizeof expression into Firm code. + */ +static ir_node *sizeof_to_firm(const typeprop_expression_t *expression) { type_t *type = expression->type; if(type == NULL) { - type = expression->size_expression->base.datatype; + type = expression->tp_expression->base.datatype; assert(type != NULL); } @@ -2141,9 +2149,24 @@ static ir_node *sizeof_to_firm(const sizeof_expression_t *expression) return new_SymConst(mode, sym, symconst_type_size); } -static ir_node *alignof_to_firm(const alignof_expression_t *expression) +/** + * Transform an alignof expression into Firm code. + */ +static ir_node *alignof_to_firm(const typeprop_expression_t *expression) { - type_t *const type = expression->type; + type_t *type = expression->type; + if(type == NULL) { + /* beware: if expression is a variable reference, return the + alignment of the variable. */ + const expression_t *tp_expression = expression->tp_expression; + const declaration_t *declaration = expr_is_variable(tp_expression); + if (declaration != NULL) { + /* TODO: get the alignment of this variable. */ + } + type = tp_expression->base.datatype; + assert(type != NULL); + } + ir_mode *const mode = get_ir_mode(expression->expression.datatype); symconst_symbol sym; sym.type_p = get_ir_type(type); @@ -2289,7 +2312,7 @@ static ir_node *classify_type_to_firm(const classify_type_expression_t *const ex { case TYPE_ATOMIC: { const atomic_type_t *const atomic_type = &type->atomic; - switch (atomic_type->atype) { + switch (atomic_type->akind) { /* should not be reached */ case ATOMIC_TYPE_INVALID: tc = no_type_class; @@ -2366,7 +2389,8 @@ static ir_node *function_name_to_firm( const source_position_t *const src_pos = &expr->expression.source_position; const char *const name = current_function_decl->symbol->string; - current_function_name = string_to_firm(src_pos, "__func__", name); + const string_t string = { name, strlen(name) + 1 }; + current_function_name = string_to_firm(src_pos, "__func__", &string); } return current_function_name; @@ -2485,9 +2509,9 @@ static ir_node *_expression_to_firm(const expression_t *expression) case EXPR_ARRAY_ACCESS: return array_access_to_firm(&expression->array_access); case EXPR_SIZEOF: - return sizeof_to_firm(&expression->sizeofe); + return sizeof_to_firm(&expression->typeprop); case EXPR_ALIGNOF: - return alignof_to_firm(&expression->alignofe); + return alignof_to_firm(&expression->typeprop); case EXPR_CONDITIONAL: return conditional_to_firm(&expression->conditional); case EXPR_SELECT: @@ -2690,7 +2714,7 @@ static void create_initializer_compound(initializer_list_t *initializer, { declaration_t *compound_declaration = type->declaration; - declaration_t *compound_entry = compound_declaration->context.declarations; + declaration_t *compound_entry = compound_declaration->scope.declarations; compound_graph_path_entry_t entry; entry.type = COMPOUND_GRAPH_ENTRY_COMPOUND; @@ -2780,19 +2804,18 @@ static void create_initializer_string(initializer_string_t *initializer, entry.prev = last_entry; ++len; - ir_type *irtype = get_entity_type(entity); - size_t arr_len = get_array_type_size(type); - const char *p = initializer->string; - size_t i = 0; - for(i = 0; i < arr_len; ++i, ++p) { + ir_type *const irtype = get_entity_type(entity); + size_t arr_len = get_array_type_size(type); + const char *const p = initializer->string.begin; + if (initializer->string.size < arr_len) { + arr_len = initializer->string.size; + } + for (size_t i = 0; i < arr_len; ++i) { entry.v.array_index = i; - ir_node *node = new_Const_long(mode_Bs, *p); + ir_node *node = new_Const_long(mode_Bs, p[i]); compound_graph_path *path = create_compound_path(irtype, &entry, len); add_compound_ent_value_w_path(entity, node, path); - - if(*p == '\0') - break; } } @@ -2947,6 +2970,9 @@ static void create_initializer(declaration_t *declaration) } } +/** + * Creates a Firm local variable from a declaration. + */ static void create_local_variable(declaration_t *declaration) { assert(declaration->declaration_kind == DECLARATION_KIND_UNKNOWN); @@ -3060,7 +3086,7 @@ static ir_node *compound_statement_to_firm(compound_statement_t *compound) ir_node *result = NULL; statement_t *statement = compound->statements; for( ; statement != NULL; statement = statement->base.next) { - //context2firm(&statement->context); + //context2firm(&statement->scope); if(statement->base.next == NULL && statement->kind == STATEMENT_EXPRESSION) { @@ -3109,6 +3135,8 @@ static void declaration_statement_to_firm(declaration_statement_t *statement) declaration_t *declaration = statement->declarations_begin; declaration_t *end = statement->declarations_end->next; for( ; declaration != end; declaration = declaration->next) { + if(declaration->namespc != NAMESPACE_NORMAL) + continue; create_local_variable(declaration); } } @@ -3277,7 +3305,7 @@ static void for_statement_to_firm(for_statement_t *statement) } /* create declarations */ - declaration_t *declaration = statement->context.declarations; + declaration_t *declaration = statement->scope.declarations; for( ; declaration != NULL; declaration = declaration->next) { create_local_declaration(declaration); } @@ -3376,7 +3404,9 @@ static void switch_statement_to_firm(const switch_statement_t *statement) current_switch_cond = cond; break_label = break_block; - statement_to_firm(statement->body); + if (statement->body != NULL) { + statement_to_firm(statement->body); + } if(get_cur_block() != NULL) { ir_node *jmp = new_Jmp(); @@ -3642,6 +3672,8 @@ static int count_local_declarations(const declaration_t * decl, { int count = 0; for (; decl != end; decl = decl->next) { + if(decl->namespc != NAMESPACE_NORMAL) + continue; const type_t *type = skip_typeref(decl->type); if (!decl->address_taken && is_type_scalar(type)) ++count; @@ -3736,7 +3768,7 @@ static int count_decls_in_stmts(const statement_t *stmt) case STATEMENT_FOR: { const for_statement_t *const for_stmt = &stmt->fors; - count += count_local_declarations(for_stmt->context.declarations, NULL); + count += count_local_declarations(for_stmt->scope.declarations, NULL); count += count_decls_in_expression(for_stmt->initialisation); count += count_decls_in_expression(for_stmt->condition); count += count_decls_in_expression(for_stmt->step); @@ -3781,7 +3813,7 @@ static int get_function_n_local_vars(declaration_t *declaration) int count = 0; /* count parameters */ - count += count_local_declarations(declaration->context.declarations, NULL); + count += count_local_declarations(declaration->scope.declarations, NULL); /* count local variables declared in body */ count += count_decls_in_stmts(declaration->init.statement); @@ -3797,7 +3829,7 @@ static void initialize_function_parameters(declaration_t *declaration) ir_type *function_irtype = get_ir_type(declaration->type); int n = 0; - declaration_t *parameter = declaration->context.declarations; + declaration_t *parameter = declaration->scope.declarations; for( ; parameter != NULL; parameter = parameter->next, ++n) { assert(parameter->declaration_kind == DECLARATION_KIND_UNKNOWN); type_t *type = skip_typeref(parameter->type); @@ -4024,10 +4056,10 @@ create_var: panic("Invalid storage class for global variable"); } -static void context_to_firm(context_t *context) +static void scope_to_firm(scope_t *scope) { /* first pass: create declarations */ - declaration_t *declaration = context->declarations; + declaration_t *declaration = scope->declarations; for( ; declaration != NULL; declaration = declaration->next) { if(declaration->namespc != NAMESPACE_NORMAL) continue; @@ -4046,7 +4078,7 @@ static void context_to_firm(context_t *context) } /* second pass: create code */ - declaration = context->declarations; + declaration = scope->declarations; for( ; declaration != NULL; declaration = declaration->next) { if(declaration->namespc != NAMESPACE_NORMAL) continue; @@ -4099,5 +4131,5 @@ void translation_unit_to_firm(translation_unit_t *unit) break_label = NULL; current_switch_cond = NULL; - context_to_firm(&unit->context); + scope_to_firm(&unit->scope); }