include/elf/
[deliverable/binutils-gdb.git] / gdb / objc-lang.c
index 2567ed2b3095d7b247ce9ba09ab785985c8b7d9c..a6c74a3692fb655815d939b5ad3f703f0eba713e 100644 (file)
@@ -1,6 +1,7 @@
 /* Objective-C language support routines for GDB, the GNU debugger.
 
-   Copyright (C) 2002, 2003, 2004, 2005, 2007 Free Software Foundation, Inc.
+   Copyright (C) 2002, 2003, 2004, 2005, 2007, 2008, 2009
+   Free Software Foundation, Inc.
 
    Contributed by Apple Computer, Inc.
    Written by Michael Snyder.
@@ -9,7 +10,7 @@
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -18,9 +19,7 @@
    GNU General Public License for more details.
 
    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., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "defs.h"
 #include "symtab.h"
@@ -86,8 +85,7 @@ lookup_struct_typedef (char *name, struct block *block, int noerr)
 {
   struct symbol *sym;
 
-  sym = lookup_symbol (name, block, STRUCT_DOMAIN, 0, 
-                      (struct symtab **) NULL);
+  sym = lookup_symbol (name, block, STRUCT_DOMAIN, 0);
 
   if (sym == NULL)
     {
@@ -119,9 +117,9 @@ lookup_objc_class (char *classname)
     }
 
   if (lookup_minimal_symbol("objc_lookUpClass", 0, 0))
-    function = find_function_in_inferior("objc_lookUpClass");
+    function = find_function_in_inferior("objc_lookUpClass", NULL);
   else if (lookup_minimal_symbol ("objc_lookup_class", 0, 0))
-    function = find_function_in_inferior("objc_lookup_class");
+    function = find_function_in_inferior("objc_lookup_class", NULL);
   else
     {
       complaint (&symfile_complaints, _("no way to lookup Objective-C classes"));
@@ -146,9 +144,9 @@ lookup_child_selector (char *selname)
     }
 
   if (lookup_minimal_symbol("sel_getUid", 0, 0))
-    function = find_function_in_inferior("sel_getUid");
+    function = find_function_in_inferior("sel_getUid", NULL);
   else if (lookup_minimal_symbol ("sel_get_any_uid", 0, 0))
-    function = find_function_in_inferior("sel_get_any_uid");
+    function = find_function_in_inferior("sel_get_any_uid", NULL);
   else
     {
       complaint (&symfile_complaints, _("no way to lookup Objective-C selectors"));
@@ -167,43 +165,50 @@ value_nsstring (char *ptr, int len)
   struct value *function, *nsstringValue;
   struct symbol *sym;
   struct type *type;
+  struct objfile *objf;
+  struct gdbarch *gdbarch;
 
   if (!target_has_execution)
     return 0;          /* Can't call into inferior to create NSString.  */
 
-  sym = lookup_struct_typedef("NSString", 0, 1);
-  if (sym == NULL)
-    sym = lookup_struct_typedef("NXString", 0, 1);
-  if (sym == NULL)
-    type = lookup_pointer_type(builtin_type_void);
-  else
-    type = lookup_pointer_type(SYMBOL_TYPE (sym));
-
   stringValue[2] = value_string(ptr, len);
   stringValue[2] = value_coerce_array(stringValue[2]);
   /* _NSNewStringFromCString replaces "istr" after Lantern2A.  */
   if (lookup_minimal_symbol("_NSNewStringFromCString", 0, 0))
     {
-      function = find_function_in_inferior("_NSNewStringFromCString");
+      function = find_function_in_inferior("_NSNewStringFromCString", &objf);
       nsstringValue = call_function_by_hand(function, 1, &stringValue[2]);
     }
   else if (lookup_minimal_symbol("istr", 0, 0))
     {
-      function = find_function_in_inferior("istr");
+      function = find_function_in_inferior("istr", &objf);
       nsstringValue = call_function_by_hand(function, 1, &stringValue[2]);
     }
   else if (lookup_minimal_symbol("+[NSString stringWithCString:]", 0, 0))
     {
-      function = find_function_in_inferior("+[NSString stringWithCString:]");
+      function
+       = find_function_in_inferior("+[NSString stringWithCString:]", &objf);
+      type = builtin_type (get_objfile_arch (objf))->builtin_long;
+
       stringValue[0] = value_from_longest 
-       (builtin_type_long, lookup_objc_class ("NSString"));
+       (type, lookup_objc_class ("NSString"));
       stringValue[1] = value_from_longest 
-       (builtin_type_long, lookup_child_selector ("stringWithCString:"));
+       (type, lookup_child_selector ("stringWithCString:"));
       nsstringValue = call_function_by_hand(function, 3, &stringValue[0]);
     }
   else
     error (_("NSString: internal error -- no way to create new NSString"));
 
+  gdbarch = get_objfile_arch (objf);
+
+  sym = lookup_struct_typedef("NSString", 0, 1);
+  if (sym == NULL)
+    sym = lookup_struct_typedef("NXString", 0, 1);
+  if (sym == NULL)
+    type = builtin_type (gdbarch)->builtin_data_ptr;
+  else
+    type = lookup_pointer_type(SYMBOL_TYPE (sym));
+
   deprecated_set_value_type (nsstringValue, type);
   return nsstringValue;
 }
@@ -336,7 +341,8 @@ objc_printchar (int c, struct ui_file *stream)
 
 static void
 objc_printstr (struct ui_file *stream, const gdb_byte *string, 
-              unsigned int length, int width, int force_ellipses)
+              unsigned int length, int width, int force_ellipses,
+              const struct value_print_options *options)
 {
   unsigned int i;
   unsigned int things_printed = 0;
@@ -355,7 +361,7 @@ objc_printstr (struct ui_file *stream, const gdb_byte *string,
       return;
     }
 
-  for (i = 0; i < length && things_printed < print_max; ++i)
+  for (i = 0; i < length && things_printed < options->print_max; ++i)
     {
       /* Position of the character we are examining to see whether it
         is repeated.  */
@@ -379,11 +385,11 @@ objc_printstr (struct ui_file *stream, const gdb_byte *string,
          ++reps;
        }
 
-      if (reps > repeat_count_threshold)
+      if (reps > options->repeat_count_threshold)
        {
          if (in_quotes)
            {
-             if (inspect_it)
+             if (options->inspect_it)
                fputs_filtered ("\\\", ", stream);
              else
                fputs_filtered ("\", ", stream);
@@ -392,14 +398,14 @@ objc_printstr (struct ui_file *stream, const gdb_byte *string,
          objc_printchar (string[i], stream);
          fprintf_filtered (stream, " <repeats %u times>", reps);
          i = rep1 - 1;
-         things_printed += repeat_count_threshold;
+         things_printed += options->repeat_count_threshold;
          need_comma = 1;
        }
       else
        {
          if (!in_quotes)
            {
-             if (inspect_it)
+             if (options->inspect_it)
                fputs_filtered ("\\\"", stream);
              else
                fputs_filtered ("\"", stream);
@@ -413,7 +419,7 @@ objc_printstr (struct ui_file *stream, const gdb_byte *string,
   /* Terminate the quotes if necessary.  */
   if (in_quotes)
     {
-      if (inspect_it)
+      if (options->inspect_it)
        fputs_filtered ("\\\"", stream);
       else
        fputs_filtered ("\"", stream);
@@ -423,152 +429,6 @@ objc_printstr (struct ui_file *stream, const gdb_byte *string,
     fputs_filtered ("...", stream);
 }
 
-/* Create a fundamental C type using default reasonable for the
-   current target.
-
-   Some object/debugging file formats (DWARF version 1, COFF, etc) do
-   not define fundamental types such as "int" or "double".  Others
-   (stabs or DWARF version 2, etc) do define fundamental types.  For
-   the formats which don't provide fundamental types, gdb can create
-   such types using this function.
-
-   FIXME: Some compilers distinguish explicitly signed integral types
-   (signed short, signed int, signed long) from "regular" integral
-   types (short, int, long) in the debugging information.  There is
-   some disagreement as to how useful this feature is.  In particular,
-   gcc does not support this.  Also, only some debugging formats allow
-   the distinction to be passed on to a debugger.  For now, we always
-   just use "short", "int", or "long" as the type name, for both the
-   implicit and explicitly signed types.  This also makes life easier
-   for the gdb test suite since we don't have to account for the
-   differences in output depending upon what the compiler and
-   debugging format support.  We will probably have to re-examine the
-   issue when gdb starts taking it's fundamental type information
-   directly from the debugging information supplied by the compiler.
-   fnf@cygnus.com */
-
-static struct type *
-objc_create_fundamental_type (struct objfile *objfile, int typeid)
-{
-  struct type *type = NULL;
-
-  switch (typeid)
-    {
-      default:
-       /* FIXME: For now, if we are asked to produce a type not in
-          this language, create the equivalent of a C integer type
-          with the name "<?type?>".  When all the dust settles from
-          the type reconstruction work, this should probably become
-          an error.  */
-       type = init_type (TYPE_CODE_INT,
-                         gdbarch_int_bit (current_gdbarch) / TARGET_CHAR_BIT,
-                         0, "<?type?>", objfile);
-        warning (_("internal error: no C/C++ fundamental type %d"), typeid);
-       break;
-      case FT_VOID:
-       type = init_type (TYPE_CODE_VOID,
-                         TARGET_CHAR_BIT / TARGET_CHAR_BIT,
-                         0, "void", objfile);
-       break;
-      case FT_CHAR:
-       type = init_type (TYPE_CODE_INT,
-                         TARGET_CHAR_BIT / TARGET_CHAR_BIT,
-                         0, "char", objfile);
-       break;
-      case FT_SIGNED_CHAR:
-       type = init_type (TYPE_CODE_INT,
-                         TARGET_CHAR_BIT / TARGET_CHAR_BIT,
-                         0, "signed char", objfile);
-       break;
-      case FT_UNSIGNED_CHAR:
-       type = init_type (TYPE_CODE_INT,
-                         TARGET_CHAR_BIT / TARGET_CHAR_BIT,
-                         TYPE_FLAG_UNSIGNED, "unsigned char", objfile);
-       break;
-      case FT_SHORT:
-       type = init_type (TYPE_CODE_INT,
-                         gdbarch_short_bit (current_gdbarch) / TARGET_CHAR_BIT,
-                         0, "short", objfile);
-       break;
-      case FT_SIGNED_SHORT:
-       type = init_type (TYPE_CODE_INT,
-                         gdbarch_short_bit (current_gdbarch) / TARGET_CHAR_BIT,
-                         0, "short", objfile); /* FIXME-fnf */
-       break;
-      case FT_UNSIGNED_SHORT:
-       type = init_type (TYPE_CODE_INT,
-                         gdbarch_short_bit (current_gdbarch) / TARGET_CHAR_BIT,
-                         TYPE_FLAG_UNSIGNED, "unsigned short", objfile);
-       break;
-      case FT_INTEGER:
-       type = init_type (TYPE_CODE_INT,
-                         gdbarch_int_bit (current_gdbarch) / TARGET_CHAR_BIT,
-                         0, "int", objfile);
-       break;
-      case FT_SIGNED_INTEGER:
-       type = init_type (TYPE_CODE_INT,
-                         gdbarch_int_bit (current_gdbarch) / TARGET_CHAR_BIT,
-                         0, "int", objfile); /* FIXME -fnf */
-       break;
-      case FT_UNSIGNED_INTEGER:
-       type = init_type (TYPE_CODE_INT,
-                         gdbarch_int_bit (current_gdbarch) / TARGET_CHAR_BIT,
-                         TYPE_FLAG_UNSIGNED, "unsigned int", objfile);
-       break;
-      case FT_LONG:
-       type = init_type (TYPE_CODE_INT,
-                         gdbarch_long_bit (current_gdbarch) / TARGET_CHAR_BIT,
-                         0, "long", objfile);
-       break;
-      case FT_SIGNED_LONG:
-       type = init_type (TYPE_CODE_INT,
-                         gdbarch_long_bit (current_gdbarch) / TARGET_CHAR_BIT,
-                         0, "long", objfile); /* FIXME -fnf */
-       break;
-      case FT_UNSIGNED_LONG:
-       type = init_type (TYPE_CODE_INT,
-                         gdbarch_long_bit (current_gdbarch) / TARGET_CHAR_BIT,
-                         TYPE_FLAG_UNSIGNED, "unsigned long", objfile);
-       break;
-      case FT_LONG_LONG:
-       type = init_type (TYPE_CODE_INT,
-                         gdbarch_long_long_bit (current_gdbarch)
-                           / TARGET_CHAR_BIT,
-                         0, "long long", objfile);
-       break;
-      case FT_SIGNED_LONG_LONG:
-       type = init_type (TYPE_CODE_INT,
-                         gdbarch_long_long_bit (current_gdbarch)
-                           / TARGET_CHAR_BIT,
-                         0, "signed long long", objfile);
-       break;
-      case FT_UNSIGNED_LONG_LONG:
-       type = init_type (TYPE_CODE_INT,
-                         gdbarch_long_long_bit (current_gdbarch)
-                           / TARGET_CHAR_BIT,
-                         TYPE_FLAG_UNSIGNED, "unsigned long long", objfile);
-       break;
-      case FT_FLOAT:
-       type = init_type (TYPE_CODE_FLT,
-                         gdbarch_float_bit (current_gdbarch) / TARGET_CHAR_BIT,
-                         0, "float", objfile);
-       break;
-      case FT_DBL_PREC_FLOAT:
-       type = init_type (TYPE_CODE_FLT,
-                         gdbarch_double_bit (current_gdbarch)
-                           / TARGET_CHAR_BIT,
-                         0, "double", objfile);
-       break;
-      case FT_EXT_PREC_FLOAT:
-       type = init_type (TYPE_CODE_FLT,
-                         gdbarch_long_double_bit (current_gdbarch)
-                           / TARGET_CHAR_BIT,
-                         0, "long double", objfile);
-       break;
-      }
-  return (type);
-}
-
 /* Determine if we are currently in the Objective-C dispatch function.
    If so, get the address of the method function that the dispatcher
    would call and use that as the function to step into instead. Also
@@ -638,36 +498,14 @@ static const struct op_print objc_op_print_tab[] =
     {NULL, OP_NULL, PREC_NULL, 0}
 };
 
-struct type ** const (objc_builtin_types[]) = 
-{
-  &builtin_type_int,
-  &builtin_type_long,
-  &builtin_type_short,
-  &builtin_type_char,
-  &builtin_type_float,
-  &builtin_type_double,
-  &builtin_type_void,
-  &builtin_type_long_long,
-  &builtin_type_signed_char,
-  &builtin_type_unsigned_char,
-  &builtin_type_unsigned_short,
-  &builtin_type_unsigned_int,
-  &builtin_type_unsigned_long,
-  &builtin_type_unsigned_long_long,
-  &builtin_type_long_double,
-  &builtin_type_complex,
-  &builtin_type_double_complex,
-  0
-};
-
 const struct language_defn objc_language_defn = {
   "objective-c",               /* Language name */
   language_objc,
-  objc_builtin_types,
   range_check_off,
   type_check_off,
   case_sensitive_on,
   array_row_major,
+  macro_expansion_c,
   &exp_descriptor_standard,
   objc_parse,
   objc_error,
@@ -675,12 +513,12 @@ const struct language_defn objc_language_defn = {
   objc_printchar,              /* Print a character constant */
   objc_printstr,               /* Function to print string constant */
   objc_emit_char,
-  objc_create_fundamental_type,        /* Create fundamental type in this language */
   c_print_type,                        /* Print a type using appropriate syntax */
+  c_print_typedef,             /* Print a typedef using appropriate syntax */
   c_val_print,                 /* Print a value using appropriate syntax */
   c_value_print,               /* Print a top-level value */
   objc_skip_trampoline,        /* Language specific skip_trampoline */
-  value_of_this,               /* value_of_this */
+  "self",                      /* name_of_this */
   basic_lookup_symbol_nonlocal,        /* lookup_symbol_nonlocal */
   basic_lookup_transparent_type,/* lookup_transparent_type */
   objc_demangle,               /* Language specific symbol demangler */
@@ -688,10 +526,12 @@ const struct language_defn objc_language_defn = {
   objc_op_print_tab,           /* Expression operators for printing */
   1,                           /* C-style arrays */
   0,                           /* String lower bound */
-  &builtin_type_char,          /* Type of string elements */
   default_word_break_characters,
-  NULL, /* FIXME: la_language_arch_info.  */
+  default_make_symbol_completion_list,
+  c_language_arch_info,
   default_print_array_index,
+  default_pass_by_reference,
+  default_get_string,
   LANG_MAGIC
 };
 
@@ -1316,7 +1156,8 @@ find_methods (struct symtab *symtab, char type,
     {
       QUIT;
 
-      if ((msymbol->type != mst_text) && (msymbol->type != mst_file_text))
+      if ((MSYMBOL_TYPE (msymbol) != mst_text)
+         && (MSYMBOL_TYPE (msymbol) != mst_file_text))
        /* Not a function or method.  */
        continue;
 
@@ -1442,7 +1283,7 @@ char *find_imps (struct symtab *symtab, struct block *block,
     if (tmp == NULL)
       return NULL;
     
-    sym = lookup_symbol (selector, block, VAR_DOMAIN, 0, NULL);
+    sym = lookup_symbol (selector, block, VAR_DOMAIN, 0);
     if (sym != NULL) 
       {
        if (syms)
@@ -1549,7 +1390,7 @@ print_object_command (char *args, int from_tty)
     int pc = 0;
 
     object = expr->language_defn->la_exp_desc->evaluate_exp 
-      (builtin_type_void_data_ptr, expr, &pc, EVAL_NORMAL);
+      (builtin_type (expr->gdbarch)->builtin_data_ptr, expr, &pc, EVAL_NORMAL);
     do_cleanups (old_chain);
   }
 
@@ -1557,7 +1398,7 @@ print_object_command (char *args, int from_tty)
   object_addr = value_as_long (object);
   read_memory (object_addr, &c, 1);
 
-  function = find_function_in_inferior ("_NSPrintForDebugger");
+  function = find_function_in_inferior ("_NSPrintForDebugger", NULL);
   if (function == NULL)
     error (_("Unable to locate _NSPrintForDebugger in child process"));
 
@@ -1850,19 +1691,19 @@ find_implementation (CORE_ADDR object, CORE_ADDR sel)
   return find_implementation_from_class (ostr.isa, sel);
 }
 
-#define OBJC_FETCH_POINTER_ARGUMENT(argi) \
-  gdbarch_fetch_pointer_argument (current_gdbarch, get_current_frame (), \
-                                 argi, builtin_type_void_func_ptr)
-
 static int
 resolve_msgsend (CORE_ADDR pc, CORE_ADDR *new_pc)
 {
+  struct frame_info *frame = get_current_frame ();
+  struct gdbarch *gdbarch = get_frame_arch (frame);
+  struct type *ptr_type = builtin_type (gdbarch)->builtin_func_ptr;
+
   CORE_ADDR object;
   CORE_ADDR sel;
   CORE_ADDR res;
 
-  object = OBJC_FETCH_POINTER_ARGUMENT (0);
-  sel = OBJC_FETCH_POINTER_ARGUMENT (1);
+  object = gdbarch_fetch_pointer_argument (gdbarch, frame, 0, ptr_type);
+  sel = gdbarch_fetch_pointer_argument (gdbarch, frame, 1, ptr_type);
 
   res = find_implementation (object, sel);
   if (new_pc != 0)
@@ -1875,12 +1716,16 @@ resolve_msgsend (CORE_ADDR pc, CORE_ADDR *new_pc)
 static int
 resolve_msgsend_stret (CORE_ADDR pc, CORE_ADDR *new_pc)
 {
+  struct frame_info *frame = get_current_frame ();
+  struct gdbarch *gdbarch = get_frame_arch (frame);
+  struct type *ptr_type = builtin_type (gdbarch)->builtin_func_ptr;
+
   CORE_ADDR object;
   CORE_ADDR sel;
   CORE_ADDR res;
 
-  object = OBJC_FETCH_POINTER_ARGUMENT (1);
-  sel = OBJC_FETCH_POINTER_ARGUMENT (2);
+  object = gdbarch_fetch_pointer_argument (gdbarch, frame, 1, ptr_type);
+  sel = gdbarch_fetch_pointer_argument (gdbarch, frame, 2, ptr_type);
 
   res = find_implementation (object, sel);
   if (new_pc != 0)
@@ -1893,14 +1738,18 @@ resolve_msgsend_stret (CORE_ADDR pc, CORE_ADDR *new_pc)
 static int
 resolve_msgsend_super (CORE_ADDR pc, CORE_ADDR *new_pc)
 {
+  struct frame_info *frame = get_current_frame ();
+  struct gdbarch *gdbarch = get_frame_arch (frame);
+  struct type *ptr_type = builtin_type (gdbarch)->builtin_func_ptr;
+
   struct objc_super sstr;
 
   CORE_ADDR super;
   CORE_ADDR sel;
   CORE_ADDR res;
 
-  super = OBJC_FETCH_POINTER_ARGUMENT (0);
-  sel = OBJC_FETCH_POINTER_ARGUMENT (1);
+  super = gdbarch_fetch_pointer_argument (gdbarch, frame, 0, ptr_type);
+  sel = gdbarch_fetch_pointer_argument (gdbarch, frame, 1, ptr_type);
 
   read_objc_super (super, &sstr);
   if (sstr.class == 0)
@@ -1917,14 +1766,18 @@ resolve_msgsend_super (CORE_ADDR pc, CORE_ADDR *new_pc)
 static int
 resolve_msgsend_super_stret (CORE_ADDR pc, CORE_ADDR *new_pc)
 {
+  struct frame_info *frame = get_current_frame ();
+  struct gdbarch *gdbarch = get_frame_arch (frame);
+  struct type *ptr_type = builtin_type (gdbarch)->builtin_func_ptr;
+
   struct objc_super sstr;
 
   CORE_ADDR super;
   CORE_ADDR sel;
   CORE_ADDR res;
 
-  super = OBJC_FETCH_POINTER_ARGUMENT (1);
-  sel = OBJC_FETCH_POINTER_ARGUMENT (2);
+  super = gdbarch_fetch_pointer_argument (gdbarch, frame, 1, ptr_type);
+  sel = gdbarch_fetch_pointer_argument (gdbarch, frame, 2, ptr_type);
 
   read_objc_super (super, &sstr);
   if (sstr.class == 0)
This page took 0.032435 seconds and 4 git commands to generate.