X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fgdb_bfd.h;h=aa67fc0a1403ec88d3972d712c2af6099680c3b9;hb=268a13a5a3f7c6b9b6ffc5ac2d1b24eb41f3fbdc;hp=05b68703cf86ef058c0a514c8ee61be97ebe3fc7;hpb=32d0add0a654c1204ab71dc8a55d9374538c4b33;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/gdb_bfd.h b/gdb/gdb_bfd.h index 05b68703cf..aa67fc0a14 100644 --- a/gdb/gdb_bfd.h +++ b/gdb/gdb_bfd.h @@ -1,6 +1,6 @@ /* Definitions for BFD wrappers used by GDB. - Copyright (C) 2011-2015 Free Software Foundation, Inc. + Copyright (C) 2011-2019 Free Software Foundation, Inc. This file is part of GDB. @@ -21,16 +21,24 @@ #define GDB_BFD_H #include "registry.h" +#include "gdbsupport/gdb_ref_ptr.h" DECLARE_REGISTRY (bfd); -/* Open a read-only (FOPEN_RB) BFD given arguments like bfd_fopen. - Returns NULL on error. On success, returns a new reference to the - BFD, which must be freed with gdb_bfd_unref. BFDs returned by this - call are shared among all callers opening the same file. If FD is - not -1, then after this call it is owned by BFD. */ +/* If supplied a path starting with this sequence, gdb_bfd_open will + open BFDs using target fileio operations. */ + +#define TARGET_SYSROOT_PREFIX "target:" + +/* Returns nonzero if NAME starts with TARGET_SYSROOT_PREFIX, zero + otherwise. */ -struct bfd *gdb_bfd_open (const char *name, const char *target, int fd); +int is_target_filename (const char *name); + +/* Returns nonzero if the filename associated with ABFD starts with + TARGET_SYSROOT_PREFIX, zero otherwise. */ + +int gdb_bfd_has_target_filename (struct bfd *abfd); /* Increment the reference count of ABFD. It is fine for ABFD to be NULL; in this case the function does nothing. */ @@ -43,6 +51,36 @@ void gdb_bfd_ref (struct bfd *abfd); void gdb_bfd_unref (struct bfd *abfd); +/* A policy class for gdb::ref_ptr for BFD reference counting. */ +struct gdb_bfd_ref_policy +{ + static void incref (struct bfd *abfd) + { + gdb_bfd_ref (abfd); + } + + static void decref (struct bfd *abfd) + { + gdb_bfd_unref (abfd); + } +}; + +/* A gdb::ref_ptr that has been specialized for BFD objects. */ +typedef gdb::ref_ptr gdb_bfd_ref_ptr; + +/* Open a read-only (FOPEN_RB) BFD given arguments like bfd_fopen. + If NAME starts with TARGET_SYSROOT_PREFIX then the BFD will be + opened using target fileio operations if necessary. Returns NULL + on error. On success, returns a new reference to the BFD. BFDs + returned by this call are shared among all callers opening the same + file. If FD is not -1, then after this call it is owned by BFD. + If the BFD was not accessed using target fileio operations then the + filename associated with the BFD and accessible with + bfd_get_filename will not be exactly NAME but rather NAME with + TARGET_SYSROOT_PREFIX stripped. */ + +gdb_bfd_ref_ptr gdb_bfd_open (const char *name, const char *target, int fd); + /* Mark the CHILD BFD as being a member of PARENT. Also, increment the reference count of CHILD. Calling this function ensures that as along as CHILD remains alive, PARENT will as well. Both CHILD @@ -66,15 +104,14 @@ void gdb_bfd_mark_parent (bfd *child, bfd *parent); void gdb_bfd_record_inclusion (bfd *includer, bfd *includee); -/* Try to read or map the contents of the section SECT. If - successful, the section data is returned and *SIZE is set to the - size of the section data; this may not be the same as the size - according to bfd_get_section_size if the section was compressed. - The returned section data is associated with the BFD and will be - destroyed when the BFD is destroyed. There is no other way to free - it; for temporary uses of section data, see - bfd_malloc_and_get_section. SECT may not have relocations. This - function will throw on error. */ +/* Try to read or map the contents of the section SECT. If successful, the + section data is returned and *SIZE is set to the size of the section data; + this may not be the same as the size according to bfd_get_section_size if the + section was compressed. The returned section data is associated with the BFD + and will be destroyed when the BFD is destroyed. There is no other way to + free it; for temporary uses of section data, see bfd_malloc_and_get_section. + SECT may not have relocations. If there is an error reading the section, + this issues a warning, sets *SIZE to 0, and returns NULL. */ const gdb_byte *gdb_bfd_map_section (asection *section, bfd_size_type *size); @@ -89,45 +126,41 @@ int gdb_bfd_crc (struct bfd *abfd, unsigned long *crc_out); /* A wrapper for bfd_fopen that initializes the gdb-specific reference count. */ -bfd *gdb_bfd_fopen (const char *, const char *, const char *, int); +gdb_bfd_ref_ptr gdb_bfd_fopen (const char *, const char *, const char *, int); /* A wrapper for bfd_openr that initializes the gdb-specific reference count. */ -bfd *gdb_bfd_openr (const char *, const char *); +gdb_bfd_ref_ptr gdb_bfd_openr (const char *, const char *); /* A wrapper for bfd_openw that initializes the gdb-specific reference count. */ -bfd *gdb_bfd_openw (const char *, const char *); +gdb_bfd_ref_ptr gdb_bfd_openw (const char *, const char *); /* A wrapper for bfd_openr_iovec that initializes the gdb-specific reference count. */ -bfd *gdb_bfd_openr_iovec (const char *filename, const char *target, - void *(*open_func) (struct bfd *nbfd, - void *open_closure), - void *open_closure, - file_ptr (*pread_func) (struct bfd *nbfd, - void *stream, - void *buf, - file_ptr nbytes, - file_ptr offset), - int (*close_func) (struct bfd *nbfd, - void *stream), - int (*stat_func) (struct bfd *abfd, - void *stream, - struct stat *sb)); +gdb_bfd_ref_ptr gdb_bfd_openr_iovec (const char *filename, const char *target, + void *(*open_func) (struct bfd *nbfd, + void *open_closure), + void *open_closure, + file_ptr (*pread_func) (struct bfd *nbfd, + void *stream, + void *buf, + file_ptr nbytes, + file_ptr offset), + int (*close_func) (struct bfd *nbfd, + void *stream), + int (*stat_func) (struct bfd *abfd, + void *stream, + struct stat *sb)); /* A wrapper for bfd_openr_next_archived_file that initializes the gdb-specific reference count. */ -bfd *gdb_bfd_openr_next_archived_file (bfd *archive, bfd *previous); - -/* A wrapper for bfd_fdopenr that initializes the gdb-specific - reference count. */ +gdb_bfd_ref_ptr gdb_bfd_openr_next_archived_file (bfd *archive, bfd *previous); -bfd *gdb_bfd_fdopenr (const char *filename, const char *target, int fd);