* gdb.cp/cplusfuncs.exp (do_tests): Add check for proper error message
[deliverable/binutils-gdb.git] / gdb / gcore.c
index 9425f15b5f4743ae0c804f3bb0e899019e26f79e..5bc38e2ab5fecf0ff682519303ec745a73faec94 100644 (file)
@@ -1,6 +1,6 @@
 /* Generate a core file for the inferior process.
 
-   Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007
+   Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
    Free Software Foundation, Inc.
 
    This file is part of GDB.
@@ -35,7 +35,7 @@
    generate-core-file for programs with large resident data.  */
 #define MAX_COPY_BYTES (1024 * 1024)
 
-static char *default_gcore_target (void);
+static const char *default_gcore_target (void);
 static enum bfd_architecture default_gcore_arch (void);
 static unsigned long default_gcore_mach (void);
 static int gcore_memory_sections (bfd *);
@@ -125,7 +125,7 @@ default_gcore_mach (void)
   return 0;
 #else
 
-  const struct bfd_arch_info *bfdarch = gdbarch_bfd_arch_info (current_gdbarch);
+  const struct bfd_arch_info *bfdarch = gdbarch_bfd_arch_info (target_gdbarch);
 
   if (bfdarch != NULL)
     return bfdarch->mach;
@@ -139,8 +139,7 @@ default_gcore_mach (void)
 static enum bfd_architecture
 default_gcore_arch (void)
 {
-  const struct bfd_arch_info * bfdarch = gdbarch_bfd_arch_info
-                                        (current_gdbarch);
+  const struct bfd_arch_info *bfdarch = gdbarch_bfd_arch_info (target_gdbarch);
 
   if (bfdarch != NULL)
     return bfdarch->arch;
@@ -150,10 +149,15 @@ default_gcore_arch (void)
   return bfd_get_arch (exec_bfd);
 }
 
-static char *
+static const char *
 default_gcore_target (void)
 {
-  /* FIXME: This may only work for ELF targets.  */
+  /* The gdbarch may define a target to use for core files.  */
+  if (gdbarch_gcore_bfd_target_p (target_gdbarch))
+    return gdbarch_gcore_bfd_target (target_gdbarch);
+
+  /* Otherwise, try to fall back to the exec_bfd target.  This will probably
+     not work for non-ELF targets.  */
   if (exec_bfd == NULL)
     return NULL;
   else
@@ -184,7 +188,7 @@ derive_stack_segment (bfd_vma *bottom, bfd_vma *top)
   /* Save frame pointer of TOS frame.  */
   *top = get_frame_base (fi);
   /* If current stack pointer is more "inner", use that instead.  */
-  if (gdbarch_inner_than (current_gdbarch, get_frame_sp (fi), *top))
+  if (gdbarch_inner_than (get_frame_arch (fi), get_frame_sp (fi), *top))
     *top = get_frame_sp (fi);
 
   /* Find prev-most frame.  */
@@ -215,6 +219,8 @@ derive_stack_segment (bfd_vma *bottom, bfd_vma *top)
 static int
 derive_heap_segment (bfd *abfd, bfd_vma *bottom, bfd_vma *top)
 {
+  struct objfile *sbrk_objf;
+  struct gdbarch *gdbarch;
   bfd_vma top_of_data_memory = 0;
   bfd_vma top_of_heap = 0;
   bfd_size_type sec_size;
@@ -256,20 +262,21 @@ derive_heap_segment (bfd *abfd, bfd_vma *bottom, bfd_vma *top)
   /* Now get the top-of-heap by calling sbrk in the inferior.  */
   if (lookup_minimal_symbol ("sbrk", NULL, NULL) != NULL)
     {
-      sbrk = find_function_in_inferior ("sbrk");
+      sbrk = find_function_in_inferior ("sbrk", &sbrk_objf);
       if (sbrk == NULL)
        return 0;
     }
   else if (lookup_minimal_symbol ("_sbrk", NULL, NULL) != NULL)
     {
-      sbrk = find_function_in_inferior ("_sbrk");
+      sbrk = find_function_in_inferior ("_sbrk", &sbrk_objf);
       if (sbrk == NULL)
        return 0;
     }
   else
     return 0;
 
-  zero = value_from_longest (builtin_type_int, 0);
+  gdbarch = get_objfile_arch (sbrk_objf);
+  zero = value_from_longest (builtin_type (gdbarch)->builtin_int, 0);
   gdb_assert (zero);
   sbrk = call_function_by_hand (sbrk, 1, &zero);
   if (sbrk == NULL)
@@ -324,8 +331,8 @@ gcore_create_callback (CORE_ADDR vaddr, unsigned long size,
     {
       if (info_verbose)
         {
-          fprintf_filtered (gdb_stdout, "Ignore segment, %s bytes at 0x%s\n",
-                           paddr_d (size), paddr_nz (vaddr));
+          fprintf_filtered (gdb_stdout, "Ignore segment, %s bytes at %s\n",
+                            plongest (size), paddress (target_gdbarch, vaddr));
         }
 
       return 0;
@@ -344,8 +351,8 @@ gcore_create_callback (CORE_ADDR vaddr, unsigned long size,
          asection *asec = objsec->the_bfd_section;
          bfd_vma align = (bfd_vma) 1 << bfd_get_section_alignment (abfd,
                                                                    asec);
-         bfd_vma start = objsec->addr & -align;
-         bfd_vma end = (objsec->endaddr + align - 1) & -align;
+         bfd_vma start = obj_section_addr (objsec) & -align;
+         bfd_vma end = (obj_section_endaddr (objsec) + align - 1) & -align;
          /* Match if either the entire memory region lies inside the
             section (i.e. a mapping covering some pages of a large
             segment) or the entire section lies inside the memory region
@@ -382,8 +389,8 @@ gcore_create_callback (CORE_ADDR vaddr, unsigned long size,
 
   if (info_verbose)
     {
-      fprintf_filtered (gdb_stdout, "Save segment, %s bytes at 0x%s\n",
-                       paddr_d (size), paddr_nz (vaddr));
+      fprintf_filtered (gdb_stdout, "Save segment, %s bytes at %s\n",
+                       plongest (size), paddress (target_gdbarch, vaddr));
     }
 
   bfd_set_section_size (obfd, osec, size);
@@ -415,7 +422,7 @@ objfile_find_memory_regions (int (*func) (CORE_ADDR, unsigned long,
          int size = bfd_section_size (ibfd, isec);
          int ret;
 
-         ret = (*func) (objsec->addr, bfd_section_size (ibfd, isec),
+         ret = (*func) (obj_section_addr (objsec), bfd_section_size (ibfd, isec),
                         1, /* All sections will be readable.  */
                         (flags & SEC_READONLY) == 0, /* Writable.  */
                         (flags & SEC_CODE) != 0, /* Executable.  */
@@ -475,8 +482,9 @@ gcore_copy_callback (bfd *obfd, asection *osec, void *ignored)
       if (target_read_memory (bfd_section_vma (obfd, osec) + offset,
                              memhunk, size) != 0)
        {
-         warning (_("Memory read failed for corefile section, %s bytes at 0x%s."),
-                  paddr_d (size), paddr (bfd_section_vma (obfd, osec)));
+         warning (_("Memory read failed for corefile section, %s bytes at %s."),
+                  plongest (size),
+                  paddress (target_gdbarch, bfd_section_vma (obfd, osec)));
          break;
        }
       if (!bfd_set_section_contents (obfd, osec, memhunk, offset, size))
@@ -508,6 +516,9 @@ gcore_memory_sections (bfd *obfd)
   return 1;
 }
 
+/* Provide a prototype to silence -Wmissing-prototypes.  */
+extern initialize_file_ftype _initialize_gcore;
+
 void
 _initialize_gcore (void)
 {
This page took 0.02997 seconds and 4 git commands to generate.