1/* wrstabs.c -- Output stabs debugging information
2   Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2006, 2007
3   Free Software Foundation, Inc.
4   Written by Ian Lance Taylor <ian@cygnus.com>.
5
6   This file is part of GNU Binutils.
7
8   This program is free software; you can redistribute it and/or modify
9   it under the terms of the GNU General Public License as published by
10   the Free Software Foundation; either version 2 of the License, or
11   (at your option) any later version.
12
13   This program is distributed in the hope that it will be useful,
14   but WITHOUT ANY WARRANTY; without even the implied warranty of
15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16   GNU General Public License for more details.
17
18   You should have received a copy of the GNU General Public License
19   along with this program; if not, write to the Free Software
20   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
21   02110-1301, USA.  */
22
23/* This file contains code which writes out stabs debugging
24   information.  */
25
26#include "sysdep.h"
27#include <assert.h>
28#include "bfd.h"
29#include "libiberty.h"
30#include "safe-ctype.h"
31#include "bucomm.h"
32#include "debug.h"
33#include "budbg.h"
34#include "aout/aout64.h"
35#include "aout/stab_gnu.h"
36
37/* The size of a stabs symbol.  This presumes 32 bit values.  */
38
39#define STAB_SYMBOL_SIZE (12)
40
41/* An entry in a string hash table.  */
42
43struct string_hash_entry
44{
45  struct bfd_hash_entry root;
46  /* Next string in this table.  */
47  struct string_hash_entry *next;
48  /* Index in string table.  */
49  long index;
50  /* Size of type if this is a typedef.  */
51  unsigned int size;
52};
53
54/* A string hash table.  */
55
56struct string_hash_table
57{
58  struct bfd_hash_table table;
59};
60
61/* The type stack.  Each element on the stack is a string.  */
62
63struct stab_type_stack
64{
65  /* The next element on the stack.  */
66  struct stab_type_stack *next;
67  /* This element as a string.  */
68  char *string;
69  /* The type index of this element.  */
70  long index;
71  /* The size of the type.  */
72  unsigned int size;
73  /* Whether type string defines a new type.  */
74  bfd_boolean definition;
75  /* String defining struct fields.  */
76  char *fields;
77  /* NULL terminated array of strings defining base classes for a
78     class.  */
79  char **baseclasses;
80  /* String defining class methods.  */
81  char *methods;
82  /* String defining vtable pointer for a class.  */
83  char *vtable;
84};
85
86/* This structure is used to keep track of type indices for tagged
87   types.  */
88
89struct stab_tag
90{
91  /* The type index.  */
92  long index;
93  /* The tag name.  */
94  const char *tag;
95  /* The kind of type.  This is set to DEBUG_KIND_ILLEGAL when the
96     type is defined.  */
97  enum debug_type_kind kind;
98  /* The size of the struct.  */
99  unsigned int size;
100};
101
102/* We remember various sorts of type indices.  They are not related,
103   but, for convenience, we keep all the information in this
104   structure.  */
105
106struct stab_type_cache
107{
108  /* The void type index.  */
109  long void_type;
110  /* Signed integer type indices, indexed by size - 1.  */
111  long signed_integer_types[8];
112  /* Unsigned integer type indices, indexed by size - 1.  */
113  long unsigned_integer_types[8];
114  /* Floating point types, indexed by size - 1.  */
115  long float_types[16];
116  /* Pointers to types, indexed by the type index.  */
117  long *pointer_types;
118  size_t pointer_types_alloc;
119  /* Functions returning types, indexed by the type index.  */
120  long *function_types;
121  size_t function_types_alloc;
122  /* References to types, indexed by the type index.  */
123  long *reference_types;
124  size_t reference_types_alloc;
125  /* Struct/union/class type indices, indexed by the struct id.  */
126  struct stab_tag *struct_types;
127  size_t struct_types_alloc;
128};
129
130/* This is the handle passed through debug_write.  */
131
132struct stab_write_handle
133{
134  /* The BFD.  */
135  bfd *abfd;
136  /* This buffer holds the symbols.  */
137  bfd_byte *symbols;
138  size_t symbols_size;
139  size_t symbols_alloc;
140  /* This is a list of hash table entries for the strings.  */
141  struct string_hash_entry *strings;
142  /* The last string hash table entry.  */
143  struct string_hash_entry *last_string;
144  /* The size of the strings.  */
145  size_t strings_size;
146  /* This hash table eliminates duplicate strings.  */
147  struct string_hash_table strhash;
148  /* The type stack.  */
149  struct stab_type_stack *type_stack;
150  /* The next type index.  */
151  long type_index;
152  /* The type cache.  */
153  struct stab_type_cache type_cache;
154  /* A mapping from typedef names to type indices.  */
155  struct string_hash_table typedef_hash;
156  /* If this is not -1, it is the offset to the most recent N_SO
157     symbol, and the value of that symbol needs to be set.  */
158  long so_offset;
159  /* If this is not -1, it is the offset to the most recent N_FUN
160     symbol, and the value of that symbol needs to be set.  */
161  long fun_offset;
162  /* The last text section address seen.  */
163  bfd_vma last_text_address;
164  /* The block nesting depth.  */
165  unsigned int nesting;
166  /* The function address.  */
167  bfd_vma fnaddr;
168  /* A pending LBRAC symbol.  */
169  bfd_vma pending_lbrac;
170  /* The current line number file name.  */
171  const char *lineno_filename;
172};
173
174static struct bfd_hash_entry *string_hash_newfunc
175  (struct bfd_hash_entry *, struct bfd_hash_table *, const char *);
176static bfd_boolean stab_write_symbol
177  (struct stab_write_handle *, int, int, bfd_vma, const char *);
178static bfd_boolean stab_push_string
179  (struct stab_write_handle *, const char *, long, bfd_boolean, unsigned int);
180static bfd_boolean stab_push_defined_type
181  (struct stab_write_handle *, long, unsigned int);
182static char *stab_pop_type (struct stab_write_handle *);
183static bfd_boolean stab_modify_type
184  (struct stab_write_handle *, int, unsigned int, long **, size_t *);
185static long stab_get_struct_index
186  (struct stab_write_handle *, const char *, unsigned int,
187   enum debug_type_kind, unsigned int *);
188static bfd_boolean stab_class_method_var
189  (struct stab_write_handle *, const char *, enum debug_visibility,
190   bfd_boolean, bfd_boolean, bfd_boolean, bfd_vma, bfd_boolean);
191static bfd_boolean stab_start_compilation_unit (void *, const char *);
192static bfd_boolean stab_start_source (void *, const char *);
193static bfd_boolean stab_empty_type (void *);
194static bfd_boolean stab_void_type (void *);
195static bfd_boolean stab_int_type (void *, unsigned int, bfd_boolean);
196static bfd_boolean stab_float_type (void *, unsigned int);
197static bfd_boolean stab_complex_type (void *, unsigned int);
198static bfd_boolean stab_bool_type (void *, unsigned int);
199static bfd_boolean stab_enum_type
200  (void *, const char *, const char **, bfd_signed_vma *);
201static bfd_boolean stab_pointer_type (void *);
202static bfd_boolean stab_function_type (void *, int, bfd_boolean);
203static bfd_boolean stab_reference_type (void *);
204static bfd_boolean stab_range_type (void *, bfd_signed_vma, bfd_signed_vma);
205static bfd_boolean stab_array_type
206  (void *, bfd_signed_vma, bfd_signed_vma, bfd_boolean);
207static bfd_boolean stab_set_type (void *, bfd_boolean);
208static bfd_boolean stab_offset_type (void *);
209static bfd_boolean stab_method_type (void *, bfd_boolean, int, bfd_boolean);
210static bfd_boolean stab_const_type (void *);
211static bfd_boolean stab_volatile_type (void *);
212static bfd_boolean stab_start_struct_type
213  (void *, const char *, unsigned int, bfd_boolean, unsigned int);
214static bfd_boolean stab_struct_field
215  (void *, const char *, bfd_vma, bfd_vma, enum debug_visibility);
216static bfd_boolean stab_end_struct_type (void *);
217static bfd_boolean stab_start_class_type
218  (void *, const char *, unsigned int, bfd_boolean, unsigned int,
219   bfd_boolean, bfd_boolean);
220static bfd_boolean stab_class_static_member
221  (void *, const char *, const char *, enum debug_visibility);
222static bfd_boolean stab_class_baseclass
223  (void *, bfd_vma, bfd_boolean, enum debug_visibility);
224static bfd_boolean stab_class_start_method (void *, const char *);
225static bfd_boolean stab_class_method_variant
226  (void *, const char *, enum debug_visibility, bfd_boolean, bfd_boolean,
227   bfd_vma, bfd_boolean);
228static bfd_boolean stab_class_static_method_variant
229  (void *, const char *, enum debug_visibility, bfd_boolean, bfd_boolean);
230static bfd_boolean stab_class_end_method (void *);
231static bfd_boolean stab_end_class_type (void *);
232static bfd_boolean stab_typedef_type (void *, const char *);
233static bfd_boolean stab_tag_type
234  (void *, const char *, unsigned int, enum debug_type_kind);
235static bfd_boolean stab_typdef (void *, const char *);
236static bfd_boolean stab_tag (void *, const char *);
237static bfd_boolean stab_int_constant (void *, const char *, bfd_vma);
238static bfd_boolean stab_float_constant (void *, const char *, double);
239static bfd_boolean stab_typed_constant (void *, const char *, bfd_vma);
240static bfd_boolean stab_variable
241  (void *, const char *, enum debug_var_kind, bfd_vma);
242static bfd_boolean stab_start_function (void *, const char *, bfd_boolean);
243static bfd_boolean stab_function_parameter
244  (void *, const char *, enum debug_parm_kind, bfd_vma);
245static bfd_boolean stab_start_block (void *, bfd_vma);
246static bfd_boolean stab_end_block (void *, bfd_vma);
247static bfd_boolean stab_end_function (void *);
248static bfd_boolean stab_lineno (void *, const char *, unsigned long, bfd_vma);
249
250static const struct debug_write_fns stab_fns =
251{
252  stab_start_compilation_unit,
253  stab_start_source,
254  stab_empty_type,
255  stab_void_type,
256  stab_int_type,
257  stab_float_type,
258  stab_complex_type,
259  stab_bool_type,
260  stab_enum_type,
261  stab_pointer_type,
262  stab_function_type,
263  stab_reference_type,
264  stab_range_type,
265  stab_array_type,
266  stab_set_type,
267  stab_offset_type,
268  stab_method_type,
269  stab_const_type,
270  stab_volatile_type,
271  stab_start_struct_type,
272  stab_struct_field,
273  stab_end_struct_type,
274  stab_start_class_type,
275  stab_class_static_member,
276  stab_class_baseclass,
277  stab_class_start_method,
278  stab_class_method_variant,
279  stab_class_static_method_variant,
280  stab_class_end_method,
281  stab_end_class_type,
282  stab_typedef_type,
283  stab_tag_type,
284  stab_typdef,
285  stab_tag,
286  stab_int_constant,
287  stab_float_constant,
288  stab_typed_constant,
289  stab_variable,
290  stab_start_function,
291  stab_function_parameter,
292  stab_start_block,
293  stab_end_block,
294  stab_end_function,
295  stab_lineno
296};
297
298/* Routine to create an entry in a string hash table.  */
299
300static struct bfd_hash_entry *
301string_hash_newfunc (struct bfd_hash_entry *entry,
302		     struct bfd_hash_table *table, const char *string)
303{
304  struct string_hash_entry *ret = (struct string_hash_entry *) entry;
305
306  /* Allocate the structure if it has not already been allocated by a
307     subclass.  */
308  if (ret == (struct string_hash_entry *) NULL)
309    ret = ((struct string_hash_entry *)
310	   bfd_hash_allocate (table, sizeof (struct string_hash_entry)));
311  if (ret == (struct string_hash_entry *) NULL)
312    return NULL;
313
314  /* Call the allocation method of the superclass.  */
315  ret = ((struct string_hash_entry *)
316	 bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string));
317
318  if (ret)
319    {
320      /* Initialize the local fields.  */
321      ret->next = NULL;
322      ret->index = -1;
323      ret->size = 0;
324    }
325
326  return (struct bfd_hash_entry *) ret;
327}
328
329/* Look up an entry in a string hash table.  */
330
331#define string_hash_lookup(t, string, create, copy) \
332  ((struct string_hash_entry *) \
333   bfd_hash_lookup (&(t)->table, (string), (create), (copy)))
334
335/* Add a symbol to the stabs debugging information we are building.  */
336
337static bfd_boolean
338stab_write_symbol (struct stab_write_handle *info, int type, int desc,
339		   bfd_vma value, const char *string)
340{
341  bfd_size_type strx;
342  bfd_byte sym[STAB_SYMBOL_SIZE];
343
344  if (string == NULL)
345    strx = 0;
346  else
347    {
348      struct string_hash_entry *h;
349
350      h = string_hash_lookup (&info->strhash, string, TRUE, TRUE);
351      if (h == NULL)
352	{
353	  non_fatal (_("string_hash_lookup failed: %s"),
354		     bfd_errmsg (bfd_get_error ()));
355	  return FALSE;
356	}
357      if (h->index != -1)
358	strx = h->index;
359      else
360	{
361	  strx = info->strings_size;
362	  h->index = strx;
363	  if (info->last_string == NULL)
364	    info->strings = h;
365	  else
366	    info->last_string->next = h;
367	  info->last_string = h;
368	  info->strings_size += strlen (string) + 1;
369	}
370    }
371
372  /* This presumes 32 bit values.  */
373  bfd_put_32 (info->abfd, strx, sym);
374  bfd_put_8 (info->abfd, type, sym + 4);
375  bfd_put_8 (info->abfd, 0, sym + 5);
376  bfd_put_16 (info->abfd, desc, sym + 6);
377  bfd_put_32 (info->abfd, value, sym + 8);
378
379  if (info->symbols_size + STAB_SYMBOL_SIZE > info->symbols_alloc)
380    {
381      info->symbols_alloc *= 2;
382      info->symbols = (bfd_byte *) xrealloc (info->symbols,
383					     info->symbols_alloc);
384    }
385
386  memcpy (info->symbols + info->symbols_size, sym, STAB_SYMBOL_SIZE);
387
388  info->symbols_size += STAB_SYMBOL_SIZE;
389
390  return TRUE;
391}
392
393/* Push a string on to the type stack.  */
394
395static bfd_boolean
396stab_push_string (struct stab_write_handle *info, const char *string,
397		  long index, bfd_boolean definition, unsigned int size)
398{
399  struct stab_type_stack *s;
400
401  s = (struct stab_type_stack *) xmalloc (sizeof *s);
402  s->string = xstrdup (string);
403  s->index = index;
404  s->definition = definition;
405  s->size = size;
406
407  s->fields = NULL;
408  s->baseclasses = NULL;
409  s->methods = NULL;
410  s->vtable = NULL;
411
412  s->next = info->type_stack;
413  info->type_stack = s;
414
415  return TRUE;
416}
417
418/* Push a type index which has already been defined.  */
419
420static bfd_boolean
421stab_push_defined_type (struct stab_write_handle *info, long index,
422			unsigned int size)
423{
424  char buf[20];
425
426  sprintf (buf, "%ld", index);
427  return stab_push_string (info, buf, index, FALSE, size);
428}
429
430/* Pop a type off the type stack.  The caller is responsible for
431   freeing the string.  */
432
433static char *
434stab_pop_type (struct stab_write_handle *info)
435{
436  struct stab_type_stack *s;
437  char *ret;
438
439  s = info->type_stack;
440  assert (s != NULL);
441
442  info->type_stack = s->next;
443
444  ret = s->string;
445
446  free (s);
447
448  return ret;
449}
450
451/* The general routine to write out stabs in sections debugging
452   information.  This accumulates the stabs symbols and the strings in
453   two obstacks.  We can't easily write out the information as we go
454   along, because we need to know the section sizes before we can
455   write out the section contents.  ABFD is the BFD and DHANDLE is the
456   handle for the debugging information.  This sets *PSYMS to point to
457   the symbols, *PSYMSIZE the size of the symbols, *PSTRINGS to the
458   strings, and *PSTRINGSIZE to the size of the strings.  */
459
460bfd_boolean
461write_stabs_in_sections_debugging_info (bfd *abfd, void *dhandle,
462					bfd_byte **psyms,
463					bfd_size_type *psymsize,
464					bfd_byte **pstrings,
465					bfd_size_type *pstringsize)
466{
467  struct stab_write_handle info;
468  struct string_hash_entry *h;
469  bfd_byte *p;
470
471  info.abfd = abfd;
472
473  info.symbols_size = 0;
474  info.symbols_alloc = 500;
475  info.symbols = (bfd_byte *) xmalloc (info.symbols_alloc);
476
477  info.strings = NULL;
478  info.last_string = NULL;
479  /* Reserve 1 byte for a null byte.  */
480  info.strings_size = 1;
481
482  if (!bfd_hash_table_init (&info.strhash.table, string_hash_newfunc,
483			    sizeof (struct string_hash_entry))
484      || !bfd_hash_table_init (&info.typedef_hash.table, string_hash_newfunc,
485			       sizeof (struct string_hash_entry)))
486    {
487      non_fatal ("bfd_hash_table_init_failed: %s",
488		 bfd_errmsg (bfd_get_error ()));
489      return FALSE;
490    }
491
492  info.type_stack = NULL;
493  info.type_index = 1;
494  memset (&info.type_cache, 0, sizeof info.type_cache);
495  info.so_offset = -1;
496  info.fun_offset = -1;
497  info.last_text_address = 0;
498  info.nesting = 0;
499  info.fnaddr = 0;
500  info.pending_lbrac = (bfd_vma) -1;
501
502  /* The initial symbol holds the string size.  */
503  if (! stab_write_symbol (&info, 0, 0, 0, (const char *) NULL))
504    return FALSE;
505
506  /* Output an initial N_SO symbol.  */
507  info.so_offset = info.symbols_size;
508  if (! stab_write_symbol (&info, N_SO, 0, 0, bfd_get_filename (abfd)))
509    return FALSE;
510
511  if (! debug_write (dhandle, &stab_fns, (void *) &info))
512    return FALSE;
513
514  assert (info.pending_lbrac == (bfd_vma) -1);
515
516  /* Output a trailing N_SO.  */
517  if (! stab_write_symbol (&info, N_SO, 0, info.last_text_address,
518			   (const char *) NULL))
519    return FALSE;
520
521  /* Put the string size in the initial symbol.  */
522  bfd_put_32 (abfd, info.strings_size, info.symbols + 8);
523
524  *psyms = info.symbols;
525  *psymsize = info.symbols_size;
526
527  *pstringsize = info.strings_size;
528  *pstrings = (bfd_byte *) xmalloc (info.strings_size);
529
530  p = *pstrings;
531  *p++ = '\0';
532  for (h = info.strings; h != NULL; h = h->next)
533    {
534      strcpy ((char *) p, h->root.string);
535      p += strlen ((char *) p) + 1;
536    }
537
538  return TRUE;
539}
540
541/* Start writing out information for a compilation unit.  */
542
543static bfd_boolean
544stab_start_compilation_unit (void *p, const char *filename)
545{
546  struct stab_write_handle *info = (struct stab_write_handle *) p;
547
548  /* We would normally output an N_SO symbol here.  However, that
549     would force us to reset all of our type information.  I think we
550     will be better off just outputting an N_SOL symbol, and not
551     worrying about splitting information between files.  */
552
553  info->lineno_filename = filename;
554
555  return stab_write_symbol (info, N_SOL, 0, 0, filename);
556}
557
558/* Start writing out information for a particular source file.  */
559
560static bfd_boolean
561stab_start_source (void *p, const char *filename)
562{
563  struct stab_write_handle *info = (struct stab_write_handle *) p;
564
565  /* FIXME: The symbol's value is supposed to be the text section
566     address.  However, we would have to fill it in later, and gdb
567     doesn't care, so we don't bother with it.  */
568
569  info->lineno_filename = filename;
570
571  return stab_write_symbol (info, N_SOL, 0, 0, filename);
572}
573
574/* Push an empty type.  This shouldn't normally happen.  We just use a
575   void type.  */
576
577static bfd_boolean
578stab_empty_type (void *p)
579{
580  struct stab_write_handle *info = (struct stab_write_handle *) p;
581
582  /* We don't call stab_void_type if the type is not yet defined,
583     because that might screw up the typedef.  */
584
585  if (info->type_cache.void_type != 0)
586    return stab_push_defined_type (info, info->type_cache.void_type, 0);
587  else
588    {
589      long index;
590      char buf[40];
591
592      index = info->type_index;
593      ++info->type_index;
594
595      sprintf (buf, "%ld=%ld", index, index);
596
597      return stab_push_string (info, buf, index, FALSE, 0);
598    }
599}
600
601/* Push a void type.  */
602
603static bfd_boolean
604stab_void_type (void *p)
605{
606  struct stab_write_handle *info = (struct stab_write_handle *) p;
607
608  if (info->type_cache.void_type != 0)
609    return stab_push_defined_type (info, info->type_cache.void_type, 0);
610  else
611    {
612      long index;
613      char buf[40];
614
615      index = info->type_index;
616      ++info->type_index;
617
618      info->type_cache.void_type = index;
619
620      sprintf (buf, "%ld=%ld", index, index);
621
622      return stab_push_string (info, buf, index, TRUE, 0);
623    }
624}
625
626/* Push an integer type.  */
627
628static bfd_boolean
629stab_int_type (void *p, unsigned int size, bfd_boolean unsignedp)
630{
631  struct stab_write_handle *info = (struct stab_write_handle *) p;
632  long *cache;
633
634  if (size <= 0 || (size > sizeof (long) && size != 8))
635    {
636      non_fatal (_("stab_int_type: bad size %u"), size);
637      return FALSE;
638    }
639
640  if (unsignedp)
641    cache = info->type_cache.signed_integer_types;
642  else
643    cache = info->type_cache.unsigned_integer_types;
644
645  if (cache[size - 1] != 0)
646    return stab_push_defined_type (info, cache[size - 1], size);
647  else
648    {
649      long index;
650      char buf[100];
651
652      index = info->type_index;
653      ++info->type_index;
654
655      cache[size - 1] = index;
656
657      sprintf (buf, "%ld=r%ld;", index, index);
658      if (unsignedp)
659	{
660	  strcat (buf, "0;");
661	  if (size < sizeof (long))
662	    sprintf (buf + strlen (buf), "%ld;", ((long) 1 << (size * 8)) - 1);
663	  else if (size == sizeof (long))
664	    strcat (buf, "-1;");
665	  else if (size == 8)
666	    strcat (buf, "01777777777777777777777;");
667	  else
668	    abort ();
669	}
670      else
671	{
672	  if (size <= sizeof (long))
673	    sprintf (buf + strlen (buf), "%ld;%ld;",
674		     (long) - ((unsigned long) 1 << (size * 8 - 1)),
675		     (long) (((unsigned long) 1 << (size * 8 - 1)) - 1));
676	  else if (size == 8)
677	    strcat (buf, "01000000000000000000000;0777777777777777777777;");
678	  else
679	    abort ();
680	}
681
682      return stab_push_string (info, buf, index, TRUE, size);
683    }
684}
685
686/* Push a floating point type.  */
687
688static bfd_boolean
689stab_float_type (void *p, unsigned int size)
690{
691  struct stab_write_handle *info = (struct stab_write_handle *) p;
692
693  if (size > 0
694      && size - 1 < (sizeof info->type_cache.float_types
695		     / sizeof info->type_cache.float_types[0])
696      && info->type_cache.float_types[size - 1] != 0)
697    return stab_push_defined_type (info,
698				   info->type_cache.float_types[size - 1],
699				   size);
700  else
701    {
702      long index;
703      char *int_type;
704      char buf[50];
705
706      /* Floats are defined as a subrange of int.  */
707      if (! stab_int_type (info, 4, FALSE))
708	return FALSE;
709      int_type = stab_pop_type (info);
710
711      index = info->type_index;
712      ++info->type_index;
713
714      if (size > 0
715	  && size - 1 < (sizeof info->type_cache.float_types
716			 / sizeof info->type_cache.float_types[0]))
717	info->type_cache.float_types[size - 1] = index;
718
719      sprintf (buf, "%ld=r%s;%u;0;", index, int_type, size);
720
721      free (int_type);
722
723      return stab_push_string (info, buf, index, TRUE, size);
724    }
725}
726
727/* Push a complex type.  */
728
729static bfd_boolean
730stab_complex_type (void *p, unsigned int size)
731{
732  struct stab_write_handle *info = (struct stab_write_handle *) p;
733  char buf[50];
734  long index;
735
736  index = info->type_index;
737  ++info->type_index;
738
739  sprintf (buf, "%ld=r%ld;%u;0;", index, index, size);
740
741  return stab_push_string (info, buf, index, TRUE, size * 2);
742}
743
744/* Push a bfd_boolean type.  We use an XCOFF predefined type, since gdb
745   always recognizes them.  */
746
747static bfd_boolean
748stab_bool_type (void *p, unsigned int size)
749{
750  struct stab_write_handle *info = (struct stab_write_handle *) p;
751  long index;
752
753  switch (size)
754    {
755    case 1:
756      index = -21;
757      break;
758
759    case 2:
760      index = -22;
761      break;
762
763    default:
764    case 4:
765      index = -16;
766      break;
767
768    case 8:
769      index = -33;
770      break;
771    }
772
773  return stab_push_defined_type (info, index, size);
774}
775
776/* Push an enum type.  */
777
778static bfd_boolean
779stab_enum_type (void *p, const char *tag, const char **names,
780		bfd_signed_vma *vals)
781{
782  struct stab_write_handle *info = (struct stab_write_handle *) p;
783  size_t len;
784  const char **pn;
785  char *buf;
786  long index = 0;
787  bfd_signed_vma *pv;
788
789  if (names == NULL)
790    {
791      assert (tag != NULL);
792
793      buf = (char *) xmalloc (10 + strlen (tag));
794      sprintf (buf, "xe%s:", tag);
795      /* FIXME: The size is just a guess.  */
796      if (! stab_push_string (info, buf, 0, FALSE, 4))
797	return FALSE;
798      free (buf);
799      return TRUE;
800    }
801
802  len = 10;
803  if (tag != NULL)
804    len += strlen (tag);
805  for (pn = names; *pn != NULL; pn++)
806    len += strlen (*pn) + 20;
807
808  buf = (char *) xmalloc (len);
809
810  if (tag == NULL)
811    strcpy (buf, "e");
812  else
813    {
814      index = info->type_index;
815      ++info->type_index;
816      sprintf (buf, "%s:T%ld=e", tag, index);
817    }
818
819  for (pn = names, pv = vals; *pn != NULL; pn++, pv++)
820    sprintf (buf + strlen (buf), "%s:%ld,", *pn, (long) *pv);
821  strcat (buf, ";");
822
823  if (tag == NULL)
824    {
825      /* FIXME: The size is just a guess.  */
826      if (! stab_push_string (info, buf, 0, FALSE, 4))
827	return FALSE;
828    }
829  else
830    {
831      /* FIXME: The size is just a guess.  */
832      if (! stab_write_symbol (info, N_LSYM, 0, 0, buf)
833	  || ! stab_push_defined_type (info, index, 4))
834	return FALSE;
835    }
836
837  free (buf);
838
839  return TRUE;
840}
841
842/* Push a modification of the top type on the stack.  Cache the
843   results in CACHE and CACHE_ALLOC.  */
844
845static bfd_boolean
846stab_modify_type (struct stab_write_handle *info, int mod,
847		  unsigned int size, long **cache, size_t *cache_alloc)
848{
849  long targindex;
850  long index;
851  char *s, *buf;
852
853  assert (info->type_stack != NULL);
854  targindex = info->type_stack->index;
855
856  if (targindex <= 0
857      || cache == NULL)
858    {
859      bfd_boolean definition;
860
861      /* Either the target type has no index, or we aren't caching
862         this modifier.  Either way we have no way of recording the
863         new type, so we don't bother to define one.  */
864      definition = info->type_stack->definition;
865      s = stab_pop_type (info);
866      buf = (char *) xmalloc (strlen (s) + 2);
867      sprintf (buf, "%c%s", mod, s);
868      free (s);
869      if (! stab_push_string (info, buf, 0, definition, size))
870	return FALSE;
871      free (buf);
872    }
873  else
874    {
875      if ((size_t) targindex >= *cache_alloc)
876	{
877	  size_t alloc;
878
879	  alloc = *cache_alloc;
880	  if (alloc == 0)
881	    alloc = 10;
882	  while ((size_t) targindex >= alloc)
883	    alloc *= 2;
884	  *cache = (long *) xrealloc (*cache, alloc * sizeof (long));
885	  memset (*cache + *cache_alloc, 0,
886		  (alloc - *cache_alloc) * sizeof (long));
887	  *cache_alloc = alloc;
888	}
889
890      index = (*cache)[targindex];
891      if (index != 0 && ! info->type_stack->definition)
892	{
893	  /* We have already defined a modification of this type, and
894             the entry on the type stack is not a definition, so we
895             can safely discard it (we may have a definition on the
896             stack, even if we already defined a modification, if it
897             is a struct which we did not define at the time it was
898             referenced).  */
899	  free (stab_pop_type (info));
900	  if (! stab_push_defined_type (info, index, size))
901	    return FALSE;
902	}
903      else
904	{
905	  index = info->type_index;
906	  ++info->type_index;
907
908	  s = stab_pop_type (info);
909	  buf = (char *) xmalloc (strlen (s) + 20);
910	  sprintf (buf, "%ld=%c%s", index, mod, s);
911	  free (s);
912
913	  (*cache)[targindex] = index;
914
915	  if (! stab_push_string (info, buf, index, TRUE, size))
916	    return FALSE;
917
918	  free (buf);
919	}
920    }
921
922  return TRUE;
923}
924
925/* Push a pointer type.  */
926
927static bfd_boolean
928stab_pointer_type (void *p)
929{
930  struct stab_write_handle *info = (struct stab_write_handle *) p;
931
932  /* FIXME: The size should depend upon the architecture.  */
933  return stab_modify_type (info, '*', 4, &info->type_cache.pointer_types,
934			   &info->type_cache.pointer_types_alloc);
935}
936
937/* Push a function type.  */
938
939static bfd_boolean
940stab_function_type (void *p, int argcount,
941		    bfd_boolean varargs ATTRIBUTE_UNUSED)
942{
943  struct stab_write_handle *info = (struct stab_write_handle *) p;
944  int i;
945
946  /* We have no way to represent the argument types, so we just
947     discard them.  However, if they define new types, we must output
948     them.  We do this by producing empty typedefs.  */
949  for (i = 0; i < argcount; i++)
950    {
951      if (! info->type_stack->definition)
952	free (stab_pop_type (info));
953      else
954	{
955	  char *s, *buf;
956
957	  s = stab_pop_type (info);
958
959	  buf = (char *) xmalloc (strlen (s) + 3);
960	  sprintf (buf, ":t%s", s);
961	  free (s);
962
963	  if (! stab_write_symbol (info, N_LSYM, 0, 0, buf))
964	    return FALSE;
965
966	  free (buf);
967	}
968    }
969
970  return stab_modify_type (info, 'f', 0, &info->type_cache.function_types,
971			   &info->type_cache.function_types_alloc);
972}
973
974/* Push a reference type.  */
975
976static bfd_boolean
977stab_reference_type (void *p)
978{
979  struct stab_write_handle *info = (struct stab_write_handle *) p;
980
981  /* FIXME: The size should depend upon the architecture.  */
982  return stab_modify_type (info, '&', 4, &info->type_cache.reference_types,
983			   &info->type_cache.reference_types_alloc);
984}
985
986/* Push a range type.  */
987
988static bfd_boolean
989stab_range_type (void *p, bfd_signed_vma low, bfd_signed_vma high)
990{
991  struct stab_write_handle *info = (struct stab_write_handle *) p;
992  bfd_boolean definition;
993  unsigned int size;
994  char *s, *buf;
995
996  definition = info->type_stack->definition;
997  size = info->type_stack->size;
998
999  s = stab_pop_type (info);
1000  buf = (char *) xmalloc (strlen (s) + 100);
1001  sprintf (buf, "r%s;%ld;%ld;", s, (long) low, (long) high);
1002  free (s);
1003
1004  if (! stab_push_string (info, buf, 0, definition, size))
1005    return FALSE;
1006
1007  free (buf);
1008
1009  return TRUE;
1010}
1011
1012/* Push an array type.  */
1013
1014static bfd_boolean
1015stab_array_type (void *p, bfd_signed_vma low, bfd_signed_vma high,
1016		 bfd_boolean stringp)
1017{
1018  struct stab_write_handle *info = (struct stab_write_handle *) p;
1019  bfd_boolean definition;
1020  unsigned int element_size;
1021  char *range, *element, *buf;
1022  long index;
1023  unsigned int size;
1024
1025  definition = info->type_stack->definition;
1026  range = stab_pop_type (info);
1027
1028  definition = definition || info->type_stack->definition;
1029  element_size = info->type_stack->size;
1030  element = stab_pop_type (info);
1031
1032  buf = (char *) xmalloc (strlen (range) + strlen (element) + 100);
1033
1034  if (! stringp)
1035    {
1036      index = 0;
1037      *buf = '\0';
1038    }
1039  else
1040    {
1041      /* We need to define a type in order to include the string
1042         attribute.  */
1043      index = info->type_index;
1044      ++info->type_index;
1045      definition = TRUE;
1046      sprintf (buf, "%ld=@S;", index);
1047    }
1048
1049  sprintf (buf + strlen (buf), "ar%s;%ld;%ld;%s",
1050	   range, (long) low, (long) high, element);
1051  free (range);
1052  free (element);
1053
1054  if (high < low)
1055    size = 0;
1056  else
1057    size = element_size * ((high - low) + 1);
1058  if (! stab_push_string (info, buf, index, definition, size))
1059    return FALSE;
1060
1061  free (buf);
1062
1063  return TRUE;
1064}
1065
1066/* Push a set type.  */
1067
1068static bfd_boolean
1069stab_set_type (void *p, bfd_boolean bitstringp)
1070{
1071  struct stab_write_handle *info = (struct stab_write_handle *) p;
1072  bfd_boolean definition;
1073  char *s, *buf;
1074  long index;
1075
1076  definition = info->type_stack->definition;
1077
1078  s = stab_pop_type (info);
1079  buf = (char *) xmalloc (strlen (s) + 30);
1080
1081  if (! bitstringp)
1082    {
1083      *buf = '\0';
1084      index = 0;
1085    }
1086  else
1087    {
1088      /* We need to define a type in order to include the string
1089         attribute.  */
1090      index = info->type_index;
1091      ++info->type_index;
1092      definition = TRUE;
1093      sprintf (buf, "%ld=@S;", index);
1094    }
1095
1096  sprintf (buf + strlen (buf), "S%s", s);
1097  free (s);
1098
1099  if (! stab_push_string (info, buf, index, definition, 0))
1100    return FALSE;
1101
1102  free (buf);
1103
1104  return TRUE;
1105}
1106
1107/* Push an offset type.  */
1108
1109static bfd_boolean
1110stab_offset_type (void *p)
1111{
1112  struct stab_write_handle *info = (struct stab_write_handle *) p;
1113  bfd_boolean definition;
1114  char *target, *base, *buf;
1115
1116  definition = info->type_stack->definition;
1117  target = stab_pop_type (info);
1118
1119  definition = definition || info->type_stack->definition;
1120  base = stab_pop_type (info);
1121
1122  buf = (char *) xmalloc (strlen (target) + strlen (base) + 3);
1123  sprintf (buf, "@%s,%s", base, target);
1124  free (base);
1125  free (target);
1126
1127  if (! stab_push_string (info, buf, 0, definition, 0))
1128    return FALSE;
1129
1130  free (buf);
1131
1132  return TRUE;
1133}
1134
1135/* Push a method type.  */
1136
1137static bfd_boolean
1138stab_method_type (void *p, bfd_boolean domainp, int argcount,
1139		  bfd_boolean varargs)
1140{
1141  struct stab_write_handle *info = (struct stab_write_handle *) p;
1142  bfd_boolean definition;
1143  char *domain, *return_type, *buf;
1144  char **args;
1145  int i;
1146  size_t len;
1147
1148  /* We don't bother with stub method types, because that would
1149     require a mangler for C++ argument types.  This will waste space
1150     in the debugging output.  */
1151
1152  /* We need a domain.  I'm not sure DOMAINP can ever be false,
1153     anyhow.  */
1154  if (! domainp)
1155    {
1156      if (! stab_empty_type (p))
1157	return FALSE;
1158    }
1159
1160  definition = info->type_stack->definition;
1161  domain = stab_pop_type (info);
1162
1163  /* A non-varargs function is indicated by making the last parameter
1164     type be void.  */
1165
1166  if (argcount < 0)
1167    {
1168      args = NULL;
1169      argcount = 0;
1170    }
1171  else if (argcount == 0)
1172    {
1173      if (varargs)
1174	args = NULL;
1175      else
1176	{
1177	  args = (char **) xmalloc (1 * sizeof (*args));
1178	  if (! stab_empty_type (p))
1179	    return FALSE;
1180	  definition = definition || info->type_stack->definition;
1181	  args[0] = stab_pop_type (info);
1182	  argcount = 1;
1183	}
1184    }
1185  else
1186    {
1187      args = (char **) xmalloc ((argcount + 1) * sizeof (*args));
1188      for (i = argcount - 1; i >= 0; i--)
1189	{
1190	  definition = definition || info->type_stack->definition;
1191	  args[i] = stab_pop_type (info);
1192	}
1193      if (! varargs)
1194	{
1195	  if (! stab_empty_type (p))
1196	    return FALSE;
1197	  definition = definition || info->type_stack->definition;
1198	  args[argcount] = stab_pop_type (info);
1199	  ++argcount;
1200	}
1201    }
1202
1203  definition = definition || info->type_stack->definition;
1204  return_type = stab_pop_type (info);
1205
1206  len = strlen (domain) + strlen (return_type) + 10;
1207  for (i = 0; i < argcount; i++)
1208    len += strlen (args[i]);
1209
1210  buf = (char *) xmalloc (len);
1211
1212  sprintf (buf, "#%s,%s", domain, return_type);
1213  free (domain);
1214  free (return_type);
1215  for (i = 0; i < argcount; i++)
1216    {
1217      strcat (buf, ",");
1218      strcat (buf, args[i]);
1219      free (args[i]);
1220    }
1221  strcat (buf, ";");
1222
1223  if (args != NULL)
1224    free (args);
1225
1226  if (! stab_push_string (info, buf, 0, definition, 0))
1227    return FALSE;
1228
1229  free (buf);
1230
1231  return TRUE;
1232}
1233
1234/* Push a const version of a type.  */
1235
1236static bfd_boolean
1237stab_const_type (void *p)
1238{
1239  struct stab_write_handle *info = (struct stab_write_handle *) p;
1240
1241  return stab_modify_type (info, 'k', info->type_stack->size,
1242			   (long **) NULL, (size_t *) NULL);
1243}
1244
1245/* Push a volatile version of a type.  */
1246
1247static bfd_boolean
1248stab_volatile_type (void *p)
1249{
1250  struct stab_write_handle *info = (struct stab_write_handle *) p;
1251
1252  return stab_modify_type (info, 'B', info->type_stack->size,
1253			   (long **) NULL, (size_t *) NULL);
1254}
1255
1256/* Get the type index to use for a struct/union/class ID.  This should
1257   return -1 if it fails.  */
1258
1259static long
1260stab_get_struct_index (struct stab_write_handle *info, const char *tag,
1261		       unsigned int id, enum debug_type_kind kind,
1262		       unsigned int *psize)
1263{
1264  if (id >= info->type_cache.struct_types_alloc)
1265    {
1266      size_t alloc;
1267
1268      alloc = info->type_cache.struct_types_alloc;
1269      if (alloc == 0)
1270	alloc = 10;
1271      while (id >= alloc)
1272	alloc *= 2;
1273      info->type_cache.struct_types =
1274	(struct stab_tag *) xrealloc (info->type_cache.struct_types,
1275				      alloc * sizeof (struct stab_tag));
1276      memset ((info->type_cache.struct_types
1277	       + info->type_cache.struct_types_alloc),
1278	      0,
1279	      ((alloc - info->type_cache.struct_types_alloc)
1280	       * sizeof (struct stab_tag)));
1281      info->type_cache.struct_types_alloc = alloc;
1282    }
1283
1284  if (info->type_cache.struct_types[id].index == 0)
1285    {
1286      info->type_cache.struct_types[id].index = info->type_index;
1287      ++info->type_index;
1288      info->type_cache.struct_types[id].tag = tag;
1289      info->type_cache.struct_types[id].kind = kind;
1290    }
1291
1292  if (kind == DEBUG_KIND_ILLEGAL)
1293    {
1294      /* This is a definition of the struct.  */
1295      info->type_cache.struct_types[id].kind = kind;
1296      info->type_cache.struct_types[id].size = *psize;
1297    }
1298  else
1299    *psize = info->type_cache.struct_types[id].size;
1300
1301  return info->type_cache.struct_types[id].index;
1302}
1303
1304/* Start outputting a struct.  We ignore the tag, and handle it in
1305   stab_tag.  */
1306
1307static bfd_boolean
1308stab_start_struct_type (void *p, const char *tag, unsigned int id,
1309			bfd_boolean structp, unsigned int size)
1310{
1311  struct stab_write_handle *info = (struct stab_write_handle *) p;
1312  long index;
1313  bfd_boolean definition;
1314  char *buf;
1315
1316  buf = (char *) xmalloc (40);
1317
1318  if (id == 0)
1319    {
1320      index = 0;
1321      *buf = '\0';
1322      definition = FALSE;
1323    }
1324  else
1325    {
1326      index = stab_get_struct_index (info, tag, id, DEBUG_KIND_ILLEGAL,
1327				     &size);
1328      if (index < 0)
1329	return FALSE;
1330      sprintf (buf, "%ld=", index);
1331      definition = TRUE;
1332    }
1333
1334  sprintf (buf + strlen (buf), "%c%u",
1335	   structp ? 's' : 'u',
1336	   size);
1337
1338  if (! stab_push_string (info, buf, index, definition, size))
1339    return FALSE;
1340
1341  info->type_stack->fields = (char *) xmalloc (1);
1342  info->type_stack->fields[0] = '\0';
1343
1344  return TRUE;
1345}
1346
1347/* Add a field to a struct.  */
1348
1349static bfd_boolean
1350stab_struct_field (void *p, const char *name, bfd_vma bitpos,
1351		   bfd_vma bitsize, enum debug_visibility visibility)
1352{
1353  struct stab_write_handle *info = (struct stab_write_handle *) p;
1354  bfd_boolean definition;
1355  unsigned int size;
1356  char *s, *n;
1357  const char *vis;
1358
1359  definition = info->type_stack->definition;
1360  size = info->type_stack->size;
1361  s = stab_pop_type (info);
1362
1363  /* Add this field to the end of the current struct fields, which is
1364     currently on the top of the stack.  */
1365
1366  assert (info->type_stack->fields != NULL);
1367  n = (char *) xmalloc (strlen (info->type_stack->fields)
1368			+ strlen (name)
1369			+ strlen (s)
1370			+ 50);
1371
1372  switch (visibility)
1373    {
1374    default:
1375      abort ();
1376
1377    case DEBUG_VISIBILITY_PUBLIC:
1378      vis = "";
1379      break;
1380
1381    case DEBUG_VISIBILITY_PRIVATE:
1382      vis = "/0";
1383      break;
1384
1385    case DEBUG_VISIBILITY_PROTECTED:
1386      vis = "/1";
1387      break;
1388    }
1389
1390  if (bitsize == 0)
1391    {
1392      bitsize = size * 8;
1393      if (bitsize == 0)
1394	non_fatal (_("%s: warning: unknown size for field `%s' in struct"),
1395		   bfd_get_filename (info->abfd), name);
1396    }
1397
1398  sprintf (n, "%s%s:%s%s,%ld,%ld;", info->type_stack->fields, name, vis, s,
1399	   (long) bitpos, (long) bitsize);
1400
1401  free (info->type_stack->fields);
1402  info->type_stack->fields = n;
1403
1404  if (definition)
1405    info->type_stack->definition = TRUE;
1406
1407  return TRUE;
1408}
1409
1410/* Finish up a struct.  */
1411
1412static bfd_boolean
1413stab_end_struct_type (void *p)
1414{
1415  struct stab_write_handle *info = (struct stab_write_handle *) p;
1416  bfd_boolean definition;
1417  long index;
1418  unsigned int size;
1419  char *fields, *first, *buf;
1420
1421  assert (info->type_stack != NULL && info->type_stack->fields != NULL);
1422
1423  definition = info->type_stack->definition;
1424  index = info->type_stack->index;
1425  size = info->type_stack->size;
1426  fields = info->type_stack->fields;
1427  first = stab_pop_type (info);
1428
1429  buf = (char *) xmalloc (strlen (first) + strlen (fields) + 2);
1430  sprintf (buf, "%s%s;", first, fields);
1431  free (first);
1432  free (fields);
1433
1434  if (! stab_push_string (info, buf, index, definition, size))
1435    return FALSE;
1436
1437  free (buf);
1438
1439  return TRUE;
1440}
1441
1442/* Start outputting a class.  */
1443
1444static bfd_boolean
1445stab_start_class_type (void *p, const char *tag, unsigned int id, bfd_boolean structp, unsigned int size, bfd_boolean vptr, bfd_boolean ownvptr)
1446{
1447  struct stab_write_handle *info = (struct stab_write_handle *) p;
1448  bfd_boolean definition;
1449  char *vstring;
1450
1451  if (! vptr || ownvptr)
1452    {
1453      definition = FALSE;
1454      vstring = NULL;
1455    }
1456  else
1457    {
1458      definition = info->type_stack->definition;
1459      vstring = stab_pop_type (info);
1460    }
1461
1462  if (! stab_start_struct_type (p, tag, id, structp, size))
1463    return FALSE;
1464
1465  if (vptr)
1466    {
1467      char *vtable;
1468
1469      if (ownvptr)
1470	{
1471	  assert (info->type_stack->index > 0);
1472	  vtable = (char *) xmalloc (20);
1473	  sprintf (vtable, "~%%%ld", info->type_stack->index);
1474	}
1475      else
1476	{
1477	  vtable = (char *) xmalloc (strlen (vstring) + 3);
1478	  sprintf (vtable, "~%%%s", vstring);
1479	  free (vstring);
1480	}
1481
1482      info->type_stack->vtable = vtable;
1483    }
1484
1485  if (definition)
1486    info->type_stack->definition = TRUE;
1487
1488  return TRUE;
1489}
1490
1491/* Add a static member to the class on the type stack.  */
1492
1493static bfd_boolean
1494stab_class_static_member (void *p, const char *name, const char *physname,
1495			  enum debug_visibility visibility)
1496{
1497  struct stab_write_handle *info = (struct stab_write_handle *) p;
1498  bfd_boolean definition;
1499  char *s, *n;
1500  const char *vis;
1501
1502  definition = info->type_stack->definition;
1503  s = stab_pop_type (info);
1504
1505  /* Add this field to the end of the current struct fields, which is
1506     currently on the top of the stack.  */
1507
1508  assert (info->type_stack->fields != NULL);
1509  n = (char *) xmalloc (strlen (info->type_stack->fields)
1510			+ strlen (name)
1511			+ strlen (s)
1512			+ strlen (physname)
1513			+ 10);
1514
1515  switch (visibility)
1516    {
1517    default:
1518      abort ();
1519
1520    case DEBUG_VISIBILITY_PUBLIC:
1521      vis = "";
1522      break;
1523
1524    case DEBUG_VISIBILITY_PRIVATE:
1525      vis = "/0";
1526      break;
1527
1528    case DEBUG_VISIBILITY_PROTECTED:
1529      vis = "/1";
1530      break;
1531    }
1532
1533  sprintf (n, "%s%s:%s%s:%s;", info->type_stack->fields, name, vis, s,
1534	   physname);
1535
1536  free (info->type_stack->fields);
1537  info->type_stack->fields = n;
1538
1539  if (definition)
1540    info->type_stack->definition = TRUE;
1541
1542  return TRUE;
1543}
1544
1545/* Add a base class to the class on the type stack.  */
1546
1547static bfd_boolean
1548stab_class_baseclass (void *p, bfd_vma bitpos, bfd_boolean virtual,
1549		      enum debug_visibility visibility)
1550{
1551  struct stab_write_handle *info = (struct stab_write_handle *) p;
1552  bfd_boolean definition;
1553  char *s;
1554  char *buf;
1555  unsigned int c;
1556  char **baseclasses;
1557
1558  definition = info->type_stack->definition;
1559  s = stab_pop_type (info);
1560
1561  /* Build the base class specifier.  */
1562
1563  buf = (char *) xmalloc (strlen (s) + 25);
1564  buf[0] = virtual ? '1' : '0';
1565  switch (visibility)
1566    {
1567    default:
1568      abort ();
1569
1570    case DEBUG_VISIBILITY_PRIVATE:
1571      buf[1] = '0';
1572      break;
1573
1574    case DEBUG_VISIBILITY_PROTECTED:
1575      buf[1] = '1';
1576      break;
1577
1578    case DEBUG_VISIBILITY_PUBLIC:
1579      buf[1] = '2';
1580      break;
1581    }
1582
1583  sprintf (buf + 2, "%ld,%s;", (long) bitpos, s);
1584  free (s);
1585
1586  /* Add the new baseclass to the existing ones.  */
1587
1588  assert (info->type_stack != NULL && info->type_stack->fields != NULL);
1589
1590  if (info->type_stack->baseclasses == NULL)
1591    c = 0;
1592  else
1593    {
1594      c = 0;
1595      while (info->type_stack->baseclasses[c] != NULL)
1596	++c;
1597    }
1598
1599  baseclasses = (char **) xrealloc (info->type_stack->baseclasses,
1600				    (c + 2) * sizeof (*baseclasses));
1601  baseclasses[c] = buf;
1602  baseclasses[c + 1] = NULL;
1603
1604  info->type_stack->baseclasses = baseclasses;
1605
1606  if (definition)
1607    info->type_stack->definition = TRUE;
1608
1609  return TRUE;
1610}
1611
1612/* Start adding a method to the class on the type stack.  */
1613
1614static bfd_boolean
1615stab_class_start_method (void *p, const char *name)
1616{
1617  struct stab_write_handle *info = (struct stab_write_handle *) p;
1618  char *m;
1619
1620  assert (info->type_stack != NULL && info->type_stack->fields != NULL);
1621
1622  if (info->type_stack->methods == NULL)
1623    {
1624      m = (char *) xmalloc (strlen (name) + 3);
1625      *m = '\0';
1626    }
1627  else
1628    {
1629      m = (char *) xrealloc (info->type_stack->methods,
1630			     (strlen (info->type_stack->methods)
1631			      + strlen (name)
1632			      + 4));
1633    }
1634
1635  sprintf (m + strlen (m), "%s::", name);
1636
1637  info->type_stack->methods = m;
1638
1639  return TRUE;
1640}
1641
1642/* Add a variant, either static or not, to the current method.  */
1643
1644static bfd_boolean
1645stab_class_method_var (struct stab_write_handle *info, const char *physname,
1646		       enum debug_visibility visibility,
1647		       bfd_boolean staticp, bfd_boolean constp,
1648		       bfd_boolean volatilep, bfd_vma voffset,
1649		       bfd_boolean contextp)
1650{
1651  bfd_boolean definition;
1652  char *type;
1653  char *context = NULL;
1654  char visc, qualc, typec;
1655
1656  definition = info->type_stack->definition;
1657  type = stab_pop_type (info);
1658
1659  if (contextp)
1660    {
1661      definition = definition || info->type_stack->definition;
1662      context = stab_pop_type (info);
1663    }
1664
1665  assert (info->type_stack != NULL && info->type_stack->methods != NULL);
1666
1667  switch (visibility)
1668    {
1669    default:
1670      abort ();
1671
1672    case DEBUG_VISIBILITY_PRIVATE:
1673      visc = '0';
1674      break;
1675
1676    case DEBUG_VISIBILITY_PROTECTED:
1677      visc = '1';
1678      break;
1679
1680    case DEBUG_VISIBILITY_PUBLIC:
1681      visc = '2';
1682      break;
1683    }
1684
1685  if (constp)
1686    {
1687      if (volatilep)
1688	qualc = 'D';
1689      else
1690	qualc = 'B';
1691    }
1692  else
1693    {
1694      if (volatilep)
1695	qualc = 'C';
1696      else
1697	qualc = 'A';
1698    }
1699
1700  if (staticp)
1701    typec = '?';
1702  else if (! contextp)
1703    typec = '.';
1704  else
1705    typec = '*';
1706
1707  info->type_stack->methods =
1708    (char *) xrealloc (info->type_stack->methods,
1709		       (strlen (info->type_stack->methods)
1710			+ strlen (type)
1711			+ strlen (physname)
1712			+ (contextp ? strlen (context) : 0)
1713			+ 40));
1714
1715  sprintf (info->type_stack->methods + strlen (info->type_stack->methods),
1716	   "%s:%s;%c%c%c", type, physname, visc, qualc, typec);
1717  free (type);
1718
1719  if (contextp)
1720    {
1721      sprintf (info->type_stack->methods + strlen (info->type_stack->methods),
1722	       "%ld;%s;", (long) voffset, context);
1723      free (context);
1724    }
1725
1726  if (definition)
1727    info->type_stack->definition = TRUE;
1728
1729  return TRUE;
1730}
1731
1732/* Add a variant to the current method.  */
1733
1734static bfd_boolean
1735stab_class_method_variant (void *p, const char *physname,
1736			   enum debug_visibility visibility,
1737			   bfd_boolean constp, bfd_boolean volatilep,
1738			   bfd_vma voffset, bfd_boolean contextp)
1739{
1740  struct stab_write_handle *info = (struct stab_write_handle *) p;
1741
1742  return stab_class_method_var (info, physname, visibility, FALSE, constp,
1743				volatilep, voffset, contextp);
1744}
1745
1746/* Add a static variant to the current method.  */
1747
1748static bfd_boolean
1749stab_class_static_method_variant (void *p, const char *physname,
1750				  enum debug_visibility visibility,
1751				  bfd_boolean constp, bfd_boolean volatilep)
1752{
1753  struct stab_write_handle *info = (struct stab_write_handle *) p;
1754
1755  return stab_class_method_var (info, physname, visibility, TRUE, constp,
1756				volatilep, 0, FALSE);
1757}
1758
1759/* Finish up a method.  */
1760
1761static bfd_boolean
1762stab_class_end_method (void *p)
1763{
1764  struct stab_write_handle *info = (struct stab_write_handle *) p;
1765
1766  assert (info->type_stack != NULL && info->type_stack->methods != NULL);
1767
1768  /* We allocated enough room on info->type_stack->methods to add the
1769     trailing semicolon.  */
1770  strcat (info->type_stack->methods, ";");
1771
1772  return TRUE;
1773}
1774
1775/* Finish up a class.  */
1776
1777static bfd_boolean
1778stab_end_class_type (void *p)
1779{
1780  struct stab_write_handle *info = (struct stab_write_handle *) p;
1781  size_t len;
1782  unsigned int i = 0;
1783  char *buf;
1784
1785  assert (info->type_stack != NULL && info->type_stack->fields != NULL);
1786
1787  /* Work out the size we need to allocate for the class definition.  */
1788
1789  len = (strlen (info->type_stack->string)
1790	 + strlen (info->type_stack->fields)
1791	 + 10);
1792  if (info->type_stack->baseclasses != NULL)
1793    {
1794      len += 20;
1795      for (i = 0; info->type_stack->baseclasses[i] != NULL; i++)
1796	len += strlen (info->type_stack->baseclasses[i]);
1797    }
1798  if (info->type_stack->methods != NULL)
1799    len += strlen (info->type_stack->methods);
1800  if (info->type_stack->vtable != NULL)
1801    len += strlen (info->type_stack->vtable);
1802
1803  /* Build the class definition.  */
1804
1805  buf = (char *) xmalloc (len);
1806
1807  strcpy (buf, info->type_stack->string);
1808
1809  if (info->type_stack->baseclasses != NULL)
1810    {
1811      sprintf (buf + strlen (buf), "!%u,", i);
1812      for (i = 0; info->type_stack->baseclasses[i] != NULL; i++)
1813	{
1814	  strcat (buf, info->type_stack->baseclasses[i]);
1815	  free (info->type_stack->baseclasses[i]);
1816	}
1817      free (info->type_stack->baseclasses);
1818      info->type_stack->baseclasses = NULL;
1819    }
1820
1821  strcat (buf, info->type_stack->fields);
1822  free (info->type_stack->fields);
1823  info->type_stack->fields = NULL;
1824
1825  if (info->type_stack->methods != NULL)
1826    {
1827      strcat (buf, info->type_stack->methods);
1828      free (info->type_stack->methods);
1829      info->type_stack->methods = NULL;
1830    }
1831
1832  strcat (buf, ";");
1833
1834  if (info->type_stack->vtable != NULL)
1835    {
1836      strcat (buf, info->type_stack->vtable);
1837      free (info->type_stack->vtable);
1838      info->type_stack->vtable = NULL;
1839    }
1840
1841  /* Replace the string on the top of the stack with the complete
1842     class definition.  */
1843  free (info->type_stack->string);
1844  info->type_stack->string = buf;
1845
1846  return TRUE;
1847}
1848
1849/* Push a typedef which was previously defined.  */
1850
1851static bfd_boolean
1852stab_typedef_type (void *p, const char *name)
1853{
1854  struct stab_write_handle *info = (struct stab_write_handle *) p;
1855  struct string_hash_entry *h;
1856
1857  h = string_hash_lookup (&info->typedef_hash, name, FALSE, FALSE);
1858  assert (h != NULL && h->index > 0);
1859
1860  return stab_push_defined_type (info, h->index, h->size);
1861}
1862
1863/* Push a struct, union or class tag.  */
1864
1865static bfd_boolean
1866stab_tag_type (void *p, const char *name, unsigned int id,
1867	       enum debug_type_kind kind)
1868{
1869  struct stab_write_handle *info = (struct stab_write_handle *) p;
1870  long index;
1871  unsigned int size = 0;
1872
1873  index = stab_get_struct_index (info, name, id, kind, &size);
1874  if (index < 0)
1875    return FALSE;
1876
1877  return stab_push_defined_type (info, index, size);
1878}
1879
1880/* Define a typedef.  */
1881
1882static bfd_boolean
1883stab_typdef (void *p, const char *name)
1884{
1885  struct stab_write_handle *info = (struct stab_write_handle *) p;
1886  long index;
1887  unsigned int size;
1888  char *s, *buf;
1889  struct string_hash_entry *h;
1890
1891  index = info->type_stack->index;
1892  size = info->type_stack->size;
1893  s = stab_pop_type (info);
1894
1895  buf = (char *) xmalloc (strlen (name) + strlen (s) + 20);
1896
1897  if (index > 0)
1898    sprintf (buf, "%s:t%s", name, s);
1899  else
1900    {
1901      index = info->type_index;
1902      ++info->type_index;
1903      sprintf (buf, "%s:t%ld=%s", name, index, s);
1904    }
1905
1906  free (s);
1907
1908  if (! stab_write_symbol (info, N_LSYM, 0, 0, buf))
1909    return FALSE;
1910
1911  free (buf);
1912
1913  h = string_hash_lookup (&info->typedef_hash, name, TRUE, FALSE);
1914  if (h == NULL)
1915    {
1916      non_fatal (_("string_hash_lookup failed: %s"),
1917		 bfd_errmsg (bfd_get_error ()));
1918      return FALSE;
1919    }
1920
1921  /* I don't think we care about redefinitions.  */
1922
1923  h->index = index;
1924  h->size = size;
1925
1926  return TRUE;
1927}
1928
1929/* Define a tag.  */
1930
1931static bfd_boolean
1932stab_tag (void *p, const char *tag)
1933{
1934  struct stab_write_handle *info = (struct stab_write_handle *) p;
1935  char *s, *buf;
1936
1937  s = stab_pop_type (info);
1938
1939  buf = (char *) xmalloc (strlen (tag) + strlen (s) + 3);
1940
1941  sprintf (buf, "%s:T%s", tag, s);
1942  free (s);
1943
1944  if (! stab_write_symbol (info, N_LSYM, 0, 0, buf))
1945    return FALSE;
1946
1947  free (buf);
1948
1949  return TRUE;
1950}
1951
1952/* Define an integer constant.  */
1953
1954static bfd_boolean
1955stab_int_constant (void *p, const char *name, bfd_vma val)
1956{
1957  struct stab_write_handle *info = (struct stab_write_handle *) p;
1958  char *buf;
1959
1960  buf = (char *) xmalloc (strlen (name) + 20);
1961  sprintf (buf, "%s:c=i%ld", name, (long) val);
1962
1963  if (! stab_write_symbol (info, N_LSYM, 0, 0, buf))
1964    return FALSE;
1965
1966  free (buf);
1967
1968  return TRUE;
1969}
1970
1971/* Define a floating point constant.  */
1972
1973static bfd_boolean
1974stab_float_constant (void *p, const char *name, double val)
1975{
1976  struct stab_write_handle *info = (struct stab_write_handle *) p;
1977  char *buf;
1978
1979  buf = (char *) xmalloc (strlen (name) + 20);
1980  sprintf (buf, "%s:c=f%g", name, val);
1981
1982  if (! stab_write_symbol (info, N_LSYM, 0, 0, buf))
1983    return FALSE;
1984
1985  free (buf);
1986
1987  return TRUE;
1988}
1989
1990/* Define a typed constant.  */
1991
1992static bfd_boolean
1993stab_typed_constant (void *p, const char *name, bfd_vma val)
1994{
1995  struct stab_write_handle *info = (struct stab_write_handle *) p;
1996  char *s, *buf;
1997
1998  s = stab_pop_type (info);
1999
2000  buf = (char *) xmalloc (strlen (name) + strlen (s) + 20);
2001  sprintf (buf, "%s:c=e%s,%ld", name, s, (long) val);
2002  free (s);
2003
2004  if (! stab_write_symbol (info, N_LSYM, 0, 0, buf))
2005    return FALSE;
2006
2007  free (buf);
2008
2009  return TRUE;
2010}
2011
2012/* Record a variable.  */
2013
2014static bfd_boolean
2015stab_variable (void *p, const char *name, enum debug_var_kind kind,
2016	       bfd_vma val)
2017{
2018  struct stab_write_handle *info = (struct stab_write_handle *) p;
2019  char *s, *buf;
2020  int stab_type;
2021  const char *kindstr;
2022
2023  s = stab_pop_type (info);
2024
2025  switch (kind)
2026    {
2027    default:
2028      abort ();
2029
2030    case DEBUG_GLOBAL:
2031      stab_type = N_GSYM;
2032      kindstr = "G";
2033      break;
2034
2035    case DEBUG_STATIC:
2036      stab_type = N_STSYM;
2037      kindstr = "S";
2038      break;
2039
2040    case DEBUG_LOCAL_STATIC:
2041      stab_type = N_STSYM;
2042      kindstr = "V";
2043      break;
2044
2045    case DEBUG_LOCAL:
2046      stab_type = N_LSYM;
2047      kindstr = "";
2048
2049      /* Make sure that this is a type reference or definition.  */
2050      if (! ISDIGIT (*s))
2051	{
2052	  char *n;
2053	  long index;
2054
2055	  index = info->type_index;
2056	  ++info->type_index;
2057	  n = (char *) xmalloc (strlen (s) + 20);
2058	  sprintf (n, "%ld=%s", index, s);
2059	  free (s);
2060	  s = n;
2061	}
2062      break;
2063
2064    case DEBUG_REGISTER:
2065      stab_type = N_RSYM;
2066      kindstr = "r";
2067      break;
2068    }
2069
2070  buf = (char *) xmalloc (strlen (name) + strlen (s) + 3);
2071  sprintf (buf, "%s:%s%s", name, kindstr, s);
2072  free (s);
2073
2074  if (! stab_write_symbol (info, stab_type, 0, val, buf))
2075    return FALSE;
2076
2077  free (buf);
2078
2079  return TRUE;
2080}
2081
2082/* Start outputting a function.  */
2083
2084static bfd_boolean
2085stab_start_function (void *p, const char *name, bfd_boolean globalp)
2086{
2087  struct stab_write_handle *info = (struct stab_write_handle *) p;
2088  char *rettype, *buf;
2089
2090  assert (info->nesting == 0 && info->fun_offset == -1);
2091
2092  rettype = stab_pop_type (info);
2093
2094  buf = (char *) xmalloc (strlen (name) + strlen (rettype) + 3);
2095  sprintf (buf, "%s:%c%s", name,
2096	   globalp ? 'F' : 'f',
2097	   rettype);
2098
2099  /* We don't know the value now, so we set it in start_block.  */
2100  info->fun_offset = info->symbols_size;
2101
2102  if (! stab_write_symbol (info, N_FUN, 0, 0, buf))
2103    return FALSE;
2104
2105  free (buf);
2106
2107  return TRUE;
2108}
2109
2110/* Output a function parameter.  */
2111
2112static bfd_boolean
2113stab_function_parameter (void *p, const char *name, enum debug_parm_kind kind, bfd_vma val)
2114{
2115  struct stab_write_handle *info = (struct stab_write_handle *) p;
2116  char *s, *buf;
2117  int stab_type;
2118  char kindc;
2119
2120  s = stab_pop_type (info);
2121
2122  switch (kind)
2123    {
2124    default:
2125      abort ();
2126
2127    case DEBUG_PARM_STACK:
2128      stab_type = N_PSYM;
2129      kindc = 'p';
2130      break;
2131
2132    case DEBUG_PARM_REG:
2133      stab_type = N_RSYM;
2134      kindc = 'P';
2135      break;
2136
2137    case DEBUG_PARM_REFERENCE:
2138      stab_type = N_PSYM;
2139      kindc = 'v';
2140      break;
2141
2142    case DEBUG_PARM_REF_REG:
2143      stab_type = N_RSYM;
2144      kindc = 'a';
2145      break;
2146    }
2147
2148  buf = (char *) xmalloc (strlen (name) + strlen (s) + 3);
2149  sprintf (buf, "%s:%c%s", name, kindc, s);
2150  free (s);
2151
2152  if (! stab_write_symbol (info, stab_type, 0, val, buf))
2153    return FALSE;
2154
2155  free (buf);
2156
2157  return TRUE;
2158}
2159
2160/* Start a block.  */
2161
2162static bfd_boolean
2163stab_start_block (void *p, bfd_vma addr)
2164{
2165  struct stab_write_handle *info = (struct stab_write_handle *) p;
2166
2167  /* Fill in any slots which have been waiting for the first known
2168     text address.  */
2169
2170  if (info->so_offset != -1)
2171    {
2172      bfd_put_32 (info->abfd, addr, info->symbols + info->so_offset + 8);
2173      info->so_offset = -1;
2174    }
2175
2176  if (info->fun_offset != -1)
2177    {
2178      bfd_put_32 (info->abfd, addr, info->symbols + info->fun_offset + 8);
2179      info->fun_offset = -1;
2180    }
2181
2182  ++info->nesting;
2183
2184  /* We will be called with a top level block surrounding the
2185     function, but stabs information does not output that block, so we
2186     ignore it.  */
2187
2188  if (info->nesting == 1)
2189    {
2190      info->fnaddr = addr;
2191      return TRUE;
2192    }
2193
2194  /* We have to output the LBRAC symbol after any variables which are
2195     declared inside the block.  We postpone the LBRAC until the next
2196     start_block or end_block.  */
2197
2198  /* If we have postponed an LBRAC, output it now.  */
2199  if (info->pending_lbrac != (bfd_vma) -1)
2200    {
2201      if (! stab_write_symbol (info, N_LBRAC, 0, info->pending_lbrac,
2202			       (const char *) NULL))
2203	return FALSE;
2204    }
2205
2206  /* Remember the address and output it later.  */
2207
2208  info->pending_lbrac = addr - info->fnaddr;
2209
2210  return TRUE;
2211}
2212
2213/* End a block.  */
2214
2215static bfd_boolean
2216stab_end_block (void *p, bfd_vma addr)
2217{
2218  struct stab_write_handle *info = (struct stab_write_handle *) p;
2219
2220  if (addr > info->last_text_address)
2221    info->last_text_address = addr;
2222
2223  /* If we have postponed an LBRAC, output it now.  */
2224  if (info->pending_lbrac != (bfd_vma) -1)
2225    {
2226      if (! stab_write_symbol (info, N_LBRAC, 0, info->pending_lbrac,
2227			       (const char *) NULL))
2228	return FALSE;
2229      info->pending_lbrac = (bfd_vma) -1;
2230    }
2231
2232  assert (info->nesting > 0);
2233
2234  --info->nesting;
2235
2236  /* We ignore the outermost block.  */
2237  if (info->nesting == 0)
2238    return TRUE;
2239
2240  return stab_write_symbol (info, N_RBRAC, 0, addr - info->fnaddr,
2241			    (const char *) NULL);
2242}
2243
2244/* End a function.  */
2245
2246static bfd_boolean
2247stab_end_function (void *p ATTRIBUTE_UNUSED)
2248{
2249  return TRUE;
2250}
2251
2252/* Output a line number.  */
2253
2254static bfd_boolean
2255stab_lineno (void *p, const char *file, unsigned long lineno, bfd_vma addr)
2256{
2257  struct stab_write_handle *info = (struct stab_write_handle *) p;
2258
2259  assert (info->lineno_filename != NULL);
2260
2261  if (addr > info->last_text_address)
2262    info->last_text_address = addr;
2263
2264  if (strcmp (file, info->lineno_filename) != 0)
2265    {
2266      if (! stab_write_symbol (info, N_SOL, 0, addr, file))
2267	return FALSE;
2268      info->lineno_filename = file;
2269    }
2270
2271  return stab_write_symbol (info, N_SLINE, lineno, addr - info->fnaddr,
2272			    (const char *) NULL);
2273}
2274