aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gas/ChangeLog5
-rw-r--r--gas/config/tc-s390.c112
2 files changed, 62 insertions, 55 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 8662929..b9cf279 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,8 @@
+2001-08-12 Martin Schwidefsky <schwidefsky@de.ibm.com>
+
+ * config/tc-s390.c (s390_elf_cons): Correct fixups for PLT
+ relocations.
+
2001-08-12 TAKAI Kousuke <takai@vlsi.kuee.kyoto-u.ac.jp>
* config/tc-sparc.c (cons_fix_new_sparc): Move
diff --git a/gas/config/tc-s390.c b/gas/config/tc-s390.c
index 9966786..42bb264 100644
--- a/gas/config/tc-s390.c
+++ b/gas/config/tc-s390.c
@@ -80,7 +80,7 @@ const pseudo_typeS md_pseudo_table[] =
{
{ "align", s_align_bytes, 0 },
/* Pseudo-ops which must be defined. */
- { "bss", s390_bss, 0 },
+ { "bss", s390_bss, 0 },
{ "insn", s390_insn, 0 },
/* Pseudo-ops which must be overridden. */
{ "byte", s390_byte, 0 },
@@ -157,21 +157,21 @@ static const struct pd_reg pre_defined_registers[] =
{ "c9", 9 },
{ "f0", 0 }, /* Floating point registers */
- { "f1", 1 },
- { "f10", 10 },
- { "f11", 11 },
- { "f12", 12 },
- { "f13", 13 },
- { "f14", 14 },
- { "f15", 15 },
- { "f2", 2 },
- { "f3", 3 },
- { "f4", 4 },
- { "f5", 5 },
- { "f6", 6 },
- { "f7", 7 },
- { "f8", 8 },
- { "f9", 9 },
+ { "f1", 1 },
+ { "f10", 10 },
+ { "f11", 11 },
+ { "f12", 12 },
+ { "f13", 13 },
+ { "f14", 14 },
+ { "f15", 15 },
+ { "f2", 2 },
+ { "f3", 3 },
+ { "f4", 4 },
+ { "f5", 5 },
+ { "f6", 6 },
+ { "f7", 7 },
+ { "f8", 8 },
+ { "f9", 9 },
{ "lit", 13 }, /* Pointer to literal pool */
@@ -265,11 +265,11 @@ register_name (expressionP)
*input_line_pointer = c;
/* Look to see if it's in the register table. */
- if (reg_number >= 0)
+ if (reg_number >= 0)
{
expressionP->X_op = O_register;
expressionP->X_add_number = reg_number;
-
+
/* Make the rest nice. */
expressionP->X_add_symbol = NULL;
expressionP->X_op_symbol = NULL;
@@ -353,17 +353,17 @@ md_parse_option (c, arg)
case 'm':
if (arg != NULL && strcmp (arg, "regnames") == 0)
reg_names_p = true;
-
+
else if (arg != NULL && strcmp (arg, "no-regnames") == 0)
reg_names_p = false;
-
+
else
{
as_bad (_("invalid switch -m%s"), arg);
return 0;
}
break;
-
+
case 'A':
if (arg != NULL && strcmp (arg, "esa") == 0)
{
@@ -385,16 +385,16 @@ md_parse_option (c, arg)
case 'V':
print_version_id ();
break;
-
+
/* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
should be emitted or not. FIXME: Not implemented. */
case 'Q':
break;
-
+
default:
return 0;
}
-
+
return 1;
}
@@ -536,7 +536,7 @@ s390_insert_operand (insn, operand, val, file, line)
else
{
addressT min, max;
-
+
max = (((addressT) 1 << (operand->bits - 1))<<1) - 1;
min = (offsetT) 0;
uval = (addressT) val;
@@ -549,7 +549,7 @@ s390_insert_operand (insn, operand, val, file, line)
const char *err =
"operand out of range (%s not between %ld and %ld)";
char buf[100];
-
+
if (operand->flags & S390_OPERAND_LENGTH)
{
uval++;
@@ -709,7 +709,7 @@ s390_exp_compare(exp1, exp2)
return exp1->X_add_number == exp2->X_add_number;
case O_big:
- as_bad (_("Can't handle O_big in s390_exp_compare"));
+ as_bad (_("Can't handle O_big in s390_exp_compare"));
case O_symbol: /* X_add_symbol & X_add_number must be equal. */
case O_symbol_rva:
@@ -763,7 +763,7 @@ s390_lit_suffix (str_p, exp_p, suffix)
if (*str++ != ':')
return suffix; /* No modification. */
-
+
/* We look for a suffix of the form "@lit1", "@lit2", "@lit4" or "@lit8". */
ident = str;
while (isalnum (*str))
@@ -877,7 +877,7 @@ s390_lit_suffix (str_p, exp_p, suffix)
else
lpe_list = lpe_list_tail = lpe;
}
-
+
/* Now change exp_p to the offset into the literal pool.
Thats the expression: .L^Ax^By-.L^Ax */
exp_p->X_add_symbol = lpe->sym;
@@ -942,8 +942,10 @@ s390_elf_cons (nbytes)
reloc_howto->name, nbytes);
where = frag_more (nbytes);
md_number_to_chars (where, 0, size);
- fix_new_exp (frag_now, where - frag_now->fr_literal,
- size, &exp, reloc_howto->pc_relative, reloc);
+ /* To make fixup_segment do the pc relative conversion the
+ pcrel parameter on the fix_new_exp call needs to be false. */
+ fix_new_exp (frag_now, where - frag_now->fr_literal,
+ size, &exp, false, reloc);
}
else
as_bad (_("relocation not applicable"));
@@ -1001,27 +1003,27 @@ md_gather_operands (str, insn, opcode)
char *hold;
operand = s390_operands + *opindex_ptr;
-
+
if (skip_optional && (operand->flags & S390_OPERAND_INDEX))
{
/* We do an early skip. For D(X,B) constructions the index
- register is skipped (X is optional). For D(L,B) the base
+ register is skipped (X is optional). For D(L,B) the base
register will be the skipped operand, because L is NOT
optional. */
skip_optional = 0;
continue;
}
-
+
/* Gather the operand. */
hold = input_line_pointer;
input_line_pointer = str;
if (! register_name (&ex)) /* parse the operand */
expression (&ex);
-
+
str = input_line_pointer;
input_line_pointer = hold;
-
+
/* Write the operand to the insn. */
if (ex.X_op == O_illegal)
as_bad (_("illegal operand"));
@@ -1095,7 +1097,7 @@ md_gather_operands (str, insn, opcode)
fixups[fc].reloc = reloc;
++fc;
}
-
+
/* Check the next character. The call to expression has advanced
str past any whitespace. */
if (operand->flags & S390_OPERAND_DISP)
@@ -1113,7 +1115,7 @@ md_gather_operands (str, insn, opcode)
/* Ok, skip all operands until S390_OPERAND_BASE. */
while (!(operand->flags & S390_OPERAND_BASE))
operand = s390_operands + *(++opindex_ptr);
-
+
/* If there is a next operand it must be seperated by a comma. */
if (opindex_ptr[1] != '\0')
{
@@ -1208,18 +1210,18 @@ md_gather_operands (str, insn, opcode)
reloc_howto_type *reloc_howto;
fixS *fixP;
int size;
-
+
reloc_howto = bfd_reloc_type_lookup (stdoutput, fixups[i].reloc);
if (!reloc_howto)
abort ();
-
+
size = bfd_get_reloc_size (reloc_howto);
if (size < 1 || size > 4)
abort ();
-
- fixP = fix_new_exp (frag_now,
- f - frag_now->fr_literal + (operand->shift/8),
+
+ fixP = fix_new_exp (frag_now,
+ f - frag_now->fr_literal + (operand->shift/8),
size, &fixups[i].exp, reloc_howto->pc_relative,
fixups[i].reloc);
/* Turn off overflow checking in fixup_segment. This is necessary
@@ -1344,7 +1346,7 @@ s390_insn (ignore)
}
else if (exp.X_op == O_big)
{
- if (exp.X_add_number > 0 &&
+ if (exp.X_add_number > 0 &&
opformat->oplen == 6 &&
generic_bignum[3] == 0)
{
@@ -1404,7 +1406,7 @@ s390_byte (ignore)
}
/* The .ltorg pseudo-op.This emits all literals defined since the last
- .ltorg or the invocation of gas. Literals are defined with the
+ .ltorg or the invocation of gas. Literals are defined with the
@lit suffix. */
static void
@@ -1432,7 +1434,7 @@ s390_literals (ignore)
/* Emit literal pool entry. */
if (lpe->reloc != BFD_RELOC_UNUSED)
{
- reloc_howto_type *reloc_howto =
+ reloc_howto_type *reloc_howto =
bfd_reloc_type_lookup (stdoutput, lpe->reloc);
int size = bfd_get_reloc_size (reloc_howto);
char *where;
@@ -1509,7 +1511,7 @@ md_atof (type, litp, sizep)
md_number_to_chars (litp, (valueT) words[i], 2);
litp += 2;
}
-
+
return NULL;
}
@@ -1647,7 +1649,7 @@ md_apply_fix3 (fixp, valuep, seg)
&& S_GET_SEGMENT (fixp->fx_addsy) != undefined_section
&& ! bfd_is_com_section (S_GET_SEGMENT (fixp->fx_addsy)))
value -= S_GET_VALUE (fixp->fx_addsy);
-
+
if (fixp->fx_pcrel)
value += fixp->fx_frag->fr_address + fixp->fx_where;
}
@@ -1658,10 +1660,10 @@ md_apply_fix3 (fixp, valuep, seg)
{
const struct s390_operand *operand;
int opindex;
-
+
opindex = (int) fixp->fx_r_type - (int) BFD_RELOC_UNUSED;
operand = &s390_operands[opindex];
-
+
if (fixp->fx_done)
{
/* Insert the fully resolved operand value. */
@@ -1670,7 +1672,7 @@ md_apply_fix3 (fixp, valuep, seg)
return 1;
}
-
+
/* Determine a BFD reloc value based on the operand information.
We are only prepared to turn a few of the operands into
relocs. */
@@ -1717,7 +1719,7 @@ md_apply_fix3 (fixp, valuep, seg)
{
char *sfile;
unsigned int sline;
-
+
/* Use expr_symbol_where to see if this is an expression
symbol. */
if (expr_symbol_where (fixp->fx_addsy, &sfile, &sline))
@@ -1749,9 +1751,9 @@ md_apply_fix3 (fixp, valuep, seg)
mop = bfd_getb16 ((unsigned char *) where);
mop |= (unsigned short) (value & 0xfff);
bfd_putb16 ((bfd_vma) mop, (unsigned char *) where);
- }
+ }
break;
-
+
case BFD_RELOC_16:
case BFD_RELOC_GPREL16:
case BFD_RELOC_16_GOT_PCREL:
@@ -1840,7 +1842,7 @@ md_apply_fix3 (fixp, valuep, seg)
default:
{
const char *reloc_name = bfd_get_reloc_code_name (fixp->fx_r_type);
-
+
if (reloc_name != NULL)
fprintf (stderr, "Gas failure, reloc type %s\n", reloc_name);
else