gdb: fix vfork with multiple threads
[deliverable/binutils-gdb.git] / gdb / std-regs.c
index 1dc22cfdef3139df73c7464dc7d46e36b066d400..9d1cd13c2dd85aebc7aaa2e8af71b39b14e15638 100644 (file)
@@ -1,6 +1,6 @@
 /* Builtin frame register, for GDB, the GNU debugger.
 
-   Copyright (C) 2002, 2005, 2007 Free Software Foundation, Inc.
+   Copyright (C) 2002-2021 Free Software Foundation, Inc.
 
    Contributed by Red Hat.
 
 #include "frame.h"
 #include "gdbtypes.h"
 #include "value.h"
-#include "gdb_string.h"
-
+#include "gdbarch.h"
 
 static struct value *
 value_of_builtin_frame_fp_reg (struct frame_info *frame, const void *baton)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
+
   if (gdbarch_deprecated_fp_regnum (gdbarch) >= 0)
     /* NOTE: cagney/2003-04-24: Since the mere presence of "fp" in the
        register name table overrides this built-in $fp register, there
@@ -42,13 +42,12 @@ value_of_builtin_frame_fp_reg (struct frame_info *frame, const void *baton)
                              frame);
   else
     {
-      struct value *val = allocate_value (builtin_type_void_data_ptr);
+      struct type *data_ptr_type = builtin_type (gdbarch)->builtin_data_ptr;
+      struct value *val = allocate_value (data_ptr_type);
       gdb_byte *buf = value_contents_raw (val);
-      if (frame == NULL)
-       memset (buf, 0, TYPE_LENGTH (value_type (val)));
-      else
-       gdbarch_address_to_pointer (gdbarch, builtin_type_void_data_ptr,
-                                   buf, get_frame_base_address (frame));
+
+      gdbarch_address_to_pointer (gdbarch, data_ptr_type,
+                                 buf, get_frame_base_address (frame));
       return val;
     }
 }
@@ -57,17 +56,17 @@ static struct value *
 value_of_builtin_frame_pc_reg (struct frame_info *frame, const void *baton)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
+
   if (gdbarch_pc_regnum (gdbarch) >= 0)
     return value_of_register (gdbarch_pc_regnum (gdbarch), frame);
   else
     {
-      struct value *val = allocate_value (builtin_type_void_data_ptr);
+      struct type *func_ptr_type = builtin_type (gdbarch)->builtin_func_ptr;
+      struct value *val = allocate_value (func_ptr_type);
       gdb_byte *buf = value_contents_raw (val);
-      if (frame == NULL)
-       memset (buf, 0, TYPE_LENGTH (value_type (val)));
-      else
-       gdbarch_address_to_pointer (gdbarch, builtin_type_void_data_ptr,
-                                   buf, get_frame_pc (frame));
+
+      gdbarch_address_to_pointer (gdbarch, func_ptr_type,
+                                 buf, get_frame_pc (frame));
       return val;
     }
 }
@@ -76,6 +75,7 @@ static struct value *
 value_of_builtin_frame_sp_reg (struct frame_info *frame, const void *baton)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
+
   if (gdbarch_sp_regnum (gdbarch) >= 0)
     return value_of_register (gdbarch_sp_regnum (gdbarch), frame);
   error (_("Standard register ``$sp'' is not available for this target"));
@@ -85,15 +85,15 @@ static struct value *
 value_of_builtin_frame_ps_reg (struct frame_info *frame, const void *baton)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
+
   if (gdbarch_ps_regnum (gdbarch) >= 0)
     return value_of_register (gdbarch_ps_regnum (gdbarch), frame);
   error (_("Standard register ``$ps'' is not available for this target"));
 }
 
-extern initialize_file_ftype _initialize_frame_reg; /* -Wmissing-prototypes */
-
+void _initialize_frame_reg ();
 void
-_initialize_frame_reg (void)
+_initialize_frame_reg ()
 {
   /* Frame based $fp, $pc, $sp and $ps.  These only come into play
      when the target does not define its own version of these
This page took 0.024902 seconds and 4 git commands to generate.