/* Read coff symbol tables and convert to internal format, for GDB.
Copyright (C) 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
- 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008
+ 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009
Free Software Foundation, Inc.
Contributed by David D. Johnson, Brown University (ddj@cs.brown.edu).
this pointer into last_source_file and we put it in
subfiles->name, which end_symtab frees; that's why
it must be malloc'd. */
- savestring (name, strlen (name)),
+ xstrdup (name),
/* We never know the directory name for COFF. */
NULL,
/* The start address is irrelevant, since we set
{
if (last_source_file != NULL)
xfree (last_source_file);
- last_source_file = savestring (name, strlen (name));
+ last_source_file = xstrdup (name);
current_source_start_addr = start_addr;
current_source_end_addr = start_addr + size;
}
coff_end_symtab (objfile);
coff_start_symtab ("_globals_");
+ /* coff_start_symtab will set the language of this symtab to
+ language_unknown, since such a ``file name'' is not
+ recognized. Override that with the minimal language to
+ allow printing values in this symtab. */
+ current_subfile->language = language_minimal;
complete_symtab ("_globals_", 0, 0);
/* done with all files, everything from here on out is globals */
}
for which we do not have any other statement-line-number. */
if (fcn_last_line == 1)
record_line (current_subfile, fcn_first_line,
- fcn_first_line_addr);
+ gdbarch_addr_bits_remove (gdbarch,
+ fcn_first_line_addr));
else
enter_linenos (fcn_line_ptr, fcn_first_line, fcn_last_line,
objfile);
if ((nsyms == 0) && (pe_file))
{
- /* We've got no debugging symbols, but it's is a portable
+ /* We've got no debugging symbols, but it's a portable
executable, so try to read the export table */
read_pe_exported_syms (objfile);
}
enter_linenos (long file_offset, int first_line,
int last_line, struct objfile *objfile)
{
+ struct gdbarch *gdbarch = get_objfile_arch (objfile);
char *rawptr;
struct internal_lineno lptr;
/* The next function, or the sentinel, will have L_LNNO32 zero;
we exit. */
if (L_LNNO32 (&lptr) && L_LNNO32 (&lptr) <= last_line)
- record_line (current_subfile, first_line + L_LNNO32 (&lptr),
- lptr.l_addr.l_paddr
- + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)));
+ {
+ CORE_ADDR addr = lptr.l_addr.l_paddr;
+ addr += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
+ record_line (current_subfile, first_line + L_LNNO32 (&lptr),
+ gdbarch_addr_bits_remove (gdbarch, addr));
+ }
else
break;
}
}
}
\f
+static int
+coff_reg_to_regnum (struct symbol *sym, struct gdbarch *gdbarch)
+{
+ return gdbarch_sdb_reg_to_regnum (gdbarch, SYMBOL_VALUE (sym));
+}
+
+static const struct symbol_register_ops coff_register_funcs = {
+ coff_reg_to_regnum
+};
+
static struct symbol *
process_coff_symbol (struct coff_symbol *cs,
union internal_auxent *aux,
memset (sym, 0, sizeof (struct symbol));
name = cs->c_name;
name = EXTERNAL_NAME (name, objfile->obfd);
- SYMBOL_LANGUAGE (sym) = language_auto;
+ SYMBOL_LANGUAGE (sym) = current_subfile->language;
SYMBOL_SET_NAMES (sym, name, strlen (name), objfile);
/* default assumptions */
#endif
case C_REG:
SYMBOL_CLASS (sym) = LOC_REGISTER;
- SYMBOL_VALUE (sym) = gdbarch_sdb_reg_to_regnum
- (current_gdbarch, cs->c_value);
+ SYMBOL_REGISTER_OPS (sym) = &coff_register_funcs;
+ SYMBOL_VALUE (sym) = cs->c_value;
add_symbol_to_list (sym, &local_symbols);
break;
case C_REGPARM:
SYMBOL_CLASS (sym) = LOC_REGISTER;
+ SYMBOL_REGISTER_OPS (sym) = &coff_register_funcs;
SYMBOL_IS_ARGUMENT (sym) = 1;
- SYMBOL_VALUE (sym) = gdbarch_sdb_reg_to_regnum
- (current_gdbarch, cs->c_value);
+ SYMBOL_VALUE (sym) = cs->c_value;
add_symbol_to_list (sym, &local_symbols);
break;
*dim = 0;
base_type = decode_type (cs, new_c_type, aux, objfile);
- index_type = builtin_type_int32;
+ index_type = objfile_type (objfile)->builtin_int;
range_type =
create_range_type ((struct type *) NULL, index_type, 0, n - 1);
type =
{
case T_NULL:
/* shows up with "void (*foo)();" structure members */
- return builtin_type (gdbarch)->builtin_void;
+ return objfile_type (objfile)->builtin_void;
#ifdef T_VOID
case T_VOID:
/* Intel 960 COFF has this symbol and meaning. */
- return builtin_type (gdbarch)->builtin_void;
+ return objfile_type (objfile)->builtin_void;
#endif
case T_CHAR:
- return builtin_type (gdbarch)->builtin_char;
+ return objfile_type (objfile)->builtin_char;
case T_SHORT:
- return builtin_type (gdbarch)->builtin_short;
+ return objfile_type (objfile)->builtin_short;
case T_INT:
- return builtin_type (gdbarch)->builtin_int;
+ return objfile_type (objfile)->builtin_int;
case T_LONG:
if (cs->c_sclass == C_FIELD
&& aux->x_sym.x_misc.x_lnsz.x_size
> gdbarch_long_bit (gdbarch))
- return builtin_type (gdbarch)->builtin_long_long;
+ return objfile_type (objfile)->builtin_long_long;
else
- return builtin_type (gdbarch)->builtin_long;
+ return objfile_type (objfile)->builtin_long;
case T_FLOAT:
- return builtin_type (gdbarch)->builtin_float;
+ return objfile_type (objfile)->builtin_float;
case T_DOUBLE:
- return builtin_type (gdbarch)->builtin_double;
+ return objfile_type (objfile)->builtin_double;
case T_LNGDBL:
- return builtin_type (gdbarch)->builtin_long_double;
+ return objfile_type (objfile)->builtin_long_double;
case T_STRUCT:
if (cs->c_naux != 1)
break;
case T_UCHAR:
- return builtin_type (gdbarch)->builtin_unsigned_char;
+ return objfile_type (objfile)->builtin_unsigned_char;
case T_USHORT:
- return builtin_type (gdbarch)->builtin_unsigned_short;
+ return objfile_type (objfile)->builtin_unsigned_short;
case T_UINT:
- return builtin_type (gdbarch)->builtin_unsigned_int;
+ return objfile_type (objfile)->builtin_unsigned_int;
case T_ULONG:
if (cs->c_sclass == C_FIELD
&& aux->x_sym.x_misc.x_lnsz.x_size
> gdbarch_long_bit (gdbarch))
- return builtin_type (gdbarch)->builtin_unsigned_long_long;
+ return objfile_type (objfile)->builtin_unsigned_long_long;
else
- return builtin_type (gdbarch)->builtin_unsigned_long;
+ return objfile_type (objfile)->builtin_unsigned_long;
}
complaint (&symfile_complaints, _("Unexpected type for symbol %s"), cs->c_name);
- return builtin_type (gdbarch)->builtin_void;
+ return objfile_type (objfile)->builtin_void;
}
\f
/* This page contains subroutines of read_type. */