diff options
author | Ian Lance Taylor <ian@airs.com> | 1995-10-09 23:32:22 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@airs.com> | 1995-10-09 23:32:22 +0000 |
commit | 49488f2b2dc4d17b6f62b7f9f4494e0edb8fd035 (patch) | |
tree | fe0ecb969338d65394e5b65d9da0f7e0be8ce60b /bfd/coffcode.h | |
parent | 24e60978684ee2f137dc270ea3c3ef28da25ed37 (diff) | |
download | gdb-49488f2b2dc4d17b6f62b7f9f4494e0edb8fd035.zip gdb-49488f2b2dc4d17b6f62b7f9f4494e0edb8fd035.tar.gz gdb-49488f2b2dc4d17b6f62b7f9f4494e0edb8fd035.tar.bz2 |
* coffcode.h (combined_entry_type): Add fix_line field.
(coff_slurp_line_table): Warn if we try to set the lineno field of
a symbol twice.
(coff_slurp_symbol_table): If RS6000COFF_C, handle C_BINCL and
C_EINCL by setting fix_line. Fix C_BSTAT symbol value.
* coffgen.c (coff_mangle_symbols): Handle fix_line.
(coff_write_symbol): Only use N_DEBUG if the symbol is in the
absolute section.
(coff_print_symbol): Print fix_value symbols in a useful fashion.
* libcoff.h: Rebuild.
Diffstat (limited to 'bfd/coffcode.h')
-rw-r--r-- | bfd/coffcode.h | 44 |
1 files changed, 41 insertions, 3 deletions
diff --git a/bfd/coffcode.h b/bfd/coffcode.h index 85665c6..0af357b 100644 --- a/bfd/coffcode.h +++ b/bfd/coffcode.h @@ -268,6 +268,11 @@ CODE_FRAGMENT . Created by coff_pointerize_aux. *} .unsigned int fix_scnlen : 1; . +. {* Fix up an XCOFF C_BINCL/C_EINCL symbol. The value is the +. index into the line number entries. Set by +. coff_slurp_symbol_table. *} +.unsigned int fix_line : 1; +. . {* The container for the symbol structure as read and translated . from the file. *} . @@ -2453,6 +2458,13 @@ coff_slurp_line_table (abfd, asect) (coff_symbol_type *) (dst.l_addr.l_symndx + obj_raw_syments (abfd))->u.syment._n._n_n._n_zeroes; cache_ptr->u.sym = (asymbol *) sym; + if (sym->lineno != NULL) + { + (*_bfd_error_handler) + ("%s: warning: duplicate line number information for `%s'", + bfd_get_filename (abfd), + bfd_asymbol_name (&sym->symbol)); + } sym->lineno = cache_ptr; } else @@ -2641,8 +2653,6 @@ coff_slurp_symbol_table (abfd) case C_FILE: /* file name */ case C_STRTAG: /* structure tag */ #ifdef RS6000COFF_C - case C_BINCL: /* beginning of include file */ - case C_EINCL: /* ending of include file */ case C_GSYM: case C_LSYM: case C_PSYM: @@ -2659,15 +2669,43 @@ coff_slurp_symbol_table (abfd) break; #ifdef RS6000COFF_C + case C_BINCL: /* beginning of include file */ + case C_EINCL: /* ending of include file */ + /* The value is actually a pointer into the line numbers + of the file. We locate the line number entry, and + set the section to the section which contains it, and + the value to the index in that section. */ + { + asection *sec; + + dst->symbol.flags = BSF_DEBUGGING; + for (sec = abfd->sections; sec != NULL; sec = sec->next) + if (sec->line_filepos <= src->u.syment.n_value + && (sec->line_filepos + sec->lineno_count * LINESZ + > src->u.syment.n_value)) + break; + if (sec == NULL) + dst->symbol.value = 0; + else + { + dst->symbol.section = sec; + dst->symbol.value = ((src->u.syment.n_value + - sec->line_filepos) + / LINESZ); + src->fix_line = 1; + } + } + break; + case C_BSTAT: dst->symbol.flags = BSF_DEBUGGING; - dst->symbol.value = src->u.syment.n_value; /* The value is actually a symbol index. Save a pointer to the symbol instead of the index. FIXME: This should use a union. */ src->u.syment.n_value = (long) (native_symbols + src->u.syment.n_value); + dst->symbol.value = src->u.syment.n_value; src->fix_value = 1; break; #endif |