| 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
|
|
|