aboutsummaryrefslogtreecommitdiff
path: root/gas/config/tc-arm.c
diff options
context:
space:
mode:
authorPaul Brook <paul@codesourcery.com>2007-08-09 15:11:07 +0000
committerPaul Brook <paul@codesourcery.com>2007-08-09 15:11:07 +0000
commit4396b6862a60b1add68552ddac6b8d68513e51e8 (patch)
treeb3067ab462af1852ae9dcc78e489a7e20d524769 /gas/config/tc-arm.c
parentc309eac2074a11c52d122e543d197103c6020f6c (diff)
downloadgdb-4396b6862a60b1add68552ddac6b8d68513e51e8.zip
gdb-4396b6862a60b1add68552ddac6b8d68513e51e8.tar.gz
gdb-4396b6862a60b1add68552ddac6b8d68513e51e8.tar.bz2
2007-08-09 Paul Brook <paul@codesourcery.com>
gas/ * config/tc-arm.c (relaxed_symbol_addr): Compensate for alignment. gas/testsuite/ * gas/arm/relax_load_align.d: new test. * gas/arm/relax_load_align.s: new test.
Diffstat (limited to 'gas/config/tc-arm.c')
-rw-r--r--gas/config/tc-arm.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c
index 82562d7..117fe16 100644
--- a/gas/config/tc-arm.c
+++ b/gas/config/tc-arm.c
@@ -16787,7 +16787,31 @@ relaxed_symbol_addr(fragS *fragp, long stretch)
if (stretch != 0
&& sym_frag->relax_marker != fragp->relax_marker)
- addr += stretch;
+ {
+ fragS *f;
+
+ /* Adjust stretch for any alignment frag. Note that if have
+ been expanding the earlier code, the symbol may be
+ defined in what appears to be an earlier frag. FIXME:
+ This doesn't handle the fr_subtype field, which specifies
+ a maximum number of bytes to skip when doing an
+ alignment. */
+ for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
+ {
+ if (f->fr_type == rs_align || f->fr_type == rs_align_code)
+ {
+ if (stretch < 0)
+ stretch = - ((- stretch)
+ & ~ ((1 << (int) f->fr_offset) - 1));
+ else
+ stretch &= ~ ((1 << (int) f->fr_offset) - 1);
+ if (stretch == 0)
+ break;
+ }
+ }
+ if (f != NULL)
+ addr += stretch;
+ }
return addr;
}