changed printf format for size_t printing
[cparser] / ast2firm.c
index fe08af7..4145de9 100644 (file)
@@ -59,6 +59,7 @@ static ir_node **imature_blocks;
 
 static const declaration_t *current_function_decl;
 static ir_node             *current_function_name;
+static ir_node             *current_funcsig;
 
 static struct obstack asm_obst;
 
@@ -212,7 +213,7 @@ static ir_mode *get_ptrmode(unsigned size, char *name)
        return res;
 }
 
-static ir_mode *_atomic_modes[ATOMIC_TYPE_LAST];
+static ir_mode *_atomic_modes[ATOMIC_TYPE_LAST+1];
 
 static ir_mode *mode_int, *mode_uint;
 
@@ -245,12 +246,10 @@ static void init_atomic_modes(void) {
        _atomic_modes[ATOMIC_TYPE_LONG_DOUBLE] = mode_E;
        _atomic_modes[ATOMIC_TYPE_BOOL]        = get_umode(int_size);
 
-#ifdef PROVIDE_COMPLEX
        _atomic_modes[ATOMIC_TYPE_BOOL]                  = _atomic_modes[ATOMIC_TYPE_INT];
        _atomic_modes[ATOMIC_TYPE_FLOAT_IMAGINARY]       = _atomic_modes[ATOMIC_TYPE_FLOAT];
        _atomic_modes[ATOMIC_TYPE_DOUBLE_IMAGINARY]      = _atomic_modes[ATOMIC_TYPE_DOUBLE];
        _atomic_modes[ATOMIC_TYPE_LONG_DOUBLE_IMAGINARY] = _atomic_modes[ATOMIC_TYPE_LONG_DOUBLE];
-#endif
 
        /* Hmm, pointers should be machine size */
        set_modeP_data(get_ptrmode(machine_size >> 3, NULL));
@@ -263,57 +262,13 @@ 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->akind < (unsigned)ATOMIC_TYPE_LAST)
+       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;
 }
 
-static unsigned get_atomic_type_size(const atomic_type_t *type)
-{
-       switch(type->akind) {
-       case ATOMIC_TYPE_CHAR:
-       case ATOMIC_TYPE_SCHAR:
-       case ATOMIC_TYPE_UCHAR:
-               return 1;
-
-       case ATOMIC_TYPE_SHORT:
-       case ATOMIC_TYPE_USHORT:
-               return 2;
-
-       case ATOMIC_TYPE_BOOL:
-       case ATOMIC_TYPE_INT:
-       case ATOMIC_TYPE_UINT:
-               return machine_size >> 3;
-
-       case ATOMIC_TYPE_LONG:
-       case ATOMIC_TYPE_ULONG:
-               return machine_size > 16 ? machine_size >> 3 : 4;
-
-       case ATOMIC_TYPE_LONGLONG:
-       case ATOMIC_TYPE_ULONGLONG:
-               return machine_size > 16 ? 8 : 4;
-
-       case ATOMIC_TYPE_FLOAT:
-               return 4;
-
-       case ATOMIC_TYPE_DOUBLE:
-               return 8;
-
-       case ATOMIC_TYPE_LONG_DOUBLE:
-               return 12;
-
-       case ATOMIC_TYPE_VOID:
-               return 1;
-
-       case ATOMIC_TYPE_INVALID:
-       case ATOMIC_TYPE_LAST:
-               break;
-       }
-       panic("Trying to determine size of invalid atomic type");
-}
-
 static unsigned get_compound_type_size(compound_type_t *type)
 {
        ir_type *irtype = get_ir_type((type_t*) type);
@@ -336,7 +291,7 @@ static unsigned get_type_size_const(type_t *type)
        case TYPE_ERROR:
                panic("error type occured");
        case TYPE_ATOMIC:
-               return get_atomic_type_size(&type->atomic);
+               return get_atomic_type_size(type->atomic.akind);
        case TYPE_ENUM:
                return get_mode_size_bytes(mode_int);
        case TYPE_COMPOUND_UNION:
@@ -2597,23 +2552,23 @@ typedef enum gcc_type_class
 
 static ir_node *classify_type_to_firm(const classify_type_expression_t *const expr)
 {
-       const type_t *const type = expr->type_expression->base.type;
+       const type_t *const type = skip_typeref(expr->type_expression->base.type);
 
        gcc_type_class tc;
        switch (type->kind)
        {
                case TYPE_ATOMIC: {
                        const atomic_type_t *const atomic_type = &type->atomic;
-                       switch (atomic_type->akind) {
+                       switch ((atomic_type_kind_t) atomic_type->akind) {
                                /* should not be reached */
                                case ATOMIC_TYPE_INVALID:
                                        tc = no_type_class;
-                                       break;
+                                       goto make_const;
 
                                /* gcc cannot do that */
                                case ATOMIC_TYPE_VOID:
                                        tc = void_type_class;
-                                       break;
+                                       goto make_const;
 
                                case ATOMIC_TYPE_CHAR:      /* gcc handles this as integer */
                                case ATOMIC_TYPE_SCHAR:     /* gcc handles this as integer */
@@ -2628,46 +2583,49 @@ static ir_node *classify_type_to_firm(const classify_type_expression_t *const ex
                                case ATOMIC_TYPE_ULONGLONG:
                                case ATOMIC_TYPE_BOOL:      /* gcc handles this as integer */
                                        tc = integer_type_class;
-                                       break;
+                                       goto make_const;
 
                                case ATOMIC_TYPE_FLOAT:
                                case ATOMIC_TYPE_DOUBLE:
                                case ATOMIC_TYPE_LONG_DOUBLE:
                                        tc = real_type_class;
-                                       break;
+                                       goto make_const;
 
-#ifdef PROVIDE_COMPLEX
                                case ATOMIC_TYPE_FLOAT_COMPLEX:
                                case ATOMIC_TYPE_DOUBLE_COMPLEX:
                                case ATOMIC_TYPE_LONG_DOUBLE_COMPLEX:
                                        tc = complex_type_class;
-                                       break;
+                                       goto make_const;
                                case ATOMIC_TYPE_FLOAT_IMAGINARY:
                                case ATOMIC_TYPE_DOUBLE_IMAGINARY:
                                case ATOMIC_TYPE_LONG_DOUBLE_IMAGINARY:
                                        tc = complex_type_class;
-                                       break;
-#endif
-
-                               default:
-                                       panic("Unimplemented case in classify_type_to_firm().");
+                                       goto make_const;
                        }
-                       break;
+                       panic("Unexpected atomic type in classify_type_to_firm().");
                }
 
+               case TYPE_BITFIELD:        tc = integer_type_class; goto make_const;
                case TYPE_ARRAY:           /* gcc handles this as pointer */
                case TYPE_FUNCTION:        /* gcc handles this as pointer */
-               case TYPE_POINTER:         tc = pointer_type_class; break;
-               case TYPE_COMPOUND_STRUCT: tc = record_type_class;  break;
-               case TYPE_COMPOUND_UNION:  tc = union_type_class;   break;
+               case TYPE_POINTER:         tc = pointer_type_class; goto make_const;
+               case TYPE_COMPOUND_STRUCT: tc = record_type_class;  goto make_const;
+               case TYPE_COMPOUND_UNION:  tc = union_type_class;   goto make_const;
 
                /* gcc handles this as integer */
-               case TYPE_ENUM:            tc = integer_type_class; break;
-
-               default:
-                       panic("Unimplemented case in classify_type_to_firm().");
+               case TYPE_ENUM:            tc = integer_type_class; goto make_const;
+
+               case TYPE_BUILTIN:
+               /* typedef/typeof should be skipped already */
+               case TYPE_TYPEDEF:
+               case TYPE_TYPEOF:
+               case TYPE_INVALID:
+               case TYPE_ERROR:
+                       break;
        }
+       panic("unexpected TYPE classify_type_to_firm().");
 
+make_const: ;
        dbg_info *const dbgi = get_dbg_info(&expr->base.source_position);
        ir_mode  *const mode = mode_int;
        tarval   *const tv   = new_tarval_from_long(tc, mode);
@@ -2687,6 +2645,20 @@ static ir_node *function_name_to_firm(
        return current_function_name;
 }
 
+static ir_node *funcsig_to_firm(
+               const string_literal_expression_t *const expr)
+{
+       if (current_funcsig == NULL) {
+               const source_position_t *const src_pos = &expr->base.source_position;
+               ir_entity *ent = get_irg_entity(current_ir_graph);
+               const char *const name = get_entity_ld_name(ent);
+               const string_t string = { name, strlen(name) + 1 };
+               current_funcsig = string_to_firm(src_pos, "__FUNCSIG__", &string);
+       }
+
+       return current_funcsig;
+}
+
 static ir_node *statement_expression_to_firm(const statement_expression_t *expr)
 {
        statement_t *statement = expr->statement;
@@ -2812,7 +2784,10 @@ static ir_node *_expression_to_firm(const expression_t *expression)
                return classify_type_to_firm(&expression->classify_type);
        case EXPR_FUNCTION:
        case EXPR_PRETTY_FUNCTION:
+       case EXPR_FUNCDNAME:
                return function_name_to_firm(&expression->string);
+       case EXPR_FUNCSIG:
+               return funcsig_to_firm(&expression->string);
        case EXPR_STATEMENT:
                return statement_expression_to_firm(&expression->statement);
        case EXPR_VA_START:
@@ -2988,7 +2963,7 @@ static __attribute__((unused)) void debug_print_type_path(const type_path_t *pat
                if(is_type_compound(type)) {
                        fprintf(stderr, ".%s", entry->compound_entry->symbol->string);
                } else if(is_type_array(type)) {
-                       fprintf(stderr, "[%u]", entry->index);
+                       fprintf(stderr, "[%zd]", entry->index);
                } else {
                        fprintf(stderr, "-INVALID-");
                }
@@ -4291,6 +4266,10 @@ static void statement_to_firm(statement_t *statement)
        switch(statement->kind) {
        case STATEMENT_INVALID:
                panic("invalid statement found");
+               return;
+       case STATEMENT_EMPTY:
+               /* nothing */
+               return;
        case STATEMENT_COMPOUND:
                compound_statement_to_firm(&statement->compound);
                return;
@@ -4440,6 +4419,8 @@ static int count_decls_in_expression(const expression_t *expression) {
        case EXPR_WIDE_STRING_LITERAL:
        case EXPR_FUNCTION:
        case EXPR_PRETTY_FUNCTION:
+       case EXPR_FUNCSIG:
+       case EXPR_FUNCDNAME:
        case EXPR_BUILTIN_SYMBOL:
        case EXPR_VA_START:
        case EXPR_VA_ARG:
@@ -4458,6 +4439,9 @@ static int count_decls_in_stmts(const statement_t *stmt)
        int count = 0;
        for (; stmt != NULL; stmt = stmt->base.next) {
                switch (stmt->kind) {
+                       case STATEMENT_EMPTY:
+                               break;
+
                        case STATEMENT_DECLARATION: {
                                const declaration_statement_t *const decl_stmt = &stmt->declaration;
                                count += count_local_declarations(decl_stmt->declarations_begin,
@@ -4653,6 +4637,7 @@ static void create_function(declaration_t *declaration)
 
        current_function_decl = declaration;
        current_function_name = NULL;
+       current_funcsig       = NULL;
 
        assert(imature_blocks == NULL);
        imature_blocks = NEW_ARR_F(ir_node*, 0);