aarch64: Fix bogus type punning in parse_barrier() [PR26699]
authorAlex Coplan <alex.coplan@arm.com>
Tue, 6 Oct 2020 14:56:44 +0000 (15:56 +0100)
committerAlex Coplan <alex.coplan@arm.com>
Tue, 6 Oct 2020 14:56:44 +0000 (15:56 +0100)
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
gas/config/tc-aarch64.c
gas/testsuite/gas/aarch64/system.d
gas/testsuite/gas/aarch64/system.s

index 30019327d65b399ad24cfad595ba6c604f88cd22..26cae9c15d4c1fe0f5bcb92090d4ed0b63315f04 100644 (file)
@@ -1,3 +1,11 @@
+2020-10-06  Alex Coplan  <alex.coplan@arm.com>
+
+       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  <sergey.belyashov@gmail.com>
 
        PR 26692
index 4bcfa053f755f0d30bdeb15cf15903424c13a8de..fac571ea5734d3fe741ba0dd0d66d288caf9d45f 100644 (file)
@@ -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))
index 20d5c2040942efbb78e758851ecaf95c30091d09..c973584af59e555ed71999eea1401f9ec713a795 100644 (file)
@@ -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 <LABEL1>
index 9d86f66806a05c3d0f6108307e78c34c36e7e060..6f494f885a648652d998463c0abf51f17da76b38 100644 (file)
@@ -44,6 +44,7 @@
        all_barriers    op=isb, from=0, to=15
 
        isb
+       isb sy
        ssbb
        pssbb