mirror of
https://github.com/darlinghq/darling-gdb.git
synced 2025-03-03 15:07:59 +00:00
* 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:
parent
d221b17e83
commit
8e3ff08126
@ -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>
|
||||
|
||||
* config/tc-ppc.c (md_assemble): Ignore overflow on
|
||||
|
130
gas/ecoff.c
130
gas/ecoff.c
@ -1,5 +1,5 @@
|
||||
/* ECOFF debugging support.
|
||||
Copyright (C) 1993 Free Software Foundation, Inc.
|
||||
Copyright (C) 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
|
||||
Contributed by Cygnus Support.
|
||||
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
|
||||
@ -18,8 +18,9 @@
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GAS; see the file COPYING. If not, write to
|
||||
the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
along with GAS; see the file COPYING. If not, write to the Free
|
||||
Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||
02111-1307, USA. */
|
||||
|
||||
#include "as.h"
|
||||
|
||||
@ -832,6 +833,7 @@ typedef struct scope {
|
||||
typedef struct localsym {
|
||||
const char *name; /* symbol name */
|
||||
symbolS *as_sym; /* symbol as seen by gas */
|
||||
bfd_vma addend; /* addend to as_sym value */
|
||||
struct efdr *file_ptr; /* file pointer */
|
||||
struct ecoff_proc *proc_ptr; /* proc pointer */
|
||||
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));
|
||||
static localsym_t *add_ecoff_symbol PARAMS ((const char *str, st_t type,
|
||||
sc_t storage, symbolS *sym,
|
||||
symint_t value,
|
||||
bfd_vma addend, symint_t value,
|
||||
symint_t indx));
|
||||
static symint_t add_aux_sym_symint PARAMS ((symint_t aux_word));
|
||||
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. */
|
||||
|
||||
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 */
|
||||
st_t type; /* symbol type */
|
||||
sc_t storage; /* storage class */
|
||||
symbolS *sym_value; /* associated symbol. */
|
||||
bfd_vma addend; /* addend to sym_value. */
|
||||
symint_t value; /* value of symbol */
|
||||
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;
|
||||
if (sym_value != (symbolS *) NULL)
|
||||
sym_value->ecoff_symbol = psym;
|
||||
psym->addend = addend;
|
||||
psym->file_ptr = cur_file_ptr;
|
||||
psym->proc_ptr = cur_proc_ptr;
|
||||
psym->begin_ptr = (localsym_t *) NULL;
|
||||
@ -2104,6 +2108,7 @@ add_unknown_tag (ptag)
|
||||
st_Block,
|
||||
sc_Info,
|
||||
(symbolS *) NULL,
|
||||
(bfd_vma) 0,
|
||||
(symint_t) 0,
|
||||
(symint_t) 0);
|
||||
|
||||
@ -2111,6 +2116,7 @@ add_unknown_tag (ptag)
|
||||
st_End,
|
||||
sc_Info,
|
||||
(symbolS *) NULL,
|
||||
(bfd_vma) 0,
|
||||
(symint_t) 0,
|
||||
(symint_t) 0);
|
||||
|
||||
@ -2157,7 +2163,8 @@ add_procedure (func)
|
||||
/* Push the start of the function. */
|
||||
new_proc_ptr->sym = add_ecoff_symbol ((const char *) NULL, st_Proc, sc_Text,
|
||||
symbol_find_or_make (func),
|
||||
(symint_t) 0, (symint_t) 0);
|
||||
(bfd_vma) 0, (symint_t) 0,
|
||||
(symint_t) 0);
|
||||
|
||||
++proc_cnt;
|
||||
|
||||
@ -2225,7 +2232,7 @@ add_file (file_name, indx, fake)
|
||||
symbol_new ("L0\001", now_seg,
|
||||
(valueT) frag_now_fix (),
|
||||
frag_now),
|
||||
0, ECOFF_MARK_STAB (N_SOL));
|
||||
(bfd_vma) 0, 0, ECOFF_MARK_STAB (N_SOL));
|
||||
return;
|
||||
}
|
||||
|
||||
@ -2292,7 +2299,7 @@ add_file (file_name, indx, fake)
|
||||
/* Push the start of the filename. We assume that the filename
|
||||
will be stored at string offset 1. */
|
||||
(void) add_ecoff_symbol (file_name, st_File, sc_Text,
|
||||
(symbolS *) NULL,
|
||||
(symbolS *) NULL, (bfd_vma) 0,
|
||||
(symint_t) 0, (symint_t) 0);
|
||||
fil_ptr->fdr.rss = 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,
|
||||
(valueT) frag_now_fix (),
|
||||
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,
|
||||
(symbolS *) NULL, 0,
|
||||
(symbolS *) NULL, (bfd_vma) 0, 0,
|
||||
ECOFF_MARK_STAB (N_LSYM));
|
||||
}
|
||||
#endif
|
||||
@ -2438,7 +2445,7 @@ ecoff_directive_begin (ignore)
|
||||
|
||||
(void) add_ecoff_symbol ((const char *) NULL, st_Block, sc_Text,
|
||||
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;
|
||||
|
||||
@ -2483,7 +2490,7 @@ ecoff_directive_bend (ignore)
|
||||
as_warn (".bend directive names unknown symbol");
|
||||
else
|
||||
(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;
|
||||
|
||||
@ -2503,7 +2510,8 @@ static st_t coff_symbol_typ;
|
||||
static int coff_is_function;
|
||||
static char *coff_tag;
|
||||
static valueT coff_value;
|
||||
symbolS *coff_sym_value;
|
||||
static symbolS *coff_sym_value;
|
||||
static bfd_vma coff_sym_addend;
|
||||
static int coff_inside_enumeration;
|
||||
|
||||
/* Handle a .def directive: start defining a symbol. */
|
||||
@ -2541,6 +2549,7 @@ ecoff_directive_def (ignore)
|
||||
coff_tag = (char *) NULL;
|
||||
coff_value = 0;
|
||||
coff_sym_value = (symbolS *) NULL;
|
||||
coff_sym_addend = 0;
|
||||
}
|
||||
|
||||
*input_line_pointer = name_end;
|
||||
@ -2779,6 +2788,8 @@ void
|
||||
ecoff_directive_val (ignore)
|
||||
int ignore;
|
||||
{
|
||||
expressionS exp;
|
||||
|
||||
if (coff_sym_name == (char *) NULL)
|
||||
{
|
||||
as_warn (".val pseudo-op used outside of .def/.endef; ignored");
|
||||
@ -2786,26 +2797,20 @@ ecoff_directive_val (ignore)
|
||||
return;
|
||||
}
|
||||
|
||||
if (! is_name_beginner ((unsigned char) *input_line_pointer))
|
||||
coff_value = get_absolute_expression ();
|
||||
expression (&exp);
|
||||
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
|
||||
{
|
||||
char *name;
|
||||
char name_end;
|
||||
|
||||
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. */
|
||||
coff_sym_value = exp.X_add_symbol;
|
||||
coff_sym_addend = exp.X_add_number;
|
||||
}
|
||||
|
||||
demand_empty_rest_of_line ();
|
||||
@ -2967,6 +2972,7 @@ ecoff_directive_endef (ignore)
|
||||
coff_symbol_typ,
|
||||
coff_storage_class,
|
||||
coff_sym_value,
|
||||
coff_sym_addend,
|
||||
(symint_t) coff_value,
|
||||
indx);
|
||||
|
||||
@ -3036,10 +3042,10 @@ ecoff_directive_end (ignore)
|
||||
else
|
||||
{
|
||||
(void) add_ecoff_symbol ((const char *) NULL, st_End, sc_Text,
|
||||
symbol_new ("L0\001", now_seg,
|
||||
(valueT) frag_now_fix (),
|
||||
frag_now),
|
||||
(symint_t) 0, (symint_t) 0);
|
||||
symbol_new ("L0\001", now_seg,
|
||||
(valueT) frag_now_fix (),
|
||||
frag_now),
|
||||
(bfd_vma) 0, (symint_t) 0, (symint_t) 0);
|
||||
|
||||
if (stabs_seen && generate_asm_lineno)
|
||||
{
|
||||
@ -3049,7 +3055,8 @@ ecoff_directive_end (ignore)
|
||||
strcpy (n, name);
|
||||
strcat (n, ":F1");
|
||||
(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,
|
||||
(valueT) frag_now_fix (),
|
||||
frag_now),
|
||||
0, lineno);
|
||||
(bfd_vma) 0, 0, lineno);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -3348,7 +3355,8 @@ mark_stabs (ignore)
|
||||
stabs_seen = 1;
|
||||
(void) add_ecoff_symbol (stabs_symbol, stNil, scInfo,
|
||||
(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_end;
|
||||
|
||||
name = input_line_pointer;
|
||||
name_end = get_symbol_end ();
|
||||
|
||||
sym = symbol_find_or_make (name);
|
||||
expressionS exp;
|
||||
|
||||
sc = sc_Nil;
|
||||
st = st_Nil;
|
||||
value = 0;
|
||||
|
||||
*input_line_pointer = name_end;
|
||||
if (name_end == '+' || name_end == '-')
|
||||
if (string == NULL)
|
||||
{
|
||||
++input_line_pointer;
|
||||
value = get_absolute_expression ();
|
||||
if (name_end == '-')
|
||||
value = - value;
|
||||
name = input_line_pointer;
|
||||
name_end = get_symbol_end ();
|
||||
sym = symbol_find_or_make (name);
|
||||
*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)
|
||||
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)
|
||||
sym->ecoff_symbol = hold;
|
||||
@ -3585,8 +3593,8 @@ ecoff_frob_symbol (sym)
|
||||
symbolS *sym;
|
||||
{
|
||||
if (S_IS_COMMON (sym)
|
||||
&& S_GET_VALUE (sym) > 0
|
||||
&& S_GET_VALUE (sym) <= bfd_get_gp_size (stdoutput))
|
||||
&& S_GET_VALUE (sym) > 0
|
||||
&& S_GET_VALUE (sym) <= bfd_get_gp_size (stdoutput))
|
||||
{
|
||||
static asection scom_section;
|
||||
static asymbol scom_symbol;
|
||||
@ -3606,6 +3614,14 @@ ecoff_frob_symbol (sym)
|
||||
}
|
||||
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. */
|
||||
@ -3984,7 +4000,8 @@ ecoff_build_symbols (backend, buf, bufend, offset)
|
||||
sym_ptr->ecoff_sym.asym.value =
|
||||
(S_GET_VALUE (as_sym)
|
||||
+ 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);
|
||||
|
||||
@ -4329,7 +4346,7 @@ ecoff_build_aux (backend, buf, bufend, offset)
|
||||
long iaux;
|
||||
vlinks_t *file_link;
|
||||
|
||||
bigendian = stdoutput->xvec->header_byteorder_big_p;
|
||||
bigendian = bfd_big_endian (stdoutput);
|
||||
|
||||
aux_out = (union aux_ext *) (*buf + offset);
|
||||
|
||||
@ -4642,7 +4659,7 @@ ecoff_build_debug (hdr, bufp, backend)
|
||||
|
||||
cur_file_ptr = sym->ecoff_file;
|
||||
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_file_ptr = hold_file_ptr;
|
||||
@ -4670,6 +4687,7 @@ ecoff_build_debug (hdr, bufp, backend)
|
||||
(void) add_ecoff_symbol ((const char *) NULL,
|
||||
st_End, sc_Text,
|
||||
(symbolS *) NULL,
|
||||
(bfd_vma) 0,
|
||||
(symint_t) 0,
|
||||
(symint_t) 0);
|
||||
}
|
||||
@ -5247,7 +5265,7 @@ generate_ecoff_stab (what, string, type, other, desc)
|
||||
if (sym != (symbolS *) NULL)
|
||||
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)
|
||||
sym->ecoff_symbol = hold;
|
||||
|
Loading…
x
Reference in New Issue
Block a user