mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-22 19:09:31 +08:00
* subsegs.c (subseg_new): Set output_section of new section.
* as.c (perform_an_assemly_pass): Don't set output_section here. * expr.c (expr_part, expr): Turn off section assertions for ECOFF, since it has additional sections. * read.c (s_lcomm): For MIPS ECOFF, put small objects in .sbss, not bss_section. * config/obj-ecoff.h (TARGET_SYMBOL_FIELDS): Added ecoff_undefined field. * config/obj-ecoff.c (obj_symbol_new_hook): Initialize ecoff_undefined field. (add_file): If using stabs, just output a stabs symbol rather than creating a new fdr. (obj_ecoff_begin, obj_ecoff_bend): Ignore line number by reading it with get_absolute_expression, rather than skipping it by hand. (obj_ecoff_loc): If using stabs, just output a stabs symbol rather than ECOFF line number information. (obj_ecoff_stab): Accept non-zero values for stabs line number. (ecoff_build_symbols): Set ifilesym correctly. Set storage class to small, undefined and/or readonly sections if appropriate. Don't output symbol names containing \001 characters. (ecoff_frob_file): Make sure at least one fdr is output. * config/tc-mips.h: Define TC_MIPS. * config/tc-mips.c (g_switch_value): New static variable. (md_assemble): Set gp size of output BFD. (gp_reference): New function; returns 1 if expression can be accesssed via gp. Always returns 0 if not using ECOFF. (macro_build): Convert BFD_RELOC_LO16 to BFD_RELOC_MIPS_GPREL if possible. (macro): Generate sequences using gp if possible. (md_parse_option): Ignore -EL and -EB. Parse -G. (md_apply_fix): Added BFD_RELOC_MIPS_GPREL to ignored case. (s_change_sec): Handle .rdata and .sdata for ECOFF. (s_extern): Mark symbol as external. Set ecoff_undefined field.
This commit is contained in:
@ -1,5 +1,47 @@
|
|||||||
|
Wed Mar 31 17:53:54 1993 Ian Lance Taylor (ian@cygnus.com)
|
||||||
|
|
||||||
|
* subsegs.c (subseg_new): Set output_section of new section.
|
||||||
|
* as.c (perform_an_assemly_pass): Don't set output_section here.
|
||||||
|
* expr.c (expr_part, expr): Turn off section assertions for ECOFF,
|
||||||
|
since it has additional sections.
|
||||||
|
* read.c (s_lcomm): For MIPS ECOFF, put small objects in .sbss,
|
||||||
|
not bss_section.
|
||||||
|
* config/obj-ecoff.h (TARGET_SYMBOL_FIELDS): Added
|
||||||
|
ecoff_undefined field.
|
||||||
|
* config/obj-ecoff.c (obj_symbol_new_hook): Initialize
|
||||||
|
ecoff_undefined field.
|
||||||
|
(add_file): If using stabs, just output a stabs symbol rather than
|
||||||
|
creating a new fdr.
|
||||||
|
(obj_ecoff_begin, obj_ecoff_bend): Ignore line number by reading
|
||||||
|
it with get_absolute_expression, rather than skipping it by hand.
|
||||||
|
(obj_ecoff_loc): If using stabs, just output a stabs symbol rather
|
||||||
|
than ECOFF line number information.
|
||||||
|
(obj_ecoff_stab): Accept non-zero values for stabs line number.
|
||||||
|
(ecoff_build_symbols): Set ifilesym correctly. Set storage class
|
||||||
|
to small, undefined and/or readonly sections if appropriate.
|
||||||
|
Don't output symbol names containing \001 characters.
|
||||||
|
(ecoff_frob_file): Make sure at least one fdr is output.
|
||||||
|
* config/tc-mips.h: Define TC_MIPS.
|
||||||
|
* config/tc-mips.c (g_switch_value): New static variable.
|
||||||
|
(md_assemble): Set gp size of output BFD.
|
||||||
|
(gp_reference): New function; returns 1 if expression can be
|
||||||
|
accesssed via gp. Always returns 0 if not using ECOFF.
|
||||||
|
(macro_build): Convert BFD_RELOC_LO16 to BFD_RELOC_MIPS_GPREL if
|
||||||
|
possible.
|
||||||
|
(macro): Generate sequences using gp if possible.
|
||||||
|
(md_parse_option): Ignore -EL and -EB. Parse -G.
|
||||||
|
(md_apply_fix): Added BFD_RELOC_MIPS_GPREL to ignored case.
|
||||||
|
(s_change_sec): Handle .rdata and .sdata for ECOFF.
|
||||||
|
(s_extern): Mark symbol as external. Set ecoff_undefined field.
|
||||||
|
|
||||||
Tue Mar 30 10:11:41 1993 Ken Raeburn (raeburn@cambridge.cygnus.com)
|
Tue Mar 30 10:11:41 1993 Ken Raeburn (raeburn@cambridge.cygnus.com)
|
||||||
|
|
||||||
|
* output-file.c (output_file_create): Don't call as_perror for
|
||||||
|
filename rejected by application.
|
||||||
|
|
||||||
|
* as.c (main) [BFD_ASSEMBLER]: If errors occur, close and unlink
|
||||||
|
the output file.
|
||||||
|
|
||||||
* doc/as.texinfo: Don't use @value in node names for the moment;
|
* doc/as.texinfo: Don't use @value in node names for the moment;
|
||||||
references don't appear to work right.
|
references don't appear to work right.
|
||||||
|
|
||||||
|
@ -30,6 +30,8 @@
|
|||||||
#include "aout/stab_gnu.h"
|
#include "aout/stab_gnu.h"
|
||||||
#include "../bfd/libecoff.h"
|
#include "../bfd/libecoff.h"
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
/* Why isn't this in coff/sym.h? */
|
/* Why isn't this in coff/sym.h? */
|
||||||
#define ST_RFDESCAPE 0xfff
|
#define ST_RFDESCAPE 0xfff
|
||||||
|
|
||||||
@ -1578,6 +1580,7 @@ obj_symbol_new_hook (symbolP)
|
|||||||
{
|
{
|
||||||
symbolP->ecoff_file = cur_file_ptr;
|
symbolP->ecoff_file = cur_file_ptr;
|
||||||
symbolP->ecoff_symbol = 0;
|
symbolP->ecoff_symbol = 0;
|
||||||
|
symbolP->ecoff_undefined = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Add a page to a varray object. */
|
/* Add a page to a varray object. */
|
||||||
@ -2203,6 +2206,8 @@ add_procedure (func)
|
|||||||
|
|
||||||
new_proc_ptr->pdr.isym = -1;
|
new_proc_ptr->pdr.isym = -1;
|
||||||
new_proc_ptr->pdr.iline = -1;
|
new_proc_ptr->pdr.iline = -1;
|
||||||
|
new_proc_ptr->pdr.lnLow = -1;
|
||||||
|
new_proc_ptr->pdr.lnHigh = -1;
|
||||||
|
|
||||||
/* 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,
|
||||||
@ -2261,6 +2266,17 @@ add_file (file_name, indx)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If we're creating stabs, then we don't actually make a new FDR.
|
||||||
|
Instead, we just create a stabs symbol. */
|
||||||
|
if (stabs_seen)
|
||||||
|
{
|
||||||
|
(void) add_ecoff_symbol (file_name, st_Nil, sc_Nil,
|
||||||
|
symbol_new ("L0\001", now_seg,
|
||||||
|
frag_now_fix (), frag_now),
|
||||||
|
0, MIPS_MARK_STAB (N_SOL));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
first_ch = *file_name;
|
first_ch = *file_name;
|
||||||
|
|
||||||
/* See if the file has already been created. */
|
/* See if the file has already been created. */
|
||||||
@ -2440,9 +2456,8 @@ obj_ecoff_begin (ignore)
|
|||||||
*input_line_pointer = name_end;
|
*input_line_pointer = name_end;
|
||||||
|
|
||||||
/* The line number follows, but we don't use it. */
|
/* The line number follows, but we don't use it. */
|
||||||
while (! is_end_of_line[*input_line_pointer])
|
(void) get_absolute_expression ();
|
||||||
input_line_pointer++;
|
demand_empty_rest_of_line ();
|
||||||
input_line_pointer++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Parse .bend directives which have a label as the first argument
|
/* Parse .bend directives which have a label as the first argument
|
||||||
@ -2486,9 +2501,8 @@ obj_ecoff_bend (ignore)
|
|||||||
*input_line_pointer = name_end;
|
*input_line_pointer = name_end;
|
||||||
|
|
||||||
/* The line number follows, but we don't use it. */
|
/* The line number follows, but we don't use it. */
|
||||||
while (! is_end_of_line[*input_line_pointer])
|
(void) get_absolute_expression ();
|
||||||
input_line_pointer++;
|
demand_empty_rest_of_line ();
|
||||||
input_line_pointer++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* COFF debugging information is provided as a series of directives
|
/* COFF debugging information is provided as a series of directives
|
||||||
@ -3201,7 +3215,6 @@ static void
|
|||||||
obj_ecoff_loc (ignore)
|
obj_ecoff_loc (ignore)
|
||||||
int ignore;
|
int ignore;
|
||||||
{
|
{
|
||||||
char buf[20];
|
|
||||||
lineno_list_t *list;
|
lineno_list_t *list;
|
||||||
|
|
||||||
if (cur_file_ptr == (efdr_t *) NULL)
|
if (cur_file_ptr == (efdr_t *) NULL)
|
||||||
@ -3223,6 +3236,17 @@ obj_ecoff_loc (ignore)
|
|||||||
get_absolute_expression ();
|
get_absolute_expression ();
|
||||||
SKIP_WHITESPACE ();
|
SKIP_WHITESPACE ();
|
||||||
|
|
||||||
|
/* If we're building stabs, then output a special label rather than
|
||||||
|
ECOFF line number info. */
|
||||||
|
if (stabs_seen)
|
||||||
|
{
|
||||||
|
(void) add_ecoff_symbol ((char *) NULL, st_Label, sc_Text,
|
||||||
|
symbol_new ("L0\001", now_seg,
|
||||||
|
frag_now_fix (), frag_now),
|
||||||
|
0, get_absolute_expression ());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
list = allocate_lineno_list ();
|
list = allocate_lineno_list ();
|
||||||
|
|
||||||
list->next = (lineno_list_t *) NULL;
|
list->next = (lineno_list_t *) NULL;
|
||||||
@ -3395,17 +3419,14 @@ obj_ecoff_stab (type)
|
|||||||
|
|
||||||
value = 0;
|
value = 0;
|
||||||
st = st_Label;
|
st = st_Label;
|
||||||
sc = sc_Undefined;
|
sc = sc_Text;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Skip 0, */
|
/* The next number is sometimes the line number of the
|
||||||
if (get_absolute_expression () != 0)
|
declaration. We have nowhere to put it, so we just ignore
|
||||||
{
|
it. */
|
||||||
as_warn ("Bad .stab%c directive (expected 0)", type);
|
(void) get_absolute_expression ();
|
||||||
demand_empty_rest_of_line ();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
SKIP_WHITESPACE ();
|
SKIP_WHITESPACE ();
|
||||||
if (*input_line_pointer++ != ',')
|
if (*input_line_pointer++ != ',')
|
||||||
@ -3442,17 +3463,8 @@ obj_ecoff_stab (type)
|
|||||||
|
|
||||||
sym = symbol_find_or_make (name);
|
sym = symbol_find_or_make (name);
|
||||||
|
|
||||||
/* Traditionally, N_LBRAC and N_RBRAC are *not* relocated. */
|
sc = sc_Nil;
|
||||||
if (code == N_LBRAC || code == N_RBRAC)
|
st = st_Nil;
|
||||||
{
|
|
||||||
sc = sc_Nil;
|
|
||||||
st = st_Nil;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sc = sc_Undefined;
|
|
||||||
st = st_Nil;
|
|
||||||
}
|
|
||||||
value = 0;
|
value = 0;
|
||||||
|
|
||||||
*input_line_pointer = name_end;
|
*input_line_pointer = name_end;
|
||||||
@ -3512,6 +3524,7 @@ ecoff_longword_adjust (buf, bufend, offset, bufptrptr)
|
|||||||
add = 4 - (offset & 3);
|
add = 4 - (offset & 3);
|
||||||
if (*bufend - (*buf + offset) < add)
|
if (*bufend - (*buf + offset) < add)
|
||||||
(void) ecoff_add_bytes (buf, bufend, *buf + offset, add);
|
(void) ecoff_add_bytes (buf, bufend, *buf + offset, add);
|
||||||
|
memset (*buf + offset, 0, add);
|
||||||
offset += add;
|
offset += add;
|
||||||
if (bufptrptr != (char **) NULL)
|
if (bufptrptr != (char **) NULL)
|
||||||
*bufptrptr = *buf + offset;
|
*bufptrptr = *buf + offset;
|
||||||
@ -3536,6 +3549,7 @@ ecoff_build_lineno (buf, bufend, offset, linecntptr)
|
|||||||
proc_t *proc;
|
proc_t *proc;
|
||||||
long c;
|
long c;
|
||||||
long iline;
|
long iline;
|
||||||
|
long totcount;
|
||||||
|
|
||||||
bufptr = *buf + offset;
|
bufptr = *buf + offset;
|
||||||
|
|
||||||
@ -3544,11 +3558,28 @@ ecoff_build_lineno (buf, bufend, offset, linecntptr)
|
|||||||
last = (lineno_list_t *) NULL;
|
last = (lineno_list_t *) NULL;
|
||||||
c = offset;
|
c = offset;
|
||||||
iline = 0;
|
iline = 0;
|
||||||
|
totcount = 0;
|
||||||
for (l = first_lineno; l != (lineno_list_t *) NULL; l = l->next)
|
for (l = first_lineno; l != (lineno_list_t *) NULL; l = l->next)
|
||||||
{
|
{
|
||||||
long count;
|
long count;
|
||||||
long delta;
|
long delta;
|
||||||
int didone;
|
|
||||||
|
/* Get the offset to the memory address of the next line number
|
||||||
|
(in words). Do this first, so that we can skip ahead to the
|
||||||
|
next useful line number entry. */
|
||||||
|
if (l->next == (lineno_list_t *) NULL)
|
||||||
|
count = 0;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
count = ((l->next->frag->fr_address + l->next->paddr
|
||||||
|
- (l->frag->fr_address + l->paddr))
|
||||||
|
>> 2);
|
||||||
|
if (count <= 0)
|
||||||
|
{
|
||||||
|
/* Don't change last, so we still get the right delta. */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (l->file != file || l->proc != proc)
|
if (l->file != file || l->proc != proc)
|
||||||
{
|
{
|
||||||
@ -3557,11 +3588,11 @@ ecoff_build_lineno (buf, bufend, offset, linecntptr)
|
|||||||
if (l->file != file && file != (efdr_t *) NULL)
|
if (l->file != file && file != (efdr_t *) NULL)
|
||||||
{
|
{
|
||||||
file->fdr.cbLine = c - file->fdr.cbLineOffset;
|
file->fdr.cbLine = c - file->fdr.cbLineOffset;
|
||||||
file->fdr.cline = iline - file->fdr.ilineBase;
|
/* The cline field is ill-documented. This is a guess
|
||||||
|
at the right value. */
|
||||||
|
file->fdr.cline = totcount + count;
|
||||||
}
|
}
|
||||||
|
|
||||||
c = ecoff_longword_adjust (buf, bufend, c, &bufptr);
|
|
||||||
|
|
||||||
if (l->file != file)
|
if (l->file != file)
|
||||||
{
|
{
|
||||||
file = l->file;
|
file = l->file;
|
||||||
@ -3573,33 +3604,18 @@ ecoff_build_lineno (buf, bufend, offset, linecntptr)
|
|||||||
proc = l->proc;
|
proc = l->proc;
|
||||||
if (proc != (proc_t *) NULL)
|
if (proc != (proc_t *) NULL)
|
||||||
{
|
{
|
||||||
/* The iline field is ill-documented. This is a
|
|
||||||
guess at the right value. */
|
|
||||||
proc->pdr.iline = l->frag->fr_address + l->paddr;
|
|
||||||
proc->pdr.lnLow = l->lineno;
|
proc->pdr.lnLow = l->lineno;
|
||||||
proc->pdr.cbLineOffset = c - file->fdr.cbLineOffset;
|
proc->pdr.cbLineOffset = c - file->fdr.cbLineOffset;
|
||||||
|
/* The iline field is ill-documented. This is a
|
||||||
|
guess at the right value. */
|
||||||
|
proc->pdr.iline = totcount;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
last = (lineno_list_t *) NULL;
|
last = (lineno_list_t *) NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get the offset to the memory address of the next line number
|
totcount += count;
|
||||||
(in words). */
|
|
||||||
if (l->next == (lineno_list_t *) NULL)
|
|
||||||
count = 0;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
count = (((l->next->frag->fr_address + l->next->paddr
|
|
||||||
- (l->frag->fr_address + l->paddr))
|
|
||||||
>> 2)
|
|
||||||
- 1);
|
|
||||||
if (count < 0)
|
|
||||||
{
|
|
||||||
/* Don't change last, so we still get the right delta. */
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get the offset to this line number. */
|
/* Get the offset to this line number. */
|
||||||
if (last == (lineno_list_t *) NULL)
|
if (last == (lineno_list_t *) NULL)
|
||||||
@ -3607,40 +3623,30 @@ ecoff_build_lineno (buf, bufend, offset, linecntptr)
|
|||||||
else
|
else
|
||||||
delta = l->lineno - last->lineno;
|
delta = l->lineno - last->lineno;
|
||||||
|
|
||||||
/* We can only adjust the address by 16 words at a time. */
|
/* Put in the offset to this line number. */
|
||||||
didone = 0;
|
while (delta != 0)
|
||||||
while (count > 0x10)
|
|
||||||
{
|
{
|
||||||
if (bufptr >= *bufend)
|
int setcount;
|
||||||
bufptr = ecoff_add_bytes (buf, bufend, bufptr, (long) 1);
|
|
||||||
if (delta >= 7)
|
/* 1 is added to each count read. */
|
||||||
|
--count;
|
||||||
|
/* We can only adjust the word count by up to 15 words at a
|
||||||
|
time. */
|
||||||
|
if (count <= 0x0f)
|
||||||
{
|
{
|
||||||
*bufptr++ = 0x0f + (7 << 4);
|
setcount = count;
|
||||||
delta -= 7;
|
count = 0;
|
||||||
}
|
|
||||||
else if (delta <= -7)
|
|
||||||
{
|
|
||||||
*bufptr++ = 0x0f + (-7 << 4);
|
|
||||||
delta += 7;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
*bufptr++ = 0x0f + (delta << 4);
|
setcount = 0x0f;
|
||||||
delta = 0;
|
count -= 0x0f;
|
||||||
}
|
}
|
||||||
++c;
|
|
||||||
count -= 0x10;
|
|
||||||
didone = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Put in the offset to this line number. */
|
|
||||||
while (delta != 0 || ! didone)
|
|
||||||
{
|
|
||||||
if (delta >= -7 && delta <= 7)
|
if (delta >= -7 && delta <= 7)
|
||||||
{
|
{
|
||||||
if (bufptr >= *bufend)
|
if (bufptr >= *bufend)
|
||||||
bufptr = ecoff_add_bytes (buf, bufend, bufptr, (long) 1);
|
bufptr = ecoff_add_bytes (buf, bufend, bufptr, (long) 1);
|
||||||
*bufptr++ = count + (delta << 4);
|
*bufptr++ = setcount + (delta << 4);
|
||||||
delta = 0;
|
delta = 0;
|
||||||
++c;
|
++c;
|
||||||
}
|
}
|
||||||
@ -3650,7 +3656,7 @@ ecoff_build_lineno (buf, bufend, offset, linecntptr)
|
|||||||
|
|
||||||
if (*bufend - bufptr < 3)
|
if (*bufend - bufptr < 3)
|
||||||
bufptr = ecoff_add_bytes (buf, bufend, bufptr, (long) 3);
|
bufptr = ecoff_add_bytes (buf, bufend, bufptr, (long) 3);
|
||||||
*bufptr++ = count + (8 << 4);
|
*bufptr++ = setcount + (8 << 4);
|
||||||
if (delta < -0x8000)
|
if (delta < -0x8000)
|
||||||
{
|
{
|
||||||
set = -0x8000;
|
set = -0x8000;
|
||||||
@ -3670,8 +3676,26 @@ ecoff_build_lineno (buf, bufend, offset, linecntptr)
|
|||||||
*bufptr++ = set & 0xffff;
|
*bufptr++ = set & 0xffff;
|
||||||
c += 3;
|
c += 3;
|
||||||
}
|
}
|
||||||
count = 0;
|
}
|
||||||
didone = 1;
|
|
||||||
|
/* Finish adjusting the count. */
|
||||||
|
while (count > 0)
|
||||||
|
{
|
||||||
|
if (bufptr >= *bufend)
|
||||||
|
bufptr = ecoff_add_bytes (buf, bufend, bufptr, (long) 1);
|
||||||
|
/* 1 is added to each count read. */
|
||||||
|
--count;
|
||||||
|
if (count > 0x0f)
|
||||||
|
{
|
||||||
|
*bufptr++ = 0x0f;
|
||||||
|
count -= 0x0f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*bufptr++ = count;
|
||||||
|
count = 0;
|
||||||
|
}
|
||||||
|
++c;
|
||||||
}
|
}
|
||||||
|
|
||||||
++iline;
|
++iline;
|
||||||
@ -3683,7 +3707,7 @@ ecoff_build_lineno (buf, bufend, offset, linecntptr)
|
|||||||
if (file != (efdr_t *) NULL)
|
if (file != (efdr_t *) NULL)
|
||||||
{
|
{
|
||||||
file->fdr.cbLine = c - file->fdr.cbLineOffset;
|
file->fdr.cbLine = c - file->fdr.cbLineOffset;
|
||||||
file->fdr.cline = iline - file->fdr.ilineBase;
|
file->fdr.cline = totcount;
|
||||||
}
|
}
|
||||||
|
|
||||||
c = ecoff_longword_adjust (buf, bufend, c, &bufptr);
|
c = ecoff_longword_adjust (buf, bufend, c, &bufptr);
|
||||||
@ -3736,8 +3760,6 @@ ecoff_build_symbols (buf,
|
|||||||
efdr_t *fil_ptr;
|
efdr_t *fil_ptr;
|
||||||
efdr_t *fil_end;
|
efdr_t *fil_end;
|
||||||
|
|
||||||
ifilesym = isym;
|
|
||||||
|
|
||||||
if (file_link->next == (vlinks_t *) NULL)
|
if (file_link->next == (vlinks_t *) NULL)
|
||||||
fil_cnt = file_desc.objects_last_page;
|
fil_cnt = file_desc.objects_last_page;
|
||||||
else
|
else
|
||||||
@ -3749,6 +3771,7 @@ ecoff_build_symbols (buf,
|
|||||||
vlinks_t *sym_link;
|
vlinks_t *sym_link;
|
||||||
|
|
||||||
fil_ptr->fdr.isymBase = isym;
|
fil_ptr->fdr.isymBase = isym;
|
||||||
|
ifilesym = isym;
|
||||||
for (sym_link = fil_ptr->symbols.first;
|
for (sym_link = fil_ptr->symbols.first;
|
||||||
sym_link != (vlinks_t *) NULL;
|
sym_link != (vlinks_t *) NULL;
|
||||||
sym_link = sym_link->next)
|
sym_link = sym_link->next)
|
||||||
@ -3782,35 +3805,79 @@ ecoff_build_symbols (buf,
|
|||||||
as_sym = sym_ptr->as_sym;
|
as_sym = sym_ptr->as_sym;
|
||||||
if (as_sym != (symbolS *) NULL)
|
if (as_sym != (symbolS *) NULL)
|
||||||
{
|
{
|
||||||
sym_ptr->ecoff_sym.value = S_GET_VALUE (as_sym);
|
symint_t indx;
|
||||||
|
|
||||||
|
/* The value of a block start symbol is the
|
||||||
|
offset from the start of the procedure. For
|
||||||
|
other symbols we just use the gas value. */
|
||||||
|
if (sym_ptr->ecoff_sym.st == (int) st_Block
|
||||||
|
&& sym_ptr->ecoff_sym.sc == (int) sc_Text)
|
||||||
|
{
|
||||||
|
know (sym_ptr->proc_ptr != (proc_t *) NULL);
|
||||||
|
sym_ptr->ecoff_sym.value =
|
||||||
|
(S_GET_VALUE (as_sym)
|
||||||
|
- S_GET_VALUE (sym_ptr->proc_ptr->sym->as_sym));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
sym_ptr->ecoff_sym.value = S_GET_VALUE (as_sym);
|
||||||
|
|
||||||
/* Get the type and storage class based on where
|
/* Get the type and storage class based on where
|
||||||
the symbol actually wound up. */
|
the symbol actually wound up. Traditionally,
|
||||||
|
N_LBRAC and N_RBRAC are *not* relocated. */
|
||||||
|
indx = sym_ptr->ecoff_sym.index;
|
||||||
if (sym_ptr->ecoff_sym.st == st_Nil
|
if (sym_ptr->ecoff_sym.st == st_Nil
|
||||||
&& sym_ptr->ecoff_sym.sc == sc_Nil
|
&& sym_ptr->ecoff_sym.sc == sc_Nil
|
||||||
&& ! MIPS_IS_STAB (&sym_ptr->ecoff_sym))
|
&& (! MIPS_IS_STAB (&sym_ptr->ecoff_sym)
|
||||||
|
|| ((MIPS_UNMARK_STAB (indx) != N_LBRAC)
|
||||||
|
&& (MIPS_UNMARK_STAB (indx) != N_RBRAC))))
|
||||||
{
|
{
|
||||||
|
segT seg;
|
||||||
|
const char *segname;
|
||||||
st_t st;
|
st_t st;
|
||||||
sc_t sc;
|
sc_t sc;
|
||||||
|
|
||||||
|
seg = S_GET_SEGMENT (as_sym);
|
||||||
|
segname = segment_name (seg);
|
||||||
|
|
||||||
if (S_IS_EXTERNAL (as_sym)
|
if (S_IS_EXTERNAL (as_sym)
|
||||||
|| ! S_IS_DEFINED (as_sym))
|
|| ! S_IS_DEFINED (as_sym))
|
||||||
st = st_Global;
|
st = st_Global;
|
||||||
else if (S_GET_SEGMENT (as_sym) == text_section)
|
else if (seg == text_section)
|
||||||
st = st_Label;
|
st = st_Label;
|
||||||
else
|
else
|
||||||
st = st_Static;
|
st = st_Static;
|
||||||
|
|
||||||
if (! S_IS_DEFINED (as_sym))
|
if (! S_IS_DEFINED (as_sym)
|
||||||
sc = sc_Undefined;
|
|| as_sym->ecoff_undefined)
|
||||||
|
{
|
||||||
|
if (S_GET_VALUE (as_sym) > 0
|
||||||
|
&& (S_GET_VALUE (as_sym)
|
||||||
|
<= bfd_get_gp_size (stdoutput)))
|
||||||
|
sc = sc_SUndefined;
|
||||||
|
else
|
||||||
|
sc = sc_Undefined;
|
||||||
|
}
|
||||||
else if (S_IS_COMMON (as_sym))
|
else if (S_IS_COMMON (as_sym))
|
||||||
sc = sc_Common;
|
{
|
||||||
else if (S_GET_SEGMENT (as_sym) == text_section)
|
if (S_GET_VALUE (as_sym) > 0
|
||||||
|
&& (S_GET_VALUE (as_sym)
|
||||||
|
<= bfd_get_gp_size (stdoutput)))
|
||||||
|
sc = sc_SCommon;
|
||||||
|
else
|
||||||
|
sc = sc_Common;
|
||||||
|
}
|
||||||
|
else if (seg == text_section)
|
||||||
sc = sc_Text;
|
sc = sc_Text;
|
||||||
else if (S_GET_SEGMENT (as_sym) == data_section)
|
else if (seg == data_section)
|
||||||
sc = sc_Data;
|
sc = sc_Data;
|
||||||
else if (S_GET_SEGMENT (as_sym) == bss_section)
|
else if (strcmp (segname, ".rdata") == 0)
|
||||||
|
sc = sc_RData;
|
||||||
|
else if (strcmp (segname, ".sdata") == 0)
|
||||||
|
sc = sc_SData;
|
||||||
|
else if (seg == bss_section)
|
||||||
sc = sc_Bss;
|
sc = sc_Bss;
|
||||||
|
else if (strcmp (segname, ".sbss") == 0)
|
||||||
|
sc = sc_SBss;
|
||||||
else
|
else
|
||||||
abort ();
|
abort ();
|
||||||
|
|
||||||
@ -3827,13 +3894,17 @@ ecoff_build_symbols (buf,
|
|||||||
if ((S_IS_EXTERNAL (as_sym)
|
if ((S_IS_EXTERNAL (as_sym)
|
||||||
|| ! S_IS_DEFINED (as_sym))
|
|| ! S_IS_DEFINED (as_sym))
|
||||||
&& sym_ptr->proc_ptr == (proc_t *) NULL
|
&& sym_ptr->proc_ptr == (proc_t *) NULL
|
||||||
&& sym_ptr->ecoff_sym.st != (int) st_Nil)
|
&& sym_ptr->ecoff_sym.st != (int) st_Nil
|
||||||
|
&& ! MIPS_IS_STAB (&sym_ptr->ecoff_sym))
|
||||||
local = 0;
|
local = 0;
|
||||||
|
|
||||||
/* If an st_end symbol has an associated gas
|
/* If an st_end symbol has an associated gas
|
||||||
symbol, then it is a local label created for
|
symbol, then it is a local label created for
|
||||||
a .bend or .end directive. */
|
a .bend or .end directive. Stabs line
|
||||||
if (local && sym_ptr->ecoff_sym.st != st_End)
|
numbers will have \001 in the names. */
|
||||||
|
if (local
|
||||||
|
&& sym_ptr->ecoff_sym.st != st_End
|
||||||
|
&& strchr (sym_ptr->name, '\001') == 0)
|
||||||
sym_ptr->ecoff_sym.iss =
|
sym_ptr->ecoff_sym.iss =
|
||||||
add_string (&fil_ptr->strings,
|
add_string (&fil_ptr->strings,
|
||||||
fil_ptr->str_hash,
|
fil_ptr->str_hash,
|
||||||
@ -3876,10 +3947,11 @@ ecoff_build_symbols (buf,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* The value of the symbol marking the end of a
|
/* The value of the symbol marking the end of a
|
||||||
procedure or block is the size of the
|
procedure is the size of the procedure. The
|
||||||
procedure or block. */
|
value of the symbol marking the end of a
|
||||||
if ((begin_type == st_Proc || begin_type == st_Block)
|
block is the offset from the start of the
|
||||||
&& sym_ptr->ecoff_sym.sc != (int) sc_Info)
|
procedure to the block. */
|
||||||
|
if (begin_type == st_Proc)
|
||||||
{
|
{
|
||||||
know (as_sym != (symbolS *) NULL);
|
know (as_sym != (symbolS *) NULL);
|
||||||
know (begin_ptr->as_sym != (symbolS *) NULL);
|
know (begin_ptr->as_sym != (symbolS *) NULL);
|
||||||
@ -3887,6 +3959,15 @@ ecoff_build_symbols (buf,
|
|||||||
(S_GET_VALUE (as_sym)
|
(S_GET_VALUE (as_sym)
|
||||||
- S_GET_VALUE (begin_ptr->as_sym));
|
- S_GET_VALUE (begin_ptr->as_sym));
|
||||||
}
|
}
|
||||||
|
else if (begin_type == st_Block
|
||||||
|
&& sym_ptr->ecoff_sym.sc != (int) sc_Info)
|
||||||
|
{
|
||||||
|
know (as_sym != (symbolS *) NULL);
|
||||||
|
know (sym_ptr->proc_ptr != (proc_t *) NULL);
|
||||||
|
sym_ptr->ecoff_sym.value =
|
||||||
|
(S_GET_VALUE (as_sym)
|
||||||
|
- S_GET_VALUE (sym_ptr->proc_ptr->sym->as_sym));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (f = sym_ptr->forward_ref;
|
for (f = sym_ptr->forward_ref;
|
||||||
@ -3908,18 +3989,21 @@ ecoff_build_symbols (buf,
|
|||||||
ecoff_swap_sym_out (stdoutput, &sym_ptr->ecoff_sym,
|
ecoff_swap_sym_out (stdoutput, &sym_ptr->ecoff_sym,
|
||||||
sym_out);
|
sym_out);
|
||||||
++sym_out;
|
++sym_out;
|
||||||
|
|
||||||
sym_ptr->sym_index = isym;
|
sym_ptr->sym_index = isym;
|
||||||
++isym;
|
|
||||||
|
|
||||||
if (sym_ptr->proc_ptr != (proc_t *) NULL
|
if (sym_ptr->proc_ptr != (proc_t *) NULL
|
||||||
&& sym_ptr->proc_ptr->sym == sym_ptr)
|
&& sym_ptr->proc_ptr->sym == sym_ptr)
|
||||||
sym_ptr->proc_ptr->pdr.isym = isym - ifilesym;
|
sym_ptr->proc_ptr->pdr.isym = isym - ifilesym;
|
||||||
|
|
||||||
|
++isym;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If this is an external symbol, swap it out. */
|
/* If this is an external symbol, swap it out. */
|
||||||
if (as_sym != (symbolS *) NULL
|
if (as_sym != (symbolS *) NULL
|
||||||
&& (S_IS_EXTERNAL (as_sym)
|
&& (S_IS_EXTERNAL (as_sym)
|
||||||
|| ! S_IS_DEFINED (as_sym)))
|
|| ! S_IS_DEFINED (as_sym))
|
||||||
|
&& ! MIPS_IS_STAB (&sym_ptr->ecoff_sym))
|
||||||
{
|
{
|
||||||
EXTR ext;
|
EXTR ext;
|
||||||
|
|
||||||
@ -4325,6 +4409,10 @@ ecoff_frob_file ()
|
|||||||
struct hash_control *ext_str_hash;
|
struct hash_control *ext_str_hash;
|
||||||
char *set;
|
char *set;
|
||||||
|
|
||||||
|
/* Make sure we have a file. */
|
||||||
|
if (first_file == (efdr_t *) NULL)
|
||||||
|
add_file ((const char *) NULL, 0);
|
||||||
|
|
||||||
/* Handle any top level tags. */
|
/* Handle any top level tags. */
|
||||||
for (ptag = top_tag_head->first_tag;
|
for (ptag = top_tag_head->first_tag;
|
||||||
ptag != (tag_t *) NULL;
|
ptag != (tag_t *) NULL;
|
||||||
@ -4477,8 +4565,6 @@ ecoff_frob_file ()
|
|||||||
|
|
||||||
#undef SET
|
#undef SET
|
||||||
|
|
||||||
/* FIXME: set the gp value. */
|
|
||||||
|
|
||||||
/* FIXME: set the register masks. */
|
/* FIXME: set the register masks. */
|
||||||
|
|
||||||
ecoff_data (stdoutput)->raw_size = offset;
|
ecoff_data (stdoutput)->raw_size = offset;
|
||||||
|
3881
gas/config/tc-mips.c
3881
gas/config/tc-mips.c
File diff suppressed because it is too large
Load Diff
94
gas/config/tc-mips.h
Normal file
94
gas/config/tc-mips.h
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
/* tc-mips.c -- header file for tc-mips.c.
|
||||||
|
Copyright (C) 1993 Free Software Foundation, Inc.
|
||||||
|
Contributed by the OSF and Ralph Campbell.
|
||||||
|
Written by Keith Knowles and Ralph Campbell, working independently.
|
||||||
|
Modified for ECOFF support by Ian Lance Taylor of Cygnus Support.
|
||||||
|
|
||||||
|
This file is part of GAS.
|
||||||
|
|
||||||
|
GAS is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
GAS is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
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, 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
|
|
||||||
|
#define TC_MIPS
|
||||||
|
|
||||||
|
#define TARGET_ARCH bfd_arch_mips
|
||||||
|
|
||||||
|
#define NO_LISTING
|
||||||
|
#define ONLY_STANDARD_ESCAPES
|
||||||
|
#define BACKSLASH_V
|
||||||
|
#define WORKING_DOT_WORD 1
|
||||||
|
#define OLD_FLOAT_READS
|
||||||
|
#define LOCAL_LABELS_FB
|
||||||
|
|
||||||
|
#ifdef OBJ_ECOFF
|
||||||
|
#define LOCAL_LABEL(name) ((name)[0] == '$' && (name)[1] == 'L')
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define md_undefined_symbol(name) (0)
|
||||||
|
#define md_operand(x)
|
||||||
|
|
||||||
|
#define LITTLE_ENDIAN 1234
|
||||||
|
#define BIG_ENDIAN 4321
|
||||||
|
|
||||||
|
/* If neither TARGET_BYTES_BIG_ENDIAN nor TARGET_BYTES_LITTLE_ENDIAN
|
||||||
|
is specified, default to big endian. */
|
||||||
|
#ifndef TARGET_BYTES_BIG_ENDIAN
|
||||||
|
#ifndef TARGET_BYTES_LITTLE_ENDIAN
|
||||||
|
#define TARGET_BYTES_BIG_ENDIAN
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef TARGET_BYTES_BIG_ENDIAN
|
||||||
|
#define BYTE_ORDER BIG_ENDIAN
|
||||||
|
#else
|
||||||
|
#define BYTE_ORDER LITTLE_ENDIAN
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef TARGET_FORMAT
|
||||||
|
#ifdef OBJ_AOUT
|
||||||
|
#ifdef TARGET_BYTES_BIG_ENDIAN
|
||||||
|
#define TARGET_FORMAT "aout-mips-big"
|
||||||
|
#else
|
||||||
|
#define TARGET_FORMAT "aout-mips-little"
|
||||||
|
#endif
|
||||||
|
#endif /* OBJ_AOUT */
|
||||||
|
#ifdef OBJ_ECOFF
|
||||||
|
#ifdef TARGET_BYTES_BIG_ENDIAN
|
||||||
|
#define TARGET_FORMAT "ecoff-bigmips"
|
||||||
|
#else
|
||||||
|
#define TARGET_FORMAT "ecoff-littlemips"
|
||||||
|
#endif
|
||||||
|
#endif /* OBJ_ECOFF */
|
||||||
|
#endif /* ! defined (TARGET_FORMAT) */
|
||||||
|
|
||||||
|
struct mips_opcode {
|
||||||
|
const char *name;
|
||||||
|
const char *args;
|
||||||
|
unsigned long match;
|
||||||
|
unsigned long mask; /* used only for error checking */
|
||||||
|
unsigned long pinfo; /* Information used for insn/pipeline scheduling. */
|
||||||
|
};
|
||||||
|
|
||||||
|
struct mips_cl_insn {
|
||||||
|
unsigned long insn_opcode;
|
||||||
|
const struct mips_opcode *insn_mo;
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifndef BFD_ASSEMBLER
|
||||||
|
#define md_convert_frag(h,f) {as_fatal ("MIPS convert_frag\n");}
|
||||||
|
#else
|
||||||
|
#define md_convert_frag(b,s,f) {as_fatal ("MIPS convert_frag\n");}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern int tc_get_register PARAMS ((void));
|
Reference in New Issue
Block a user