* ecoff.c (localsym_t): Add addend field.

(add_ecoff_symbol): Add addend argument.  Change all callers.
	(coff_sym_value): Make static.
	(coff_sym_addend): New static variable.
	(ecoff_directive_def): Initialize coff_sym_addend.
	(ecoff_directive_val): Accept symbol + constant.
	(ecoff_directive_endef): Pass coff_sym_addend to add_ecoff_symbol.
	(ecoff_build_symbols): Include the addend in the symbol value.
This commit is contained in:
Ian Lance Taylor
1996-01-29 17:25:26 +00:00
parent d221b17e83
commit 8e3ff08126
2 changed files with 85 additions and 56 deletions

View File

@ -1,3 +1,14 @@
Mon Jan 29 12:21:30 1996 Ian Lance Taylor <ian@cygnus.com>
* ecoff.c (localsym_t): Add addend field.
(add_ecoff_symbol): Add addend argument. Change all callers.
(coff_sym_value): Make static.
(coff_sym_addend): New static variable.
(ecoff_directive_def): Initialize coff_sym_addend.
(ecoff_directive_val): Accept symbol + constant.
(ecoff_directive_endef): Pass coff_sym_addend to add_ecoff_symbol.
(ecoff_build_symbols): Include the addend in the symbol value.
Fri Jan 26 19:28:52 1996 Kim Knuttila <krk@cygnus.com> Fri Jan 26 19:28:52 1996 Kim Knuttila <krk@cygnus.com>
* config/tc-ppc.c (md_assemble): Ignore overflow on * config/tc-ppc.c (md_assemble): Ignore overflow on

View File

@ -1,5 +1,5 @@
/* ECOFF debugging support. /* ECOFF debugging support.
Copyright (C) 1993 Free Software Foundation, Inc. Copyright (C) 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
Contributed by Cygnus Support. Contributed by Cygnus Support.
This file was put together by Ian Lance Taylor <ian@cygnus.com>. A This file was put together by Ian Lance Taylor <ian@cygnus.com>. A
good deal of it comes directly from mips-tfile.c, by Michael good deal of it comes directly from mips-tfile.c, by Michael
@ -18,8 +18,9 @@
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with GAS; see the file COPYING. If not, write to along with GAS; see the file COPYING. If not, write to the Free
the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA. */
#include "as.h" #include "as.h"
@ -832,6 +833,7 @@ typedef struct scope {
typedef struct localsym { typedef struct localsym {
const char *name; /* symbol name */ const char *name; /* symbol name */
symbolS *as_sym; /* symbol as seen by gas */ symbolS *as_sym; /* symbol as seen by gas */
bfd_vma addend; /* addend to as_sym value */
struct efdr *file_ptr; /* file pointer */ struct efdr *file_ptr; /* file pointer */
struct ecoff_proc *proc_ptr; /* proc pointer */ struct ecoff_proc *proc_ptr; /* proc pointer */
struct localsym *begin_ptr; /* symbol at start of block */ struct localsym *begin_ptr; /* symbol at start of block */
@ -1425,7 +1427,7 @@ static symint_t add_string PARAMS ((varray_t *vp,
shash_t **ret_hash)); shash_t **ret_hash));
static localsym_t *add_ecoff_symbol PARAMS ((const char *str, st_t type, static localsym_t *add_ecoff_symbol PARAMS ((const char *str, st_t type,
sc_t storage, symbolS *sym, sc_t storage, symbolS *sym,
symint_t value, bfd_vma addend, symint_t value,
symint_t indx)); symint_t indx));
static symint_t add_aux_sym_symint PARAMS ((symint_t aux_word)); static symint_t add_aux_sym_symint PARAMS ((symint_t aux_word));
static symint_t add_aux_sym_rndx PARAMS ((int file_index, static symint_t add_aux_sym_rndx PARAMS ((int file_index,
@ -1600,11 +1602,12 @@ add_string (vp, hash_tbl, str, ret_hash)
/* Add debugging information for a symbol. */ /* Add debugging information for a symbol. */
static localsym_t * static localsym_t *
add_ecoff_symbol (str, type, storage, sym_value, value, indx) add_ecoff_symbol (str, type, storage, sym_value, addend, value, indx)
const char *str; /* symbol name */ const char *str; /* symbol name */
st_t type; /* symbol type */ st_t type; /* symbol type */
sc_t storage; /* storage class */ sc_t storage; /* storage class */
symbolS *sym_value; /* associated symbol. */ symbolS *sym_value; /* associated symbol. */
bfd_vma addend; /* addend to sym_value. */
symint_t value; /* value of symbol */ symint_t value; /* value of symbol */
symint_t indx; /* index to local/aux. syms */ symint_t indx; /* index to local/aux. syms */
{ {
@ -1634,6 +1637,7 @@ add_ecoff_symbol (str, type, storage, sym_value, value, indx)
psym->as_sym = sym_value; psym->as_sym = sym_value;
if (sym_value != (symbolS *) NULL) if (sym_value != (symbolS *) NULL)
sym_value->ecoff_symbol = psym; sym_value->ecoff_symbol = psym;
psym->addend = addend;
psym->file_ptr = cur_file_ptr; psym->file_ptr = cur_file_ptr;
psym->proc_ptr = cur_proc_ptr; psym->proc_ptr = cur_proc_ptr;
psym->begin_ptr = (localsym_t *) NULL; psym->begin_ptr = (localsym_t *) NULL;
@ -2104,6 +2108,7 @@ add_unknown_tag (ptag)
st_Block, st_Block,
sc_Info, sc_Info,
(symbolS *) NULL, (symbolS *) NULL,
(bfd_vma) 0,
(symint_t) 0, (symint_t) 0,
(symint_t) 0); (symint_t) 0);
@ -2111,6 +2116,7 @@ add_unknown_tag (ptag)
st_End, st_End,
sc_Info, sc_Info,
(symbolS *) NULL, (symbolS *) NULL,
(bfd_vma) 0,
(symint_t) 0, (symint_t) 0,
(symint_t) 0); (symint_t) 0);
@ -2157,7 +2163,8 @@ add_procedure (func)
/* Push the start of the function. */ /* Push the start of the function. */
new_proc_ptr->sym = add_ecoff_symbol ((const char *) NULL, st_Proc, sc_Text, new_proc_ptr->sym = add_ecoff_symbol ((const char *) NULL, st_Proc, sc_Text,
symbol_find_or_make (func), symbol_find_or_make (func),
(symint_t) 0, (symint_t) 0); (bfd_vma) 0, (symint_t) 0,
(symint_t) 0);
++proc_cnt; ++proc_cnt;
@ -2225,7 +2232,7 @@ add_file (file_name, indx, fake)
symbol_new ("L0\001", now_seg, symbol_new ("L0\001", now_seg,
(valueT) frag_now_fix (), (valueT) frag_now_fix (),
frag_now), frag_now),
0, ECOFF_MARK_STAB (N_SOL)); (bfd_vma) 0, 0, ECOFF_MARK_STAB (N_SOL));
return; return;
} }
@ -2292,7 +2299,7 @@ add_file (file_name, indx, fake)
/* Push the start of the filename. We assume that the filename /* Push the start of the filename. We assume that the filename
will be stored at string offset 1. */ will be stored at string offset 1. */
(void) add_ecoff_symbol (file_name, st_File, sc_Text, (void) add_ecoff_symbol (file_name, st_File, sc_Text,
(symbolS *) NULL, (symbolS *) NULL, (bfd_vma) 0,
(symint_t) 0, (symint_t) 0); (symint_t) 0, (symint_t) 0);
fil_ptr->fdr.rss = 1; fil_ptr->fdr.rss = 1;
fil_ptr->name = &fil_ptr->strings.last->datum->byte[1]; fil_ptr->name = &fil_ptr->strings.last->datum->byte[1];
@ -2321,9 +2328,9 @@ add_file (file_name, indx, fake)
symbol_new ("L0\001", now_seg, symbol_new ("L0\001", now_seg,
(valueT) frag_now_fix (), (valueT) frag_now_fix (),
frag_now), frag_now),
0, ECOFF_MARK_STAB (N_SO)); (bfd_vma) 0, 0, ECOFF_MARK_STAB (N_SO));
(void) add_ecoff_symbol ("void:t1=1", st_Nil, sc_Nil, (void) add_ecoff_symbol ("void:t1=1", st_Nil, sc_Nil,
(symbolS *) NULL, 0, (symbolS *) NULL, (bfd_vma) 0, 0,
ECOFF_MARK_STAB (N_LSYM)); ECOFF_MARK_STAB (N_LSYM));
} }
#endif #endif
@ -2438,7 +2445,7 @@ ecoff_directive_begin (ignore)
(void) add_ecoff_symbol ((const char *) NULL, st_Block, sc_Text, (void) add_ecoff_symbol ((const char *) NULL, st_Block, sc_Text,
symbol_find_or_make (name), symbol_find_or_make (name),
(symint_t) 0, (symint_t) 0); (bfd_vma) 0, (symint_t) 0, (symint_t) 0);
*input_line_pointer = name_end; *input_line_pointer = name_end;
@ -2483,7 +2490,7 @@ ecoff_directive_bend (ignore)
as_warn (".bend directive names unknown symbol"); as_warn (".bend directive names unknown symbol");
else else
(void) add_ecoff_symbol ((const char *) NULL, st_End, sc_Text, endsym, (void) add_ecoff_symbol ((const char *) NULL, st_End, sc_Text, endsym,
(symint_t) 0, (symint_t) 0); (bfd_vma) 0, (symint_t) 0, (symint_t) 0);
*input_line_pointer = name_end; *input_line_pointer = name_end;
@ -2503,7 +2510,8 @@ static st_t coff_symbol_typ;
static int coff_is_function; static int coff_is_function;
static char *coff_tag; static char *coff_tag;
static valueT coff_value; static valueT coff_value;
symbolS *coff_sym_value; static symbolS *coff_sym_value;
static bfd_vma coff_sym_addend;
static int coff_inside_enumeration; static int coff_inside_enumeration;
/* Handle a .def directive: start defining a symbol. */ /* Handle a .def directive: start defining a symbol. */
@ -2541,6 +2549,7 @@ ecoff_directive_def (ignore)
coff_tag = (char *) NULL; coff_tag = (char *) NULL;
coff_value = 0; coff_value = 0;
coff_sym_value = (symbolS *) NULL; coff_sym_value = (symbolS *) NULL;
coff_sym_addend = 0;
} }
*input_line_pointer = name_end; *input_line_pointer = name_end;
@ -2779,6 +2788,8 @@ void
ecoff_directive_val (ignore) ecoff_directive_val (ignore)
int ignore; int ignore;
{ {
expressionS exp;
if (coff_sym_name == (char *) NULL) if (coff_sym_name == (char *) NULL)
{ {
as_warn (".val pseudo-op used outside of .def/.endef; ignored"); as_warn (".val pseudo-op used outside of .def/.endef; ignored");
@ -2786,26 +2797,20 @@ ecoff_directive_val (ignore)
return; return;
} }
if (! is_name_beginner ((unsigned char) *input_line_pointer)) expression (&exp);
coff_value = get_absolute_expression (); if (exp.X_op != O_constant && exp.X_op != O_symbol)
{
as_bad (".val expression is too copmlex");
demand_empty_rest_of_line ();
return;
}
if (exp.X_op == O_constant)
coff_value = exp.X_add_number;
else else
{ {
char *name; coff_sym_value = exp.X_add_symbol;
char name_end; coff_sym_addend = exp.X_add_number;
name = input_line_pointer;
name_end = get_symbol_end ();
if (strcmp (name, ".") == 0)
as_warn ("`.val .' not supported");
else
coff_sym_value = symbol_find_or_make (name);
*input_line_pointer = name_end;
/* FIXME: gcc can generate address expressions here in unusual
cases (search for "obscure" in sdbout.c), although this is
very unlikely for a MIPS chip. */
} }
demand_empty_rest_of_line (); demand_empty_rest_of_line ();
@ -2967,6 +2972,7 @@ ecoff_directive_endef (ignore)
coff_symbol_typ, coff_symbol_typ,
coff_storage_class, coff_storage_class,
coff_sym_value, coff_sym_value,
coff_sym_addend,
(symint_t) coff_value, (symint_t) coff_value,
indx); indx);
@ -3039,7 +3045,7 @@ ecoff_directive_end (ignore)
symbol_new ("L0\001", now_seg, symbol_new ("L0\001", now_seg,
(valueT) frag_now_fix (), (valueT) frag_now_fix (),
frag_now), frag_now),
(symint_t) 0, (symint_t) 0); (bfd_vma) 0, (symint_t) 0, (symint_t) 0);
if (stabs_seen && generate_asm_lineno) if (stabs_seen && generate_asm_lineno)
{ {
@ -3049,7 +3055,8 @@ ecoff_directive_end (ignore)
strcpy (n, name); strcpy (n, name);
strcat (n, ":F1"); strcat (n, ":F1");
(void) add_ecoff_symbol ((const char *) n, stGlobal, scText, (void) add_ecoff_symbol ((const char *) n, stGlobal, scText,
ent, 0, ECOFF_MARK_STAB (N_FUN)); ent, (bfd_vma) 0, 0,
ECOFF_MARK_STAB (N_FUN));
} }
} }
@ -3304,7 +3311,7 @@ ecoff_directive_loc (ignore)
symbol_new ("L0\001", now_seg, symbol_new ("L0\001", now_seg,
(valueT) frag_now_fix (), (valueT) frag_now_fix (),
frag_now), frag_now),
0, lineno); (bfd_vma) 0, 0, lineno);
return; return;
} }
@ -3348,7 +3355,8 @@ mark_stabs (ignore)
stabs_seen = 1; stabs_seen = 1;
(void) add_ecoff_symbol (stabs_symbol, stNil, scInfo, (void) add_ecoff_symbol (stabs_symbol, stNil, scInfo,
(symbolS *) NULL, (symbolS *) NULL,
(symint_t) -1, ECOFF_MARK_STAB (0)); (bfd_vma) 0, (symint_t) -1,
ECOFF_MARK_STAB (0));
} }
} }
@ -3539,23 +3547,23 @@ ecoff_stab (sec, what, string, type, other, desc)
{ {
char *name; char *name;
char name_end; char name_end;
expressionS exp;
name = input_line_pointer;
name_end = get_symbol_end ();
sym = symbol_find_or_make (name);
sc = sc_Nil; sc = sc_Nil;
st = st_Nil; st = st_Nil;
value = 0; value = 0;
*input_line_pointer = name_end; if (string == NULL)
if (name_end == '+' || name_end == '-')
{ {
++input_line_pointer; name = input_line_pointer;
value = get_absolute_expression (); name_end = get_symbol_end ();
if (name_end == '-') sym = symbol_find_or_make (name);
value = - value; *input_line_pointer = name_end;
}
else
{
sym = symbol_find_or_make (string);
expression (&sym->sy_value);
} }
} }
@ -3568,7 +3576,7 @@ ecoff_stab (sec, what, string, type, other, desc)
if (sym != (symbolS *) NULL) if (sym != (symbolS *) NULL)
hold = sym->ecoff_symbol; hold = sym->ecoff_symbol;
(void) add_ecoff_symbol (string, st, sc, sym, value, indx); (void) add_ecoff_symbol (string, st, sc, sym, (bfd_vma) 0, value, indx);
if (sym != (symbolS *) NULL) if (sym != (symbolS *) NULL)
sym->ecoff_symbol = hold; sym->ecoff_symbol = hold;
@ -3606,6 +3614,14 @@ ecoff_frob_symbol (sym)
} }
S_SET_SEGMENT (sym, &scom_section); S_SET_SEGMENT (sym, &scom_section);
} }
/* Double check weak symbols. */
if (sym->bsym->flags & BSF_WEAK)
{
if (S_IS_COMMON (sym))
as_bad ("Symbol `%s' can not be both weak and common",
S_GET_NAME (sym));
}
} }
/* Add bytes to the symbolic information buffer. */ /* Add bytes to the symbolic information buffer. */
@ -3984,7 +4000,8 @@ ecoff_build_symbols (backend, buf, bufend, offset)
sym_ptr->ecoff_sym.asym.value = sym_ptr->ecoff_sym.asym.value =
(S_GET_VALUE (as_sym) (S_GET_VALUE (as_sym)
+ bfd_get_section_vma (stdoutput, + bfd_get_section_vma (stdoutput,
S_GET_SEGMENT (as_sym))); S_GET_SEGMENT (as_sym))
+ sym_ptr->addend);
sym_ptr->ecoff_sym.weakext = S_IS_WEAK (as_sym); sym_ptr->ecoff_sym.weakext = S_IS_WEAK (as_sym);
@ -4329,7 +4346,7 @@ ecoff_build_aux (backend, buf, bufend, offset)
long iaux; long iaux;
vlinks_t *file_link; vlinks_t *file_link;
bigendian = stdoutput->xvec->header_byteorder_big_p; bigendian = bfd_big_endian (stdoutput);
aux_out = (union aux_ext *) (*buf + offset); aux_out = (union aux_ext *) (*buf + offset);
@ -4642,7 +4659,7 @@ ecoff_build_debug (hdr, bufp, backend)
cur_file_ptr = sym->ecoff_file; cur_file_ptr = sym->ecoff_file;
add_ecoff_symbol ((const char *) NULL, st_Nil, sc_Nil, sym, add_ecoff_symbol ((const char *) NULL, st_Nil, sc_Nil, sym,
S_GET_VALUE (sym), indexNil); (bfd_vma) 0, S_GET_VALUE (sym), indexNil);
} }
cur_proc_ptr = hold_proc_ptr; cur_proc_ptr = hold_proc_ptr;
cur_file_ptr = hold_file_ptr; cur_file_ptr = hold_file_ptr;
@ -4670,6 +4687,7 @@ ecoff_build_debug (hdr, bufp, backend)
(void) add_ecoff_symbol ((const char *) NULL, (void) add_ecoff_symbol ((const char *) NULL,
st_End, sc_Text, st_End, sc_Text,
(symbolS *) NULL, (symbolS *) NULL,
(bfd_vma) 0,
(symint_t) 0, (symint_t) 0,
(symint_t) 0); (symint_t) 0);
} }
@ -5247,7 +5265,7 @@ generate_ecoff_stab (what, string, type, other, desc)
if (sym != (symbolS *) NULL) if (sym != (symbolS *) NULL)
hold = sym->ecoff_symbol; hold = sym->ecoff_symbol;
(void) add_ecoff_symbol (string, st, sc, sym, value, indx); (void) add_ecoff_symbol (string, st, sc, sym, (bfd_vma) 0, value, indx);
if (sym != (symbolS *) NULL) if (sym != (symbolS *) NULL)
sym->ecoff_symbol = hold; sym->ecoff_symbol = hold;