X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=type.c;h=0abf634665254081aa4ae79b89513f447b7581cd;hb=233b4629181c4a07fbabe8566c10ce2bae9224de;hp=74fc7e04d010fc3ce442f81519c8a60d73dadc98;hpb=169633ae1bfd72505599f2c4b9c0115ba4b33cd1;p=cparser diff --git a/type.c b/type.c index 74fc7e0..0abf634 100644 --- a/type.c +++ b/type.c @@ -1,6 +1,6 @@ /* * This file is part of cparser. - * Copyright (C) 2007-2008 Matthias Braun + * Copyright (C) 2007-2009 Matthias Braun * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -34,6 +34,9 @@ #include "diagnostic.h" #include "driver/firm_cmdline.h" +/** The default calling convention. */ +cc_kind_t default_calling_convention = CC_CDECL; + static struct obstack _type_obst; static FILE *out; struct obstack *type_obst = &_type_obst; @@ -330,12 +333,20 @@ static void print_function_type_pre(const function_type_t *type) intern_print_type_pre(type->return_type); - switch (type->calling_convention) { + cc_kind_t cc = type->calling_convention; +restart: + switch (cc) { case CC_CDECL: fputs(" __cdecl", out); break; case CC_STDCALL: fputs(" __stdcall", out); break; case CC_FASTCALL: fputs(" __fastcall", out); break; case CC_THISCALL: fputs(" __thiscall", out); break; - case CC_DEFAULT: break; + case CC_DEFAULT: + if (default_calling_convention != CC_CDECL) { + /* show the default calling convention if its not cdecl */ + cc = default_calling_convention; + goto restart; + } + break; } } @@ -1096,16 +1107,24 @@ static bool function_types_compatible(const function_type_t *func1, if (func1->linkage != func2->linkage) return false; - if (func1->calling_convention != func2->calling_convention) - return false; + cc_kind_t cc1 = func1->calling_convention; + if (cc1 == CC_DEFAULT) + cc1 = default_calling_convention; + cc_kind_t cc2 = func2->calling_convention; + if (cc2 == CC_DEFAULT) + cc2 = default_calling_convention; - /* can parameters be compared? */ - if (func1->unspecified_parameters || func2->unspecified_parameters) - return true; + if (cc1 != cc2) + return false; if (func1->variadic != func2->variadic) return false; + /* can parameters be compared? */ + if ((func1->unspecified_parameters && !func1->kr_style_parameters) + || (func2->unspecified_parameters && !func2->kr_style_parameters)) + return true; + /* TODO: handling of unspecified parameters not correct yet */ /* all argument types must be compatible */