Blame SOURCES/gdb-rhbz1247107-backport-aarch64-stap-sdt-support-1of2.patch

7b26da
commit 05c0465e16a5e2db92f8975aebf2bb5aacb1c542
7b26da
Author: Sergio Durigan Junior <sergiodj@redhat.com>
7b26da
Date:   Thu Dec 19 18:53:40 2013 -0200
7b26da
7b26da
    Extend SystemTap SDT probe argument parser
7b26da
    
7b26da
    This patch extends the current generic parser for SystemTap SDT probe
7b26da
    arguments.  It can be almost considered a cleanup, but the main point of
7b26da
    it is actually to allow the generic parser to accept multiple prefixes
7b26da
    and suffixes for the its operands (i.e., integers, register names, and
7b26da
    register indirection).
7b26da
    
7b26da
    I have chosen to implement this as a list of const strings, and declare
7b26da
    this list as "static" inside each target's method used to initialize
7b26da
    gdbarch.
7b26da
    
7b26da
    This patch is actually a preparation for an upcoming patch for ARM,
7b26da
    which implements the support for multiple integer prefixes (as defined
7b26da
    by ARM's asm spec).  And AArch64 will also need this, for the same
7b26da
    reason.
7b26da
    
7b26da
    This patch was regtested on all architectures that it touches (i.e.,
7b26da
    i386, x86_64, ARM, PPC/PPC64, s390x and IA-64).  No regressions were found.
7b26da
    
7b26da
    2013-12-19  Sergio Durigan Junior  <sergiodj@redhat.com>
7b26da
    
7b26da
    	* amd64-tdep.c (amd64_init_abi): Declare SystemTap SDT probe
7b26da
    	argument prefixes and suffixes.  Initialize gdbarch with them.
7b26da
    	* arm-linux-tdep.c (arm_linux_init_abi): Likewise.
7b26da
    	* gdbarch.c: Regenerate.
7b26da
    	* gdbarch.h: Regenerate.
7b26da
    	* gdbarch.sh (stap_integer_prefix, stap_integer_suffix)
7b26da
    	(stap_register_prefix, stap_register_suffix)
7b26da
    	(stap_register_indirection_prefix)
7b26da
    	(stap_register_indirection_suffix): Declare as "const char *const
7b26da
    	*" instead of "const char *".  Adjust printing function.  Rename
7b26da
    	all of the variables to the plural.
7b26da
    	(pstring_list): New function.
7b26da
    	* i386-tdep.c (i386_elf_init_abi): Declare SystemTap SDT probe
7b26da
    	argument prefixes and suffixes.  Initialize gdbarch with them.
7b26da
    	* ia64-linux-tdep.c (ia64_linux_init_abi): Likewise.
7b26da
    	* ppc-linux-tdep.c (ppc_linux_init_abi): Likewise.
7b26da
    	* s390-linux-tdep.c (s390_gdbarch_init): Likewise.
7b26da
    	* stap-probe.c (stap_is_generic_prefix): New function.
7b26da
    	(stap_is_register_prefix): Likewise.
7b26da
    	(stap_is_register_indirection_prefix): Likewise.
7b26da
    	(stap_is_integer_prefix): Likewise.
7b26da
    	(stap_generic_check_suffix): Likewise.
7b26da
    	(stap_check_integer_suffix): Likewise.
7b26da
    	(stap_check_register_suffix): Likewise.
7b26da
    	(stap_check_register_indirection_suffix): Likewise.
7b26da
    	(stap_parse_register_operand): Remove unecessary declarations for
7b26da
    	variables holding prefix and suffix information.  Use the new
7b26da
    	functions listed above for checking for prefixes and suffixes.
7b26da
    	(stap_parse_single_operand): Likewise.
7b26da
7b26da
Index: gdb-7.6.1/gdb/amd64-tdep.c
7b26da
===================================================================
7b26da
--- gdb-7.6.1.orig/gdb/amd64-tdep.c
7b26da
+++ gdb-7.6.1/gdb/amd64-tdep.c
7b26da
@@ -2867,6 +2867,12 @@ amd64_init_abi (struct gdbarch_info info
7b26da
 {
7b26da
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
7b26da
   const struct target_desc *tdesc = info.target_desc;
7b26da
+  static const char *const stap_integer_prefixes[] = { "$", NULL };
7b26da
+  static const char *const stap_register_prefixes[] = { "%", NULL };
7b26da
+  static const char *const stap_register_indirection_prefixes[] = { "(",
7b26da
+								    NULL };
7b26da
+  static const char *const stap_register_indirection_suffixes[] = { ")",
7b26da
+								    NULL };
7b26da
 
7b26da
   /* AMD64 generally uses `fxsave' instead of `fsave' for saving its
7b26da
      floating-point registers.  */
7b26da
@@ -2976,10 +2982,12 @@ amd64_init_abi (struct gdbarch_info info
7b26da
   set_gdbarch_gen_return_address (gdbarch, amd64_gen_return_address);
7b26da
 
7b26da
   /* SystemTap variables and functions.  */
7b26da
-  set_gdbarch_stap_integer_prefix (gdbarch, "$");
7b26da
-  set_gdbarch_stap_register_prefix (gdbarch, "%");
7b26da
-  set_gdbarch_stap_register_indirection_prefix (gdbarch, "(");
7b26da
-  set_gdbarch_stap_register_indirection_suffix (gdbarch, ")");
7b26da
+  set_gdbarch_stap_integer_prefixes (gdbarch, stap_integer_prefixes);
7b26da
+  set_gdbarch_stap_register_prefixes (gdbarch, stap_register_prefixes);
7b26da
+  set_gdbarch_stap_register_indirection_prefixes (gdbarch,
7b26da
+					  stap_register_indirection_prefixes);
7b26da
+  set_gdbarch_stap_register_indirection_suffixes (gdbarch,
7b26da
+					  stap_register_indirection_suffixes);
7b26da
   set_gdbarch_stap_is_single_operand (gdbarch,
7b26da
 				      i386_stap_is_single_operand);
7b26da
   set_gdbarch_stap_parse_special_token (gdbarch,
7b26da
Index: gdb-7.6.1/gdb/arm-linux-tdep.c
7b26da
===================================================================
7b26da
--- gdb-7.6.1.orig/gdb/arm-linux-tdep.c
7b26da
+++ gdb-7.6.1/gdb/arm-linux-tdep.c
7b26da
@@ -1182,6 +1182,12 @@ static void
7b26da
 arm_linux_init_abi (struct gdbarch_info info,
7b26da
 		    struct gdbarch *gdbarch)
7b26da
 {
7b26da
+  static const char *const stap_integer_prefixes[] = { "#", NULL };
7b26da
+  static const char *const stap_register_prefixes[] = { "r", NULL };
7b26da
+  static const char *const stap_register_indirection_prefixes[] = { "[",
7b26da
+								    NULL };
7b26da
+  static const char *const stap_register_indirection_suffixes[] = { "]",
7b26da
+								    NULL };
7b26da
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
7b26da
 
7b26da
   linux_init_abi (info, gdbarch);
7b26da
@@ -1281,10 +1287,12 @@ arm_linux_init_abi (struct gdbarch_info
7b26da
   set_gdbarch_process_record (gdbarch, arm_process_record);
7b26da
 
7b26da
   /* SystemTap functions.  */
7b26da
-  set_gdbarch_stap_integer_prefix (gdbarch, "#");
7b26da
-  set_gdbarch_stap_register_prefix (gdbarch, "r");
7b26da
-  set_gdbarch_stap_register_indirection_prefix (gdbarch, "[");
7b26da
-  set_gdbarch_stap_register_indirection_suffix (gdbarch, "]");
7b26da
+  set_gdbarch_stap_integer_prefixes (gdbarch, stap_integer_prefixes);
7b26da
+  set_gdbarch_stap_register_prefixes (gdbarch, stap_register_prefixes);
7b26da
+  set_gdbarch_stap_register_indirection_prefixes (gdbarch,
7b26da
+					  stap_register_indirection_prefixes);
7b26da
+  set_gdbarch_stap_register_indirection_suffixes (gdbarch,
7b26da
+					  stap_register_indirection_suffixes);
7b26da
   set_gdbarch_stap_gdb_register_prefix (gdbarch, "r");
7b26da
   set_gdbarch_stap_is_single_operand (gdbarch, arm_stap_is_single_operand);
7b26da
   set_gdbarch_stap_parse_special_token (gdbarch,
7b26da
Index: gdb-7.6.1/gdb/gdbarch.c
7b26da
===================================================================
7b26da
--- gdb-7.6.1.orig/gdb/gdbarch.c
7b26da
+++ gdb-7.6.1/gdb/gdbarch.c
7b26da
@@ -86,6 +86,35 @@ pstring (const char *string)
7b26da
   return string;
7b26da
 }
7b26da
 
7b26da
+/* Helper function to print a list of strings, represented as "const
7b26da
+   char *const *".  The list is printed comma-separated.  */
7b26da
+
7b26da
+static char *
7b26da
+pstring_list (const char *const *list)
7b26da
+{
7b26da
+  static char ret[100];
7b26da
+  const char *const *p;
7b26da
+  size_t offset = 0;
7b26da
+
7b26da
+  if (list == NULL)
7b26da
+    return "(null)";
7b26da
+
7b26da
+  ret[0] = '\0';
7b26da
+  for (p = list; *p != NULL && offset < sizeof (ret); ++p)
7b26da
+    {
7b26da
+      size_t s = xsnprintf (ret + offset, sizeof (ret) - offset, "%s, ", *p);
7b26da
+      offset += 2 + s;
7b26da
+    }
7b26da
+
7b26da
+  if (offset > 0)
7b26da
+    {
7b26da
+      gdb_assert (offset - 2 < sizeof (ret));
7b26da
+      ret[offset - 2] = '\0';
7b26da
+    }
7b26da
+
7b26da
+  return ret;
7b26da
+}
7b26da
+
7b26da
 
7b26da
 /* Maintain the struct gdbarch object.  */
7b26da
 
7b26da
@@ -264,12 +293,12 @@ struct gdbarch
7b26da
   gdbarch_get_siginfo_type_ftype *get_siginfo_type;
7b26da
   gdbarch_record_special_symbol_ftype *record_special_symbol;
7b26da
   gdbarch_get_syscall_number_ftype *get_syscall_number;
7b26da
-  const char * stap_integer_prefix;
7b26da
-  const char * stap_integer_suffix;
7b26da
-  const char * stap_register_prefix;
7b26da
-  const char * stap_register_suffix;
7b26da
-  const char * stap_register_indirection_prefix;
7b26da
-  const char * stap_register_indirection_suffix;
7b26da
+  const char *const * stap_integer_prefixes;
7b26da
+  const char *const * stap_integer_suffixes;
7b26da
+  const char *const * stap_register_prefixes;
7b26da
+  const char *const * stap_register_suffixes;
7b26da
+  const char *const * stap_register_indirection_prefixes;
7b26da
+  const char *const * stap_register_indirection_suffixes;
7b26da
   const char * stap_gdb_register_prefix;
7b26da
   const char * stap_gdb_register_suffix;
7b26da
   gdbarch_stap_is_single_operand_ftype *stap_is_single_operand;
7b26da
@@ -436,12 +465,12 @@ struct gdbarch startup_gdbarch =
7b26da
   0,  /* get_siginfo_type */
7b26da
   0,  /* record_special_symbol */
7b26da
   0,  /* get_syscall_number */
7b26da
-  0,  /* stap_integer_prefix */
7b26da
-  0,  /* stap_integer_suffix */
7b26da
-  0,  /* stap_register_prefix */
7b26da
-  0,  /* stap_register_suffix */
7b26da
-  0,  /* stap_register_indirection_prefix */
7b26da
-  0,  /* stap_register_indirection_suffix */
7b26da
+  0,  /* stap_integer_prefixes */
7b26da
+  0,  /* stap_integer_suffixes */
7b26da
+  0,  /* stap_register_prefixes */
7b26da
+  0,  /* stap_register_suffixes */
7b26da
+  0,  /* stap_register_indirection_prefixes */
7b26da
+  0,  /* stap_register_indirection_suffixes */
7b26da
   0,  /* stap_gdb_register_prefix */
7b26da
   0,  /* stap_gdb_register_suffix */
7b26da
   0,  /* stap_is_single_operand */
7b26da
@@ -741,12 +770,12 @@ verify_gdbarch (struct gdbarch *gdbarch)
7b26da
   /* Skip verify of get_siginfo_type, has predicate.  */
7b26da
   /* Skip verify of record_special_symbol, has predicate.  */
7b26da
   /* Skip verify of get_syscall_number, has predicate.  */
7b26da
-  /* Skip verify of stap_integer_prefix, invalid_p == 0 */
7b26da
-  /* Skip verify of stap_integer_suffix, invalid_p == 0 */
7b26da
-  /* Skip verify of stap_register_prefix, invalid_p == 0 */
7b26da
-  /* Skip verify of stap_register_suffix, invalid_p == 0 */
7b26da
-  /* Skip verify of stap_register_indirection_prefix, invalid_p == 0 */
7b26da
-  /* Skip verify of stap_register_indirection_suffix, invalid_p == 0 */
7b26da
+  /* Skip verify of stap_integer_prefixes, invalid_p == 0 */
7b26da
+  /* Skip verify of stap_integer_suffixes, invalid_p == 0 */
7b26da
+  /* Skip verify of stap_register_prefixes, invalid_p == 0 */
7b26da
+  /* Skip verify of stap_register_suffixes, invalid_p == 0 */
7b26da
+  /* Skip verify of stap_register_indirection_prefixes, invalid_p == 0 */
7b26da
+  /* Skip verify of stap_register_indirection_suffixes, invalid_p == 0 */
7b26da
   /* Skip verify of stap_gdb_register_prefix, invalid_p == 0 */
7b26da
   /* Skip verify of stap_gdb_register_suffix, invalid_p == 0 */
7b26da
   /* Skip verify of stap_is_single_operand, has predicate.  */
7b26da
@@ -1342,11 +1371,11 @@ gdbarch_dump (struct gdbarch *gdbarch, s
7b26da
                       "gdbarch_dump: stap_gdb_register_suffix = %s\n",
7b26da
                       pstring (gdbarch->stap_gdb_register_suffix));
7b26da
   fprintf_unfiltered (file,
7b26da
-                      "gdbarch_dump: stap_integer_prefix = %s\n",
7b26da
-                      pstring (gdbarch->stap_integer_prefix));
7b26da
+                      "gdbarch_dump: stap_integer_prefixes = %s\n",
7b26da
+                      pstring_list (gdbarch->stap_integer_prefixes));
7b26da
   fprintf_unfiltered (file,
7b26da
-                      "gdbarch_dump: stap_integer_suffix = %s\n",
7b26da
-                      pstring (gdbarch->stap_integer_suffix));
7b26da
+                      "gdbarch_dump: stap_integer_suffixes = %s\n",
7b26da
+                      pstring_list (gdbarch->stap_integer_suffixes));
7b26da
   fprintf_unfiltered (file,
7b26da
                       "gdbarch_dump: gdbarch_stap_is_single_operand_p() = %d\n",
7b26da
                       gdbarch_stap_is_single_operand_p (gdbarch));
7b26da
@@ -1360,17 +1389,17 @@ gdbarch_dump (struct gdbarch *gdbarch, s
7b26da
                       "gdbarch_dump: stap_parse_special_token = <%s>\n",
7b26da
                       host_address_to_string (gdbarch->stap_parse_special_token));
7b26da
   fprintf_unfiltered (file,
7b26da
-                      "gdbarch_dump: stap_register_indirection_prefix = %s\n",
7b26da
-                      pstring (gdbarch->stap_register_indirection_prefix));
7b26da
+                      "gdbarch_dump: stap_register_indirection_prefixes = %s\n",
7b26da
+                      pstring_list (gdbarch->stap_register_indirection_prefixes));
7b26da
   fprintf_unfiltered (file,
7b26da
-                      "gdbarch_dump: stap_register_indirection_suffix = %s\n",
7b26da
-                      pstring (gdbarch->stap_register_indirection_suffix));
7b26da
+                      "gdbarch_dump: stap_register_indirection_suffixes = %s\n",
7b26da
+                      pstring_list (gdbarch->stap_register_indirection_suffixes));
7b26da
   fprintf_unfiltered (file,
7b26da
-                      "gdbarch_dump: stap_register_prefix = %s\n",
7b26da
-                      pstring (gdbarch->stap_register_prefix));
7b26da
+                      "gdbarch_dump: stap_register_prefixes = %s\n",
7b26da
+                      pstring_list (gdbarch->stap_register_prefixes));
7b26da
   fprintf_unfiltered (file,
7b26da
-                      "gdbarch_dump: stap_register_suffix = %s\n",
7b26da
-                      pstring (gdbarch->stap_register_suffix));
7b26da
+                      "gdbarch_dump: stap_register_suffixes = %s\n",
7b26da
+                      pstring_list (gdbarch->stap_register_suffixes));
7b26da
   fprintf_unfiltered (file,
7b26da
                       "gdbarch_dump: gdbarch_static_transform_name_p() = %d\n",
7b26da
                       gdbarch_static_transform_name_p (gdbarch));
7b26da
@@ -3971,106 +4000,106 @@ set_gdbarch_get_syscall_number (struct g
7b26da
   gdbarch->get_syscall_number = get_syscall_number;
7b26da
 }
7b26da
 
7b26da
-const char *
7b26da
-gdbarch_stap_integer_prefix (struct gdbarch *gdbarch)
7b26da
+const char *const *
7b26da
+gdbarch_stap_integer_prefixes (struct gdbarch *gdbarch)
7b26da
 {
7b26da
   gdb_assert (gdbarch != NULL);
7b26da
-  /* Skip verify of stap_integer_prefix, invalid_p == 0 */
7b26da
+  /* Skip verify of stap_integer_prefixes, invalid_p == 0 */
7b26da
   if (gdbarch_debug >= 2)
7b26da
-    fprintf_unfiltered (gdb_stdlog, "gdbarch_stap_integer_prefix called\n");
7b26da
-  return gdbarch->stap_integer_prefix;
7b26da
+    fprintf_unfiltered (gdb_stdlog, "gdbarch_stap_integer_prefixes called\n");
7b26da
+  return gdbarch->stap_integer_prefixes;
7b26da
 }
7b26da
 
7b26da
 void
7b26da
-set_gdbarch_stap_integer_prefix (struct gdbarch *gdbarch,
7b26da
-                                 const char * stap_integer_prefix)
7b26da
+set_gdbarch_stap_integer_prefixes (struct gdbarch *gdbarch,
7b26da
+                                   const char *const * stap_integer_prefixes)
7b26da
 {
7b26da
-  gdbarch->stap_integer_prefix = stap_integer_prefix;
7b26da
+  gdbarch->stap_integer_prefixes = stap_integer_prefixes;
7b26da
 }
7b26da
 
7b26da
-const char *
7b26da
-gdbarch_stap_integer_suffix (struct gdbarch *gdbarch)
7b26da
+const char *const *
7b26da
+gdbarch_stap_integer_suffixes (struct gdbarch *gdbarch)
7b26da
 {
7b26da
   gdb_assert (gdbarch != NULL);
7b26da
-  /* Skip verify of stap_integer_suffix, invalid_p == 0 */
7b26da
+  /* Skip verify of stap_integer_suffixes, invalid_p == 0 */
7b26da
   if (gdbarch_debug >= 2)
7b26da
-    fprintf_unfiltered (gdb_stdlog, "gdbarch_stap_integer_suffix called\n");
7b26da
-  return gdbarch->stap_integer_suffix;
7b26da
+    fprintf_unfiltered (gdb_stdlog, "gdbarch_stap_integer_suffixes called\n");
7b26da
+  return gdbarch->stap_integer_suffixes;
7b26da
 }
7b26da
 
7b26da
 void
7b26da
-set_gdbarch_stap_integer_suffix (struct gdbarch *gdbarch,
7b26da
-                                 const char * stap_integer_suffix)
7b26da
+set_gdbarch_stap_integer_suffixes (struct gdbarch *gdbarch,
7b26da
+                                   const char *const * stap_integer_suffixes)
7b26da
 {
7b26da
-  gdbarch->stap_integer_suffix = stap_integer_suffix;
7b26da
+  gdbarch->stap_integer_suffixes = stap_integer_suffixes;
7b26da
 }
7b26da
 
7b26da
-const char *
7b26da
-gdbarch_stap_register_prefix (struct gdbarch *gdbarch)
7b26da
+const char *const *
7b26da
+gdbarch_stap_register_prefixes (struct gdbarch *gdbarch)
7b26da
 {
7b26da
   gdb_assert (gdbarch != NULL);
7b26da
-  /* Skip verify of stap_register_prefix, invalid_p == 0 */
7b26da
+  /* Skip verify of stap_register_prefixes, invalid_p == 0 */
7b26da
   if (gdbarch_debug >= 2)
7b26da
-    fprintf_unfiltered (gdb_stdlog, "gdbarch_stap_register_prefix called\n");
7b26da
-  return gdbarch->stap_register_prefix;
7b26da
+    fprintf_unfiltered (gdb_stdlog, "gdbarch_stap_register_prefixes called\n");
7b26da
+  return gdbarch->stap_register_prefixes;
7b26da
 }
7b26da
 
7b26da
 void
7b26da
-set_gdbarch_stap_register_prefix (struct gdbarch *gdbarch,
7b26da
-                                  const char * stap_register_prefix)
7b26da
+set_gdbarch_stap_register_prefixes (struct gdbarch *gdbarch,
7b26da
+                                    const char *const * stap_register_prefixes)
7b26da
 {
7b26da
-  gdbarch->stap_register_prefix = stap_register_prefix;
7b26da
+  gdbarch->stap_register_prefixes = stap_register_prefixes;
7b26da
 }
7b26da
 
7b26da
-const char *
7b26da
-gdbarch_stap_register_suffix (struct gdbarch *gdbarch)
7b26da
+const char *const *
7b26da
+gdbarch_stap_register_suffixes (struct gdbarch *gdbarch)
7b26da
 {
7b26da
   gdb_assert (gdbarch != NULL);
7b26da
-  /* Skip verify of stap_register_suffix, invalid_p == 0 */
7b26da
+  /* Skip verify of stap_register_suffixes, invalid_p == 0 */
7b26da
   if (gdbarch_debug >= 2)
7b26da
-    fprintf_unfiltered (gdb_stdlog, "gdbarch_stap_register_suffix called\n");
7b26da
-  return gdbarch->stap_register_suffix;
7b26da
+    fprintf_unfiltered (gdb_stdlog, "gdbarch_stap_register_suffixes called\n");
7b26da
+  return gdbarch->stap_register_suffixes;
7b26da
 }
7b26da
 
7b26da
 void
7b26da
-set_gdbarch_stap_register_suffix (struct gdbarch *gdbarch,
7b26da
-                                  const char * stap_register_suffix)
7b26da
+set_gdbarch_stap_register_suffixes (struct gdbarch *gdbarch,
7b26da
+                                    const char *const * stap_register_suffixes)
7b26da
 {
7b26da
-  gdbarch->stap_register_suffix = stap_register_suffix;
7b26da
+  gdbarch->stap_register_suffixes = stap_register_suffixes;
7b26da
 }
7b26da
 
7b26da
-const char *
7b26da
-gdbarch_stap_register_indirection_prefix (struct gdbarch *gdbarch)
7b26da
+const char *const *
7b26da
+gdbarch_stap_register_indirection_prefixes (struct gdbarch *gdbarch)
7b26da
 {
7b26da
   gdb_assert (gdbarch != NULL);
7b26da
-  /* Skip verify of stap_register_indirection_prefix, invalid_p == 0 */
7b26da
+  /* Skip verify of stap_register_indirection_prefixes, invalid_p == 0 */
7b26da
   if (gdbarch_debug >= 2)
7b26da
-    fprintf_unfiltered (gdb_stdlog, "gdbarch_stap_register_indirection_prefix called\n");
7b26da
-  return gdbarch->stap_register_indirection_prefix;
7b26da
+    fprintf_unfiltered (gdb_stdlog, "gdbarch_stap_register_indirection_prefixes called\n");
7b26da
+  return gdbarch->stap_register_indirection_prefixes;
7b26da
 }
7b26da
 
7b26da
 void
7b26da
-set_gdbarch_stap_register_indirection_prefix (struct gdbarch *gdbarch,
7b26da
-                                              const char * stap_register_indirection_prefix)
7b26da
+set_gdbarch_stap_register_indirection_prefixes (struct gdbarch *gdbarch,
7b26da
+                                                const char *const * stap_register_indirection_prefixes)
7b26da
 {
7b26da
-  gdbarch->stap_register_indirection_prefix = stap_register_indirection_prefix;
7b26da
+  gdbarch->stap_register_indirection_prefixes = stap_register_indirection_prefixes;
7b26da
 }
7b26da
 
7b26da
-const char *
7b26da
-gdbarch_stap_register_indirection_suffix (struct gdbarch *gdbarch)
7b26da
+const char *const *
7b26da
+gdbarch_stap_register_indirection_suffixes (struct gdbarch *gdbarch)
7b26da
 {
7b26da
   gdb_assert (gdbarch != NULL);
7b26da
-  /* Skip verify of stap_register_indirection_suffix, invalid_p == 0 */
7b26da
+  /* Skip verify of stap_register_indirection_suffixes, invalid_p == 0 */
7b26da
   if (gdbarch_debug >= 2)
7b26da
-    fprintf_unfiltered (gdb_stdlog, "gdbarch_stap_register_indirection_suffix called\n");
7b26da
-  return gdbarch->stap_register_indirection_suffix;
7b26da
+    fprintf_unfiltered (gdb_stdlog, "gdbarch_stap_register_indirection_suffixes called\n");
7b26da
+  return gdbarch->stap_register_indirection_suffixes;
7b26da
 }
7b26da
 
7b26da
 void
7b26da
-set_gdbarch_stap_register_indirection_suffix (struct gdbarch *gdbarch,
7b26da
-                                              const char * stap_register_indirection_suffix)
7b26da
+set_gdbarch_stap_register_indirection_suffixes (struct gdbarch *gdbarch,
7b26da
+                                                const char *const * stap_register_indirection_suffixes)
7b26da
 {
7b26da
-  gdbarch->stap_register_indirection_suffix = stap_register_indirection_suffix;
7b26da
+  gdbarch->stap_register_indirection_suffixes = stap_register_indirection_suffixes;
7b26da
 }
7b26da
 
7b26da
 const char *
7b26da
Index: gdb-7.6.1/gdb/gdbarch.h
7b26da
===================================================================
7b26da
--- gdb-7.6.1.orig/gdb/gdbarch.h
7b26da
+++ gdb-7.6.1/gdb/gdbarch.h
7b26da
@@ -1030,37 +1030,42 @@ extern LONGEST gdbarch_get_syscall_numbe
7b26da
 extern void set_gdbarch_get_syscall_number (struct gdbarch *gdbarch, gdbarch_get_syscall_number_ftype *get_syscall_number);
7b26da
 
7b26da
 /* SystemTap related fields and functions.
7b26da
-   Prefix used to mark an integer constant on the architecture's assembly
7b26da
+   A NULL-terminated array of prefixes used to mark an integer constant
7b26da
+   on the architecture's assembly.
7b26da
    For example, on x86 integer constants are written as:
7b26da
   
7b26da
     $10 ;; integer constant 10
7b26da
   
7b26da
    in this case, this prefix would be the character `$'. */
7b26da
 
7b26da
-extern const char * gdbarch_stap_integer_prefix (struct gdbarch *gdbarch);
7b26da
-extern void set_gdbarch_stap_integer_prefix (struct gdbarch *gdbarch, const char * stap_integer_prefix);
7b26da
+extern const char *const * gdbarch_stap_integer_prefixes (struct gdbarch *gdbarch);
7b26da
+extern void set_gdbarch_stap_integer_prefixes (struct gdbarch *gdbarch, const char *const * stap_integer_prefixes);
7b26da
 
7b26da
-/* Suffix used to mark an integer constant on the architecture's assembly. */
7b26da
+/* A NULL-terminated array of suffixes used to mark an integer constant
7b26da
+   on the architecture's assembly. */
7b26da
 
7b26da
-extern const char * gdbarch_stap_integer_suffix (struct gdbarch *gdbarch);
7b26da
-extern void set_gdbarch_stap_integer_suffix (struct gdbarch *gdbarch, const char * stap_integer_suffix);
7b26da
+extern const char *const * gdbarch_stap_integer_suffixes (struct gdbarch *gdbarch);
7b26da
+extern void set_gdbarch_stap_integer_suffixes (struct gdbarch *gdbarch, const char *const * stap_integer_suffixes);
7b26da
 
7b26da
-/* Prefix used to mark a register name on the architecture's assembly.
7b26da
+/* A NULL-terminated array of prefixes used to mark a register name on
7b26da
+   the architecture's assembly.
7b26da
    For example, on x86 the register name is written as:
7b26da
   
7b26da
     %eax ;; register eax
7b26da
   
7b26da
    in this case, this prefix would be the character `%'. */
7b26da
 
7b26da
-extern const char * gdbarch_stap_register_prefix (struct gdbarch *gdbarch);
7b26da
-extern void set_gdbarch_stap_register_prefix (struct gdbarch *gdbarch, const char * stap_register_prefix);
7b26da
+extern const char *const * gdbarch_stap_register_prefixes (struct gdbarch *gdbarch);
7b26da
+extern void set_gdbarch_stap_register_prefixes (struct gdbarch *gdbarch, const char *const * stap_register_prefixes);
7b26da
 
7b26da
-/* Suffix used to mark a register name on the architecture's assembly */
7b26da
+/* A NULL-terminated array of suffixes used to mark a register name on
7b26da
+   the architecture's assembly. */
7b26da
 
7b26da
-extern const char * gdbarch_stap_register_suffix (struct gdbarch *gdbarch);
7b26da
-extern void set_gdbarch_stap_register_suffix (struct gdbarch *gdbarch, const char * stap_register_suffix);
7b26da
+extern const char *const * gdbarch_stap_register_suffixes (struct gdbarch *gdbarch);
7b26da
+extern void set_gdbarch_stap_register_suffixes (struct gdbarch *gdbarch, const char *const * stap_register_suffixes);
7b26da
 
7b26da
-/* Prefix used to mark a register indirection on the architecture's assembly.
7b26da
+/* A NULL-terminated array of prefixes used to mark a register
7b26da
+   indirection on the architecture's assembly.
7b26da
    For example, on x86 the register indirection is written as:
7b26da
   
7b26da
     (%eax) ;; indirecting eax
7b26da
@@ -1070,10 +1075,11 @@ extern void set_gdbarch_stap_register_su
7b26da
    Please note that we use the indirection prefix also for register
7b26da
    displacement, e.g., `4(%eax)' on x86. */
7b26da
 
7b26da
-extern const char * gdbarch_stap_register_indirection_prefix (struct gdbarch *gdbarch);
7b26da
-extern void set_gdbarch_stap_register_indirection_prefix (struct gdbarch *gdbarch, const char * stap_register_indirection_prefix);
7b26da
+extern const char *const * gdbarch_stap_register_indirection_prefixes (struct gdbarch *gdbarch);
7b26da
+extern void set_gdbarch_stap_register_indirection_prefixes (struct gdbarch *gdbarch, const char *const * stap_register_indirection_prefixes);
7b26da
 
7b26da
-/* Suffix used to mark a register indirection on the architecture's assembly.
7b26da
+/* A NULL-terminated array of suffixes used to mark a register
7b26da
+   indirection on the architecture's assembly.
7b26da
    For example, on x86 the register indirection is written as:
7b26da
   
7b26da
     (%eax) ;; indirecting eax
7b26da
@@ -1083,10 +1089,10 @@ extern void set_gdbarch_stap_register_in
7b26da
    Please note that we use the indirection suffix also for register
7b26da
    displacement, e.g., `4(%eax)' on x86. */
7b26da
 
7b26da
-extern const char * gdbarch_stap_register_indirection_suffix (struct gdbarch *gdbarch);
7b26da
-extern void set_gdbarch_stap_register_indirection_suffix (struct gdbarch *gdbarch, const char * stap_register_indirection_suffix);
7b26da
+extern const char *const * gdbarch_stap_register_indirection_suffixes (struct gdbarch *gdbarch);
7b26da
+extern void set_gdbarch_stap_register_indirection_suffixes (struct gdbarch *gdbarch, const char *const * stap_register_indirection_suffixes);
7b26da
 
7b26da
-/* Prefix used to name a register using GDB's nomenclature.
7b26da
+/* Prefix(es) used to name a register using GDB's nomenclature.
7b26da
   
7b26da
    For example, on PPC a register is represented by a number in the assembly
7b26da
    language (e.g., `10' is the 10th general-purpose register).  However,
7b26da
Index: gdb-7.6.1/gdb/gdbarch.sh
7b26da
===================================================================
7b26da
--- gdb-7.6.1.orig/gdb/gdbarch.sh
7b26da
+++ gdb-7.6.1/gdb/gdbarch.sh
7b26da
@@ -823,29 +823,34 @@ M:LONGEST:get_syscall_number:ptid_t ptid
7b26da
 
7b26da
 # SystemTap related fields and functions.
7b26da
 
7b26da
-# Prefix used to mark an integer constant on the architecture's assembly
7b26da
+# A NULL-terminated array of prefixes used to mark an integer constant
7b26da
+# on the architecture's assembly.
7b26da
 # For example, on x86 integer constants are written as:
7b26da
 #
7b26da
 #  \$10 ;; integer constant 10
7b26da
 #
7b26da
 # in this case, this prefix would be the character \`\$\'.
7b26da
-v:const char *:stap_integer_prefix:::0:0::0:pstring (gdbarch->stap_integer_prefix)
7b26da
+v:const char *const *:stap_integer_prefixes:::0:0::0:pstring_list (gdbarch->stap_integer_prefixes)
7b26da
 
7b26da
-# Suffix used to mark an integer constant on the architecture's assembly.
7b26da
-v:const char *:stap_integer_suffix:::0:0::0:pstring (gdbarch->stap_integer_suffix)
7b26da
+# A NULL-terminated array of suffixes used to mark an integer constant
7b26da
+# on the architecture's assembly.
7b26da
+v:const char *const *:stap_integer_suffixes:::0:0::0:pstring_list (gdbarch->stap_integer_suffixes)
7b26da
 
7b26da
-# Prefix used to mark a register name on the architecture's assembly.
7b26da
+# A NULL-terminated array of prefixes used to mark a register name on
7b26da
+# the architecture's assembly.
7b26da
 # For example, on x86 the register name is written as:
7b26da
 #
7b26da
 #  \%eax ;; register eax
7b26da
 #
7b26da
 # in this case, this prefix would be the character \`\%\'.
7b26da
-v:const char *:stap_register_prefix:::0:0::0:pstring (gdbarch->stap_register_prefix)
7b26da
+v:const char *const *:stap_register_prefixes:::0:0::0:pstring_list (gdbarch->stap_register_prefixes)
7b26da
 
7b26da
-# Suffix used to mark a register name on the architecture's assembly
7b26da
-v:const char *:stap_register_suffix:::0:0::0:pstring (gdbarch->stap_register_suffix)
7b26da
+# A NULL-terminated array of suffixes used to mark a register name on
7b26da
+# the architecture's assembly.
7b26da
+v:const char *const *:stap_register_suffixes:::0:0::0:pstring_list (gdbarch->stap_register_suffixes)
7b26da
 
7b26da
-# Prefix used to mark a register indirection on the architecture's assembly.
7b26da
+# A NULL-terminated array of prefixes used to mark a register
7b26da
+# indirection on the architecture's assembly.
7b26da
 # For example, on x86 the register indirection is written as:
7b26da
 #
7b26da
 #  \(\%eax\) ;; indirecting eax
7b26da
@@ -854,9 +859,10 @@ v:const char *:stap_register_suffix:::0:
7b26da
 #
7b26da
 # Please note that we use the indirection prefix also for register
7b26da
 # displacement, e.g., \`4\(\%eax\)\' on x86.
7b26da
-v:const char *:stap_register_indirection_prefix:::0:0::0:pstring (gdbarch->stap_register_indirection_prefix)
7b26da
+v:const char *const *:stap_register_indirection_prefixes:::0:0::0:pstring_list (gdbarch->stap_register_indirection_prefixes)
7b26da
 
7b26da
-# Suffix used to mark a register indirection on the architecture's assembly.
7b26da
+# A NULL-terminated array of suffixes used to mark a register
7b26da
+# indirection on the architecture's assembly.
7b26da
 # For example, on x86 the register indirection is written as:
7b26da
 #
7b26da
 #  \(\%eax\) ;; indirecting eax
7b26da
@@ -865,9 +871,9 @@ v:const char *:stap_register_indirection
7b26da
 #
7b26da
 # Please note that we use the indirection suffix also for register
7b26da
 # displacement, e.g., \`4\(\%eax\)\' on x86.
7b26da
-v:const char *:stap_register_indirection_suffix:::0:0::0:pstring (gdbarch->stap_register_indirection_suffix)
7b26da
+v:const char *const *:stap_register_indirection_suffixes:::0:0::0:pstring_list (gdbarch->stap_register_indirection_suffixes)
7b26da
 
7b26da
-# Prefix used to name a register using GDB's nomenclature.
7b26da
+# Prefix(es) used to name a register using GDB's nomenclature.
7b26da
 #
7b26da
 # For example, on PPC a register is represented by a number in the assembly
7b26da
 # language (e.g., \`10\' is the 10th general-purpose register).  However,
7b26da
@@ -1478,6 +1484,35 @@ pstring (const char *string)
7b26da
   return string;
7b26da
 }
7b26da
 
7b26da
+/* Helper function to print a list of strings, represented as "const
7b26da
+   char *const *".  The list is printed comma-separated.  */
7b26da
+
7b26da
+static char *
7b26da
+pstring_list (const char *const *list)
7b26da
+{
7b26da
+  static char ret[100];
7b26da
+  const char *const *p;
7b26da
+  size_t offset = 0;
7b26da
+
7b26da
+  if (list == NULL)
7b26da
+    return "(null)";
7b26da
+
7b26da
+  ret[0] = '\0';
7b26da
+  for (p = list; *p != NULL && offset < sizeof (ret); ++p)
7b26da
+    {
7b26da
+      size_t s = xsnprintf (ret + offset, sizeof (ret) - offset, "%s, ", *p);
7b26da
+      offset += 2 + s;
7b26da
+    }
7b26da
+
7b26da
+  if (offset > 0)
7b26da
+    {
7b26da
+      gdb_assert (offset - 2 < sizeof (ret));
7b26da
+      ret[offset - 2] = '\0';
7b26da
+    }
7b26da
+
7b26da
+  return ret;
7b26da
+}
7b26da
+
7b26da
 EOF
7b26da
 
7b26da
 # gdbarch open the gdbarch object
7b26da
Index: gdb-7.6.1/gdb/i386-tdep.c
7b26da
===================================================================
7b26da
--- gdb-7.6.1.orig/gdb/i386-tdep.c
7b26da
+++ gdb-7.6.1/gdb/i386-tdep.c
7b26da
@@ -3767,14 +3767,23 @@ i386_stap_parse_special_token (struct gd
7b26da
 void
7b26da
 i386_elf_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
7b26da
 {
7b26da
+  static const char *const stap_integer_prefixes[] = { "$", NULL };
7b26da
+  static const char *const stap_register_prefixes[] = { "%", NULL };
7b26da
+  static const char *const stap_register_indirection_prefixes[] = { "(",
7b26da
+								    NULL };
7b26da
+  static const char *const stap_register_indirection_suffixes[] = { ")",
7b26da
+								    NULL };
7b26da
+
7b26da
   /* We typically use stabs-in-ELF with the SVR4 register numbering.  */
7b26da
   set_gdbarch_stab_reg_to_regnum (gdbarch, i386_svr4_reg_to_regnum);
7b26da
 
7b26da
   /* Registering SystemTap handlers.  */
7b26da
-  set_gdbarch_stap_integer_prefix (gdbarch, "$");
7b26da
-  set_gdbarch_stap_register_prefix (gdbarch, "%");
7b26da
-  set_gdbarch_stap_register_indirection_prefix (gdbarch, "(");
7b26da
-  set_gdbarch_stap_register_indirection_suffix (gdbarch, ")");
7b26da
+  set_gdbarch_stap_integer_prefixes (gdbarch, stap_integer_prefixes);
7b26da
+  set_gdbarch_stap_register_prefixes (gdbarch, stap_register_prefixes);
7b26da
+  set_gdbarch_stap_register_indirection_prefixes (gdbarch,
7b26da
+					  stap_register_indirection_prefixes);
7b26da
+  set_gdbarch_stap_register_indirection_suffixes (gdbarch,
7b26da
+					  stap_register_indirection_suffixes);
7b26da
   set_gdbarch_stap_is_single_operand (gdbarch,
7b26da
 				      i386_stap_is_single_operand);
7b26da
   set_gdbarch_stap_parse_special_token (gdbarch,
7b26da
Index: gdb-7.6.1/gdb/ppc-linux-tdep.c
7b26da
===================================================================
7b26da
--- gdb-7.6.1.orig/gdb/ppc-linux-tdep.c
7b26da
+++ gdb-7.6.1/gdb/ppc-linux-tdep.c
7b26da
@@ -1723,6 +1723,11 @@ ppc_linux_init_abi (struct gdbarch_info
7b26da
 {
7b26da
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
7b26da
   struct tdesc_arch_data *tdesc_data = (void *) info.tdep_info;
7b26da
+  static const char *const stap_integer_prefixes[] = { "i", NULL };
7b26da
+  static const char *const stap_register_indirection_prefixes[] = { "(",
7b26da
+								    NULL };
7b26da
+  static const char *const stap_register_indirection_suffixes[] = { ")",
7b26da
+								    NULL };
7b26da
 
7b26da
   linux_init_abi (info, gdbarch);
7b26da
 
7b26da
@@ -1741,9 +1746,11 @@ ppc_linux_init_abi (struct gdbarch_info
7b26da
   set_gdbarch_get_syscall_number (gdbarch, ppc_linux_get_syscall_number);
7b26da
 
7b26da
   /* SystemTap functions.  */
7b26da
-  set_gdbarch_stap_integer_prefix (gdbarch, "i");
7b26da
-  set_gdbarch_stap_register_indirection_prefix (gdbarch, "(");
7b26da
-  set_gdbarch_stap_register_indirection_suffix (gdbarch, ")");
7b26da
+  set_gdbarch_stap_integer_prefixes (gdbarch, stap_integer_prefixes);
7b26da
+  set_gdbarch_stap_register_indirection_prefixes (gdbarch,
7b26da
+					  stap_register_indirection_prefixes);
7b26da
+  set_gdbarch_stap_register_indirection_suffixes (gdbarch,
7b26da
+					  stap_register_indirection_suffixes);
7b26da
   set_gdbarch_stap_gdb_register_prefix (gdbarch, "r");
7b26da
   set_gdbarch_stap_is_single_operand (gdbarch, ppc_stap_is_single_operand);
7b26da
   set_gdbarch_stap_parse_special_token (gdbarch,
7b26da
Index: gdb-7.6.1/gdb/s390-tdep.c
7b26da
===================================================================
7b26da
--- gdb-7.6.1.orig/gdb/s390-tdep.c
7b26da
+++ gdb-7.6.1/gdb/s390-tdep.c
7b26da
@@ -3032,6 +3032,11 @@ s390_gdbarch_init (struct gdbarch_info i
7b26da
   int have_linux_v1 = 0;
7b26da
   int have_linux_v2 = 0;
7b26da
   int first_pseudo_reg, last_pseudo_reg;
7b26da
+  static const char *const stap_register_prefixes[] = { "%", NULL };
7b26da
+  static const char *const stap_register_indirection_prefixes[] = { "(",
7b26da
+								    NULL };
7b26da
+  static const char *const stap_register_indirection_suffixes[] = { ")",
7b26da
+								    NULL };
7b26da
 
7b26da
   /* Default ABI and register size.  */
7b26da
   switch (info.bfd_arch_info->mach)
7b26da
@@ -3364,9 +3369,11 @@ s390_gdbarch_init (struct gdbarch_info i
7b26da
   set_gdbarch_get_siginfo_type (gdbarch, linux_get_siginfo_type);
7b26da
 
7b26da
   /* SystemTap functions.  */
7b26da
-  set_gdbarch_stap_register_prefix (gdbarch, "%");
7b26da
-  set_gdbarch_stap_register_indirection_prefix (gdbarch, "(");
7b26da
-  set_gdbarch_stap_register_indirection_suffix (gdbarch, ")");
7b26da
+  set_gdbarch_stap_register_prefixes (gdbarch, stap_register_prefixes);
7b26da
+  set_gdbarch_stap_register_indirection_prefixes (gdbarch,
7b26da
+					  stap_register_indirection_prefixes);
7b26da
+  set_gdbarch_stap_register_indirection_suffixes (gdbarch,
7b26da
+					  stap_register_indirection_suffixes);
7b26da
   set_gdbarch_stap_is_single_operand (gdbarch, s390_stap_is_single_operand);
7b26da
 
7b26da
   return gdbarch;
7b26da
Index: gdb-7.6.1/gdb/stap-probe.c
7b26da
===================================================================
7b26da
--- gdb-7.6.1.orig/gdb/stap-probe.c
7b26da
+++ gdb-7.6.1/gdb/stap-probe.c
7b26da
@@ -346,6 +346,191 @@ stap_get_expected_argument_type (struct
7b26da
     }
7b26da
 }
7b26da
 
7b26da
+/* Helper function to check for a generic list of prefixes.  GDBARCH
7b26da
+   is the current gdbarch being used.  S is the expression being
7b26da
+   analyzed.  If R is not NULL, it will be used to return the found
7b26da
+   prefix.  PREFIXES is the list of expected prefixes.
7b26da
+
7b26da
+   This function does a case-insensitive match.
7b26da
+
7b26da
+   Return 1 if any prefix has been found, zero otherwise.  */
7b26da
+
7b26da
+static int
7b26da
+stap_is_generic_prefix (struct gdbarch *gdbarch, const char *s,
7b26da
+			const char **r, const char *const *prefixes)
7b26da
+{
7b26da
+  const char *const *p;
7b26da
+
7b26da
+  if (prefixes == NULL)
7b26da
+    {
7b26da
+      if (r != NULL)
7b26da
+	*r = "";
7b26da
+
7b26da
+      return 1;
7b26da
+    }
7b26da
+
7b26da
+  for (p = prefixes; *p != NULL; ++p)
7b26da
+    {
7b26da
+      if (strncasecmp (s, *p, strlen (*p)) == 0)
7b26da
+	{
7b26da
+	  if (r != NULL)
7b26da
+	    *r = *p;
7b26da
+
7b26da
+	  return 1;
7b26da
+	}
7b26da
+    }
7b26da
+
7b26da
+  return 0;
7b26da
+}
7b26da
+
7b26da
+/* Return 1 if S points to a register prefix, zero otherwise.  For a
7b26da
+   description of the arguments, look at stap_is_generic_prefix.  */
7b26da
+
7b26da
+static int
7b26da
+stap_is_register_prefix (struct gdbarch *gdbarch, const char *s,
7b26da
+			 const char **r)
7b26da
+{
7b26da
+  const char *const *t = gdbarch_stap_register_prefixes (gdbarch);
7b26da
+
7b26da
+  return stap_is_generic_prefix (gdbarch, s, r, t);
7b26da
+}
7b26da
+
7b26da
+/* Return 1 if S points to a register indirection prefix, zero
7b26da
+   otherwise.  For a description of the arguments, look at
7b26da
+   stap_is_generic_prefix.  */
7b26da
+
7b26da
+static int
7b26da
+stap_is_register_indirection_prefix (struct gdbarch *gdbarch, const char *s,
7b26da
+				     const char **r)
7b26da
+{
7b26da
+  const char *const *t = gdbarch_stap_register_indirection_prefixes (gdbarch);
7b26da
+
7b26da
+  return stap_is_generic_prefix (gdbarch, s, r, t);
7b26da
+}
7b26da
+
7b26da
+/* Return 1 if S points to an integer prefix, zero otherwise.  For a
7b26da
+   description of the arguments, look at stap_is_generic_prefix.
7b26da
+
7b26da
+   This function takes care of analyzing whether we are dealing with
7b26da
+   an expected integer prefix, or, if there is no integer prefix to be
7b26da
+   expected, whether we are dealing with a digit.  It does a
7b26da
+   case-insensitive match.  */
7b26da
+
7b26da
+static int
7b26da
+stap_is_integer_prefix (struct gdbarch *gdbarch, const char *s,
7b26da
+			const char **r)
7b26da
+{
7b26da
+  const char *const *t = gdbarch_stap_integer_prefixes (gdbarch);
7b26da
+  const char *const *p;
7b26da
+
7b26da
+  if (t == NULL)
7b26da
+    {
7b26da
+      /* A NULL value here means that integers do not have a prefix.
7b26da
+	 We just check for a digit then.  */
7b26da
+      if (r != NULL)
7b26da
+	*r = "";
7b26da
+
7b26da
+      return isdigit (*s);
7b26da
+    }
7b26da
+
7b26da
+  for (p = t; *p != NULL; ++p)
7b26da
+    {
7b26da
+      size_t len = strlen (*p);
7b26da
+
7b26da
+      if ((len == 0 && isdigit (*s))
7b26da
+	  || (len > 0 && strncasecmp (s, *p, len) == 0))
7b26da
+	{
7b26da
+	  /* Integers may or may not have a prefix.  The "len == 0"
7b26da
+	     check covers the case when integers do not have a prefix
7b26da
+	     (therefore, we just check if we have a digit).  The call
7b26da
+	     to "strncasecmp" covers the case when they have a
7b26da
+	     prefix.  */
7b26da
+	  if (r != NULL)
7b26da
+	    *r = *p;
7b26da
+
7b26da
+	  return 1;
7b26da
+	}
7b26da
+    }
7b26da
+
7b26da
+  return 0;
7b26da
+}
7b26da
+
7b26da
+/* Helper function to check for a generic list of suffixes.  If we are
7b26da
+   not expecting any suffixes, then it just returns 1.  If we are
7b26da
+   expecting at least one suffix, then it returns 1 if a suffix has
7b26da
+   been found, zero otherwise.  GDBARCH is the current gdbarch being
7b26da
+   used.  S is the expression being analyzed.  If R is not NULL, it
7b26da
+   will be used to return the found suffix.  SUFFIXES is the list of
7b26da
+   expected suffixes.  This function does a case-insensitive
7b26da
+   match.  */
7b26da
+
7b26da
+static int
7b26da
+stap_generic_check_suffix (struct gdbarch *gdbarch, const char *s,
7b26da
+			   const char **r, const char *const *suffixes)
7b26da
+{
7b26da
+  const char *const *p;
7b26da
+  int found = 0;
7b26da
+
7b26da
+  if (suffixes == NULL)
7b26da
+    {
7b26da
+      if (r != NULL)
7b26da
+	*r = "";
7b26da
+
7b26da
+      return 1;
7b26da
+    }
7b26da
+
7b26da
+  for (p = suffixes; *p != NULL; ++p)
7b26da
+    if (strncasecmp (s, *p, strlen (*p)) == 0)
7b26da
+      {
7b26da
+	if (r != NULL)
7b26da
+	  *r = *p;
7b26da
+
7b26da
+	found = 1;
7b26da
+	break;
7b26da
+      }
7b26da
+
7b26da
+  return found;
7b26da
+}
7b26da
+
7b26da
+/* Return 1 if S points to an integer suffix, zero otherwise.  For a
7b26da
+   description of the arguments, look at
7b26da
+   stap_generic_check_suffix.  */
7b26da
+
7b26da
+static int
7b26da
+stap_check_integer_suffix (struct gdbarch *gdbarch, const char *s,
7b26da
+			   const char **r)
7b26da
+{
7b26da
+  const char *const *p = gdbarch_stap_integer_suffixes (gdbarch);
7b26da
+
7b26da
+  return stap_generic_check_suffix (gdbarch, s, r, p);
7b26da
+}
7b26da
+
7b26da
+/* Return 1 if S points to a register suffix, zero otherwise.  For a
7b26da
+   description of the arguments, look at
7b26da
+   stap_generic_check_suffix.  */
7b26da
+
7b26da
+static int
7b26da
+stap_check_register_suffix (struct gdbarch *gdbarch, const char *s,
7b26da
+			    const char **r)
7b26da
+{
7b26da
+  const char *const *p = gdbarch_stap_register_suffixes (gdbarch);
7b26da
+
7b26da
+  return stap_generic_check_suffix (gdbarch, s, r, p);
7b26da
+}
7b26da
+
7b26da
+/* Return 1 if S points to a register indirection suffix, zero
7b26da
+   otherwise.  For a description of the arguments, look at
7b26da
+   stap_generic_check_suffix.  */
7b26da
+
7b26da
+static int
7b26da
+stap_check_register_indirection_suffix (struct gdbarch *gdbarch, const char *s,
7b26da
+					const char **r)
7b26da
+{
7b26da
+  const char *const *p = gdbarch_stap_register_indirection_suffixes (gdbarch);
7b26da
+
7b26da
+  return stap_generic_check_suffix (gdbarch, s, r, p);
7b26da
+}
7b26da
+
7b26da
 /* Function responsible for parsing a register operand according to
7b26da
    SystemTap parlance.  Assuming:
7b26da
 
7b26da
@@ -385,24 +570,14 @@ stap_parse_register_operand (struct stap
7b26da
   const char *start;
7b26da
   char *regname;
7b26da
   int len;
7b26da
-
7b26da
-  /* Prefixes for the parser.  */
7b26da
-  const char *reg_prefix = gdbarch_stap_register_prefix (gdbarch);
7b26da
-  const char *reg_ind_prefix
7b26da
-    = gdbarch_stap_register_indirection_prefix (gdbarch);
7b26da
   const char *gdb_reg_prefix = gdbarch_stap_gdb_register_prefix (gdbarch);
7b26da
-  int reg_prefix_len = reg_prefix ? strlen (reg_prefix) : 0;
7b26da
-  int reg_ind_prefix_len = reg_ind_prefix ? strlen (reg_ind_prefix) : 0;
7b26da
   int gdb_reg_prefix_len = gdb_reg_prefix ? strlen (gdb_reg_prefix) : 0;
7b26da
-
7b26da
-  /* Suffixes for the parser.  */
7b26da
-  const char *reg_suffix = gdbarch_stap_register_suffix (gdbarch);
7b26da
-  const char *reg_ind_suffix
7b26da
-    = gdbarch_stap_register_indirection_suffix (gdbarch);
7b26da
   const char *gdb_reg_suffix = gdbarch_stap_gdb_register_suffix (gdbarch);
7b26da
-  int reg_suffix_len = reg_suffix ? strlen (reg_suffix) : 0;
7b26da
-  int reg_ind_suffix_len = reg_ind_suffix ? strlen (reg_ind_suffix) : 0;
7b26da
   int gdb_reg_suffix_len = gdb_reg_suffix ? strlen (gdb_reg_suffix) : 0;
7b26da
+  const char *reg_prefix;
7b26da
+  const char *reg_ind_prefix;
7b26da
+  const char *reg_suffix;
7b26da
+  const char *reg_ind_suffix;
7b26da
 
7b26da
   /* Checking for a displacement argument.  */
7b26da
   if (*p->arg == '+')
7b26da
@@ -436,11 +611,10 @@ stap_parse_register_operand (struct stap
7b26da
     }
7b26da
 
7b26da
   /* Getting rid of register indirection prefix.  */
7b26da
-  if (reg_ind_prefix
7b26da
-      && strncmp (p->arg, reg_ind_prefix, reg_ind_prefix_len) == 0)
7b26da
+  if (stap_is_register_indirection_prefix (gdbarch, p->arg, &reg_ind_prefix))
7b26da
     {
7b26da
       indirect_p = 1;
7b26da
-      p->arg += reg_ind_prefix_len;
7b26da
+      p->arg += strlen (reg_ind_prefix);
7b26da
     }
7b26da
 
7b26da
   if (disp_p && !indirect_p)
7b26da
@@ -448,8 +622,8 @@ stap_parse_register_operand (struct stap
7b26da
 	   p->saved_arg);
7b26da
 
7b26da
   /* Getting rid of register prefix.  */
7b26da
-  if (reg_prefix && strncmp (p->arg, reg_prefix, reg_prefix_len) == 0)
7b26da
-    p->arg += reg_prefix_len;
7b26da
+  if (stap_is_register_prefix (gdbarch, p->arg, &reg_prefix))
7b26da
+    p->arg += strlen (reg_prefix);
7b26da
 
7b26da
   /* Now we should have only the register name.  Let's extract it and get
7b26da
      the associated number.  */
7b26da
@@ -507,23 +681,21 @@ stap_parse_register_operand (struct stap
7b26da
     }
7b26da
 
7b26da
   /* Getting rid of the register name suffix.  */
7b26da
-  if (reg_suffix)
7b26da
-    {
7b26da
-      if (strncmp (p->arg, reg_suffix, reg_suffix_len) != 0)
7b26da
-	error (_("Missing register name suffix `%s' on expression `%s'."),
7b26da
-	       reg_suffix, p->saved_arg);
7b26da
-
7b26da
-      p->arg += reg_suffix_len;
7b26da
-    }
7b26da
+  if (stap_check_register_suffix (gdbarch, p->arg, &reg_suffix))
7b26da
+    p->arg += strlen (reg_suffix);
7b26da
+  else
7b26da
+    error (_("Missing register name suffix on expression `%s'."),
7b26da
+	   p->saved_arg);
7b26da
 
7b26da
   /* Getting rid of the register indirection suffix.  */
7b26da
-  if (indirect_p && reg_ind_suffix)
7b26da
+  if (indirect_p)
7b26da
     {
7b26da
-      if (strncmp (p->arg, reg_ind_suffix, reg_ind_suffix_len) != 0)
7b26da
-	error (_("Missing indirection suffix `%s' on expression `%s'."),
7b26da
-	       reg_ind_suffix, p->saved_arg);
7b26da
-
7b26da
-      p->arg += reg_ind_suffix_len;
7b26da
+      if (stap_check_register_indirection_suffix (gdbarch, p->arg,
7b26da
+						  &reg_ind_suffix))
7b26da
+	p->arg += strlen (reg_ind_suffix);
7b26da
+      else
7b26da
+	error (_("Missing indirection suffix on expression `%s'."),
7b26da
+	       p->saved_arg);
7b26da
     }
7b26da
 }
7b26da
 
7b26da
@@ -546,19 +718,7 @@ static void
7b26da
 stap_parse_single_operand (struct stap_parse_info *p)
7b26da
 {
7b26da
   struct gdbarch *gdbarch = p->gdbarch;
7b26da
-
7b26da
-  /* Prefixes for the parser.  */
7b26da
-  const char *const_prefix = gdbarch_stap_integer_prefix (gdbarch);
7b26da
-  const char *reg_prefix = gdbarch_stap_register_prefix (gdbarch);
7b26da
-  const char *reg_ind_prefix
7b26da
-    = gdbarch_stap_register_indirection_prefix (gdbarch);
7b26da
-  int const_prefix_len = const_prefix ? strlen (const_prefix) : 0;
7b26da
-  int reg_prefix_len = reg_prefix ? strlen (reg_prefix) : 0;
7b26da
-  int reg_ind_prefix_len = reg_ind_prefix ? strlen (reg_ind_prefix) : 0;
7b26da
-
7b26da
-  /* Suffixes for the parser.  */
7b26da
-  const char *const_suffix = gdbarch_stap_integer_suffix (gdbarch);
7b26da
-  int const_suffix_len = const_suffix ? strlen (const_suffix) : 0;
7b26da
+  const char *int_prefix = NULL;
7b26da
 
7b26da
   /* We first try to parse this token as a "special token".  */
7b26da
   if (gdbarch_stap_parse_special_token_p (gdbarch))
7b26da
@@ -600,8 +760,7 @@ stap_parse_single_operand (struct stap_p
7b26da
       if (isdigit (*tmp))
7b26da
 	number = strtol (tmp, (char **) &tmp, 10);
7b26da
 
7b26da
-      if (!reg_ind_prefix
7b26da
-	  || strncmp (tmp, reg_ind_prefix, reg_ind_prefix_len) != 0)
7b26da
+      if (!stap_is_register_indirection_prefix (gdbarch, tmp, NULL))
7b26da
 	{
7b26da
 	  /* This is not a displacement.  We skip the operator, and deal
7b26da
 	     with it later.  */
7b26da
@@ -629,15 +788,22 @@ stap_parse_single_operand (struct stap_p
7b26da
       const char *tmp = p->arg;
7b26da
       long number;
7b26da
 
7b26da
-      /* We can be dealing with a numeric constant (if `const_prefix' is
7b26da
-	 NULL), or with a register displacement.  */
7b26da
+      /* We can be dealing with a numeric constant, or with a register
7b26da
+	 displacement.  */
7b26da
       number = strtol (tmp, (char **) &tmp, 10);
7b26da
 
7b26da
       if (p->inside_paren_p)
7b26da
 	tmp = skip_spaces_const (tmp);
7b26da
-      if (!const_prefix && reg_ind_prefix
7b26da
-	  && strncmp (tmp, reg_ind_prefix, reg_ind_prefix_len) != 0)
7b26da
+
7b26da
+      /* If "stap_is_integer_prefix" returns true, it means we can
7b26da
+	 accept integers without a prefix here.  But we also need to
7b26da
+	 check whether the next token (i.e., "tmp") is not a register
7b26da
+	 indirection prefix.  */
7b26da
+      if (stap_is_integer_prefix (gdbarch, p->arg, NULL)
7b26da
+	  && !stap_is_register_indirection_prefix (gdbarch, tmp, NULL))
7b26da
 	{
7b26da
+	  const char *int_suffix;
7b26da
+
7b26da
 	  /* We are dealing with a numeric constant.  */
7b26da
 	  write_exp_elt_opcode (OP_LONG);
7b26da
 	  write_exp_elt_type (builtin_type (gdbarch)->builtin_long);
7b26da
@@ -646,29 +812,25 @@ stap_parse_single_operand (struct stap_p
7b26da
 
7b26da
 	  p->arg = tmp;
7b26da
 
7b26da
-	  if (const_suffix)
7b26da
-	    {
7b26da
-	      if (strncmp (p->arg, const_suffix, const_suffix_len) == 0)
7b26da
-		p->arg += const_suffix_len;
7b26da
-	      else
7b26da
-		error (_("Invalid constant suffix on expression `%s'."),
7b26da
-		       p->saved_arg);
7b26da
-	    }
7b26da
+	  if (stap_check_integer_suffix (gdbarch, p->arg, &int_suffix))
7b26da
+	    p->arg += strlen (int_suffix);
7b26da
+	  else
7b26da
+	    error (_("Invalid constant suffix on expression `%s'."),
7b26da
+		   p->saved_arg);
7b26da
 	}
7b26da
-      else if (reg_ind_prefix
7b26da
-	       && strncmp (tmp, reg_ind_prefix, reg_ind_prefix_len) == 0)
7b26da
+      else if (stap_is_register_indirection_prefix (gdbarch, tmp, NULL))
7b26da
 	stap_parse_register_operand (p);
7b26da
       else
7b26da
 	error (_("Unknown numeric token on expression `%s'."),
7b26da
 	       p->saved_arg);
7b26da
     }
7b26da
-  else if (const_prefix
7b26da
-	   && strncmp (p->arg, const_prefix, const_prefix_len) == 0)
7b26da
+  else if (stap_is_integer_prefix (gdbarch, p->arg, &int_prefix))
7b26da
     {
7b26da
       /* We are dealing with a numeric constant.  */
7b26da
       long number;
7b26da
+      const char *int_suffix;
7b26da
 
7b26da
-      p->arg += const_prefix_len;
7b26da
+      p->arg += strlen (int_prefix);
7b26da
       number = strtol (p->arg, (char **) &p->arg, 10);
7b26da
 
7b26da
       write_exp_elt_opcode (OP_LONG);
7b26da
@@ -676,19 +838,14 @@ stap_parse_single_operand (struct stap_p
7b26da
       write_exp_elt_longcst (number);
7b26da
       write_exp_elt_opcode (OP_LONG);
7b26da
 
7b26da
-      if (const_suffix)
7b26da
-	{
7b26da
-	  if (strncmp (p->arg, const_suffix, const_suffix_len) == 0)
7b26da
-	    p->arg += const_suffix_len;
7b26da
-	  else
7b26da
-	    error (_("Invalid constant suffix on expression `%s'."),
7b26da
-		   p->saved_arg);
7b26da
-	}
7b26da
+      if (stap_check_integer_suffix (gdbarch, p->arg, &int_suffix))
7b26da
+	p->arg += strlen (int_suffix);
7b26da
+      else
7b26da
+	error (_("Invalid constant suffix on expression `%s'."),
7b26da
+	       p->saved_arg);
7b26da
     }
7b26da
-  else if ((reg_prefix
7b26da
-	    && strncmp (p->arg, reg_prefix, reg_prefix_len) == 0)
7b26da
-	   || (reg_ind_prefix
7b26da
-	       && strncmp (p->arg, reg_ind_prefix, reg_ind_prefix_len) == 0))
7b26da
+  else if (stap_is_register_prefix (gdbarch, p->arg, NULL)
7b26da
+	   || stap_is_register_indirection_prefix (gdbarch, p->arg, NULL))
7b26da
     stap_parse_register_operand (p);
7b26da
   else
7b26da
     error (_("Operator `%c' not recognized on expression `%s'."),