| Index: bfd/elf32-xtensa.c
|
| diff --git a/bfd/elf32-xtensa.c b/bfd/elf32-xtensa.c
|
| index 2de9480db8ebfd197f1666c7385738d6c0999f88..75ccefef0251cbe796e2b0f84a20344a9a2d37b1 100644
|
| --- a/bfd/elf32-xtensa.c
|
| +++ b/bfd/elf32-xtensa.c
|
| @@ -655,7 +655,7 @@ elf_xtensa_link_hash_table_create (bfd *abfd)
|
| struct elf_xtensa_link_hash_table *ret;
|
| bfd_size_type amt = sizeof (struct elf_xtensa_link_hash_table);
|
|
|
| - ret = bfd_malloc (amt);
|
| + ret = bfd_zmalloc (amt);
|
| if (ret == NULL)
|
| return NULL;
|
|
|
| @@ -668,16 +668,6 @@ elf_xtensa_link_hash_table_create (bfd *abfd)
|
| return NULL;
|
| }
|
|
|
| - ret->sgot = NULL;
|
| - ret->sgotplt = NULL;
|
| - ret->srelgot = NULL;
|
| - ret->splt = NULL;
|
| - ret->srelplt = NULL;
|
| - ret->sgotloc = NULL;
|
| - ret->spltlittbl = NULL;
|
| -
|
| - ret->plt_reloc_count = 0;
|
| -
|
| /* Create a hash entry for "_TLS_MODULE_BASE_" to speed up checking
|
| for it later. */
|
| tlsbase = elf_link_hash_lookup (&ret->elf, "_TLS_MODULE_BASE_",
|
| @@ -752,7 +742,7 @@ property_table_compare (const void *ap, const void *bp)
|
| != GET_XTENSA_PROP_ALIGNMENT (b->flags)))
|
| return (GET_XTENSA_PROP_ALIGNMENT (a->flags)
|
| - GET_XTENSA_PROP_ALIGNMENT (b->flags));
|
| -
|
| +
|
| if ((a->flags & XTENSA_PROP_UNREACHABLE)
|
| != (b->flags & XTENSA_PROP_UNREACHABLE))
|
| return ((b->flags & XTENSA_PROP_UNREACHABLE)
|
| @@ -814,7 +804,7 @@ xtensa_read_table_entries (bfd *abfd,
|
| if (table_section)
|
| table_size = table_section->size;
|
|
|
| - if (table_size == 0)
|
| + if (table_size == 0)
|
| {
|
| *table_p = NULL;
|
| return 0;
|
| @@ -849,7 +839,7 @@ xtensa_read_table_entries (bfd *abfd,
|
| section_limit = bfd_get_section_limit (abfd, section);
|
| rel_end = internal_relocs + table_section->reloc_count;
|
|
|
| - for (off = 0; off < table_size; off += table_entry_size)
|
| + for (off = 0; off < table_size; off += table_entry_size)
|
| {
|
| bfd_vma address = bfd_get_32 (abfd, table_data + off);
|
|
|
| @@ -1017,6 +1007,10 @@ elf_xtensa_check_relocs (bfd *abfd,
|
| 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;
|
| }
|
| eh = elf_xtensa_hash_entry (h);
|
|
|
| @@ -1969,7 +1963,7 @@ elf_xtensa_do_reloc (reloc_howto_type *howto,
|
| if (is_windowed_call_opcode (opcode))
|
| {
|
| if ((self_address >> CALL_SEGMENT_BITS)
|
| - != (relocation >> CALL_SEGMENT_BITS))
|
| + != (relocation >> CALL_SEGMENT_BITS))
|
| {
|
| *error_message = "windowed longcall crosses 1GB boundary; "
|
| "return may fail";
|
| @@ -2142,7 +2136,7 @@ elf_xtensa_do_reloc (reloc_howto_type *howto,
|
| && is_windowed_call_opcode (opcode))
|
| {
|
| if ((self_address >> CALL_SEGMENT_BITS)
|
| - != (relocation >> CALL_SEGMENT_BITS))
|
| + != (relocation >> CALL_SEGMENT_BITS))
|
| {
|
| *error_message =
|
| "windowed call crosses 1GB boundary; return may fail";
|
| @@ -2170,8 +2164,8 @@ vsprint_msg (const char *origmsg, const char *fmt, int arglen, ...)
|
|
|
| VA_OPEN (ap, arglen);
|
| VA_FIXEDARG (ap, const char *, origmsg);
|
| -
|
| - is_append = (origmsg == message);
|
| +
|
| + is_append = (origmsg == message);
|
|
|
| orig_len = strlen (origmsg);
|
| len = orig_len + strlen (fmt) + arglen + 20;
|
| @@ -2644,10 +2638,12 @@ elf_xtensa_relocate_section (bfd *output_bfd,
|
| }
|
| else
|
| {
|
| + bfd_boolean 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 (relocation == 0
|
| && !unresolved_reloc
|
| @@ -3135,7 +3131,7 @@ elf_xtensa_finish_dynamic_symbol (bfd *output_bfd ATTRIBUTE_UNUSED,
|
| }
|
|
|
| /* 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;
|
|
|
| @@ -3502,10 +3498,10 @@ elf_xtensa_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
|
| return TRUE;
|
| }
|
|
|
| - if ((out_flag & EF_XTENSA_XT_INSN) != (in_flag & EF_XTENSA_XT_INSN))
|
| + if ((out_flag & EF_XTENSA_XT_INSN) != (in_flag & EF_XTENSA_XT_INSN))
|
| elf_elfheader (obfd)->e_flags &= (~ EF_XTENSA_XT_INSN);
|
|
|
| - if ((out_flag & EF_XTENSA_XT_LIT) != (in_flag & EF_XTENSA_XT_LIT))
|
| + if ((out_flag & EF_XTENSA_XT_LIT) != (in_flag & EF_XTENSA_XT_LIT))
|
| elf_elfheader (obfd)->e_flags &= (~ EF_XTENSA_XT_LIT);
|
|
|
| return TRUE;
|
| @@ -3595,7 +3591,9 @@ elf_xtensa_final_write_processing (bfd *abfd,
|
|
|
|
|
| static enum elf_reloc_type_class
|
| -elf_xtensa_reloc_type_class (const Elf_Internal_Rela *rela)
|
| +elf_xtensa_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))
|
| {
|
| @@ -3792,10 +3790,10 @@ elf_xtensa_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
|
| based on the size. Just assume this is GNU/Linux. */
|
|
|
| /* pr_cursig */
|
| - elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
|
| + elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
|
|
|
| /* pr_pid */
|
| - elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 24);
|
| + elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
|
|
|
| /* pr_reg */
|
| offset = 72;
|
| @@ -3816,9 +3814,9 @@ elf_xtensa_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
|
| return FALSE;
|
|
|
| case 128: /* GNU/Linux elf_prpsinfo */
|
| - elf_tdata (abfd)->core_program
|
| + elf_tdata (abfd)->core->program
|
| = _bfd_elfcore_strndup (abfd, note->descdata + 32, 16);
|
| - elf_tdata (abfd)->core_command
|
| + elf_tdata (abfd)->core->command
|
| = _bfd_elfcore_strndup (abfd, note->descdata + 48, 80);
|
| }
|
|
|
| @@ -3827,7 +3825,7 @@ elf_xtensa_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
|
| implementations, so strip it off if it exists. */
|
|
|
| {
|
| - char *command = elf_tdata (abfd)->core_command;
|
| + char *command = elf_tdata (abfd)->core->command;
|
| int n = strlen (command);
|
|
|
| if (0 < n && command[n - 1] == ' ')
|
| @@ -4096,7 +4094,7 @@ get_asm_simplify_size (bfd_byte *contents,
|
| return 0;
|
|
|
| size += insnlen;
|
| -
|
| +
|
| insnlen = insn_decode_len (contents, content_len, offset + size);
|
| if (insnlen == 0)
|
| return 0;
|
| @@ -4135,7 +4133,7 @@ is_operand_relocation (int r_type)
|
| return FALSE;
|
| }
|
|
|
| -
|
| +
|
| #define MIN_INSN_LENGTH 2
|
|
|
| /* Return 0 if it fails to decode. */
|
| @@ -4236,7 +4234,7 @@ check_loop_aligned (bfd_byte *contents,
|
| BFD_ASSERT (FALSE);
|
| return FALSE;
|
| }
|
| -
|
| +
|
| loop_len = insn_decode_len (contents, content_length, offset);
|
| insn_len = insn_decode_len (contents, content_length, offset + loop_len);
|
| if (loop_len == 0 || insn_len == 0)
|
| @@ -4628,7 +4626,7 @@ can_widen_instruction (xtensa_insnbuf slotbuf,
|
| return 0;
|
| }
|
|
|
| -
|
| +
|
| /* Attempt to widen an instruction. If the widening is valid, perform
|
| the action in-place directly into the contents and return TRUE. Otherwise,
|
| the return value is FALSE and the contents are not modified. */
|
| @@ -4723,12 +4721,12 @@ elf_xtensa_do_asm_simplify (bfd_byte *contents,
|
| *error_message = _("Attempt to convert L32R/CALLX to CALL failed");
|
| return bfd_reloc_other;
|
| }
|
| -
|
| +
|
| /* Assemble a NOP ("or a1, a1, a1") into the 0 byte offset. */
|
| core_format = xtensa_format_lookup (isa, "x24");
|
| opcode = xtensa_opcode_lookup (isa, "or");
|
| xtensa_opcode_encode (isa, core_format, 0, slotbuf, opcode);
|
| - for (opn = 0; opn < 3; opn++)
|
| + for (opn = 0; opn < 3; opn++)
|
| {
|
| uint32 regno = 1;
|
| xtensa_operand_encode (isa, opcode, opn, ®no);
|
| @@ -4796,7 +4794,7 @@ swap_callx_for_call_opcode (xtensa_opcode opcode)
|
| #define CONST16_TARGET_REG_OPERAND 0
|
| #define CALLN_SOURCE_OPERAND 0
|
|
|
| -static xtensa_opcode
|
| +static xtensa_opcode
|
| get_expanded_call_opcode (bfd_byte *buf, int bufsize, bfd_boolean *p_uses_l32r)
|
| {
|
| static xtensa_insnbuf insnbuf = NULL;
|
| @@ -4872,7 +4870,7 @@ get_expanded_call_opcode (bfd_byte *buf, int bufsize, bfd_boolean *p_uses_l32r)
|
| || xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf))
|
| return XTENSA_UNDEFINED;
|
| opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
|
| - if (opcode == XTENSA_UNDEFINED
|
| + if (opcode == XTENSA_UNDEFINED
|
| || !is_indirect_call_opcode (opcode))
|
| return XTENSA_UNDEFINED;
|
|
|
| @@ -4903,7 +4901,7 @@ get_expanded_call_opcode (bfd_byte *buf, int bufsize, bfd_boolean *p_uses_l32r)
|
| For efficiency, an r_reloc also contains a "target_offset" field to
|
| cache the target-section-relative offset value that is represented by
|
| the relocation.
|
| -
|
| +
|
| The r_reloc also contains a virtual offset that allows multiple
|
| inserted literals to be placed at the same "address" with
|
| different offsets. */
|
| @@ -5030,7 +5028,7 @@ print_r_reloc (FILE *fp, const r_reloc *r_rel)
|
| fprintf (fp, " + ");
|
| fprintf_vma (fp, r_rel->virtual_offset);
|
| }
|
| -
|
| +
|
| fprintf (fp, ")");
|
| }
|
|
|
| @@ -5150,7 +5148,7 @@ typedef struct value_map_hash_table_struct value_map_hash_table;
|
|
|
| struct literal_value_struct
|
| {
|
| - r_reloc r_rel;
|
| + r_reloc r_rel;
|
| unsigned long value;
|
| bfd_boolean is_abs_literal;
|
| };
|
| @@ -5191,7 +5189,7 @@ literal_value_equal (const literal_value *src1,
|
| {
|
| struct elf_link_hash_entry *h1, *h2;
|
|
|
| - if (r_reloc_is_const (&src1->r_rel) != r_reloc_is_const (&src2->r_rel))
|
| + if (r_reloc_is_const (&src1->r_rel) != r_reloc_is_const (&src2->r_rel))
|
| return FALSE;
|
|
|
| if (r_reloc_is_const (&src1->r_rel))
|
| @@ -5203,13 +5201,13 @@ literal_value_equal (const literal_value *src1,
|
|
|
| if (src1->r_rel.target_offset != src2->r_rel.target_offset)
|
| return FALSE;
|
| -
|
| +
|
| if (src1->r_rel.virtual_offset != src2->r_rel.virtual_offset)
|
| return FALSE;
|
|
|
| if (src1->value != src2->value)
|
| return FALSE;
|
| -
|
| +
|
| /* Now check for the same section (if defined) or the same elf_hash
|
| (if undefined or weak). */
|
| h1 = r_reloc_get_hash_entry (&src1->r_rel);
|
| @@ -5251,7 +5249,7 @@ value_map_hash_table_init (void)
|
| values->count = 0;
|
| values->buckets = (value_map **)
|
| bfd_zmalloc (sizeof (value_map *) * values->bucket_count);
|
| - if (values->buckets == NULL)
|
| + if (values->buckets == NULL)
|
| {
|
| free (values);
|
| return NULL;
|
| @@ -5290,7 +5288,7 @@ literal_value_hash (const literal_value *src)
|
| hash_val += hash_bfd_vma (src->is_abs_literal * 1000);
|
| hash_val += hash_bfd_vma (src->r_rel.target_offset);
|
| hash_val += hash_bfd_vma (src->r_rel.virtual_offset);
|
| -
|
| +
|
| /* Now check for the same section and the same elf_hash. */
|
| if (r_reloc_is_defined (&src->r_rel))
|
| sec_or_hash = r_reloc_get_section (&src->r_rel);
|
| @@ -5356,7 +5354,7 @@ add_value_map (value_map_hash_table *map,
|
| *bucket_p = val_e;
|
| map->count++;
|
| /* FIXME: Consider resizing the hash table if we get too many entries. */
|
| -
|
| +
|
| return val_e;
|
| }
|
|
|
| @@ -5496,7 +5494,7 @@ adjust_fill_action (text_action *ta, int fill_diff)
|
| "unreachable_space" bytes can be freely contracted. Note that a
|
| negative removed value is a fill. */
|
|
|
| -static void
|
| +static void
|
| text_action_add (text_action_list *l,
|
| text_action_t action,
|
| asection *sec,
|
| @@ -5517,8 +5515,8 @@ text_action_add (text_action_list *l,
|
| for (m_p = &l->head; *m_p && (*m_p)->offset <= offset; m_p = &(*m_p)->next)
|
| {
|
| text_action *t = *m_p;
|
| -
|
| - if (action == ta_fill)
|
| +
|
| + if (action == ta_fill)
|
| {
|
| /* When the action is another fill at the same address,
|
| just increase the size. */
|
| @@ -5615,7 +5613,7 @@ removed_by_actions (text_action **p_start_action,
|
| }
|
|
|
|
|
| -static bfd_vma
|
| +static bfd_vma
|
| offset_with_removed_text (text_action_list *action_list, bfd_vma offset)
|
| {
|
| text_action *r = action_list->head;
|
| @@ -5753,9 +5751,9 @@ add_removed_literal (removed_literal_list *removed_list,
|
| else
|
| new_r->to.abfd = NULL;
|
| new_r->next = NULL;
|
| -
|
| +
|
| r = removed_list->head;
|
| - if (r == NULL)
|
| + if (r == NULL)
|
| {
|
| removed_list->head = new_r;
|
| removed_list->tail = new_r;
|
| @@ -5768,7 +5766,7 @@ add_removed_literal (removed_literal_list *removed_list,
|
| }
|
| else
|
| {
|
| - while (r->from.target_offset < from->target_offset && r->next)
|
| + while (r->from.target_offset < from->target_offset && r->next)
|
| {
|
| r = r->next;
|
| }
|
| @@ -5846,7 +5844,7 @@ struct xtensa_relax_info_struct
|
| reallocated, the newly allocated relocations will be referenced
|
| here along with the actual size allocated. The relocation
|
| count will always be found in the section structure. */
|
| - Elf_Internal_Rela *allocated_relocs;
|
| + Elf_Internal_Rela *allocated_relocs;
|
| unsigned relocs_count;
|
| unsigned allocated_relocs_count;
|
| };
|
| @@ -5912,7 +5910,7 @@ init_xtensa_relax_info (asection *sec)
|
| relax_info->fix_array = NULL;
|
| relax_info->fix_array_count = 0;
|
|
|
| - relax_info->allocated_relocs = NULL;
|
| + relax_info->allocated_relocs = NULL;
|
| relax_info->relocs_count = 0;
|
| relax_info->allocated_relocs_count = 0;
|
| }
|
| @@ -5932,11 +5930,11 @@ struct reloc_bfd_fix_struct
|
| asection *src_sec;
|
| bfd_vma src_offset;
|
| unsigned src_type; /* Relocation type. */
|
| -
|
| +
|
| asection *target_sec;
|
| bfd_vma target_offset;
|
| bfd_boolean translated;
|
| -
|
| +
|
| reloc_bfd_fix *next;
|
| };
|
|
|
| @@ -6067,7 +6065,7 @@ init_section_cache (section_cache_t *sec_cache)
|
|
|
|
|
| static void
|
| -clear_section_cache (section_cache_t *sec_cache)
|
| +free_section_cache (section_cache_t *sec_cache)
|
| {
|
| if (sec_cache->sec)
|
| {
|
| @@ -6075,7 +6073,6 @@ clear_section_cache (section_cache_t *sec_cache)
|
| release_internal_relocs (sec_cache->sec, sec_cache->relocs);
|
| if (sec_cache->ptbl)
|
| free (sec_cache->ptbl);
|
| - memset (sec_cache, 0, sizeof (sec_cache));
|
| }
|
| }
|
|
|
| @@ -6116,8 +6113,8 @@ section_cache_section (section_cache_t *sec_cache,
|
| goto err;
|
|
|
| /* Fill in the new section cache. */
|
| - clear_section_cache (sec_cache);
|
| - memset (sec_cache, 0, sizeof (sec_cache));
|
| + free_section_cache (sec_cache);
|
| + init_section_cache (sec_cache);
|
|
|
| sec_cache->sec = sec;
|
| sec_cache->contents = contents;
|
| @@ -6548,7 +6545,7 @@ retrieve_contents (bfd *abfd, asection *sec, bfd_boolean keep_memory)
|
|
|
| sec_size = bfd_get_section_limit (abfd, sec);
|
| contents = elf_section_data (sec)->this_hdr.contents;
|
| -
|
| +
|
| if (contents == NULL && sec_size != 0)
|
| {
|
| if (!bfd_malloc_and_get_section (abfd, sec, &contents))
|
| @@ -6557,7 +6554,7 @@ retrieve_contents (bfd *abfd, asection *sec, bfd_boolean keep_memory)
|
| free (contents);
|
| return NULL;
|
| }
|
| - if (keep_memory)
|
| + if (keep_memory)
|
| elf_section_data (sec)->this_hdr.contents = contents;
|
| }
|
| return contents;
|
| @@ -6632,12 +6629,12 @@ static bfd_boolean compute_removed_literals
|
| (bfd *, asection *, struct bfd_link_info *, value_map_hash_table *);
|
| static Elf_Internal_Rela *get_irel_at_offset
|
| (asection *, Elf_Internal_Rela *, bfd_vma);
|
| -static bfd_boolean is_removable_literal
|
| +static bfd_boolean is_removable_literal
|
| (const source_reloc *, int, const source_reloc *, int, asection *,
|
| property_table_entry *, int);
|
| static bfd_boolean remove_dead_literal
|
| (bfd *, asection *, struct bfd_link_info *, Elf_Internal_Rela *,
|
| - Elf_Internal_Rela *, source_reloc *, property_table_entry *, int);
|
| + Elf_Internal_Rela *, source_reloc *, property_table_entry *, int);
|
| static bfd_boolean identify_literal_placement
|
| (bfd *, asection *, bfd_byte *, struct bfd_link_info *,
|
| value_map_hash_table *, bfd_boolean *, Elf_Internal_Rela *, int,
|
| @@ -6667,7 +6664,7 @@ static bfd_boolean relax_property_section
|
| static bfd_boolean relax_section_symbols (bfd *, asection *);
|
|
|
|
|
| -static bfd_boolean
|
| +static bfd_boolean
|
| elf_xtensa_relax_section (bfd *abfd,
|
| asection *sec,
|
| struct bfd_link_info *link_info,
|
| @@ -6830,7 +6827,7 @@ find_relaxable_sections (bfd *abfd,
|
|
|
| internal_relocs = retrieve_internal_relocs (abfd, sec,
|
| link_info->keep_memory);
|
| - if (internal_relocs == NULL)
|
| + if (internal_relocs == NULL)
|
| return ok;
|
|
|
| contents = retrieve_contents (abfd, sec, link_info->keep_memory);
|
| @@ -6841,7 +6838,7 @@ find_relaxable_sections (bfd *abfd,
|
| }
|
|
|
| source_relax_info = get_xtensa_relax_info (sec);
|
| - for (i = 0; i < sec->reloc_count; i++)
|
| + for (i = 0; i < sec->reloc_count; i++)
|
| {
|
| Elf_Internal_Rela *irel = &internal_relocs[i];
|
| r_reloc r_rel;
|
| @@ -6921,9 +6918,9 @@ collect_source_relocs (bfd *abfd,
|
| unsigned i;
|
| bfd_size_type sec_size;
|
|
|
| - internal_relocs = retrieve_internal_relocs (abfd, sec,
|
| + internal_relocs = retrieve_internal_relocs (abfd, sec,
|
| link_info->keep_memory);
|
| - if (internal_relocs == NULL)
|
| + if (internal_relocs == NULL)
|
| return ok;
|
|
|
| sec_size = bfd_get_section_limit (abfd, sec);
|
| @@ -6935,7 +6932,7 @@ collect_source_relocs (bfd *abfd,
|
| }
|
|
|
| /* Record relocations against relaxable literal sections. */
|
| - for (i = 0; i < sec->reloc_count; i++)
|
| + for (i = 0; i < sec->reloc_count; i++)
|
| {
|
| Elf_Internal_Rela *irel = &internal_relocs[i];
|
| r_reloc r_rel;
|
| @@ -6993,7 +6990,7 @@ collect_source_relocs (bfd *abfd,
|
| relocations associated with ASM_EXPANDs because they were just
|
| added in the preceding loop over the relocations. */
|
|
|
| - for (i = 0; i < sec->reloc_count; i++)
|
| + for (i = 0; i < sec->reloc_count; i++)
|
| {
|
| Elf_Internal_Rela *irel = &internal_relocs[i];
|
| bfd_boolean is_reachable;
|
| @@ -7032,7 +7029,7 @@ collect_source_relocs (bfd *abfd,
|
| the l32r_irel. Note: The src_relocs array is not yet
|
| sorted, but it wouldn't matter anyway because we're
|
| searching by source offset instead of target offset. */
|
| - s_reloc = find_source_reloc (target_relax_info->src_relocs,
|
| + s_reloc = find_source_reloc (target_relax_info->src_relocs,
|
| target_relax_info->src_next,
|
| sec, l32r_irel);
|
| BFD_ASSERT (s_reloc);
|
| @@ -7091,7 +7088,7 @@ is_resolvable_asm_expansion (bfd *abfd,
|
| if (contents == NULL)
|
| return FALSE;
|
|
|
| - if (ELF32_R_TYPE (irel->r_info) != R_XTENSA_ASM_EXPAND)
|
| + if (ELF32_R_TYPE (irel->r_info) != R_XTENSA_ASM_EXPAND)
|
| return FALSE;
|
|
|
| sec_size = bfd_get_section_limit (abfd, sec);
|
| @@ -7100,7 +7097,7 @@ is_resolvable_asm_expansion (bfd *abfd,
|
| /* Optimization of longcalls that use CONST16 is not yet implemented. */
|
| if (!uses_l32r)
|
| return FALSE;
|
| -
|
| +
|
| direct_call_opcode = swap_callx_for_call_opcode (opcode);
|
| if (direct_call_opcode == XTENSA_UNDEFINED)
|
| return FALSE;
|
| @@ -7119,7 +7116,7 @@ is_resolvable_asm_expansion (bfd *abfd,
|
| shouldn't crash regardless. */
|
| if (!target_sec->output_section)
|
| return FALSE;
|
| -
|
| +
|
| /* For relocatable sections, we can only simplify when the output
|
| section of the target is the same as the output section of the
|
| source. */
|
| @@ -7132,7 +7129,7 @@ is_resolvable_asm_expansion (bfd *abfd,
|
| + sec->output_offset + irel->r_offset + 3);
|
| dest_address = (target_sec->output_section->vma
|
| + target_sec->output_offset + target_offset);
|
| -
|
| +
|
| *is_reachable_p = pcrel_reloc_fits (direct_call_opcode, 0,
|
| self_address, dest_address);
|
|
|
| @@ -7153,7 +7150,7 @@ find_associated_l32r_irel (bfd *abfd,
|
| {
|
| unsigned i;
|
|
|
| - for (i = 0; i < sec->reloc_count; i++)
|
| + for (i = 0; i < sec->reloc_count; i++)
|
| {
|
| Elf_Internal_Rela *irel = &internal_relocs[i];
|
|
|
| @@ -7370,7 +7367,7 @@ prev_instr_is_a_loop (bfd_byte *contents,
|
| return FALSE;
|
| prev_opcode = insn_decode_opcode (contents, content_length, offset-3, 0);
|
| return (xtensa_opcode_is_loop (xtensa_default_isa, prev_opcode) == 1);
|
| -}
|
| +}
|
|
|
|
|
| /* Find all of the possible actions for an extended basic block. */
|
| @@ -7420,7 +7417,7 @@ compute_ebb_proposed_actions (ebb_constraint *ebb_table)
|
|
|
| insn_len = insn_decode_len (ebb->contents, ebb->content_length,
|
| offset);
|
| - if (insn_len == 0)
|
| + if (insn_len == 0)
|
| goto decode_error;
|
|
|
| if (check_branch_target_aligned_address (offset, insn_len))
|
| @@ -7449,7 +7446,7 @@ compute_ebb_proposed_actions (ebb_constraint *ebb_table)
|
| {
|
| bfd_size_type simplify_size;
|
|
|
| - simplify_size = get_asm_simplify_size (ebb->contents,
|
| + simplify_size = get_asm_simplify_size (ebb->contents,
|
| ebb->content_length,
|
| irel->r_offset);
|
| if (simplify_size == 0)
|
| @@ -7457,7 +7454,7 @@ compute_ebb_proposed_actions (ebb_constraint *ebb_table)
|
|
|
| ebb_propose_action (ebb_table, EBB_NO_ALIGN, 0,
|
| ta_convert_longcall, offset, 0, TRUE);
|
| -
|
| +
|
| offset += simplify_size;
|
| continue;
|
| }
|
| @@ -7804,7 +7801,7 @@ struct xlate_map
|
| };
|
|
|
|
|
| -static int
|
| +static int
|
| xlate_compare (const void *a_v, const void *b_v)
|
| {
|
| const xlate_map_entry_t *a = (const xlate_map_entry_t *) a_v;
|
| @@ -7834,7 +7831,7 @@ xlate_offset_with_removed_text (const xlate_map_t *map,
|
| r = bsearch (&offset, map->entry, map->entry_count,
|
| sizeof (xlate_map_entry_t), &xlate_compare);
|
| e = (xlate_map_entry_t *) r;
|
| -
|
| +
|
| BFD_ASSERT (e != NULL);
|
| if (e == NULL)
|
| return offset;
|
| @@ -7859,7 +7856,7 @@ build_xlate_map (asection *sec, xtensa_relax_info *relax_info)
|
| return NULL;
|
|
|
| num_actions = action_list_count (action_list);
|
| - map->entry = (xlate_map_entry_t *)
|
| + map->entry = (xlate_map_entry_t *)
|
| bfd_malloc (sizeof (xlate_map_entry_t) * (num_actions + 1));
|
| if (map->entry == NULL)
|
| {
|
| @@ -7867,7 +7864,7 @@ build_xlate_map (asection *sec, xtensa_relax_info *relax_info)
|
| return NULL;
|
| }
|
| map->entry_count = 0;
|
| -
|
| +
|
| removed = 0;
|
| current_entry = &map->entry[0];
|
|
|
| @@ -7922,7 +7919,7 @@ build_xlate_map (asection *sec, xtensa_relax_info *relax_info)
|
|
|
| /* Free an offset translation map. */
|
|
|
| -static void
|
| +static void
|
| free_xlate_map (xlate_map_t *map)
|
| {
|
| if (map && map->entry)
|
| @@ -8154,7 +8151,7 @@ compute_fill_extra_space (property_table_entry *entry)
|
| add an entry to the per-section list of removed literals. The
|
| actual changes are deferred until the next pass. */
|
|
|
| -static bfd_boolean
|
| +static bfd_boolean
|
| compute_removed_literals (bfd *abfd,
|
| asection *sec,
|
| struct bfd_link_info *link_info,
|
| @@ -8181,7 +8178,7 @@ compute_removed_literals (bfd *abfd,
|
| if (!relax_info->is_relaxable_literal_section)
|
| return ok;
|
|
|
| - internal_relocs = retrieve_internal_relocs (abfd, sec,
|
| + internal_relocs = retrieve_internal_relocs (abfd, sec,
|
| link_info->keep_memory);
|
|
|
| sec_size = bfd_get_section_limit (abfd, sec);
|
| @@ -8233,14 +8230,14 @@ compute_removed_literals (bfd *abfd,
|
| continue;
|
| prev_i = i;
|
|
|
| - if (last_loc_is_prev &&
|
| + if (last_loc_is_prev &&
|
| last_target_offset + 4 != rel->r_rel.target_offset)
|
| last_loc_is_prev = FALSE;
|
|
|
| /* Check if the relocation was from an L32R that is being removed
|
| because a CALLX was converted to a direct CALL, and check if
|
| there are no other relocations to the literal. */
|
| - if (is_removable_literal (rel, i, src_relocs, relax_info->src_count,
|
| + if (is_removable_literal (rel, i, src_relocs, relax_info->src_count,
|
| sec, prop_table, ptblsize))
|
| {
|
| if (!remove_dead_literal (abfd, sec, link_info, internal_relocs,
|
| @@ -8254,8 +8251,8 @@ compute_removed_literals (bfd *abfd,
|
| }
|
|
|
| if (!identify_literal_placement (abfd, sec, contents, link_info,
|
| - values,
|
| - &last_loc_is_prev, irel,
|
| + values,
|
| + &last_loc_is_prev, irel,
|
| relax_info->src_count - i, rel,
|
| prop_table, ptblsize,
|
| &target_sec_cache, rel->is_abs_literal))
|
| @@ -8272,8 +8269,9 @@ compute_removed_literals (bfd *abfd,
|
| #endif /* DEBUG */
|
|
|
| error_return:
|
| - if (prop_table) free (prop_table);
|
| - clear_section_cache (&target_sec_cache);
|
| + if (prop_table)
|
| + free (prop_table);
|
| + free_section_cache (&target_sec_cache);
|
|
|
| release_contents (sec, contents);
|
| release_internal_relocs (sec, internal_relocs);
|
| @@ -8291,7 +8289,7 @@ get_irel_at_offset (asection *sec,
|
| unsigned r_type;
|
| Elf_Internal_Rela key;
|
|
|
| - if (!internal_relocs)
|
| + if (!internal_relocs)
|
| return NULL;
|
|
|
| key.r_offset = offset;
|
| @@ -8335,8 +8333,8 @@ is_removable_literal (const source_reloc *rel,
|
|
|
| if (!rel->is_null)
|
| return FALSE;
|
| -
|
| - entry = elf_xtensa_find_property_entry (prop_table, ptblsize,
|
| +
|
| + entry = elf_xtensa_find_property_entry (prop_table, ptblsize,
|
| sec->vma + rel->r_rel.target_offset);
|
| if (entry && (entry->flags & XTENSA_PROP_NO_TRANSFORM))
|
| return FALSE;
|
| @@ -8357,7 +8355,7 @@ is_removable_literal (const source_reloc *rel,
|
| }
|
|
|
|
|
| -bfd_boolean
|
| +bfd_boolean
|
| remove_dead_literal (bfd *abfd,
|
| asection *sec,
|
| struct bfd_link_info *link_info,
|
| @@ -8384,7 +8382,7 @@ remove_dead_literal (bfd *abfd,
|
| ta_remove_literal, sec, rel->r_rel.target_offset, 4);
|
|
|
| /* If the section is 4-byte aligned, do not add fill. */
|
| - if (sec->alignment_power > 2)
|
| + if (sec->alignment_power > 2)
|
| {
|
| int fill_extra_space;
|
| bfd_vma entry_sec_offset;
|
| @@ -8428,7 +8426,7 @@ remove_dead_literal (bfd *abfd,
|
| }
|
|
|
|
|
| -bfd_boolean
|
| +bfd_boolean
|
| identify_literal_placement (bfd *abfd,
|
| asection *sec,
|
| bfd_byte *contents,
|
| @@ -8498,7 +8496,7 @@ identify_literal_placement (bfd *abfd,
|
| /* For relocatable links, do not try to move literals. To do it
|
| correctly might increase the number of relocations in an input
|
| section making the default relocatable linking fail. */
|
| - if (!link_info->relocatable && !literal_placed
|
| + if (!link_info->relocatable && !literal_placed
|
| && values->has_last_loc && !(*last_loc_is_prev_p))
|
| {
|
| asection *target_sec = r_reloc_get_section (&values->last_loc);
|
| @@ -8511,7 +8509,7 @@ identify_literal_placement (bfd *abfd,
|
| /* There is a last loc that was in the same output section. */
|
| if (relocations_reach (rel, remaining_src_rels, &try_loc)
|
| && move_shared_literal (sec, link_info, rel,
|
| - prop_table, ptblsize,
|
| + prop_table, ptblsize,
|
| &try_loc, &val, target_sec_cache))
|
| {
|
| values->last_loc.virtual_offset += 4;
|
| @@ -8611,7 +8609,7 @@ relocations_reach (source_reloc *reloc,
|
| /* Move a literal to another literal location because it is
|
| the same as the other literal value. */
|
|
|
| -static bfd_boolean
|
| +static bfd_boolean
|
| coalesce_shared_literal (asection *sec,
|
| source_reloc *rel,
|
| property_table_entry *prop_table,
|
| @@ -8640,7 +8638,7 @@ coalesce_shared_literal (asection *sec,
|
| ta_remove_literal, sec, rel->r_rel.target_offset, 4);
|
|
|
| /* If the section is 4-byte aligned, do not add fill. */
|
| - if (sec->alignment_power > 2)
|
| + if (sec->alignment_power > 2)
|
| {
|
| int fill_extra_space;
|
| bfd_vma entry_sec_offset;
|
| @@ -8676,7 +8674,7 @@ coalesce_shared_literal (asection *sec,
|
| total amount of space used because of alignments so we need to do
|
| this carefully. Also, it may make a branch go out of range. */
|
|
|
| -static bfd_boolean
|
| +static bfd_boolean
|
| move_shared_literal (asection *sec,
|
| struct bfd_link_info *link_info,
|
| source_reloc *rel,
|
| @@ -8719,7 +8717,7 @@ move_shared_literal (asection *sec,
|
| return FALSE;
|
|
|
| target_entry = elf_xtensa_find_property_entry
|
| - (target_sec_cache->ptbl, target_sec_cache->pte_count,
|
| + (target_sec_cache->ptbl, target_sec_cache->pte_count,
|
| target_sec->vma + target_loc->target_offset);
|
|
|
| if (!target_entry)
|
| @@ -8730,7 +8728,7 @@ move_shared_literal (asection *sec,
|
|
|
| init_ebb_constraint (&ebb_table);
|
| ebb = &ebb_table.ebb;
|
| - init_ebb (ebb, target_sec_cache->sec, target_sec_cache->contents,
|
| + init_ebb (ebb, target_sec_cache->sec, target_sec_cache->contents,
|
| target_sec_cache->content_length,
|
| target_sec_cache->ptbl, target_sec_cache->pte_count,
|
| target_sec_cache->relocs, target_sec_cache->reloc_count);
|
| @@ -8742,24 +8740,24 @@ move_shared_literal (asection *sec,
|
| -4 - (1 << target_sec->alignment_power), TRUE);
|
|
|
| /* Check all of the PC-relative relocations to make sure they still fit. */
|
| - relocs_fit = check_section_ebb_pcrels_fit (target_sec->owner, target_sec,
|
| + relocs_fit = check_section_ebb_pcrels_fit (target_sec->owner, target_sec,
|
| target_sec_cache->contents,
|
| target_sec_cache->relocs,
|
| &ebb_table, NULL);
|
|
|
| - if (!relocs_fit)
|
| + if (!relocs_fit)
|
| return FALSE;
|
|
|
| text_action_add_literal (&target_relax_info->action_list,
|
| ta_add_literal, target_loc, lit_value, -4);
|
|
|
| - if (target_sec->alignment_power > 2 && target_entry != src_entry)
|
| + if (target_sec->alignment_power > 2 && target_entry != src_entry)
|
| {
|
| /* May need to add or remove some fill to maintain alignment. */
|
| int fill_extra_space;
|
| bfd_vma entry_sec_offset;
|
|
|
| - entry_sec_offset =
|
| + entry_sec_offset =
|
| target_entry->address - target_sec->vma + target_entry->size;
|
|
|
| /* If the literal range is at the end of the section,
|
| @@ -8792,7 +8790,7 @@ move_shared_literal (asection *sec,
|
| ta_remove_literal, sec, rel->r_rel.target_offset, 4);
|
|
|
| /* If the section is 4-byte aligned, do not add fill. */
|
| - if (sec->alignment_power > 2 && target_entry != src_entry)
|
| + if (sec->alignment_power > 2 && target_entry != src_entry)
|
| {
|
| int fill_extra_space;
|
| bfd_vma entry_sec_offset;
|
| @@ -8856,7 +8854,7 @@ relax_section (bfd *abfd, asection *sec, struct bfd_link_info *link_info)
|
| return relax_property_section (abfd, sec, link_info);
|
| }
|
|
|
| - internal_relocs = retrieve_internal_relocs (abfd, sec,
|
| + internal_relocs = retrieve_internal_relocs (abfd, sec,
|
| link_info->keep_memory);
|
| if (!internal_relocs && !relax_info->action_list.head)
|
| return TRUE;
|
| @@ -9186,7 +9184,7 @@ relax_section (bfd *abfd, asection *sec, struct bfd_link_info *link_info)
|
| dup_dot += copy_size;
|
| }
|
| virtual_action = TRUE;
|
| - }
|
| + }
|
| else
|
| BFD_ASSERT (action->virtual_offset <= orig_dot_vo);
|
| }
|
| @@ -9257,7 +9255,7 @@ relax_section (bfd *abfd, asection *sec, struct bfd_link_info *link_info)
|
| relax_info, &internal_relocs, &action->value))
|
| goto error_return;
|
|
|
| - if (virtual_action)
|
| + if (virtual_action)
|
| orig_dot_vo += copy_size;
|
|
|
| orig_dot += orig_insn_size;
|
| @@ -9322,7 +9320,7 @@ relax_section (bfd *abfd, asection *sec, struct bfd_link_info *link_info)
|
| }
|
|
|
|
|
| -static bfd_boolean
|
| +static bfd_boolean
|
| translate_section_fixes (asection *sec)
|
| {
|
| xtensa_relax_info *relax_info;
|
| @@ -9343,7 +9341,7 @@ translate_section_fixes (asection *sec)
|
| /* Translate a fix given the mapping in the relax info for the target
|
| section. If it has already been translated, no work is required. */
|
|
|
| -static bfd_boolean
|
| +static bfd_boolean
|
| translate_reloc_bfd_fix (reloc_bfd_fix *fix)
|
| {
|
| reloc_bfd_fix new_fix;
|
| @@ -9389,7 +9387,7 @@ translate_reloc_bfd_fix (reloc_bfd_fix *fix)
|
| target_offset);
|
| }
|
|
|
| - if (removed)
|
| + if (removed)
|
| {
|
| asection *new_sec;
|
|
|
| @@ -9399,11 +9397,11 @@ translate_reloc_bfd_fix (reloc_bfd_fix *fix)
|
|
|
| /* This was moved to some other address (possibly another section). */
|
| new_sec = r_reloc_get_section (&removed->to);
|
| - if (new_sec != sec)
|
| + if (new_sec != sec)
|
| {
|
| sec = new_sec;
|
| relax_info = get_xtensa_relax_info (sec);
|
| - if (!relax_info ||
|
| + if (!relax_info ||
|
| (!relax_info->is_relaxable_literal_section
|
| && !relax_info->is_relaxable_asm_section))
|
| {
|
| @@ -9692,7 +9690,7 @@ move_literal (bfd *abfd,
|
| BFD_ASSERT (relax_info->allocated_relocs == NULL
|
| || sec->reloc_count == relax_info->relocs_count);
|
|
|
| - if (relax_info->allocated_relocs_count == 0)
|
| + if (relax_info->allocated_relocs_count == 0)
|
| new_relocs_count = (sec->reloc_count + 2) * 2;
|
| else
|
| new_relocs_count = (relax_info->allocated_relocs_count + 2) * 2;
|
| @@ -9712,7 +9710,7 @@ move_literal (bfd *abfd,
|
| if (insert_at != sec->reloc_count)
|
| memcpy (new_relocs + insert_at + 1,
|
| (*internal_relocs_p) + insert_at,
|
| - (sec->reloc_count - insert_at)
|
| + (sec->reloc_count - insert_at)
|
| * sizeof (Elf_Internal_Rela));
|
|
|
| if (*internal_relocs_p != relax_info->allocated_relocs)
|
| @@ -9771,7 +9769,7 @@ relax_property_section (bfd *abfd,
|
| bfd_size_type entry_size;
|
|
|
| sec_size = bfd_get_section_limit (abfd, sec);
|
| - internal_relocs = retrieve_internal_relocs (abfd, sec,
|
| + internal_relocs = retrieve_internal_relocs (abfd, sec,
|
| link_info->keep_memory);
|
| contents = retrieve_contents (abfd, sec, link_info->keep_memory);
|
| if (contents == NULL && sec_size != 0)
|
| @@ -9996,7 +9994,7 @@ relax_property_section (bfd *abfd,
|
| actual_offset = offset - removed_bytes;
|
| size = bfd_get_32 (abfd, &contents[actual_offset + 4]);
|
|
|
| - if (is_full_prop_section)
|
| + if (is_full_prop_section)
|
| flags = bfd_get_32 (abfd, &contents[actual_offset + 8]);
|
| else
|
| flags = predef_flags;
|
| @@ -10024,7 +10022,7 @@ relax_property_section (bfd *abfd,
|
| bfd_vma new_address =
|
| (offset_rel->r_addend
|
| + bfd_get_32 (abfd, &contents[actual_offset]));
|
| - if (is_full_prop_section)
|
| + if (is_full_prop_section)
|
| old_flags = bfd_get_32
|
| (abfd, &contents[last_irel->r_offset + 8]);
|
| else
|
| @@ -10440,7 +10438,7 @@ pcrel_reloc_fits (xtensa_opcode opc,
|
| }
|
|
|
|
|
| -static bfd_boolean
|
| +static bfd_boolean
|
| xtensa_is_property_section (asection *sec)
|
| {
|
| if (xtensa_is_insntable_section (sec)
|
| @@ -10452,7 +10450,7 @@ xtensa_is_property_section (asection *sec)
|
| }
|
|
|
|
|
| -static bfd_boolean
|
| +static bfd_boolean
|
| xtensa_is_insntable_section (asection *sec)
|
| {
|
| if (CONST_STRNEQ (sec->name, XTENSA_INSN_SEC_NAME)
|
| @@ -10463,7 +10461,7 @@ xtensa_is_insntable_section (asection *sec)
|
| }
|
|
|
|
|
| -static bfd_boolean
|
| +static bfd_boolean
|
| xtensa_is_littable_section (asection *sec)
|
| {
|
| if (CONST_STRNEQ (sec->name, XTENSA_LIT_SEC_NAME)
|
| @@ -10474,7 +10472,7 @@ xtensa_is_littable_section (asection *sec)
|
| }
|
|
|
|
|
| -static bfd_boolean
|
| +static bfd_boolean
|
| xtensa_is_proptable_section (asection *sec)
|
| {
|
| if (CONST_STRNEQ (sec->name, XTENSA_PROP_SEC_NAME)
|
| @@ -10527,7 +10525,7 @@ match_section_group (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *inf)
|
| {
|
| const char *gname = inf;
|
| const char *group_name = elf_group_name (sec);
|
| -
|
| +
|
| return (group_name == gname
|
| || (group_name != NULL
|
| && gname != NULL
|
| @@ -10559,9 +10557,9 @@ xtensa_property_section_name (asection *sec, const char *base_name)
|
| {
|
| char *linkonce_kind = 0;
|
|
|
| - if (strcmp (base_name, XTENSA_INSN_SEC_NAME) == 0)
|
| + if (strcmp (base_name, XTENSA_INSN_SEC_NAME) == 0)
|
| linkonce_kind = "x.";
|
| - else if (strcmp (base_name, XTENSA_LIT_SEC_NAME) == 0)
|
| + else if (strcmp (base_name, XTENSA_LIT_SEC_NAME) == 0)
|
| linkonce_kind = "p.";
|
| else if (strcmp (base_name, XTENSA_PROP_SEC_NAME) == 0)
|
| linkonce_kind = "prop.";
|
| @@ -10701,7 +10699,7 @@ xtensa_callback_required_dependence (bfd *abfd,
|
| if (bfd_get_flavour (abfd) != bfd_target_elf_flavour)
|
| return ok;
|
|
|
| - internal_relocs = retrieve_internal_relocs (abfd, sec,
|
| + internal_relocs = retrieve_internal_relocs (abfd, sec,
|
| link_info->keep_memory);
|
| if (internal_relocs == NULL
|
| || sec->reloc_count == 0)
|
|
|