1b725ae77Skettenis /* Helper routines for C++ support in GDB.
2b725ae77Skettenis Copyright 2002, 2003 Free Software Foundation, Inc.
3b725ae77Skettenis
4b725ae77Skettenis Contributed by MontaVista Software.
5b725ae77Skettenis
6b725ae77Skettenis This file is part of GDB.
7b725ae77Skettenis
8b725ae77Skettenis This program is free software; you can redistribute it and/or modify
9b725ae77Skettenis it under the terms of the GNU General Public License as published by
10b725ae77Skettenis the Free Software Foundation; either version 2 of the License, or
11b725ae77Skettenis (at your option) any later version.
12b725ae77Skettenis
13b725ae77Skettenis This program is distributed in the hope that it will be useful,
14b725ae77Skettenis but WITHOUT ANY WARRANTY; without even the implied warranty of
15b725ae77Skettenis MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16b725ae77Skettenis GNU General Public License for more details.
17b725ae77Skettenis
18b725ae77Skettenis You should have received a copy of the GNU General Public License
19b725ae77Skettenis along with this program; if not, write to the Free Software
20b725ae77Skettenis Foundation, Inc., 59 Temple Place - Suite 330,
21b725ae77Skettenis Boston, MA 02111-1307, USA. */
22b725ae77Skettenis
23b725ae77Skettenis #include "defs.h"
24b725ae77Skettenis #include <ctype.h>
25b725ae77Skettenis #include "cp-support.h"
26b725ae77Skettenis #include "gdb_string.h"
27b725ae77Skettenis #include "demangle.h"
28b725ae77Skettenis #include "gdb_assert.h"
29b725ae77Skettenis #include "gdbcmd.h"
30b725ae77Skettenis #include "dictionary.h"
31b725ae77Skettenis #include "objfiles.h"
32b725ae77Skettenis #include "frame.h"
33b725ae77Skettenis #include "symtab.h"
34b725ae77Skettenis #include "block.h"
35b725ae77Skettenis #include "complaints.h"
36b725ae77Skettenis #include "gdbtypes.h"
37b725ae77Skettenis
38b725ae77Skettenis /* Functions related to demangled name parsing. */
39b725ae77Skettenis
40b725ae77Skettenis static const char *find_last_component (const char *name);
41b725ae77Skettenis
42b725ae77Skettenis static unsigned int cp_find_first_component_aux (const char *name,
43b725ae77Skettenis int permissive);
44b725ae77Skettenis
45b725ae77Skettenis static void demangled_name_complaint (const char *name);
46b725ae77Skettenis
47b725ae77Skettenis /* Functions/variables related to overload resolution. */
48b725ae77Skettenis
49b725ae77Skettenis static int sym_return_val_size;
50b725ae77Skettenis static int sym_return_val_index;
51b725ae77Skettenis static struct symbol **sym_return_val;
52b725ae77Skettenis
53b725ae77Skettenis static char *remove_params (const char *demangled_name);
54b725ae77Skettenis
55b725ae77Skettenis static void overload_list_add_symbol (struct symbol *sym,
56b725ae77Skettenis const char *oload_name);
57b725ae77Skettenis
58b725ae77Skettenis static void make_symbol_overload_list_using (const char *func_name,
59b725ae77Skettenis const char *namespace);
60b725ae77Skettenis
61b725ae77Skettenis static void make_symbol_overload_list_qualified (const char *func_name);
62b725ae77Skettenis
63b725ae77Skettenis static void read_in_psymtabs (const char *oload_name);
64b725ae77Skettenis
65b725ae77Skettenis /* The list of "maint cplus" commands. */
66b725ae77Skettenis
67b725ae77Skettenis struct cmd_list_element *maint_cplus_cmd_list = NULL;
68b725ae77Skettenis
69b725ae77Skettenis /* The actual commands. */
70b725ae77Skettenis
71b725ae77Skettenis static void maint_cplus_command (char *arg, int from_tty);
72b725ae77Skettenis static void first_component_command (char *arg, int from_tty);
73b725ae77Skettenis
74b725ae77Skettenis /* Here are some random pieces of trivia to keep in mind while trying
75b725ae77Skettenis to take apart demangled names:
76b725ae77Skettenis
77b725ae77Skettenis - Names can contain function arguments or templates, so the process
78b725ae77Skettenis has to be, to some extent recursive: maybe keep track of your
79b725ae77Skettenis depth based on encountering <> and ().
80b725ae77Skettenis
81b725ae77Skettenis - Parentheses don't just have to happen at the end of a name: they
82b725ae77Skettenis can occur even if the name in question isn't a function, because
83b725ae77Skettenis a template argument might be a type that's a function.
84b725ae77Skettenis
85b725ae77Skettenis - Conversely, even if you're trying to deal with a function, its
86b725ae77Skettenis demangled name might not end with ')': it could be a const or
87b725ae77Skettenis volatile class method, in which case it ends with "const" or
88b725ae77Skettenis "volatile".
89b725ae77Skettenis
90b725ae77Skettenis - Parentheses are also used in anonymous namespaces: a variable
91b725ae77Skettenis 'foo' in an anonymous namespace gets demangled as "(anonymous
92b725ae77Skettenis namespace)::foo".
93b725ae77Skettenis
94b725ae77Skettenis - And operator names can contain parentheses or angle brackets. */
95b725ae77Skettenis
96b725ae77Skettenis /* FIXME: carlton/2003-03-13: We have several functions here with
97b725ae77Skettenis overlapping functionality; can we combine them? Also, do they
98b725ae77Skettenis handle all the above considerations correctly? */
99b725ae77Skettenis
100b725ae77Skettenis /* Find the last component of the demangled C++ name NAME. NAME
101b725ae77Skettenis must be a method name including arguments, in order to correctly
102b725ae77Skettenis locate the last component.
103b725ae77Skettenis
104b725ae77Skettenis This function return a pointer to the first colon before the
105b725ae77Skettenis last component, or NULL if the name had only one component. */
106b725ae77Skettenis
107b725ae77Skettenis static const char *
find_last_component(const char * name)108b725ae77Skettenis find_last_component (const char *name)
109b725ae77Skettenis {
110b725ae77Skettenis const char *p;
111b725ae77Skettenis int depth;
112b725ae77Skettenis
113b725ae77Skettenis /* Functions can have local classes, so we need to find the
114b725ae77Skettenis beginning of the last argument list, not the end of the first
115b725ae77Skettenis one. */
116b725ae77Skettenis p = name + strlen (name) - 1;
117b725ae77Skettenis while (p > name && *p != ')')
118b725ae77Skettenis p--;
119b725ae77Skettenis
120b725ae77Skettenis if (p == name)
121b725ae77Skettenis return NULL;
122b725ae77Skettenis
123b725ae77Skettenis /* P now points at the `)' at the end of the argument list. Walk
124b725ae77Skettenis back to the beginning. */
125b725ae77Skettenis p--;
126b725ae77Skettenis depth = 1;
127b725ae77Skettenis while (p > name && depth > 0)
128b725ae77Skettenis {
129b725ae77Skettenis if (*p == '<' || *p == '(')
130b725ae77Skettenis depth--;
131b725ae77Skettenis else if (*p == '>' || *p == ')')
132b725ae77Skettenis depth++;
133b725ae77Skettenis p--;
134b725ae77Skettenis }
135b725ae77Skettenis
136b725ae77Skettenis if (p == name)
137b725ae77Skettenis return NULL;
138b725ae77Skettenis
139b725ae77Skettenis while (p > name && *p != ':')
140b725ae77Skettenis p--;
141b725ae77Skettenis
142b725ae77Skettenis if (p == name || p == name + 1 || p[-1] != ':')
143b725ae77Skettenis return NULL;
144b725ae77Skettenis
145b725ae77Skettenis return p - 1;
146b725ae77Skettenis }
147b725ae77Skettenis
148b725ae77Skettenis /* Return the name of the class containing method PHYSNAME. */
149b725ae77Skettenis
150b725ae77Skettenis char *
cp_class_name_from_physname(const char * physname)151*11efff7fSkettenis cp_class_name_from_physname (const char *physname)
152b725ae77Skettenis {
153b725ae77Skettenis char *ret = NULL;
154b725ae77Skettenis const char *end;
155b725ae77Skettenis int depth = 0;
156b725ae77Skettenis char *demangled_name = cplus_demangle (physname, DMGL_ANSI | DMGL_PARAMS);
157b725ae77Skettenis
158b725ae77Skettenis if (demangled_name == NULL)
159b725ae77Skettenis return NULL;
160b725ae77Skettenis
161b725ae77Skettenis end = find_last_component (demangled_name);
162b725ae77Skettenis if (end != NULL)
163b725ae77Skettenis {
164b725ae77Skettenis ret = xmalloc (end - demangled_name + 1);
165b725ae77Skettenis memcpy (ret, demangled_name, end - demangled_name);
166b725ae77Skettenis ret[end - demangled_name] = '\0';
167b725ae77Skettenis }
168b725ae77Skettenis
169b725ae77Skettenis xfree (demangled_name);
170b725ae77Skettenis return ret;
171b725ae77Skettenis }
172b725ae77Skettenis
173b725ae77Skettenis /* Return the name of the method whose linkage name is PHYSNAME. */
174b725ae77Skettenis
175b725ae77Skettenis char *
method_name_from_physname(const char * physname)176b725ae77Skettenis method_name_from_physname (const char *physname)
177b725ae77Skettenis {
178b725ae77Skettenis char *ret = NULL;
179b725ae77Skettenis const char *end;
180b725ae77Skettenis int depth = 0;
181b725ae77Skettenis char *demangled_name = cplus_demangle (physname, DMGL_ANSI | DMGL_PARAMS);
182b725ae77Skettenis
183b725ae77Skettenis if (demangled_name == NULL)
184b725ae77Skettenis return NULL;
185b725ae77Skettenis
186b725ae77Skettenis end = find_last_component (demangled_name);
187b725ae77Skettenis if (end != NULL)
188b725ae77Skettenis {
189b725ae77Skettenis char *args;
190b725ae77Skettenis int len;
191b725ae77Skettenis
192b725ae77Skettenis /* Skip "::". */
193b725ae77Skettenis end = end + 2;
194b725ae77Skettenis
195b725ae77Skettenis /* Find the argument list, if any. */
196b725ae77Skettenis args = strchr (end, '(');
197b725ae77Skettenis if (args == NULL)
198b725ae77Skettenis len = strlen (end + 2);
199b725ae77Skettenis else
200b725ae77Skettenis {
201b725ae77Skettenis args --;
202b725ae77Skettenis while (*args == ' ')
203b725ae77Skettenis args --;
204b725ae77Skettenis len = args - end + 1;
205b725ae77Skettenis }
206b725ae77Skettenis ret = xmalloc (len + 1);
207b725ae77Skettenis memcpy (ret, end, len);
208b725ae77Skettenis ret[len] = 0;
209b725ae77Skettenis }
210b725ae77Skettenis
211b725ae77Skettenis xfree (demangled_name);
212b725ae77Skettenis return ret;
213b725ae77Skettenis }
214b725ae77Skettenis
215b725ae77Skettenis /* This returns the length of first component of NAME, which should be
216b725ae77Skettenis the demangled name of a C++ variable/function/method/etc.
217b725ae77Skettenis Specifically, it returns the index of the first colon forming the
218b725ae77Skettenis boundary of the first component: so, given 'A::foo' or 'A::B::foo'
219b725ae77Skettenis it returns the 1, and given 'foo', it returns 0. */
220b725ae77Skettenis
221b725ae77Skettenis /* The character in NAME indexed by the return value is guaranteed to
222b725ae77Skettenis always be either ':' or '\0'. */
223b725ae77Skettenis
224b725ae77Skettenis /* NOTE: carlton/2003-03-13: This function is currently only intended
225b725ae77Skettenis for internal use: it's probably not entirely safe when called on
226b725ae77Skettenis user-generated input, because some of the 'index += 2' lines in
227b725ae77Skettenis cp_find_first_component_aux might go past the end of malformed
228b725ae77Skettenis input. */
229b725ae77Skettenis
230b725ae77Skettenis unsigned int
cp_find_first_component(const char * name)231b725ae77Skettenis cp_find_first_component (const char *name)
232b725ae77Skettenis {
233b725ae77Skettenis return cp_find_first_component_aux (name, 0);
234b725ae77Skettenis }
235b725ae77Skettenis
236b725ae77Skettenis /* Helper function for cp_find_first_component. Like that function,
237b725ae77Skettenis it returns the length of the first component of NAME, but to make
238b725ae77Skettenis the recursion easier, it also stops if it reaches an unexpected ')'
239b725ae77Skettenis or '>' if the value of PERMISSIVE is nonzero. */
240b725ae77Skettenis
241b725ae77Skettenis /* Let's optimize away calls to strlen("operator"). */
242b725ae77Skettenis
243b725ae77Skettenis #define LENGTH_OF_OPERATOR 8
244b725ae77Skettenis
245b725ae77Skettenis static unsigned int
cp_find_first_component_aux(const char * name,int permissive)246b725ae77Skettenis cp_find_first_component_aux (const char *name, int permissive)
247b725ae77Skettenis {
248b725ae77Skettenis unsigned int index = 0;
249b725ae77Skettenis /* Operator names can show up in unexpected places. Since these can
250b725ae77Skettenis contain parentheses or angle brackets, they can screw up the
251b725ae77Skettenis recursion. But not every string 'operator' is part of an
252b725ae77Skettenis operater name: e.g. you could have a variable 'cooperator'. So
253b725ae77Skettenis this variable tells us whether or not we should treat the string
254b725ae77Skettenis 'operator' as starting an operator. */
255b725ae77Skettenis int operator_possible = 1;
256b725ae77Skettenis
257b725ae77Skettenis for (;; ++index)
258b725ae77Skettenis {
259b725ae77Skettenis switch (name[index])
260b725ae77Skettenis {
261b725ae77Skettenis case '<':
262b725ae77Skettenis /* Template; eat it up. The calls to cp_first_component
263b725ae77Skettenis should only return (I hope!) when they reach the '>'
264b725ae77Skettenis terminating the component or a '::' between two
265b725ae77Skettenis components. (Hence the '+ 2'.) */
266b725ae77Skettenis index += 1;
267b725ae77Skettenis for (index += cp_find_first_component_aux (name + index, 1);
268b725ae77Skettenis name[index] != '>';
269b725ae77Skettenis index += cp_find_first_component_aux (name + index, 1))
270b725ae77Skettenis {
271b725ae77Skettenis if (name[index] != ':')
272b725ae77Skettenis {
273b725ae77Skettenis demangled_name_complaint (name);
274b725ae77Skettenis return strlen (name);
275b725ae77Skettenis }
276b725ae77Skettenis index += 2;
277b725ae77Skettenis }
278b725ae77Skettenis operator_possible = 1;
279b725ae77Skettenis break;
280b725ae77Skettenis case '(':
281b725ae77Skettenis /* Similar comment as to '<'. */
282b725ae77Skettenis index += 1;
283b725ae77Skettenis for (index += cp_find_first_component_aux (name + index, 1);
284b725ae77Skettenis name[index] != ')';
285b725ae77Skettenis index += cp_find_first_component_aux (name + index, 1))
286b725ae77Skettenis {
287b725ae77Skettenis if (name[index] != ':')
288b725ae77Skettenis {
289b725ae77Skettenis demangled_name_complaint (name);
290b725ae77Skettenis return strlen (name);
291b725ae77Skettenis }
292b725ae77Skettenis index += 2;
293b725ae77Skettenis }
294b725ae77Skettenis operator_possible = 1;
295b725ae77Skettenis break;
296b725ae77Skettenis case '>':
297b725ae77Skettenis case ')':
298b725ae77Skettenis if (permissive)
299b725ae77Skettenis return index;
300b725ae77Skettenis else
301b725ae77Skettenis {
302b725ae77Skettenis demangled_name_complaint (name);
303b725ae77Skettenis return strlen (name);
304b725ae77Skettenis }
305b725ae77Skettenis case '\0':
306b725ae77Skettenis case ':':
307b725ae77Skettenis return index;
308b725ae77Skettenis case 'o':
309b725ae77Skettenis /* Operator names can screw up the recursion. */
310b725ae77Skettenis if (operator_possible
311b725ae77Skettenis && strncmp (name + index, "operator", LENGTH_OF_OPERATOR) == 0)
312b725ae77Skettenis {
313b725ae77Skettenis index += LENGTH_OF_OPERATOR;
314b725ae77Skettenis while (isspace(name[index]))
315b725ae77Skettenis ++index;
316b725ae77Skettenis switch (name[index])
317b725ae77Skettenis {
318b725ae77Skettenis /* Skip over one less than the appropriate number of
319b725ae77Skettenis characters: the for loop will skip over the last
320b725ae77Skettenis one. */
321b725ae77Skettenis case '<':
322b725ae77Skettenis if (name[index + 1] == '<')
323b725ae77Skettenis index += 1;
324b725ae77Skettenis else
325b725ae77Skettenis index += 0;
326b725ae77Skettenis break;
327b725ae77Skettenis case '>':
328b725ae77Skettenis case '-':
329b725ae77Skettenis if (name[index + 1] == '>')
330b725ae77Skettenis index += 1;
331b725ae77Skettenis else
332b725ae77Skettenis index += 0;
333b725ae77Skettenis break;
334b725ae77Skettenis case '(':
335b725ae77Skettenis index += 1;
336b725ae77Skettenis break;
337b725ae77Skettenis default:
338b725ae77Skettenis index += 0;
339b725ae77Skettenis break;
340b725ae77Skettenis }
341b725ae77Skettenis }
342b725ae77Skettenis operator_possible = 0;
343b725ae77Skettenis break;
344b725ae77Skettenis case ' ':
345b725ae77Skettenis case ',':
346b725ae77Skettenis case '.':
347b725ae77Skettenis case '&':
348b725ae77Skettenis case '*':
349b725ae77Skettenis /* NOTE: carlton/2003-04-18: I'm not sure what the precise
350b725ae77Skettenis set of relevant characters are here: it's necessary to
351b725ae77Skettenis include any character that can show up before 'operator'
352b725ae77Skettenis in a demangled name, and it's safe to include any
353b725ae77Skettenis character that can't be part of an identifier's name. */
354b725ae77Skettenis operator_possible = 1;
355b725ae77Skettenis break;
356b725ae77Skettenis default:
357b725ae77Skettenis operator_possible = 0;
358b725ae77Skettenis break;
359b725ae77Skettenis }
360b725ae77Skettenis }
361b725ae77Skettenis }
362b725ae77Skettenis
363b725ae77Skettenis /* Complain about a demangled name that we don't know how to parse.
364b725ae77Skettenis NAME is the demangled name in question. */
365b725ae77Skettenis
366b725ae77Skettenis static void
demangled_name_complaint(const char * name)367b725ae77Skettenis demangled_name_complaint (const char *name)
368b725ae77Skettenis {
369b725ae77Skettenis complaint (&symfile_complaints,
370b725ae77Skettenis "unexpected demangled name '%s'", name);
371b725ae77Skettenis }
372b725ae77Skettenis
373b725ae77Skettenis /* If NAME is the fully-qualified name of a C++
374b725ae77Skettenis function/variable/method/etc., this returns the length of its
375b725ae77Skettenis entire prefix: all of the namespaces and classes that make up its
376b725ae77Skettenis name. Given 'A::foo', it returns 1, given 'A::B::foo', it returns
377b725ae77Skettenis 4, given 'foo', it returns 0. */
378b725ae77Skettenis
379b725ae77Skettenis unsigned int
cp_entire_prefix_len(const char * name)380b725ae77Skettenis cp_entire_prefix_len (const char *name)
381b725ae77Skettenis {
382b725ae77Skettenis unsigned int current_len = cp_find_first_component (name);
383b725ae77Skettenis unsigned int previous_len = 0;
384b725ae77Skettenis
385b725ae77Skettenis while (name[current_len] != '\0')
386b725ae77Skettenis {
387b725ae77Skettenis gdb_assert (name[current_len] == ':');
388b725ae77Skettenis previous_len = current_len;
389b725ae77Skettenis /* Skip the '::'. */
390b725ae77Skettenis current_len += 2;
391b725ae77Skettenis current_len += cp_find_first_component (name + current_len);
392b725ae77Skettenis }
393b725ae77Skettenis
394b725ae77Skettenis return previous_len;
395b725ae77Skettenis }
396b725ae77Skettenis
397b725ae77Skettenis /* If FULL_NAME is the demangled name of a C++ function (including an
398b725ae77Skettenis arg list, possibly including namespace/class qualifications),
399b725ae77Skettenis return a new string containing only the function name (without the
400b725ae77Skettenis arg list/class qualifications). Otherwise, return NULL. The
401b725ae77Skettenis caller is responsible for freeing the memory in question. */
402b725ae77Skettenis
403b725ae77Skettenis char *
cp_func_name(const char * full_name)404b725ae77Skettenis cp_func_name (const char *full_name)
405b725ae77Skettenis {
406b725ae77Skettenis const char *previous_component = full_name;
407b725ae77Skettenis const char *next_component;
408b725ae77Skettenis
409b725ae77Skettenis if (!full_name)
410b725ae77Skettenis return NULL;
411b725ae77Skettenis
412b725ae77Skettenis for (next_component = (previous_component
413b725ae77Skettenis + cp_find_first_component (previous_component));
414b725ae77Skettenis *next_component == ':';
415b725ae77Skettenis next_component = (previous_component
416b725ae77Skettenis + cp_find_first_component (previous_component)))
417b725ae77Skettenis {
418b725ae77Skettenis /* Skip '::'. */
419b725ae77Skettenis previous_component = next_component + 2;
420b725ae77Skettenis }
421b725ae77Skettenis
422b725ae77Skettenis return remove_params (previous_component);
423b725ae77Skettenis }
424b725ae77Skettenis
425b725ae77Skettenis /* Overload resolution functions. */
426b725ae77Skettenis
427b725ae77Skettenis static char *
remove_params(const char * demangled_name)428b725ae77Skettenis remove_params (const char *demangled_name)
429b725ae77Skettenis {
430b725ae77Skettenis const char *argp;
431b725ae77Skettenis char *new_name;
432b725ae77Skettenis int depth;
433b725ae77Skettenis
434b725ae77Skettenis if (demangled_name == NULL)
435b725ae77Skettenis return NULL;
436b725ae77Skettenis
437b725ae77Skettenis /* First find the end of the arg list. */
438b725ae77Skettenis argp = strrchr (demangled_name, ')');
439b725ae77Skettenis if (argp == NULL)
440b725ae77Skettenis return NULL;
441b725ae77Skettenis
442b725ae77Skettenis /* Back up to the beginning. */
443b725ae77Skettenis depth = 1;
444b725ae77Skettenis
445b725ae77Skettenis while (argp-- > demangled_name)
446b725ae77Skettenis {
447b725ae77Skettenis if (*argp == ')')
448b725ae77Skettenis depth ++;
449b725ae77Skettenis else if (*argp == '(')
450b725ae77Skettenis {
451b725ae77Skettenis depth --;
452b725ae77Skettenis
453b725ae77Skettenis if (depth == 0)
454b725ae77Skettenis break;
455b725ae77Skettenis }
456b725ae77Skettenis }
457b725ae77Skettenis if (depth != 0)
458b725ae77Skettenis internal_error (__FILE__, __LINE__,
459b725ae77Skettenis "bad demangled name %s\n", demangled_name);
460b725ae77Skettenis while (argp[-1] == ' ' && argp > demangled_name)
461b725ae77Skettenis argp --;
462b725ae77Skettenis
463b725ae77Skettenis new_name = xmalloc (argp - demangled_name + 1);
464b725ae77Skettenis memcpy (new_name, demangled_name, argp - demangled_name);
465b725ae77Skettenis new_name[argp - demangled_name] = '\0';
466b725ae77Skettenis return new_name;
467b725ae77Skettenis }
468b725ae77Skettenis
469b725ae77Skettenis /* Test to see if SYM is a symbol that we haven't seen corresponding
470b725ae77Skettenis to a function named OLOAD_NAME. If so, add it to the current
471b725ae77Skettenis completion list. */
472b725ae77Skettenis
473b725ae77Skettenis static void
overload_list_add_symbol(struct symbol * sym,const char * oload_name)474b725ae77Skettenis overload_list_add_symbol (struct symbol *sym, const char *oload_name)
475b725ae77Skettenis {
476b725ae77Skettenis int newsize;
477b725ae77Skettenis int i;
478b725ae77Skettenis char *sym_name;
479b725ae77Skettenis
480b725ae77Skettenis /* If there is no type information, we can't do anything, so skip */
481b725ae77Skettenis if (SYMBOL_TYPE (sym) == NULL)
482b725ae77Skettenis return;
483b725ae77Skettenis
484b725ae77Skettenis /* skip any symbols that we've already considered. */
485b725ae77Skettenis for (i = 0; i < sym_return_val_index; ++i)
486b725ae77Skettenis if (strcmp (SYMBOL_LINKAGE_NAME (sym),
487b725ae77Skettenis SYMBOL_LINKAGE_NAME (sym_return_val[i])) == 0)
488b725ae77Skettenis return;
489b725ae77Skettenis
490b725ae77Skettenis /* Get the demangled name without parameters */
491b725ae77Skettenis sym_name = remove_params (SYMBOL_NATURAL_NAME (sym));
492b725ae77Skettenis if (!sym_name)
493b725ae77Skettenis return;
494b725ae77Skettenis
495b725ae77Skettenis /* skip symbols that cannot match */
496b725ae77Skettenis if (strcmp (sym_name, oload_name) != 0)
497b725ae77Skettenis {
498b725ae77Skettenis xfree (sym_name);
499b725ae77Skettenis return;
500b725ae77Skettenis }
501b725ae77Skettenis
502b725ae77Skettenis xfree (sym_name);
503b725ae77Skettenis
504b725ae77Skettenis /* We have a match for an overload instance, so add SYM to the current list
505b725ae77Skettenis * of overload instances */
506b725ae77Skettenis if (sym_return_val_index + 3 > sym_return_val_size)
507b725ae77Skettenis {
508b725ae77Skettenis newsize = (sym_return_val_size *= 2) * sizeof (struct symbol *);
509b725ae77Skettenis sym_return_val = (struct symbol **) xrealloc ((char *) sym_return_val, newsize);
510b725ae77Skettenis }
511b725ae77Skettenis sym_return_val[sym_return_val_index++] = sym;
512b725ae77Skettenis sym_return_val[sym_return_val_index] = NULL;
513b725ae77Skettenis }
514b725ae77Skettenis
515b725ae77Skettenis /* Return a null-terminated list of pointers to function symbols that
516b725ae77Skettenis are named FUNC_NAME and are visible within NAMESPACE. */
517b725ae77Skettenis
518b725ae77Skettenis struct symbol **
make_symbol_overload_list(const char * func_name,const char * namespace)519b725ae77Skettenis make_symbol_overload_list (const char *func_name,
520b725ae77Skettenis const char *namespace)
521b725ae77Skettenis {
522b725ae77Skettenis struct cleanup *old_cleanups;
523b725ae77Skettenis
524b725ae77Skettenis sym_return_val_size = 100;
525b725ae77Skettenis sym_return_val_index = 0;
526b725ae77Skettenis sym_return_val = xmalloc ((sym_return_val_size + 1) *
527b725ae77Skettenis sizeof (struct symbol *));
528b725ae77Skettenis sym_return_val[0] = NULL;
529b725ae77Skettenis
530b725ae77Skettenis old_cleanups = make_cleanup (xfree, sym_return_val);
531b725ae77Skettenis
532b725ae77Skettenis make_symbol_overload_list_using (func_name, namespace);
533b725ae77Skettenis
534b725ae77Skettenis discard_cleanups (old_cleanups);
535b725ae77Skettenis
536b725ae77Skettenis return sym_return_val;
537b725ae77Skettenis }
538b725ae77Skettenis
539b725ae77Skettenis /* This applies the using directives to add namespaces to search in,
540b725ae77Skettenis and then searches for overloads in all of those namespaces. It
541b725ae77Skettenis adds the symbols found to sym_return_val. Arguments are as in
542b725ae77Skettenis make_symbol_overload_list. */
543b725ae77Skettenis
544b725ae77Skettenis static void
make_symbol_overload_list_using(const char * func_name,const char * namespace)545b725ae77Skettenis make_symbol_overload_list_using (const char *func_name,
546b725ae77Skettenis const char *namespace)
547b725ae77Skettenis {
548b725ae77Skettenis const struct using_direct *current;
549b725ae77Skettenis
550b725ae77Skettenis /* First, go through the using directives. If any of them apply,
551b725ae77Skettenis look in the appropriate namespaces for new functions to match
552b725ae77Skettenis on. */
553b725ae77Skettenis
554b725ae77Skettenis for (current = block_using (get_selected_block (0));
555b725ae77Skettenis current != NULL;
556b725ae77Skettenis current = current->next)
557b725ae77Skettenis {
558b725ae77Skettenis if (strcmp (namespace, current->outer) == 0)
559b725ae77Skettenis {
560b725ae77Skettenis make_symbol_overload_list_using (func_name,
561b725ae77Skettenis current->inner);
562b725ae77Skettenis }
563b725ae77Skettenis }
564b725ae77Skettenis
565b725ae77Skettenis /* Now, add names for this namespace. */
566b725ae77Skettenis
567b725ae77Skettenis if (namespace[0] == '\0')
568b725ae77Skettenis {
569b725ae77Skettenis make_symbol_overload_list_qualified (func_name);
570b725ae77Skettenis }
571b725ae77Skettenis else
572b725ae77Skettenis {
573b725ae77Skettenis char *concatenated_name
574b725ae77Skettenis = alloca (strlen (namespace) + 2 + strlen (func_name) + 1);
575b725ae77Skettenis strcpy (concatenated_name, namespace);
576b725ae77Skettenis strcat (concatenated_name, "::");
577b725ae77Skettenis strcat (concatenated_name, func_name);
578b725ae77Skettenis make_symbol_overload_list_qualified (concatenated_name);
579b725ae77Skettenis }
580b725ae77Skettenis }
581b725ae77Skettenis
582b725ae77Skettenis /* This does the bulk of the work of finding overloaded symbols.
583b725ae77Skettenis FUNC_NAME is the name of the overloaded function we're looking for
584b725ae77Skettenis (possibly including namespace info). */
585b725ae77Skettenis
586b725ae77Skettenis static void
make_symbol_overload_list_qualified(const char * func_name)587b725ae77Skettenis make_symbol_overload_list_qualified (const char *func_name)
588b725ae77Skettenis {
589b725ae77Skettenis struct symbol *sym;
590b725ae77Skettenis struct symtab *s;
591b725ae77Skettenis struct objfile *objfile;
592b725ae77Skettenis const struct block *b, *surrounding_static_block = 0;
593b725ae77Skettenis struct dict_iterator iter;
594b725ae77Skettenis const struct dictionary *dict;
595b725ae77Skettenis
596b725ae77Skettenis /* Look through the partial symtabs for all symbols which begin
597b725ae77Skettenis by matching FUNC_NAME. Make sure we read that symbol table in. */
598b725ae77Skettenis
599b725ae77Skettenis read_in_psymtabs (func_name);
600b725ae77Skettenis
601b725ae77Skettenis /* Search upwards from currently selected frame (so that we can
602b725ae77Skettenis complete on local vars. */
603b725ae77Skettenis
604b725ae77Skettenis for (b = get_selected_block (0); b != NULL; b = BLOCK_SUPERBLOCK (b))
605b725ae77Skettenis {
606b725ae77Skettenis dict = BLOCK_DICT (b);
607b725ae77Skettenis
608b725ae77Skettenis for (sym = dict_iter_name_first (dict, func_name, &iter);
609b725ae77Skettenis sym;
610b725ae77Skettenis sym = dict_iter_name_next (func_name, &iter))
611b725ae77Skettenis {
612b725ae77Skettenis overload_list_add_symbol (sym, func_name);
613b725ae77Skettenis }
614b725ae77Skettenis }
615b725ae77Skettenis
616b725ae77Skettenis surrounding_static_block = block_static_block (get_selected_block (0));
617b725ae77Skettenis
618b725ae77Skettenis /* Go through the symtabs and check the externs and statics for
619b725ae77Skettenis symbols which match. */
620b725ae77Skettenis
621b725ae77Skettenis ALL_SYMTABS (objfile, s)
622b725ae77Skettenis {
623b725ae77Skettenis QUIT;
624b725ae77Skettenis b = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), GLOBAL_BLOCK);
625b725ae77Skettenis dict = BLOCK_DICT (b);
626b725ae77Skettenis
627b725ae77Skettenis for (sym = dict_iter_name_first (dict, func_name, &iter);
628b725ae77Skettenis sym;
629b725ae77Skettenis sym = dict_iter_name_next (func_name, &iter))
630b725ae77Skettenis {
631b725ae77Skettenis overload_list_add_symbol (sym, func_name);
632b725ae77Skettenis }
633b725ae77Skettenis }
634b725ae77Skettenis
635b725ae77Skettenis ALL_SYMTABS (objfile, s)
636b725ae77Skettenis {
637b725ae77Skettenis QUIT;
638b725ae77Skettenis b = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), STATIC_BLOCK);
639b725ae77Skettenis /* Don't do this block twice. */
640b725ae77Skettenis if (b == surrounding_static_block)
641b725ae77Skettenis continue;
642b725ae77Skettenis dict = BLOCK_DICT (b);
643b725ae77Skettenis
644b725ae77Skettenis for (sym = dict_iter_name_first (dict, func_name, &iter);
645b725ae77Skettenis sym;
646b725ae77Skettenis sym = dict_iter_name_next (func_name, &iter))
647b725ae77Skettenis {
648b725ae77Skettenis overload_list_add_symbol (sym, func_name);
649b725ae77Skettenis }
650b725ae77Skettenis }
651b725ae77Skettenis }
652b725ae77Skettenis
653b725ae77Skettenis /* Look through the partial symtabs for all symbols which begin
654b725ae77Skettenis by matching FUNC_NAME. Make sure we read that symbol table in. */
655b725ae77Skettenis
656b725ae77Skettenis static void
read_in_psymtabs(const char * func_name)657b725ae77Skettenis read_in_psymtabs (const char *func_name)
658b725ae77Skettenis {
659b725ae77Skettenis struct partial_symtab *ps;
660b725ae77Skettenis struct objfile *objfile;
661b725ae77Skettenis
662b725ae77Skettenis ALL_PSYMTABS (objfile, ps)
663b725ae77Skettenis {
664b725ae77Skettenis if (ps->readin)
665b725ae77Skettenis continue;
666b725ae77Skettenis
667b725ae77Skettenis if ((lookup_partial_symbol (ps, func_name, NULL, 1, VAR_DOMAIN)
668b725ae77Skettenis != NULL)
669b725ae77Skettenis || (lookup_partial_symbol (ps, func_name, NULL, 0, VAR_DOMAIN)
670b725ae77Skettenis != NULL))
671b725ae77Skettenis psymtab_to_symtab (ps);
672b725ae77Skettenis }
673b725ae77Skettenis }
674b725ae77Skettenis
675b725ae77Skettenis /* Lookup the rtti type for a class name. */
676b725ae77Skettenis
677b725ae77Skettenis struct type *
cp_lookup_rtti_type(const char * name,struct block * block)678b725ae77Skettenis cp_lookup_rtti_type (const char *name, struct block *block)
679b725ae77Skettenis {
680b725ae77Skettenis struct symbol * rtti_sym;
681b725ae77Skettenis struct type * rtti_type;
682b725ae77Skettenis
683b725ae77Skettenis rtti_sym = lookup_symbol (name, block, STRUCT_DOMAIN, NULL, NULL);
684b725ae77Skettenis
685b725ae77Skettenis if (rtti_sym == NULL)
686b725ae77Skettenis {
687b725ae77Skettenis warning ("RTTI symbol not found for class '%s'", name);
688b725ae77Skettenis return NULL;
689b725ae77Skettenis }
690b725ae77Skettenis
691b725ae77Skettenis if (SYMBOL_CLASS (rtti_sym) != LOC_TYPEDEF)
692b725ae77Skettenis {
693b725ae77Skettenis warning ("RTTI symbol for class '%s' is not a type", name);
694b725ae77Skettenis return NULL;
695b725ae77Skettenis }
696b725ae77Skettenis
697b725ae77Skettenis rtti_type = SYMBOL_TYPE (rtti_sym);
698b725ae77Skettenis
699b725ae77Skettenis switch (TYPE_CODE (rtti_type))
700b725ae77Skettenis {
701b725ae77Skettenis case TYPE_CODE_CLASS:
702b725ae77Skettenis break;
703b725ae77Skettenis case TYPE_CODE_NAMESPACE:
704b725ae77Skettenis /* chastain/2003-11-26: the symbol tables often contain fake
705b725ae77Skettenis symbols for namespaces with the same name as the struct.
706b725ae77Skettenis This warning is an indication of a bug in the lookup order
707b725ae77Skettenis or a bug in the way that the symbol tables are populated. */
708b725ae77Skettenis warning ("RTTI symbol for class '%s' is a namespace", name);
709b725ae77Skettenis return NULL;
710b725ae77Skettenis default:
711b725ae77Skettenis warning ("RTTI symbol for class '%s' has bad type", name);
712b725ae77Skettenis return NULL;
713b725ae77Skettenis }
714b725ae77Skettenis
715b725ae77Skettenis return rtti_type;
716b725ae77Skettenis }
717b725ae77Skettenis
718b725ae77Skettenis /* Don't allow just "maintenance cplus". */
719b725ae77Skettenis
720b725ae77Skettenis static void
maint_cplus_command(char * arg,int from_tty)721b725ae77Skettenis maint_cplus_command (char *arg, int from_tty)
722b725ae77Skettenis {
723b725ae77Skettenis printf_unfiltered ("\"maintenance cplus\" must be followed by the name of a command.\n");
724b725ae77Skettenis help_list (maint_cplus_cmd_list, "maintenance cplus ", -1, gdb_stdout);
725b725ae77Skettenis }
726b725ae77Skettenis
727b725ae77Skettenis /* This is a front end for cp_find_first_component, for unit testing.
728b725ae77Skettenis Be careful when using it: see the NOTE above
729b725ae77Skettenis cp_find_first_component. */
730b725ae77Skettenis
731b725ae77Skettenis static void
first_component_command(char * arg,int from_tty)732b725ae77Skettenis first_component_command (char *arg, int from_tty)
733b725ae77Skettenis {
734b725ae77Skettenis int len = cp_find_first_component (arg);
735b725ae77Skettenis char *prefix = alloca (len + 1);
736b725ae77Skettenis
737b725ae77Skettenis memcpy (prefix, arg, len);
738b725ae77Skettenis prefix[len] = '\0';
739b725ae77Skettenis
740b725ae77Skettenis printf_unfiltered ("%s\n", prefix);
741b725ae77Skettenis }
742b725ae77Skettenis
743b725ae77Skettenis extern initialize_file_ftype _initialize_cp_support; /* -Wmissing-prototypes */
744b725ae77Skettenis
745b725ae77Skettenis void
_initialize_cp_support(void)746b725ae77Skettenis _initialize_cp_support (void)
747b725ae77Skettenis {
748b725ae77Skettenis add_prefix_cmd ("cplus", class_maintenance, maint_cplus_command,
749b725ae77Skettenis "C++ maintenance commands.", &maint_cplus_cmd_list,
750b725ae77Skettenis "maintenance cplus ", 0, &maintenancelist);
751b725ae77Skettenis add_alias_cmd ("cp", "cplus", class_maintenance, 1, &maintenancelist);
752b725ae77Skettenis
753b725ae77Skettenis add_cmd ("first_component", class_maintenance, first_component_command,
754b725ae77Skettenis "Print the first class/namespace component of NAME.",
755b725ae77Skettenis &maint_cplus_cmd_list);
756b725ae77Skettenis
757b725ae77Skettenis }
758