public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* [PATCH v2][Binutils][GAS] arm: Use DWARF numbering convention for pseudo-register representation
@ 2022-07-28 15:44 Victor Do Nascimento
  2022-07-29 14:09 ` Richard Earnshaw
  0 siblings, 1 reply; 2+ messages in thread
From: Victor Do Nascimento @ 2022-07-28 15:44 UTC (permalink / raw)
  To: binutils; +Cc: richard.earnshaw, Victor Do Nascimento

Hi all,

This patch modifies the internal `struct reg_entry' numbering of DWARF
pseudo-registers to match values assigned in DWARF standards (see "4.1
DWARF register names" in [1])  and amends the unwinder .save
directive-processing code to correctly handle mixed register-type save
directives.

The mechanism for splitting the register list is re-written to comply
with register ordering on push statements, being that registers are
stored on the stack in numerical order, with the lowest numbered
register at the lowest address [2].

Consequently, the parsing of the hypothetical directive

        .save{r4-r7, r10, ra_auth_core, lr}

has been changed such as rather than producing

        .save{r4-r7, r10}
        .save{ra_auth_code}
        .save{lr}

as was the case with previous implementation, now produces:

        .save{lr}
        .save{ra_auth_code}
        .save{r4-r7, r10}

Tested for arm-none-eabi on x86_64 and aarch64 hosts.

Best regards,
Victor

[1] <https://github.com/ARM-software/abi-aa/blob/main/aadwarf32/aadwarf32.rst>
[2] <https://developer.arm.com/documentation/dui0473/j/arm-and-thumb-instructions/push>

gas/Changelog:

  * config/tc-arm.c (REG_RA_AUTH_CODE): New.
  (parse_dot_save): Likewise.
  (parse_reg_list): Remove obsolete code.
  (reg_names): set ra_auth_code to 143.
  (s_arm_unwind_save): Handle core and pseudo-register lists via
  parse_dot_save.
  (s_arm_unwind_save_mixed): Deleted.
  (s_arm_unwind_save_pseudo): Handle 1 register at a time.
  * testsuite/gas/arm/unwind-pacbti-m-readelf.d: Fix test.
  * testsuite/gas/arm/unwind-pacbti-m.d: Likewise.
---
 gas/config/tc-arm.c                           | 160 ++++++++++--------
 .../gas/arm/unwind-pacbti-m-readelf.d         |   4 +-
 gas/testsuite/gas/arm/unwind-pacbti-m.d       |   2 +-
 3 files changed, 96 insertions(+), 70 deletions(-)

diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c
index 2e6d175482e..f2e7f73cc2d 100644
--- a/gas/config/tc-arm.c
+++ b/gas/config/tc-arm.c
@@ -742,6 +742,7 @@ const char * const reg_expected_msgs[] =
 #define REG_SP	13
 #define REG_LR	14
 #define REG_PC	15
+#define REG_RA_AUTH_CODE 143
 
 /* ARM instructions take 4bytes in the object file, Thumb instructions
    take 2:  */
@@ -1943,21 +1944,6 @@ parse_reg_list (char ** strp, enum reg_list_els etype)
 
 	      reg = arm_reg_parse (&str, rt);
 
-	      /* Skip over allowed registers of alternative types in mixed-type
-	         register lists.  */
-	      if (reg == FAIL && rt == REG_TYPE_PSEUDO
-		  && ((reg = arm_reg_parse (&str, REG_TYPE_RN)) != FAIL))
-		{
-		  cur_reg = reg;
-		  continue;
-		}
-	      else if (reg == FAIL && rt == REG_TYPE_RN
-		       && ((reg = arm_reg_parse (&str, REG_TYPE_PSEUDO)) != FAIL))
-		{
-		  cur_reg = reg;
-		  continue;
-		}
-
 	      if (etype == REGLIST_CLRM)
 		{
 		  if (reg == REG_SP || reg == REG_PC)
@@ -4139,7 +4125,6 @@ s_arm_unwind_fnstart (int ignored ATTRIBUTE_UNUSED)
   unwind.sp_restored = 0;
 }
 
-
 /* Parse a handlerdata directive.  Creates the exception handling table entry
    for the function.  */
 
@@ -4297,15 +4282,19 @@ s_arm_unwind_personality (int ignored ATTRIBUTE_UNUSED)
 /* Parse a directive saving pseudo registers.  */
 
 static void
-s_arm_unwind_save_pseudo (long range)
+s_arm_unwind_save_pseudo (int regno)
 {
   valueT op;
 
-  if (range & (1 << 12))
+  switch (regno)
     {
+    case REG_RA_AUTH_CODE:
       /* Opcode for restoring RA_AUTH_CODE.  */
       op = 0xb4;
       add_unwind_opcode (op, 1);
+      break;
+    default:
+      as_bad (_("Unknown register no. encountered: %d\n"), regno);
     }
 }
 
@@ -4375,6 +4364,81 @@ s_arm_unwind_save_core (long range)
     }
 }
 
+/* Implement correct handling of .save lists enabling the split into
+sublists where necessary, while preserving correct sublist ordering.  */
+
+static void
+parse_dot_save (char **str_p, int prev_reg)
+{
+  long core_regs = 0;
+  int reg;
+  int in_range = 0;
+
+  if (**str_p == ',')
+    *str_p += 1;
+  if (**str_p == '}')
+    {
+      *str_p += 1;
+      return;
+    }
+
+  while ((reg = arm_reg_parse (str_p, REG_TYPE_RN)) != FAIL)
+    {
+      if (!in_range)
+	{
+	  if (core_regs & (1 << reg))
+	    as_tsktsk (_("Warning: duplicated register (r%d) in register list"),
+		       reg);
+	  else if (reg <= prev_reg)
+	    as_tsktsk (_("Warning: register list not in ascending order"));
+
+	  core_regs |= (1 << reg);
+	  prev_reg = reg;
+	  if (skip_past_char (str_p, '-') != FAIL)
+	      in_range = 1;
+	  else if (skip_past_comma (str_p) == FAIL)
+	    first_error (_("bad register list"));
+	}
+      else
+	{
+	  int i;
+	  if (reg <= prev_reg)
+	    first_error (_("bad range in register list"));
+	  for (i = prev_reg + 1; i <= reg; i++)
+	    {
+	      if (core_regs & (1 << i))
+		as_tsktsk (_("Warning: duplicated register (r%d) in register list"),
+			   i);
+	      else
+		core_regs |= 1 << i;
+	    }
+	  in_range = 0;
+	}
+    }
+  if (core_regs)
+    {
+      /* Higher register numbers go in higher memory addresses.  When splitting
+	 a list, right-most sublist should therefore be .saved first: use
+	 recursion for this.  */
+      parse_dot_save (str_p, reg);
+      /* We're back from recursion, so emit .save insn for sublist.  */
+      s_arm_unwind_save_core (core_regs);
+      return;
+    }
+  /* Handle pseudo-regs, under assumption these are emitted singly.  */
+  else if ((reg = arm_reg_parse (str_p, REG_TYPE_PSEUDO)) != FAIL)
+    {
+      /* Recurse for remainder of input.  Note: No assumption is made regarding
+	 which register in core register set holds pseudo-register, thus it's
+	 not considered in ordering check beyond ensuring it's not sandwiched
+	 between 2 consecutive registers.  */
+      parse_dot_save (str_p, prev_reg + 1);
+      s_arm_unwind_save_pseudo (reg);
+      return;
+    }
+  else
+    as_bad (BAD_SYNTAX);
+}
 
 /* Parse a directive saving FPA registers.  */
 
@@ -4716,39 +4780,13 @@ s_arm_unwind_save_mmxwcg (void)
   ignore_rest_of_line ();
 }
 
-/* Convert range and mask_range into a sequence of s_arm_unwind_core
-   and s_arm_unwind_pseudo operations.  We assume that mask_range will
-   not have consecutive bits set, or that one operation per bit is
-   acceptable.  */
-
-static void
-s_arm_unwind_save_mixed (long range, long mask_range)
-{
-  while (mask_range)
-    {
-      long mask_bit = mask_range & -mask_range;
-      long subrange = range & (mask_bit - 1);
-
-      if (subrange)
-	s_arm_unwind_save_core (subrange);
-
-      s_arm_unwind_save_pseudo (mask_bit);
-      range &= ~subrange;
-      mask_range &= ~mask_bit;
-    }
-
-  if (range)
-    s_arm_unwind_save_core (range);
-}
-
 /* Parse an unwind_save directive.
    If the argument is non-zero, this is a .vsave directive.  */
 
 static void
 s_arm_unwind_save (int arch_v6)
 {
-  char *peek, *mask_peek;
-  long range, mask_range;
+  char *peek;
   struct reg_entry *reg;
   bool had_brace = false;
 
@@ -4756,7 +4794,7 @@ s_arm_unwind_save (int arch_v6)
     as_bad (MISSING_FNSTART);
 
   /* Figure out what sort of save we have.  */
-  peek = mask_peek = input_line_pointer;
+  peek = input_line_pointer;
 
   if (*peek == '{')
     {
@@ -4788,20 +4826,13 @@ s_arm_unwind_save (int arch_v6)
 
     case REG_TYPE_PSEUDO:
     case REG_TYPE_RN:
-      mask_range = parse_reg_list (&mask_peek, REGLIST_PSEUDO);
-      range = parse_reg_list (&input_line_pointer, REGLIST_RN);
-
-      if (range == FAIL || mask_range == FAIL)
-	{
-	  as_bad (_("expected register list"));
-	  ignore_rest_of_line ();
-	  return;
-	}
-
-      demand_empty_rest_of_line ();
-
-      s_arm_unwind_save_mixed (range, mask_range);
-      return;
+      {
+	if (had_brace)
+	  input_line_pointer++;
+	parse_dot_save (&input_line_pointer, -1);
+	demand_empty_rest_of_line ();
+	return;
+      }
 
     case REG_TYPE_VFD:
       if (arch_v6)
@@ -23993,12 +24024,8 @@ static const struct reg_entry reg_names[] =
   /* XScale accumulator registers.  */
   REGNUM(acc,0,XSCALE), REGNUM(ACC,0,XSCALE),
 
-  /* DWARF ABI defines RA_AUTH_CODE to 143. It also reserves 134-142 for future
-     expansion.  RA_AUTH_CODE here is given the value 143 % 134 to make it easy
-     for tc_arm_regname_to_dw2regnum to translate to DWARF reg number using
-     134 + reg_number should the range 134 to 142 be used for more pseudo regs
-     in the future.  This also helps fit RA_AUTH_CODE into a bitmask.  */
-  REGDEF(ra_auth_code,12,PSEUDO),
+  /* DWARF ABI defines RA_AUTH_CODE to 143.  */
+  REGDEF(ra_auth_code,143,PSEUDO),
 };
 #undef REGDEF
 #undef REGNUM
@@ -27905,7 +27932,6 @@ create_unwind_entry (int have_data)
   return 0;
 }
 
-
 /* Initialize the DWARF-2 unwind information for this procedure.  */
 
 void
diff --git a/gas/testsuite/gas/arm/unwind-pacbti-m-readelf.d b/gas/testsuite/gas/arm/unwind-pacbti-m-readelf.d
index d8d647bb7f0..c40544a5a94 100644
--- a/gas/testsuite/gas/arm/unwind-pacbti-m-readelf.d
+++ b/gas/testsuite/gas/arm/unwind-pacbti-m-readelf.d
@@ -10,11 +10,11 @@ Unwind section '.ARM.exidx' at offset 0x60 contains 1 entry:
 
 0x0 <foo>: @0x0
   Compact model index: 1
-  0x84 0x00 pop {r14}
   0xb4      pop {ra_auth_code}
   0x84 0x00 pop {r14}
-  0xb4      pop {ra_auth_code}
   0xa3      pop {r4, r5, r6, r7}
   0xb4      pop {ra_auth_code}
+  0x84 0x00 pop {r14}
+  0xb4      pop {ra_auth_code}
   0xa8      pop {r4, r14}
   0xb0      finish
diff --git a/gas/testsuite/gas/arm/unwind-pacbti-m.d b/gas/testsuite/gas/arm/unwind-pacbti-m.d
index d178e4c0a44..b021c007b33 100644
--- a/gas/testsuite/gas/arm/unwind-pacbti-m.d
+++ b/gas/testsuite/gas/arm/unwind-pacbti-m.d
@@ -8,4 +8,4 @@
 .*:     file format.*
 
 Contents of section .ARM.extab:
- 0000 (00840281 b40084b4 b0a8b4a3|81028400 b48400b4 a3b4a8b0) 00000000  .*
+ 0000 (84b40281 84b4a300 b0a8b400|8102b484 00a3b484 00b4a8b0) 00000000  .*
-- 
2.36.1


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH v2][Binutils][GAS] arm: Use DWARF numbering convention for pseudo-register representation
  2022-07-28 15:44 [PATCH v2][Binutils][GAS] arm: Use DWARF numbering convention for pseudo-register representation Victor Do Nascimento
@ 2022-07-29 14:09 ` Richard Earnshaw
  0 siblings, 0 replies; 2+ messages in thread
From: Richard Earnshaw @ 2022-07-29 14:09 UTC (permalink / raw)
  To: Victor Do Nascimento, binutils; +Cc: richard.earnshaw



On 28/07/2022 16:44, Victor Do Nascimento via Binutils wrote:
> Hi all,
> 
> This patch modifies the internal `struct reg_entry' numbering of DWARF
> pseudo-registers to match values assigned in DWARF standards (see "4.1
> DWARF register names" in [1])  and amends the unwinder .save
> directive-processing code to correctly handle mixed register-type save
> directives.
> 
> The mechanism for splitting the register list is re-written to comply
> with register ordering on push statements, being that registers are
> stored on the stack in numerical order, with the lowest numbered
> register at the lowest address [2].
> 
> Consequently, the parsing of the hypothetical directive
> 
>          .save{r4-r7, r10, ra_auth_core, lr}
> 
> has been changed such as rather than producing
> 
>          .save{r4-r7, r10}
>          .save{ra_auth_code}
>          .save{lr}
> 
> as was the case with previous implementation, now produces:
> 
>          .save{lr}
>          .save{ra_auth_code}
>          .save{r4-r7, r10}
> 
> Tested for arm-none-eabi on x86_64 and aarch64 hosts.
> 
> Best regards,
> Victor
> 
> [1] <https://github.com/ARM-software/abi-aa/blob/main/aadwarf32/aadwarf32.rst>
> [2] <https://developer.arm.com/documentation/dui0473/j/arm-and-thumb-instructions/push>
> 
> gas/Changelog:
> 
>    * config/tc-arm.c (REG_RA_AUTH_CODE): New.
>    (parse_dot_save): Likewise.
>    (parse_reg_list): Remove obsolete code.
>    (reg_names): set ra_auth_code to 143.

s/set/Set/

>    (s_arm_unwind_save): Handle core and pseudo-register lists via
>    parse_dot_save.
>    (s_arm_unwind_save_mixed): Deleted.
>    (s_arm_unwind_save_pseudo): Handle 1 register at a time.
s/1/one/
>    * testsuite/gas/arm/unwind-pacbti-m-readelf.d: Fix test.
>    * testsuite/gas/arm/unwind-pacbti-m.d: Likewise.
> ---
>   gas/config/tc-arm.c                           | 160 ++++++++++--------
>   .../gas/arm/unwind-pacbti-m-readelf.d         |   4 +-
>   gas/testsuite/gas/arm/unwind-pacbti-m.d       |   2 +-
>   3 files changed, 96 insertions(+), 70 deletions(-)
> 

Otherwise OK.

R.

> diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c
> index 2e6d175482e..f2e7f73cc2d 100644
> --- a/gas/config/tc-arm.c
> +++ b/gas/config/tc-arm.c
> @@ -742,6 +742,7 @@ const char * const reg_expected_msgs[] =
>   #define REG_SP	13
>   #define REG_LR	14
>   #define REG_PC	15
> +#define REG_RA_AUTH_CODE 143
>   
>   /* ARM instructions take 4bytes in the object file, Thumb instructions
>      take 2:  */
> @@ -1943,21 +1944,6 @@ parse_reg_list (char ** strp, enum reg_list_els etype)
>   
>   	      reg = arm_reg_parse (&str, rt);
>   
> -	      /* Skip over allowed registers of alternative types in mixed-type
> -	         register lists.  */
> -	      if (reg == FAIL && rt == REG_TYPE_PSEUDO
> -		  && ((reg = arm_reg_parse (&str, REG_TYPE_RN)) != FAIL))
> -		{
> -		  cur_reg = reg;
> -		  continue;
> -		}
> -	      else if (reg == FAIL && rt == REG_TYPE_RN
> -		       && ((reg = arm_reg_parse (&str, REG_TYPE_PSEUDO)) != FAIL))
> -		{
> -		  cur_reg = reg;
> -		  continue;
> -		}
> -
>   	      if (etype == REGLIST_CLRM)
>   		{
>   		  if (reg == REG_SP || reg == REG_PC)
> @@ -4139,7 +4125,6 @@ s_arm_unwind_fnstart (int ignored ATTRIBUTE_UNUSED)
>     unwind.sp_restored = 0;
>   }
>   
> -
>   /* Parse a handlerdata directive.  Creates the exception handling table entry
>      for the function.  */
>   
> @@ -4297,15 +4282,19 @@ s_arm_unwind_personality (int ignored ATTRIBUTE_UNUSED)
>   /* Parse a directive saving pseudo registers.  */
>   
>   static void
> -s_arm_unwind_save_pseudo (long range)
> +s_arm_unwind_save_pseudo (int regno)
>   {
>     valueT op;
>   
> -  if (range & (1 << 12))
> +  switch (regno)
>       {
> +    case REG_RA_AUTH_CODE:
>         /* Opcode for restoring RA_AUTH_CODE.  */
>         op = 0xb4;
>         add_unwind_opcode (op, 1);
> +      break;
> +    default:
> +      as_bad (_("Unknown register no. encountered: %d\n"), regno);
>       }
>   }
>   
> @@ -4375,6 +4364,81 @@ s_arm_unwind_save_core (long range)
>       }
>   }
>   
> +/* Implement correct handling of .save lists enabling the split into
> +sublists where necessary, while preserving correct sublist ordering.  */
> +
> +static void
> +parse_dot_save (char **str_p, int prev_reg)
> +{
> +  long core_regs = 0;
> +  int reg;
> +  int in_range = 0;
> +
> +  if (**str_p == ',')
> +    *str_p += 1;
> +  if (**str_p == '}')
> +    {
> +      *str_p += 1;
> +      return;
> +    }
> +
> +  while ((reg = arm_reg_parse (str_p, REG_TYPE_RN)) != FAIL)
> +    {
> +      if (!in_range)
> +	{
> +	  if (core_regs & (1 << reg))
> +	    as_tsktsk (_("Warning: duplicated register (r%d) in register list"),
> +		       reg);
> +	  else if (reg <= prev_reg)
> +	    as_tsktsk (_("Warning: register list not in ascending order"));
> +
> +	  core_regs |= (1 << reg);
> +	  prev_reg = reg;
> +	  if (skip_past_char (str_p, '-') != FAIL)
> +	      in_range = 1;
> +	  else if (skip_past_comma (str_p) == FAIL)
> +	    first_error (_("bad register list"));
> +	}
> +      else
> +	{
> +	  int i;
> +	  if (reg <= prev_reg)
> +	    first_error (_("bad range in register list"));
> +	  for (i = prev_reg + 1; i <= reg; i++)
> +	    {
> +	      if (core_regs & (1 << i))
> +		as_tsktsk (_("Warning: duplicated register (r%d) in register list"),
> +			   i);
> +	      else
> +		core_regs |= 1 << i;
> +	    }
> +	  in_range = 0;
> +	}
> +    }
> +  if (core_regs)
> +    {
> +      /* Higher register numbers go in higher memory addresses.  When splitting
> +	 a list, right-most sublist should therefore be .saved first: use
> +	 recursion for this.  */
> +      parse_dot_save (str_p, reg);
> +      /* We're back from recursion, so emit .save insn for sublist.  */
> +      s_arm_unwind_save_core (core_regs);
> +      return;
> +    }
> +  /* Handle pseudo-regs, under assumption these are emitted singly.  */
> +  else if ((reg = arm_reg_parse (str_p, REG_TYPE_PSEUDO)) != FAIL)
> +    {
> +      /* Recurse for remainder of input.  Note: No assumption is made regarding
> +	 which register in core register set holds pseudo-register, thus it's
> +	 not considered in ordering check beyond ensuring it's not sandwiched
> +	 between 2 consecutive registers.  */
> +      parse_dot_save (str_p, prev_reg + 1);
> +      s_arm_unwind_save_pseudo (reg);
> +      return;
> +    }
> +  else
> +    as_bad (BAD_SYNTAX);
> +}
>   
>   /* Parse a directive saving FPA registers.  */
>   
> @@ -4716,39 +4780,13 @@ s_arm_unwind_save_mmxwcg (void)
>     ignore_rest_of_line ();
>   }
>   
> -/* Convert range and mask_range into a sequence of s_arm_unwind_core
> -   and s_arm_unwind_pseudo operations.  We assume that mask_range will
> -   not have consecutive bits set, or that one operation per bit is
> -   acceptable.  */
> -
> -static void
> -s_arm_unwind_save_mixed (long range, long mask_range)
> -{
> -  while (mask_range)
> -    {
> -      long mask_bit = mask_range & -mask_range;
> -      long subrange = range & (mask_bit - 1);
> -
> -      if (subrange)
> -	s_arm_unwind_save_core (subrange);
> -
> -      s_arm_unwind_save_pseudo (mask_bit);
> -      range &= ~subrange;
> -      mask_range &= ~mask_bit;
> -    }
> -
> -  if (range)
> -    s_arm_unwind_save_core (range);
> -}
> -
>   /* Parse an unwind_save directive.
>      If the argument is non-zero, this is a .vsave directive.  */
>   
>   static void
>   s_arm_unwind_save (int arch_v6)
>   {
> -  char *peek, *mask_peek;
> -  long range, mask_range;
> +  char *peek;
>     struct reg_entry *reg;
>     bool had_brace = false;
>   
> @@ -4756,7 +4794,7 @@ s_arm_unwind_save (int arch_v6)
>       as_bad (MISSING_FNSTART);
>   
>     /* Figure out what sort of save we have.  */
> -  peek = mask_peek = input_line_pointer;
> +  peek = input_line_pointer;
>   
>     if (*peek == '{')
>       {
> @@ -4788,20 +4826,13 @@ s_arm_unwind_save (int arch_v6)
>   
>       case REG_TYPE_PSEUDO:
>       case REG_TYPE_RN:
> -      mask_range = parse_reg_list (&mask_peek, REGLIST_PSEUDO);
> -      range = parse_reg_list (&input_line_pointer, REGLIST_RN);
> -
> -      if (range == FAIL || mask_range == FAIL)
> -	{
> -	  as_bad (_("expected register list"));
> -	  ignore_rest_of_line ();
> -	  return;
> -	}
> -
> -      demand_empty_rest_of_line ();
> -
> -      s_arm_unwind_save_mixed (range, mask_range);
> -      return;
> +      {
> +	if (had_brace)
> +	  input_line_pointer++;
> +	parse_dot_save (&input_line_pointer, -1);
> +	demand_empty_rest_of_line ();
> +	return;
> +      }
>   
>       case REG_TYPE_VFD:
>         if (arch_v6)
> @@ -23993,12 +24024,8 @@ static const struct reg_entry reg_names[] =
>     /* XScale accumulator registers.  */
>     REGNUM(acc,0,XSCALE), REGNUM(ACC,0,XSCALE),
>   
> -  /* DWARF ABI defines RA_AUTH_CODE to 143. It also reserves 134-142 for future
> -     expansion.  RA_AUTH_CODE here is given the value 143 % 134 to make it easy
> -     for tc_arm_regname_to_dw2regnum to translate to DWARF reg number using
> -     134 + reg_number should the range 134 to 142 be used for more pseudo regs
> -     in the future.  This also helps fit RA_AUTH_CODE into a bitmask.  */
> -  REGDEF(ra_auth_code,12,PSEUDO),
> +  /* DWARF ABI defines RA_AUTH_CODE to 143.  */
> +  REGDEF(ra_auth_code,143,PSEUDO),
>   };
>   #undef REGDEF
>   #undef REGNUM
> @@ -27905,7 +27932,6 @@ create_unwind_entry (int have_data)
>     return 0;
>   }
>   
> -
>   /* Initialize the DWARF-2 unwind information for this procedure.  */
>   
>   void
> diff --git a/gas/testsuite/gas/arm/unwind-pacbti-m-readelf.d b/gas/testsuite/gas/arm/unwind-pacbti-m-readelf.d
> index d8d647bb7f0..c40544a5a94 100644
> --- a/gas/testsuite/gas/arm/unwind-pacbti-m-readelf.d
> +++ b/gas/testsuite/gas/arm/unwind-pacbti-m-readelf.d
> @@ -10,11 +10,11 @@ Unwind section '.ARM.exidx' at offset 0x60 contains 1 entry:
>   
>   0x0 <foo>: @0x0
>     Compact model index: 1
> -  0x84 0x00 pop {r14}
>     0xb4      pop {ra_auth_code}
>     0x84 0x00 pop {r14}
> -  0xb4      pop {ra_auth_code}
>     0xa3      pop {r4, r5, r6, r7}
>     0xb4      pop {ra_auth_code}
> +  0x84 0x00 pop {r14}
> +  0xb4      pop {ra_auth_code}
>     0xa8      pop {r4, r14}
>     0xb0      finish
> diff --git a/gas/testsuite/gas/arm/unwind-pacbti-m.d b/gas/testsuite/gas/arm/unwind-pacbti-m.d
> index d178e4c0a44..b021c007b33 100644
> --- a/gas/testsuite/gas/arm/unwind-pacbti-m.d
> +++ b/gas/testsuite/gas/arm/unwind-pacbti-m.d
> @@ -8,4 +8,4 @@
>   .*:     file format.*
>   
>   Contents of section .ARM.extab:
> - 0000 (00840281 b40084b4 b0a8b4a3|81028400 b48400b4 a3b4a8b0) 00000000  .*
> + 0000 (84b40281 84b4a300 b0a8b400|8102b484 00a3b484 00b4a8b0) 00000000  .*

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2022-07-29 14:09 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-07-28 15:44 [PATCH v2][Binutils][GAS] arm: Use DWARF numbering convention for pseudo-register representation Victor Do Nascimento
2022-07-29 14:09 ` Richard Earnshaw

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).