Index: bfd/elf32-cr16.c |
diff --git a/bfd/elf32-cr16.c b/bfd/elf32-cr16.c |
index 97fa5691e600ce61f87230e13512f705a8693c58..af1cf7bb5794916f47534b81dbb0e0cfa0943685 100644 |
--- a/bfd/elf32-cr16.c |
+++ b/bfd/elf32-cr16.c |
@@ -725,6 +725,10 @@ cr16_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, |
while (h->root.type == bfd_link_hash_indirect |
|| h->root.type == bfd_link_hash_warning) |
h = (struct elf_link_hash_entry *) h->root.u.i.link; |
+ |
+ /* PR15323, ref flags aren't set for references in the same |
+ object. */ |
+ h->root.non_ir_ref = 1; |
} |
/* Some relocs require a global offset table. */ |
@@ -761,7 +765,7 @@ cr16_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, |
{ |
srelgot = bfd_get_linker_section (dynobj, ".rela.got"); |
if (srelgot == NULL) |
- { |
+ { |
flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS |
| SEC_IN_MEMORY | SEC_LINKER_CREATED |
| SEC_READONLY); |
@@ -912,7 +916,7 @@ cr16_elf_final_link_relocate (reloc_howto_type *howto, |
/* We only care about the addend, where the difference between |
expressions is kept. */ |
Rvalue = 0; |
- |
+ |
default: |
break; |
} |
@@ -1043,7 +1047,7 @@ cr16_elf_final_link_relocate (reloc_howto_type *howto, |
| ((Rvalue >> 16) & 0xf)), hit_data); |
bfd_put_16 (input_bfd, (Rvalue) & 0xffff, hit_data + 2); |
} |
- else if (r_type == R_CR16_GOT_REGREL20) |
+ else if (r_type == R_CR16_GOT_REGREL20) |
{ |
asection * sgot = bfd_get_linker_section (dynobj, ".got"); |
@@ -1060,7 +1064,7 @@ cr16_elf_final_link_relocate (reloc_howto_type *howto, |
-Bsymbolic link and the symbol is defined |
locally, or the symbol was forced to be local |
because of a version file. We must initialize |
- this entry in the global offset table. |
+ this entry in the global offset table. |
When doing a dynamic link, we create a .rela.got |
relocation entry to initialize the value. This |
is done in the finish_dynamic_symbol routine. */ |
@@ -1080,7 +1084,7 @@ cr16_elf_final_link_relocate (reloc_howto_type *howto, |
Rvalue += addend; |
- /* REVISIT: if ((long) Rvalue > 0xffffff || |
+ /* REVISIT: if ((long) Rvalue > 0xffffff || |
(long) Rvalue < -0x800000). */ |
if ((long) Rvalue > 0xffffff || (long) Rvalue < 0) |
return bfd_reloc_overflow; |
@@ -1111,7 +1115,7 @@ cr16_elf_final_link_relocate (reloc_howto_type *howto, |
-Bsymbolic link and the symbol is defined |
locally, or the symbol was forced to be local |
because of a version file. We must initialize |
- this entry in the global offset table. |
+ this entry in the global offset table. |
When doing a dynamic link, we create a .rela.got |
relocation entry to initialize the value. This |
is done in the finish_dynamic_symbol routine. */ |
@@ -1142,7 +1146,7 @@ cr16_elf_final_link_relocate (reloc_howto_type *howto, |
Rvalue += Rvalue1; |
/* Check for range. */ |
- /* REVISIT: if ((long) Rvalue > 0xffffff |
+ /* REVISIT: if ((long) Rvalue > 0xffffff |
|| (long) Rvalue < -0x800000). */ |
if ((long) Rvalue > 0xffffff || (long) Rvalue < 0) |
return bfd_reloc_overflow; |
@@ -1224,7 +1228,7 @@ cr16_elf_final_link_relocate (reloc_howto_type *howto, |
} |
else if (r_type == R_CR16_NUM32) |
{ |
- Rvalue1 = (bfd_get_32 (input_bfd, hit_data)); |
+ Rvalue1 = (bfd_get_32 (input_bfd, hit_data)); |
/* Add or subtract the offset value */ |
if (Rvalue1 & 0x80000000) |
@@ -1309,7 +1313,7 @@ elf32_cr16_relax_delete_bytes (struct bfd_link_info *link_info, bfd *abfd, |
&& ELF32_R_TYPE (irel->r_info) != (int) R_CR16_SWITCH16 |
&& ELF32_R_TYPE (irel->r_info) != (int) R_CR16_SWITCH32) |
continue; |
- |
+ |
r_symndx = ELF32_R_SYM (irel->r_info); |
rsym = (Elf_Internal_Sym *) symtab_hdr->contents + r_symndx; |
@@ -1421,12 +1425,12 @@ elf32_cr16_relocate_section (bfd *output_bfd, struct bfd_link_info *info, |
} |
else |
{ |
- bfd_boolean unresolved_reloc, warned; |
+ bfd_boolean unresolved_reloc, warned, ignored; |
RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel, |
r_symndx, symtab_hdr, sym_hashes, |
h, sec, relocation, |
- unresolved_reloc, warned); |
+ unresolved_reloc, warned, ignored); |
} |
if (sec != NULL && discarded_section (sec)) |
@@ -1660,7 +1664,7 @@ elf32_cr16_link_hash_table_create (bfd *abfd) |
struct elf_link_hash_table *ret; |
bfd_size_type amt = sizeof (struct elf_link_hash_table); |
- ret = (struct elf_link_hash_table *) bfd_malloc (amt); |
+ ret = (struct elf_link_hash_table *) bfd_zmalloc (amt); |
if (ret == (struct elf_link_hash_table *) NULL) |
return NULL; |
@@ -1676,18 +1680,6 @@ elf32_cr16_link_hash_table_create (bfd *abfd) |
return &ret->root; |
} |
-/* Free an cr16 ELF linker hash table. */ |
- |
-static void |
-elf32_cr16_link_hash_table_free (struct bfd_link_hash_table *hash) |
-{ |
- struct elf_link_hash_table *ret |
- = (struct elf_link_hash_table *) hash; |
- |
- _bfd_generic_link_hash_table_free |
- ((struct bfd_link_hash_table *) ret); |
-} |
- |
static unsigned long |
elf_cr16_mach (flagword flags) |
{ |
@@ -1981,7 +1973,7 @@ elf32_cr16_relax_section (bfd *abfd, asection *sec, |
bfd_vma value = symval; |
unsigned short is_add_mov = 0; |
bfd_vma value1 = 0; |
- |
+ |
/* Get the existing value from the mcode */ |
value1 = ((bfd_get_32 (abfd, contents + irel->r_offset + 2) >> 16) |
|(((bfd_get_32 (abfd, contents + irel->r_offset + 2) & 0xffff) << 16))); |
@@ -1996,7 +1988,7 @@ elf32_cr16_relax_section (bfd *abfd, asection *sec, |
/* Verify it's a 'arithmetic ADDD or MOVD instruction'. |
For ADDD and MOVD only, convert to IMM32 -> IMM20. */ |
- |
+ |
if (((code & 0xfff0) == 0x0070) || ((code & 0xfff0) == 0x0020)) |
is_add_mov = 1; |
@@ -2016,7 +2008,7 @@ elf32_cr16_relax_section (bfd *abfd, asection *sec, |
bfd_put_8 (abfd, (code & 0xf) << 4, contents + irel->r_offset); |
- /* If existing value is nagavive adjust approriately |
+ /* If existing value is nagavive adjust approriately |
place the 16-20bits (ie 4 bit) in new opcode, |
as the 0xffffxxxx, the higher 2 byte values removed. */ |
if (value1 & 0x80000000) |
@@ -2040,7 +2032,7 @@ elf32_cr16_relax_section (bfd *abfd, asection *sec, |
} |
/* See if the value will fit in 16 bits. */ |
- if ((!is_add_mov) |
+ if ((!is_add_mov) |
&& ((long)(value + value1) < 0x7fff && (long)(value + value1) > 0)) |
{ |
unsigned short code; |
@@ -2065,7 +2057,7 @@ elf32_cr16_relax_section (bfd *abfd, asection *sec, |
bfd_put_8 (abfd, 0xb0 | (code & 0xf), contents + irel->r_offset); |
- /* If existing value is nagavive adjust approriately |
+ /* If existing value is nagavive adjust approriately |
place the 12-16bits (ie 4 bit) in new opcode, |
as the 0xfffffxxx, the higher 2 byte values removed. */ |
if (value1 & 0x80000000) |
@@ -2092,7 +2084,7 @@ elf32_cr16_relax_section (bfd *abfd, asection *sec, |
#if 0 |
/* Try to turn a 16bit immediate address into a 4bit |
immediate address. */ |
- if ((ELF32_R_TYPE (irel->r_info) == (int) R_CR16_IMM20) |
+ if ((ELF32_R_TYPE (irel->r_info) == (int) R_CR16_IMM20) |
|| (ELF32_R_TYPE (irel->r_info) == (int) R_CR16_IMM16)) |
{ |
bfd_vma value = symval; |
@@ -2200,7 +2192,7 @@ elf32_cr16_relax_section (bfd *abfd, asection *sec, |
else |
/* Cache the section contents for elf_link_input_bfd. */ |
elf_section_data (sec)->this_hdr.contents = contents; |
- |
+ |
} |
if (internal_relocs != NULL |
@@ -2698,7 +2690,7 @@ _bfd_cr16_elf_finish_dynamic_symbol (bfd * output_bfd, |
} |
/* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */ |
- if (strcmp (h->root.root.string, "_DYNAMIC") == 0 |
+ if (h == elf_hash_table (info)->hdynamic |
|| h == elf_hash_table (info)->hgot) |
sym->st_shndx = SHN_ABS; |
@@ -2928,7 +2920,9 @@ error_return: |
properly. */ |
static enum elf_reloc_type_class |
-_bfd_cr16_elf_reloc_type_class (const Elf_Internal_Rela *rela) |
+_bfd_cr16_elf_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED, |
+ const asection *rel_sec ATTRIBUTE_UNUSED, |
+ const Elf_Internal_Rela *rela) |
{ |
switch ((int) ELF32_R_TYPE (rela->r_info)) |
{ |
@@ -2973,8 +2967,6 @@ _bfd_cr16_elf_reloc_type_class (const Elf_Internal_Rela *rela) |
#define bfd_elf32_bfd_link_hash_table_create \ |
elf32_cr16_link_hash_table_create |
-#define bfd_elf32_bfd_link_hash_table_free \ |
- elf32_cr16_link_hash_table_free |
#define elf_backend_create_dynamic_sections \ |
_bfd_cr16_elf_create_dynamic_sections |