X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=type.c;h=0abf634665254081aa4ae79b89513f447b7581cd;hb=233b4629181c4a07fbabe8566c10ce2bae9224de;hp=c0d7a7e9f2b345fd2c484564ce97b14a975c3d1a;hpb=f4f911fd236f5ceea70a10ef489823759f0bd57d;p=cparser diff --git a/type.c b/type.c index c0d7a7e..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) { - 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; + 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: + 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 */ @@ -1678,8 +1697,7 @@ type_t *make_array_type(type_t *element_type, size_t size, static entity_t *pack_bitfield_members(il_size_t *struct_offset, il_alignment_t *struct_alignment, - bool packed, type_t *type, - entity_t *first) + bool packed, entity_t *first) { il_size_t offset = *struct_offset; il_alignment_t alignment = *struct_alignment; @@ -1690,8 +1708,8 @@ static entity_t *pack_bitfield_members(il_size_t *struct_offset, if (member->kind != ENTITY_COMPOUND_MEMBER) break; - type_t *member_type = member->declaration.type; - if (member_type->kind != TYPE_BITFIELD) + type_t *type = member->declaration.type; + if (type->kind != TYPE_BITFIELD) break; type_t *base_type = skip_typeref(type->bitfield.base_type); @@ -1700,7 +1718,7 @@ static entity_t *pack_bitfield_members(il_size_t *struct_offset, if (base_alignment > alignment) alignment = base_alignment; - size_t bit_size = member_type->bitfield.bit_size; + size_t bit_size = type->bitfield.bit_size; if (!packed) { bit_offset += (offset & alignment_mask) * BITS_PER_BYTE; offset &= ~alignment_mask; @@ -1764,7 +1782,7 @@ void layout_struct_type(compound_type_t *type) if (skipped->kind == TYPE_BITFIELD) { entry = pack_bitfield_members(&offset, &alignment, - compound->packed, m_type, entry); + compound->packed, entry); continue; }