/* Read AIX xcoff symbol tables and convert to internal format, for GDB.
- Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993
+ Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994
Free Software Foundation, Inc.
Derived from coffread.c, dbxread.c, and a lot of hacking.
Contributed by IBM Corporation.
static int inclLength; /* table length */
static int inclDepth; /* nested include depth */
+static void allocate_include_entry PARAMS ((void));
static void
record_include_begin (cs)
}
++inclDepth;
- /* allocate an include file, or make room for the new entry */
- if (inclLength == 0) {
- inclTable = (InclTable*)
- xmalloc (sizeof (InclTable) * INITIAL_INCLUDE_TABLE_LENGTH);
- memset (inclTable, '\0', sizeof (InclTable) * INITIAL_INCLUDE_TABLE_LENGTH);
- inclLength = INITIAL_INCLUDE_TABLE_LENGTH;
- inclIndx = 0;
- }
- else if (inclIndx >= inclLength) {
- inclLength += INITIAL_INCLUDE_TABLE_LENGTH;
- inclTable = (InclTable*)
- xrealloc (inclTable, sizeof (InclTable) * inclLength);
- memset (inclTable+inclLength-INITIAL_INCLUDE_TABLE_LENGTH,
- '\0', sizeof (InclTable)*INITIAL_INCLUDE_TABLE_LENGTH);
- }
+ allocate_include_entry ();
inclTable [inclIndx].name = cs->c_name;
inclTable [inclIndx].begin = cs->c_value;
}
-
static void
record_include_end (cs)
struct coff_symbol *cs;
complain (&msg);
}
+ allocate_include_entry ();
+
pTbl = &inclTable [inclIndx];
pTbl->end = cs->c_value;
++inclIndx;
}
+static void
+allocate_include_entry ()
+{
+ if (inclTable == NULL)
+ {
+ inclTable = (InclTable *)
+ xmalloc (sizeof (InclTable) * INITIAL_INCLUDE_TABLE_LENGTH);
+ memset (inclTable,
+ '\0', sizeof (InclTable) * INITIAL_INCLUDE_TABLE_LENGTH);
+ inclLength = INITIAL_INCLUDE_TABLE_LENGTH;
+ inclIndx = 0;
+ }
+ else if (inclIndx >= inclLength)
+ {
+ inclLength += INITIAL_INCLUDE_TABLE_LENGTH;
+ inclTable = (InclTable *)
+ xrealloc (inclTable, sizeof (InclTable) * inclLength);
+ memset (inclTable + inclLength - INITIAL_INCLUDE_TABLE_LENGTH,
+ '\0', sizeof (InclTable)*INITIAL_INCLUDE_TABLE_LENGTH);
+ }
+}
-/* given the start and end addresses of a compilation unit (or a csect, at times)
- process its lines and create appropriate line vectors. */
+/* given the start and end addresses of a compilation unit (or a csect,
+ at times) process its lines and create appropriate line vectors. */
static void
process_linenos (start, end)
struct internal_syment symbol;
static struct complaint msg =
{"Unexpected symbol continuation", 0, 0};
+ char *retval;
bfd_coff_swap_sym_in (current_objfile->obfd, raw_symbol, &symbol);
- if (symbol->n_zeroes)
- complain (&msg);
- else if (symbol->n_sclass & 0x80)
- return debugsec + symbol->n_offset;
+ if (symbol.n_zeroes)
+ {
+ complain (&msg);
+
+ /* Return something which points to '\0' and hope the symbol reading
+ code does something reasonable. */
+ retval = "";
+ }
+ else if (symbol.n_sclass & 0x80)
+ {
+ retval = debugsec + symbol.n_offset;
+ raw_symbol += coff_data (current_objfile->obfd)->local_symesz;
+ ++symnum;
+ }
else
- complain (&msg);
- raw_symbol += coff_data (current_objfile->obfd)->local_symesz;
- ++symnum;
+ {
+ complain (&msg);
+
+ /* Return something which points to '\0' and hope the symbol reading
+ code does something reasonable. */
+ retval = "";
+ }
+ return retval;
}
/* read the whole symbol table of a given bfd. */
break; /* switch CSECT_SCLAS() */
case XTY_LD :
-
- /* a function entry point. */
- if (CSECT_SCLAS (&main_aux) == XMC_PR) {
-function_entry_point:
+ switch (CSECT_SCLAS (&main_aux))
+ {
+ case XMC_PR:
+ /* a function entry point. */
+ function_entry_point:
RECORD_MINIMAL_SYMBOL (cs->c_name, cs->c_value, mst_text,
symname_alloced, cs->c_secnum, objfile);
cs->c_value + ptb->fsize, objfile);
}
continue;
- }
- /* shared library function trampoline code entry point. */
- else if (CSECT_SCLAS (&main_aux) == XMC_GL) {
-
- /* record trampoline code entries as mst_solib_trampoline symbol.
- When we lookup mst symbols, we will choose mst_text over
- mst_solib_trampoline. */
-
-#if 1
- /* After the implementation of incremental loading of shared
- libraries, we don't want to access trampoline entries. This
- approach has a consequence of the necessity to bring the whole
- shared library at first, in order do anything with it (putting
- breakpoints, using malloc, etc). On the other side, this is
- consistient with gdb's behaviour on a SUN platform. */
-
- /* Trying to prefer *real* function entry over its trampoline,
- by assigning `mst_solib_trampoline' type to trampoline entries
- fails. Gdb treats those entries as chars. FIXME. */
- /* Recording this entry is necessary. Single stepping relies on
- this vector to get an idea about function address boundaries. */
-
- prim_record_minimal_symbol_and_info
- ("<trampoline>", cs->c_value, mst_solib_trampoline,
- (char *)NULL, cs->c_secnum, objfile);
-#else
+ case XMC_GL:
+ /* shared library function trampoline code entry point. */
/* record trampoline code entries as mst_solib_trampoline symbol.
When we lookup mst symbols, we will choose mst_text over
mst_solib_trampoline. */
-
RECORD_MINIMAL_SYMBOL (cs->c_name, cs->c_value,
mst_solib_trampoline,
- symname_alloced, objfile);
-#endif
+ symname_alloced, cs->c_secnum, objfile);
+ continue;
+
+ case XMC_DS:
+ /* The symbols often have the same names as debug symbols for
+ functions, and confuse lookup_symbol. */
continue;
+
+ default:
+ /* xlc puts each variable in a separate csect, so we get
+ an XTY_SD for each variable. But gcc puts several
+ variables in a csect, so that each variable only gets
+ an XTY_LD. We still need to record them. This will
+ typically be XMC_RW; I suspect XMC_RO and XMC_BS might
+ be possible too. */
+ break;
}
- break;
default : /* all other XTY_XXXs */
break;
/* XCOFF, according to the AIX 3.2 documentation, puts the filename
in cs->c_name. But xlc 1.3.0.2 has decided to do things the
standard COFF way and put it in the auxent. We use the auxent if
- there is one, otherwise use the name. Simple enough. */
- if (cs->c_naux > 0)
- filestring = coff_getfilename (&main_aux);
+ the symbol is ".file" and an auxent exists, otherwise use the symbol
+ itself. Simple enough. */
+ if (!strcmp (cs->c_name, ".file") && cs->c_naux > 0)
+ {
+ bfd_coff_swap_aux_in (abfd, raw_auxptr, cs->c_type, cs->c_sclass,
+ 0, cs->c_naux, &main_aux);
+ filestring = coff_getfilename (&main_aux);
+ }
else
filestring = cs->c_name;