OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [binutils-2.20.1/] [libiberty/] [cp-demint.c] - Blame information for rev 298

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 205 julius
/* Demangler component interface functions.
2
   Copyright (C) 2004 Free Software Foundation, Inc.
3
   Written by Ian Lance Taylor <ian@wasabisystems.com>.
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 <stdlib.h>
46
#endif
47
#ifdef HAVE_STRING_H
48
#include <string.h>
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
      if (di.comps != NULL)
210
        free (di.comps);
211
      if (di.subs != NULL)
212
        free (di.subs);
213
      return NULL;
214
    }
215
 
216
  if (! type)
217
    dc = cplus_demangle_mangled_name (&di, 1);
218
  else
219
    dc = cplus_demangle_type (&di);
220
 
221
  /* If DMGL_PARAMS is set, then if we didn't consume the entire
222
     mangled string, then we didn't successfully demangle it.  */
223
  if ((options & DMGL_PARAMS) != 0 && d_peek_char (&di) != '\0')
224
    dc = NULL;
225
 
226
  free (di.subs);
227
 
228
  if (dc != NULL)
229
    *mem = di.comps;
230
  else
231
    free (di.comps);
232
 
233
  return dc;
234
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.