* config/tc-s390.c (elf_suffix_type): Add suffix enums for gotoff,

gotplt and pltoff relocations.
	(s390_elf_suffix): Add suffix strings for gotoff, gotplt and pltoff.
	(s390_elf_cons): Map new lenght/elf suffix combinations for gotoff,
	gotplt and pltoff to bfd relocations.
	(md_gather_operands): Map new instruction operand/elf suffix
	combinations to bfd relocations.
	(tc_s390_fix_adjustable): Add new gotoff, gotplt and pltoff relocations
	to the list of unadjustable relocations.
	(tc_s390_force_relocation): Always emit relocations for gotoff, gotplt
	and pltoff relocations.
	(md_apply_fix3): Add the new relocations.
This commit is contained in:
Martin Schwidefsky 2003-01-20 11:48:32 +00:00
parent 5236c819d2
commit 2a19f73f87
2 changed files with 95 additions and 2 deletions

View File

@ -1,3 +1,18 @@
2003-01-20 Martin Schwidefsky <schwidefsky@de.ibm.com>
* config/tc-s390.c (elf_suffix_type): Add suffix enums for gotoff,
gotplt and pltoff relocations.
(s390_elf_suffix): Add suffix strings for gotoff, gotplt and pltoff.
(s390_elf_cons): Map new lenght/elf suffix combinations for gotoff,
gotplt and pltoff to bfd relocations.
(md_gather_operands): Map new instruction operand/elf suffix
combinations to bfd relocations.
(tc_s390_fix_adjustable): Add new gotoff, gotplt and pltoff relocations
to the list of unadjustable relocations.
(tc_s390_force_relocation): Always emit relocations for gotoff, gotplt
and pltoff relocations.
(md_apply_fix3): Add the new relocations.
2003-01-20 Martin Schwidefsky <schwidefsky@de.ibm.com>
* config/tc-s390.c (md_apply_fix3): Emit error message for relocations

View File

@ -606,7 +606,10 @@ typedef enum
ELF_SUFFIX_NONE = 0,
ELF_SUFFIX_GOT,
ELF_SUFFIX_PLT,
ELF_SUFFIX_GOTENT
ELF_SUFFIX_GOTENT,
ELF_SUFFIX_GOTOFF,
ELF_SUFFIX_GOTPLT,
ELF_SUFFIX_PLTOFF
}
elf_suffix_type;
@ -635,6 +638,9 @@ s390_elf_suffix (str_p, exp_p)
{ "got12", 5, ELF_SUFFIX_GOT },
{ "plt", 3, ELF_SUFFIX_PLT },
{ "gotent", 6, ELF_SUFFIX_GOTENT },
{ "gotoff", 6, ELF_SUFFIX_GOTOFF },
{ "gotplt", 6, ELF_SUFFIX_GOTPLT },
{ "pltoff", 6, ELF_SUFFIX_PLTOFF },
{ NULL, 0, ELF_SUFFIX_NONE }
};
@ -956,10 +962,26 @@ s390_elf_cons (nbytes)
reloc = BFD_RELOC_32_GOT_PCREL;
else if (nbytes == 8 && suffix == ELF_SUFFIX_GOT)
reloc = BFD_RELOC_390_GOT64;
else if (nbytes == 2 && suffix == ELF_SUFFIX_GOTOFF)
reloc = BFD_RELOC_16_GOTOFF;
else if (nbytes == 4 && suffix == ELF_SUFFIX_GOTOFF)
reloc = BFD_RELOC_32_GOTOFF;
else if (nbytes == 8 && suffix == ELF_SUFFIX_GOTOFF)
reloc = BFD_RELOC_390_GOTOFF64;
else if (nbytes == 2 && suffix == ELF_SUFFIX_PLTOFF)
reloc = BFD_RELOC_390_PLTOFF16;
else if (nbytes == 4 && suffix == ELF_SUFFIX_PLTOFF)
reloc = BFD_RELOC_390_PLTOFF32;
else if (nbytes == 8 && suffix == ELF_SUFFIX_PLTOFF)
reloc = BFD_RELOC_390_PLTOFF64;
else if (nbytes == 4 && suffix == ELF_SUFFIX_PLT)
reloc = BFD_RELOC_390_PLT32;
else if (nbytes == 8 && suffix == ELF_SUFFIX_PLT)
reloc = BFD_RELOC_390_PLT64;
else if (nbytes == 4 && suffix == ELF_SUFFIX_GOTPLT)
reloc = BFD_RELOC_390_GOTPLT32;
else if (nbytes == 8 && suffix == ELF_SUFFIX_GOTPLT)
reloc = BFD_RELOC_390_GOTPLT64;
else
reloc = BFD_RELOC_UNUSED;
@ -1121,6 +1143,30 @@ md_gather_operands (str, insn, opcode)
&& (operand->bits == 32))
reloc = BFD_RELOC_390_GOTENT;
}
else if (suffix == ELF_SUFFIX_GOTOFF)
{
if ((operand->flags & S390_OPERAND_SIGNED)
&& (operand->bits == 16))
reloc = BFD_RELOC_16_GOTOFF;
}
else if (suffix == ELF_SUFFIX_PLTOFF)
{
if ((operand->flags & S390_OPERAND_SIGNED)
&& (operand->bits == 16))
reloc = BFD_RELOC_390_PLTOFF16;
}
else if (suffix == ELF_SUFFIX_GOTPLT)
{
if ((operand->flags & S390_OPERAND_DISP)
&& (operand->bits == 12))
reloc = BFD_RELOC_390_GOTPLT12;
else if ((operand->flags & S390_OPERAND_SIGNED)
&& (operand->bits == 16))
reloc = BFD_RELOC_390_GOTPLT16;
else if ((operand->flags & S390_OPERAND_PCREL)
&& (operand->bits == 32))
reloc = BFD_RELOC_390_GOTPLTENT;
}
if (suffix != ELF_SUFFIX_NONE && reloc == BFD_RELOC_UNUSED)
as_bad (_("invalid operand suffix"));
@ -1633,7 +1679,12 @@ tc_s390_fix_adjustable (fixP)
if ((S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_MERGE) != 0)
return 0;
/* adjust_reloc_syms doesn't know about the GOT. */
if ( fixP->fx_r_type == BFD_RELOC_32_GOTOFF
if ( fixP->fx_r_type == BFD_RELOC_16_GOTOFF
|| fixP->fx_r_type == BFD_RELOC_32_GOTOFF
|| fixP->fx_r_type == BFD_RELOC_390_GOTOFF64
|| fixP->fx_r_type == BFD_RELOC_390_PLTOFF16
|| fixP->fx_r_type == BFD_RELOC_390_PLTOFF32
|| fixP->fx_r_type == BFD_RELOC_390_PLTOFF64
|| fixP->fx_r_type == BFD_RELOC_390_PLT16DBL
|| fixP->fx_r_type == BFD_RELOC_390_PLT32
|| fixP->fx_r_type == BFD_RELOC_390_PLT32DBL
@ -1643,6 +1694,11 @@ tc_s390_fix_adjustable (fixP)
|| fixP->fx_r_type == BFD_RELOC_32_GOT_PCREL
|| fixP->fx_r_type == BFD_RELOC_390_GOT64
|| fixP->fx_r_type == BFD_RELOC_390_GOTENT
|| fixP->fx_r_type == BFD_RELOC_390_GOTPLT12
|| fixP->fx_r_type == BFD_RELOC_390_GOTPLT16
|| fixP->fx_r_type == BFD_RELOC_390_GOTPLT32
|| fixP->fx_r_type == BFD_RELOC_390_GOTPLT64
|| fixP->fx_r_type == BFD_RELOC_390_GOTPLTENT
|| fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
|| fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
return 0;
@ -1662,6 +1718,10 @@ tc_s390_force_relocation (fixp)
case BFD_RELOC_390_GOT12:
case BFD_RELOC_32_GOT_PCREL:
case BFD_RELOC_32_GOTOFF:
case BFD_RELOC_390_GOTOFF64:
case BFD_RELOC_390_PLTOFF16:
case BFD_RELOC_390_PLTOFF32:
case BFD_RELOC_390_PLTOFF64:
case BFD_RELOC_390_GOTPC:
case BFD_RELOC_390_GOT16:
case BFD_RELOC_390_GOTPCDBL:
@ -1671,6 +1731,11 @@ tc_s390_force_relocation (fixp)
case BFD_RELOC_390_PLT16DBL:
case BFD_RELOC_390_PLT32DBL:
case BFD_RELOC_390_PLT64:
case BFD_RELOC_390_GOTPLT12:
case BFD_RELOC_390_GOTPLT16:
case BFD_RELOC_390_GOTPLT32:
case BFD_RELOC_390_GOTPLT64:
case BFD_RELOC_390_GOTPLTENT:
case BFD_RELOC_VTABLE_INHERIT:
case BFD_RELOC_VTABLE_ENTRY:
return 1;
@ -1802,6 +1867,7 @@ md_apply_fix3 (fixP, valP, seg)
break;
case BFD_RELOC_390_12:
case BFD_RELOC_390_GOT12:
case BFD_RELOC_390_GOTPLT12:
if (fixP->fx_done)
{
unsigned short mop;
@ -1828,6 +1894,8 @@ md_apply_fix3 (fixP, valP, seg)
md_number_to_chars (where, value, 2);
break;
case BFD_RELOC_390_GOT16:
case BFD_RELOC_390_PLTOFF16:
case BFD_RELOC_390_GOTPLT16:
if (fixP->fx_done)
md_number_to_chars (where, value, 2);
break;
@ -1853,7 +1921,9 @@ md_apply_fix3 (fixP, valP, seg)
md_number_to_chars (where, value, 4);
break;
case BFD_RELOC_32_GOT_PCREL:
case BFD_RELOC_390_PLTOFF32:
case BFD_RELOC_390_PLT32:
case BFD_RELOC_390_GOTPLT32:
if (fixP->fx_done)
md_number_to_chars (where, value, 4);
break;
@ -1861,6 +1931,7 @@ md_apply_fix3 (fixP, valP, seg)
case BFD_RELOC_390_PLT32DBL:
case BFD_RELOC_390_GOTPCDBL:
case BFD_RELOC_390_GOTENT:
case BFD_RELOC_390_GOTPLTENT:
value += 2;
if (fixP->fx_done)
md_number_to_chars (where, (offsetT) value >> 1, 4);
@ -1871,8 +1942,15 @@ md_apply_fix3 (fixP, valP, seg)
md_number_to_chars (where, value, sizeof (int));
break;
case BFD_RELOC_390_GOTOFF64:
if (fixP->fx_done)
md_number_to_chars (where, value, 8);
break;
case BFD_RELOC_390_GOT64:
case BFD_RELOC_390_PLTOFF64:
case BFD_RELOC_390_PLT64:
case BFD_RELOC_390_GOTPLT64:
if (fixP->fx_done)
md_number_to_chars (where, value, 8);
break;