aboutsummaryrefslogtreecommitdiff
path: root/bfd/coffcode.h
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>1995-10-09 23:32:22 +0000
committerIan Lance Taylor <ian@airs.com>1995-10-09 23:32:22 +0000
commit49488f2b2dc4d17b6f62b7f9f4494e0edb8fd035 (patch)
treefe0ecb969338d65394e5b65d9da0f7e0be8ce60b /bfd/coffcode.h
parent24e60978684ee2f137dc270ea3c3ef28da25ed37 (diff)
downloadgdb-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.h44
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