Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(231)

Unified Diff: gdb/xcoffread.c

Issue 11969036: Merge GDB 7.5.1 (Closed) Base URL: http://git.chromium.org/native_client/nacl-gdb.git@master
Patch Set: Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « gdb/wrapper.c ('k') | gdb/xcoffsolib.c » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: gdb/xcoffread.c
diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c
index 1a2bb1464b6640dbe6b672cf8db866f2b5d1de80..af93a4345b67f13584f3a14a7a63fe8a2a2e72f9 100644
--- a/gdb/xcoffread.c
+++ b/gdb/xcoffread.c
@@ -162,6 +162,7 @@ static const struct dwarf2_debug_sections dwarf2_xcoff_names = {
{ ".dwstr", NULL },
{ ".dwrnges", NULL },
{ NULL, NULL }, /* debug_types */
+ { NULL, NULL }, /* debug_addr */
{ ".dwframe", NULL },
{ NULL, NULL }, /* eh_frame */
{ NULL, NULL }, /* gdb_index */
@@ -272,36 +273,53 @@ find_targ_sec (bfd *abfd, asection *sect, void *obj)
}
}
-/* Return the section number (SECT_OFF_*) that CS points to. */
-static int
-secnum_to_section (int secnum, struct objfile *objfile)
-{
- int off = SECT_OFF_TEXT (objfile);
+/* Search all BFD sections for the section whose target_index is
+ equal to N_SCNUM. Set *BFD_SECT to that section. The section's
+ associated index in the objfile's section_offset table is also
+ stored in *SECNUM.
- asection *sect = NULL;
+ If no match is found, *BFD_SECT is set to NULL, and *SECNUM
+ is set to the text section's number. */
+
+static void
+xcoff_secnum_to_sections (int n_scnum, struct objfile *objfile,
+ asection **bfd_sect, int *secnum)
+{
struct find_targ_sec_arg args;
- args.targ_index = secnum;
- args.resultp = &off;
- args.bfd_sect = §
+
+ args.targ_index = n_scnum;
+ args.resultp = secnum;
+ args.bfd_sect = bfd_sect;
args.objfile = objfile;
+
+ *bfd_sect = NULL;
+ *secnum = SECT_OFF_TEXT (objfile);
+
bfd_map_over_sections (objfile->obfd, find_targ_sec, &args);
- return off;
}
-/* Return the BFD section that CS points to. */
+/* Return the section number (SECT_OFF_*) that N_SCNUM points to. */
+
+static int
+secnum_to_section (int n_scnum, struct objfile *objfile)
+{
+ int secnum;
+ asection *ignored;
+
+ xcoff_secnum_to_sections (n_scnum, objfile, &ignored, &secnum);
+ return secnum;
+}
+
+/* Return the BFD section that N_SCNUM points to. */
+
static asection *
-secnum_to_bfd_section (int secnum, struct objfile *objfile)
+secnum_to_bfd_section (int n_scnum, struct objfile *objfile)
{
- int off = SECT_OFF_TEXT (objfile);
+ int ignored;
+ asection *bfd_sect;
- asection *sect = NULL;
- struct find_targ_sec_arg args;
- args.targ_index = secnum;
- args.resultp = &off;
- args.bfd_sect = §
- args.objfile = objfile;
- bfd_map_over_sections (objfile->obfd, find_targ_sec, &args);
- return sect;
+ xcoff_secnum_to_sections (n_scnum, objfile, &bfd_sect, &ignored);
+ return bfd_sect;
}
/* add a given stab string into given stab vector. */
@@ -877,21 +895,33 @@ enter_line_range (struct subfile *subfile, unsigned beginoffset,
This function can read past the end of the symbol table
(into the string table) but this does no harm. */
-/* Reading symbol table has to be fast! Keep the followings as macros, rather
- than functions. */
-
-#define RECORD_MINIMAL_SYMBOL(NAME, ADDR, TYPE, SECTION, OBJFILE) \
-{ \
- char *namestr; \
- \
- namestr = (NAME); \
- if (namestr[0] == '.') ++namestr; \
- prim_record_minimal_symbol_and_info (namestr, (ADDR), (TYPE), \
- (SECTION), (asection *)NULL, \
- (OBJFILE)); \
- misc_func_recorded = 1; \
-}
+/* Create a new minimal symbol (using prim_record_minimal_symbol_and_info).
+
+ Arguments are:
+
+ NAME - the symbol's name (but if NAME starts with a period, that
+ leading period is discarded).
+ ADDRESS - the symbol's address.
+ MS_TYPE - the symbol's type.
+ N_SCNUM - the symbol's XCOFF section number.
+ OBJFILE - the objfile associated with the minimal symbol. */
+
+static void
+record_minimal_symbol (const char *name, CORE_ADDR address,
+ enum minimal_symbol_type ms_type,
+ int n_scnum,
+ struct objfile *objfile)
+{
+ int secnum;
+ asection *bfd_sect;
+
+ if (name[0] == '.')
+ ++name;
+ xcoff_secnum_to_sections (n_scnum, objfile, &bfd_sect, &secnum);
+ prim_record_minimal_symbol_and_info (name, address, ms_type,
+ secnum, bfd_sect, objfile);
+}
/* xcoff has static blocks marked in `.bs', `.es' pairs. They cannot be
nested. At any given time, a symbol can only be in one static block.
@@ -986,9 +1016,7 @@ read_xcoff_symtab (struct partial_symtab *pst)
char *filestring = " _start_ "; /* Name of the current file. */
- char *last_csect_name; /* Last seen csect's name and value. */
- CORE_ADDR last_csect_val;
- int last_csect_sec;
+ const char *last_csect_name; /* Last seen csect's name. */
this_symtab_psymtab = pst;
@@ -998,7 +1026,6 @@ read_xcoff_symtab (struct partial_symtab *pst)
last_source_file = NULL;
last_csect_name = 0;
- last_csect_val = 0;
start_stabs ();
start_symtab (filestring, (char *) NULL, file_start_addr);
@@ -1171,14 +1198,8 @@ read_xcoff_symtab (struct partial_symtab *pst)
SECT_OFF_TEXT (objfile));
file_end_addr = file_start_addr + CSECT_LEN (&main_aux);
- if (cs->c_name && (cs->c_name[0] == '.'
- || cs->c_name[0] == '@'))
- {
- last_csect_name = cs->c_name;
- last_csect_val = cs->c_value;
- last_csect_sec = secnum_to_section (cs->c_secnum,
- objfile);
- }
+ if (cs->c_name && (cs->c_name[0] == '.' || cs->c_name[0] == '@'))
+ last_csect_name = cs->c_name;
}
continue;
@@ -1989,10 +2010,6 @@ init_stringtab (bfd *abfd, file_ptr offset, struct objfile *objfile)
for the psymtab. */
static unsigned int first_fun_line_offset;
-static struct partial_symtab *xcoff_start_psymtab
- (struct objfile *, char *, int,
- struct partial_symbol **, struct partial_symbol **);
-
/* Allocate and partially fill a partial symtab. It will be
completely filled at the end of the symbol list.
@@ -2001,7 +2018,8 @@ static struct partial_symtab *xcoff_start_psymtab
(normal). */
static struct partial_symtab *
-xcoff_start_psymtab (struct objfile *objfile, char *filename, int first_symnum,
+xcoff_start_psymtab (struct objfile *objfile,
+ const char *filename, int first_symnum,
struct partial_symbol **global_syms,
struct partial_symbol **static_syms)
{
@@ -2023,10 +2041,6 @@ xcoff_start_psymtab (struct objfile *objfile, char *filename, int first_symnum,
return result;
}
-static struct partial_symtab *xcoff_end_psymtab
- (struct partial_symtab *, char **, int, int,
- struct partial_symtab **, int, int);
-
/* Close off the current usage of PST.
Returns PST, or NULL if the partial symtab was empty and thrown away.
@@ -2036,7 +2050,7 @@ static struct partial_symtab *xcoff_end_psymtab
are the information for includes and dependencies. */
static struct partial_symtab *
-xcoff_end_psymtab (struct partial_symtab *pst, char **include_list,
+xcoff_end_psymtab (struct partial_symtab *pst, const char **include_list,
int num_includes, int capping_symbol_number,
struct partial_symtab **dependency_list,
int number_dependencies, int textlow_not_set)
@@ -2119,17 +2133,13 @@ xcoff_end_psymtab (struct partial_symtab *pst, char **include_list,
return pst;
}
-static void swap_sym (struct internal_syment *,
- union internal_auxent *, char **, char **,
- unsigned int *, struct objfile *);
-
/* Swap raw symbol at *RAW and put the name in *NAME, the symbol in
*SYMBOL, the first auxent in *AUX. Advance *RAW and *SYMNUMP over
the symbol and its auxents. */
static void
swap_sym (struct internal_syment *symbol, union internal_auxent *aux,
- char **name, char **raw, unsigned int *symnump,
+ const char **name, char **raw, unsigned int *symnump,
struct objfile *objfile)
{
bfd_coff_swap_sym_in (objfile->obfd, *raw, symbol);
@@ -2189,9 +2199,9 @@ scan_xcoff_symtab (struct objfile *objfile)
{
struct gdbarch *gdbarch = get_objfile_arch (objfile);
CORE_ADDR toc_offset = 0; /* toc offset value in data section. */
- char *filestring = NULL;
+ const char *filestring = NULL;
- char *namestring;
+ const char *namestring;
int past_first_source_file = 0;
bfd *abfd;
asection *bfd_sect;
@@ -2201,7 +2211,7 @@ scan_xcoff_symtab (struct objfile *objfile)
struct partial_symtab *pst;
/* List of current psymtab's include files. */
- char **psymtab_include_list;
+ const char **psymtab_include_list;
int includes_allocated;
int includes_used;
@@ -2214,7 +2224,7 @@ scan_xcoff_symtab (struct objfile *objfile)
union internal_auxent main_aux[5];
unsigned int ssymnum;
- char *last_csect_name = NULL; /* Last seen csect's name and value. */
+ const char *last_csect_name = NULL; /* Last seen csect's name and value. */
CORE_ADDR last_csect_val = 0;
int last_csect_sec = 0;
int misc_func_recorded = 0; /* true if any misc. function. */
@@ -2224,8 +2234,8 @@ scan_xcoff_symtab (struct objfile *objfile)
includes_allocated = 30;
includes_used = 0;
- psymtab_include_list = (char **) alloca (includes_allocated *
- sizeof (char *));
+ psymtab_include_list = (const char **) alloca (includes_allocated *
+ sizeof (const char *));
dependencies_allocated = 30;
dependencies_used = 0;
@@ -2297,10 +2307,10 @@ scan_xcoff_symtab (struct objfile *objfile)
if (!misc_func_recorded)
{
- RECORD_MINIMAL_SYMBOL
+ record_minimal_symbol
(last_csect_name, last_csect_val,
- mst_text, last_csect_sec,
- objfile);
+ mst_text, last_csect_sec, objfile);
+ misc_func_recorded = 1;
}
if (pst != NULL)
@@ -2332,8 +2342,7 @@ scan_xcoff_symtab (struct objfile *objfile)
{
last_csect_name = namestring;
last_csect_val = symbol.n_value;
- last_csect_sec =
- secnum_to_section (symbol.n_scnum, objfile);
+ last_csect_sec = symbol.n_scnum;
}
if (pst != NULL)
{
@@ -2357,7 +2366,8 @@ scan_xcoff_symtab (struct objfile *objfile)
(namestring, symbol.n_value,
sclass == C_HIDEXT ? mst_file_data : mst_data,
secnum_to_section (symbol.n_scnum, objfile),
- NULL, objfile);
+ secnum_to_bfd_section (symbol.n_scnum, objfile),
+ objfile);
break;
case XMC_TC0:
@@ -2391,11 +2401,13 @@ scan_xcoff_symtab (struct objfile *objfile)
if (first_fun_line_offset == 0 && symbol.n_numaux > 1)
first_fun_line_offset =
main_aux[0].x_sym.x_fcnary.x_fcn.x_lnnoptr;
- RECORD_MINIMAL_SYMBOL
- (namestring, symbol.n_value,
- sclass == C_HIDEXT ? mst_file_text : mst_text,
- secnum_to_section (symbol.n_scnum, objfile),
- objfile);
+ {
+ record_minimal_symbol
+ (namestring, symbol.n_value,
+ sclass == C_HIDEXT ? mst_file_text : mst_text,
+ symbol.n_scnum, objfile);
+ misc_func_recorded = 1;
+ }
break;
case XMC_GL:
@@ -2406,11 +2418,10 @@ scan_xcoff_symtab (struct objfile *objfile)
mst_solib_trampoline symbol. When we lookup mst
symbols, we will choose mst_text over
mst_solib_trampoline. */
- RECORD_MINIMAL_SYMBOL
+ record_minimal_symbol
(namestring, symbol.n_value,
- mst_solib_trampoline,
- secnum_to_section (symbol.n_scnum, objfile),
- objfile);
+ mst_solib_trampoline, symbol.n_scnum, objfile);
+ misc_func_recorded = 1;
break;
case XMC_DS:
@@ -2433,7 +2444,8 @@ scan_xcoff_symtab (struct objfile *objfile)
(namestring, symbol.n_value,
sclass == C_HIDEXT ? mst_file_data : mst_data,
secnum_to_section (symbol.n_scnum, objfile),
- NULL, objfile);
+ secnum_to_bfd_section (symbol.n_scnum, objfile),
+ objfile);
break;
}
break;
@@ -2450,7 +2462,8 @@ scan_xcoff_symtab (struct objfile *objfile)
(namestring, symbol.n_value,
sclass == C_HIDEXT ? mst_file_bss : mst_bss,
secnum_to_section (symbol.n_scnum, objfile),
- NULL, objfile);
+ secnum_to_bfd_section (symbol.n_scnum, objfile),
+ objfile);
break;
}
break;
@@ -2476,9 +2489,9 @@ scan_xcoff_symtab (struct objfile *objfile)
it as a function. This will take care of functions like
strcmp() compiled by xlc. */
- RECORD_MINIMAL_SYMBOL
- (last_csect_name, last_csect_val,
- mst_text, last_csect_sec, objfile);
+ record_minimal_symbol (last_csect_name, last_csect_val,
+ mst_text, last_csect_sec, objfile);
+ misc_func_recorded = 1;
}
if (pst)
@@ -2619,13 +2632,13 @@ scan_xcoff_symtab (struct objfile *objfile)
psymtab_include_list[includes_used++] = namestring;
if (includes_used >= includes_allocated)
{
- char **orig = psymtab_include_list;
+ const char **orig = psymtab_include_list;
- psymtab_include_list = (char **)
+ psymtab_include_list = (const char **)
alloca ((includes_allocated *= 2) *
- sizeof (char *));
+ sizeof (const char *));
memcpy (psymtab_include_list, orig,
- includes_used * sizeof (char *));
+ includes_used * sizeof (const char *));
}
continue;
}
@@ -3123,6 +3136,7 @@ static const struct sym_fns xcoff_sym_fns =
default_symfile_segments, /* Get segment information from a file. */
aix_process_linenos,
default_symfile_relocate, /* Relocate a debug section. */
+ NULL, /* sym_probe_fns */
&psym_functions
};
« no previous file with comments | « gdb/wrapper.c ('k') | gdb/xcoffsolib.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698