Cleanup, resolve some warnings.
[cparser] / ast2firm.c
index 613f9cb..3a2e220 100644 (file)
@@ -96,9 +96,11 @@ 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",
-                declaration->type, declaration->symbol);
+       if (declaration != NULL) {
+               warningf(&declaration->source_position,
+                        "variable '%#T' might be used uninitialized",
+                        declaration->type, declaration->symbol);
+       }
        return new_r_Unknown(irg, mode);
 }
 
@@ -380,6 +382,34 @@ static ir_type *create_method_type(const function_type_t *function_type)
                set_method_variadicity(irtype, variadicity_variadic);
        }
 
+       unsigned cc = get_method_calling_convention(irtype);
+       switch (function_type->calling_convention) {
+       case CC_DEFAULT: /* unspecified calling convention, equal to one of the other, typically cdecl */
+       case CC_CDECL:
+is_cdecl:
+               set_method_calling_convention(irtype, SET_CDECL(cc));
+               break;
+
+       case CC_STDCALL:
+               if (function_type->variadic || function_type->unspecified_parameters)
+                       goto is_cdecl;
+
+               /* only non-variadic function can use stdcall, else use cdecl */
+               set_method_calling_convention(irtype, SET_STDCALL(cc));
+               break;
+
+       case CC_FASTCALL:
+               if (function_type->variadic || function_type->unspecified_parameters)
+                       goto is_cdecl;
+               /* only non-variadic function can use fastcall, else use cdecl */
+               set_method_calling_convention(irtype, SET_FASTCALL(cc));
+               break;
+
+       case CC_THISCALL:
+               /* Hmm, leave default, not accepted by the parser yet. */
+               warningf(&function_type->base.source_position, "THISCALL calling convention not supported yet");
+               break;
+       }
        return irtype;
 }
 
@@ -5401,6 +5431,23 @@ void exit_ast2firm(void)
        obstack_free(&asm_obst, NULL);
 }
 
+static void global_asm_to_firm(statement_t *s)
+{
+       for (; s != NULL; s = s->base.next) {
+               assert(s->kind == STATEMENT_ASM);
+
+               char const *const text = s->asms.asm_text.begin;
+               size_t            size = s->asms.asm_text.size;
+
+               /* skip the last \0 */
+               if (text[size - 1] == '\0')
+                       --size;
+
+               ident *const id = new_id_from_chars(text, size);
+               add_irp_asm(id);
+       }
+}
+
 void translation_unit_to_firm(translation_unit_t *unit)
 {
        /* just to be sure */
@@ -5411,4 +5458,5 @@ void translation_unit_to_firm(translation_unit_t *unit)
        init_ir_types();
 
        scope_to_firm(&unit->scope);
+       global_asm_to_firm(unit->global_asm);
 }