Changes to implement the -mapped and -readnow options for commands that
[external/binutils.git] / gdb / objfiles.c
1 /* GDB routines for manipulating objfiles.
2    Copyright 1992 Free Software Foundation, Inc.
3    Contributed by Cygnus Support, using pieces from other GDB modules.
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
20
21 /* This file contains support routines for creating, manipulating, and
22    destroying objfile structures. */
23
24 #include "defs.h"
25 #include "bfd.h"                /* Binary File Description */
26 #include "symtab.h"
27 #include "symfile.h"
28
29 #include <sys/types.h>
30 #include <sys/stat.h>
31 #include <fcntl.h>
32 #include <obstack.h>
33
34 /* Prototypes for local functions */
35
36 static int
37 open_mapped_file PARAMS ((char *filename, long mtime, int mapped));
38
39 static CORE_ADDR
40 map_to_address PARAMS ((void));
41
42 /* Externally visible variables that are owned by this module. */
43
44 struct objfile *object_files;           /* Linked list of all objfiles */
45 int mapped_symbol_files;                /* Try to use mapped symbol files */
46
47 /* Given a pointer to an initialized bfd (ABFD) and a flag that indicates
48    whether or not an objfile is to be mapped (MAPPED), allocate a new objfile
49    struct, fill it in as best we can, link it into the list of all known
50    objfiles, and return a pointer to the new objfile struct. */
51
52 struct objfile *
53 allocate_objfile (abfd, mapped)
54      bfd *abfd;
55      int mapped;
56 {
57   struct objfile *objfile = NULL;
58   int fd;
59   void *md;
60   CORE_ADDR mapto;
61
62   mapped |= mapped_symbol_files;
63
64 #if !defined(NO_MMALLOC) && defined(HAVE_MMAP)
65
66   /* If we can support mapped symbol files, try to open/reopen the mapped file
67      that corresponds to the file from which we wish to read symbols.  If the
68      objfile is to be mapped, we must malloc the structure itself using the
69      mmap version, and arrange that all memory allocation for the objfile uses
70      the mmap routines.  If we are reusing an existing mapped file, from which
71      we get our objfile pointer, we have to make sure that we update the
72      pointers to the alloc/free functions in the obstack, in case these
73      functions have moved within the current gdb. */
74
75   fd = open_mapped_file (bfd_get_filename (abfd), bfd_get_mtime (abfd),
76                          mapped);
77   if (fd >= 0)
78     {
79       if (((mapto = map_to_address ()) == 0) ||
80           ((md = mmalloc_attach (fd, (void *) mapto)) == NULL))
81         {
82           close (fd);
83         }
84       else if ((objfile = (struct objfile *) mmalloc_getkey (md, 0)) != NULL)
85         {
86           objfile -> md = md;
87           /* Update pointers to functions to *our* copies */
88           obstack_chunkfun (&objfile -> psymbol_obstack, xmmalloc);
89           obstack_freefun (&objfile -> psymbol_obstack, mfree);
90           obstack_chunkfun (&objfile -> symbol_obstack, xmmalloc);
91           obstack_freefun (&objfile -> symbol_obstack, mfree);
92           obstack_chunkfun (&objfile -> type_obstack, xmmalloc);
93           obstack_freefun (&objfile -> type_obstack, mfree);
94           /* Update memory corruption handler function addresses */
95           init_malloc (objfile -> md);
96         }
97       else
98         {
99           objfile = (struct objfile *) xmmalloc (md, sizeof (struct objfile));
100           (void) memset (objfile, 0, sizeof (struct objfile));
101           objfile -> md = md;
102           objfile -> flags |= OBJF_MAPPED;
103           mmalloc_setkey (objfile -> md, 0, objfile);
104           obstack_full_begin (&objfile -> psymbol_obstack, 0, 0,
105                               xmmalloc, mfree, objfile -> md,
106                               OBSTACK_MMALLOC_LIKE);
107           obstack_full_begin (&objfile -> symbol_obstack, 0, 0,
108                               xmmalloc, mfree, objfile -> md,
109                               OBSTACK_MMALLOC_LIKE);
110           obstack_full_begin (&objfile -> type_obstack, 0, 0,
111                               xmmalloc, mfree, objfile -> md,
112                               OBSTACK_MMALLOC_LIKE);
113           /* Set up to detect internal memory corruption */
114           init_malloc (objfile -> md);
115         }
116     }
117
118   if (mapped && (objfile == NULL))
119     {
120       warning ("symbol table for '%s' will not be mapped",
121                bfd_get_filename (abfd));
122     }
123
124 #else   /* defined(NO_MMALLOC) || !defined(HAVE_MMAP) */
125
126   if (mapped)
127     {
128       warning ("this version of gdb does not support mapped symbol tables.");
129
130       /* Turn off the global flag so we don't try to do mapped symbol tables
131          any more, which shuts up gdb unless the user specifically gives the
132          "mapped" keyword again. */
133
134       mapped_symbol_files = 0;
135     }
136
137 #endif  /* !defined(NO_MMALLOC) && defined(HAVE_MMAP) */
138
139   /* If we don't support mapped symbol files, didn't ask for the file to be
140      mapped, or failed to open the mapped file for some reason, then revert
141      back to an unmapped objfile. */
142
143   if (objfile == NULL)
144     {
145       objfile = (struct objfile *) xmalloc (sizeof (struct objfile));
146       (void) memset (objfile, 0, sizeof (struct objfile));
147       objfile -> md = NULL;
148       obstack_full_begin (&objfile -> psymbol_obstack, 0, 0, xmalloc, free,
149                           (void *) 0, 0);
150       obstack_full_begin (&objfile -> symbol_obstack, 0, 0, xmalloc, free,
151                           (void *) 0, 0);
152       obstack_full_begin (&objfile -> type_obstack, 0, 0, xmalloc, free,
153                           (void *) 0, 0);
154
155     }
156
157   /* Update the per-objfile information that comes from the bfd, ensuring
158      that any data that is reference is saved in the per-objfile data
159      region. */
160
161   objfile -> obfd = abfd;
162   objfile -> name = mstrsave (objfile -> md, bfd_get_filename (abfd));
163   objfile -> mtime = bfd_get_mtime (abfd);
164
165   /* Push this file onto the head of the linked list of other such files. */
166
167   objfile -> next = object_files;
168   object_files = objfile;
169
170   return (objfile);
171 }
172
173
174 /* Destroy an objfile and all the symtabs and psymtabs under it.  Note
175    that as much as possible is allocated on the symbol_obstack and
176    psymbol_obstack, so that the memory can be efficiently freed. */
177
178 void
179 free_objfile (objfile)
180      struct objfile *objfile;
181 {
182   struct objfile *ofp;
183
184   if (objfile -> name)
185     {
186       mfree (objfile -> md, objfile -> name);
187     }
188   if (objfile -> obfd)
189     {
190       bfd_close (objfile -> obfd);
191     }
192
193   /* Remove it from the chain of all objfiles.  */
194
195   if (object_files == objfile)
196     {
197       object_files = objfile -> next;
198     }
199   else
200     {
201       for (ofp = object_files; ofp; ofp = ofp -> next)
202         {
203           if (ofp -> next == objfile)
204             {
205               ofp -> next = objfile -> next;
206             }
207         }
208     }
209
210   obstack_free (&objfile -> psymbol_obstack, 0);
211   obstack_free (&objfile -> symbol_obstack, 0);
212   obstack_free (&objfile -> type_obstack, 0);
213
214 #if 0   /* FIXME!! */
215
216   /* Before the symbol table code was redone to make it easier to
217      selectively load and remove information particular to a specific
218      linkage unit, gdb used to do these things whenever the monolithic
219      symbol table was blown away.  How much still needs to be done
220      is unknown, but we play it safe for now and keep each action until
221      it is shown to be no longer needed. */
222      
223   clear_symtab_users_once ();
224 #if defined (CLEAR_SOLIB)
225   CLEAR_SOLIB ();
226 #endif
227   clear_pc_function_cache ();
228
229 #endif
230
231   /* The last thing we do is free the objfile struct itself */
232
233   mfree (objfile -> md, objfile);
234 }
235
236
237 /* Free all the object files at once.  */
238
239 void
240 free_all_objfiles ()
241 {
242   struct objfile *objfile, *temp;
243
244   ALL_OBJFILES_SAFE (objfile, temp)
245     {
246       free_objfile (objfile);
247     }
248 }
249
250 /* Many places in gdb want to test just to see if we have any partial
251    symbols available.  This function returns zero if none are currently
252    available, nonzero otherwise. */
253
254 int
255 have_partial_symbols ()
256 {
257   struct objfile *ofp;
258   int havethem = 0;
259
260   for (ofp = object_files; ofp; ofp = ofp -> next)
261     {
262       if (ofp -> psymtabs != NULL)
263         {
264           havethem++;
265           break;
266         }
267     }
268   return (havethem);
269 }
270
271 /* Many places in gdb want to test just to see if we have any full
272    symbols available.  This function returns zero if none are currently
273    available, nonzero otherwise. */
274
275 int
276 have_full_symbols ()
277 {
278   struct objfile *ofp;
279   int havethem = 0;
280
281   for (ofp = object_files; ofp; ofp = ofp -> next)
282     {
283       if (ofp -> symtabs != NULL)
284         {
285           havethem++;
286           break;
287         }
288     }
289   return (havethem);
290 }
291
292 /* Many places in gdb want to test just to see if we have any minimal
293    symbols available.  This function returns zero if none are currently
294    available, nonzero otherwise. */
295
296 int
297 have_minimal_symbols ()
298 {
299   struct objfile *ofp;
300   int havethem = 0;
301
302   for (ofp = object_files; ofp; ofp = ofp -> next)
303     {
304       if (ofp -> msymbols != NULL)
305         {
306           havethem++;
307           break;
308         }
309     }
310   return (havethem);
311 }
312
313 /* Call the function specified by FUNC for each currently available objfile,
314    for as long as this function continues to return NULL.  If the function
315    ever returns non-NULL, then the iteration over the objfiles is terminated,
316    and the result is returned to the caller.  The function called has full
317    control over the form and content of the information returned via the
318    non-NULL result, which may be as simple as a pointer to the objfile that
319    the iteration terminated on, or as complex as a pointer to a private
320    structure containing multiple results. */
321
322 PTR
323 iterate_over_objfiles (func, arg1, arg2, arg3)
324      PTR (*func) PARAMS ((struct objfile *, PTR, PTR, PTR));
325      PTR arg1;
326      PTR arg2;
327      PTR arg3;
328 {
329   register struct objfile *objfile;
330   PTR result = NULL;
331
332   for (objfile = object_files;
333        objfile != NULL && result == NULL;
334        objfile = objfile -> next)
335     {
336       result = (*func)(objfile, arg1, arg2, arg3);
337     }
338   return (result);
339 }
340
341 /* Call the function specified by FUNC for each currently available symbol
342    table, for as long as this function continues to return NULL.  If the
343    function ever returns non-NULL, then the iteration over the symbol tables
344    is terminated, and the result is returned to the caller.  The function
345    called has full control over the form and content of the information
346    returned via the non-NULL result, which may be as simple as a pointer
347    to the symtab that the iteration terminated on, or as complex as a
348    pointer to a private structure containing multiple results. */
349
350 PTR 
351 iterate_over_symtabs (func, arg1, arg2, arg3)
352      PTR (*func) PARAMS ((struct objfile *, struct symtab *, PTR, PTR, PTR));
353      PTR arg1;
354      PTR arg2;
355      PTR arg3;
356 {
357   register struct objfile *objfile;
358   register struct symtab *symtab;
359   PTR result = NULL;
360
361   for (objfile = object_files;
362        objfile != NULL && result == NULL;
363        objfile = objfile -> next)
364     {
365       for (symtab = objfile -> symtabs;
366            symtab != NULL && result == NULL;
367            symtab = symtab -> next)
368         {
369           result = (*func)(objfile, symtab, arg1, arg2, arg3);
370         }
371     }
372   return (result);
373 }
374
375 /* Call the function specified by FUNC for each currently available partial
376    symbol table, for as long as this function continues to return NULL.  If
377    the function ever returns non-NULL, then the iteration over the partial
378    symbol tables is terminated, and the result is returned to the caller.
379
380    The function called has full control over the form and content of the
381    information returned via the non-NULL result, which may be as simple as a
382    pointer to the partial symbol table that the iteration terminated on, or
383    as complex as a pointer to a private structure containing multiple
384    results. */
385
386 PTR 
387 iterate_over_psymtabs (func, arg1, arg2, arg3)
388      PTR (*func) PARAMS ((struct objfile *, struct partial_symtab *,
389                           PTR, PTR, PTR));
390      PTR arg1;
391      PTR arg2;
392      PTR arg3;
393 {
394   register struct objfile *objfile;
395   register struct partial_symtab *psymtab;
396   PTR result = NULL;
397
398   for (objfile = object_files;
399        objfile != NULL && result == NULL;
400        objfile = objfile -> next)
401     {
402       for (psymtab = objfile -> psymtabs;
403            psymtab != NULL && result == NULL;
404            psymtab = psymtab -> next)
405         {
406           result = (*func)(objfile, psymtab, arg1, arg2, arg3);
407         }
408     }
409   return (result);
410 }
411
412
413 /* Look for a mapped symbol file that corresponds to FILENAME and is more
414    recent than MTIME.  If MAPPED is nonzero, the user has asked that gdb
415    use a mapped symbol file for this file, so create a new one if one does
416    not currently exist.
417
418    If found, then return an open file descriptor for the file, otherwise
419    return -1.
420
421    This routine is responsible for implementing the policy that generates
422    the name of the mapped symbol file from the name of a file containing
423    symbols that gdb would like to read. */
424
425 static int
426 open_mapped_file (filename, mtime, mapped)
427      char *filename;
428      long mtime;
429      int mapped;
430 {
431   int fd;
432   char *symfilename;
433   struct stat sbuf;
434
435   /* For now, all we do is look in the local directory for a file with
436      the name of the base file and an extension of ".syms" */
437
438   symfilename = concat ("./", basename (filename), ".syms", (char *) NULL);
439
440   /* Check to see if the desired file already exists and is more recent than
441      the corresponding base file (specified by the passed MTIME parameter).
442      The open will fail if the file does not already exist. */
443
444   if ((fd = open (symfilename, O_RDWR)) >= 0)
445     {
446       if (fstat (fd, &sbuf) != 0)
447         {
448           close (fd);
449           perror_with_name (symfilename);
450         }
451       else if (sbuf.st_mtime > mtime)
452         {
453           return (fd);
454         }
455       else
456         {
457           close (fd);
458           fd = -1;
459         }
460     }
461
462   /* Either the file does not already exist, or the base file has changed
463      since it was created.  In either case, if the user has specified use of
464      a mapped file, then create a new mapped file, truncating any existing
465      one.
466
467      In the case where there is an existing file, but it is out of date, and
468      the user did not specify mapped, the existing file is just silently
469      ignored.  Perhaps we should warn about this case (FIXME?).
470
471      By default the file is rw for everyone, with the user's umask taking
472      care of turning off the permissions the user wants off. */
473
474   if (mapped)
475     {
476       fd = open (symfilename, O_RDWR | O_CREAT | O_TRUNC, 0666);
477     }
478
479   return (fd);
480 }
481
482 /* Return the base address at which we would like the next objfile's
483    mapped data to start.
484
485    For now, we use the kludge that the configuration specifies a base
486    address to which it is safe to map the first mmalloc heap, and an
487    increment to add to this address for each successive heap.  There are
488    a lot of issues to deal with here to make this work reasonably, including:
489
490      Avoid memory collisions with existing mapped address spaces
491
492      Reclaim address spaces when their mmalloc heaps are unmapped
493
494      When mmalloc heaps are shared between processes they have to be
495      mapped at the same addresses in each
496
497      Once created, a mmalloc heap that is to be mapped back in must be
498      mapped at the original address.  I.E. each objfile will expect to
499      be remapped at it's original address.  This becomes a problem if
500      the desired address is already in use.
501
502      etc, etc, etc.
503
504  */
505
506
507 static CORE_ADDR
508 map_to_address ()
509 {
510
511 #if defined(MMAP_BASE_ADDRESS) && defined (MMAP_INCREMENT)
512
513   static CORE_ADDR next = MMAP_BASE_ADDRESS;
514   CORE_ADDR mapto = next;
515
516   next += MMAP_INCREMENT;
517   return (mapto);
518
519 #else
520
521   return (0);
522
523 #endif
524
525 }