diff options
author | Paul Brook <paul@codesourcery.com> | 2007-08-09 15:11:07 +0000 |
---|---|---|
committer | Paul Brook <paul@codesourcery.com> | 2007-08-09 15:11:07 +0000 |
commit | 4396b6862a60b1add68552ddac6b8d68513e51e8 (patch) | |
tree | b3067ab462af1852ae9dcc78e489a7e20d524769 /gas/config/tc-arm.c | |
parent | c309eac2074a11c52d122e543d197103c6020f6c (diff) | |
download | gdb-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.c | 26 |
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; } |