Using .mri in assembly
authorAlan Modra <amodra@gmail.com>
Wed, 1 Mar 2023 21:04:40 +0000 (07:34 +1030)
committerAlan Modra <amodra@gmail.com>
Wed, 1 Mar 2023 21:25:37 +0000 (07:55 +1030)
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.

gas/macro.c

index afcd48b3a88ab583e55555423fd938450402bbc6..74a1317cb1119ebfa30b057a7f9cf0106509dd96 100644 (file)
@@ -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);