2007-07-02 Markus Deuling <deuling@de.ibm.com>
[deliverable/binutils-gdb.git] / gdb / linespec.c
index cf6e6f6fa46b91e8186550a5faa92e2ff0c2231f..9043ca6651be5826d3b6b4af63fa368ca1d3b97e 100644 (file)
@@ -1,7 +1,7 @@
 /* Parser for linespec for the GNU debugger, GDB.
 
-   Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
-   1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+   Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
+   1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007
    Free Software Foundation, Inc.
 
    This file is part of GDB.
@@ -18,8 +18,8 @@
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
 
 #include "defs.h"
 #include "symtab.h"
@@ -37,6 +37,7 @@
 #include "objc-lang.h"
 #include "linespec.h"
 #include "exceptions.h"
+#include "language.h"
 
 /* We share this one with symtab.c, but it is not exported widely. */
 
@@ -75,6 +76,7 @@ static struct symtabs_and_lines find_method (int funfirstline,
                                             struct symbol *sym_class);
 
 static int collect_methods (char *copy, struct type *t,
+                           struct symbol *sym_class,
                            struct symbol **sym_arr);
 
 static NORETURN void cplusplus_error (const char *name,
@@ -83,12 +85,15 @@ static NORETURN void cplusplus_error (const char *name,
 
 static int total_number_of_methods (struct type *type);
 
-static int find_methods (struct type *, char *, struct symbol **);
+static int find_methods (struct type *, char *,
+                        enum language, struct symbol **);
 
 static int add_matching_methods (int method_counter, struct type *t,
+                                enum language language,
                                 struct symbol **sym_arr);
 
 static int add_constructors (int method_counter, struct type *t,
+                            enum language language,
                             struct symbol **sym_arr);
 
 static void build_canonical_line_spec (struct symtab_and_line *,
@@ -196,7 +201,8 @@ total_number_of_methods (struct type *type)
    Note that this function is g++ specific.  */
 
 static int
-find_methods (struct type *t, char *name, struct symbol **sym_arr)
+find_methods (struct type *t, char *name, enum language language,
+             struct symbol **sym_arr)
 {
   int i1 = 0;
   int ibase;
@@ -206,8 +212,8 @@ find_methods (struct type *t, char *name, struct symbol **sym_arr)
      unless we figure out how to get the physname without the name of
      the class, then the loop can't do any good.  */
   if (class_name
-      && (lookup_symbol (class_name, (struct block *) NULL,
-                        STRUCT_DOMAIN, (int *) NULL,
+      && (lookup_symbol_in_language (class_name, (struct block *) NULL,
+                        STRUCT_DOMAIN, language, (int *) NULL,
                         (struct symtab **) NULL)))
     {
       int method_counter;
@@ -238,12 +244,12 @@ find_methods (struct type *t, char *name, struct symbol **sym_arr)
 
          if (strcmp_iw (name, method_name) == 0)
            /* Find all the overloaded methods with that name.  */
-           i1 += add_matching_methods (method_counter, t,
+           i1 += add_matching_methods (method_counter, t, language,
                                        sym_arr + i1);
          else if (strncmp (class_name, name, name_len) == 0
                   && (class_name[name_len] == '\0'
                       || class_name[name_len] == '<'))
-           i1 += add_constructors (method_counter, t,
+           i1 += add_constructors (method_counter, t, language,
                                    sym_arr + i1);
        }
     }
@@ -261,7 +267,8 @@ find_methods (struct type *t, char *name, struct symbol **sym_arr)
 
   if (i1 == 0)
     for (ibase = 0; ibase < TYPE_N_BASECLASSES (t); ibase++)
-      i1 += find_methods (TYPE_BASECLASS (t, ibase), name, sym_arr + i1);
+      i1 += find_methods (TYPE_BASECLASS (t, ibase), name,
+                         language, sym_arr + i1);
 
   return i1;
 }
@@ -272,7 +279,7 @@ find_methods (struct type *t, char *name, struct symbol **sym_arr)
 
 static int
 add_matching_methods (int method_counter, struct type *t,
-                     struct symbol **sym_arr)
+                     enum language language, struct symbol **sym_arr)
 {
   int field_counter;
   int i1 = 0;
@@ -299,14 +306,15 @@ add_matching_methods (int method_counter, struct type *t,
        }
       else
        phys_name = TYPE_FN_FIELD_PHYSNAME (f, field_counter);
-               
+
       /* Destructor is handled by caller, don't add it to
         the list.  */
       if (is_destructor_name (phys_name) != 0)
        continue;
 
-      sym_arr[i1] = lookup_symbol (phys_name,
+      sym_arr[i1] = lookup_symbol_in_language (phys_name,
                                   NULL, VAR_DOMAIN,
+                                  language,
                                   (int *) NULL,
                                   (struct symtab **) NULL);
       if (sym_arr[i1])
@@ -333,7 +341,7 @@ add_matching_methods (int method_counter, struct type *t,
 
 static int
 add_constructors (int method_counter, struct type *t,
-                 struct symbol **sym_arr)
+                 enum language language, struct symbol **sym_arr)
 {
   int field_counter;
   int i1 = 0;
@@ -349,7 +357,7 @@ add_constructors (int method_counter, struct type *t,
     {
       struct fn_field *f;
       char *phys_name;
-                 
+
       f = TYPE_FN_FIELDLIST1 (t, method_counter);
 
       /* GCC 3.x will never produce stabs stub methods, so
@@ -362,8 +370,9 @@ add_constructors (int method_counter, struct type *t,
 
       /* If this method is actually defined, include it in the
         list.  */
-      sym_arr[i1] = lookup_symbol (phys_name,
+      sym_arr[i1] = lookup_symbol_in_language (phys_name,
                                   NULL, VAR_DOMAIN,
+                                  language,
                                   (int *) NULL,
                                   (struct symtab **) NULL);
       if (sym_arr[i1])
@@ -1080,8 +1089,8 @@ decode_objc (char **argptr, int funfirstline, struct symtab *file_symtab,
   struct symbol *sym = NULL;
   char *copy = NULL;
   struct block *block = NULL;
-  int i1 = 0;
-  int i2 = 0;
+  unsigned i1 = 0;
+  unsigned i2 = 0;
 
   values.sals = NULL;
   values.nelts = 0;
@@ -1410,7 +1419,7 @@ find_method (int funfirstline, char ***canonical, char *saved_arg,
   /* Find all methods with a matching name, and put them in
      sym_arr.  */
 
-  i1 = collect_methods (copy, t, sym_arr);
+  i1 = collect_methods (copy, t, sym_class, sym_arr);
 
   if (i1 == 1)
     {
@@ -1427,6 +1436,7 @@ find_method (int funfirstline, char ***canonical, char *saved_arg,
        }
       else
        {
+         values.sals = NULL;
          values.nelts = 0;
        }
       return values;
@@ -1465,7 +1475,7 @@ find_method (int funfirstline, char ***canonical, char *saved_arg,
 
 static int
 collect_methods (char *copy, struct type *t,
-                struct symbol **sym_arr)
+                struct symbol *sym_class, struct symbol **sym_arr)
 {
   int i1 = 0;  /*  Counter for the symbol array.  */
 
@@ -1487,7 +1497,7 @@ collect_methods (char *copy, struct type *t,
        }
     }
   else
-    i1 = find_methods (t, copy, sym_arr);
+    i1 = find_methods (t, copy, SYMBOL_LANGUAGE (sym_class), sym_arr);
 
   return i1;
 }
@@ -1823,8 +1833,10 @@ minsym_found (int funfirstline, struct minimal_symbol *msymbol)
   values.sals[0].section = SYMBOL_BFD_SECTION (msymbol);
   if (funfirstline)
     {
-      values.sals[0].pc += DEPRECATED_FUNCTION_START_OFFSET;
-      values.sals[0].pc = SKIP_PROLOGUE (values.sals[0].pc);
+      values.sals[0].pc
+       += gdbarch_deprecated_function_start_offset (current_gdbarch);
+      values.sals[0].pc = gdbarch_skip_prologue
+                           (current_gdbarch, values.sals[0].pc);
     }
   values.nelts = 1;
   return values;
This page took 0.027178 seconds and 4 git commands to generate.