Annotation of 43BSDReno/contrib/emacs-18.55/gdb/dbxread.c, revision 1.1.1.1

1.1       root        1: /* Read dbx symbol tables and convert to internal format, for GDB.
                      2:    Copyright (C) 1986, 1987, 1988 Free Software Foundation, Inc.
                      3: 
                      4: GDB is distributed in the hope that it will be useful, but WITHOUT ANY
                      5: WARRANTY.  No author or distributor accepts responsibility to anyone
                      6: for the consequences of using it or for whether it serves any
                      7: particular purpose or works at all, unless he says so in writing.
                      8: Refer to the GDB General Public License for full details.
                      9: 
                     10: Everyone is granted permission to copy, modify and redistribute GDB,
                     11: but only under the conditions described in the GDB General Public
                     12: License.  A copy of this license is supposed to have been given to you
                     13: along with GDB so you can know your rights and responsibilities.  It
                     14: should be in a file named COPYING.  Among other things, the copyright
                     15: notice and this notice must be preserved on all copies.
                     16: 
                     17: In other words, go ahead and share GDB, but don't try to stop
                     18: anyone else from sharing it farther.  Help stamp out software hoarding!
                     19: */
                     20: 
                     21: #include "param.h"
                     22: 
                     23: #ifdef READ_DBX_FORMAT
                     24: 
                     25: #include <a.out.h>
                     26: #include <stab.h>
                     27: #include <stdio.h>
                     28: #include <obstack.h>
                     29: #include <sys/param.h>
                     30: #include <sys/file.h>
                     31: #include <sys/stat.h>
                     32: #include "defs.h"
                     33: #include "initialize.h"
                     34: #include "symtab.h"
                     35: 
                     36: static void add_symbol_to_list ();
                     37: static void read_dbx_symtab ();
                     38: static void process_one_symbol ();
                     39: static struct type *read_type ();
                     40: static struct type *read_range_type ();
                     41: static struct type *read_enum_type ();
                     42: static struct type *read_struct_type ();
                     43: static long read_number ();
                     44: static void finish_block ();
                     45: static struct blockvector *make_blockvector ();
                     46: static struct symbol *define_symbol ();
                     47: static void start_subfile ();
                     48: static int hashname ();
                     49: static void hash_symsegs ();
                     50: 
                     51: extern struct symtab *read_symsegs ();
                     52: extern void free_all_symtabs ();
                     53: 
                     54: /* Macro for number of symbol table entries (in usual a.out format).
                     55:    Some machines override this definition.  */
                     56: #ifndef NUMBER_OF_SYMBOLS
                     57: #define NUMBER_OF_SYMBOLS (hdr.a_syms / sizeof (struct nlist))
                     58: #endif
                     59: 
                     60: /* Macro for file-offset of symbol table (in usual a.out format).  */
                     61: #ifndef SYMBOL_TABLE_OFFSET
                     62: #define SYMBOL_TABLE_OFFSET N_SYMOFF (hdr)
                     63: #endif
                     64: 
                     65: /* Macro for file-offset of string table (in usual a.out format).  */
                     66: #ifndef STRING_TABLE_OFFSET
                     67: #define STRING_TABLE_OFFSET (N_SYMOFF (hdr) + hdr.a_syms)
                     68: #endif
                     69: 
                     70: /* Macro to store the length of the string table data in INTO.  */
                     71: #ifndef READ_STRING_TABLE_SIZE
                     72: #define READ_STRING_TABLE_SIZE(INTO)           \
                     73: { val = myread (desc, &INTO, sizeof INTO);     \
                     74:   if (val < 0) perror_with_name (name); }
                     75: #endif
                     76: 
                     77: /* Macro to declare variables to hold the file's header data.  */
                     78: #ifndef DECLARE_FILE_HEADERS
                     79: #define DECLARE_FILE_HEADERS  struct exec hdr
                     80: #endif
                     81: 
                     82: /* Macro to read the header data from descriptor DESC and validate it.
                     83:    NAME is the file name, for error messages.  */
                     84: #ifndef READ_FILE_HEADERS
                     85: #define READ_FILE_HEADERS(DESC, NAME)          \
                     86: { val = myread (DESC, &hdr, sizeof hdr);       \
                     87:   if (val < 0) perror_with_name (NAME);                \
                     88:   if (N_BADMAG (hdr))                          \
                     89:     error ("File \"%s\" not in executable format.", NAME); }
                     90: #endif
                     91: 
                     92: START_FILE
                     93: 
                     94: /* Chain of symtabs made from reading the file's symsegs.
                     95:    These symtabs do not go into symtab_list themselves,
                     96:    but the information is copied from them when appropriate
                     97:    to make the symtabs that will exist permanently.  */
                     98: 
                     99: static struct symtab *symseg_chain;
                    100: 
                    101: /* Symseg symbol table for the file whose data we are now processing.
                    102:    It is one of those in symseg_chain.  Or 0, for a compilation that
                    103:    has no symseg.  */
                    104: 
                    105: static struct symtab *current_symseg;
                    106: 
                    107: /* Name of source file whose symbol data we are now processing.
                    108:    This comes from a symbol of type N_SO.  */
                    109: 
                    110: static char *last_source_file;
                    111: 
                    112: /* Core address of start of text of current source file.
                    113:    This too comes from the N_SO symbol.  */
                    114: 
                    115: static CORE_ADDR last_source_start_addr;
                    116: 
                    117: /* End of the text segment of the executable file,
                    118:    as found in the symbol _etext.  */
                    119: 
                    120: static CORE_ADDR end_of_text_addr;
                    121: 
                    122: /* The list of sub-source-files within the current individual compilation.
                    123:    Each file gets its own symtab with its own linetable and associated info,
                    124:    but they all share one blockvector.  */
                    125: 
                    126: struct subfile
                    127: {
                    128:   struct subfile *next;
                    129:   char *name;
                    130:   struct linetable *line_vector;
                    131:   int line_vector_length;
                    132:   int line_vector_index;
                    133:   int prev_line_number;
                    134: };
                    135: 
                    136: static struct subfile *subfiles;
                    137: 
                    138: static struct subfile *current_subfile;
                    139: 
                    140: /* Count symbols as they are processed, for error messages.  */
                    141: 
                    142: static int symnum;
                    143: 
                    144: /* Vector of types defined so far, indexed by their dbx type numbers.
                    145:    (In newer sun systems, dbx uses a pair of numbers in parens,
                    146:     as in "(SUBFILENUM,NUMWITHINSUBFILE)".  Then these numbers must be
                    147:     translated through the type_translations hash table to get
                    148:     the index into the type vector.)  */
                    149: 
                    150: static struct typevector *type_vector;
                    151: 
                    152: /* Number of elements allocated for type_vector currently.  */
                    153: 
                    154: static int type_vector_length;
                    155: 
                    156: /* Vector of line number information.  */
                    157: 
                    158: static struct linetable *line_vector;
                    159: 
                    160: /* Index of next entry to go in line_vector_index.  */
                    161: 
                    162: static int line_vector_index;
                    163: 
                    164: /* Last line number recorded in the line vector.  */
                    165: 
                    166: static int prev_line_number;
                    167: 
                    168: /* Number of elements allocated for line_vector currently.  */
                    169: 
                    170: static int line_vector_length;
                    171: 
                    172: /* Hash table of global symbols whose values are not known yet.
                    173:    They are chained thru the SYMBOL_VALUE, since we don't
                    174:    have the correct data for that slot yet.  */
                    175: 
                    176: #define HASHSIZE 127
                    177: static struct symbol *global_sym_chain[HASHSIZE];
                    178: 
                    179: /* Record the symbols defined for each context in a list.
                    180:    We don't create a struct block for the context until we
                    181:    know how long to make it.  */
                    182: 
                    183: #define PENDINGSIZE 100
                    184: 
                    185: struct pending
                    186: {
                    187:   struct pending *next;
                    188:   int nsyms;
                    189:   struct symbol *symbol[PENDINGSIZE];
                    190: };
                    191: 
                    192: /* List of free `struct pending' structures for reuse.  */
                    193: struct pending *free_pendings;
                    194: 
                    195: /* Here are the three lists that symbols are put on.  */
                    196: 
                    197: struct pending *file_symbols;  /* static at top level, and types */
                    198: 
                    199: struct pending *global_symbols;        /* global functions and variables */
                    200: 
                    201: struct pending *local_symbols; /* everything local to lexical context */
                    202: 
                    203: /* Stack representing unclosed lexical contexts
                    204:    (that will become blocks, eventually).  */
                    205: 
                    206: struct context_stack
                    207: {
                    208:   struct pending *locals;
                    209:   struct pending_block *old_blocks;
                    210:   struct symbol *name;
                    211:   CORE_ADDR start_addr;
                    212:   int depth;
                    213: };
                    214: 
                    215: struct context_stack *context_stack;
                    216: 
                    217: /* Index of first unused entry in context stack.  */
                    218: int context_stack_depth;
                    219: 
                    220: /* Currently allocated size of context stack.  */
                    221: 
                    222: int context_stack_size;
                    223: 
                    224: /* Nonzero if within a function (so symbols should be local,
                    225:    if nothing says specifically).  */
                    226: 
                    227: int within_function;
                    228: 
                    229: /* List of blocks already made (lexical contexts already closed).
                    230:    This is used at the end to make the blockvector.  */
                    231: 
                    232: struct pending_block
                    233: {
                    234:   struct pending_block *next;
                    235:   struct block *block;
                    236: };
                    237: 
                    238: struct pending_block *pending_blocks;
                    239: 
                    240: extern CORE_ADDR first_object_file_end;        /* From blockframe.c */
                    241: 
                    242: /* File name symbols were loaded from.  */
                    243: 
                    244: static char *symfile;
                    245: 
                    246: static int
                    247: xxmalloc (n)
                    248: {
                    249:   int v = malloc (n);
                    250:   if (v == 0)
                    251:     abort ();
                    252:   return v;
                    253: }
                    254: 
                    255: /* Make a copy of the string at PTR with SIZE characters in the symbol obstack
                    256:    (and add a null character at the end in the copy).
                    257:    Returns the address of the copy.  */
                    258: 
                    259: static char *
                    260: obsavestring (ptr, size)
                    261:      char *ptr;
                    262:      int size;
                    263: {
                    264:   register char *p = (char *) obstack_alloc (symbol_obstack, size + 1);
                    265:   /* Open-coded bcopy--saves function call time.
                    266:      These strings are usually short.  */
                    267:   {
                    268:     register char *p1 = ptr;
                    269:     register char *p2 = p;
                    270:     char *end = ptr + size;
                    271:     while (p1 != end)
                    272:       *p2++ = *p1++;
                    273:   }
                    274:   p[size] = 0;
                    275:   return p;
                    276: }
                    277: 
                    278: /* Concatenate strings S1, S2 and S3; return the new string.
                    279:    Space is found in the symbol_obstack.  */
                    280: 
                    281: static char *
                    282: obconcat (s1, s2, s3)
                    283:      char *s1, *s2, *s3;
                    284: {
                    285:   register int len = strlen (s1) + strlen (s2) + strlen (s3) + 1;
                    286:   register char *val = (char *) obstack_alloc (symbol_obstack, len);
                    287:   strcpy (val, s1);
                    288:   strcat (val, s2);
                    289:   strcat (val, s3);
                    290:   return val;
                    291: }
                    292: 
                    293: /* Support for Sun changes to dbx symbol format */
                    294: 
                    295: /* For each identified header file, we have a table of types defined
                    296:    in that header file.
                    297: 
                    298:    header_files maps header file names to their type tables.
                    299:    It is a vector of n_header_files elements.
                    300:    Each element describes one header file.
                    301:    It contains a vector of types.
                    302: 
                    303:    Sometimes it can happen that the same header file produces
                    304:    different results when included in different places.
                    305:    This can result from conditionals or from different
                    306:    things done before including the file.
                    307:    When this happens, there are multiple entries for the file in this table,
                    308:    one entry for each distinct set of results.
                    309:    The entries are distinguished by the INSTANCE field.
                    310:    The INSTANCE field appears in the N_BINCL and N_EXCL symbol table and is
                    311:    used to match header-file references to their corresponding data.  */
                    312: 
                    313: struct header_file
                    314: {
                    315:   char *name;                  /* Name of header file */
                    316:   int instance;                        /* Numeric code distinguishing instances
                    317:                                   of one header file that produced
                    318:                                   different results when included.
                    319:                                   It comes from the N_BINCL or N_EXCL.  */
                    320:   struct type **vector;                /* Pointer to vector of types */
                    321:   int length;                  /* Allocated length (# elts) of that vector */
                    322: };
                    323: 
                    324: static struct header_file *header_files;
                    325: 
                    326: static int n_header_files;
                    327: 
                    328: static int n_allocated_header_files;
                    329: 
                    330: /* Within each object file, various header files are assigned numbers.
                    331:    A type is defined or referred to with a pair of numbers
                    332:    (FILENUM,TYPENUM) where FILENUM is the number of the header file
                    333:    and TYPENUM is the number within that header file.
                    334:    TYPENUM is the index within the vector of types for that header file.
                    335: 
                    336:    FILENUM == 1 is special; it refers to the main source of the object file,
                    337:    and not to any header file.  FILENUM != 1 is interpreted by looking it up
                    338:    in the following table, which contains indices in header_files.  */
                    339: 
                    340: static int *this_object_header_files;
                    341: 
                    342: static int n_this_object_header_files;
                    343: 
                    344: static int n_allocated_this_object_header_files;
                    345: 
                    346: /* When a header file is getting special overriding definitions
                    347:    for one source file, record here the header_files index
                    348:    of its normal definition vector.
                    349:    At other times, this is -1.  */
                    350: 
                    351: static int header_file_prev_index;
                    352: 
                    353: /* At the start of reading dbx symbols, allocate our tables.  */
                    354: 
                    355: static void
                    356: init_header_files ()
                    357: {
                    358:   n_allocated_header_files = 10;
                    359:   header_files = (struct header_file *) xxmalloc (10 * sizeof (struct header_file));
                    360:   n_header_files = 0;
                    361: 
                    362:   n_allocated_this_object_header_files = 10;
                    363:   this_object_header_files = (int *) xxmalloc (10 * sizeof (int));
                    364: }
                    365: 
                    366: /* At the end of reading dbx symbols, free our tables.  */
                    367: 
                    368: static void
                    369: free_header_files ()
                    370: {
                    371:   register int i;
                    372:   for (i = 0; i < n_header_files; i++)
                    373:     free (header_files[i].name);
                    374:   free (header_files);
                    375:   free (this_object_header_files);
                    376: }
                    377: 
                    378: /* Called at the start of each object file's symbols.
                    379:    Clear out the mapping of header file numbers to header files.  */
                    380: 
                    381: static void
                    382: new_object_header_files ()
                    383: {
                    384:   /* Leave FILENUM of 0 free for builtin types and this file's types.  */
                    385:   n_this_object_header_files = 1;
                    386:   header_file_prev_index = -1;
                    387: }
                    388: 
                    389: /* Add header file number I for this object file
                    390:    at the next successive FILENUM.  */
                    391: 
                    392: static void
                    393: add_this_object_header_file (i)
                    394:      int i;
                    395: {
                    396:   if (n_this_object_header_files == n_allocated_this_object_header_files)
                    397:     {
                    398:       n_allocated_this_object_header_files *= 2;
                    399:       this_object_header_files
                    400:        = (int *) xrealloc (this_object_header_files,
                    401:                            n_allocated_this_object_header_files * sizeof (int));
                    402:     }
                    403: 
                    404:   this_object_header_files[n_this_object_header_files++] = i;
                    405: }
                    406: 
                    407: /* Add to this file an "old" header file, one already seen in
                    408:    a previous object file.  NAME is the header file's name.
                    409:    INSTANCE is its instance code, to select among multiple
                    410:    symbol tables for the same header file.  */
                    411: 
                    412: static void
                    413: add_old_header_file (name, instance)
                    414:      char *name;
                    415:      int instance;
                    416: {
                    417:   register struct header_file *p = header_files;
                    418:   register int i;
                    419: 
                    420:   for (i = 0; i < n_header_files; i++)
                    421:     if (!strcmp (p[i].name, name) && instance == p[i].instance)
                    422:       {
                    423:        add_this_object_header_file (i);
                    424:        return;
                    425:       }
                    426:   error ("Invalid symbol data: \"repeated\" header file that hasn't been seen before, at symtab pos %d.",
                    427:         symnum);
                    428: }
                    429: 
                    430: /* Add to this file a "new" header file: definitions for its types follow.
                    431:    NAME is the header file's name.
                    432:    Most often this happens only once for each distinct header file,
                    433:    but not necessarily.  If it happens more than once, INSTANCE has
                    434:    a different value each time, and references to the header file
                    435:    use INSTANCE values to select among them.
                    436: 
                    437:    dbx output contains "begin" and "end" markers for each new header file,
                    438:    but at this level we just need to know which files there have been;
                    439:    so we record the file when its "begin" is seen and ignore the "end".  */
                    440: 
                    441: static void
                    442: add_new_header_file (name, instance)
                    443:      char *name;
                    444:      int instance;
                    445: {
                    446:   register int i;
                    447:   register struct header_file *p = header_files;
                    448:   header_file_prev_index = -1;
                    449: 
                    450: #if 0
                    451:   /* This code was used before I knew about the instance codes.
                    452:      My first hypothesis is that it is not necessary now
                    453:      that instance codes are handled.  */
                    454: 
                    455:   /* Has this header file a previous definition?
                    456:      If so, make a new entry anyway so that this use in this source file
                    457:      gets a separate entry.  Later source files get the old entry.
                    458:      Record here the index of the old entry, so that any type indices
                    459:      not previously defined can get defined in the old entry as
                    460:      well as in the new one.  */
                    461: 
                    462:   for (i = 0; i < n_header_files; i++)
                    463:     if (!strcmp (p[i].name, name))
                    464:       {
                    465:        header_file_prev_index = i;
                    466:       }
                    467: 
                    468: #endif
                    469: 
                    470:   /* Make sure there is room for one more header file.  */
                    471: 
                    472:   if (n_header_files == n_allocated_header_files)
                    473:     {
                    474:       n_allocated_header_files *= 2;
                    475:       header_files
                    476:        = (struct header_file *) xrealloc (header_files, n_allocated_header_files * sizeof (struct header_file));
                    477:     }
                    478: 
                    479:   /* Create an entry for this header file.  */
                    480: 
                    481:   i = n_header_files++;
                    482:   header_files[i].name = name;
                    483:   header_files[i].instance = instance;
                    484:   header_files[i].length = 10;
                    485:   header_files[i].vector
                    486:     = (struct type **) xxmalloc (10 * sizeof (struct type *));
                    487:   bzero (header_files[i].vector, 10 * sizeof (struct type *));
                    488: 
                    489:   add_this_object_header_file (i);
                    490: }
                    491: 
                    492: /* Look up a dbx type-number pair.  Return the address of the slot
                    493:    where the type for that number-pair is stored.
                    494:    The number-pair is in TYPENUMS.
                    495: 
                    496:    This can be used for finding the type associated with that pair
                    497:    or for associating a new type with the pair.  */
                    498: 
                    499: static struct type **
                    500: dbx_lookup_type (typenums)
                    501:      int typenums[2];
                    502: {
                    503:   register int filenum = typenums[0], index = typenums[1];
                    504: 
                    505:   if (filenum < 0 || filenum >= n_this_object_header_files)
                    506:     error ("Invalid symbol data: type number (%d,%d) out of range at symtab pos %d.",
                    507:           filenum, index, symnum);
                    508: 
                    509:   if (filenum == 0)
                    510:     {
                    511:       /* Type is defined outside of header files.
                    512:         Find it in this object file's type vector.  */
                    513:       if (index >= type_vector_length)
                    514:        {
                    515:          type_vector_length *= 2;
                    516:          type_vector = (struct typevector *)
                    517:            xrealloc (type_vector, sizeof (struct typevector) + type_vector_length * sizeof (struct type *));
                    518:          bzero (&type_vector->type[type_vector_length / 2],
                    519:                 type_vector_length * sizeof (struct type *) / 2);
                    520:        }
                    521:       return &type_vector->type[index];
                    522:     }
                    523:   else
                    524:     {
                    525:       register int real_filenum = this_object_header_files[filenum];
                    526:       register struct header_file *f;
                    527: 
                    528:       if (real_filenum >= n_header_files)
                    529:        abort ();
                    530: 
                    531:       f = &header_files[real_filenum];
                    532: 
                    533:       if (index >= f->length)
                    534:        {
                    535:          f->length *= 2;
                    536:          f->vector = (struct type **)
                    537:            xrealloc (f->vector, f->length * sizeof (struct type *));
                    538:          bzero (&f->vector[f->length / 2],
                    539:                 f->length * sizeof (struct type *) / 2);
                    540:        }
                    541:       return &f->vector[index];
                    542:     }
                    543: }
                    544: 
                    545: /* Make sure there is a type allocated for type numbers TYPENUMS
                    546:    and return the type object.
                    547:    This can create an empty (zeroed) type object.  */
                    548: 
                    549: static struct type *
                    550: dbx_alloc_type (typenums)
                    551:      int typenums[2];
                    552: {
                    553:   register struct type **type_addr = dbx_lookup_type (typenums);
                    554:   register struct type *type = *type_addr;
                    555: 
                    556:   /* If we are referring to a type not known at all yet,
                    557:      allocate an empty type for it.
                    558:      We will fill it in later if we find out how.  */
                    559:   if (type == 0)
                    560:     {
                    561:       type = (struct type *) obstack_alloc (symbol_obstack,
                    562:                                            sizeof (struct type));
                    563:       bzero (type, sizeof (struct type));
                    564:       *type_addr = type;
                    565:     }
                    566:   return type;
                    567: }
                    568: 
                    569: #if 0
                    570: static struct type **
                    571: explicit_lookup_type (real_filenum, index)
                    572:      int real_filenum, index;
                    573: {
                    574:   register struct header_file *f = &header_files[real_filenum];
                    575: 
                    576:   if (index >= f->length)
                    577:     {
                    578:       f->length *= 2;
                    579:       f->vector = (struct type **)
                    580:        xrealloc (f->vector, f->length * sizeof (struct type *));
                    581:       bzero (&f->vector[f->length / 2],
                    582:             f->length * sizeof (struct type *) / 2);
                    583:     }
                    584:   return &f->vector[index];
                    585: }
                    586: #endif
                    587: 
                    588: /* maintain the lists of symbols and blocks */
                    589: 
                    590: /* Add a symbol to one of the lists of symbols.  */
                    591: static void
                    592: add_symbol_to_list (symbol, listhead)
                    593:      struct symbol *symbol;
                    594:      struct pending **listhead;
                    595: {
                    596:   /* We keep PENDINGSIZE symbols in each link of the list.
                    597:      If we don't have a link with room in it, add a new link.  */
                    598:   if (*listhead == 0 || (*listhead)->nsyms == PENDINGSIZE)
                    599:     {
                    600:       register struct pending *link;
                    601:       if (free_pendings)
                    602:        {
                    603:          link = free_pendings;
                    604:          free_pendings = link->next;
                    605:        }
                    606:       else
                    607:        link = (struct pending *) xxmalloc (sizeof (struct pending));
                    608: 
                    609:       link->next = *listhead;
                    610:       *listhead = link;
                    611:       link->nsyms = 0;
                    612:     }
                    613: 
                    614:   (*listhead)->symbol[(*listhead)->nsyms++] = symbol;
                    615: }
                    616: 
                    617: /* At end of reading syms, or in case of quit,
                    618:    really free as many `struct pending's as we can easily find.  */
                    619: 
                    620: static void
                    621: really_free_pendings ()
                    622: {
                    623:   struct pending *next, *next1;
                    624:   struct pending_block *bnext, *bnext1;
                    625: 
                    626:   for (next = free_pendings; next; next = next1)
                    627:     {
                    628:       next1 = next->next;
                    629:       free (next);
                    630:     }
                    631:   free_pendings = 0;
                    632: 
                    633:   for (bnext = pending_blocks; bnext; bnext = bnext1)
                    634:     {
                    635:       bnext1 = bnext->next;
                    636:       free (bnext);
                    637:     }
                    638:   pending_blocks = 0;
                    639: 
                    640:   for (next = file_symbols; next; next = next1)
                    641:     {
                    642:       next1 = next->next;
                    643:       free (next);
                    644:     }
                    645:   for (next = global_symbols; next; next = next1)
                    646:     {
                    647:       next1 = next->next;
                    648:       free (next);
                    649:     }
                    650: }
                    651: 
                    652: /* Take one of the lists of symbols and make a block from it.
                    653:    Keep the order the symbols have in the list (reversed from the input file).
                    654:    Put the block on the list of pending blocks.  */
                    655: 
                    656: static void
                    657: finish_block (symbol, listhead, old_blocks, start, end)
                    658:      struct symbol *symbol;
                    659:      struct pending **listhead;
                    660:      struct pending_block *old_blocks;
                    661:      CORE_ADDR start, end;
                    662: {
                    663:   register struct pending *next, *next1;
                    664:   register struct block *block;
                    665:   register struct pending_block *pblock;
                    666:   struct pending_block *opblock;
                    667:   register int i;
                    668: 
                    669:   /* Count the length of the list of symbols.  */
                    670: 
                    671:   for (next = *listhead, i = 0; next; i += next->nsyms, next = next->next);
                    672: 
                    673:   block = (struct block *) obstack_alloc (symbol_obstack,
                    674:                                          sizeof (struct block) + (i - 1) * sizeof (struct symbol *));
                    675: 
                    676:   /* Copy the symbols into the block.  */
                    677: 
                    678:   BLOCK_NSYMS (block) = i;
                    679:   for (next = *listhead; next; next = next->next)
                    680:     {
                    681:       register int j;
                    682:       for (j = next->nsyms - 1; j >= 0; j--)
                    683:        BLOCK_SYM (block, --i) = next->symbol[j];
                    684:     }
                    685: 
                    686:   BLOCK_START (block) = start;
                    687:   BLOCK_END (block) = end;
                    688:   BLOCK_SUPERBLOCK (block) = 0;        /* Filled in when containing block is made */
                    689: 
                    690:   /* Put the block in as the value of the symbol that names it.  */
                    691: 
                    692:   if (symbol)
                    693:     {
                    694:       SYMBOL_BLOCK_VALUE (symbol) = block;
                    695:       BLOCK_FUNCTION (block) = symbol;
                    696:     }
                    697:   else
                    698:     BLOCK_FUNCTION (block) = 0;
                    699: 
                    700:   /* Now "free" the links of the list, and empty the list.  */
                    701: 
                    702:   for (next = *listhead; next; next = next1)
                    703:     {
                    704:       next1 = next->next;
                    705:       next->next = free_pendings;
                    706:       free_pendings = next;
                    707:     }
                    708:   *listhead = 0;
                    709: 
                    710:   /* Install this block as the superblock
                    711:      of all blocks made since the start of this scope
                    712:      that don't have superblocks yet.  */
                    713: 
                    714:   opblock = 0;
                    715:   for (pblock = pending_blocks; pblock != old_blocks; pblock = pblock->next)
                    716:     {
                    717:       if (BLOCK_SUPERBLOCK (pblock->block) == 0)
                    718:        BLOCK_SUPERBLOCK (pblock->block) = block;
                    719:       opblock = pblock;
                    720:     }
                    721: 
                    722:   /* Record this block on the list of all blocks in the file.
                    723:      Put it after opblock, or at the beginning if opblock is 0.
                    724:      This puts the block in the list after all its subblocks.  */
                    725: 
                    726:   /* Allocate in the symbol_obstack to save time.
                    727:      It wastes a little space.  */
                    728:   pblock = (struct pending_block *) obstack_alloc (symbol_obstack,
                    729:                                                   sizeof (struct pending_block));
                    730:   pblock->block = block;
                    731:   if (opblock)
                    732:     {
                    733:       pblock->next = opblock->next;
                    734:       opblock->next = pblock;
                    735:     }
                    736:   else
                    737:     {
                    738:       pblock->next = pending_blocks;
                    739:       pending_blocks = pblock;
                    740:     }
                    741: }
                    742: 
                    743: static struct blockvector *
                    744: make_blockvector ()
                    745: {
                    746:   register struct pending_block *next, *next1;
                    747:   register struct blockvector *blockvector;
                    748:   register int i;
                    749: 
                    750:   /* Count the length of the list of blocks.  */
                    751: 
                    752:   for (next = pending_blocks, i = 0; next; next = next->next, i++);
                    753: 
                    754:   blockvector = (struct blockvector *) obstack_alloc (symbol_obstack, sizeof (struct blockvector) + (i - 1) * sizeof (struct block *));
                    755: 
                    756:   /* Copy the blocks into the blockvector.
                    757:      This is done in reverse order, which happens to put
                    758:      the blocks into the proper order (ascending starting address).
                    759:      finish_block has hair to insert each block into the list
                    760:      after its subblocks in order to make sure this is true.  */
                    761: 
                    762:   BLOCKVECTOR_NBLOCKS (blockvector) = i;
                    763:   for (next = pending_blocks; next; next = next->next)
                    764:     BLOCKVECTOR_BLOCK (blockvector, --i) = next->block;
                    765: 
                    766: #if 0 /* Now we make the links in the obstack, so don't free them.  */
                    767:   /* Now free the links of the list, and empty the list.  */
                    768: 
                    769:   for (next = pending_blocks; next; next = next1)
                    770:     {
                    771:       next1 = next->next;
                    772:       free (next);
                    773:     }
                    774: #endif
                    775:   pending_blocks = 0;
                    776: 
                    777:   return blockvector;
                    778: }
                    779: 
                    780: /* Manage the vector of line numbers.  */
                    781: 
                    782: static
                    783: record_line (line, pc)
                    784:      int line;
                    785:      CORE_ADDR pc;
                    786: {
                    787:   /* Ignore the dummy line number in libg.o */
                    788: 
                    789:   if (line == 0xffff)
                    790:     return;
                    791: 
                    792:   /* Make sure line vector is big enough.  */
                    793: 
                    794:   if (line_vector_index + 1 >= line_vector_length)
                    795:     {
                    796:       line_vector_length *= 2;
                    797:       line_vector = (struct linetable *)
                    798:        xrealloc (line_vector,
                    799:                  sizeof (struct linetable) + line_vector_length * sizeof (int));
                    800:       current_subfile->line_vector = line_vector;
                    801:     }
                    802: 
                    803:   /* If this line is not continguous with previous one recorded,
                    804:      record a line-number entry for it.  */
                    805:   if (line != prev_line_number + 1)
                    806:     line_vector->item[line_vector_index++] = - line;
                    807:   prev_line_number = line;
                    808: 
                    809:   /* Record the core address of the line.  */
                    810:   line_vector->item[line_vector_index++] = pc;
                    811: }
                    812: 
                    813: /* Start a new symtab for a new source file.
                    814:    This is called when a dbx symbol of type N_SO is seen;
                    815:    it indicates the start of data for one original source file.  */
                    816: 
                    817: static void
                    818: start_symtab (name, start_addr)
                    819:      char *name;
                    820:      CORE_ADDR start_addr;
                    821: {
                    822:   register struct symtab *s;
                    823: 
                    824:   last_source_file = name;
                    825:   last_source_start_addr = start_addr;
                    826:   file_symbols = 0;
                    827:   global_symbols = 0;
                    828:   within_function = 0;
                    829: 
                    830:   /* Context stack is initially empty, with room for 10 levels.  */
                    831:   context_stack
                    832:     = (struct context_stack *) xxmalloc (10 * sizeof (struct context_stack));
                    833:   context_stack_size = 10;
                    834:   context_stack_depth = 0;
                    835: 
                    836:   new_object_header_files ();
                    837: 
                    838:   for (s = symseg_chain; s; s = s->next)
                    839:     if (s->ldsymoff == symnum * sizeof (struct nlist))
                    840:       break;
                    841:   current_symseg = s;
                    842:   if (s != 0)
                    843:     return;
                    844: 
                    845:   type_vector_length = 160;
                    846:   type_vector = (struct typevector *) xxmalloc (sizeof (struct typevector) + type_vector_length * sizeof (struct type *));
                    847:   bzero (type_vector->type, type_vector_length * sizeof (struct type *));
                    848: 
                    849:   /* Initialize the list of sub source files with one entry
                    850:      for this file (the top-level source file).  */
                    851: 
                    852:   subfiles = 0;
                    853:   current_subfile = 0;
                    854:   start_subfile (name);
                    855: }
                    856: 
                    857: /* Handle an N_SOL symbol, which indicates the start of
                    858:    code that came from an included (or otherwise merged-in)
                    859:    source file with a different name.  */
                    860: 
                    861: static void
                    862: start_subfile (name)
                    863:      char *name;
                    864: {
                    865:   register struct subfile *subfile;
                    866: 
                    867:   /* Save the current subfile's line vector data.  */
                    868: 
                    869:   if (current_subfile)
                    870:     {
                    871:       current_subfile->line_vector_index = line_vector_index;
                    872:       current_subfile->line_vector_length = line_vector_length;
                    873:       current_subfile->prev_line_number = prev_line_number;
                    874:     }
                    875: 
                    876:   /* See if this subfile is already known as a subfile of the
                    877:      current main source file.  */
                    878: 
                    879:   for (subfile = subfiles; subfile; subfile = subfile->next)
                    880:     {
                    881:       if (!strcmp (subfile->name, name))
                    882:        {
                    883:          line_vector = subfile->line_vector;
                    884:          line_vector_index = subfile->line_vector_index;
                    885:          line_vector_length = subfile->line_vector_length;
                    886:          prev_line_number = subfile->prev_line_number;
                    887:          current_subfile = subfile;
                    888:          return;
                    889:        }
                    890:     }
                    891: 
                    892:   /* This subfile is not known.  Add an entry for it.  */
                    893: 
                    894:   line_vector_index = 0;
                    895:   line_vector_length = 1000;
                    896:   prev_line_number = -2;       /* Force first line number to be explicit */
                    897:   line_vector = (struct linetable *)
                    898:     xxmalloc (sizeof (struct linetable) + line_vector_length * sizeof (int));
                    899: 
                    900:   /* Make an entry for this subfile in the list of all subfiles
                    901:      of the current main source file.  */
                    902: 
                    903:   subfile = (struct subfile *) xxmalloc (sizeof (struct subfile));
                    904:   subfile->next = subfiles;
                    905:   subfile->name = savestring (name, strlen (name));
                    906:   subfile->line_vector = line_vector;
                    907:   subfiles = subfile;
                    908:   current_subfile = subfile;
                    909: }
                    910: 
                    911: /* Finish the symbol definitions for one main source file,
                    912:    close off all the lexical contexts for that file
                    913:    (creating struct block's for them), then make the struct symtab
                    914:    for that file and put it in the list of all such.
                    915: 
                    916:    END_ADDR is the address of the end of the file's text.  */
                    917: 
                    918: static void
                    919: end_symtab (end_addr)
                    920:      CORE_ADDR end_addr;
                    921: {
                    922:   register struct symtab *symtab;
                    923:   register struct blockvector *blockvector;
                    924:   register struct subfile *subfile;
                    925:   register struct linetable *lv;
                    926:   struct subfile *nextsub;
                    927: 
                    928:   if (current_symseg != 0)
                    929:     {
                    930:       last_source_file = 0;
                    931:       current_symseg = 0;
                    932:       return;
                    933:     }
                    934: 
                    935:   /* Finish the lexical context of the last function in the file;
                    936:      pop the context stack.  */
                    937: 
                    938:   if (context_stack_depth > 0)
                    939:     {
                    940:       register struct context_stack *cstk;
                    941:       context_stack_depth--;
                    942:       cstk = &context_stack[context_stack_depth];
                    943:       /* Make a block for the local symbols within.  */
                    944:       finish_block (cstk->name, &local_symbols, cstk->old_blocks,
                    945:                    cstk->start_addr, end_addr);
                    946:     }
                    947: 
                    948:   /* Finish defining all the blocks of this symtab.  */
                    949:   finish_block (0, &file_symbols, 0, last_source_start_addr, end_addr);
                    950:   finish_block (0, &global_symbols, 0, last_source_start_addr, end_addr);
                    951:   blockvector = make_blockvector ();
                    952: 
                    953:   current_subfile->line_vector_index = line_vector_index;
                    954: 
                    955:   /* Now create the symtab objects proper, one for each subfile.  */
                    956:   /* (The main file is one of them.)  */
                    957: 
                    958:   for (subfile = subfiles; subfile; subfile = nextsub)
                    959:     {
                    960:       symtab = (struct symtab *) xxmalloc (sizeof (struct symtab));
                    961:       symtab->free_ptr = 0;
                    962: 
                    963:       /* Fill in its components.  */
                    964:       symtab->blockvector = blockvector;
                    965:       type_vector->length = type_vector_length;
                    966:       symtab->typevector = type_vector;
                    967:       symtab->free_code = free_linetable;
                    968:       if (subfile->next == 0)
                    969:        symtab->free_ptr = (char *) type_vector;
                    970: 
                    971:       symtab->filename = subfile->name;
                    972:       lv = subfile->line_vector;
                    973:       lv->nitems = subfile->line_vector_index;
                    974:       symtab->linetable = (struct linetable *)
                    975:        xrealloc (lv, sizeof (struct linetable) + lv->nitems * sizeof (int));
                    976:       symtab->nlines = 0;
                    977:       symtab->line_charpos = 0;
                    978: 
                    979:       /* Link the new symtab into the list of such.  */
                    980:       symtab->next = symtab_list;
                    981:       symtab_list = symtab;
                    982: 
                    983:       nextsub = subfile->next;
                    984:       free (subfile);
                    985:     }
                    986: 
                    987:   type_vector = 0;
                    988:   type_vector_length = -1;
                    989:   line_vector = 0;
                    990:   line_vector_length = -1;
                    991:   last_source_file = 0;
                    992: }
                    993: 
                    994: #ifdef N_BINCL
                    995: 
                    996: /* Handle the N_BINCL and N_EINCL symbol types
                    997:    that act like N_SOL for switching source files
                    998:    (different subfiles, as we call them) within one object file,
                    999:    but using a stack rather than in an arbitrary order.  */
                   1000: 
                   1001: struct subfile_stack
                   1002: {
                   1003:   struct subfile_stack *next;
                   1004:   char *name;
                   1005:   int prev_index;
                   1006: };
                   1007: 
                   1008: struct subfile_stack *subfile_stack;
                   1009: 
                   1010: static void
                   1011: push_subfile ()
                   1012: {
                   1013:   register struct subfile_stack *tem
                   1014:     = (struct subfile_stack *) xxmalloc (sizeof (struct subfile_stack));
                   1015: 
                   1016:   tem->next = subfile_stack;
                   1017:   subfile_stack = tem;
                   1018:   if (current_subfile == 0 || current_subfile->name == 0)
                   1019:     abort ();
                   1020:   tem->name = current_subfile->name;
                   1021:   tem->prev_index = header_file_prev_index;
                   1022: }
                   1023: 
                   1024: static char *
                   1025: pop_subfile ()
                   1026: {
                   1027:   register char *name;
                   1028:   register struct subfile_stack *link = subfile_stack;
                   1029: 
                   1030:   if (link == 0)
                   1031:     abort ();
                   1032: 
                   1033:   name = link->name;
                   1034:   subfile_stack = link->next;
                   1035:   header_file_prev_index = link->prev_index;
                   1036:   free (link);
                   1037: 
                   1038:   return name;
                   1039: }
                   1040: #endif /* Have N_BINCL */
                   1041: 
                   1042: /* Accumulate the misc functions in bunches of 127.
                   1043:    At the end, copy them all into one newly allocated structure.  */
                   1044: 
                   1045: #define MISC_BUNCH_SIZE 127
                   1046: 
                   1047: struct misc_bunch
                   1048: {
                   1049:   struct misc_bunch *next;
                   1050:   struct misc_function contents[MISC_BUNCH_SIZE];
                   1051: };
                   1052: 
                   1053: /* Bunch currently being filled up.
                   1054:    The next field points to chain of filled bunches.  */
                   1055: 
                   1056: static struct misc_bunch *misc_bunch;
                   1057: 
                   1058: /* Number of slots filled in current bunch.  */
                   1059: 
                   1060: static int misc_bunch_index;
                   1061: 
                   1062: /* Total number of misc functions recorded so far.  */
                   1063: 
                   1064: static int misc_count;
                   1065: 
                   1066: static void
                   1067: init_misc_functions ()
                   1068: {
                   1069:   misc_count = 0;
                   1070:   misc_bunch = 0;
                   1071:   misc_bunch_index = MISC_BUNCH_SIZE;
                   1072: }
                   1073: 
                   1074: static void
                   1075: record_misc_function (name, address)
                   1076:      char *name;
                   1077:      CORE_ADDR address;
                   1078: {
                   1079:   register struct misc_bunch *new;
                   1080: 
                   1081:   if (misc_bunch_index == MISC_BUNCH_SIZE)
                   1082:     {
                   1083:       new = (struct misc_bunch *) xxmalloc (sizeof (struct misc_bunch));
                   1084:       misc_bunch_index = 0;
                   1085:       new->next = misc_bunch;
                   1086:       misc_bunch = new;
                   1087:     }
                   1088:   misc_bunch->contents[misc_bunch_index].name = name;
                   1089:   misc_bunch->contents[misc_bunch_index].address = address;
                   1090:   misc_bunch_index++;
                   1091:   misc_count++;
                   1092: }
                   1093: 
                   1094: static int
                   1095: compare_misc_functions (fn1, fn2)
                   1096:      struct misc_function *fn1, *fn2;
                   1097: {
                   1098:   /* Return a signed result based on unsigned comparisons
                   1099:      so that we sort into unsigned numeric order.  */
                   1100:   if (fn1->address < fn2->address)
                   1101:     return -1;
                   1102:   if (fn1->address > fn2->address)
                   1103:     return 1;
                   1104:   return 0;
                   1105: }
                   1106: 
                   1107: static void
                   1108: discard_misc_bunches ()
                   1109: {
                   1110:   register struct misc_bunch *next;
                   1111: 
                   1112:   while (misc_bunch)
                   1113:     {
                   1114:       next = misc_bunch->next;
                   1115:       free (misc_bunch);
                   1116:       misc_bunch = next;
                   1117:     }
                   1118: }
                   1119: 
                   1120: static void
                   1121: condense_misc_bunches ()
                   1122: {
                   1123:   register int i, j;
                   1124:   register struct misc_bunch *bunch;
                   1125: #ifdef NAMES_HAVE_UNDERSCORE
                   1126:   int offset = 1;
                   1127: #else
                   1128:   int offset = 0;
                   1129: #endif
                   1130: 
                   1131:   misc_function_vector
                   1132:     = (struct misc_function *)
                   1133:       xxmalloc (misc_count * sizeof (struct misc_function));
                   1134: 
                   1135:   j = 0;
                   1136:   bunch = misc_bunch;
                   1137:   while (bunch)
                   1138:     {
                   1139:       for (i = 0; i < misc_bunch_index; i++)
                   1140:        {
                   1141:          misc_function_vector[j] = bunch->contents[i];
                   1142:          misc_function_vector[j].name
                   1143:            = obconcat (misc_function_vector[j].name
                   1144:                        + (misc_function_vector[j].name[0] == '_' ? offset : 0),
                   1145:                        "", "");
                   1146:          j++;
                   1147:        }
                   1148:       bunch = bunch->next;
                   1149:       misc_bunch_index = MISC_BUNCH_SIZE;
                   1150:     }
                   1151: 
                   1152:   misc_function_count = j;
                   1153: 
                   1154:   /* Sort the misc functions by address.  */
                   1155: 
                   1156:   qsort (misc_function_vector, j, sizeof (struct misc_function),
                   1157:         compare_misc_functions);
                   1158: }
                   1159: 
                   1160: /* Call sort_syms to sort alphabetically
                   1161:    the symbols of each block of each symtab.  */
                   1162: 
                   1163: static int
                   1164: compare_symbols (s1, s2)
                   1165:      struct symbol **s1, **s2;
                   1166: {
                   1167:   register int namediff;
                   1168: 
                   1169:   /* Compare the initial characters.  */
                   1170:   namediff = SYMBOL_NAME (*s1)[0] - SYMBOL_NAME (*s2)[0];
                   1171:   if (namediff != 0) return namediff;
                   1172: 
                   1173:   /* If they match, compare the rest of the names.  */
                   1174:   namediff = strcmp (SYMBOL_NAME (*s1), SYMBOL_NAME (*s2));
                   1175:   if (namediff != 0) return namediff;
                   1176: 
                   1177:   /* For symbols of the same name, registers should come first.  */
                   1178:   return ((SYMBOL_CLASS (*s2) == LOC_REGISTER)
                   1179:          - (SYMBOL_CLASS (*s1) == LOC_REGISTER));
                   1180: }
                   1181: 
                   1182: static void
                   1183: sort_syms ()
                   1184: {
                   1185:   register struct symtab *s;
                   1186:   int i, nbl;
                   1187:   register struct blockvector *bv;
                   1188:   register struct block *b;
                   1189: 
                   1190:   for (s = symtab_list; s; s = s->next)
                   1191:     {
                   1192:       bv = BLOCKVECTOR (s);
                   1193:       nbl = BLOCKVECTOR_NBLOCKS (bv);
                   1194:       for (i = 0; i < nbl; i++)
                   1195:        {
                   1196:          b = BLOCKVECTOR_BLOCK (bv, i);
                   1197:          if (BLOCK_SHOULD_SORT (b))
                   1198:            qsort (&BLOCK_SYM (b, 0), BLOCK_NSYMS (b),
                   1199:                   sizeof (struct symbol *), compare_symbols);
                   1200:          else
                   1201:            {
                   1202:              int lastindex = BLOCK_NSYMS (b) - 1;
                   1203:              register int j;
                   1204:              for (j = (lastindex - 1) / 2; j >= 0; j--)
                   1205:                {
                   1206:                  register struct symbol *sym;
                   1207:                  sym = BLOCK_SYM (b, j);
                   1208:                  BLOCK_SYM (b, j) = BLOCK_SYM (b, lastindex - j);
                   1209:                  BLOCK_SYM (b, lastindex - j) = sym;
                   1210:                }
                   1211:            }
                   1212:        }
                   1213:     }
                   1214: }
                   1215: 
                   1216: /* This is the symbol-file command.  Read the file, analyze its symbols,
                   1217:    and add a struct symtab to symtab_list.  */
                   1218: 
                   1219: void
                   1220: symbol_file_command (name)
                   1221:      char *name;
                   1222: {
                   1223:   register int desc;
                   1224:   DECLARE_FILE_HEADERS;
                   1225:   struct nlist *nlist;
                   1226:   char *stringtab;
                   1227:   long buffer;
                   1228:   register int val;
                   1229:   extern void close ();
                   1230:   struct cleanup *old_chain;
                   1231:   struct symtab *symseg;
                   1232:   struct stat statbuf;
                   1233: 
                   1234:   dont_repeat ();
                   1235: 
                   1236:   if (name == 0)
                   1237:     {
                   1238:       if (symtab_list && !query ("Discard symbol table? ", 0))
                   1239:        error ("Not confirmed.");
                   1240:       free_all_symtabs ();
                   1241:       return;
                   1242:     }
                   1243: 
                   1244:   if (symtab_list && !query ("Load new symbol table from \"%s\"? ", name))
                   1245:     error ("Not confirmed.");
                   1246: 
                   1247:   {
                   1248:     char *absolute_name;
                   1249:     desc = openp (getenv ("PATH"), 1, name, O_RDONLY, 0, &absolute_name);
                   1250:     if (desc < 0)
                   1251:       perror_with_name (name);
                   1252:     else
                   1253:       name = absolute_name;
                   1254:   }
                   1255: 
                   1256:   old_chain = make_cleanup (close, desc);
                   1257:   make_cleanup (free_current_contents, &name);
                   1258: 
                   1259:   READ_FILE_HEADERS (desc, name);
                   1260: 
                   1261:   if (NUMBER_OF_SYMBOLS == 0)
                   1262:     {
                   1263:       if (symfile)
                   1264:        free (symfile);
                   1265:       symfile = 0;
                   1266:       free_all_symtabs ();
                   1267:       printf ("%s has no symbol-table; symbols discarded.\n", name);
                   1268:       fflush (stdout);
                   1269:       return;
                   1270:     }
                   1271: 
                   1272:   printf ("Reading symbol data from %s...", name);
                   1273:   fflush (stdout);
                   1274: 
                   1275:   /* Now read the string table, all at once.  */
                   1276:   val = lseek (desc, STRING_TABLE_OFFSET, 0);
                   1277:   if (val < 0)
                   1278:     perror_with_name (name);
                   1279:   stat (name, &statbuf);
                   1280:   READ_STRING_TABLE_SIZE (buffer);
                   1281:   if (buffer >= 0 && buffer < statbuf.st_size)
                   1282:     stringtab = (char *) alloca (buffer);
                   1283:   else
                   1284:     stringtab = NULL;
                   1285:   if (stringtab == NULL)
                   1286:     error ("ridiculous string table size: %d bytes", name, buffer);
                   1287: 
                   1288:   bcopy (&buffer, stringtab, sizeof buffer);
                   1289:   val = myread (desc, stringtab + sizeof buffer, buffer - sizeof buffer);
                   1290:   if (val < 0)
                   1291:     perror_with_name (name);
                   1292: 
                   1293:   /* Throw away the old symbol table.  */
                   1294: 
                   1295:   if (symfile)
                   1296:     free (symfile);
                   1297:   symfile = 0;
                   1298:   free_all_symtabs ();
                   1299: 
                   1300:   /* Empty the hash table of global syms looking for values.  */
                   1301:   bzero (global_sym_chain, sizeof global_sym_chain);
                   1302: 
                   1303: #ifdef READ_GDB_SYMSEGS
                   1304:   /* That puts us at the symsegs.  Read them.  */
                   1305:   symseg_chain = read_symsegs (desc, name);
                   1306:   hash_symsegs ();
                   1307: 
                   1308:   /* Free the symtabs made by read_symsegs, but not their contents,
                   1309:      which have been copied into symtabs on symtab_list.  */
                   1310:   for (symseg = symseg_chain; symseg; symseg = symseg->next)
                   1311:     {
                   1312:       int i;
                   1313:       struct sourcevector *sv = (struct sourcevector *) symseg->linetable;
                   1314: 
                   1315:       for (i = 0; i < sv->length; i++)
                   1316:        {
                   1317:          int j;
                   1318:          struct source *source = sv->source[i];
                   1319:          struct symtab *sp1
                   1320:            = (struct symtab *) xxmalloc (sizeof (struct symtab));
                   1321: 
                   1322:          bcopy (symseg, sp1, sizeof (struct symtab));
                   1323:          sp1->filename = savestring (source->name, strlen (source->name));
                   1324:          sp1->linetable = &source->contents;
                   1325:          sp1->free_code = free_nothing;
                   1326:          sp1->free_ptr = (i == 0) ? (char *) symseg : 0;
                   1327: 
                   1328:          sp1->next = symtab_list;
                   1329:          symtab_list = sp1;
                   1330:        }
                   1331:     }
                   1332: #else
                   1333:   /* Where people are using the 4.2 ld program, must not check for
                   1334:      symsegs, because that ld puts randonm garbage at the end of
                   1335:      the output file and that would trigger an error message.  */
                   1336:   symseg_chain = 0;
                   1337: #endif
                   1338: 
                   1339:   /* Position to read the symbol table.  Do not read it all at once. */
                   1340:   val = lseek (desc, SYMBOL_TABLE_OFFSET, 0);
                   1341:   if (val < 0)
                   1342:     perror_with_name (name);
                   1343: 
                   1344:   init_misc_functions ();
                   1345:   make_cleanup (discard_misc_bunches, 0);
                   1346:   init_header_files ();
                   1347:   make_cleanup (free_header_files, 0);
                   1348:   free_pendings = 0;
                   1349:   pending_blocks = 0;
                   1350:   file_symbols = 0;
                   1351:   global_symbols = 0;
                   1352:   make_cleanup (really_free_pendings, 0);
                   1353: 
                   1354:   /* Now that the symbol table data of the executable file are all in core,
                   1355:      process them and define symbols accordingly.  Closes desc.  */
                   1356: 
                   1357:   read_dbx_symtab (desc, stringtab, NUMBER_OF_SYMBOLS);
                   1358:   close (desc);
                   1359: 
                   1360:   /* Sort symbols alphabetically within each block.  */
                   1361: 
                   1362:   sort_syms ();
                   1363: 
                   1364:   /* Go over the misc functions and install them in vector.  */
                   1365: 
                   1366:   condense_misc_bunches ();
                   1367: 
                   1368:   /* Don't allow char * to have a typename (else would get caddr_t.)  */
                   1369: 
                   1370:   TYPE_NAME (lookup_pointer_type (builtin_type_char)) = 0;
                   1371: 
                   1372:   /* Make a default for file to list.  */
                   1373: 
                   1374:   select_source_symtab (symtab_list);
                   1375: 
                   1376:   symfile = savestring (name, strlen (name));
                   1377: 
                   1378:   do_cleanups (old_chain);
                   1379: 
                   1380:   /* Free the symtabs made by read_symsegs, but not their contents,
                   1381:      which have been copied into symtabs on symtab_list.  */
                   1382:   while (symseg_chain)
                   1383:     {
                   1384:       register struct symtab *s = symseg_chain->next;
                   1385:       free (symseg_chain);
                   1386:       symseg_chain = s;
                   1387:     }
                   1388: 
                   1389:   printf ("done.\n");
                   1390:   fflush (stdout);
                   1391: }
                   1392: 
                   1393: /* Return name of file symbols were loaded from, or 0 if none..  */
                   1394: 
                   1395: char *
                   1396: get_sym_file ()
                   1397: {
                   1398:   return symfile;
                   1399: }
                   1400: 
                   1401: /* Buffer for reading the symbol table entries.  */
                   1402: static struct nlist symbuf[2048];
                   1403: static int symbuf_idx;
                   1404: static int symbuf_end;
                   1405: 
                   1406: /* I/O descriptor for reading the symbol table.  */
                   1407: static int symtab_input_desc;
                   1408: 
                   1409: /* The address of the string table
                   1410:    of the object file we are reading (as copied into core).  */
                   1411: static char *stringtab_global;
                   1412: 
                   1413: /* Refill the symbol table input buffer
                   1414:    and set the variables that control fetching entries from it.
                   1415:    Reports an error if no data available.
                   1416:    This function can read past the end of the symbol table
                   1417:    (into the string table) but this does no harm.  */
                   1418: 
                   1419: static int
                   1420: fill_symbuf ()
                   1421: {
                   1422:   int nbytes = myread (symtab_input_desc, symbuf, sizeof (symbuf));
                   1423:   if (nbytes <= 0)
                   1424:     error ("error or end of file reading symbol table");
                   1425:   symbuf_end = nbytes / sizeof (struct nlist);
                   1426:   symbuf_idx = 0;
                   1427:   return 1;
                   1428: }
                   1429: 
                   1430: /* dbx allows the text of a symbol name to be continued into the
                   1431:    next symbol name!  When such a continuation is encountered
                   1432:    (a \ at the end of the text of a name)
                   1433:    call this function to get the continuation.  */
                   1434: 
                   1435: static char *
                   1436: next_symbol_text ()
                   1437: {
                   1438:   if (symbuf_idx == symbuf_end)
                   1439:     fill_symbuf ();
                   1440:   symnum++;
                   1441:   return symbuf[symbuf_idx++].n_un.n_strx + stringtab_global;
                   1442: }
                   1443: 
                   1444: /* Given pointers to a a.out symbol table in core containing  dbx style data,
                   1445:    analyze them and create struct symtab's describing the symbols.
                   1446:    NLISTLEN is the number of symbols in the symbol table.
                   1447:    We read them one at a time using stdio.
                   1448:    All symbol names are given as offsets relative to STRINGTAB.  */
                   1449: 
                   1450: static void
                   1451: read_dbx_symtab (desc, stringtab, nlistlen)
                   1452:      int desc;
                   1453:      register char *stringtab;
                   1454:      register int nlistlen;
                   1455: {
                   1456:   register char *namestring;
                   1457:   register struct symbol *sym, *prev;
                   1458:   int hash;
                   1459:   int num_object_files = 0;
                   1460:   struct cleanup *old_chain;
                   1461: 
                   1462: #ifdef N_BINCL
                   1463:   subfile_stack = 0;
                   1464: #endif
                   1465: 
                   1466:   old_chain = make_cleanup (free_all_symtabs, 0);
                   1467:   stringtab_global = stringtab;
                   1468:   last_source_file = 0;
                   1469: 
                   1470: #ifdef END_OF_TEXT_DEFAULT
                   1471:   end_of_text_addr = END_OF_TEXT_DEFAULT;
                   1472: #endif
                   1473: 
                   1474:   symtab_input_desc = desc;
                   1475:   symbuf_end = symbuf_idx = 0;
                   1476: 
                   1477:   for (symnum = 0; symnum < nlistlen; symnum++)
                   1478:     {
                   1479:       struct nlist *bufp;
                   1480:       int type;
                   1481: 
                   1482:       QUIT;    /* allow this to be interruptable */
                   1483:       if (symbuf_idx == symbuf_end)
                   1484:        fill_symbuf ();
                   1485:       bufp = &symbuf[symbuf_idx++];
                   1486:       type = bufp->n_type;
                   1487:       namestring = bufp->n_un.n_strx ? bufp->n_un.n_strx + stringtab : "";
                   1488: 
                   1489:       if (type & N_STAB)
                   1490:        process_one_symbol (type, bufp->n_desc,
                   1491:                            bufp->n_value, namestring);
                   1492:       /* A static text symbol whose name ends in ".o"
                   1493:         or begins with "-l" means the start of another object file.
                   1494:         So end the symtab of the source file we have been processing.
                   1495:         This is how we avoid counting the libraries as part
                   1496:         or the last source file.
                   1497:         Also this way we find end of first object file (crt0).  */
                   1498:       else if (
                   1499: #ifdef N_NBTEXT
                   1500:               (type == N_NBTEXT)
                   1501: #else
                   1502:               (type == N_TEXT)
                   1503: #endif
                   1504:               && (!strcmp (namestring + strlen (namestring) - 2, ".o")
                   1505:               ||  !strncmp (namestring, "-l", 2)))
                   1506:        {
                   1507:          if (num_object_files++ == 1)
                   1508:            first_object_file_end = bufp->n_value;
                   1509:          if (last_source_file)
                   1510:            end_symtab (bufp->n_value);
                   1511:        }
                   1512:       else if (type & N_EXT || type == N_TEXT
                   1513: #ifdef N_NBTEXT
                   1514:               || type == N_NBTEXT
                   1515: #endif
                   1516:               )
                   1517:        {
                   1518:          int used_up = 0;
                   1519: 
                   1520:          /* Record the location of _etext.  */
                   1521:          if (type == (N_TEXT | N_EXT)
                   1522:              && !strcmp (namestring, "_etext"))
                   1523:            end_of_text_addr = bufp->n_value;
                   1524: 
                   1525:          /* Global symbol: see if we came across a dbx definition
                   1526:             for a corresponding symbol.  If so, store the value.
                   1527:             Remove syms from the chain when their values are stored,
                   1528:             but search the whole chain, as there may be several syms
                   1529:             from different files with the same name.  */
                   1530:          if (type & N_EXT)
                   1531:            {
                   1532:              prev = 0;
                   1533: #ifdef NAMES_HAVE_UNDERSCORE
                   1534:              hash = hashname (namestring + 1);
                   1535: #else /* not NAMES_HAVE_UNDERSCORE */
                   1536:              hash = hashname (namestring);
                   1537: #endif /* not NAMES_HAVE_UNDERSCORE */
                   1538:              for (sym = global_sym_chain[hash];
                   1539:                   sym;)
                   1540:                {
                   1541:                  if (
                   1542: #ifdef NAMES_HAVE_UNDERSCORE
                   1543:                      *namestring == '_'
                   1544:                      && namestring[1] == SYMBOL_NAME (sym)[0]
                   1545:                      &&
                   1546:                      !strcmp (namestring + 2, SYMBOL_NAME (sym) + 1)
                   1547: #else /* NAMES_HAVE_UNDERSCORE */
                   1548:                      namestring[0] == SYMBOL_NAME (sym)[0]
                   1549:                      &&
                   1550:                      !strcmp (namestring + 1, SYMBOL_NAME (sym) + 1)
                   1551: #endif /* NAMES_HAVE_UNDERSCORE */
                   1552:                      )
                   1553:                    {
                   1554:                      if (prev)
                   1555:                        SYMBOL_VALUE (prev) = SYMBOL_VALUE (sym);
                   1556:                      else
                   1557:                        global_sym_chain[hash]
                   1558:                          = (struct symbol *) SYMBOL_VALUE (sym);
                   1559:                      SYMBOL_VALUE (sym) = bufp->n_value;
                   1560:                      if (prev)
                   1561:                        sym = (struct symbol *) SYMBOL_VALUE (prev);
                   1562:                      else
                   1563:                        sym = global_sym_chain[hash];
                   1564: 
                   1565:                      used_up = 1;
                   1566:                    }
                   1567:                  else
                   1568:                    {
                   1569:                      prev = sym;
                   1570:                      sym = (struct symbol *) SYMBOL_VALUE (sym);
                   1571:                    }
                   1572:                }
                   1573:            }
                   1574: 
                   1575:          /* Defined global or text symbol: record as a misc function
                   1576:             if it didn't give its address to a debugger symbol above.  */
                   1577:          if (type <= (N_TYPE | N_EXT)
                   1578:              && type != N_EXT
                   1579:              && ! used_up)
                   1580:            record_misc_function (namestring, bufp->n_value);
                   1581:        }
                   1582:     }
                   1583: 
                   1584:   if (last_source_file)
                   1585:     end_symtab (end_of_text_addr);
                   1586: 
                   1587:   discard_cleanups (old_chain);
                   1588: }
                   1589: 
                   1590: static int
                   1591: hashname (name)
                   1592:      char *name;
                   1593: {
                   1594:   register char *p = name;
                   1595:   register int total = p[0];
                   1596:   register int c;
                   1597: 
                   1598:   c = p[1];
                   1599:   total += c << 2;
                   1600:   if (c)
                   1601:     {
                   1602:       c = p[2];
                   1603:       total += c << 4;
                   1604:       if (c)
                   1605:        total += p[3] << 6;
                   1606:     }
                   1607: 
                   1608:   /* Ensure result is positive.  */
                   1609:   if (total < 0) total += (1000 << 6);
                   1610:   return total % HASHSIZE;
                   1611: }
                   1612: 
                   1613: /* Put all appropriate global symbols in the symseg data
                   1614:    onto the hash chains so that their addresses will be stored
                   1615:    when seen later in loader global symbols.  */
                   1616: 
                   1617: static void
                   1618: hash_symsegs ()
                   1619: {
                   1620:   /* Look at each symbol in each block in each symseg symtab.  */
                   1621:   struct symtab *s;
                   1622:   for (s = symseg_chain; s; s = s->next)
                   1623:     {
                   1624:       register int n;
                   1625:       for (n = BLOCKVECTOR_NBLOCKS (BLOCKVECTOR (s)) - 1; n >= 0; n--)
                   1626:        {
                   1627:          register struct block *b = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), n);
                   1628:          register int i;
                   1629:          for (i = BLOCK_NSYMS (b) - 1; i >= 0; i--)
                   1630:            {
                   1631:              register struct symbol *sym = BLOCK_SYM (b, i);
                   1632: 
                   1633:              /* Put the symbol on a chain if its value is an address
                   1634:                 that is figured out by the loader.  */
                   1635: 
                   1636:              if (SYMBOL_CLASS (sym) == LOC_EXTERNAL)
                   1637:                {
                   1638:                  register int hash = hashname (SYMBOL_NAME (sym));
                   1639:                  SYMBOL_VALUE (sym) = (int) global_sym_chain[hash];
                   1640:                  global_sym_chain[hash] = sym;
                   1641:                  SYMBOL_CLASS (sym) = LOC_STATIC;
                   1642:                }
                   1643:            }
                   1644:        }
                   1645:     }
                   1646: }
                   1647: 
                   1648: static void
                   1649: process_one_symbol (type, desc, value, name)
                   1650:      int type, desc;
                   1651:      CORE_ADDR value;
                   1652:      char *name;
                   1653: {
                   1654:   register struct context_stack *new;
                   1655: 
                   1656:   /* Something is wrong if we see real data before
                   1657:      seeing a source file name.  */
                   1658: 
                   1659:   if (last_source_file == 0 && type != N_SO)
                   1660:     {
                   1661: #ifdef N_NSYMS
                   1662:       /* This code is used on Ultrix; ignore this sym.  */
                   1663:       if (type == N_NSYMS)
                   1664:        return;
                   1665: #endif
                   1666: 
                   1667:       if (type == N_ENTRY)
                   1668:        /* This code appears in libraries on Gould machines.  */
                   1669:        return;
                   1670:       error ("Invalid symbol data: does not start by identifying a source file.");
                   1671:     }
                   1672: 
                   1673:   switch (type)
                   1674:     {
                   1675:     case N_FUN:
                   1676:     case N_FNAME:
                   1677:       /* Either of these types of symbols indicates the start of
                   1678:         a new function.  We must process its "name" normally for dbx,
                   1679:         but also record the start of a new lexical context, and possibly
                   1680:         also the end of the lexical context for the previous function.  */
                   1681:       
                   1682:       within_function = 1;
                   1683:       if (context_stack_depth > 0)
                   1684:        {
                   1685:          new = &context_stack[--context_stack_depth];
                   1686:          /* Make a block for the local symbols within.  */
                   1687:          finish_block (new->name, &local_symbols, new->old_blocks,
                   1688:                        new->start_addr, value);
                   1689:        }
                   1690:       /* Stack must be empty now.  */
                   1691:       if (context_stack_depth != 0)
                   1692:        error ("Invalid symbol data: unmatched N_LBRAC before symtab pos %d.",
                   1693:               symnum);
                   1694: 
                   1695:       new = &context_stack[context_stack_depth++];
                   1696:       new->old_blocks = pending_blocks;
                   1697:       new->start_addr = value;
                   1698:       new->name = define_symbol (value, name, desc);
                   1699:       local_symbols = 0;
                   1700:       break;
                   1701: 
                   1702:     case N_LBRAC:
                   1703:       /* This "symbol" just indicates the start of an inner lexical
                   1704:         context within a function.  */
                   1705: 
                   1706:       if (context_stack_depth == context_stack_size)
                   1707:        {
                   1708:          context_stack_size *= 2;
                   1709:          context_stack
                   1710:            = (struct context_stack *) xrealloc (context_stack,
                   1711:                                                 context_stack_size
                   1712:                                                 * sizeof (struct context_stack));
                   1713:        }
                   1714: 
                   1715:       new = &context_stack[context_stack_depth++];
                   1716:       new->depth = desc;
                   1717:       new->locals = local_symbols;
                   1718:       new->old_blocks = pending_blocks;
                   1719:       new->start_addr = value;
                   1720:       new->name = 0;
                   1721:       local_symbols = 0;
                   1722:       break;
                   1723: 
                   1724:     case N_RBRAC:
                   1725:       /* This "symbol" just indicates the end of an inner lexical
                   1726:         context that was started with N_RBRAC.  */
                   1727:       new = &context_stack[--context_stack_depth];
                   1728:       if (desc != new->depth)
                   1729:        error ("Invalid symbol data: N_LBRAC/N_RBRAC symbol mismatch, symtab pos %d.", symnum);
                   1730:       local_symbols = new->locals;
                   1731: 
                   1732:       /* If this is not the outermost LBRAC...RBRAC pair in the
                   1733:         function, its local symbols preceded it, and are the ones
                   1734:         just recovered from the context stack.  Defined the block for them.
                   1735: 
                   1736:         If this is the outermost LBRAC...RBRAC pair, there is no
                   1737:         need to do anything; leave the symbols that preceded it
                   1738:         to be attached to the function's own block.  */
                   1739:       if (local_symbols && context_stack_depth > 1)
                   1740:        {
                   1741:          /* Muzzle a compiler bug that makes end > start.  */
                   1742:          if (new->start_addr > value)
                   1743:            new->start_addr = value;
                   1744:          /* Make a block for the local symbols within.  */
                   1745:          finish_block (0, &local_symbols, new->old_blocks,
                   1746:                        new->start_addr + last_source_start_addr,
                   1747:                        value + last_source_start_addr);
                   1748:        }
                   1749:       break;
                   1750: 
                   1751:     case N_FN:
                   1752:       /* This kind of symbol supposedly indicates the start
                   1753:         of an object file.  In fact this type does not appear.  */
                   1754:       break;
                   1755: 
                   1756:     case N_SO:
                   1757:       /* This type of symbol indicates the start of data
                   1758:         for one source file.
                   1759:         Finish the symbol table of the previous source file
                   1760:         (if any) and start accumulating a new symbol table.  */
                   1761:       if (last_source_file)
                   1762:        end_symtab (value);
                   1763:       start_symtab (name, value);
                   1764:       break;
                   1765: 
                   1766:     case N_SOL:
                   1767:       /* This type of symbol indicates the start of data for
                   1768:         a sub-source-file, one whose contents were copied or
                   1769:         included in the compilation of the main source file
                   1770:         (whose name was given in the N_SO symbol.)  */
                   1771:       start_subfile (name);
                   1772:       break;
                   1773: 
                   1774: #ifdef N_BINCL
                   1775:     case N_BINCL:
                   1776:       push_subfile ();
                   1777:       add_new_header_file (name, value);
                   1778:       start_subfile (name);
                   1779:       break;
                   1780: 
                   1781:     case N_EINCL:
                   1782:       start_subfile (pop_subfile ());
                   1783:       break;
                   1784: 
                   1785:     case N_EXCL:
                   1786:       add_old_header_file (name, value);
                   1787:       break;
                   1788: #endif /* have N_BINCL */
                   1789: 
                   1790:     case N_SLINE:
                   1791:       /* This type of "symbol" really just records
                   1792:         one line-number -- core-address correspondence.
                   1793:         Enter it in the line list for this symbol table.  */
                   1794:       record_line (desc, value);
                   1795:       break;
                   1796: 
                   1797:     case N_BCOMM:
                   1798:     case N_ECOMM:
                   1799:     case N_ECOML:
                   1800:     case N_LENG:
                   1801:       break;
                   1802: 
                   1803:     default:
                   1804:       if (name)
                   1805:        define_symbol (value, name, desc);
                   1806:     }
                   1807: }
                   1808: 
                   1809: static struct symbol *
                   1810: define_symbol (value, string, desc)
                   1811:      int value;
                   1812:      char *string;
                   1813:      int desc;
                   1814: {
                   1815:   register struct symbol *sym
                   1816:     = (struct symbol *) obstack_alloc (symbol_obstack, sizeof (struct symbol));
                   1817:   char *p = (char *) index (string, ':');
                   1818:   int deftype;
                   1819:   register int i;
                   1820: 
                   1821:   /* Ignore syms with empty names.  */
                   1822:   if (string[0] == 0)
                   1823:     return 0;
                   1824: 
                   1825:   SYMBOL_NAME (sym)
                   1826:     = (char *) obstack_alloc (symbol_obstack, ((p - string) + 1));
                   1827:   /* Open-coded bcopy--saves function call time.  */
                   1828:   {
                   1829:     register char *p1 = string;
                   1830:     register char *p2 = SYMBOL_NAME (sym);
                   1831:     while (p1 != p)
                   1832:       *p2++ = *p1++;
                   1833:     *p2++ = '\0';
                   1834:   }
                   1835:   p++;
                   1836:   /* Determine the type of name being defined.  */
                   1837:   if ((*p >= '0' && *p <= '9') || *p == '(')
                   1838:     deftype = 'l';
                   1839:   else
                   1840:     deftype = *p++;
                   1841: 
                   1842:   /* c is a special case, not followed by a type-number.
                   1843:      SYMBOL:c=iVALUE for an integer constant symbol.
                   1844:      SYMBOL:c=rVALUE for a floating constant symbol.  */
                   1845:   if (deftype == 'c')
                   1846:     {
                   1847:       if (*p++ != '=')
                   1848:        error ("Invalid symbol data at symtab pos %d.", symnum);
                   1849:       switch (*p++)
                   1850:        {
                   1851:        case 'r':
                   1852:          {
                   1853:            double d = atof (p);
                   1854:            char *value;
                   1855: 
                   1856:            SYMBOL_TYPE (sym) = builtin_type_double;
                   1857:            value = (char *) obstack_alloc (symbol_obstack, sizeof (double));
                   1858:            bcopy (&d, value, sizeof (double));
                   1859:            SYMBOL_VALUE_BYTES (sym) = value;
                   1860:            SYMBOL_CLASS (sym) = LOC_CONST;
                   1861:          }
                   1862:          break;
                   1863:        case 'i':
                   1864:          {
                   1865:            SYMBOL_TYPE (sym) = builtin_type_int;
                   1866:            SYMBOL_VALUE (sym) = atoi (p);
                   1867:            SYMBOL_CLASS (sym) = LOC_CONST_BYTES;
                   1868:          }
                   1869:          break;
                   1870:        default:
                   1871:          error ("Invalid symbol data at symtab pos %d.", symnum);
                   1872:        }
                   1873:       SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
                   1874:       add_symbol_to_list (sym, &file_symbols);
                   1875:       return sym;
                   1876:     }
                   1877: 
                   1878:   /* Now usually comes a number that says which data type,
                   1879:      and possibly more stuff to define the type
                   1880:      (all of which is handled by read_type)  */
                   1881: 
                   1882:   if (deftype == 'p' && *p == 'F')
                   1883:     /* pF is a two-letter code that means a function parameter in Fortran.
                   1884:        The type-number specifies the type of the return value.
                   1885:        Translate it into a pointer-to-function type.  */
                   1886:     {
                   1887:       p++;
                   1888:       SYMBOL_TYPE (sym)
                   1889:        = lookup_pointer_type (lookup_function_type (read_type (&p)));
                   1890:     }
                   1891:   else
                   1892:     {
                   1893:       struct type *type = read_type (&p);
                   1894: 
                   1895:       if ((deftype == 'F' || deftype == 'f')
                   1896:          && TYPE_CODE (type) != TYPE_CODE_FUNC)
                   1897:        SYMBOL_TYPE (sym) = lookup_function_type (type);
                   1898:       else
                   1899:        SYMBOL_TYPE (sym) = type;
                   1900:     }
                   1901: 
                   1902:   switch (deftype)
                   1903:     {
                   1904:     case 'f':
                   1905:       SYMBOL_CLASS (sym) = LOC_BLOCK;
                   1906:       SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
                   1907:       add_symbol_to_list (sym, &file_symbols);
                   1908:       break;
                   1909: 
                   1910:     case 'F':
                   1911:       SYMBOL_CLASS (sym) = LOC_BLOCK;
                   1912:       SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
                   1913:       add_symbol_to_list (sym, &global_symbols);
                   1914:       break;
                   1915: 
                   1916:     case 'G':
                   1917:       /* For a class G (global) symbol, it appears that the
                   1918:         value is not correct.  It is necessary to search for the
                   1919:         corresponding linker definition to find the value.
                   1920:         These definitions appear at the end of the namelist.  */
                   1921:       i = hashname (SYMBOL_NAME (sym));
                   1922:       SYMBOL_VALUE (sym) = (int) global_sym_chain[i];
                   1923:       global_sym_chain[i] = sym;
                   1924:       SYMBOL_CLASS (sym) = LOC_STATIC;
                   1925:       SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
                   1926:       add_symbol_to_list (sym, &global_symbols);
                   1927:       break;
                   1928: 
                   1929:       /* This case is faked by a conditional above,
                   1930:         when there is no code letter in the dbx data.
                   1931:         Dbx data never actually contains 'l'.  */
                   1932:     case 'l':
                   1933:       SYMBOL_CLASS (sym) = LOC_LOCAL;
                   1934:       SYMBOL_VALUE (sym) = value;
                   1935:       SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
                   1936:       add_symbol_to_list (sym, &local_symbols);
                   1937:       break;
                   1938: 
                   1939:     case 'p':
                   1940:       SYMBOL_CLASS (sym) = LOC_ARG;
                   1941:       SYMBOL_VALUE (sym) = value;
                   1942:       SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
                   1943:       add_symbol_to_list (sym, &local_symbols);
                   1944:       /* DESC == 0 implies compiled with GCC.
                   1945:         In this case, if it says `short', believe it.  */
                   1946:       if (desc == 0)
                   1947:        break;
                   1948:       /* If PCC says a parameter is a short or a char,
                   1949:         it is really an int.  */
                   1950:       if (SYMBOL_TYPE (sym) == builtin_type_char
                   1951:          || SYMBOL_TYPE (sym) == builtin_type_short)
                   1952:        SYMBOL_TYPE (sym) = builtin_type_int;
                   1953:       else if (SYMBOL_TYPE (sym) == builtin_type_unsigned_char
                   1954:               || SYMBOL_TYPE (sym) == builtin_type_unsigned_short)
                   1955:        SYMBOL_TYPE (sym) = builtin_type_unsigned_int;
                   1956:       break;
                   1957: 
                   1958:     case 'r':
                   1959:       SYMBOL_CLASS (sym) = LOC_REGISTER;
                   1960:       SYMBOL_VALUE (sym) = value;
                   1961:       SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
                   1962:       add_symbol_to_list (sym, &local_symbols);
                   1963:       break;
                   1964: 
                   1965:     case 'S':
                   1966:       /* Static symbol at top level of file */
                   1967:       SYMBOL_CLASS (sym) = LOC_STATIC;
                   1968:       SYMBOL_VALUE (sym) = value;
                   1969:       SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
                   1970:       add_symbol_to_list (sym, &file_symbols);
                   1971:       break;
                   1972: 
                   1973:     case 't':
                   1974:       SYMBOL_CLASS (sym) = LOC_TYPEDEF;
                   1975:       SYMBOL_VALUE (sym) = value;
                   1976:       SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
                   1977:       if (TYPE_NAME (SYMBOL_TYPE (sym)) == 0
                   1978:          && (TYPE_FLAGS (SYMBOL_TYPE (sym)) & TYPE_FLAG_PERM) == 0)
                   1979:        TYPE_NAME (SYMBOL_TYPE (sym)) =
                   1980:          obsavestring (SYMBOL_NAME (sym),
                   1981:                        strlen (SYMBOL_NAME (sym)));
                   1982:       add_symbol_to_list (sym, &file_symbols);
                   1983:       break;
                   1984: 
                   1985:     case 'T':
                   1986:       SYMBOL_CLASS (sym) = LOC_TYPEDEF;
                   1987:       SYMBOL_VALUE (sym) = value;
                   1988:       SYMBOL_NAMESPACE (sym) = STRUCT_NAMESPACE;
                   1989:       if (TYPE_NAME (SYMBOL_TYPE (sym)) == 0
                   1990:          && (TYPE_FLAGS (SYMBOL_TYPE (sym)) & TYPE_FLAG_PERM) == 0)
                   1991:        TYPE_NAME (SYMBOL_TYPE (sym))
                   1992:          = obconcat ("",
                   1993:                      (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_ENUM
                   1994:                       ? "enum "
                   1995:                       : (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_STRUCT
                   1996:                          ? "struct " : "union ")),
                   1997:                      SYMBOL_NAME (sym));
                   1998:       add_symbol_to_list (sym, &file_symbols);
                   1999:       break;
                   2000: 
                   2001:     case 'V':
                   2002:     case 'v':
                   2003:       /* Static symbol of local scope */
                   2004:       SYMBOL_CLASS (sym) = LOC_STATIC;
                   2005:       SYMBOL_VALUE (sym) = value;
                   2006:       SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
                   2007:       add_symbol_to_list (sym, &local_symbols);
                   2008:       break;
                   2009: 
                   2010:     default:
                   2011:       error ("Invalid symbol data: unknown symbol-type code `%c' at symtab pos %d.", deftype, symnum);
                   2012:     }
                   2013:   return sym;
                   2014: }
                   2015: 
                   2016: /* Read a number by which a type is referred to in dbx data,
                   2017:    or perhaps read a pair (FILENUM, TYPENUM) in parentheses.
                   2018:    Just a single number N is equivalent to (0,N).
                   2019:    Return the two numbers by storing them in the vector TYPENUMS.
                   2020:    TYPENUMS will then be used as an argument to dbx_lookup_type.  */
                   2021: 
                   2022: static void
                   2023: read_type_number (pp, typenums)
                   2024:      register char **pp;
                   2025:      register int *typenums;
                   2026: {
                   2027:   if (**pp == '(')
                   2028:     {
                   2029:       (*pp)++;
                   2030:       typenums[0] = read_number (pp, ',');
                   2031:       typenums[1] = read_number (pp, ')');
                   2032:     }
                   2033:   else
                   2034:     {
                   2035:       typenums[0] = 0;
                   2036:       typenums[1] = read_number (pp, 0);
                   2037:     }
                   2038: }
                   2039: 
                   2040: /* Read a dbx type reference or definition;
                   2041:    return the type that is meant.
                   2042:    This can be just a number, in which case it references
                   2043:    a type already defined and placed in type_vector.
                   2044:    Or the number can be followed by an =, in which case
                   2045:    it means to define a new type according to the text that
                   2046:    follows the =.  */
                   2047: 
                   2048: static
                   2049: struct type *
                   2050: read_type (pp)
                   2051:      register char **pp;
                   2052: {
                   2053:   register struct type *type = 0;
                   2054:   register int n;
                   2055:   struct type *type1;
                   2056:   int typenums[2];
                   2057:   int xtypenums[2];
                   2058: 
                   2059:   read_type_number (pp, typenums);
                   2060: 
                   2061:   /* Detect random reference to type not yet defined.
                   2062:      Allocate a type object but leave it zeroed.  */
                   2063:   if (**pp != '=')
                   2064:     return dbx_alloc_type (typenums);
                   2065: 
                   2066:   *pp += 2;
                   2067:   switch ((*pp)[-1])
                   2068:     {
                   2069:     case 'x':
                   2070:       type = dbx_alloc_type (typenums);
                   2071:       /* Set the type code according to the following letter.  */
                   2072:       switch ((*pp)[0])
                   2073:        {
                   2074:        case 's':
                   2075:          TYPE_CODE (type) = TYPE_CODE_STRUCT;
                   2076:          break;
                   2077:        case 'u':
                   2078:          TYPE_CODE (type) = TYPE_CODE_UNION;
                   2079:          break;
                   2080:        case 'e':
                   2081:          TYPE_CODE (type) = TYPE_CODE_ENUM;
                   2082:          break;
                   2083:        }
                   2084:       /* Skip the name the cross-ref points to.  */
                   2085:       *pp = (char *) index (*pp, ',');
                   2086:       /* Just allocate the type and leave it zero if nothing known */
                   2087:       return dbx_alloc_type (typenums);
                   2088: 
                   2089:     case '0':
                   2090:     case '1':
                   2091:     case '2':
                   2092:     case '3':
                   2093:     case '4':
                   2094:     case '5':
                   2095:     case '6':
                   2096:     case '7':
                   2097:     case '8':
                   2098:     case '9':
                   2099:     case '(':
                   2100:       (*pp)--;
                   2101:       read_type_number (pp, xtypenums);
                   2102:       type = *dbx_lookup_type (xtypenums);
                   2103:       if (type == 0)
                   2104:        type = builtin_type_void;
                   2105:       *dbx_lookup_type (typenums) = type;
                   2106:       break;
                   2107:       
                   2108:     case '*':
                   2109:       type = dbx_alloc_type (typenums);
                   2110:       smash_to_pointer_type (type, read_type (pp));
                   2111:       break;
                   2112: 
                   2113:     case 'f':
                   2114:       type = dbx_alloc_type (typenums);
                   2115:       smash_to_function_type (type, read_type (pp));
                   2116:       break;
                   2117: 
                   2118:     case 'r':
                   2119:       type = read_range_type (pp, typenums);
                   2120:       *dbx_lookup_type (typenums) = type;
                   2121:       break;
                   2122: 
                   2123:     case 'e':
                   2124:       type = dbx_alloc_type (typenums);
                   2125:       type = read_enum_type (pp, type);
                   2126:       *dbx_lookup_type (typenums) = type;
                   2127:       break;
                   2128: 
                   2129:     case 's':
                   2130:       type = dbx_alloc_type (typenums);
                   2131:       type = read_struct_type (pp, type);
                   2132:       break;
                   2133: 
                   2134:     case 'u':
                   2135:       type = dbx_alloc_type (typenums);
                   2136:       type = read_struct_type (pp, type);
                   2137:       TYPE_CODE (type) = TYPE_CODE_UNION;
                   2138:       break;
                   2139: 
                   2140:     case 'a':
                   2141:       /* Define an array type.  */
                   2142:       type = dbx_alloc_type (typenums);
                   2143: 
                   2144:       /* dbx expresses array types in terms of a range type for the index,
                   2145:         and that range type is specified right inside the array type spec
                   2146:         making ar1;MIN;MAX;VALTYPE  */
                   2147:       if (!strncmp (*pp, "r1;0;", 5))
                   2148:        (*pp) += 5;
                   2149:       else if (!strncmp (*pp, "r(0,1);0;", 9))
                   2150:        (*pp) += 9;
                   2151:       else break;
                   2152: 
                   2153:       TYPE_CODE (type) = TYPE_CODE_ARRAY;
                   2154:       /* In Fortran, an upper bound may be T... meaning a parameter specifies
                   2155:         the length of the data.  In this case, just pretend the bound is 1.
                   2156:         This happens only for array parameters, which are really passed
                   2157:         as pointers anyway, and we will translate them into such.  */
                   2158:       if (**pp == 'T')
                   2159:        {
                   2160:          n = 1;
                   2161:          while (**pp != ';')
                   2162:            (*pp)++;
                   2163:        }
                   2164:       else
                   2165:        n = read_number (pp, ';') + 1;
                   2166:       TYPE_TARGET_TYPE (type) = read_type (pp);
                   2167:       TYPE_LENGTH (type) = TYPE_LENGTH (TYPE_TARGET_TYPE (type)) * n;
                   2168:       break;
                   2169: 
                   2170:     default:
                   2171:       error ("Invalid symbol data: unrecognized type-code `%c' at symtab pos %d.",
                   2172:             (*pp)[-1], symnum);
                   2173:     }
                   2174: 
                   2175:   if (type == 0)
                   2176:     abort ();
                   2177: 
                   2178: #if 0
                   2179:   /* If this is an overriding temporary alteration for a header file's
                   2180:      contents, and this type number is unknown in the global definition,
                   2181:      put this type into the global definition at this type number.  */
                   2182:   if (header_file_prev_index >= 0)
                   2183:     {
                   2184:       register struct type **tp
                   2185:         = explicit_lookup_type (header_file_prev_index, typenums[1]);
                   2186:       if (*tp == 0)
                   2187:        *tp = type;
                   2188:     }
                   2189: #endif
                   2190:   return type;
                   2191: }
                   2192: 
                   2193: /* This page contains subroutines of read_type.  */
                   2194: 
                   2195: /* Read the description of a structure (or union type)
                   2196:    and return an object describing the type.  */
                   2197: 
                   2198: static struct type *
                   2199: read_struct_type (pp, type)
                   2200:      char **pp;
                   2201:      register struct type *type;
                   2202: {
                   2203:   struct nextfield
                   2204:     {
                   2205:       struct nextfield *next;
                   2206:       struct field field;
                   2207:     };
                   2208: 
                   2209:   register struct nextfield *list = 0;
                   2210:   struct nextfield *new;
                   2211:   int totalsize;
                   2212:   char *name;
                   2213:   register char *p;
                   2214:   int nfields = 0;
                   2215:   register int n;
                   2216: 
                   2217:   TYPE_CODE (type) = TYPE_CODE_STRUCT;
                   2218: 
                   2219:   /* First comes the total size in bytes.  */
                   2220: 
                   2221:   TYPE_LENGTH (type) = read_number (pp, 0);
                   2222: 
                   2223:   /* Now come the fields, as NAME:TYPENUM,BITPOS,BITSIZE; for each one.
                   2224:      At the end, we see a semicolon instead of a field.  */
                   2225: 
                   2226:   while (**pp != ';')
                   2227:     {
                   2228:       /* Check for and handle cretinous dbx symbol name continuation!  */
                   2229:       if (**pp == '\\')
                   2230:        *pp = next_symbol_text ();
                   2231: 
                   2232:       /* Get space to record the next field's data.  */
                   2233:       new = (struct nextfield *) alloca (sizeof (struct nextfield));
                   2234:       new->next = list;
                   2235:       list = new;
                   2236: 
                   2237:       /* Read the data.  */
                   2238:       p = *pp;
                   2239:       while (*p != ':') p++;
                   2240:       list->field.name = obsavestring (*pp, p - *pp);
                   2241:       *pp = p + 1;
                   2242:       list->field.type = read_type (pp);
                   2243:       if (**pp != ',')
                   2244:        error ("Invalid symbol data: bad structure-type format at symtab pos %d.",
                   2245:               symnum);
                   2246:       (*pp)++;                 /* Skip the comma.  */
                   2247:       list->field.bitpos = read_number (pp, ',');
                   2248:       list->field.bitsize = read_number (pp, ';');
                   2249:       /* Detect an unpacked field and mark it as such.
                   2250:         dbx gives a bit size for all fields.
                   2251:         Note that forward refs cannot be packed,
                   2252:         and treat enums as if they had the width of ints.  */
                   2253:       if (TYPE_CODE (list->field.type) != TYPE_CODE_INT
                   2254:          && TYPE_CODE (list->field.type) != TYPE_CODE_ENUM)
                   2255:        list->field.bitsize = 0;
                   2256:       if ((list->field.bitsize == 8 * TYPE_LENGTH (list->field.type)
                   2257:           || (TYPE_CODE (list->field.type) == TYPE_CODE_ENUM
                   2258:               && list->field.bitsize == 8 * TYPE_LENGTH (builtin_type_int)))
                   2259:          &&
                   2260:          list->field.bitpos % 8 == 0)
                   2261:        list->field.bitsize = 0;
                   2262:       nfields++;
                   2263:     }
                   2264: 
                   2265:   (*pp)++;                     /* Skip the terminating ';'.  */
                   2266: 
                   2267:   /* Now create the vector of fields, and record how big it is.  */
                   2268: 
                   2269:   TYPE_NFIELDS (type) = nfields;
                   2270:   TYPE_FIELDS (type) = (struct field *) obstack_alloc (symbol_obstack,
                   2271:                                                       sizeof (struct field) * nfields);
                   2272: 
                   2273:   /* Copy the saved-up fields into the field vector.  */
                   2274: 
                   2275:   for (n = nfields; list; list = list->next)
                   2276:     TYPE_FIELD (type, --n) = list->field;
                   2277: 
                   2278:   return type;
                   2279: }
                   2280: 
                   2281: /* Read a definition of an enumeration type,
                   2282:    and create and return a suitable type object.
                   2283:    Also defines the symbols that represent the values of the type.  */
                   2284: 
                   2285: static struct type *
                   2286: read_enum_type (pp, type)
                   2287:      register char **pp;
                   2288:      register struct type *type;
                   2289: {
                   2290:   register char *p;
                   2291:   char *name;
                   2292:   register long n;
                   2293:   register struct symbol *sym;
                   2294:   int nsyms = 0;
                   2295:   struct pending **symlist;
                   2296:   struct pending *osyms, *syms;
                   2297:   int o_nsyms;
                   2298: 
                   2299:   if (within_function)
                   2300:     symlist = &local_symbols;
                   2301:   else
                   2302:     symlist = &file_symbols;
                   2303:   osyms = *symlist;
                   2304:   o_nsyms = osyms ? osyms->nsyms : 0;
                   2305: 
                   2306:   /* Read the value-names and their values.
                   2307:      The input syntax is NAME:VALUE,NAME:VALUE, and so on.
                   2308:      A semicolon instead of a NAME means the end.  */
                   2309:   while (**pp && **pp != ';')
                   2310:     {
                   2311:       /* Check for and handle cretinous dbx symbol name continuation!  */
                   2312:       if (**pp == '\\')
                   2313:        *pp = next_symbol_text ();
                   2314: 
                   2315:       p = *pp;
                   2316:       while (*p != ':') p++;
                   2317:       name = obsavestring (*pp, p - *pp);
                   2318:       *pp = p + 1;
                   2319:       n = read_number (pp, ',');
                   2320:       
                   2321:       sym = (struct symbol *) obstack_alloc (symbol_obstack, sizeof (struct symbol));
                   2322:       bzero (sym, sizeof (struct symbol));
                   2323:       SYMBOL_NAME (sym) = name;
                   2324:       SYMBOL_CLASS (sym) = LOC_CONST;
                   2325:       SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
                   2326:       SYMBOL_VALUE (sym) = n;
                   2327:       add_symbol_to_list (sym, symlist);
                   2328:       nsyms++;
                   2329:     }
                   2330: 
                   2331:   (*pp)++;                     /* Skip the semicolon.  */
                   2332: 
                   2333:   /* Now fill in the fields of the type-structure.  */
                   2334: 
                   2335:   TYPE_LENGTH (type) = sizeof (int);
                   2336:   TYPE_CODE (type) = TYPE_CODE_ENUM;
                   2337:   TYPE_NFIELDS (type) = nsyms;
                   2338:   TYPE_FIELDS (type) = (struct field *) obstack_alloc (symbol_obstack, sizeof (struct field) * nsyms);
                   2339: 
                   2340:   /* Find the symbols for the values and put them into the type.
                   2341:      The symbols can be found in the symlist that we put them on
                   2342:      to cause them to be defined.  osyms contains the old value
                   2343:      of that symlist; everything up to there was defined by us.  */
                   2344: 
                   2345:   for (syms = *symlist, n = nsyms; syms; syms = syms->next)
                   2346:     {
                   2347:       int j = 0;
                   2348:       if (syms == osyms)
                   2349:        j = o_nsyms;
                   2350:       for (; j < syms->nsyms; j++)
                   2351:        {
                   2352:          struct symbol *sym = syms->symbol[j];
                   2353:          SYMBOL_TYPE (sym) = type;
                   2354:          TYPE_FIELD_NAME (type, --n) = SYMBOL_NAME (sym);
                   2355:          TYPE_FIELD_VALUE (type, n) = SYMBOL_VALUE (sym);
                   2356:          TYPE_FIELD_BITPOS (type, n) = 0;
                   2357:          TYPE_FIELD_BITSIZE (type, n) = 0;
                   2358:        }
                   2359:       if (syms == osyms)
                   2360:        break;
                   2361:     }
                   2362: 
                   2363:   return type;
                   2364: }
                   2365:   
                   2366: static struct type *
                   2367: read_range_type (pp, typenums)
                   2368:      char **pp;
                   2369:      int typenums[2];
                   2370: {
                   2371:   char *errp = *pp;
                   2372:   int rangenums[2];
                   2373:   int n1, n2, n3;
                   2374: 
                   2375:   /* First comes a type we are a subrange of.
                   2376:      In practice it is usually 0, 1 or the type being defined.  */
                   2377:   read_type_number (pp, rangenums);
                   2378:   n1 = rangenums[1];
                   2379: 
                   2380:   /* A semicolon should now follow; skip it.  */
                   2381:   if (**pp == ';')
                   2382:     (*pp)++;
                   2383: 
                   2384:   /* The remaining two operands are usually lower and upper bounds
                   2385:      of the range.  But in some special cases they mean something else.  */
                   2386:   n2 = read_number (pp, ';');
                   2387:   n3 = read_number (pp, ';');
                   2388: 
                   2389:   /* A type defined as a subrange of itself, with bounds both 0, is void.  */
                   2390:   if (rangenums[0] == typenums[0] && rangenums[1] == typenums[1]
                   2391:       && n2 == 0 && n3 == 0)
                   2392:     return builtin_type_void;
                   2393: 
                   2394:   /* If n3 is zero and n2 is not, we want a floating type,
                   2395:      and n2 is the width in bytes.
                   2396: 
                   2397:      Fortran programs appear to use this for complex types also,
                   2398:      and they give no way to distinguish between double and single-complex!
                   2399:      We don't have complex types, so we would lose on all fortran files!
                   2400:      So return type `double' for all of those.  It won't work right
                   2401:      for the complex values, but at least it makes the file loadable.  */
                   2402: 
                   2403:   if (n3 == 0 && n2 > 0)
                   2404:     {
                   2405:       if (n2 == sizeof (float))
                   2406:        return builtin_type_float;
                   2407:       return builtin_type_double;
                   2408:     }
                   2409: 
                   2410:   /* If the upper bound is -1, it must really be an unsigned int.  */
                   2411: 
                   2412:   else if (n2 == 0 && n3 == -1)
                   2413:     {
                   2414:       if (sizeof (int) == sizeof (long))
                   2415:        return builtin_type_unsigned_int;
                   2416:       else
                   2417:        return builtin_type_unsigned_long;
                   2418:     }
                   2419: 
                   2420:   /* Detect unsigned subranges of int.  Int is normally 1.
                   2421:      Note that `char' is usually given bounds of 0 to 127,
                   2422:      and would therefore appear unsigned; but it is described
                   2423:      as a subrange of itself, so we reject it here.  */
                   2424: 
                   2425:   else if (n2 == 0 && n1 == 1)
                   2426:     {
                   2427:       /* an unsigned type */
                   2428:       if (n3 == (1 << (8 * sizeof (int))) - 1)
                   2429:        return builtin_type_unsigned_int;
                   2430:       if (n3 == (1 << (8 * sizeof (short))) - 1)
                   2431:        return builtin_type_unsigned_short;
                   2432:       if (n3 == (1 << (8 * sizeof (char))) - 1)
                   2433:        return builtin_type_unsigned_char;
                   2434:     }
                   2435:   else
                   2436:     {
                   2437:       /* a signed type */
                   2438:       if (n3 == (1 << (8 * sizeof (int) - 1)) - 1)
                   2439:        return builtin_type_int;
                   2440:       if (n3 == (1 << (8 * sizeof (long) - 1)) - 1)
                   2441:         return builtin_type_long;
                   2442:       if (n3 == (1 << (8 * sizeof (short) - 1)) - 1)
                   2443:        return builtin_type_short;
                   2444:       if (n3 == (1 << (8 * sizeof (char) - 1)) - 1)
                   2445:        return builtin_type_char;
                   2446:     }
                   2447:   error ("Invalid symbol data: range type spec %s at symtab pos %d.",
                   2448:         errp - 1, symnum);
                   2449: }
                   2450: 
                   2451: /* Read a number from the string pointed to by *PP.
                   2452:    The value of *PP is advanced over the number.
                   2453:    If END is nonzero, the character that ends the
                   2454:    number must match END, or an error happens;
                   2455:    and that character is skipped if it does match.
                   2456:    If END is zero, *PP is left pointing to that character.  */
                   2457: 
                   2458: static long
                   2459: read_number (pp, end)
                   2460:      char **pp;
                   2461:      int end;
                   2462: {
                   2463:   register char *p = *pp;
                   2464:   register long n = 0;
                   2465:   register int c;
                   2466:   int sign = 1;
                   2467: 
                   2468:   /* Handle an optional leading minus sign.  */
                   2469: 
                   2470:   if (*p == '-')
                   2471:     {
                   2472:       sign = -1;
                   2473:       p++;
                   2474:     }
                   2475: 
                   2476:   /* Read the digits, as far as they go.  */
                   2477: 
                   2478:   while ((c = *p++) >= '0' && c <= '9')
                   2479:     {
                   2480:       n *= 10;
                   2481:       n += c - '0';
                   2482:     }
                   2483:   if (end)
                   2484:     {
                   2485:       if (c != end)
                   2486:        error ("Invalid symbol data: invalid character \\%03o at symbol pos %d.", c, symnum);
                   2487:     }
                   2488:   else
                   2489:     --p;
                   2490: 
                   2491:   *pp = p;
                   2492:   return n * sign;
                   2493: }
                   2494: 
                   2495: static
                   2496: initialize ()
                   2497: {
                   2498:   symfile = 0;
                   2499: 
                   2500:   add_com ("symbol-file", class_files, symbol_file_command,
                   2501:           "Load symbol table (in dbx format) from executable file FILE.");
                   2502: }
                   2503: 
                   2504: END_FILE
                   2505: 
                   2506: #endif /* READ_DBX_FORMAT */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.