Add support for using the ADR alias in Thumb mode against nearby symbols.
PR gas/18541 gas * config/tc-arm.c (md_apply_fix): Add support for ADR in thumb mode against a nearby symbol. tests * 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.
This commit is contained in:
parent
75c1199967
commit
c12d2c9d48
6 changed files with 72 additions and 0 deletions
|
@ -1,3 +1,9 @@
|
|||
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
|
||||
|
|
|
@ -23158,6 +23158,45 @@ md_apply_fix (fixS * fixP,
|
|||
}
|
||||
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)"),
|
||||
|
|
|
@ -1,3 +1,10 @@
|
|||
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
|
||||
|
|
|
@ -163,3 +163,8 @@ Disassembly of section \.text:
|
|||
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
|
||||
|
|
|
@ -163,3 +163,8 @@ Disassembly of section \.text:
|
|||
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
|
||||
|
|
|
@ -201,3 +201,13 @@ forwardonly:
|
|||
baz:
|
||||
mov r0, r1
|
||||
nop
|
||||
|
||||
adr r0, pr18541
|
||||
adr r0, pr18541
|
||||
adr r0, pr18541
|
||||
nop
|
||||
.align
|
||||
.global pr18541
|
||||
pr18541:
|
||||
.long 0
|
||||
|
||||
|
|
Loading…
Reference in a new issue