- remove block parameter from new_r_Proj and new_rd_Proj
[libfirm] / ir / ident / mangle.c
1 /*
2  * Copyright (C) 1995-2008 University of Karlsruhe.  All right reserved.
3  *
4  * This file is part of libFirm.
5  *
6  * This file may be distributed and/or modified under the terms of the
7  * GNU General Public License version 2 as published by the Free Software
8  * Foundation and appearing in the file LICENSE.GPL included in the
9  * packaging of this file.
10  *
11  * Licensees holding valid libFirm Professional Edition licenses may use
12  * this file in accordance with the libFirm Commercial License.
13  * Agreement provided with the Software.
14  *
15  * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
16  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE.
18  */
19
20 /**
21  * @file
22  * @brief   Methods to manipulate names.
23  * @author  Martin Trapp, Christian Schaefer, Goetz Lindenmaier, Michael Beck
24  * @version $Id$
25  */
26 #include "config.h"
27
28 # include <stdio.h>
29
30 #include "ident.h"
31 #include "obst.h"
32
33 /* Make types visible to allow most efficient access */
34 #include "entity_t.h"
35 #include "type_t.h"
36 #include "tpop_t.h"
37
38 /** An obstack used for temporary space */
39 static struct obstack mangle_obst;
40
41 /** returned a mangled type name, currently no mangling */
42 static inline ident *mangle_type(ir_type *tp)
43 {
44         assert(tp->kind == k_type);
45         return tp->name;
46 }
47
48 ident *id_mangle_entity(ir_entity *ent)
49 {
50         ident *type_id;
51         char *cp;
52         int len;
53         ident *res;
54
55         type_id = mangle_type(ent->owner);
56         obstack_grow(&mangle_obst, get_id_str(type_id), get_id_strlen(type_id));
57         obstack_1grow(&mangle_obst,'_');
58         obstack_grow(&mangle_obst,get_id_str(ent->name),get_id_strlen(ent->name));
59         len = obstack_object_size (&mangle_obst);
60         cp = obstack_finish (&mangle_obst);
61         res = new_id_from_chars(cp, len);
62         obstack_free (&mangle_obst, cp);
63         return res;
64 }
65
66
67 /* Returns a new ident that represents 'firstscnd'. */
68 ident *id_mangle(ident *first, ident *scnd)
69 {
70         char *cp;
71         int len;
72         ident *res;
73
74         obstack_grow(&mangle_obst, get_id_str(first), get_id_strlen(first));
75         obstack_grow(&mangle_obst, get_id_str(scnd), get_id_strlen(scnd));
76         len = obstack_object_size (&mangle_obst);
77         cp = obstack_finish (&mangle_obst);
78         res = new_id_from_chars (cp, len);
79         obstack_free (&mangle_obst, cp);
80         return res;
81 }
82
83 /** Returns a new ident that represents 'prefixscndsuffix'. */
84 ident *id_mangle3(const char *prefix, ident *scnd, const char *suffix)
85 {
86         char *cp;
87         int len;
88         ident *res;
89
90         obstack_grow(&mangle_obst, prefix, strlen(prefix));
91         obstack_grow(&mangle_obst, get_id_str(scnd), get_id_strlen(scnd));
92         obstack_grow(&mangle_obst, suffix, strlen(suffix));
93         len = obstack_object_size (&mangle_obst);
94         cp  = obstack_finish (&mangle_obst);
95         res = new_id_from_chars (cp, len);
96         obstack_free (&mangle_obst, cp);
97         return res;
98 }
99
100 /** Returns a new ident that represents first<c>scnd. */
101 static ident *id_mangle_3(ident *first, char c, ident* scnd)
102 {
103         char *cp;
104         int len;
105         ident *res;
106
107         obstack_grow(&mangle_obst, get_id_str(first), get_id_strlen(first));
108         obstack_1grow(&mangle_obst, c);
109         obstack_grow(&mangle_obst,get_id_str(scnd),get_id_strlen(scnd));
110         len = obstack_object_size (&mangle_obst);
111         cp = obstack_finish (&mangle_obst);
112         res = new_id_from_chars (cp, len);
113         obstack_free (&mangle_obst, cp);
114         return res;
115 }
116
117 /* Returns a new ident that represents first_scnd. */
118 ident *id_mangle_u(ident *first, ident* scnd)
119 {
120         return id_mangle_3(first, '_', scnd);
121 }
122
123 /* Returns a new ident that represents first.scnd. */
124 ident *id_mangle_dot(ident *first, ident* scnd)
125 {
126         return id_mangle_3(first, '.', scnd);
127 }
128
129 /* returns a mangled name for a Win32 function using it's calling convention */
130 ident *id_decorate_win32_c_fkt(ir_entity *ent, ident *id)
131 {
132         ir_type *tp      = get_entity_type(ent);
133         unsigned cc_mask = get_method_calling_convention(tp);
134         char buf[16];
135         int size, i;
136
137         if (IS_CDECL(cc_mask))
138                 return id_mangle3("_", id, "");
139         else if (IS_STDCALL(cc_mask)) {
140                 size = 0;
141                 for (i = get_method_n_params(tp) - 1; i >= 0; --i) {
142                         size += get_type_size_bytes(get_method_param_type(tp, i));
143                 }
144
145                 snprintf(buf, sizeof(buf), "@%d", size);
146
147                 if (cc_mask & cc_reg_param)
148                         return id_mangle3("@", id, buf);
149                 else
150                         return id_mangle3("_", id, buf);
151         }
152         return id;
153 }
154
155 void firm_init_mangle(void)
156 {
157         obstack_init(&mangle_obst);
158 }