+2014-02-03 Sandra Loosemore <sandra@codesourcery.com>
+
+ * reloc.c (BFD_RELOC_NIOS2_GOT_LO, BFD_RELOC_NIOS2_GOT_HA): New.
+ (BFD_RELOC_NIOS2_CALL_LO, BFD_RELOC_NIOS2_CALL_HA): New.
+ * libbfd.h: Regenerated.
+ * bfd-in2.h: Regenerated.
+ * elf32-nios2.c (elf_nios2_howto_table_rel): Add new relocations.
+ (nios2_reloc_map): Likewise.
+ (GOT_USED, CALL_USED): Renamed from GOT16_USED and CALL16_USED.
+ Fixed all references.
+ (nios2_elf32_relocate_section): Add new relocations.
+ (nios2_elf32_check_relocs): Likewise.
+ (nios2_elf32_gc_sweep_hook): Likewise.
+
2014-02-03 Alan Modra <amodra@gmail.com>
* elf32-ppc.c (struct ppc_elf_link_hash_table): Add params.
BFD_RELOC_NIOS2_RELATIVE,
BFD_RELOC_NIOS2_GOTOFF,
BFD_RELOC_NIOS2_CALL26_NOAT,
+ BFD_RELOC_NIOS2_GOT_LO,
+ BFD_RELOC_NIOS2_GOT_HA,
+ BFD_RELOC_NIOS2_CALL_LO,
+ BFD_RELOC_NIOS2_CALL_HA,
/* IQ2000 Relocations. */
BFD_RELOC_IQ2000_OFFSET_16,
0xffffffc0, /* dst_mask */
FALSE), /* pcrel_offset */
+ HOWTO (R_NIOS2_GOT_LO,
+ 0,
+ 2,
+ 16,
+ FALSE,
+ 6,
+ complain_overflow_dont,
+ bfd_elf_generic_reloc,
+ "R_NIOS2_GOT_LO",
+ FALSE,
+ 0x003fffc0,
+ 0x003fffc0,
+ FALSE),
+
+ HOWTO (R_NIOS2_GOT_HA,
+ 0,
+ 2,
+ 16,
+ FALSE,
+ 6,
+ complain_overflow_dont,
+ bfd_elf_generic_reloc,
+ "R_NIOS2_GOT_HA",
+ FALSE,
+ 0x003fffc0,
+ 0x003fffc0,
+ FALSE),
+
+ HOWTO (R_NIOS2_CALL_LO,
+ 0,
+ 2,
+ 16,
+ FALSE,
+ 6,
+ complain_overflow_dont,
+ bfd_elf_generic_reloc,
+ "R_NIOS2_CALL_LO",
+ FALSE,
+ 0x003fffc0,
+ 0x003fffc0,
+ FALSE),
+
+ HOWTO (R_NIOS2_CALL_HA,
+ 0,
+ 2,
+ 16,
+ FALSE,
+ 6,
+ complain_overflow_dont,
+ bfd_elf_generic_reloc,
+ "R_NIOS2_CALL_HA",
+ FALSE,
+ 0x003fffc0,
+ 0x003fffc0,
+ FALSE),
+
/* Add other relocations here. */
};
{BFD_RELOC_NIOS2_RELATIVE, R_NIOS2_RELATIVE},
{BFD_RELOC_NIOS2_GOTOFF, R_NIOS2_GOTOFF},
{BFD_RELOC_NIOS2_CALL26_NOAT, R_NIOS2_CALL26_NOAT},
+ {BFD_RELOC_NIOS2_GOT_LO, R_NIOS2_GOT_LO},
+ {BFD_RELOC_NIOS2_GOT_HA, R_NIOS2_GOT_HA},
+ {BFD_RELOC_NIOS2_CALL_LO, R_NIOS2_CALL_LO},
+ {BFD_RELOC_NIOS2_CALL_HA, R_NIOS2_CALL_HA},
};
enum elf32_nios2_stub_type
a dynamic GOT reloc in shared objects, only a dynamic PLT reloc. Lazy
linking will not work if the dynamic GOT reloc exists.
To check for this condition efficiently, we compare got_types_used against
- CALL16_USED, meaning
- (got_types_used & (GOT16_USED | CALL16_USED)) == CALL16_USED. */
-#define GOT16_USED 1
-#define CALL16_USED 2
+ CALL_USED, meaning
+ (got_types_used & (GOT_USED | CALL_USED)) == CALL_USED.
+ */
+#define GOT_USED 1
+#define CALL_USED 2
unsigned char got_types_used;
};
case R_NIOS2_GOT16:
case R_NIOS2_CALL16:
+ case R_NIOS2_GOT_LO:
+ case R_NIOS2_GOT_HA:
+ case R_NIOS2_CALL_LO:
+ case R_NIOS2_CALL_HA:
/* Relocation is to the entry for this symbol in the
global offset table. */
if (sgot == NULL)
bfd_boolean dyn;
eh = (struct elf32_nios2_link_hash_entry *)h;
- use_plt = (eh->got_types_used == CALL16_USED
+ use_plt = (eh->got_types_used == CALL_USED
&& h->plt.offset != (bfd_vma) -1);
off = h->got.offset;
/* This relocation does not use the addend. */
rel->r_addend = 0;
- r = _bfd_final_link_relocate (howto, input_bfd, input_section,
- contents, rel->r_offset,
- relocation, rel->r_addend);
+ switch (howto->type)
+ {
+ case R_NIOS2_GOT_LO:
+ case R_NIOS2_CALL_LO:
+ r = nios2_elf32_do_lo16_relocate (input_bfd, howto,
+ input_section, contents,
+ rel->r_offset, relocation,
+ rel->r_addend);
+ break;
+ case R_NIOS2_GOT_HA:
+ case R_NIOS2_CALL_HA:
+ r = nios2_elf32_do_hiadj16_relocate (input_bfd, howto,
+ input_section, contents,
+ rel->r_offset,
+ relocation,
+ rel->r_addend);
+ break;
+ default:
+ r = _bfd_final_link_relocate (howto, input_bfd,
+ input_section, contents,
+ rel->r_offset, relocation,
+ rel->r_addend);
+ break;
+ }
break;
case R_NIOS2_GOTOFF_LO:
switch (r_type)
{
case R_NIOS2_GOT16:
+ case R_NIOS2_GOT_LO:
+ case R_NIOS2_GOT_HA:
case R_NIOS2_CALL16:
+ case R_NIOS2_CALL_LO:
+ case R_NIOS2_CALL_HA:
case R_NIOS2_TLS_GD16:
case R_NIOS2_TLS_IE16:
/* This symbol requires a global offset table entry. */
{
default:
case R_NIOS2_GOT16:
+ case R_NIOS2_GOT_LO:
+ case R_NIOS2_GOT_HA:
case R_NIOS2_CALL16:
+ case R_NIOS2_CALL_LO:
+ case R_NIOS2_CALL_HA:
tls_type = GOT_NORMAL;
break;
case R_NIOS2_TLS_GD16:
= (struct elf32_nios2_link_hash_entry *)h;
h->got.refcount++;
old_tls_type = elf32_nios2_hash_entry(h)->tls_type;
- if (r_type == R_NIOS2_CALL16)
+ if (r_type == R_NIOS2_CALL16
+ || r_type == R_NIOS2_CALL_LO
+ || r_type == R_NIOS2_CALL_HA)
{
/* Make sure a plt entry is created for this symbol if
it turns out to be a function defined by a dynamic
h->plt.refcount++;
h->needs_plt = 1;
h->type = STT_FUNC;
- eh->got_types_used |= CALL16_USED;
+ eh->got_types_used |= CALL_USED;
}
else
- eh->got_types_used |= GOT16_USED;
+ eh->got_types_used |= GOT_USED;
}
else
{
switch (r_type)
{
case R_NIOS2_GOT16:
+ case R_NIOS2_GOT_LO:
+ case R_NIOS2_GOT_HA:
case R_NIOS2_CALL16:
+ case R_NIOS2_CALL_LO:
+ case R_NIOS2_CALL_HA:
if (h != NULL)
{
if (h->got.refcount > 0)
}
}
- use_plt = (eh->got_types_used == CALL16_USED
+ use_plt = (eh->got_types_used == CALL_USED
&& h->plt.offset != (bfd_vma) -1);
if (!use_plt && h->got.offset != (bfd_vma) -1
}
eh = (struct elf32_nios2_link_hash_entry *) h;
- use_plt = (eh->got_types_used == CALL16_USED
+ use_plt = (eh->got_types_used == CALL_USED
&& h->plt.offset != (bfd_vma) -1);
if (h->got.refcount > 0)
"BFD_RELOC_NIOS2_RELATIVE",
"BFD_RELOC_NIOS2_GOTOFF",
"BFD_RELOC_NIOS2_CALL26_NOAT",
+ "BFD_RELOC_NIOS2_GOT_LO",
+ "BFD_RELOC_NIOS2_GOT_HA",
+ "BFD_RELOC_NIOS2_CALL_LO",
+ "BFD_RELOC_NIOS2_CALL_HA",
"BFD_RELOC_IQ2000_OFFSET_16",
"BFD_RELOC_IQ2000_OFFSET_21",
"BFD_RELOC_IQ2000_UHI16",
BFD_RELOC_NIOS2_GOTOFF
ENUMX
BFD_RELOC_NIOS2_CALL26_NOAT
+ENUMX
+ BFD_RELOC_NIOS2_GOT_LO
+ENUMX
+ BFD_RELOC_NIOS2_GOT_HA
+ENUMX
+ BFD_RELOC_NIOS2_CALL_LO
+ENUMX
+ BFD_RELOC_NIOS2_CALL_HA
ENUMDOC
Relocations used by the Altera Nios II core.
+2014-02-03 Sandra Loosemore <sandra@codesourcery.com>
+
+ * config/tc-nios2.c (md_apply_fix): Test for new relocs.
+ (nios2_special_reloc): Add %call_lo, %call_hiadj, %got_lo,
+ %got_hiadj relocation operators. Sort table and add comment
+ to explain ordering.
+ (nios2_fix_adjustable): Test for new relocs.
+ * doc/c-nios2.texi (Nios II Relocations): Document new relocation
+ operators.
+
2014-01-30 Sandra Loosemore <sandra@codesourcery.com>
* config/tc-nios2.c (md_apply_fix): Handle BFD_RELOC_NIOS2_CALL26_NOAT.
|| fixP->fx_r_type == BFD_RELOC_NIOS2_U16
|| fixP->fx_r_type == BFD_RELOC_16_PCREL
|| fixP->fx_r_type == BFD_RELOC_NIOS2_CALL26
- || fixP->fx_r_type == BFD_RELOC_NIOS2_CALL26_NOAT
|| fixP->fx_r_type == BFD_RELOC_NIOS2_IMM5
|| fixP->fx_r_type == BFD_RELOC_NIOS2_CACHE_OPX
|| fixP->fx_r_type == BFD_RELOC_NIOS2_IMM6
|| fixP->fx_r_type == BFD_RELOC_NIOS2_TLS_LE16
|| fixP->fx_r_type == BFD_RELOC_NIOS2_GOTOFF
|| fixP->fx_r_type == BFD_RELOC_NIOS2_TLS_DTPREL
+ || fixP->fx_r_type == BFD_RELOC_NIOS2_CALL26_NOAT
+ || fixP->fx_r_type == BFD_RELOC_NIOS2_GOT_LO
+ || fixP->fx_r_type == BFD_RELOC_NIOS2_GOT_HA
+ || fixP->fx_r_type == BFD_RELOC_NIOS2_CALL_LO
+ || fixP->fx_r_type == BFD_RELOC_NIOS2_CALL_HA
/* Add other relocs here as we generate them. */
));
bfd_reloc_code_real_type reloc_type;
};
+/* This table is sorted so that prefix strings are listed after the longer
+ strings that include them -- e.g., %got after %got_hiadj, etc. */
+
struct nios2_special_relocS nios2_special_reloc[] = {
{"%hiadj", BFD_RELOC_NIOS2_HIADJ16},
{"%hi", BFD_RELOC_NIOS2_HI16},
{"%lo", BFD_RELOC_NIOS2_LO16},
{"%gprel", BFD_RELOC_NIOS2_GPREL},
+ {"%call_lo", BFD_RELOC_NIOS2_CALL_LO},
+ {"%call_hiadj", BFD_RELOC_NIOS2_CALL_HA},
{"%call", BFD_RELOC_NIOS2_CALL16},
{"%gotoff_lo", BFD_RELOC_NIOS2_GOTOFF_LO},
{"%gotoff_hiadj", BFD_RELOC_NIOS2_GOTOFF_HA},
+ {"%gotoff", BFD_RELOC_NIOS2_GOTOFF},
+ {"%got_hiadj", BFD_RELOC_NIOS2_GOT_HA},
+ {"%got_lo", BFD_RELOC_NIOS2_GOT_LO},
+ {"%got", BFD_RELOC_NIOS2_GOT16},
{"%tls_gd", BFD_RELOC_NIOS2_TLS_GD16},
{"%tls_ldm", BFD_RELOC_NIOS2_TLS_LDM16},
{"%tls_ldo", BFD_RELOC_NIOS2_TLS_LDO16},
{"%tls_ie", BFD_RELOC_NIOS2_TLS_IE16},
{"%tls_le", BFD_RELOC_NIOS2_TLS_LE16},
- {"%gotoff", BFD_RELOC_NIOS2_GOTOFF},
- {"%got", BFD_RELOC_NIOS2_GOT16}
};
#define NIOS2_NUM_SPECIAL_RELOCS \
|| fixp->fx_r_type == BFD_RELOC_NIOS2_TLS_DTPMOD
|| fixp->fx_r_type == BFD_RELOC_NIOS2_TLS_DTPREL
|| fixp->fx_r_type == BFD_RELOC_NIOS2_TLS_TPREL
- || fixp->fx_r_type == BFD_RELOC_NIOS2_GOTOFF)
+ || fixp->fx_r_type == BFD_RELOC_NIOS2_GOTOFF
+ || fixp->fx_r_type == BFD_RELOC_NIOS2_GOT_LO
+ || fixp->fx_r_type == BFD_RELOC_NIOS2_GOT_HA
+ || fixp->fx_r_type == BFD_RELOC_NIOS2_CALL_LO
+ || fixp->fx_r_type == BFD_RELOC_NIOS2_CALL_HA
+ )
return 0;
return 1;
@end smallexample
@cindex @code{call} directive, Nios II
+@cindex @code{call_lo} directive, Nios II
+@cindex @code{call_hiadj} directive, Nios II
@cindex @code{got} directive, Nios II
+@cindex @code{got_lo} directive, Nios II
+@cindex @code{got_hiadj} directive, Nios II
@cindex @code{gotoff} directive, Nios II
@cindex @code{gotoff_lo} directive, Nios II
@cindex @code{gotoff_hiadj} directive, Nios II
@cindex @code{tls_ldm} directive, Nios II
@cindex @code{tls_ldo} directive, Nios II
@item %call(@var{expression})
+@item %call_lo(@var{expression})
+@item %call_hiadj(@var{expression})
@itemx %got(@var{expression})
+@itemx %got_lo(@var{expression})
+@itemx %got_hiadj(@var{expression})
@itemx %gotoff(@var{expression})
@itemx %gotoff_lo(@var{expression})
@itemx %gotoff_hiadj(@var{expression})
+2014-02-03 Sandra Loosemore <sandra@codesourcery.com>
+
+ * nios2.h (R_NIOS2_GOT_LO, R_NIOS2_GOT_HA): New.
+ (R_NIOS2_CALL_LO, R_NIOS2_CALL_HA): New.
+ (R_NIOS2_ILLEGAL): Adjust.
+
2014-01-30 Sandra Loosemore <sandra@codesourcery.com>
* nios2.h (elf_nios2_reloc_type): Add R_NIOS2_CALL26_NOAT.
RELOC_NUMBER (R_NIOS2_RELATIVE, 39)
RELOC_NUMBER (R_NIOS2_GOTOFF, 40)
RELOC_NUMBER (R_NIOS2_CALL26_NOAT, 41)
- RELOC_NUMBER (R_NIOS2_ILLEGAL, 42)
+ RELOC_NUMBER (R_NIOS2_GOT_LO, 42)
+ RELOC_NUMBER (R_NIOS2_GOT_HA, 43)
+ RELOC_NUMBER (R_NIOS2_CALL_LO, 44)
+ RELOC_NUMBER (R_NIOS2_CALL_HA, 45)
+ RELOC_NUMBER (R_NIOS2_ILLEGAL, 46)
END_RELOC_NUMBERS (R_NIOS2_maxext)
/* Processor-specific section flags. */