x86-64: special case LEA when determining signedness of displacement
authorJan Beulich <jbeulich@suse.com>
Fri, 23 Apr 2021 07:18:06 +0000 (09:18 +0200)
committerJan Beulich <jbeulich@suse.com>
Fri, 23 Apr 2021 07:18:06 +0000 (09:18 +0200)
commita9aabc23efcc810e4b1999a735ea82d409cafbe7
tree9aa375261f8a1d8360ea4b3ebef0fd5106e4849d
parentcce08655c696b771538e325065166ae8fdb7ff46
x86-64: special case LEA when determining signedness of displacement

LEA behavior without a 64-bit destination is independent of address size
- in particular LEA with 32-bit addressing and 64-bit destination is the
same as LEA with 64-bit addressing and 32-bit destination. IOW checking
merely i.prefix[ADDR_PREFIX] is insufficient. This also means wrong
relocation types (R_X86_64_32S when R_X86_64_32 is needed) were used so
far in such cases.

Note that in one case in build_modrm_byte() the 64-bit check came too
early altogether, and hence gets dropped in favor of the one included in
the new helper. This is benign to non-64-bit code from all I can tell,
but the failure to clear disp16 could have been a latent problem.
gas/ChangeLog
gas/config/tc-i386.c