PR ld/12380
[deliverable/binutils-gdb.git] / gdb / windows-tdep.c
index ba0fba9fa42974a5d811b03c1247df8355ea16a9..31ddd142f7b0fb7c1083f8d4294c4f7446cad78e 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+/* Copyright (C) 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -86,8 +86,10 @@ static const char* TIB_NAME[] =
     " last_error_number           "    /* %fs:0x0034 */
   };
 
-static const int MAX_TIB32 = sizeof (thread_information_32) / sizeof (uint32_t);
-static const int MAX_TIB64 = sizeof (thread_information_64) / sizeof (uint64_t);
+static const int MAX_TIB32 =
+  sizeof (thread_information_32) / sizeof (uint32_t);
+static const int MAX_TIB64 =
+  sizeof (thread_information_64) / sizeof (uint64_t);
 static const int FULL_TIB_SIZE = 0x1000;
 
 static int maint_display_all_tib = 0;
@@ -97,12 +99,18 @@ static int maint_display_all_tib = 0;
 static struct type *
 windows_get_tlb_type (struct gdbarch *gdbarch)
 {
+  static struct gdbarch *last_gdbarch = NULL;
+  static struct type *last_tlb_type = NULL;
   struct type *dword_ptr_type, *dword32_type, *void_ptr_type;
   struct type *peb_ldr_type, *peb_ldr_ptr_type;
   struct type *peb_type, *peb_ptr_type, *list_type, *list_ptr_type;
   struct type *module_list_ptr_type;
   struct type *tib_type, *seh_type, *tib_ptr_type, *seh_ptr_type;
 
+  /* Do not rebuild type if same gdbarch as last time.  */
+  if (last_tlb_type && last_gdbarch == gdbarch)
+    return last_tlb_type;
+  
   dword_ptr_type = arch_integer_type (gdbarch, gdbarch_ptr_bit (gdbarch),
                                 1, "DWORD_PTR");
   dword32_type = arch_integer_type (gdbarch, 32,
@@ -119,7 +127,8 @@ windows_get_tlb_type (struct gdbarch *gdbarch)
 
   module_list_ptr_type = void_ptr_type;
 
-  append_composite_type_field (list_type, "forward_list", module_list_ptr_type);
+  append_composite_type_field (list_type, "forward_list",
+                              module_list_ptr_type);
   append_composite_type_field (list_type, "backward_list",
                               module_list_ptr_type);
 
@@ -133,7 +142,8 @@ windows_get_tlb_type (struct gdbarch *gdbarch)
   TYPE_TARGET_TYPE (seh_ptr_type) = seh_type;
 
   append_composite_type_field (seh_type, "next_seh", seh_ptr_type);
-  append_composite_type_field (seh_type, "handler", void_ptr_type);
+  append_composite_type_field (seh_type, "handler",
+                              builtin_type (gdbarch)->builtin_func_ptr);
 
   /* struct _PEB_LDR_DATA */
   peb_ldr_type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT);
@@ -177,7 +187,8 @@ windows_get_tlb_type (struct gdbarch *gdbarch)
   /* uint32_t current_seh;                     %fs:0x0000 */
   append_composite_type_field (tib_type, "current_seh", seh_ptr_type);
   /* uint32_t current_top_of_stack;            %fs:0x0004 */
-  append_composite_type_field (tib_type, "current_top_of_stack", void_ptr_type);
+  append_composite_type_field (tib_type, "current_top_of_stack",
+                              void_ptr_type);
   /* uint32_t current_bottom_of_stack;         %fs:0x0008 */
   append_composite_type_field (tib_type, "current_bottom_of_stack",
                               void_ptr_type);
@@ -199,7 +210,8 @@ windows_get_tlb_type (struct gdbarch *gdbarch)
   /* uint32_t active_rpc_handle;               %fs:0x0028 */
   append_composite_type_field (tib_type, "active_rpc_handle", dword_ptr_type);
   /* uint32_t thread_local_storage;            %fs:0x002c */
-  append_composite_type_field (tib_type, "thread_local_storage", void_ptr_type);
+  append_composite_type_field (tib_type, "thread_local_storage",
+                              void_ptr_type);
   /* uint32_t process_environment_block;       %fs:0x0030 */
   append_composite_type_field (tib_type, "process_environment_block",
                               peb_ptr_type);
@@ -210,6 +222,9 @@ windows_get_tlb_type (struct gdbarch *gdbarch)
                            TYPE_LENGTH (void_ptr_type), NULL);
   TYPE_TARGET_TYPE (tib_ptr_type) = tib_type;
 
+  last_tlb_type = tib_ptr_type;
+  last_gdbarch = gdbarch;
+
   return tib_ptr_type;
 }
 
@@ -310,8 +325,8 @@ display_one_tib (ptid_t ptid)
   if (target_read (&current_target, TARGET_OBJECT_MEMORY,
                   NULL, tib, thread_local_base, tib_size) != tib_size)
     {
-      printf_filtered (_("Unable to read thread information block for %s at \
-address %s\n"),
+      printf_filtered (_("Unable to read thread information "
+                        "block for %s at address %s\n"),
        target_pid_to_str (ptid), 
        paddress (target_gdbarch, thread_local_base));
       return -1;
@@ -378,7 +393,7 @@ windows_xfer_shared_library (const char* so_name, CORE_ADDR load_addr,
   obstack_grow_str (obstack, "\"><segment address=\"");
   /* The symbols in a dll are offset by 0x1000, which is the the
      offset from 0 of the first byte in an image - because of the file
-     header and the section alignment. */
+     header and the section alignment.  */
   obstack_grow_str (obstack, paddress (gdbarch, load_addr + 0x1000));
   obstack_grow_str (obstack, "\"/></library>");
 }
@@ -387,8 +402,8 @@ static void
 show_maint_show_all_tib (struct ui_file *file, int from_tty,
                struct cmd_list_element *c, const char *value)
 {
-  fprintf_filtered (file, _("Show all non-zero elements of Thread Information \
-Block is %s.\n"), value);
+  fprintf_filtered (file, _("Show all non-zero elements of "
+                           "Thread Information Block is %s.\n"), value);
 }
 
 static void
This page took 0.025163 seconds and 4 git commands to generate.