diff options
author | Nick Clifton <nickc@redhat.com> | 2000-03-17 22:12:08 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2000-03-17 22:12:08 +0000 |
commit | 43f0557653880cb719739df472b62a33cd173126 (patch) | |
tree | 0679a9cdffdfed1f50f3504b8c390d918c771dc2 /gas | |
parent | 1cc26dd06aeda2ee10bfea1b4db511a101b5b545 (diff) | |
download | gdb-43f0557653880cb719739df472b62a33cd173126.zip gdb-43f0557653880cb719739df472b62a33cd173126.tar.gz gdb-43f0557653880cb719739df472b62a33cd173126.tar.bz2 |
Fix adr pseudo op for Thumb.
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 8 | ||||
-rw-r--r-- | gas/config/tc-arm.c | 19 |
2 files changed, 20 insertions, 7 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 4b10a7b..02bcb95 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,11 @@ +2000-03-17 Thomas de Lellis <tdel@windriver.com> + + * config/tc-arm.c (do_t_adr): Flag "adr Rd,label" + instruction operand bad if Rd > 7 when generating + thumb instructions. Prevents for example, + "adr r12,label" from silently failing and generating + the wrong instruction. + 2000-03-17 Nick Clifton <nickc@cygnus.com> * config/tc-arm.c (md_apply_fix3): Handle same-section relocations diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c index 57f8faa..58dd3cf 100644 --- a/gas/config/tc-arm.c +++ b/gas/config/tc-arm.c @@ -2642,8 +2642,7 @@ do_adr (str, flags) unsigned long flags; { /* This is a pseudo-op of the form "adr rd, label" to be converted - into a relative address of the form "add rd, pc, #label-.-8" */ - + into a relative address of the form "add rd, pc, #label-.-8". */ skip_whitespace (str); if (reg_required_here (&str, 12) == FAIL @@ -2654,10 +2653,11 @@ do_adr (str, flags) inst.error = BAD_ARGS; return; } + /* Frag hacking will turn this into a sub instruction if the offset turns out to be negative. */ inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE; - inst.reloc.exp.X_add_number -= 8; /* PC relative adjust */ + inst.reloc.exp.X_add_number -= 8; /* PC relative adjust. */ inst.reloc.pc_rel = 1; inst.instruction |= flags; end_of_line (str); @@ -4905,11 +4905,15 @@ static void do_t_adr (str) char * str; { + int reg; + /* This is a pseudo-op of the form "adr rd, label" to be converted - into a relative address of the form "add rd, pc, #label-.-4" */ + into a relative address of the form "add rd, pc, #label-.-4". */ skip_whitespace (str); - if (reg_required_here (&str, 4) == FAIL /* Store Rd in temporary location inside instruction. */ + /* Store Rd in temporary location inside instruction. */ + if ((reg = reg_required_here (&str, 4)) == FAIL + || (reg > 7) /* For Thumb reg must be r0..r7. */ || skip_past_comma (&str) == FAIL || my_get_expression (&inst.reloc.exp, &str)) { @@ -4919,9 +4923,10 @@ do_t_adr (str) } inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD; - inst.reloc.exp.X_add_number -= 4; /* PC relative adjust */ + inst.reloc.exp.X_add_number -= 4; /* PC relative adjust. */ inst.reloc.pc_rel = 1; - inst.instruction |= REG_PC; /* Rd is already placed into the instruction */ + inst.instruction |= REG_PC; /* Rd is already placed into the instruction. */ + end_of_line (str); } |