multi-arch ADDR_BITS_REMOVE.
[deliverable/binutils-gdb.git] / gdb / gdbarch.c
index 435b36cc450e446f3677721e76913f92efe7202b..fcfe9ac6599f6f32c33c6d274579b9090de150f0 100644 (file)
@@ -247,6 +247,7 @@ struct gdbarch
   const struct floatformat * double_format;
   const struct floatformat * long_double_format;
   gdbarch_convert_from_func_ptr_addr_ftype *convert_from_func_ptr_addr;
+  gdbarch_addr_bits_remove_ftype *addr_bits_remove;
   gdbarch_software_single_step_ftype *software_single_step;
 };
 
@@ -382,6 +383,7 @@ struct gdbarch startup_gdbarch =
   0,
   0,
   0,
+  0,
   /* startup_gdbarch() */
 };
 
@@ -474,7 +476,8 @@ gdbarch_alloc (const struct gdbarch_info *info,
   gdbarch->frame_args_skip = -1;
   gdbarch->frameless_function_invocation = generic_frameless_function_invocation_not;
   gdbarch->extra_stack_alignment_needed = 1;
-  gdbarch->convert_from_func_ptr_addr = default_convert_from_func_ptr_addr;
+  gdbarch->convert_from_func_ptr_addr = core_addr_identity;
+  gdbarch->addr_bits_remove = core_addr_identity;
   /* gdbarch_alloc() */
 
   return gdbarch;
@@ -769,6 +772,7 @@ verify_gdbarch (struct gdbarch *gdbarch)
   if (gdbarch->long_double_format == 0)
     gdbarch->long_double_format = &floatformat_unknown;
   /* Skip verify of convert_from_func_ptr_addr, invalid_p == 0 */
+  /* Skip verify of addr_bits_remove, invalid_p == 0 */
   /* Skip verify of software_single_step, has predicate */
 }
 
@@ -1451,6 +1455,12 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file)
                       "CONVERT_FROM_FUNC_PTR_ADDR(addr)",
                       XSTRING (CONVERT_FROM_FUNC_PTR_ADDR (addr)));
 #endif
+#ifdef ADDR_BITS_REMOVE
+  fprintf_unfiltered (file,
+                      "gdbarch_dump: %s # %s\n",
+                      "ADDR_BITS_REMOVE(addr)",
+                      XSTRING (ADDR_BITS_REMOVE (addr)));
+#endif
 #if defined (SOFTWARE_SINGLE_STEP) && GDB_MULTI_ARCH
   /* Macro might contain `[{}]' when not multi-arch */
   fprintf_unfiltered (file,
@@ -2183,6 +2193,13 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file)
                         (long) current_gdbarch->convert_from_func_ptr_addr
                         /*CONVERT_FROM_FUNC_PTR_ADDR ()*/);
 #endif
+#ifdef ADDR_BITS_REMOVE
+  if (GDB_MULTI_ARCH)
+    fprintf_unfiltered (file,
+                        "gdbarch_dump: ADDR_BITS_REMOVE = 0x%08lx\n",
+                        (long) current_gdbarch->addr_bits_remove
+                        /*ADDR_BITS_REMOVE ()*/);
+#endif
 #ifdef SOFTWARE_SINGLE_STEP
   if (GDB_MULTI_ARCH)
     fprintf_unfiltered (file,
@@ -4279,6 +4296,24 @@ set_gdbarch_convert_from_func_ptr_addr (struct gdbarch *gdbarch,
   gdbarch->convert_from_func_ptr_addr = convert_from_func_ptr_addr;
 }
 
+CORE_ADDR
+gdbarch_addr_bits_remove (struct gdbarch *gdbarch, CORE_ADDR addr)
+{
+  if (gdbarch->addr_bits_remove == 0)
+    internal_error (__FILE__, __LINE__,
+                    "gdbarch: gdbarch_addr_bits_remove invalid");
+  if (gdbarch_debug >= 2)
+    fprintf_unfiltered (gdb_stdlog, "gdbarch_addr_bits_remove called\n");
+  return gdbarch->addr_bits_remove (addr);
+}
+
+void
+set_gdbarch_addr_bits_remove (struct gdbarch *gdbarch,
+                              gdbarch_addr_bits_remove_ftype addr_bits_remove)
+{
+  gdbarch->addr_bits_remove = addr_bits_remove;
+}
+
 int
 gdbarch_software_single_step_p (struct gdbarch *gdbarch)
 {
This page took 0.023834 seconds and 4 git commands to generate.