* elf32-mips.c (mips_elf_next_relocation): Rename from
	mips_elf_next_lo16_relocation, and generalize to look
	for any relocation type.
	(elf_mips_howto_table): Make R_MIPS_PC16 pcrel_offset.
	(elf_mips_gnu_rel_hi16): Howto for R_MIPS_GNU_REL_HI16.
	(elf_mips_gnu_rel_lo16): Howto for R_MIPS_GNU_REL_LO16.
	(elf_mips_gnu_rel16_s2): Howto for R_MIPS_GNU_REL16_S2.
	(elf_mips_gnu_pcrel64): Howto for R_MIPS_PC64.
	(elf_mips_gnu_pcrel32): Howto for R_MIPS_PC32.
	(bfd_elf32_bfd_reloc_type_lookup): Add new relocs.
	(mips_rtype_to_howto): Likewise.
	(mips_elf_calculate_relocation): Handle new relocs.
	(_bfd_mips_elf_relocate_section): REL_HI16/REL_LO16 relocs
	are paired.  The addend for R_MIPS_GNU_REL16_S2
	is shifted right two bits.
In gas/:
	* config/tc-mips.c (mips_ip): Don't put stuff in .rodata
	when embedded-pic.

	* config/tc-mips.c (SWITCH_TABLE): The ELF embedded-pic
 	implementation doesn't have special handling for switch
 	statements.
	(macro_build): Allow for code in sections other than .text.
	(macro): Likewise.
	(mips_ip): Likewise.
	(md_apply_fix): Do pc-relative relocation madness for MIPS ELF.
  	Don't perform relocs if we will be outputting them.
	(tc_gen_reloc): For ELF, just use fx_addnumber for pc-relative
 	relocations.  Allow BFD_RELOC_16_PCREL_S2 relocs when
 	embedded-pic.
In gas/testsuite/:
	* gas/mips/empic.d: New file.
	* gas/mips/empic.s: New file.
	* gas/mips/mips16-e.d: New file.
	* gas/mips/mips16-e.s: New file.
	* gas/mips/mips16-f.d: New file.
	* gas/mips/mips16-f.s: New file.
	* gas/mips/mips.exp: Add empic, mips16-e.  Add mips16-f as an
	expected failure.
In include/elf:
	* mips.h: Add R_MIPS_GNU_REL_HI16, R_MIPS_GNU_REL_LO16,
 	R_MIPS_GNU_REL16_S2, R_MIPS_PC64 and R_MIPS_PC32 relocation
 	numbers.
This commit is contained in:
Geoffrey Keating 2000-03-11 02:16:25 +00:00
parent 88b6bae086
commit bb2d6cd7b1
14 changed files with 636 additions and 41 deletions

View file

@ -1,3 +1,21 @@
2000-03-10 Geoffrey Keating <geoffk@cygnus.com>
* elf32-mips.c (mips_elf_next_relocation): Rename from
mips_elf_next_lo16_relocation, and generalize to look
for any relocation type.
(elf_mips_howto_table): Make R_MIPS_PC16 pcrel_offset.
(elf_mips_gnu_rel_hi16): Howto for R_MIPS_GNU_REL_HI16.
(elf_mips_gnu_rel_lo16): Howto for R_MIPS_GNU_REL_LO16.
(elf_mips_gnu_rel16_s2): Howto for R_MIPS_GNU_REL16_S2.
(elf_mips_gnu_pcrel64): Howto for R_MIPS_PC64.
(elf_mips_gnu_pcrel32): Howto for R_MIPS_PC32.
(bfd_elf32_bfd_reloc_type_lookup): Add new relocs.
(mips_rtype_to_howto): Likewise.
(mips_elf_calculate_relocation): Handle new relocs.
(_bfd_mips_elf_relocate_section): REL_HI16/REL_LO16 relocs
are paired. The addend for R_MIPS_GNU_REL16_S2
is shifted right two bits.
2000-03-10 Alan Modra <alan@spri.levels.unisa.edu.au> 2000-03-10 Alan Modra <alan@spri.levels.unisa.edu.au>
* reloc.c (bfd_perform_relocation): Undo emacs formatting of * reloc.c (bfd_perform_relocation): Undo emacs formatting of

View file

@ -159,8 +159,9 @@ static boolean mips_elf_record_global_got_symbol
struct mips_got_info *)); struct mips_got_info *));
static bfd_vma mips_elf_got_page static bfd_vma mips_elf_got_page
PARAMS ((bfd *, struct bfd_link_info *, bfd_vma, bfd_vma *)); PARAMS ((bfd *, struct bfd_link_info *, bfd_vma, bfd_vma *));
static const Elf_Internal_Rela *mips_elf_next_lo16_relocation static const Elf_Internal_Rela *mips_elf_next_relocation
PARAMS ((const Elf_Internal_Rela *, const Elf_Internal_Rela *)); PARAMS ((unsigned int, const Elf_Internal_Rela *,
const Elf_Internal_Rela *));
static bfd_reloc_status_type mips_elf_calculate_relocation static bfd_reloc_status_type mips_elf_calculate_relocation
PARAMS ((bfd *, bfd *, asection *, struct bfd_link_info *, PARAMS ((bfd *, bfd *, asection *, struct bfd_link_info *,
const Elf_Internal_Rela *, bfd_vma, reloc_howto_type *, const Elf_Internal_Rela *, bfd_vma, reloc_howto_type *,
@ -614,7 +615,7 @@ static reloc_howto_type elf_mips_howto_table[] =
true, /* partial_inplace */ true, /* partial_inplace */
0xffff, /* src_mask */ 0xffff, /* src_mask */
0xffff, /* dst_mask */ 0xffff, /* dst_mask */
false), /* pcrel_offset */ true), /* pcrel_offset */
/* 16 bit call through global offset table. */ /* 16 bit call through global offset table. */
HOWTO (R_MIPS_CALL16, /* type */ HOWTO (R_MIPS_CALL16, /* type */
@ -944,6 +945,87 @@ static reloc_howto_type elf_mips16_gprel_howto =
false); /* pcrel_offset */ false); /* pcrel_offset */
/* GNU extensions for embedded-pic. */
/* High 16 bits of symbol value, pc-relative. */
static reloc_howto_type elf_mips_gnu_rel_hi16 =
HOWTO (R_MIPS_GNU_REL_HI16, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
true, /* pc_relative */
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
_bfd_mips_elf_hi16_reloc, /* special_function */
"R_MIPS_GNU_REL_HI16", /* name */
true, /* partial_inplace */
0xffff, /* src_mask */
0xffff, /* dst_mask */
true); /* pcrel_offset */
/* Low 16 bits of symbol value, pc-relative. */
static reloc_howto_type elf_mips_gnu_rel_lo16 =
HOWTO (R_MIPS_GNU_REL_LO16, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
true, /* pc_relative */
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
_bfd_mips_elf_lo16_reloc, /* special_function */
"R_MIPS_GNU_REL_LO16", /* name */
true, /* partial_inplace */
0xffff, /* src_mask */
0xffff, /* dst_mask */
true); /* pcrel_offset */
/* 16 bit offset for pc-relative branches. */
static reloc_howto_type elf_mips_gnu_rel16_s2 =
HOWTO (R_MIPS_GNU_REL16_S2, /* type */
2, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
true, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
"R_MIPS_GNU_REL16_S2", /* name */
true, /* partial_inplace */
0xffff, /* src_mask */
0xffff, /* dst_mask */
true); /* pcrel_offset */
/* 64 bit pc-relative. */
static reloc_howto_type elf_mips_gnu_pcrel64 =
HOWTO (R_MIPS_PC64, /* type */
0, /* rightshift */
4, /* size (0 = byte, 1 = short, 2 = long) */
64, /* bitsize */
true, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
"R_MIPS_PC64", /* name */
true, /* partial_inplace */
MINUS_ONE, /* src_mask */
MINUS_ONE, /* dst_mask */
true); /* pcrel_offset */
/* 32 bit pc-relative. */
static reloc_howto_type elf_mips_gnu_pcrel32 =
HOWTO (R_MIPS_PC32, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
32, /* bitsize */
true, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
"R_MIPS_PC32", /* name */
true, /* partial_inplace */
0xffffffff, /* src_mask */
0xffffffff, /* dst_mask */
true); /* pcrel_offset */
/* GNU extension to record C++ vtable hierarchy */ /* GNU extension to record C++ vtable hierarchy */
static reloc_howto_type elf_mips_gnu_vtinherit_howto = static reloc_howto_type elf_mips_gnu_vtinherit_howto =
HOWTO (R_MIPS_GNU_VTINHERIT, /* type */ HOWTO (R_MIPS_GNU_VTINHERIT, /* type */
@ -1882,6 +1964,16 @@ bfd_elf32_bfd_reloc_type_lookup (abfd, code)
return &elf_mips_gnu_vtinherit_howto; return &elf_mips_gnu_vtinherit_howto;
case BFD_RELOC_VTABLE_ENTRY: case BFD_RELOC_VTABLE_ENTRY:
return &elf_mips_gnu_vtentry_howto; return &elf_mips_gnu_vtentry_howto;
case BFD_RELOC_PCREL_HI16_S:
return &elf_mips_gnu_rel_hi16;
case BFD_RELOC_PCREL_LO16:
return &elf_mips_gnu_rel_lo16;
case BFD_RELOC_16_PCREL_S2:
return &elf_mips_gnu_rel16_s2;
case BFD_RELOC_64_PCREL:
return &elf_mips_gnu_pcrel64;
case BFD_RELOC_32_PCREL:
return &elf_mips_gnu_pcrel32;
} }
} }
@ -1905,6 +1997,21 @@ mips_rtype_to_howto (r_type)
case R_MIPS_GNU_VTENTRY: case R_MIPS_GNU_VTENTRY:
return &elf_mips_gnu_vtentry_howto; return &elf_mips_gnu_vtentry_howto;
break; break;
case R_MIPS_GNU_REL_HI16:
return &elf_mips_gnu_rel_hi16;
break;
case R_MIPS_GNU_REL_LO16:
return &elf_mips_gnu_rel_lo16;
break;
case R_MIPS_GNU_REL16_S2:
return &elf_mips_gnu_rel16_s2;
break;
case R_MIPS_PC64:
return &elf_mips_gnu_pcrel64;
break;
case R_MIPS_PC32:
return &elf_mips_gnu_pcrel32;
break;
default: default:
BFD_ASSERT (r_type < (unsigned int) R_MIPS_max); BFD_ASSERT (r_type < (unsigned int) R_MIPS_max);
@ -5444,11 +5551,12 @@ mips_elf_got16_entry (abfd, info, value)
return index; return index;
} }
/* Returns the first R_MIPS_LO16 relocation found, beginning with /* Returns the first relocation of type r_type found, beginning with
RELOCATION. RELEND is one-past-the-end of the relocation table. */ RELOCATION. RELEND is one-past-the-end of the relocation table. */
static const Elf_Internal_Rela * static const Elf_Internal_Rela *
mips_elf_next_lo16_relocation (relocation, relend) mips_elf_next_relocation (r_type, relocation, relend)
unsigned int r_type;
const Elf_Internal_Rela *relocation; const Elf_Internal_Rela *relocation;
const Elf_Internal_Rela *relend; const Elf_Internal_Rela *relend;
{ {
@ -5460,7 +5568,7 @@ mips_elf_next_lo16_relocation (relocation, relend)
extension in general, as that is useful for GCC. */ extension in general, as that is useful for GCC. */
while (relocation < relend) while (relocation < relend)
{ {
if (ELF32_R_TYPE (relocation->r_info) == R_MIPS_LO16) if (ELF32_R_TYPE (relocation->r_info) == r_type)
return relocation; return relocation;
++relocation; ++relocation;
@ -6006,6 +6114,24 @@ mips_elf_calculate_relocation (abfd,
value &= howto->dst_mask; value &= howto->dst_mask;
break; break;
case R_MIPS_PC32:
case R_MIPS_PC64:
case R_MIPS_GNU_REL_LO16:
value = symbol + addend - p;
value &= howto->dst_mask;
break;
case R_MIPS_GNU_REL16_S2:
value = symbol + mips_elf_sign_extend (addend << 2, 18) - p;
overflowed_p = mips_elf_overflow_p (value, 18);
value = (value >> 2) & howto->dst_mask;
break;
case R_MIPS_GNU_REL_HI16:
value = mips_elf_high (addend + symbol - p);
value &= howto->dst_mask;
break;
case R_MIPS16_26: case R_MIPS16_26:
/* The calculation for R_MIPS_26 is just the same as for an /* The calculation for R_MIPS_26 is just the same as for an
R_MIPS_26. It's only the storage of the relocated field into R_MIPS_26. It's only the storage of the relocated field into
@ -6484,6 +6610,7 @@ _bfd_mips_elf_relocate_section (output_bfd, info, input_bfd, input_section,
combination of the addend stored in two different combination of the addend stored in two different
relocations. */ relocations. */
if (r_type == R_MIPS_HI16 if (r_type == R_MIPS_HI16
|| r_type == R_MIPS_GNU_REL_HI16
|| (r_type == R_MIPS_GOT16 || (r_type == R_MIPS_GOT16
&& mips_elf_local_relocation_p (input_bfd, rel, && mips_elf_local_relocation_p (input_bfd, rel,
local_sections))) local_sections)))
@ -6491,6 +6618,7 @@ _bfd_mips_elf_relocate_section (output_bfd, info, input_bfd, input_section,
bfd_vma l; bfd_vma l;
const Elf_Internal_Rela *lo16_relocation; const Elf_Internal_Rela *lo16_relocation;
reloc_howto_type *lo16_howto; reloc_howto_type *lo16_howto;
int lo;
/* The combined value is the sum of the HI16 addend, /* The combined value is the sum of the HI16 addend,
left-shifted by sixteen bits, and the LO16 left-shifted by sixteen bits, and the LO16
@ -6498,15 +6626,18 @@ _bfd_mips_elf_relocate_section (output_bfd, info, input_bfd, input_section,
a `lui' of the HI16 value, and then an `addiu' of a `lui' of the HI16 value, and then an `addiu' of
the LO16 value.) the LO16 value.)
Scan ahead to find a matching R_MIPS_LO16 Scan ahead to find a matching LO16 relocation. */
relocation. */ if (r_type == R_MIPS_GNU_REL_HI16)
lo = R_MIPS_GNU_REL_LO16;
else
lo = R_MIPS_LO16;
lo16_relocation lo16_relocation
= mips_elf_next_lo16_relocation (rel, relend); = mips_elf_next_relocation (lo, rel, relend);
if (lo16_relocation == NULL) if (lo16_relocation == NULL)
return false; return false;
/* Obtain the addend kept there. */ /* Obtain the addend kept there. */
lo16_howto = mips_rtype_to_howto (R_MIPS_LO16); lo16_howto = mips_rtype_to_howto (lo);
l = mips_elf_obtain_contents (lo16_howto, l = mips_elf_obtain_contents (lo16_howto,
lo16_relocation, lo16_relocation,
input_bfd, contents); input_bfd, contents);
@ -6554,7 +6685,8 @@ _bfd_mips_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|| r_type == R_MIPS_LITERAL) || r_type == R_MIPS_LITERAL)
addend -= (_bfd_get_gp_value (output_bfd) addend -= (_bfd_get_gp_value (output_bfd)
- _bfd_get_gp_value (input_bfd)); - _bfd_get_gp_value (input_bfd));
else if (r_type == R_MIPS_26 || r_type == R_MIPS16_26) else if (r_type == R_MIPS_26 || r_type == R_MIPS16_26
|| r_type == R_MIPS_GNU_REL16_S2)
/* The addend is stored without its two least /* The addend is stored without its two least
significant bits (which are always zero.) In a significant bits (which are always zero.) In a
non-relocateable link, calculate_relocation will do non-relocateable link, calculate_relocation will do
@ -6570,17 +6702,19 @@ _bfd_mips_elf_relocate_section (output_bfd, info, input_bfd, input_section,
/* If the relocation is for a R_MIPS_HI16 or R_MIPS_GOT16, /* If the relocation is for a R_MIPS_HI16 or R_MIPS_GOT16,
then we only want to write out the high-order 16 bits. then we only want to write out the high-order 16 bits.
The subsequent R_MIPS_LO16 will handle the low-order bits. */ The subsequent R_MIPS_LO16 will handle the low-order bits. */
if (r_type == R_MIPS_HI16 || r_type == R_MIPS_GOT16) if (r_type == R_MIPS_HI16 || r_type == R_MIPS_GOT16
|| r_type == R_MIPS_GNU_REL_HI16)
addend = mips_elf_high (addend); addend = mips_elf_high (addend);
/* If the relocation is for an R_MIPS_26 relocation, then /* If the relocation is for an R_MIPS_26 relocation, then
the two low-order bits are not stored in the object file; the two low-order bits are not stored in the object file;
they are implicitly zero. */ they are implicitly zero. */
else if (r_type == R_MIPS_26 || r_type == R_MIPS16_26) else if (r_type == R_MIPS_26 || r_type == R_MIPS16_26
|| r_type == R_MIPS_GNU_REL16_S2)
addend >>= 2; addend >>= 2;
if (rela_relocation_p) if (rela_relocation_p)
/* If this is a RELA relocation, just update the addend. /* If this is a RELA relocation, just update the addend.
We have to cast away constness for REL. */ We have to cast away constness for REL. */
rel->r_addend = addend; rel->r_addend = addend;
else else
{ {
@ -6631,7 +6765,7 @@ _bfd_mips_elf_relocate_section (output_bfd, info, input_bfd, input_section,
case bfd_reloc_undefined: case bfd_reloc_undefined:
/* mips_elf_calculate_relocation already called the /* mips_elf_calculate_relocation already called the
undefined_symbol callback. There's no real point in undefined_symbol callback. There's no real point in
trying to perform the relocation at this point, so we trying to perform the relocation at this point, so we
just skip ahead to the next relocation. */ just skip ahead to the next relocation. */
continue; continue;

View file

@ -1,3 +1,20 @@
2000-03-10 Geoffrey Keating <geoffk@cygnus.com>
* config/tc-mips.c (mips_ip): Don't put stuff in .rodata
when embedded-pic.
* config/tc-mips.c (SWITCH_TABLE): The ELF embedded-pic
implementation doesn't have special handling for switch
statements.
(macro_build): Allow for code in sections other than .text.
(macro): Likewise.
(mips_ip): Likewise.
(md_apply_fix): Do pc-relative relocation madness for MIPS ELF.
Don't perform relocs if we will be outputting them.
(tc_gen_reloc): For ELF, just use fx_addnumber for pc-relative
relocations. Allow BFD_RELOC_16_PCREL_S2 relocs when
embedded-pic.
2000-03-09 Catherine Moore <clm@cygnus.com> 2000-03-09 Catherine Moore <clm@cygnus.com>
* config/tc-m32r.c (m32r_fix_adjustable): Look up the * config/tc-m32r.c (m32r_fix_adjustable): Look up the

View file

@ -2597,7 +2597,6 @@ macro_build (place, counter, ep, name, fmt, va_alist)
|| r == BFD_RELOC_MIPS_GOT_LO16 || r == BFD_RELOC_MIPS_GOT_LO16
|| r == BFD_RELOC_MIPS_CALL_LO16 || r == BFD_RELOC_MIPS_CALL_LO16
|| (ep->X_op == O_subtract || (ep->X_op == O_subtract
&& now_seg == text_section
&& r == BFD_RELOC_PCREL_LO16)); && r == BFD_RELOC_PCREL_LO16));
continue; continue;
@ -2611,7 +2610,6 @@ macro_build (place, counter, ep, name, fmt, va_alist)
|| r == BFD_RELOC_MIPS_GOT_HI16 || r == BFD_RELOC_MIPS_GOT_HI16
|| r == BFD_RELOC_MIPS_CALL_HI16)) || r == BFD_RELOC_MIPS_CALL_HI16))
|| (ep->X_op == O_subtract || (ep->X_op == O_subtract
&& now_seg == text_section
&& r == BFD_RELOC_PCREL_HI16_S))); && r == BFD_RELOC_PCREL_HI16_S)));
if (ep->X_op == O_constant) if (ep->X_op == O_constant)
{ {
@ -4150,23 +4148,23 @@ macro (ip)
/* When generating embedded PIC code, we permit expressions of /* When generating embedded PIC code, we permit expressions of
the form the form
la $4,foo-bar la $4,foo-bar
where bar is an address in the .text section. These are used where bar is an address in the current section. These are used
when getting the addresses of functions. We don't permit when getting the addresses of functions. We don't permit
X_add_number to be non-zero, because if the symbol is X_add_number to be non-zero, because if the symbol is
external the relaxing code needs to know that any addend is external the relaxing code needs to know that any addend is
purely the offset to X_op_symbol. */ purely the offset to X_op_symbol. */
if (mips_pic == EMBEDDED_PIC if (mips_pic == EMBEDDED_PIC
&& offset_expr.X_op == O_subtract && offset_expr.X_op == O_subtract
&& now_seg == text_section
&& (symbol_constant_p (offset_expr.X_op_symbol) && (symbol_constant_p (offset_expr.X_op_symbol)
? S_GET_SEGMENT (offset_expr.X_op_symbol) == text_section ? S_GET_SEGMENT (offset_expr.X_op_symbol) == now_seg
: (symbol_equated_p (offset_expr.X_op_symbol) : (symbol_equated_p (offset_expr.X_op_symbol)
&& (S_GET_SEGMENT && (S_GET_SEGMENT
(symbol_get_value_expression (offset_expr.X_op_symbol) (symbol_get_value_expression (offset_expr.X_op_symbol)
->X_add_symbol) ->X_add_symbol)
== text_section))) == now_seg)))
&& breg == 0 && breg == 0
&& offset_expr.X_add_number == 0) && (offset_expr.X_add_number == 0
|| OUTPUT_FLAVOR == bfd_target_elf_flavour))
{ {
macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u", macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
treg, (int) BFD_RELOC_PCREL_HI16_S); treg, (int) BFD_RELOC_PCREL_HI16_S);
@ -7666,11 +7664,15 @@ mips_ip (str, ip)
default: /* unused default case avoids warnings. */ default: /* unused default case avoids warnings. */
case 'L': case 'L':
newname = RDATA_SECTION_NAME; newname = RDATA_SECTION_NAME;
if (USE_GLOBAL_POINTER_OPT && g_switch_value >= 8) if ((USE_GLOBAL_POINTER_OPT && g_switch_value >= 8)
|| mips_pic == EMBEDDED_PIC)
newname = ".lit8"; newname = ".lit8";
break; break;
case 'F': case 'F':
newname = RDATA_SECTION_NAME; if (mips_pic == EMBEDDED_PIC)
newname = ".lit8";
else
newname = RDATA_SECTION_NAME;
break; break;
case 'l': case 'l':
assert (!USE_GLOBAL_POINTER_OPT assert (!USE_GLOBAL_POINTER_OPT
@ -7813,9 +7815,8 @@ mips_ip (str, ip)
|| offset_expr.X_add_number < -0x8000) || offset_expr.X_add_number < -0x8000)
&& (mips_pic != EMBEDDED_PIC && (mips_pic != EMBEDDED_PIC
|| offset_expr.X_op != O_subtract || offset_expr.X_op != O_subtract
|| now_seg != text_section
|| (S_GET_SEGMENT (offset_expr.X_op_symbol) || (S_GET_SEGMENT (offset_expr.X_op_symbol)
!= text_section))) != now_seg)))
break; break;
if (c == 'h' || c == 'H') if (c == 'h' || c == 'H')
@ -9495,6 +9496,7 @@ mips_frob_file ()
fixup requires the special reloc. */ fixup requires the special reloc. */
#define SWITCH_TABLE(fixp) \ #define SWITCH_TABLE(fixp) \
((fixp)->fx_r_type == BFD_RELOC_32 \ ((fixp)->fx_r_type == BFD_RELOC_32 \
&& OUTPUT_FLAVOR != bfd_target_elf_flavour \
&& (fixp)->fx_addsy != NULL \ && (fixp)->fx_addsy != NULL \
&& (fixp)->fx_subsy != NULL \ && (fixp)->fx_subsy != NULL \
&& S_GET_SEGMENT ((fixp)->fx_addsy) == text_section \ && S_GET_SEGMENT ((fixp)->fx_addsy) == text_section \
@ -9542,15 +9544,16 @@ md_apply_fix (fixP, valueP)
symbol, we need to adjust the value. */ symbol, we need to adjust the value. */
#ifdef OBJ_ELF #ifdef OBJ_ELF
if (fixP->fx_addsy != NULL && OUTPUT_FLAVOR == bfd_target_elf_flavour) if (fixP->fx_addsy != NULL && OUTPUT_FLAVOR == bfd_target_elf_flavour)
{
if (S_GET_OTHER (fixP->fx_addsy) == STO_MIPS16 if (S_GET_OTHER (fixP->fx_addsy) == STO_MIPS16
|| S_IS_WEAK (fixP->fx_addsy) || S_IS_WEAK (fixP->fx_addsy)
|| (symbol_used_in_reloc_p (fixP->fx_addsy) || (symbol_used_in_reloc_p (fixP->fx_addsy)
&& (((bfd_get_section_flags (stdoutput, && (((bfd_get_section_flags (stdoutput,
S_GET_SEGMENT (fixP->fx_addsy)) S_GET_SEGMENT (fixP->fx_addsy))
& SEC_LINK_ONCE) != 0) & SEC_LINK_ONCE) != 0)
|| !strncmp (segment_name (S_GET_SEGMENT (fixP->fx_addsy)), || !strncmp (segment_name (S_GET_SEGMENT (fixP->fx_addsy)),
".gnu.linkonce", ".gnu.linkonce",
sizeof (".gnu.linkonce") - 1)))) sizeof (".gnu.linkonce") - 1))))
{ {
value -= S_GET_VALUE (fixP->fx_addsy); value -= S_GET_VALUE (fixP->fx_addsy);
@ -9558,12 +9561,29 @@ md_apply_fix (fixP, valueP)
{ {
/* In this case, the bfd_install_relocation routine will /* In this case, the bfd_install_relocation routine will
incorrectly add the symbol value back in. We just want incorrectly add the symbol value back in. We just want
the addend to appear in the object file. */ the addend to appear in the object file.
FIXME: If this makes VALUE zero, we're toast. */
value -= S_GET_VALUE (fixP->fx_addsy); value -= S_GET_VALUE (fixP->fx_addsy);
} }
} }
#endif
/* This code was generated using trial and error and so is
fragile and not trustworthy. If you change it, you should
rerun the elf-rel, elf-rel2, and empic testcases and ensure
they still pass. */
if (fixP->fx_pcrel || fixP->fx_subsy != NULL)
{
value += fixP->fx_frag->fr_address + fixP->fx_where;
/* BFD's REL handling, for MIPS, is _very_ weird.
This gives the right results, but it can't possibly
be the way things are supposed to work. */
if (fixP->fx_r_type != BFD_RELOC_16_PCREL_S2
|| S_GET_SEGMENT (fixP->fx_addsy) != undefined_section)
value += fixP->fx_frag->fr_address + fixP->fx_where;
}
}
#endif
fixP->fx_addnumber = value; /* Remember value for tc_gen_reloc */ fixP->fx_addnumber = value; /* Remember value for tc_gen_reloc */
@ -9601,7 +9621,12 @@ md_apply_fix (fixP, valueP)
case BFD_RELOC_PCREL_HI16_S: case BFD_RELOC_PCREL_HI16_S:
/* The addend for this is tricky if it is internal, so we just /* The addend for this is tricky if it is internal, so we just
do everything here rather than in bfd_install_relocation. */ do everything here rather than in bfd_install_relocation. */
if ((symbol_get_bfdsym (fixP->fx_addsy)->flags & BSF_SECTION_SYM) == 0) if (OUTPUT_FLAVOR == bfd_target_elf_flavour
&& !fixP->fx_done
&& value != 0)
break;
if (fixP->fx_addsy
&& (symbol_get_bfdsym (fixP->fx_addsy)->flags & BSF_SECTION_SYM) == 0)
{ {
/* For an external symbol adjust by the address to make it /* For an external symbol adjust by the address to make it
pcrel_offset. We use the address of the RELLO reloc pcrel_offset. We use the address of the RELLO reloc
@ -9621,7 +9646,12 @@ md_apply_fix (fixP, valueP)
case BFD_RELOC_PCREL_LO16: case BFD_RELOC_PCREL_LO16:
/* The addend for this is tricky if it is internal, so we just /* The addend for this is tricky if it is internal, so we just
do everything here rather than in bfd_install_relocation. */ do everything here rather than in bfd_install_relocation. */
if ((symbol_get_bfdsym (fixP->fx_addsy)->flags & BSF_SECTION_SYM) == 0) if (OUTPUT_FLAVOR == bfd_target_elf_flavour
&& !fixP->fx_done
&& value != 0)
break;
if (fixP->fx_addsy
&& (symbol_get_bfdsym (fixP->fx_addsy)->flags & BSF_SECTION_SYM) == 0)
value += fixP->fx_frag->fr_address + fixP->fx_where; value += fixP->fx_frag->fr_address + fixP->fx_where;
buf = (unsigned char *) fixP->fx_frag->fr_literal + fixP->fx_where; buf = (unsigned char *) fixP->fx_frag->fr_literal + fixP->fx_where;
if (target_big_endian) if (target_big_endian)
@ -9704,6 +9734,15 @@ md_apply_fix (fixP, valueP)
if ((value & 0x3) != 0) if ((value & 0x3) != 0)
as_bad_where (fixP->fx_file, fixP->fx_line, as_bad_where (fixP->fx_file, fixP->fx_line,
_("Branch to odd address (%lx)"), value); _("Branch to odd address (%lx)"), value);
if (!fixP->fx_done && value != 0)
break;
/* If 'value' is zero, the remaining reloc code won't actually
do the store, so it must be done here. This is probably
a bug somewhere. */
if (!fixP->fx_done)
value -= fixP->fx_frag->fr_address + fixP->fx_where;
value >>= 2; value >>= 2;
/* update old instruction data */ /* update old instruction data */
@ -11064,6 +11103,8 @@ tc_gen_reloc (section, fixp)
as_fatal (_("Double check fx_r_type in tc-mips.c:tc_gen_reloc")); as_fatal (_("Double check fx_r_type in tc-mips.c:tc_gen_reloc"));
fixp->fx_r_type = BFD_RELOC_GPREL32; fixp->fx_r_type = BFD_RELOC_GPREL32;
} }
else if (fixp->fx_pcrel == 0 || OUTPUT_FLAVOR == bfd_target_elf_flavour)
reloc->addend = fixp->fx_addnumber;
else if (fixp->fx_r_type == BFD_RELOC_PCREL_LO16) else if (fixp->fx_r_type == BFD_RELOC_PCREL_LO16)
{ {
/* We use a special addend for an internal RELLO reloc. */ /* We use a special addend for an internal RELLO reloc. */
@ -11088,8 +11129,6 @@ tc_gen_reloc (section, fixp)
+ fixp->fx_next->fx_frag->fr_address + fixp->fx_next->fx_frag->fr_address
+ fixp->fx_next->fx_where); + fixp->fx_next->fx_where);
} }
else if (fixp->fx_pcrel == 0)
reloc->addend = fixp->fx_addnumber;
else else
{ {
if (OUTPUT_FLAVOR != bfd_target_aout_flavour) if (OUTPUT_FLAVOR != bfd_target_aout_flavour)
@ -11228,7 +11267,8 @@ tc_gen_reloc (section, fixp)
/* To support a PC relative reloc when generating embedded PIC code /* To support a PC relative reloc when generating embedded PIC code
for ECOFF, we use a Cygnus extension. We check for that here to for ECOFF, we use a Cygnus extension. We check for that here to
make sure that we don't let such a reloc escape normally. */ make sure that we don't let such a reloc escape normally. */
if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour if ((OUTPUT_FLAVOR == bfd_target_ecoff_flavour
|| OUTPUT_FLAVOR == bfd_target_elf_flavour)
&& code == BFD_RELOC_16_PCREL_S2 && code == BFD_RELOC_16_PCREL_S2
&& mips_pic != EMBEDDED_PIC) && mips_pic != EMBEDDED_PIC)
reloc->howto = NULL; reloc->howto = NULL;
@ -11893,6 +11933,3 @@ s_loc (x)
symbolP->sy_segment = now_seg; symbolP->sy_segment = now_seg;
} }
#endif #endif

View file

@ -1,3 +1,14 @@
2000-03-10 Geoffrey Keating <geoffk@cygnus.com>
* gas/mips/empic.d: New file.
* gas/mips/empic.s: New file.
* gas/mips/mips16-e.d: New file.
* gas/mips/mips16-e.s: New file.
* gas/mips/mips16-f.d: New file.
* gas/mips/mips16-f.s: New file.
* gas/mips/mips.exp: Add empic, mips16-e. Add mips16-f as an
expected failure.
2000-02-25 H.J. Lu <hjl@gnu.org> 2000-02-25 H.J. Lu <hjl@gnu.org>
* gas/i386/general.l: Support a.out and coff. * gas/i386/general.l: Support a.out and coff.

View file

@ -0,0 +1,155 @@
#objdump: -rst -mmips:4000
#name: MIPS empic
#as: -membedded-pic -mips3
# Check GNU-specific embedded relocs, for ELF.
.*: +file format elf.*mips.*
SYMBOL TABLE:
0+0000000 l d \.text 0+0000000
0+0000000 l d \.data 0+0000000
0+0000000 l d \.bss 0+0000000
0+0000000 l d \.foo 0+0000000
0+0000000 l d \.reginfo 0+0000000
0+0000000 l d \.mdebug 0+0000000
0+0000004 l \.text 0+0000000 l2
0+0000000 \*UND\* 0+0000000 g1
0+0000000 \*UND\* 0+0000000 g2
0+0000100 l \.foo 0+0000000 l1
0+0000034 l \.text 0+0000000 l3
0+0000098 l \.text 0+0000000 l5
0+0000004 l \.foo 0+0000000 l4
RELOCATION RECORDS FOR \[\.text\]:
OFFSET TYPE VALUE
0+0000004 R_MIPS_GNU_REL16_S2 g1
0+000000c R_MIPS_GNU_REL16_S2 g2
0+0000014 R_MIPS_GNU_REL16_S2 g2
0+000001c R_MIPS_GNU_REL16_S2 \.foo
0+0000024 R_MIPS_GNU_REL16_S2 \.text
0+000002c R_MIPS_GNU_REL16_S2 \.foo
0+0000034 R_MIPS_GNU_REL16_S2 \.text
0+000003c R_MIPS_GNU_REL_HI16 g1
0+0000040 R_MIPS_GNU_REL_LO16 g1
0+0000044 R_MIPS_GNU_REL_HI16 \.foo
0+0000048 R_MIPS_GNU_REL_LO16 \.foo
0+0000050 R_MIPS_32 g1
0+0000054 R_MIPS_32 \.foo
0+0000058 R_MIPS_32 \.text
0+000005c R_MIPS_PC32 g1
0+0000060 R_MIPS_PC32 \.foo
0+0000068 R_MIPS_64 g1
0+0000070 R_MIPS_64 \.foo
0+0000078 R_MIPS_64 \.text
0+0000080 R_MIPS_PC64 g1
0+0000088 R_MIPS_PC64 \.foo
0+0000098 R_MIPS_GNU_REL16_S2 \.text
0+000009c R_MIPS_GNU_REL16_S2 \.text
0+00000a0 R_MIPS_GNU_REL_HI16 \.text
0+00000a4 R_MIPS_GNU_REL_LO16 \.text
0+00000a8 R_MIPS_GNU_REL_HI16 \.text
0+00000ac R_MIPS_GNU_REL_LO16 \.text
0+00000b0 R_MIPS_32 \.text
0+00000b8 R_MIPS_64 \.text
0+00000cc R_MIPS_GNU_REL16_S2 \.text
0+00000d0 R_MIPS_GNU_REL16_S2 \.text
0+00000d4 R_MIPS_GNU_REL_HI16 \.text
0+00000d8 R_MIPS_GNU_REL_LO16 \.text
0+00000dc R_MIPS_GNU_REL_HI16 \.text
0+00000e0 R_MIPS_GNU_REL_LO16 \.text
0+00000e4 R_MIPS_32 \.text
0+00000f0 R_MIPS_64 \.text
RELOCATION RECORDS FOR \[\.foo\]:
OFFSET TYPE VALUE
0+0000004 R_MIPS_GNU_REL_HI16 g1
0+0000008 R_MIPS_GNU_REL_LO16 g1
0+000000c R_MIPS_GNU_REL_HI16 \.foo
0+0000010 R_MIPS_GNU_REL_LO16 \.foo
0+0000014 R_MIPS_GNU_REL_HI16 \.text
0+0000018 R_MIPS_GNU_REL_LO16 \.text
0+000001c R_MIPS_GNU_REL_HI16 g1
0+0000020 R_MIPS_GNU_REL_LO16 g1
0+0000024 R_MIPS_GNU_REL_HI16 g1
0+0000028 R_MIPS_GNU_REL_LO16 g1
0+000002c R_MIPS_GNU_REL_HI16 \.foo
0+0000030 R_MIPS_GNU_REL_LO16 \.foo
0+0000034 R_MIPS_GNU_REL_HI16 \.text
0+0000038 R_MIPS_GNU_REL_LO16 \.text
0+000003c R_MIPS_32 g1
0+0000040 R_MIPS_32 \.foo
0+0000044 R_MIPS_32 \.text
0+0000048 R_MIPS_PC32 g1
0+0000050 R_MIPS_PC32 \.text
0+0000058 R_MIPS_64 g1
0+0000060 R_MIPS_64 \.foo
0+0000068 R_MIPS_64 \.text
0+0000070 R_MIPS_PC64 g1
0+0000080 R_MIPS_PC64 \.text
0+0000088 R_MIPS_GNU_REL_HI16 g1
0+000008c R_MIPS_GNU_REL_LO16 g1
0+0000090 R_MIPS_GNU_REL_HI16 \.foo
0+0000094 R_MIPS_GNU_REL_LO16 \.foo
0+0000098 R_MIPS_GNU_REL_HI16 \.text
0+000009c R_MIPS_GNU_REL_LO16 \.text
0+00000a0 R_MIPS_GNU_REL_HI16 g1
0+00000a4 R_MIPS_GNU_REL_LO16 g1
0+00000a8 R_MIPS_GNU_REL_HI16 \.foo
0+00000ac R_MIPS_GNU_REL_LO16 \.foo
0+00000b0 R_MIPS_GNU_REL_HI16 \.text
0+00000b4 R_MIPS_GNU_REL_LO16 \.text
0+00000b8 R_MIPS_32 g1
0+00000bc R_MIPS_32 \.foo
0+00000c0 R_MIPS_32 \.text
0+00000c4 R_MIPS_PC32 g1
0+00000cc R_MIPS_PC32 \.text
0+00000d0 R_MIPS_64 g1
0+00000d8 R_MIPS_64 \.foo
0+00000e0 R_MIPS_64 \.text
0+00000e8 R_MIPS_PC64 g1
0+00000f8 R_MIPS_PC64 \.text
Contents of section \.text:
0000 00000000 0411ffff 00000000 1000ffff .*
0010 00000000 1000ffff 00000000 0411003f .*
0020 00000000 04110000 00000000 10000041 .*
0030 00000000 10000000 00000000 3c030000 .*
0040 [26]463000c 3c030000 [26]4630114 2403ffd0 .*
0050 00000000 00000100 00000004 00000028 .*
0060 0000012c ffffffd0 00000000 00000000 .*
0070 00000000 00000100 00000000 00000004 .*
0080 00000000 0000004c 00000000 00000154 .*
0090 ffffffff ffffffd0 10000032 10000033 .*
00a0 3c030000 [26]46300d8 3c030000 [26]46300e8 .*
00b0 000000cc 00000034 00000000 000000cc .*
00c0 00000000 00000034 00000000 10000032 .*
00d0 10000033 3c030000 [26]463010c 3c030000 .*
00e0 [26]463011c 000000cc 00000034 00000000 .*
00f0 00000000 000000cc 00000000 00000034 .*
Contents of section \.data:
Contents of section \.reginfo:
0000 80000008 00000000 00000000 00000000 .*
0010 00000000 00000000 .*
Contents of section \.mdebug:
#...
Contents of section \.foo:
0000 00000000 3c030000 [26]4630004 3c030000 .*
0010 [26]463010c 3c030000 [26]4630018 3c030000 .*
0020 [26]463001c 3c030000 [26]4630024 3c030000 .*
0030 [26]463012c 3c030000 [26]4630038 00000000 .*
0040 00000100 00000004 00000044 000000fc .*
0050 00000050 00000000 00000000 00000000 .*
0060 00000000 00000100 00000000 00000004 .*
0070 00000000 0000006c 00000000 000000fc .*
0080 00000000 00000080 3c030000 [26]463008c .*
0090 3c030000 [26]4630194 3c030000 [26]46300a0 .*
00a0 3c030000 [26]46300a4 3c030000 [26]46301ac .*
00b0 3c030000 [26]46300b8 00000004 00000104 .*
00c0 00000008 000000c4 00000100 000000d0 .*
00d0 00000000 00000004 00000000 00000104 .*
00e0 00000000 00000008 00000000 000000e8 .*
00f0 00000000 00000100 00000000 000000fc .*
0100 00000000 .*

View file

@ -0,0 +1,112 @@
# Check GNU-specific embedded relocs, for ELF.
.text
.set noreorder
nop
l2: jal g1 # R_MIPS_GNU_REL16_S2 g1 -1
nop
b g2 # R_MIPS_GNU_REL16_S2 g2 -1
nop
b g2 # R_MIPS_GNU_REL16_S2 g2 -1
nop
jal l1 # R_MIPS_GNU_REL16_S2 .foo 3F
nop
jal l2 # R_MIPS_GNU_REL16_S2 .text 0 or -9
nop
b l1+8 # R_MIPS_GNU_REL16_S2 .foo 41
nop
l3:
b l2 # R_MIPS_GNU_REL16_S2 .text 0 or -D
nop
la $3,g1-l3 # R_MIPS_GNU_REL_HI16 g1 0
# R_MIPS_GNU_REL_LO16 g1 C
la $3,l1-l3 # R_MIPS_GNU_REL_HI16 .foo 0
# R_MIPS_GNU_REL_LO16 .foo 114
la $3,l2-l3 # -30
.word g1 # R_MIPS_32 g1 0
.word l1 # R_MIPS_32 .foo 100
.word l2 # R_MIPS_32 .text 4
.word g1-l3 # R_MIPS_PC32 g1 28
.word l1-l3 # R_MIPS_PC32 .foo 12C
.word l2-l3 # -30
.align 3
.dword g1 # R_MIPS_64 g1 0
.dword l1 # R_MIPS_64 .foo 100
.dword l2 # R_MIPS_64 .text 4
.dword g1-l3 # R_MIPS_PC64 g1 4C
.dword l1-l3 # R_MIPS_PC64 .foo 154
.dword l2-l3 # -30
l5:
b 2f # R_MIPS_GNU_REL16_S2 .text 32
b 2f+4 # R_MIPS_GNU_REL16_S2 .text 33
la $3,2f-l5 # R_MIPS_GNU_REL_HI16 .text 0
# R_MIPS_GNU_REL_HI16 .text D8
la $3,2f+8-l5 # R_MIPS_GNU_REL_HI16 .text 0
# R_MIPS_GNU_REL_HI16 .text E8
.word 2f # R_MIPS_32 .text CC
.word 2f-l5 # R_MIPS_PC32 .text EC or 34
.dword 2f # R_MIPS_64 .text CC
.dword 2f-l5 # R_MIPS_PC64 .text F8 or 34
nop
2: # at address 0xCC.
b 2b # R_MIPS_GNU_REL16_S2 .text 32
b 2b+4 # R_MIPS_GNU_REL16_S2 .text 33
la $3,2b-l5 # R_MIPS_GNU_REL_HI16 .text 0
# R_MIPS_GNU_REL_HI16 .text 10C
la $3,2b+8-l5 # R_MIPS_GNU_REL_HI16 .text 0
# R_MIPS_GNU_REL_HI16 .text 11C
.word 2b # R_MIPS_32 .text CC
.word 2b-l5 # R_MIPS_PC32 .text 11C or 34
nop
.dword 2b # R_MIPS_64 .text CC
.dword 2b-l5 # R_MIPS_PC64 .text 98 or 34
.section ".foo","ax",@progbits
nop
l4:
la $3,g1-l4
la $3,l1-l4
la $3,l2-l4
la $3,g1-l4
dla $3,g1-l4
dla $3,l1-l4
dla $3,l2-l4
.word g1
.word l1
.word l2
.word g1-l4
.word l1-l4
.word l2-l4
.dword g1
.dword l1
.dword l2
.dword g1-l4
.dword l1-l4
.dword l2-l4
la $3,g1-l4+4
la $3,l1-l4+4
la $3,l2-l4+4
dla $3,g1-l4+4
dla $3,l1-l4+4
dla $3,l2-l4+4
.word g1+4
.word l1+4
.word l2+4
.word g1-l4+4
.word l1-l4+4
.word l2-l4+4
.dword g1+4
.dword l1+4
.dword l2+4
.dword g1-l4+4
.dword l1-l4+4
.dword l2-l4+4
l1:
nop

View file

@ -107,5 +107,11 @@ if [istarget mips*-*-*] then {
} { } {
run_dump_test "e32-rel2" run_dump_test "e32-rel2"
} }
run_dump_test "empic"
if { !$no_mips16 } {
run_dump_test "mips16-e"
setup_xfail "mips*-*-*"
run_dump_test "mips16-f"
}
} }
} }

View file

@ -0,0 +1,41 @@
#objdump: -rst -mips16
#name: MIPS16 reloc
#as: -mips16
# Check MIPS16 reloc processing
.*: +file format elf.*mips.*
SYMBOL TABLE:
0+0000000 l d \.text 0+0000000
0+0000000 l d \.data 0+0000000
0+0000000 l d \.bss 0+0000000
0+0000000 l d foo 0+0000000
0+0000000 l d \.reginfo 0+0000000
0+0000000 l d \.mdebug 0+0000000
0+0000002 l \.text 0+0000000 0xf0 l1
0+0000004 l \.text 0+0000000 0xf0 L1.1
0+0000000 \*UND\* 0+0000000 g1
RELOCATION RECORDS FOR \[foo\]:
OFFSET TYPE VALUE
0+0000000 R_MIPS_32 l1
0+0000004 R_MIPS_32 l1
0+0000008 R_MIPS_32 L1.1
0+000000c R_MIPS_32 L1.1
0+0000010 R_MIPS_32 g1
0+0000014 R_MIPS_32 g1
Contents of section \.text:
0000 65006500 65006500 .*
Contents of section \.data:
Contents of section \.reginfo:
0000 00000001 00000000 00000000 00000000 .*
0010 00000000 00000000 .*
Contents of section \.mdebug:
#...
Contents of section foo:
0000 00000000 00000008 00000000 00000003 .*
0010 00000000 00000008 .*

View file

@ -0,0 +1,13 @@
.set noreorder
.text
nop
l1: nop
1: nop
nop
.section "foo"
.word l1
.word l1+8
.word 1b
.word 1b+3
.word g1
.word g1+8

View file

@ -0,0 +1,33 @@
#objdump: -rst -mips16
#name: MIPS16 reloc 2
#as: -mips16
# Check MIPS16 reloc processing
.*: +file format elf.*mips.*
SYMBOL TABLE:
0+0000000 l d \.text 0+0000000
0+0000000 l d \.data 0+0000000
0+0000000 l d \.bss 0+0000000
0+0000000 l d foo 0+0000000
0+0000000 l d \.reginfo 0+0000000
0+0000000 l d \.mdebug 0+0000000
0+0000002 l \.text 0+0000000 0xf0 l1
RELOCATION RECORDS FOR \[foo\]:
OFFSET TYPE VALUE
0+0000000 R_MIPS_32 l1
Contents of section \.text:
0000 65006500 .*
Contents of section \.data:
Contents of section \.reginfo:
0000 00000001 00000000 00000000 00000000 .*
0010 00000000 00000000 .*
Contents of section \.mdebug:
#...
Contents of section foo:
0000 00000003 .*

View file

@ -0,0 +1,6 @@
.set noreorder
.text
nop
l1: nop
.section "foo"
.word l1+3

View file

@ -1,3 +1,9 @@
2000-03-10 Geoffrey Keating <geoffk@cygnus.com>
* mips.h: Add R_MIPS_GNU_REL_HI16, R_MIPS_GNU_REL_LO16,
R_MIPS_GNU_REL16_S2, R_MIPS_PC64 and R_MIPS_PC32 relocation
numbers.
2000-02-23 Linas Vepstas <linas@linas.org> 2000-02-23 Linas Vepstas <linas@linas.org>
* i370.h: New file. * i370.h: New file.

View file

@ -75,6 +75,12 @@ START_RELOC_NUMBERS (elf_mips_reloc_type)
/* These relocs are used for the mips16. */ /* These relocs are used for the mips16. */
RELOC_NUMBER (R_MIPS16_26, 100) RELOC_NUMBER (R_MIPS16_26, 100)
RELOC_NUMBER (R_MIPS16_GPREL, 101) RELOC_NUMBER (R_MIPS16_GPREL, 101)
/* These are GNU extensions to handle embedded-pic. */
RELOC_NUMBER (R_MIPS_PC32, 248)
RELOC_NUMBER (R_MIPS_PC64, 249)
RELOC_NUMBER (R_MIPS_GNU_REL16_S2, 250)
RELOC_NUMBER (R_MIPS_GNU_REL_LO16, 251)
RELOC_NUMBER (R_MIPS_GNU_REL_HI16, 252)
/* These are GNU extensions to enable C++ vtable garbage collection. */ /* These are GNU extensions to enable C++ vtable garbage collection. */
RELOC_NUMBER (R_MIPS_GNU_VTINHERIT, 253) RELOC_NUMBER (R_MIPS_GNU_VTINHERIT, 253)
RELOC_NUMBER (R_MIPS_GNU_VTENTRY, 254) RELOC_NUMBER (R_MIPS_GNU_VTENTRY, 254)