From 871a6bd2d852b0fb677386e1be78c3f4c6939b48 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Mon, 15 Apr 2019 21:51:44 +0930 Subject: [PATCH] Make frag fr_fix unsigned The field only stores unsigned values, so let's make it unsigned to stop people worrying about the possibility of negative values. * frags.h (struct frag ): Use unsigned type. * frags.c (frag_new): Assert that current size exceeds old_frags_var_max_size. * ehopt.c (get_cie_info): Adjust for unsigned fr_fix. * listing.c (calc_hex): Likewise. * write.c (cvt_frag_to_fill, write_relocs): Likewise. * config/tc-arc.c (md_convert_frag): Likewise. * config/tc-avr.c (avr_patch_gccisr_frag): Likewise. * config/tc-mips.c (md_convert_frag): Likewise. * config/tc-rl78.c (md_convert_frag): Likewise. * config/tc-rx.c (md_convert_frag): Likewise. * config/tc-sparc.c (md_apply_fix): Likewise. * config/tc-xtensa.c (next_instrs_are_b_retw): Likewise. (unrelaxed_frag_min_insn_count, unrelaxed_frag_has_b_j): Likewise. --- gas/ChangeLog | 17 +++++++++++++++++ gas/config/tc-arc.c | 2 +- gas/config/tc-avr.c | 4 ++-- gas/config/tc-mips.c | 4 ++-- gas/config/tc-rl78.c | 3 +-- gas/config/tc-rx.c | 3 +-- gas/config/tc-sparc.c | 2 +- gas/config/tc-xtensa.c | 6 +++--- gas/ehopt.c | 2 +- gas/frags.c | 4 +++- gas/frags.h | 2 +- gas/listing.c | 8 ++++---- gas/write.c | 6 +++--- 13 files changed, 40 insertions(+), 23 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index 7eb172c96b..2013c5deff 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,20 @@ +2019-04-16 Alan Modra + + * frags.h (struct frag ): Use unsigned type. + * frags.c (frag_new): Assert that current size exceeds + old_frags_var_max_size. + * ehopt.c (get_cie_info): Adjust for unsigned fr_fix. + * listing.c (calc_hex): Likewise. + * write.c (cvt_frag_to_fill, write_relocs): Likewise. + * config/tc-arc.c (md_convert_frag): Likewise. + * config/tc-avr.c (avr_patch_gccisr_frag): Likewise. + * config/tc-mips.c (md_convert_frag): Likewise. + * config/tc-rl78.c (md_convert_frag): Likewise. + * config/tc-rx.c (md_convert_frag): Likewise. + * config/tc-sparc.c (md_apply_fix): Likewise. + * config/tc-xtensa.c (next_instrs_are_b_retw): Likewise. + (unrelaxed_frag_min_insn_count, unrelaxed_frag_has_b_j): Likewise. + 2019-04-15 Thomas Preud'homme * config/tc-arm.c (parse_sys_vldr_vstr): New function. diff --git a/gas/config/tc-arc.c b/gas/config/tc-arc.c index a4f617a991..6cc4726e2e 100644 --- a/gas/config/tc-arc.c +++ b/gas/config/tc-arc.c @@ -3271,7 +3271,7 @@ md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, int size, fix; struct arc_relax_type *relax_arg = &fragP->tc_frag_data; - fix = (fragP->fr_fix < 0 ? 0 : fragP->fr_fix); + fix = fragP->fr_fix; dest = fragP->fr_literal + fix; table_entry = TC_GENERIC_RELAX_TABLE + fragP->fr_subtype; diff --git a/gas/config/tc-avr.c b/gas/config/tc-avr.c index 7886022357..df0833c761 100644 --- a/gas/config/tc-avr.c +++ b/gas/config/tc-avr.c @@ -2635,8 +2635,8 @@ avr_patch_gccisr_frag (fragS *fr, int reg) /* Turn frag into ordinary code frag of now known size. */ fr->fr_var = 0; - fr->fr_fix = (offsetT) (where - fr->fr_literal); - gas_assert (fr->fr_fix <= fr->fr_offset); + fr->fr_fix = where - fr->fr_literal; + gas_assert (fr->fr_fix <= (valueT) fr->fr_offset); fr->fr_offset = 0; fr->fr_type = rs_fill; fr->fr_subtype = 0; diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c index 7eab392ace..70c6548283 100644 --- a/gas/config/tc-mips.c +++ b/gas/config/tc-mips.c @@ -19056,7 +19056,7 @@ md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp) relax_substateT subtype = fragp->fr_subtype; bfd_boolean second_longer = (subtype & RELAX_SECOND_LONGER) != 0; bfd_boolean use_second = (subtype & RELAX_USE_SECOND) != 0; - int first, second; + unsigned int first, second; fixS *fixp; first = RELAX_FIRST (subtype); @@ -19099,7 +19099,7 @@ md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp) sequence instead. */ while (fixp && fixp->fx_frag == fragp - && fixp->fx_where < fragp->fr_fix - second) + && (valueT) fixp->fx_where + second < fragp->fr_fix) { if (subtype & RELAX_USE_SECOND) fixp->fx_done = 1; diff --git a/gas/config/tc-rl78.c b/gas/config/tc-rl78.c index 6d28eaeb63..878c03f97e 100644 --- a/gas/config/tc-rl78.c +++ b/gas/config/tc-rl78.c @@ -1233,8 +1233,7 @@ md_convert_frag (bfd * abfd ATTRIBUTE_UNUSED, fragP->fr_next); if (fragP->fr_next != NULL - && ((offsetT) (fragP->fr_next->fr_address - fragP->fr_address) - != fragP->fr_fix)) + && fragP->fr_next->fr_address - fragP->fr_address != fragP->fr_fix) as_bad (_("bad frag at %p : fix %ld addr %ld %ld \n"), fragP, (long) fragP->fr_fix, (long) fragP->fr_address, (long) fragP->fr_next->fr_address); diff --git a/gas/config/tc-rx.c b/gas/config/tc-rx.c index 0a44fc45f6..8688837b31 100644 --- a/gas/config/tc-rx.c +++ b/gas/config/tc-rx.c @@ -2179,8 +2179,7 @@ md_convert_frag (bfd * abfd ATTRIBUTE_UNUSED, fragP->fr_var = 0; if (fragP->fr_next != NULL - && ((offsetT) (fragP->fr_next->fr_address - fragP->fr_address) - != fragP->fr_fix)) + && fragP->fr_next->fr_address - fragP->fr_address != fragP->fr_fix) as_bad (_("bad frag at %p : fix %ld addr %ld %ld \n"), fragP, (long) fragP->fr_fix, (long) fragP->fr_address, (long) fragP->fr_next->fr_address); diff --git a/gas/config/tc-sparc.c b/gas/config/tc-sparc.c index 347db08173..677a13f1fe 100644 --- a/gas/config/tc-sparc.c +++ b/gas/config/tc-sparc.c @@ -3566,7 +3566,7 @@ md_apply_fix (fixS *fixP, valueT *valP, segT segment ATTRIBUTE_UNUSED) can be completely resolved here, i.e. if no undefined symbol is associated with it. */ if (sparc_relax && fixP->fx_addsy == NULL - && fixP->fx_where + 8 <= fixP->fx_frag->fr_fix) + && (valueT) fixP->fx_where + 8 <= fixP->fx_frag->fr_fix) { #define G0 0 #define O7 15 diff --git a/gas/config/tc-xtensa.c b/gas/config/tc-xtensa.c index 458cba9bae..9350beb495 100644 --- a/gas/config/tc-xtensa.c +++ b/gas/config/tc-xtensa.c @@ -8295,7 +8295,7 @@ next_instrs_are_b_retw (fragS *fragP) static xtensa_insnbuf insnbuf = NULL; static xtensa_insnbuf slotbuf = NULL; xtensa_isa isa = xtensa_default_isa; - int offset = 0; + unsigned int offset = 0; int slot; bfd_boolean branch_seen = FALSE; @@ -8688,7 +8688,7 @@ unrelaxed_frag_min_insn_count (fragS *fragP) xtensa_isa isa = xtensa_default_isa; static xtensa_insnbuf insnbuf = NULL; int insn_count = 0; - int offset = 0; + unsigned int offset = 0; if (!fragP->tc_frag_data.is_insn) return insn_count; @@ -8741,7 +8741,7 @@ unrelaxed_frag_has_b_j (fragS *fragP) { static xtensa_insnbuf insnbuf = NULL; xtensa_isa isa = xtensa_default_isa; - int offset = 0; + unsigned int offset = 0; if (!fragP->tc_frag_data.is_insn) return FALSE; diff --git a/gas/ehopt.c b/gas/ehopt.c index b90a533e9d..207e799405 100644 --- a/gas/ehopt.c +++ b/gas/ehopt.c @@ -103,7 +103,7 @@ get_cie_info (struct cie_info *info) { fragS *f; fixS *fix; - int offset; + unsigned int offset; char CIE_id; char augmentation[10]; int iaug; diff --git a/gas/frags.c b/gas/frags.c index 90096ff696..a9fc003fbd 100644 --- a/gas/frags.c +++ b/gas/frags.c @@ -165,7 +165,9 @@ frag_new (size_t old_frags_var_max_size gas_assert (frchain_now->frch_last == frag_now); /* Fix up old frag's fr_fix. */ - frag_now->fr_fix = frag_now_fix_octets () - old_frags_var_max_size; + frag_now->fr_fix = frag_now_fix_octets (); + gas_assert (frag_now->fr_fix >= old_frags_var_max_size); + frag_now->fr_fix -= old_frags_var_max_size; /* Make sure its type is valid. */ gas_assert (frag_now->fr_type != 0); diff --git a/gas/frags.h b/gas/frags.h index 6ac5d4426c..741ae2ba22 100644 --- a/gas/frags.h +++ b/gas/frags.h @@ -45,7 +45,7 @@ struct frag { addressT last_fr_address; /* (Fixed) number of octets we know we have. May be 0. */ - offsetT fr_fix; + valueT fr_fix; /* May be used for (Variable) number of octets after above. The generic frag handling code no longer makes any use of fr_var. */ offsetT fr_var; diff --git a/gas/listing.c b/gas/listing.c index a443458419..a016b7c4b6 100644 --- a/gas/listing.c +++ b/gas/listing.c @@ -783,7 +783,7 @@ calc_hex (list_info_type *list) { /* Print as many bytes from the fixed part as is sensible. */ octet_in_frag = 0; - while ((offsetT) octet_in_frag < frag_ptr->fr_fix + while (octet_in_frag < frag_ptr->fr_fix && data_buffer_size < MAX_BYTES - 3) { if (address == ~(unsigned int) 0) @@ -801,8 +801,8 @@ calc_hex (list_info_type *list) unsigned int var_rep_idx = octet_in_frag; /* Print as many bytes from the variable part as is sensible. */ - while (((offsetT) octet_in_frag - < (frag_ptr->fr_fix + frag_ptr->fr_var * frag_ptr->fr_offset)) + while ((octet_in_frag + < frag_ptr->fr_fix + frag_ptr->fr_var * frag_ptr->fr_offset) && data_buffer_size < MAX_BYTES - 3) { if (address == ~(unsigned int) 0) @@ -816,7 +816,7 @@ calc_hex (list_info_type *list) var_rep_idx++; octet_in_frag++; - if ((offsetT) var_rep_idx >= frag_ptr->fr_fix + frag_ptr->fr_var) + if (var_rep_idx >= frag_ptr->fr_fix + frag_ptr->fr_var) var_rep_idx = var_rep_max; } } diff --git a/gas/write.c b/gas/write.c index 44663d8ae1..2c4305e17d 100644 --- a/gas/write.c +++ b/gas/write.c @@ -502,8 +502,8 @@ skip_align: md_convert_frag (stdoutput, sec, fragP); gas_assert (fragP->fr_next == NULL - || ((offsetT) (fragP->fr_next->fr_address - fragP->fr_address) - == fragP->fr_fix)); + || (fragP->fr_next->fr_address - fragP->fr_address + == fragP->fr_fix)); /* After md_convert_frag, we make the frag into a ".space 0". md_convert_frag() should set up any fixSs and constants @@ -1264,7 +1264,7 @@ write_relocs (bfd *abfd, asection *sec, void *xxx ATTRIBUTE_UNUSED) for (fixp = seginfo->fix_root; fixp != (fixS *) NULL; fixp = fixp->fx_next) { int fx_size, slack; - offsetT loc; + valueT loc; arelent **reloc; #ifndef RELOC_EXPANSION_POSSIBLE arelent *rel; -- 2.34.1