From 05cfb0d8cc9b7f8676f5ae55a93642f091d5405f Mon Sep 17 00:00:00 2001 From: Alex Coplan Date: Tue, 6 Oct 2020 15:56:44 +0100 Subject: [PATCH] aarch64: Fix bogus type punning in parse_barrier() [PR26699] This patch fixes a bogus use of type punning in parse_barrier() which was causing an assembly failure on big endian LP64 hosts when attempting to assemble "isb sy" for AArch64. The type of the entries in aarch64_barrier_opt_hsh is aarch64_name_value_pair. We were incorrectly casting this to the locally-defined asm_barrier_opt which has a wider type (on LP64) for the second member. This happened to work on little-endian hosts but fails on LP64 big endian. The fix is to use the correct type in parse_barrier(). This makes the locally-defined asm_barrier_opt redundant, so remove it. gas/ChangeLog: * config/tc-aarch64.c (asm_barrier_opt): Delete. (parse_barrier): Fix bogus type punning. * testsuite/gas/aarch64/system.d: Update disassembly. * testsuite/gas/aarch64/system.s: Add isb sy test. --- gas/ChangeLog | 8 ++++++++ gas/config/tc-aarch64.c | 8 +------- gas/testsuite/gas/aarch64/system.d | 1 + gas/testsuite/gas/aarch64/system.s | 1 + 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index 30019327d6..26cae9c15d 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,11 @@ +2020-10-06 Alex Coplan + + PR 26699 + * config/tc-aarch64.c (asm_barrier_opt): Delete. + (parse_barrier): Fix bogus type punning. + * testsuite/gas/aarch64/system.d: Update disassembly. + * testsuite/gas/aarch64/system.s: Add isb sy test. + 2020-10-06 Sergey Belyashav PR 26692 diff --git a/gas/config/tc-aarch64.c b/gas/config/tc-aarch64.c index 4bcfa053f7..fac571ea57 100644 --- a/gas/config/tc-aarch64.c +++ b/gas/config/tc-aarch64.c @@ -247,12 +247,6 @@ set_fatal_syntax_error (const char *error) present. */ #define COND_ALWAYS 0x10 -typedef struct -{ - const char *template; - unsigned long value; -} asm_barrier_opt; - typedef struct { const char *template; @@ -3993,7 +3987,7 @@ static int parse_barrier (char **str) { char *p, *q; - const asm_barrier_opt *o; + const struct aarch64_name_value_pair *o; p = q = *str; while (ISALPHA (*q)) diff --git a/gas/testsuite/gas/aarch64/system.d b/gas/testsuite/gas/aarch64/system.d index 20d5c20409..c973584af5 100644 --- a/gas/testsuite/gas/aarch64/system.d +++ b/gas/testsuite/gas/aarch64/system.d @@ -190,6 +190,7 @@ Disassembly of section \.text: .*: d5033edf isb #0xe .*: d5033fdf isb .*: d5033fdf isb +.*: d5033fdf isb .*: d503309f ssbb .*: d503349f pssbb .*: d8000000 prfm pldl1keep, 0 diff --git a/gas/testsuite/gas/aarch64/system.s b/gas/testsuite/gas/aarch64/system.s index 9d86f66806..6f494f885a 100644 --- a/gas/testsuite/gas/aarch64/system.s +++ b/gas/testsuite/gas/aarch64/system.s @@ -44,6 +44,7 @@ all_barriers op=isb, from=0, to=15 isb + isb sy ssbb pssbb -- 2.34.1