aboutsummaryrefslogtreecommitdiff
path: root/bfd
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
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')
-rw-r--r--bfd/ChangeLog11
-rw-r--r--bfd/coffcode.h44
-rw-r--r--bfd/coffgen.c25
-rw-r--r--bfd/libcoff.h5
4 files changed, 80 insertions, 5 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 6bda4ae..864a86c 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,16 @@
Mon Oct 9 11:24:08 1995 Ian Lance Taylor <ian@cygnus.com>
+ * 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.
+
* libcoff-in.h (struct xcoff_tdata): Define.
(xcoff_data): Define.
* bfd.c (struct _bfd): Add xcoff_obj_data field to tdata union.
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
diff --git a/bfd/coffgen.c b/bfd/coffgen.c
index 2f36447..d9c58e3 100644
--- a/bfd/coffgen.c
+++ b/bfd/coffgen.c
@@ -576,6 +576,18 @@ coff_mangle_symbols (bfd_ptr)
((combined_entry_type *) s->u.syment.n_value)->offset;
s->fix_value = 0;
}
+ if (s->fix_line)
+ {
+ /* The value is the offset into the line number entries
+ for the symbol's section. On output, the symbol's
+ section should be N_DEBUG. */
+ s->u.syment.n_value =
+ (coff_symbol_ptr->symbol.section->output_section->line_filepos
+ + s->u.syment.n_value * bfd_coff_linesz (bfd_ptr));
+ coff_symbol_ptr->symbol.section =
+ coff_section_from_bfd_index (bfd_ptr, N_DEBUG);
+ BFD_ASSERT (coff_symbol_ptr->symbol.flags & BSF_DEBUGGING);
+ }
for (i = 0; i < s->u.syment.n_numaux; i++)
{
combined_entry_type *a = s + i + 1;
@@ -729,7 +741,8 @@ coff_write_symbol (abfd, symbol, native, written, string_size_p,
if (native->u.syment.n_sclass == C_FILE)
symbol->flags |= BSF_DEBUGGING;
- if (symbol->flags & BSF_DEBUGGING)
+ if (symbol->flags & BSF_DEBUGGING
+ && bfd_is_abs_section (symbol->section))
{
native->u.syment.n_scnum = N_DEBUG;
}
@@ -1699,6 +1712,7 @@ coff_print_symbol (abfd, filep, symbol, how)
case bfd_print_symbol_all:
if (coffsymbol (symbol)->native)
{
+ unsigned long val;
unsigned int aux;
combined_entry_type *combined = coffsymbol (symbol)->native;
combined_entry_type *root = obj_raw_syments (abfd);
@@ -1706,6 +1720,13 @@ coff_print_symbol (abfd, filep, symbol, how)
fprintf (file, "[%3ld]", (long) (combined - root));
+ if (! combined->fix_value)
+ val = (unsigned long) combined->u.syment.n_value;
+ else
+ val = ((unsigned long)
+ ((combined_entry_type *) combined->u.syment.n_value
+ - root));
+
fprintf (file,
"(sec %2d)(fl 0x%02x)(ty %3x)(scl %3d) (nx %d) 0x%08lx %s",
combined->u.syment.n_scnum,
@@ -1713,7 +1734,7 @@ coff_print_symbol (abfd, filep, symbol, how)
combined->u.syment.n_type,
combined->u.syment.n_sclass,
combined->u.syment.n_numaux,
- (unsigned long) combined->u.syment.n_value,
+ val,
symbol->name);
for (aux = 0; aux < combined->u.syment.n_numaux; aux++)
diff --git a/bfd/libcoff.h b/bfd/libcoff.h
index 98eeaf3..df83b65 100644
--- a/bfd/libcoff.h
+++ b/bfd/libcoff.h
@@ -294,6 +294,11 @@ unsigned int fix_end : 1;
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. */