all remaining *.c *.h files from hp merge.
[deliverable/binutils-gdb.git] / gdb / demangle.c
CommitLineData
2dbde378 1/* Basic C++ demangling support for GDB.
81afee37 2 Copyright 1991, 1992, 1996 Free Software Foundation, Inc.
2dbde378
FF
3 Written by Fred Fish at Cygnus Support.
4
5This file is part of GDB.
6
7This program is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2 of the License, or
10(at your option) any later version.
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with this program; if not, write to the Free Software
6c9638b4 19Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
2dbde378
FF
20
21
22/* This file contains support code for C++ demangling that is common
23 to a styles of demangling, and GDB specific. */
24
25#include "defs.h"
26#include "command.h"
27#include "gdbcmd.h"
28#include "demangle.h"
2b576293 29#include "gdb_string.h"
2dbde378 30
d23639b2
FF
31/* Select the default C++ demangling style to use. The default is "auto",
32 which allows gdb to attempt to pick an appropriate demangling style for
33 the executable it has loaded. It can be set to a specific style ("gnu",
65b07ddc 34 "lucid", "arm", "hp", etc.) in which case gdb will never attempt to do auto
d23639b2
FF
35 selection of the style unless you do an explicit "set demangle auto".
36 To select one of these as the default, set DEFAULT_DEMANGLING_STYLE in
37 the appropriate target configuration file. */
38
39#ifndef DEFAULT_DEMANGLING_STYLE
40# define DEFAULT_DEMANGLING_STYLE AUTO_DEMANGLING_STYLE_STRING
2dbde378
FF
41#endif
42
2dbde378
FF
43/* String name for the current demangling style. Set by the "set demangling"
44 command, printed as part of the output by the "show demangling" command. */
45
46static char *current_demangling_style_string;
47
48/* List of supported demangling styles. Contains the name of the style as
49 seen by the user, and the enum value that corresponds to that style. */
50
51static const struct demangler
52{
53 char *demangling_style_name;
54 enum demangling_styles demangling_style;
55 char *demangling_style_doc;
56} demanglers [] =
57{
58 {AUTO_DEMANGLING_STYLE_STRING,
59 auto_demangling,
60 "Automatic selection based on executable"},
61 {GNU_DEMANGLING_STYLE_STRING,
62 gnu_demangling,
63 "GNU (g++) style demangling"},
64 {LUCID_DEMANGLING_STYLE_STRING,
65 lucid_demangling,
66 "Lucid (lcc) style demangling"},
45364c8a
FF
67 {ARM_DEMANGLING_STYLE_STRING,
68 arm_demangling,
69 "ARM style demangling"},
65b07ddc
DT
70 {HP_DEMANGLING_STYLE_STRING,
71 hp_demangling,
72 "HP (aCC) style demangling"},
73 {EDG_DEMANGLING_STYLE_STRING,
74 edg_demangling,
75 "EDG style demangling"},
6c7e40b4 76 {NULL, unknown_demangling, NULL}
2dbde378
FF
77};
78
b607efe7
FF
79static void
80set_demangling_command PARAMS ((char *, int, struct cmd_list_element *));
81
2dbde378
FF
82/* set current demangling style. called by the "set demangling" command
83 after it has updated the current_demangling_style_string to match
84 what the user has entered.
85
86 if the user has entered a string that matches a known demangling style
87 name in the demanglers[] array then just leave the string alone and update
88 the current_demangling_style enum value to match.
89
90 if the user has entered a string that doesn't match, including an empty
91 string, then print a list of the currently known styles and restore
92 the current_demangling_style_string to match the current_demangling_style
93 enum value.
94
95 Note: Assumes that current_demangling_style_string always points to
96 a malloc'd string, even if it is a null-string. */
97
98static void
719d9abb
JK
99set_demangling_command (ignore, from_tty, c)
100 char *ignore;
101 int from_tty;
102 struct cmd_list_element *c;
2dbde378
FF
103{
104 const struct demangler *dem;
105
106 /* First just try to match whatever style name the user supplied with
107 one of the known ones. Don't bother special casing for an empty
108 name, we just treat it as any other style name that doesn't match.
109 If we match, update the current demangling style enum. */
110
111 for (dem = demanglers; dem -> demangling_style_name != NULL; dem++)
112 {
2e4964ad
FF
113 if (STREQ (current_demangling_style_string,
114 dem -> demangling_style_name))
2dbde378
FF
115 {
116 current_demangling_style = dem -> demangling_style;
117 break;
118 }
119 }
120
121 /* Check to see if we found a match. If not, gripe about any non-empty
122 style name and supply a list of valid ones. FIXME: This should
123 probably be done with some sort of completion and with help. */
124
125 if (dem -> demangling_style_name == NULL)
126 {
127 if (*current_demangling_style_string != '\0')
128 {
199b2450 129 printf_unfiltered ("Unknown demangling style `%s'.\n",
2dbde378
FF
130 current_demangling_style_string);
131 }
199b2450 132 printf_unfiltered ("The currently understood settings are:\n\n");
2dbde378
FF
133 for (dem = demanglers; dem -> demangling_style_name != NULL; dem++)
134 {
199b2450 135 printf_unfiltered ("%-10s %s\n", dem -> demangling_style_name,
2dbde378
FF
136 dem -> demangling_style_doc);
137 if (dem -> demangling_style == current_demangling_style)
138 {
139 free (current_demangling_style_string);
140 current_demangling_style_string =
bb6247c6
JK
141 savestring (dem -> demangling_style_name,
142 strlen (dem -> demangling_style_name));
2dbde378
FF
143 }
144 }
145 if (current_demangling_style == unknown_demangling)
146 {
147 /* This can happen during initialization if gdb is compiled with
148 a DEMANGLING_STYLE value that is unknown, so pick the first
149 one as the default. */
150 current_demangling_style = demanglers[0].demangling_style;
151 current_demangling_style_string =
bb6247c6
JK
152 savestring (demanglers[0].demangling_style_name,
153 strlen (demanglers[0].demangling_style_name));
2dbde378
FF
154 warning ("`%s' style demangling chosen as the default.\n",
155 current_demangling_style_string);
156 }
157 }
158}
159
160/* Fake a "set demangling" command. */
161
162void
163set_demangling_style (style)
164 char *style;
165{
166 if (current_demangling_style_string != NULL)
167 {
168 free (current_demangling_style_string);
169 }
bb6247c6 170 current_demangling_style_string = savestring (style, strlen (style));
b607efe7 171 set_demangling_command ((char *) NULL, 0, (struct cmd_list_element *) NULL);
2dbde378
FF
172}
173
81afee37
FF
174/* In order to allow a single demangler executable to demangle strings
175 using various common values of CPLUS_MARKER, as well as any specific
176 one set at compile time, we maintain a string containing all the
177 commonly used ones, and check to see if the marker we are looking for
178 is in that string. CPLUS_MARKER is usually '$' on systems where the
179 assembler can deal with that. Where the assembler can't, it's usually
180 '.' (but on many systems '.' is used for other things). We put the
181 current defined CPLUS_MARKER first (which defaults to '$'), followed
182 by the next most common value, followed by an explicit '$' in case
183 the value of CPLUS_MARKER is not '$'.
184
185 We could avoid this if we could just get g++ to tell us what the actual
186 cplus marker character is as part of the debug information, perhaps by
187 ensuring that it is the character that terminates the gcc<n>_compiled
188 marker symbol (FIXME). */
189
190static char cplus_markers[] = { CPLUS_MARKER, '.', '$', '\0' };
191
192int
193is_cplus_marker (c)
194 int c;
195{
196 return c && strchr (cplus_markers, c) != NULL;
197}
198
2dbde378
FF
199void
200_initialize_demangler ()
201{
202 struct cmd_list_element *set, *show;
203
204 set = add_set_cmd ("demangle-style", class_support, var_string_noescape,
205 (char *) &current_demangling_style_string,
9aa3aa8c
JK
206 "Set the current C++ demangling style.\n\
207Use `set demangle-style' without arguments for a list of demangling styles.",
2dbde378
FF
208 &setlist);
209 show = add_show_from_set (set, &showlist);
719d9abb 210 set -> function.sfunc = set_demangling_command;
2dbde378
FF
211
212 /* Set the default demangling style chosen at compilation time. */
d23639b2 213 set_demangling_style (DEFAULT_DEMANGLING_STYLE);
e87c29c8 214 set_cplus_marker_for_demangling (CPLUS_MARKER);
2dbde378 215}
This page took 0.354556 seconds and 4 git commands to generate.