* config/tc-sparc.h: Removed remaining non-BFD_ASSEMBLER code.

* config/tc-sparc.c: Ditto.
(tc_gen_reloc): Include fx_offset for pcrel fixups.
This commit is contained in:
Ken Raeburn
1993-10-25 17:45:17 +00:00
parent ca0a2b2df1
commit 9b6a882eeb

View File

@ -46,20 +46,6 @@ static void s_proc PARAMS ((int));
static void s_reserve PARAMS ((int)); static void s_reserve PARAMS ((int));
static void s_common PARAMS ((int)); static void s_common PARAMS ((int));
/* Ugly hack to keep non-BFD version working. */
#ifndef BFD_ASSEMBLER
#define BFD_RELOC_NONE NO_RELOC
#define BFD_RELOC_32 RELOC_32
#define BFD_RELOC_HI22 RELOC_HI22
#define BFD_RELOC_LO10 RELOC_LO10
#define BFD_RELOC_SPARC_WDISP22 RELOC_WDISP22
#define BFD_RELOC_32_PCREL_S2 RELOC_WDISP30
#define BFD_RELOC_SPARC22 RELOC_22
#define BFD_RELOC_SPARC_BASE13 RELOC_BASE13
#define BFD_RELOC_SPARC13 RELOC_13
#define BFD_RELOC_SPARC_BASE22 RELOC_BASE22
#endif
const pseudo_typeS md_pseudo_table[] = const pseudo_typeS md_pseudo_table[] =
{ {
{"align", s_align_bytes, 0}, /* Defaulting is invalid (0) */ {"align", s_align_bytes, 0}, /* Defaulting is invalid (0) */
@ -119,9 +105,8 @@ const char EXP_CHARS[] = "eE";
const char FLT_CHARS[] = "rRsSfFdDxXpP"; const char FLT_CHARS[] = "rRsSfFdDxXpP";
/* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
changed in read.c . Ideally it shouldn't have to know about it at all, changed in read.c. Ideally it shouldn't have to know about it at all,
but nothing is ideal around here. but nothing is ideal around here. */
*/
static unsigned char octal[256]; static unsigned char octal[256];
#define isoctal(c) octal[(unsigned char) (c)] #define isoctal(c) octal[(unsigned char) (c)]
@ -134,11 +119,7 @@ struct sparc_it
struct nlist *nlistp; struct nlist *nlistp;
expressionS exp; expressionS exp;
int pcrel; int pcrel;
#ifdef BFD_ASSEMBLER
bfd_reloc_code_real_type reloc; bfd_reloc_code_real_type reloc;
#else
enum reloc_type reloc;
#endif
}; };
struct sparc_it the_insn, set_insn; struct sparc_it the_insn, set_insn;
@ -209,7 +190,7 @@ s_reserve (ignore)
{ {
as_bad ("bad .reserve segment: `%s'", input_line_pointer); as_bad ("bad .reserve segment: `%s'", input_line_pointer);
return; return;
} /* if not bss */ }
if (input_line_pointer[2] == '.') if (input_line_pointer[2] == '.')
input_line_pointer += 7; input_line_pointer += 7;
@ -630,13 +611,7 @@ md_begin ()
/* end-sanitize-v9 */ /* end-sanitize-v9 */
target_big_endian = 1; target_big_endian = 1;
} /* md_begin() */ }
void
md_end ()
{
return;
} /* md_end() */
void void
md_assemble (str) md_assemble (str)
@ -719,7 +694,7 @@ md_assemble (str)
default: default:
as_fatal ("failed sanity check."); as_fatal ("failed sanity check.");
} }
} /* md_assemble() */ }
static void static void
sparc_ip (str) sparc_ip (str)
@ -816,13 +791,12 @@ sparc_ip (str)
} }
else if (isdigit (*s)) else if (isdigit (*s))
{ {
while (isdigit (*s)) expressionS exp;
{
kmask = kmask * 10 + *s - '0';
++s;
}
if (kmask < 0 || kmask > 127) if (expression (&exp) != absolute_section
|| exp.X_op != O_constant
|| (kmask = exp.X_add_number) < 0
|| kmask > 127)
{ {
error_message = ": invalid membar mask number"; error_message = ": invalid membar mask number";
goto error; goto error;
@ -1422,9 +1396,9 @@ sparc_ip (str)
{ {
the_insn.reloc = BFD_RELOC_LO10; the_insn.reloc = BFD_RELOC_LO10;
s += 3; s += 3;
/* start-sanitize-v9 */
#ifndef NO_V9
} }
/* start-sanitize-v9 */
#ifndef NO_V9
else if (c == 'u' else if (c == 'u'
&& s[2] == 'h' && s[2] == 'h'
&& s[3] == 'i') && s[3] == 'i')
@ -1438,23 +1412,21 @@ sparc_ip (str)
{ {
the_insn.reloc = BFD_RELOC_SPARC_HM10; the_insn.reloc = BFD_RELOC_SPARC_HM10;
s += 4; s += 4;
#endif /* NO_V9 */
/* end-sanitize-v9 */
} }
#endif /* NO_V9 */
/* end-sanitize-v9 */
else else
break; break;
} }
/* Note that if the getExpression() fails, we /* Note that if the getExpression() fails, we will still
will still have created U entries in the have created U entries in the symbol table for the
symbol table for the 'symbols' in the input 'symbols' in the input string. Try not to create U
string. Try not to create U symbols for symbols for registers, etc. */
registers, etc. */
{ {
/* This stuff checks to see if the /* This stuff checks to see if the expression ends in
expression ends in +%reg If it does, +%reg. If it does, it removes the register from
it removes the register from the the expression, and re-sets 's' to point to the
expression, and re-sets 's' to point right place. */
to the right place */
char *s1; char *s1;
@ -1485,28 +1457,37 @@ sparc_ip (str)
(void) getExpression (s); (void) getExpression (s);
s = expr_end; s = expr_end;
/* Check for invalid constant values. Don't if (the_insn.exp.X_op == O_constant
warn if constant was inside %hi or %lo,
since these truncate the constant to
fit. */
if (immediate_max != 0
&& the_insn.reloc != BFD_RELOC_LO10
&& the_insn.reloc != BFD_RELOC_HI22
/* start-sanitize-v9 */
#ifndef NO_V9
#ifndef BFD_ASSEMBLER /* the bfd backend doesn't support these relocs yet */
&& the_insn.reloc != RELOC_HLO10
&& the_insn.reloc != RELOC_HHI22
#endif
#endif
/* end-sanitize-v9 */
&& the_insn.exp.X_add_symbol == 0 && the_insn.exp.X_add_symbol == 0
&& the_insn.exp.X_op_symbol == 0 && the_insn.exp.X_op_symbol == 0)
&& the_insn.exp.X_op == O_constant {
&& (the_insn.exp.X_add_number > immediate_max /* start-sanitize-v9 */
|| the_insn.exp.X_add_number < ~immediate_max)) #ifndef NO_V9
as_bad ("constant value must be between %ld and %ld", switch (the_insn.reloc)
~immediate_max, immediate_max); {
case BFD_RELOC_SPARC_HH22:
the_insn.reloc = BFD_RELOC_HI22;
the_insn.exp.X_add_number >>= 32;
break;
case BFD_RELOC_SPARC_HM10:
the_insn.reloc = BFD_RELOC_LO10;
the_insn.exp.X_add_number >>= 32;
break;
}
#endif
/* end-sanitize-v9 */
/* Check for invalid constant values. Don't warn if
constant was inside %hi or %lo, since these
truncate the constant to fit. */
if (immediate_max != 0
&& the_insn.reloc != BFD_RELOC_LO10
&& the_insn.reloc != BFD_RELOC_HI22
&& (the_insn.exp.X_add_number > immediate_max
|| the_insn.exp.X_add_number < ~immediate_max))
as_bad ("constant value must be between %ld and %ld",
~immediate_max, immediate_max);
}
/* Reset to prevent extraneous range check. */ /* Reset to prevent extraneous range check. */
immediate_max = 0; immediate_max = 0;
@ -1867,33 +1848,17 @@ md_number_to_chars (buf, val, n)
/* Apply a fixS to the frags, now that we know the value it ought to /* Apply a fixS to the frags, now that we know the value it ought to
hold. */ hold. */
#ifdef BFD_ASSEMBLER
int int
#else
void
#endif
md_apply_fix (fixP, value) md_apply_fix (fixP, value)
fixS *fixP; fixS *fixP;
#ifdef BFD_ASSEMBLER
valueT *value; valueT *value;
#else
long value;
#endif
{ {
char *buf = fixP->fx_where + fixP->fx_frag->fr_literal; char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
offsetT val; offsetT val;
#ifdef BFD_ASSEMBLER
val = *value; val = *value;
#else
val = value;
#endif
#ifdef BFD_ASSEMBLER
assert (fixP->fx_r_type < BFD_RELOC_UNUSED); assert (fixP->fx_r_type < BFD_RELOC_UNUSED);
#else
assert (fixP->fx_r_type < NO_RELOC);
#endif
fixP->fx_addnumber = val; /* Remember value for emit_reloc */ fixP->fx_addnumber = val; /* Remember value for emit_reloc */
@ -2084,9 +2049,7 @@ md_apply_fix (fixP, value)
break; break;
} }
#ifdef BFD_ASSEMBLER
return 1; return 1;
#endif
} }
/* should never be called for sparc */ /* should never be called for sparc */
@ -2101,8 +2064,6 @@ md_create_short_jump (ptr, from_addr, to_addr, frag, to_symbol)
as_fatal ("sparc_create_short_jmp\n"); as_fatal ("sparc_create_short_jmp\n");
} }
#ifdef BFD_ASSEMBLER
/* Translate internal representation of relocation info to BFD target /* Translate internal representation of relocation info to BFD target
format. */ format. */
arelent * arelent *
@ -2118,21 +2079,24 @@ tc_gen_reloc (section, fixp)
reloc->sym_ptr_ptr = &fixp->fx_addsy->bsym; reloc->sym_ptr_ptr = &fixp->fx_addsy->bsym;
reloc->address = fixp->fx_frag->fr_address + fixp->fx_where; reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
reloc->addend = 0;
if (fixp->fx_pcrel == 0) if (fixp->fx_pcrel == 0)
reloc->addend = fixp->fx_addnumber; reloc->addend += fixp->fx_addnumber;
else else
switch (OUTPUT_FLAVOR) {
{ reloc->addend += fixp->fx_offset;
case bfd_target_elf_flavour: switch (OUTPUT_FLAVOR)
reloc->addend = 0; {
break; case bfd_target_elf_flavour:
case bfd_target_aout_flavour: break;
reloc->addend = - reloc->address; case bfd_target_aout_flavour:
break; reloc->addend -= reloc->address;
default: break;
/* What's a good default here? Is there any?? */ default:
abort (); /* What's a good default here? Is there any?? */
} abort ();
}
}
switch (fixp->fx_r_type) switch (fixp->fx_r_type)
{ {
@ -2165,71 +2129,6 @@ tc_gen_reloc (section, fixp)
return reloc; return reloc;
} }
#else
/* Translate internal representation of relocation info to target format.
On sparc: first 4 bytes are normal unsigned long address, next three
bytes are index, most sig. byte first. Byte 7 is broken up with
bit 7 as external, bits 6 & 5 unused, and the lower
five bits as relocation type. Next 4 bytes are long addend. */
/* Thanx and a tip of the hat to Michael Bloom, mb@ttidca.tti.com */
void
tc_aout_fix_to_chars (where, fixP, segment_address_in_file)
char *where;
fixS *fixP;
relax_addressT segment_address_in_file;
{
long r_index;
long r_extern;
long r_addend = 0;
long r_address;
know (fixP->fx_addsy);
if (!S_IS_DEFINED (fixP->fx_addsy))
{
r_extern = 1;
r_index = fixP->fx_addsy->sy_number;
}
else
{
r_extern = 0;
r_index = S_GET_TYPE (fixP->fx_addsy);
}
/* this is easy */
md_number_to_chars (where,
r_address = fixP->fx_frag->fr_address + fixP->fx_where - segment_address_in_file,
4);
/* now the fun stuff */
where[4] = (r_index >> 16) & 0x0ff;
where[5] = (r_index >> 8) & 0x0ff;
where[6] = r_index & 0x0ff;
where[7] = ((r_extern << 7) & 0x80) | (0 & 0x60) | (fixP->fx_r_type & 0x1F);
/* Also easy */
if (fixP->fx_addsy->sy_frag)
{
r_addend = fixP->fx_addsy->sy_frag->fr_address;
}
if (fixP->fx_pcrel)
{
r_addend += fixP->fx_offset - r_address;
}
else
{
r_addend = fixP->fx_addnumber;
}
md_number_to_chars (&where[8], r_addend, 4);
return;
} /* tc_aout_fix_to_chars() */
#endif
/* should never be called for sparc */ /* should never be called for sparc */
void void
md_create_long_jump (ptr, from_addr, to_addr, frag, to_symbol) md_create_long_jump (ptr, from_addr, to_addr, frag, to_symbol)
@ -2459,13 +2358,4 @@ md_pcrel_from (fixP)
return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address; return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
} }
#ifndef BFD_ASSEMBLER
void
tc_aout_pre_write_hook (headers)
object_headers *headers;
{
H_SET_VERSION (headers, 1);
}
#endif
/* end of tc-sparc.c */ /* end of tc-sparc.c */