Annotation of 43BSDReno/contrib/emacs-18.55/gdb/dbxread.c, revision 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.