[binutils-gdb] Using .mri in assembly

Alan Modra amodra@sourceware.org
Wed Mar 1 22:01:19 GMT 2023


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=40e7bdbddc8ba144ae90641be58d6ac939ba096b

commit 40e7bdbddc8ba144ae90641be58d6ac939ba096b
Author: Alan Modra <amodra@gmail.com>
Date:   Thu Mar 2 07:34:40 2023 +1030

    Using .mri in assembly
    
    Changing mri mode between macro definition and use isn't good.  This
            .macro x
            .endm
            .mri 1
            x
    leads to a segfault.  Fixed with the following patch, but I suppose
    what should really happen is that macros be marked as being mri mode
    when defined, and that determine whether the magic NARG parameter be
    supplied at expansion.  Nobody has complained about this in 30 years
    so I'm not inclined to change gas behaviour to that extent.
    
            * macro.c (macro_expand): Don't segfault in mri mode if NARG
            formal isn't found.

Diff:
---
 gas/macro.c | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/gas/macro.c b/gas/macro.c
index afcd48b3a88..74a1317cb11 100644
--- a/gas/macro.c
+++ b/gas/macro.c
@@ -1221,13 +1221,14 @@ macro_expand (size_t idx, sb *in, macro_entry *m, sb *out)
 
       if (macro_mri)
 	{
-	  char buffer[20];
-
-	  sb_reset (&t);
-	  sb_add_string (&t, macro_strip_at ? "$NARG" : "NARG");
-	  ptr = str_hash_find (m->formal_hash, sb_terminate (&t));
-	  sprintf (buffer, "%d", narg);
-	  sb_add_string (&ptr->actual, buffer);
+	  ptr = str_hash_find (m->formal_hash,
+			       macro_strip_at ? "$NARG" : "NARG");
+	  if (ptr)
+	    {
+	      char buffer[20];
+	      sprintf (buffer, "%d", narg);
+	      sb_add_string (&ptr->actual, buffer);
+	    }
 	}
 
       err = macro_expand_body (&m->sub, out, m->formals, m->formal_hash, m);


More information about the Binutils-cvs mailing list