keiths / rpms / gdb

Forked from rpms/gdb 13 days ago
Clone
e3c8b47
--- ./gdb/linespec.c	2008-08-27 00:27:33.000000000 +0200
e3c8b47
+++ ./gdb/linespec.c	2008-08-27 00:53:16.000000000 +0200
e3c8b47
@@ -284,6 +284,15 @@ find_methods (struct type *t, char *name
e3c8b47
 }
e3c8b47
 
e3c8b47
 static int
e3c8b47
+add_minsym_members_compar (const void *ap, const void *bp)
e3c8b47
+{
e3c8b47
+  const char *a = *(const char **) ap;
e3c8b47
+  const char *b = *(const char **) bp;
e3c8b47
+
e3c8b47
+  return strcmp (a, b);
e3c8b47
+}
e3c8b47
+
e3c8b47
+static int
e3c8b47
 add_minsym_members (const char *class_name,
e3c8b47
 		    const char *member_name,
e3c8b47
 		    struct minimal_symbol **msym_arr)
e3c8b47
@@ -293,6 +302,7 @@ add_minsym_members (const char *class_na
e3c8b47
   int i;
e3c8b47
   int comp_len;
e3c8b47
   int counter = 0;
e3c8b47
+  int src_i, dst_i;
e3c8b47
 
e3c8b47
   /* To find the member, we first cheat and use symbol completion.
e3c8b47
      This will give us a list of all the member names including
e3c8b47
@@ -307,6 +317,28 @@ add_minsym_members (const char *class_na
e3c8b47
   strcat (completion_name, "(");
e3c8b47
   list = make_symbol_completion_list (completion_name,
e3c8b47
 				      completion_name+1);
e3c8b47
+  if (list == NULL || list[0] == NULL)
e3c8b47
+    {
e3c8b47
+      xfree (completion_name);
e3c8b47
+      return 0;
e3c8b47
+    }
e3c8b47
+
e3c8b47
+  /* Make the list entries unique - Multi-PC breakpoints are already resolved
e3c8b47
+     by GDB-6.8+.  */
e3c8b47
+  counter = 0;
e3c8b47
+  while (list && list[counter] != NULL)
e3c8b47
+    counter++;
e3c8b47
+  qsort (list, counter, sizeof (*list), add_minsym_members_compar);
e3c8b47
+  src_i = dst_i = 0;
e3c8b47
+  while (src_i + 1 < counter)
e3c8b47
+    {
e3c8b47
+      if (strcmp (list[src_i], list[src_i + 1]) != 0)
e3c8b47
+	list[dst_i++] = list[src_i];
e3c8b47
+      src_i++;
e3c8b47
+    }
e3c8b47
+  list[dst_i++] = list[src_i++];
e3c8b47
+  gdb_assert (list[src_i] == NULL);
e3c8b47
+  list[dst_i] = 0;
e3c8b47
 
e3c8b47
   /* Now that we have the list, we generate an array of their
e3c8b47
      corresponding minimal symbols.  */
e3c8b47
@@ -319,6 +351,8 @@ add_minsym_members (const char *class_na
e3c8b47
 
e3c8b47
   xfree (list);
e3c8b47
 
e3c8b47
+#if 0 /* Multi-PC breakpoints are already resolved by GDB-6.8+.  */
e3c8b47
+
e3c8b47
   /* In the case of constructors, there may be in-charge vs not-in-charge
e3c8b47
      constructors.  Check for names with $base which indicates not-in-charge
e3c8b47
      constructors.  */
e3c8b47
@@ -353,6 +387,8 @@ add_minsym_members (const char *class_na
e3c8b47
     }
e3c8b47
   xfree (list);
e3c8b47
 
e3c8b47
+#endif /* Multi-PC breakpoints are already resolved by GDB-6.8+.  */
e3c8b47
+
e3c8b47
   xfree (completion_name);
e3c8b47
 
e3c8b47
   return counter;