Always use adr with __thumb2__.
authorDavid Benjamin <davidben@google.com>
Wed, 21 Feb 2018 23:50:21 +0000 (18:50 -0500)
committerAndy Polyakov <appro@openssl.org>
Wed, 28 Feb 2018 11:00:34 +0000 (12:00 +0100)
commitfa9ab9ee91c28b755f8fc51d4c45042e6798ce6b
tree589b8ce4d4f36df0e213a8b6e42af3d50f518b67
parent5eb9a426d953b17c377b87315d0666c86126022f
Always use adr with __thumb2__.

Thumb2 addresses are a bit a mess, depending on whether a label is
interpreted as a function pointer value (for use with BX and BLX) or as
a program counter value (for use with PC-relative addressing). Clang's
integrated assembler mis-assembles this code. See
https://crbug.com/124610#c54 for details.

Instead, use the ADR pseudo-instruction which has clear semantics and
should be supported by every assembler that handles the OpenSSL Thumb2
code. (In other files, the ADR vs SUB conditionals are based on
__thumb2__ already. For some reason, this one is based on __APPLE__, I'm
guessing to deal with an older version of clang assembler.)

It's unclear to me which of clang or binutils is "correct" or if this is
even a well-defined notion beyond "whatever binutils does". But I will
note that https://github.com/openssl/openssl/pull/4669 suggests binutils
has also changed behavior around this before.

Reviewed-by: Andy Polyakov <appro@openssl.org>
Reviewed-by: Rich Salz <rsalz@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/5431)

(cherry picked from commit 8a5d8bc4bc1e835b62d988ad63454540be83d862)
crypto/aes/asm/aes-armv4.pl
crypto/aes/asm/bsaes-armv7.pl