X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=mangle.c;h=fb02128081361579fae097fbed487eb4b5ed21eb;hb=ef3b0164cbb6c9d616c3fdad92fb8da669e4b5d7;hp=4aacb56b72820f9a3534c24a0abf720393be2e07;hpb=03d3b8c10e86bd5604ac13f2cb020c11261977f8;p=cparser diff --git a/mangle.c b/mangle.c index 4aacb56..fb02128 100644 --- a/mangle.c +++ b/mangle.c @@ -1,33 +1,17 @@ /* * This file is part of cparser. - * 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 - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. + * Copyright (C) 2012 Matthias Braun */ #include #include #include +#include "adt/obst.h" #include "entity_t.h" #include "type_t.h" #include "symbol_t.h" #include "mangle.h" -#include "diagnostic.h" -#include "ast2firm.h" #include "lang_features.h" #include "adt/error.h" @@ -38,7 +22,6 @@ static void mangle_type(type_t *type); static char get_atomic_type_mangle(atomic_type_kind_t kind) { switch (kind) { - case ATOMIC_TYPE_INVALID: break; case ATOMIC_TYPE_VOID: return 'v'; case ATOMIC_TYPE_WCHAR_T: return 'w'; case ATOMIC_TYPE_BOOL: return 'b'; @@ -57,7 +40,7 @@ static char get_atomic_type_mangle(atomic_type_kind_t kind) case ATOMIC_TYPE_FLOAT: return 'f'; case ATOMIC_TYPE_DOUBLE: return 'd'; } - panic("invalid atomic type in mangler"); + panic("invalid atomic type"); } static void mangle_atomic_type(const atomic_type_t *type) @@ -150,13 +133,13 @@ static void mangle_array_type(const array_type_t *type) mangle_type(type->element_type); } -static void mangle_complex_type(const complex_type_t *type) +static void mangle_complex_type(const atomic_type_t *type) { obstack_1grow(&obst, 'C'); obstack_1grow(&obst, get_atomic_type_mangle(type->akind)); } -static void mangle_imaginary_type(const imaginary_type_t *type) +static void mangle_imaginary_type(const atomic_type_t *type) { obstack_1grow(&obst, 'G'); obstack_1grow(&obst, get_atomic_type_mangle(type->akind)); @@ -206,22 +189,16 @@ static void mangle_type(type_t *orig_type) mangle_array_type(&type->array); return; case TYPE_COMPLEX: - mangle_complex_type(&type->complex); + mangle_complex_type(&type->atomic); return; case TYPE_IMAGINARY: - mangle_imaginary_type(&type->imaginary); + mangle_imaginary_type(&type->atomic); return; - case TYPE_INVALID: - panic("invalid type encountered while mangling"); case TYPE_ERROR: panic("error type encountered while mangling"); - case TYPE_BUILTIN: case TYPE_TYPEDEF: case TYPE_TYPEOF: panic("typeref not resolved while manging?!?"); - - case TYPE_BITFIELD: - panic("no mangling for this type implemented yet"); } panic("invalid type encountered while mangling"); } @@ -297,9 +274,6 @@ ident *create_name_win32(entity_t *entity) } switch (type->function.linkage) { - case LINKAGE_INVALID: - panic("linkage type of function is invalid"); - case LINKAGE_C: obstack_printf(o, "%s", entity->base.symbol->string); break; @@ -317,10 +291,9 @@ ident *create_name_win32(entity_t *entity) case CC_STDCALL: case CC_FASTCALL: { - ir_type *irtype = get_ir_type(entity->declaration.type); - unsigned size = 0; - for (int i = get_method_n_params(irtype) - 1; i >= 0; --i) { - size += get_type_size_bytes(get_method_param_type(irtype, i)); + unsigned size = 0; + for (function_parameter_t const* i = type->function.parameters; i; i = i->next) { + size += get_type_size(i->type); } obstack_printf(o, "@%u", size); break; @@ -350,8 +323,6 @@ ident *create_name_linux_elf(entity_t *entity) type_t *type = skip_typeref(entity->declaration.type); assert(is_type_function(type)); switch (type->function.linkage) { - case LINKAGE_INVALID: - panic("linkage type of function is invalid"); case LINKAGE_C: if (entity->function.actual_name != NULL) name = entity->function.actual_name->string; @@ -377,8 +348,13 @@ ident *create_name_macho(entity_t *entity) if (entity->kind == ENTITY_FUNCTION) { type_t *type = skip_typeref(entity->declaration.type); assert(is_type_function(type)); - if (type->function.linkage == LINKAGE_INVALID) - panic("linkage type of function is invalid"); + + switch (type->function.linkage) { + default: + if (entity->function.actual_name != NULL) + return new_id_from_str(entity->function.actual_name->string); + break; + } } obstack_printf(&obst, "_%s", entity->base.symbol->string);