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. See also https://github.com/openssl/openssl/pull/5431 in OpenSSL. Bug: chromium:124610 Change-Id: I5e7a0c8c0f54a3f65cc324ad599a41883675f368 Reviewed-on: https://boringssl-review.googlesource.com/26164 Commit-Queue: Steven Valdez <svaldez@google.com> Reviewed-by: Steven Valdez <svaldez@google.com> CQ-Verified: CQ bot account: commit-bot@chromium.org <commit-bot@chromium.org>
This commit is contained in:
parent
36714fc8ee
commit
672f6fc248
@ -208,7 +208,7 @@ asm_AES_encrypt:
|
|||||||
adr r3,.
|
adr r3,.
|
||||||
#endif
|
#endif
|
||||||
stmdb sp!,{r1,r4-r12,lr}
|
stmdb sp!,{r1,r4-r12,lr}
|
||||||
#ifdef __APPLE__
|
#if defined(__thumb2__) || defined(__APPLE__)
|
||||||
adr $tbl,AES_Te
|
adr $tbl,AES_Te
|
||||||
#else
|
#else
|
||||||
sub $tbl,r3,#asm_AES_encrypt-AES_Te @ Te
|
sub $tbl,r3,#asm_AES_encrypt-AES_Te @ Te
|
||||||
@ -486,7 +486,7 @@ _armv4_AES_set_encrypt_key:
|
|||||||
mov lr,r1 @ bits
|
mov lr,r1 @ bits
|
||||||
mov $key,r2 @ key
|
mov $key,r2 @ key
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#if defined(__thumb2__) || defined(__APPLE__)
|
||||||
adr $tbl,AES_Te+1024 @ Te4
|
adr $tbl,AES_Te+1024 @ Te4
|
||||||
#else
|
#else
|
||||||
sub $tbl,r3,#_armv4_AES_set_encrypt_key-AES_Te-1024 @ Te4
|
sub $tbl,r3,#_armv4_AES_set_encrypt_key-AES_Te-1024 @ Te4
|
||||||
@ -984,7 +984,7 @@ asm_AES_decrypt:
|
|||||||
adr r3,.
|
adr r3,.
|
||||||
#endif
|
#endif
|
||||||
stmdb sp!,{r1,r4-r12,lr}
|
stmdb sp!,{r1,r4-r12,lr}
|
||||||
#ifdef __APPLE__
|
#if defined(__thumb2__) || defined(__APPLE__)
|
||||||
adr $tbl,AES_Td
|
adr $tbl,AES_Td
|
||||||
#else
|
#else
|
||||||
sub $tbl,r3,#asm_AES_decrypt-AES_Td @ Td
|
sub $tbl,r3,#asm_AES_decrypt-AES_Td @ Td
|
||||||
|
@ -742,7 +742,7 @@ $code.=<<___;
|
|||||||
_bsaes_decrypt8:
|
_bsaes_decrypt8:
|
||||||
adr $const,.
|
adr $const,.
|
||||||
vldmia $key!, {@XMM[9]} @ round 0 key
|
vldmia $key!, {@XMM[9]} @ round 0 key
|
||||||
#ifdef __APPLE__
|
#if defined(__thumb2__) || defined(__APPLE__)
|
||||||
adr $const,.LM0ISR
|
adr $const,.LM0ISR
|
||||||
#else
|
#else
|
||||||
add $const,$const,#.LM0ISR-_bsaes_decrypt8
|
add $const,$const,#.LM0ISR-_bsaes_decrypt8
|
||||||
@ -841,7 +841,7 @@ _bsaes_const:
|
|||||||
_bsaes_encrypt8:
|
_bsaes_encrypt8:
|
||||||
adr $const,.
|
adr $const,.
|
||||||
vldmia $key!, {@XMM[9]} @ round 0 key
|
vldmia $key!, {@XMM[9]} @ round 0 key
|
||||||
#ifdef __APPLE__
|
#if defined(__thumb2__) || defined(__APPLE__)
|
||||||
adr $const,.LM0SR
|
adr $const,.LM0SR
|
||||||
#else
|
#else
|
||||||
sub $const,$const,#_bsaes_encrypt8-.LM0SR
|
sub $const,$const,#_bsaes_encrypt8-.LM0SR
|
||||||
@ -949,7 +949,7 @@ $code.=<<___;
|
|||||||
_bsaes_key_convert:
|
_bsaes_key_convert:
|
||||||
adr $const,.
|
adr $const,.
|
||||||
vld1.8 {@XMM[7]}, [$inp]! @ load round 0 key
|
vld1.8 {@XMM[7]}, [$inp]! @ load round 0 key
|
||||||
#ifdef __APPLE__
|
#if defined(__thumb2__) || defined(__APPLE__)
|
||||||
adr $const,.LM0
|
adr $const,.LM0
|
||||||
#else
|
#else
|
||||||
sub $const,$const,#_bsaes_key_convert-.LM0
|
sub $const,$const,#_bsaes_key_convert-.LM0
|
||||||
|
Loading…
Reference in New Issue
Block a user