xref: /openbsd-src/gnu/usr.bin/binutils/gdb/cp-support.c (revision 11efff7f3ac2b3cfeff0c0cddc14294d9b3aca4f)
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