/* Read AIX xcoff symbol tables and convert to internal format, for GDB.
Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
- 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2007, 2008
+ 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2007, 2008, 2009
Free Software Foundation, Inc.
Derived from coffread.c, dbxread.c, and a lot of hacking.
Contributed by IBM Corporation.
#include "coff/xcoff.h"
#include "libxcoff.h"
#include "coff/rs6000.h"
+#include "xcoffread.h"
#include "symtab.h"
#include "gdbtypes.h"
start, 0, &main_source_baseline);
}
- /* Have a new subfile for the include file. */
+ if (strcmp (inclTable[ii].name, last_source_file) == 0)
+ {
+ /* The entry in the include table refers to the main source
+ file. Add the lines to the main subfile. */
+
+ main_source_baseline = inclTable[ii].funStartLine;
+ enter_line_range
+ (&main_subfile, inclTable[ii].begin, inclTable[ii].end,
+ start, 0, &main_source_baseline);
+ inclTable[ii].subfile = &main_subfile;
+ }
+ else
+ {
- tmpSubfile = inclTable[ii].subfile =
- (struct subfile *) xmalloc (sizeof (struct subfile));
+ /* Have a new subfile for the include file. */
- memset (tmpSubfile, '\0', sizeof (struct subfile));
- firstLine = &(inclTable[ii].funStartLine);
+ tmpSubfile = inclTable[ii].subfile =
+ (struct subfile *) xmalloc (sizeof (struct subfile));
- /* Enter include file's lines now. */
- enter_line_range (tmpSubfile, inclTable[ii].begin,
- inclTable[ii].end, start, 0, firstLine);
+ memset (tmpSubfile, '\0', sizeof (struct subfile));
+ firstLine = &(inclTable[ii].funStartLine);
+
+ /* Enter include file's lines now. */
+ enter_line_range (tmpSubfile, inclTable[ii].begin,
+ inclTable[ii].end, start, 0, firstLine);
+ }
if (offset <= inclTable[ii].end)
offset = inclTable[ii].end + linesz;
for (ii = 0; ii < inclIndx; ++ii)
{
- if ((inclTable[ii].subfile)->line_vector) /* Useless if!!! FIXMEmgo */
+ if (inclTable[ii].subfile != ((struct subfile *) &main_subfile)
+ && (inclTable[ii].subfile)->line_vector) /* Useless if!!! FIXMEmgo */
{
struct linetable *lineTb, *lv;
namestr = (NAME); \
if (namestr[0] == '.') ++namestr; \
prim_record_minimal_symbol_and_info (namestr, (ADDR), (TYPE), \
- (char *)NULL, (SECTION), (asection *)NULL, (OBJFILE)); \
+ (SECTION), (asection *)NULL, (OBJFILE)); \
misc_func_recorded = 1; \
}
prim_record_minimal_symbol_and_info
(namestring, symbol.n_value,
sclass == C_HIDEXT ? mst_file_data : mst_data,
- NULL, secnum_to_section (symbol.n_scnum, objfile),
+ secnum_to_section (symbol.n_scnum, objfile),
NULL, objfile);
break;
prim_record_minimal_symbol_and_info
(namestring, symbol.n_value,
sclass == C_HIDEXT ? mst_file_data : mst_data,
- NULL, secnum_to_section (symbol.n_scnum, objfile),
+ secnum_to_section (symbol.n_scnum, objfile),
NULL, objfile);
break;
}
prim_record_minimal_symbol_and_info
(namestring, symbol.n_value,
sclass == C_HIDEXT ? mst_file_bss : mst_bss,
- NULL, secnum_to_section (symbol.n_scnum, objfile),
+ secnum_to_section (symbol.n_scnum, objfile),
NULL, objfile);
break;
}
/* Return the toc offset value for a given objfile. */
CORE_ADDR
-get_toc_offset (struct objfile *objfile)
+xcoff_get_toc_offset (struct objfile *objfile)
{
if (objfile)
return ((struct coff_symfile_info *) objfile->deprecated_sym_private)->toc_offset;
NULL /* next: pointer to next struct sym_fns */
};
+/* Provide a prototype to silence -Wmissing-prototypes. */
+extern initialize_file_ftype _initialize_xcoffread;
+
void
_initialize_xcoffread (void)
{