+2019-05-21 Senthil Kumar Selvaraj <senthilkumar.selvaraj@microchip.com>
+
+ PR ld/24571
+ * bfd/elf32-avr.c (elf32_avr_relax_section): Adjust range check
+ when computing distance_short_enough.
+
2019-05-21 Senthil Kumar Selvaraj <senthilkumar.selvaraj@microchip.com>
PR ld/24564
/* Compute the distance from this insn to the branch target. */
gap = value - dot;
+ /* The ISA manual states that addressable range is PC - 2k + 1 to
+ PC + 2k. In bytes, that would be -4094 <= PC <= 4096. The range
+ is shifted one word to the right, because pc-relative instructions
+ implicitly add one word i.e. rjmp 0 jumps to next insn, not the
+ current one.
+ Therefore, for the !shrinkable case, the range is as above.
+ If shrinkable, then the current code only deletes bytes 3 and
+ 4 of the absolute call/jmp, so the forward jump range increases
+ by 2 bytes, but the backward (negative) jump range remains
+ the same. */
+
+
/* Check if the gap falls in the range that can be accommodated
in 13bits signed (It is 12bits when encoded, as we deal with
word addressing). */
- if (!shrinkable && ((int) gap >= -4096 && (int) gap <= 4095))
+ if (!shrinkable && ((int) gap >= -4094 && (int) gap <= 4096))
distance_short_enough = 1;
/* If shrinkable, then we can check for a range of distance which
- is two bytes farther on both the directions because the call
+ is two bytes farther on the positive direction because the call
or jump target will be closer by two bytes after the
relaxation. */
- else if (shrinkable && ((int) gap >= -4094 && (int) gap <= 4097))
+ else if (shrinkable && ((int) gap >= -4094 && (int) gap <= 4098))
distance_short_enough = 1;
/* Here we handle the wrap-around case. E.g. for a 16k device
+2019-05-21 Senthil Kumar Selvaraj <senthilkumar.selvaraj@microchip.com>
+
+ PR ld/24571
+ * ld/testsuite/ld-avr/relax-insn-at-range-boundary.d: New test.
+ * ld/testsuite/ld-avr/relax-insn-at-range-boundary.s: New test.
+
2019-05-21 Senthil Kumar Selvaraj <senthilkumar.selvaraj@microchip.com>
PR ld/24564
--- /dev/null
+#name: AVR relaxation, jump to symbol at ends of pc-relative range boundary
+#as: -mlink-relax -mavr51
+#ld: --relax -mavr51
+#source: relax-insn-at-range-boundary.s
+#objdump: -d
+#target: avr-*-*
+
+#...
+00000000.*
+ ...
+ ffc: 00 00 nop
+ ffe: 00 c8 rjmp .-4096 ; 0x0 .*
+ 1000: ff c7 rjmp .+4094 ; 0x2000 <forward_target>
+ ...
+
+00002000 <forward_target>:
+#...