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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [binutils-2.18.50/] [binutils/] [wrstabs.c] - Blame information for rev 868

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

Line No. Rev Author Line
1 38 julius
/* 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 3 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
 
43
struct 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
 
56
struct 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
 
63
struct 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
 
89
struct 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
 
106
struct 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
 
132
struct 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
 
174
static struct bfd_hash_entry *string_hash_newfunc
175
  (struct bfd_hash_entry *, struct bfd_hash_table *, const char *);
176
static bfd_boolean stab_write_symbol
177
  (struct stab_write_handle *, int, int, bfd_vma, const char *);
178
static bfd_boolean stab_push_string
179
  (struct stab_write_handle *, const char *, long, bfd_boolean, unsigned int);
180
static bfd_boolean stab_push_defined_type
181
  (struct stab_write_handle *, long, unsigned int);
182
static char *stab_pop_type (struct stab_write_handle *);
183
static bfd_boolean stab_modify_type
184
  (struct stab_write_handle *, int, unsigned int, long **, size_t *);
185
static long stab_get_struct_index
186
  (struct stab_write_handle *, const char *, unsigned int,
187
   enum debug_type_kind, unsigned int *);
188
static 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);
191
static bfd_boolean stab_start_compilation_unit (void *, const char *);
192
static bfd_boolean stab_start_source (void *, const char *);
193
static bfd_boolean stab_empty_type (void *);
194
static bfd_boolean stab_void_type (void *);
195
static bfd_boolean stab_int_type (void *, unsigned int, bfd_boolean);
196
static bfd_boolean stab_float_type (void *, unsigned int);
197
static bfd_boolean stab_complex_type (void *, unsigned int);
198
static bfd_boolean stab_bool_type (void *, unsigned int);
199
static bfd_boolean stab_enum_type
200
  (void *, const char *, const char **, bfd_signed_vma *);
201
static bfd_boolean stab_pointer_type (void *);
202
static bfd_boolean stab_function_type (void *, int, bfd_boolean);
203
static bfd_boolean stab_reference_type (void *);
204
static bfd_boolean stab_range_type (void *, bfd_signed_vma, bfd_signed_vma);
205
static bfd_boolean stab_array_type
206
  (void *, bfd_signed_vma, bfd_signed_vma, bfd_boolean);
207
static bfd_boolean stab_set_type (void *, bfd_boolean);
208
static bfd_boolean stab_offset_type (void *);
209
static bfd_boolean stab_method_type (void *, bfd_boolean, int, bfd_boolean);
210
static bfd_boolean stab_const_type (void *);
211
static bfd_boolean stab_volatile_type (void *);
212
static bfd_boolean stab_start_struct_type
213
  (void *, const char *, unsigned int, bfd_boolean, unsigned int);
214
static bfd_boolean stab_struct_field
215
  (void *, const char *, bfd_vma, bfd_vma, enum debug_visibility);
216
static bfd_boolean stab_end_struct_type (void *);
217
static bfd_boolean stab_start_class_type
218
  (void *, const char *, unsigned int, bfd_boolean, unsigned int,
219
   bfd_boolean, bfd_boolean);
220
static bfd_boolean stab_class_static_member
221
  (void *, const char *, const char *, enum debug_visibility);
222
static bfd_boolean stab_class_baseclass
223
  (void *, bfd_vma, bfd_boolean, enum debug_visibility);
224
static bfd_boolean stab_class_start_method (void *, const char *);
225
static bfd_boolean stab_class_method_variant
226
  (void *, const char *, enum debug_visibility, bfd_boolean, bfd_boolean,
227
   bfd_vma, bfd_boolean);
228
static bfd_boolean stab_class_static_method_variant
229
  (void *, const char *, enum debug_visibility, bfd_boolean, bfd_boolean);
230
static bfd_boolean stab_class_end_method (void *);
231
static bfd_boolean stab_end_class_type (void *);
232
static bfd_boolean stab_typedef_type (void *, const char *);
233
static bfd_boolean stab_tag_type
234
  (void *, const char *, unsigned int, enum debug_type_kind);
235
static bfd_boolean stab_typdef (void *, const char *);
236
static bfd_boolean stab_tag (void *, const char *);
237
static bfd_boolean stab_int_constant (void *, const char *, bfd_vma);
238
static bfd_boolean stab_float_constant (void *, const char *, double);
239
static bfd_boolean stab_typed_constant (void *, const char *, bfd_vma);
240
static bfd_boolean stab_variable
241
  (void *, const char *, enum debug_var_kind, bfd_vma);
242
static bfd_boolean stab_start_function (void *, const char *, bfd_boolean);
243
static bfd_boolean stab_function_parameter
244
  (void *, const char *, enum debug_parm_kind, bfd_vma);
245
static bfd_boolean stab_start_block (void *, bfd_vma);
246
static bfd_boolean stab_end_block (void *, bfd_vma);
247
static bfd_boolean stab_end_function (void *);
248
static bfd_boolean stab_lineno (void *, const char *, unsigned long, bfd_vma);
249
 
250
static 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
 
300
static struct bfd_hash_entry *
301
string_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
 
337
static bfd_boolean
338
stab_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
 
395
static bfd_boolean
396
stab_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
 
420
static bfd_boolean
421
stab_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
 
433
static char *
434
stab_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
 
460
bfd_boolean
461
write_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
 
543
static bfd_boolean
544
stab_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
 
560
static bfd_boolean
561
stab_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
 
577
static bfd_boolean
578
stab_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
 
603
static bfd_boolean
604
stab_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
 
628
static bfd_boolean
629
stab_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
 
688
static bfd_boolean
689
stab_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
 
729
static bfd_boolean
730
stab_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
 
747
static bfd_boolean
748
stab_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
 
778
static bfd_boolean
779
stab_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
 
845
static bfd_boolean
846
stab_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
 
927
static bfd_boolean
928
stab_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
 
939
static bfd_boolean
940
stab_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
 
976
static bfd_boolean
977
stab_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
 
988
static bfd_boolean
989
stab_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
 
1014
static bfd_boolean
1015
stab_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
 
1068
static bfd_boolean
1069
stab_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
 
1109
static bfd_boolean
1110
stab_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
 
1137
static bfd_boolean
1138
stab_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
 
1236
static bfd_boolean
1237
stab_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
 
1247
static bfd_boolean
1248
stab_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
 
1259
static long
1260
stab_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
 
1307
static bfd_boolean
1308
stab_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
 
1349
static bfd_boolean
1350
stab_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
 
1412
static bfd_boolean
1413
stab_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
 
1444
static bfd_boolean
1445
stab_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
 
1493
static bfd_boolean
1494
stab_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
 
1547
static bfd_boolean
1548
stab_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
 
1614
static bfd_boolean
1615
stab_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
 
1644
static bfd_boolean
1645
stab_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
 
1734
static bfd_boolean
1735
stab_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
 
1748
static bfd_boolean
1749
stab_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
 
1761
static bfd_boolean
1762
stab_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
 
1777
static bfd_boolean
1778
stab_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
 
1851
static bfd_boolean
1852
stab_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
 
1865
static bfd_boolean
1866
stab_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
 
1882
static bfd_boolean
1883
stab_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
 
1931
static bfd_boolean
1932
stab_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
 
1954
static bfd_boolean
1955
stab_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
 
1973
static bfd_boolean
1974
stab_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
 
1992
static bfd_boolean
1993
stab_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
 
2014
static bfd_boolean
2015
stab_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
 
2084
static bfd_boolean
2085
stab_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
 
2112
static bfd_boolean
2113
stab_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
 
2162
static bfd_boolean
2163
stab_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
 
2215
static bfd_boolean
2216
stab_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
 
2246
static bfd_boolean
2247
stab_end_function (void *p ATTRIBUTE_UNUSED)
2248
{
2249
  return TRUE;
2250
}
2251
 
2252
/* Output a line number.  */
2253
 
2254
static bfd_boolean
2255
stab_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
}

powered by: WebSVN 2.1.0

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