Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5191 serge 1
/* Demangler component interface functions.
2
   Copyright (C) 2004 Free Software Foundation, Inc.
3
   Written by Ian Lance Taylor .
4
 
5
   This file is part of the libiberty library, which is part of GCC.
6
 
7
   This file is free software; you can redistribute it and/or modify
8
   it under the terms of the GNU General Public License as published by
9
   the Free Software Foundation; either version 2 of the License, or
10
   (at your option) any later version.
11
 
12
   In addition to the permissions in the GNU General Public License, the
13
   Free Software Foundation gives you unlimited permission to link the
14
   compiled version of this file into combinations with other programs,
15
   and to distribute those combinations without any restriction coming
16
   from the use of this file.  (The General Public License restrictions
17
   do apply in other respects; for example, they cover modification of
18
   the file, and distribution when not linked into a combined
19
   executable.)
20
 
21
   This program is distributed in the hope that it will be useful,
22
   but WITHOUT ANY WARRANTY; without even the implied warranty of
23
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
24
   GNU General Public License for more details.
25
 
26
   You should have received a copy of the GNU General Public License
27
   along with this program; if not, write to the Free Software
28
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
29
*/
30
 
31
/* This file implements a few interface functions which are provided
32
   for use with struct demangle_component trees.  These functions are
33
   declared in demangle.h.  These functions are closely tied to the
34
   demangler code in cp-demangle.c, and other interface functions can
35
   be found in that file.  We put these functions in a separate file
36
   because they are not needed by the demangler, and so we avoid
37
   having them pulled in by programs which only need the
38
   demangler.  */
39
 
40
#ifdef HAVE_CONFIG_H
41
#include "config.h"
42
#endif
43
 
44
#ifdef HAVE_STDLIB_H
45
#include 
46
#endif
47
#ifdef HAVE_STRING_H
48
#include 
49
#endif
50
 
51
#include "ansidecl.h"
52
#include "libiberty.h"
53
#include "demangle.h"
54
#include "cp-demangle.h"
55
 
56
/* Fill in most component types.  */
57
 
58
int
59
cplus_demangle_fill_component (struct demangle_component *p,
60
                               enum demangle_component_type type,
61
                               struct demangle_component *left,
62
                                struct demangle_component *right)
63
{
64
  if (p == NULL)
65
    return 0;
66
  switch (type)
67
    {
68
    case DEMANGLE_COMPONENT_QUAL_NAME:
69
    case DEMANGLE_COMPONENT_LOCAL_NAME:
70
    case DEMANGLE_COMPONENT_TYPED_NAME:
71
    case DEMANGLE_COMPONENT_TEMPLATE:
72
    case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE:
73
    case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
74
    case DEMANGLE_COMPONENT_FUNCTION_TYPE:
75
    case DEMANGLE_COMPONENT_ARRAY_TYPE:
76
    case DEMANGLE_COMPONENT_PTRMEM_TYPE:
77
    case DEMANGLE_COMPONENT_ARGLIST:
78
    case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST:
79
    case DEMANGLE_COMPONENT_UNARY:
80
    case DEMANGLE_COMPONENT_BINARY:
81
    case DEMANGLE_COMPONENT_BINARY_ARGS:
82
    case DEMANGLE_COMPONENT_TRINARY:
83
    case DEMANGLE_COMPONENT_TRINARY_ARG1:
84
    case DEMANGLE_COMPONENT_TRINARY_ARG2:
85
    case DEMANGLE_COMPONENT_LITERAL:
86
    case DEMANGLE_COMPONENT_LITERAL_NEG:
87
      break;
88
 
89
      /* These component types only have one subtree.  */
90
    case DEMANGLE_COMPONENT_VTABLE:
91
    case DEMANGLE_COMPONENT_VTT:
92
    case DEMANGLE_COMPONENT_TYPEINFO:
93
    case DEMANGLE_COMPONENT_TYPEINFO_NAME:
94
    case DEMANGLE_COMPONENT_TYPEINFO_FN:
95
    case DEMANGLE_COMPONENT_THUNK:
96
    case DEMANGLE_COMPONENT_VIRTUAL_THUNK:
97
    case DEMANGLE_COMPONENT_COVARIANT_THUNK:
98
    case DEMANGLE_COMPONENT_JAVA_CLASS:
99
    case DEMANGLE_COMPONENT_GUARD:
100
    case DEMANGLE_COMPONENT_REFTEMP:
101
    case DEMANGLE_COMPONENT_RESTRICT:
102
    case DEMANGLE_COMPONENT_VOLATILE:
103
    case DEMANGLE_COMPONENT_CONST:
104
    case DEMANGLE_COMPONENT_RESTRICT_THIS:
105
    case DEMANGLE_COMPONENT_VOLATILE_THIS:
106
    case DEMANGLE_COMPONENT_CONST_THIS:
107
    case DEMANGLE_COMPONENT_POINTER:
108
    case DEMANGLE_COMPONENT_REFERENCE:
109
    case DEMANGLE_COMPONENT_COMPLEX:
110
    case DEMANGLE_COMPONENT_IMAGINARY:
111
    case DEMANGLE_COMPONENT_VENDOR_TYPE:
112
    case DEMANGLE_COMPONENT_CAST:
113
      if (right != NULL)
114
	return 0;
115
      break;
116
 
117
    default:
118
      /* Other types do not use subtrees.  */
119
      return 0;
120
    }
121
 
122
  p->type = type;
123
  p->u.s_binary.left = left;
124
  p->u.s_binary.right = right;
125
 
126
  return 1;
127
}
128
 
129
/* Fill in a DEMANGLE_COMPONENT_BUILTIN_TYPE.  */
130
 
131
int
132
cplus_demangle_fill_builtin_type (struct demangle_component *p,
133
                                  const char *type_name)
134
{
135
  int len;
136
  unsigned int i;
137
 
138
  if (p == NULL || type_name == NULL)
139
    return 0;
140
  len = strlen (type_name);
141
  for (i = 0; i < D_BUILTIN_TYPE_COUNT; ++i)
142
    {
143
      if (len == cplus_demangle_builtin_types[i].len
144
	  && strcmp (type_name, cplus_demangle_builtin_types[i].name) == 0)
145
	{
146
	  p->type = DEMANGLE_COMPONENT_BUILTIN_TYPE;
147
	  p->u.s_builtin.type = &cplus_demangle_builtin_types[i];
148
	  return 1;
149
	}
150
    }
151
  return 0;
152
}
153
 
154
/* Fill in a DEMANGLE_COMPONENT_OPERATOR.  */
155
 
156
int
157
cplus_demangle_fill_operator (struct demangle_component *p,
158
                              const char *opname, int args)
159
{
160
  int len;
161
  unsigned int i;
162
 
163
  if (p == NULL || opname == NULL)
164
    return 0;
165
  len = strlen (opname);
166
  for (i = 0; cplus_demangle_operators[i].name != NULL; ++i)
167
    {
168
      if (len == cplus_demangle_operators[i].len
169
	  && args == cplus_demangle_operators[i].args
170
	  && strcmp (opname, cplus_demangle_operators[i].name) == 0)
171
	{
172
	  p->type = DEMANGLE_COMPONENT_OPERATOR;
173
	  p->u.s_operator.op = &cplus_demangle_operators[i];
174
	  return 1;
175
	}
176
    }
177
  return 0;
178
}
179
 
180
/* Translate a mangled name into components.  */
181
 
182
struct demangle_component *
183
cplus_demangle_v3_components (const char *mangled, int options, void **mem)
184
{
185
  size_t len;
186
  int type;
187
  struct d_info di;
188
  struct demangle_component *dc;
189
 
190
  len = strlen (mangled);
191
 
192
  if (mangled[0] == '_' && mangled[1] == 'Z')
193
    type = 0;
194
  else
195
    {
196
      if ((options & DMGL_TYPES) == 0)
197
	return NULL;
198
      type = 1;
199
    }
200
 
201
  cplus_demangle_init_info (mangled, options, len, &di);
202
 
203
  di.comps = ((struct demangle_component *)
204
	      malloc (di.num_comps * sizeof (struct demangle_component)));
205
  di.subs = ((struct demangle_component **)
206
	     malloc (di.num_subs * sizeof (struct demangle_component *)));
207
  if (di.comps == NULL || di.subs == NULL)
208
    {
209
      free (di.comps);
210
      free (di.subs);
211
      return NULL;
212
    }
213
 
214
  if (! type)
215
    dc = cplus_demangle_mangled_name (&di, 1);
216
  else
217
    dc = cplus_demangle_type (&di);
218
 
219
  /* If DMGL_PARAMS is set, then if we didn't consume the entire
220
     mangled string, then we didn't successfully demangle it.  */
221
  if ((options & DMGL_PARAMS) != 0 && d_peek_char (&di) != '\0')
222
    dc = NULL;
223
 
224
  free (di.subs);
225
 
226
  if (dc != NULL)
227
    *mem = di.comps;
228
  else
229
    free (di.comps);
230
 
231
  return dc;
232
}