+2015-06-18 Nick Clifton <nickc@redhat.com>
+
+ PR gas/18541
+ * config/tc-arm.c (md_apply_fix): Add support for ADR in thumb
+ mode against a nearby symbol.
+
2015-06-18 Nick Clifton <nickc@redhat.com>
PR gas/18481
}
else if (rs == REG_PC || rs == REG_SP)
{
+ /* PR gas/18541. If the addition is for a defined symbol
+ within range of an ADR instruction then accept it. */
+ if (subtract
+ && value == 4
+ && fixP->fx_addsy != NULL)
+ {
+ subtract = 0;
+
+ if (! S_IS_DEFINED (fixP->fx_addsy)
+ || S_GET_SEGMENT (fixP->fx_addsy) != seg
+ || S_IS_WEAK (fixP->fx_addsy))
+ {
+ as_bad_where (fixP->fx_file, fixP->fx_line,
+ _("address calculation needs a strongly defined nearby symbol"));
+ }
+ else
+ {
+ offsetT v = fixP->fx_where + fixP->fx_frag->fr_address;
+
+ /* Round up to the next 4-byte boundary. */
+ if (v & 3)
+ v = (v + 3) & ~ 3;
+ else
+ v += 4;
+ v = S_GET_VALUE (fixP->fx_addsy) - v;
+
+ if (v & ~0x3fc)
+ {
+ as_bad_where (fixP->fx_file, fixP->fx_line,
+ _("symbol too far away"));
+ }
+ else
+ {
+ fixP->fx_done = 1;
+ value = v;
+ }
+ }
+ }
+
if (subtract || value & ~0x3fc)
as_bad_where (fixP->fx_file, fixP->fx_line,
_("invalid immediate for address calculation (value = 0x%08lX)"),
+2015-06-18 Nick Clifton <nickc@redhat.com>
+
+ PR gas/18541
+ * gas/arm/thumb.s: Add test of ADR against a nearby symbol.
+ * gas/arm/thumb.d: Update expected output.
+ * gas/arm/thumb-eabi.d: Likewise.
+
2015-06-18 Nick Clifton <nickc@redhat.com>
PR gas/18481
0+942 <[^>]+> 4801 ldr r0, \[pc, #4\] ; \(0+948 <[^>]+>\)
0+944 <[^>]+> 1c08 adds r0, r1, #0
0+946 <[^>]+> 46c0 nop ; \(mov r8, r8\)
+0+948 <[^>]+> a001 add r0, pc, #4 ; \(adr r0, 00000950 <[^>]+>\)
+0+94a <[^>]+> a001 add r0, pc, #4 ; \(adr r0, 00000950 <[^>]+>\)
+0+94c <[^>]+> a000 add r0, pc, #0 ; \(adr r0, 00000950 <[^>]+>\)
+0+94e <[^>]+> 46c0 nop ; \(mov r8, r8\)
+#pass
0+942 <[^>]+> 4801 ldr r0, \[pc, #4\] ; \(0+948 <[^>]+>\)
0+944 <[^>]+> 1c08 adds r0, r1, #0
0+946 <[^>]+> 46c0 nop ; \(mov r8, r8\)
+0+948 <[^>]+> a001 add r0, pc, #4 ; \(adr r0, 00000950 <[^>]+>\)
+0+94a <[^>]+> a001 add r0, pc, #4 ; \(adr r0, 00000950 <[^>]+>\)
+0+94c <[^>]+> a000 add r0, pc, #0 ; \(adr r0, 00000950 <[^>]+>\)
+0+94e <[^>]+> 46c0 nop ; \(mov r8, r8\)
+#pass
baz:
mov r0, r1
nop
+
+ adr r0, pr18541
+ adr r0, pr18541
+ adr r0, pr18541
+ nop
+ .align
+ .global pr18541
+pr18541:
+ .long 0
+