X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Ftr%2Fmangle.c;h=8873c79b580b986331d212776ec1d4c9088468c8;hb=75c56501fa4428e3460a36c77585b96027bcd167;hp=b13f303fb3676ffd7cf65eaa3360f2a3b5b583b6;hpb=a63062db7f43c0d0bec2779e62fa9493cd74d3af;p=libfirm diff --git a/ir/tr/mangle.c b/ir/tr/mangle.c index b13f303fb..8873c79b5 100644 --- a/ir/tr/mangle.c +++ b/ir/tr/mangle.c @@ -1,26 +1,41 @@ -/* Copyright (C) 1998 - 2000 by Universitaet Karlsruhe -** All rights reserved. -** -** Authors: Martin Trapp, Christian Schaefer -** -*/ - +/* + * Project: libFIRM + * File name: ir/tr/mangle.c + * Purpose: Methods to manipulate names. + * Author: Martin Trapp, Christian Schaefer + * Modified by: Goetz Lindenmaier + * Created: + * CVS-ID: $Id$ + * Copyright: (c) 1998-2003 Universität Karlsruhe + * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE. + */ #ifdef HAVE_CONFIG_H -# include +# include "config.h" +#endif + +#ifdef HAVE_STDIO_H +# include #endif -# include "mangle.h" -# include -# include "obst.h" -# include "entity.h" -# include -# include "ident_t.h" +#include "mangle.h" +#include "obst.h" /* Make types visible to allow most efficient access */ -# include "entity_t.h" +#include "entity_t.h" +#include "type_t.h" +#include "tpop_t.h" +/** a obstack used for temporary space */ static struct obstack mangle_obst; +/** returned a mangled type name, currently no mangling */ +static INLINE ident * +mangle_type (ir_type *tp) +{ + assert (tp->kind == k_type); + return tp->name; +} + ident * mangle_entity (entity *ent) { @@ -29,35 +44,103 @@ mangle_entity (entity *ent) int len; ident *res; - type_id = mangle_type ((type *) ent->owner); - xoprintf (&mangle_obst, "%I_%I", type_id, ent->name); + type_id = mangle_type(ent->owner); + obstack_grow(&mangle_obst, get_id_str(type_id), get_id_strlen(type_id)); + obstack_1grow(&mangle_obst,'_'); + obstack_grow(&mangle_obst,get_id_str(ent->name),get_id_strlen(ent->name)); len = obstack_object_size (&mangle_obst); cp = obstack_finish (&mangle_obst); - res = id_from_str (cp, len); + res = new_id_from_chars(cp, len); obstack_free (&mangle_obst, cp); return res; } -ident * -mangle_type (type *type) -{ + +/* Returns a new ident that represents 'firstscnd'. */ +ident *mangle (ident *first, ident *scnd) { + char *cp; + int len; + ident *res; + + obstack_grow(&mangle_obst, get_id_str(first), get_id_strlen(first)); + obstack_grow(&mangle_obst, get_id_str(scnd), get_id_strlen(scnd)); + len = obstack_object_size (&mangle_obst); + cp = obstack_finish (&mangle_obst); + res = new_id_from_chars (cp, len); + obstack_free (&mangle_obst, cp); + return res; +} + +/** Returns a new ident that represents 'prefixscndsuffix'. */ +static ident *mangle3(const char *prefix, ident *scnd, const char *suffix) { char *cp; int len; ident *res; - assert (type->kind == k_type_class); + obstack_grow(&mangle_obst, prefix, strlen(prefix)); + obstack_grow(&mangle_obst, get_id_str(scnd), get_id_strlen(scnd)); + obstack_grow(&mangle_obst, suffix, strlen(suffix)); + len = obstack_object_size (&mangle_obst); + cp = obstack_finish (&mangle_obst); + res = new_id_from_chars (cp, len); + obstack_free (&mangle_obst, cp); + return res; +} + +/** Returns a new ident that represents firstscnd. */ +static ident *mangle_3(ident *first, char c, ident* scnd) { + char *cp; + int len; + ident *res; - xoprintf (&mangle_obst, "%I", type->clss.name); + obstack_grow(&mangle_obst, get_id_str(first), get_id_strlen(first)); + obstack_1grow(&mangle_obst, c); + obstack_grow(&mangle_obst,get_id_str(scnd),get_id_strlen(scnd)); len = obstack_object_size (&mangle_obst); cp = obstack_finish (&mangle_obst); - res = id_from_str (cp, len); + res = new_id_from_chars (cp, len); obstack_free (&mangle_obst, cp); return res; } +/* Returns a new ident that represents first_scnd. */ +ident *mangle_u (ident *first, ident* scnd) { + return mangle_3(first, '_', scnd); +} + +/* Returns a new ident that represents first.scnd. */ +ident *mangle_dot (ident *first, ident* scnd) { + return mangle_3(first, '.', scnd); +} + +/* returns a mangled name for a Win32 function using it's calling convention */ +ident *decorate_win32_c_fkt(entity *ent) { + ir_type *tp = get_entity_type(ent); + unsigned cc_mask = get_method_calling_convention(tp); + char buf[16]; + int size, i; + + if (IS_CDECL(cc_mask)) + return mangle3("_", get_entity_ident(ent), ""); + else if (IS_STDCALL(cc_mask)) { + + size = 0; + for (i = get_method_n_params(tp) - 1; i >= 0; --i) { + size += get_type_size_bytes(get_method_param_type(tp, i)); + } + + snprintf(buf, sizeof(buf), "@%d", size); + + if (cc_mask & cc_reg_param) + return mangle3("@", get_entity_ident(ent), buf); + else + return mangle3("_", get_entity_ident(ent), buf); + } + return get_entity_ident(ent); +} void -init_mangle (void) +firm_init_mangle (void) { - obstack_init (&mangle_obst); + obstack_init(&mangle_obst); }