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 |
}; |