Add detection of IMB and IMBRange SWIs.
[deliverable/binutils-gdb.git] / gdb / objfiles.c
index 65732936ec6f78081381d900089f582c5435ae1c..91f4aa472f95b70f8e83e14bca4fb59eafcba957 100644 (file)
@@ -35,9 +35,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #include "obstack.h"
 #include "gdb_string.h"
 
+#include "breakpoint.h"
+
 /* Prototypes for local functions */
 
-#if !defined(NO_MMALLOC) && defined(HAVE_MMAP)
+#if defined(USE_MMALLOC) && defined(HAVE_MMAP)
 
 static int
 open_existing_mapped_file PARAMS ((char *, long, int));
@@ -48,7 +50,7 @@ open_mapped_file PARAMS ((char *filename, long mtime, int mapped));
 static PTR
 map_to_file PARAMS ((int));
 
-#endif  /* !defined(NO_MMALLOC) && defined(HAVE_MMAP) */
+#endif  /* defined(USE_MMALLOC) && defined(HAVE_MMAP) */
 
 static void
 add_to_objfile_sections PARAMS ((bfd *, sec_ptr, PTR));
@@ -67,6 +69,10 @@ int mapped_symbol_files;             /* Try to use mapped symbol files */
    objfile_p_char is a char * to get it through
    bfd_map_over_sections; we cast it back to its proper type.  */
 
+#ifndef TARGET_KEEP_SECTION
+#define TARGET_KEEP_SECTION(ASECT)     0
+#endif
+
 static void
 add_to_objfile_sections (abfd, asect, objfile_p_char)
      bfd *abfd;
@@ -78,8 +84,10 @@ add_to_objfile_sections (abfd, asect, objfile_p_char)
   flagword aflag;
 
   aflag = bfd_get_section_flags (abfd, asect);
-  if (!(aflag & SEC_ALLOC))
+
+  if (!(aflag & SEC_ALLOC) && !(TARGET_KEEP_SECTION(asect)))
     return;
+
   if (0 == bfd_section_size (abfd, asect))
     return;
   section.offset = 0;
@@ -117,19 +125,29 @@ build_objfile_section_table (objfile)
 /* Given a pointer to an initialized bfd (ABFD) and a flag that indicates
    whether or not an objfile is to be mapped (MAPPED), allocate a new objfile
    struct, fill it in as best we can, link it into the list of all known
-   objfiles, and return a pointer to the new objfile struct. */
+   objfiles, and return a pointer to the new objfile struct.
+
+   USER_LOADED is simply recorded in the objfile.  This record offers a way for
+   run_command to remove old objfile entries which are no longer valid (i.e.,
+   are associated with an old inferior), but to preserve ones that the user
+   explicitly loaded via the add-symbol-file command.
+
+   IS_SOLIB is also simply recorded in the objfile. */
 
 struct objfile *
-allocate_objfile (abfd, mapped)
+allocate_objfile (abfd, mapped, user_loaded, is_solib)
      bfd *abfd;
      int mapped;
+     int  user_loaded;
+     int  is_solib;
 {
   struct objfile *objfile = NULL;
   struct objfile *last_one = NULL;
 
   mapped |= mapped_symbol_files;
 
-#if !defined(NO_MMALLOC) && defined(HAVE_MMAP)
+#if defined(USE_MMALLOC) && defined(HAVE_MMAP)
+  if (abfd != NULL)
   {
 
     /* If we can support mapped symbol files, try to open/reopen the
@@ -211,7 +229,7 @@ allocate_objfile (abfd, mapped)
                 bfd_get_filename (abfd));
       }
   }
-#else  /* defined(NO_MMALLOC) || !defined(HAVE_MMAP) */
+#else  /* !defined(USE_MMALLOC) || !defined(HAVE_MMAP) */
 
   if (mapped)
     {
@@ -224,7 +242,7 @@ allocate_objfile (abfd, mapped)
       mapped_symbol_files = 0;
     }
 
-#endif /* !defined(NO_MMALLOC) && defined(HAVE_MMAP) */
+#endif /* defined(USE_MMALLOC) && defined(HAVE_MMAP) */
 
   /* If we don't support mapped symbol files, didn't ask for the file to be
      mapped, or failed to open the mapped file for some reason, then revert
@@ -254,15 +272,18 @@ allocate_objfile (abfd, mapped)
     {
       mfree (objfile -> md, objfile -> name);
     }
-  objfile -> name = mstrsave (objfile -> md, bfd_get_filename (abfd));
-  objfile -> mtime = bfd_get_mtime (abfd);
+  if (abfd != NULL)
+    {
+      objfile -> name = mstrsave (objfile -> md, bfd_get_filename (abfd));
+      objfile -> mtime = bfd_get_mtime (abfd);
 
-  /* Build section table.  */
+      /* Build section table.  */
 
-  if (build_objfile_section_table (objfile))
-    {
-      error ("Can't find the file sections in `%s': %s", 
-            objfile -> name, bfd_errmsg (bfd_get_error ()));
+      if (build_objfile_section_table (objfile))
+       {
+         error ("Can't find the file sections in `%s': %s", 
+                objfile -> name, bfd_errmsg (bfd_get_error ()));
+       }
     }
 
   /* Add this file onto the tail of the linked list of other such files. */
@@ -277,6 +298,15 @@ allocate_objfile (abfd, mapped)
           last_one = last_one -> next);
       last_one -> next = objfile;
     }
+
+  /* Record whether this objfile was created because the user explicitly
+     caused it (e.g., used the add-symbol-file command).
+     */
+  objfile -> user_loaded = user_loaded;
+
+  /* Record whether this objfile definitely represents a solib. */
+  objfile -> is_solib = is_solib;
+
   return (objfile);
 }
 
@@ -412,7 +442,7 @@ free_objfile (objfile)
      case.  Note that the mmalloc_detach or the mfree is the last thing
      we can do with this objfile. */
 
-#if !defined(NO_MMALLOC) && defined(HAVE_MMAP)
+#if defined(USE_MMALLOC) && defined(HAVE_MMAP)
 
   if (objfile -> flags & OBJF_MAPPED)
     {
@@ -426,7 +456,7 @@ free_objfile (objfile)
       close (mmfd);
     }
 
-#endif /* !defined(NO_MMALLOC) && defined(HAVE_MMAP) */
+#endif /* defined(USE_MMALLOC) && defined(HAVE_MMAP) */
 
   /* If we still have an objfile, then either we don't support reusable
      objfiles or this one was not reusable.  So free it normally. */
@@ -531,7 +561,8 @@ objfile_relocate (objfile, new_offsets)
                   But I'm leaving out that test, on the theory that
                   they can't possibly pass the tests below.  */
                if ((SYMBOL_CLASS (sym) == LOC_LABEL
-                    || SYMBOL_CLASS (sym) == LOC_STATIC)
+                    || SYMBOL_CLASS (sym) == LOC_STATIC 
+                     || SYMBOL_CLASS (sym) == LOC_INDIRECT)
                    && SYMBOL_SECTION (sym) >= 0)
                  {
                    SYMBOL_VALUE_ADDRESS (sym) += 
@@ -626,7 +657,7 @@ objfile_relocate (objfile, new_offsets)
       }
   }
 
-  if (objfile->ei.entry_point != ~0)
+  if (objfile->ei.entry_point != ~(CORE_ADDR)0)
     objfile->ei.entry_point += ANOFFSET (delta, SECT_OFF_TEXT);
 
   if (objfile->ei.entry_func_lowpc != INVALID_ENTRY_LOWPC)
@@ -646,6 +677,9 @@ objfile_relocate (objfile, new_offsets)
       objfile->ei.main_func_lowpc  += ANOFFSET (delta, SECT_OFF_TEXT);
       objfile->ei.main_func_highpc += ANOFFSET (delta, SECT_OFF_TEXT);
     }
+
+  /* Relocate breakpoints as necessary, after things are relocated. */
+  breakpoint_re_set ();
 }
 \f
 /* Many places in gdb want to test just to see if we have any partial
@@ -686,6 +720,28 @@ have_full_symbols ()
   return 0;
 }
 
+
+/* This operations deletes all objfile entries that represent solibs that
+   weren't explicitly loaded by the user, via e.g., the add-symbol-file
+   command.
+   */
+void
+objfile_purge_solibs ()
+{
+  struct objfile *  objf;
+  struct objfile *  temp;
+
+  ALL_OBJFILES_SAFE (objf, temp)
+  {
+    /* We assume that the solib package has been purged already, or will
+       be soon.
+       */
+    if (! objf->user_loaded && objf->is_solib)
+      free_objfile (objf);
+  }
+}
+
+
 /* Many places in gdb want to test just to see if we have any minimal
    symbols available.  This function returns zero if none are currently
    available, nonzero otherwise. */
@@ -705,7 +761,7 @@ have_minimal_symbols ()
   return 0;
 }
 
-#if !defined(NO_MMALLOC) && defined(HAVE_MMAP)
+#if defined(USE_MMALLOC) && defined(HAVE_MMAP)
 
 /* Given the name of a mapped symbol file in SYMSFILENAME, and the timestamp
    of the corresponding symbol file in MTIME, try to open an existing file
@@ -872,7 +928,7 @@ map_to_file (fd)
   return (md);
 }
 
-#endif /* !defined(NO_MMALLOC) && defined(HAVE_MMAP) */
+#endif /* defined(USE_MMALLOC) && defined(HAVE_MMAP) */
 
 /* Returns a section whose range includes PC and SECTION, 
    or NULL if none found.  Note the distinction between the return type, 
@@ -890,8 +946,13 @@ find_pc_sect_section (pc, section)
   
   ALL_OBJFILES (objfile)
     for (s = objfile->sections; s < objfile->sections_end; ++s)
+#if defined(HPUXHPPA)
+      if ((section == 0 || section == s->the_bfd_section) && 
+         s->addr <= pc && pc <= s->endaddr)
+#else
       if ((section == 0 || section == s->the_bfd_section) && 
          s->addr <= pc && pc < s->endaddr)
+#endif
        return(s);
 
   return(NULL);
This page took 0.03174 seconds and 4 git commands to generate.