* defs.h (extract_signed_integer, extract_unsigned_integer,
[deliverable/binutils-gdb.git] / gdb / c-valprint.c
index 3433da22f65737dc2f932a657796357fb3127bbf..dc391ee224492dee491c4ed105bc578ccc97283e 100644 (file)
    stream STREAM.  */
 
 static void
-print_function_pointer_address (CORE_ADDR address, struct ui_file *stream,
-                               int addressprint)
+print_function_pointer_address (struct gdbarch *gdbarch, CORE_ADDR address,
+                               struct ui_file *stream, int addressprint)
 {
-  CORE_ADDR func_addr = gdbarch_convert_from_func_ptr_addr (current_gdbarch,
-                                                           address,
+  CORE_ADDR func_addr = gdbarch_convert_from_func_ptr_addr (gdbarch, address,
                                                            &current_target);
 
   /* If the function pointer is represented by a description, print the
@@ -48,10 +47,10 @@ print_function_pointer_address (CORE_ADDR address, struct ui_file *stream,
   if (addressprint && func_addr != address)
     {
       fputs_filtered ("@", stream);
-      fputs_filtered (paddress (address), stream);
+      fputs_filtered (paddress (gdbarch, address), stream);
       fputs_filtered (": ", stream);
     }
-  print_address_demangle (func_addr, stream, demangle);
+  print_address_demangle (gdbarch, func_addr, stream, demangle);
 }
 
 
@@ -81,23 +80,42 @@ textual_name (const char *name)
 static int
 textual_element_type (struct type *type, char format)
 {
-  struct type *true_type = check_typedef (type);
+  struct type *true_type, *iter_type;
 
   if (format != 0 && format != 's')
     return 0;
 
+  /* We also rely on this for its side effect of setting up all the
+     typedef pointers.  */
+  true_type = check_typedef (type);
+
   /* TYPE_CODE_CHAR is always textual.  */
   if (TYPE_CODE (true_type) == TYPE_CODE_CHAR)
     return 1;
+
   /* Any other character-like types must be integral.  */
   if (TYPE_CODE (true_type) != TYPE_CODE_INT)
     return 0;
 
-  /* Check the names of the type and the typedef.  */
-  if (TYPE_NAME (type) && textual_name (TYPE_NAME (type)))
-    return 1;
-  if (TYPE_NAME (true_type) && textual_name (TYPE_NAME (true_type)))
-    return 1;
+  /* We peel typedefs one by one, looking for a match.  */
+  iter_type = type;
+  while (iter_type)
+    {
+      /* Check the name of the type.  */
+      if (TYPE_NAME (iter_type) && textual_name (TYPE_NAME (iter_type)))
+       return 1;
+
+      if (TYPE_CODE (iter_type) != TYPE_CODE_TYPEDEF)
+       break;
+
+      /* Peel a single typedef.  If the typedef doesn't have a target
+        type, we use check_typedef and hope the result is ok -- it
+        might be for C++, where wchar_t is a built-in type.  */
+      if (TYPE_TARGET_TYPE (iter_type))
+       iter_type = TYPE_TARGET_TYPE (iter_type);
+      else
+       iter_type = check_typedef (iter_type);
+    }
 
   if (format == 's')
     {
@@ -134,6 +152,8 @@ c_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
             CORE_ADDR address, struct ui_file *stream, int recurse,
             const struct value_print_options *options)
 {
+  struct gdbarch *gdbarch = get_type_arch (type);
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   unsigned int i = 0;  /* Number of characters printed */
   unsigned len;
   struct type *elttype, *unresolved_elttype;
@@ -171,7 +191,7 @@ c_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
                        && temp_len < options->print_max
                        && extract_unsigned_integer (valaddr + embedded_offset
                                                     + temp_len * eltlen,
-                                                    eltlen) == 0);
+                                                    eltlen, byte_order) == 0);
                       ++temp_len)
                    ;
                  len = temp_len;
@@ -233,7 +253,8 @@ c_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
             -fvtable_thunks.  (Otherwise, look under TYPE_CODE_STRUCT.) */
          CORE_ADDR addr
            = extract_typed_address (valaddr + embedded_offset, type);
-         print_function_pointer_address (addr, stream, options->addressprint);
+         print_function_pointer_address (gdbarch, addr, stream,
+                                         options->addressprint);
          break;
        }
       unresolved_elttype = TYPE_TARGET_TYPE (type);
@@ -245,14 +266,14 @@ c_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
          if (TYPE_CODE (elttype) == TYPE_CODE_FUNC)
            {
              /* Try to print what function it points to.  */
-             print_function_pointer_address (addr, stream,
+             print_function_pointer_address (gdbarch, addr, stream,
                                              options->addressprint);
              /* Return value is irrelevant except for string pointers.  */
              return (0);
            }
 
          if (options->addressprint)
-           fputs_filtered (paddress (addr), stream);
+           fputs_filtered (paddress (gdbarch, addr), stream);
 
          /* For a pointer to a textual type, also print the string
             pointed to, unless pointer is null.  */
@@ -322,7 +343,7 @@ c_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
          CORE_ADDR addr
            = extract_typed_address (valaddr + embedded_offset, type);
          fprintf_filtered (stream, "@");
-         fputs_filtered (paddress (addr), stream);
+         fputs_filtered (paddress (gdbarch, addr), stream);
          if (options->deref_ref)
            fputs_filtered (": ", stream);
        }
@@ -363,7 +384,8 @@ c_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
          CORE_ADDR addr
            = extract_typed_address (valaddr + offset, field_type);
 
-         print_function_pointer_address (addr, stream, options->addressprint);
+         print_function_pointer_address (gdbarch, addr, stream,
+                                         options->addressprint);
        }
       else
        cp_print_value_fields (type, type, valaddr, embedded_offset, address, stream,
@@ -419,7 +441,7 @@ c_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
       type_print (type, "", stream, -1);
       fprintf_filtered (stream, "} ");
       /* Try to print what function it points to, and its address.  */
-      print_address_demangle (address, stream, demangle);
+      print_address_demangle (gdbarch, address, stream, demangle);
       break;
 
     case TYPE_CODE_BOOL:
This page took 0.032696 seconds and 4 git commands to generate.