#include "frame.h"
#include "gdb_regex.h"
#include "inferior.h"
-#include "environ.h"
+#include "gdbsupport/environ.h"
#include "language.h"
#include "gdbcmd.h"
#include "completer.h"
#include "exec.h"
#include "solist.h"
#include "observable.h"
-#include "readline/readline.h"
+#include "readline/tilde.h"
#include "remote.h"
#include "solib.h"
#include "interps.h"
#include "filesystem.h"
#include "gdb_bfd.h"
-#include "filestuff.h"
+#include "gdbsupport/filestuff.h"
#include "source.h"
+#include "cli/cli-style.h"
/* Architecture-specific operations. */
* If IS_SOLIB is non-zero:
* Look in inferior's $LD_LIBRARY_PATH.
*
- * The last check avoids doing this search when targetting remote
+ * The last check avoids doing this search when targeting remote
* machines since a sysroot will almost always be set.
*/
static gdb::unique_xmalloc_ptr<char>
-solib_find_1 (const char *in_pathname, int *fd, int is_solib)
+solib_find_1 (const char *in_pathname, int *fd, bool is_solib)
{
const struct target_so_ops *ops = solib_ops (target_gdbarch ());
int found_file = -1;
temp_pathname.reset (xstrdup (in_pathname));
else
{
- int need_dir_separator;
+ bool need_dir_separator;
/* Concatenate the sysroot and the target reported filename. We
may need to glue them with a directory separator. Cases to
| target:some/dir | | /foo/bar.dll |
IOW, we don't need to add a separator if IN_PATHNAME already
- has one, or when the the sysroot is exactly "target:".
+ has one, or when the sysroot is exactly "target:".
There's no need to check for drive spec explicitly, as we only
get here if IN_PATHNAME is considered an absolute path. */
need_dir_separator = !(IS_DIR_SEPARATOR (in_pathname[0])
&& sysroot != NULL
&& HAS_TARGET_DRIVE_SPEC (fskind, in_pathname))
{
- int need_dir_separator = !IS_DIR_SEPARATOR (in_pathname[2]);
+ bool need_dir_separator = !IS_DIR_SEPARATOR (in_pathname[2]);
char drive[2] = { in_pathname[0], '\0' };
temp_pathname.reset (concat (sysroot,
if (*gdb_sysroot != '\0' && IS_TARGET_ABSOLUTE_PATH (fskind, in_pathname))
{
- result = solib_find_1 (in_pathname, fd, 0);
+ result = solib_find_1 (in_pathname, fd, false);
if (result == NULL && fskind == file_system_kind_dos_based)
{
strcpy (new_pathname, in_pathname);
strcat (new_pathname, ".exe");
- result = solib_find_1 (new_pathname, fd, 0);
+ result = solib_find_1 (new_pathname, fd, false);
}
}
else
}
}
- return solib_find_1 (in_pathname, fd, 1);
+ return solib_find_1 (in_pathname, fd, true);
}
/* Open and return a BFD for the shared library PATHNAME. If FD is not -1,
/* Check bfd format. */
if (!bfd_check_format (abfd.get (), bfd_object))
error (_("`%s': not in executable format: %s"),
- bfd_get_filename (abfd), bfd_errmsg (bfd_get_error ()));
+ bfd_get_filename (abfd.get ()), bfd_errmsg (bfd_get_error ()));
/* Check bfd arch. */
b = gdbarch_bfd_arch_info (target_gdbarch ());
if (!b->compatible (b, bfd_get_arch_info (abfd.get ())))
warning (_("`%s': Shared library architecture %s is not compatible "
- "with target architecture %s."), bfd_get_filename (abfd),
- bfd_get_arch_info (abfd.get ())->printable_name,
+ "with target architecture %s."), bfd_get_filename (abfd.get ()),
+ bfd_get_arch_info (abfd.get ())->printable_name,
b->printable_name);
return abfd;
}
/* Read in symbols for shared object SO. If SYMFILE_VERBOSE is set in FLAGS,
- be chatty about it. Return non-zero if any symbols were actually
- loaded. */
+ be chatty about it. Return true if any symbols were actually loaded. */
-int
+bool
solib_read_symbols (struct so_list *so, symfile_add_flags flags)
{
if (so->symbols_loaded)
flags |= current_inferior ()->symfile_flags;
- TRY
+ try
{
/* Have we already loaded this shared object? */
- ALL_OBJFILES (so->objfile)
+ so->objfile = nullptr;
+ for (objfile *objfile : current_program_space->objfiles ())
{
- if (filename_cmp (objfile_name (so->objfile), so->so_name) == 0
- && so->objfile->addr_low == so->addr_low)
- break;
+ if (filename_cmp (objfile_name (objfile), so->so_name) == 0
+ && objfile->addr_low == so->addr_low)
+ {
+ so->objfile = objfile;
+ break;
+ }
}
if (so->objfile == NULL)
{
so->symbols_loaded = 1;
}
- CATCH (e, RETURN_MASK_ERROR)
+ catch (const gdb_exception_error &e)
{
exception_fprintf (gdb_stderr, e, _("Error while reading shared"
" library symbols for %s:\n"),
so->so_name);
}
- END_CATCH
- return 1;
+ return true;
}
- return 0;
+ return false;
}
-/* Return 1 if KNOWN->objfile is used by any other so_list object in the
- SO_LIST_HEAD list. Return 0 otherwise. */
+/* Return true if KNOWN->objfile is used by any other so_list object in the
+ SO_LIST_HEAD list. Return false otherwise. */
-static int
+static bool
solib_used (const struct so_list *const known)
{
const struct so_list *pivot;
for (pivot = so_list_head; pivot != NULL; pivot = pivot->next)
if (pivot != known && pivot->objfile == known->objfile)
- return 1;
- return 0;
+ return true;
+ return false;
}
/* See solib.h. */
symbols now! */
if (inf->attach_flag && symfile_objfile == NULL)
{
- TRY
+ try
{
ops->open_symbol_file_object (from_tty);
}
- CATCH (ex, RETURN_MASK_ALL)
+ catch (const gdb_exception &ex)
{
exception_fprintf (gdb_stderr, ex,
"Error reading attached "
"process's symbol file.\n");
}
- END_CATCH
}
}
/* Unless the user loaded it explicitly, free SO's objfile. */
if (gdb->objfile && ! (gdb->objfile->flags & OBJF_USERLOADED)
&& !solib_used (gdb))
- delete gdb->objfile;
+ gdb->objfile->unlink ();
/* Some targets' section tables might be referring to
sections from so->abfd; remove them. */
i->pspace = current_program_space;
current_program_space->added_solibs.push_back (i);
- TRY
+ try
{
/* Fill in the rest of the `struct so_list' node. */
if (!solib_map_sections (i))
}
}
- CATCH (e, RETURN_MASK_ERROR)
+ catch (const gdb_exception_error &e)
{
exception_fprintf (gdb_stderr, e,
_("Error while mapping shared "
"library sections:\n"));
}
- END_CATCH
/* Notify any observer that the shared object has been
loaded now that we've added it to GDB's tables. */
the file name against "/libpthread". This can lead to false
positives, but this should be good enough in practice. */
-int
+bool
libpthread_name_p (const char *name)
{
return (strstr (name, "/libpthread") != NULL);
/* Return non-zero if SO is the libpthread shared library. */
-static int
+static bool
libpthread_solib_p (struct so_list *so)
{
return libpthread_name_p (so->so_name);
symbols for any that match the pattern --- or any whose symbols
aren't already loaded, if no pattern was given. */
{
- int any_matches = 0;
- int loaded_any_symbols = 0;
+ bool any_matches = false;
+ bool loaded_any_symbols = false;
symfile_add_flags add_flags = SYMFILE_DEFER_BP_RESET;
if (from_tty)
const int add_this_solib =
(readsyms || libpthread_solib_p (gdb));
- any_matches = 1;
+ any_matches = true;
if (add_this_solib)
{
if (gdb->symbols_loaded)
gdb->so_name);
}
else if (solib_read_symbols (gdb, add_flags))
- loaded_any_symbols = 1;
+ loaded_any_symbols = true;
}
}
info_sharedlibrary_command (const char *pattern, int from_tty)
{
struct so_list *so = NULL; /* link map state variable */
- int so_missing_debug_info = 0;
+ bool so_missing_debug_info = false;
int addr_width;
int nr_libs;
struct gdbarch *gdbarch = target_gdbarch ();
&& so->symbols_loaded
&& !objfile_has_symbols (so->objfile))
{
- so_missing_debug_info = 1;
+ so_missing_debug_info = true;
uiout->field_string ("syms-read", "Yes (*)");
}
else
uiout->field_string ("syms-read", so->symbols_loaded ? "Yes" : "No");
- uiout->field_string ("name", so->so_name);
+ uiout->field_string ("name", so->so_name, file_name_style.style ());
uiout->text ("\n");
}
}
}
-/* Return 1 if ADDRESS lies within SOLIB. */
+/* See solib.h. */
-int
+bool
solib_contains_address_p (const struct so_list *const solib,
CORE_ADDR address)
{
for (p = solib->sections; p < solib->sections_end; p++)
if (p->addr <= address && address < p->endaddr)
- return 1;
+ return true;
- return 0;
+ return false;
}
/* If ADDRESS is in a shared lib in program space PSPACE, return its
return (0);
}
-/* Return whether the data starting at VADDR, size SIZE, must be kept
- in a core file for shared libraries loaded before "gcore" is used
- to be handled correctly when the core file is loaded. This only
- applies when the section would otherwise not be kept in the core
- file (in particular, for readonly sections). */
+/* See solib.h. */
-int
+bool
solib_keep_data_in_core (CORE_ADDR vaddr, unsigned long size)
{
const struct target_so_ops *ops = solib_ops (target_gdbarch ());
if (ops->keep_data_in_core)
- return ops->keep_data_in_core (vaddr, size);
+ return ops->keep_data_in_core (vaddr, size) != 0;
else
- return 0;
+ return false;
}
/* Called by free_all_symtabs */
ops->solib_create_inferior_hook (from_tty);
}
-/* Check to see if an address is in the dynamic loader's dynamic
- symbol resolution code. Return 1 if so, 0 otherwise. */
+/* See solib.h. */
-int
+bool
in_solib_dynsym_resolve_code (CORE_ADDR pc)
{
const struct target_so_ops *ops = solib_ops (target_gdbarch ());
- return ops->in_dynsym_resolve_code (pc);
+ return ops->in_dynsym_resolve_code (pc) != 0;
}
/* Implements the "sharedlibrary" command. */
for (so = so_list_head; so != NULL; so = so->next)
{
- char *found_pathname = NULL;
- int was_loaded = so->symbols_loaded;
+ const char *found_pathname = NULL;
+ bool was_loaded = so->symbols_loaded != 0;
symfile_add_flags add_flags = SYMFILE_DEFER_BP_RESET;
if (from_tty)
{
if (so->objfile && ! (so->objfile->flags & OBJF_USERLOADED)
&& !solib_used (so))
- delete so->objfile;
+ so->objfile->unlink ();
remove_target_sections (so);
clear_so (so);
}
&& (!was_loaded
|| filename_cmp (found_pathname, so->so_name) != 0))
{
- int got_error = 0;
+ bool got_error = false;
- TRY
+ try
{
solib_map_sections (so);
}
- CATCH (e, RETURN_MASK_ERROR)
+ catch (const gdb_exception_error &e)
{
exception_fprintf (gdb_stderr, e,
_("Error while mapping "
"shared library sections:\n"));
- got_error = 1;
+ got_error = true;
}
- END_CATCH
if (!got_error
&& (auto_solib_add || was_loaded || libpthread_solib_p (so)))
if (startswith (gdb_sysroot, old_prefix))
{
- static int warning_issued = 0;
+ static bool warning_issued = false;
gdb_assert (strlen (old_prefix) == strlen (new_prefix));
memcpy (gdb_sysroot, new_prefix, strlen (new_prefix));
old_prefix, new_prefix);
warning (_("sysroot set to \"%s\"."), gdb_sysroot);
- warning_issued = 1;
+ warning_issued = true;
}
}
}
-/* Handler for library-specific lookup of global symbol NAME in OBJFILE. Call
- the library-specific handler if it is installed for the current target. */
-
-struct block_symbol
-solib_global_lookup (struct objfile *objfile,
- const char *name,
- const domain_enum domain)
-{
- const struct target_so_ops *ops = solib_ops (target_gdbarch ());
-
- if (ops->lookup_lib_global_symbol != NULL)
- return ops->lookup_lib_global_symbol (objfile, name, domain);
- return (struct block_symbol) {NULL, NULL};
-}
-
/* Lookup the value for a specific symbol from dynamic symbol table. Look
up symbol from ABFD. MATCH_SYM is a callback function to determine
whether to pick up a symbol. DATA is the input of this callback
if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
&& gdbarch_elf_make_msymbol_special_p (gdbarch))
{
- struct minimal_symbol msym;
+ struct minimal_symbol msym {};
- memset (&msym, 0, sizeof (msym));
SET_MSYMBOL_VALUE_ADDRESS (&msym, symaddr);
gdbarch_elf_make_msymbol_special (gdbarch, sym, &msym);
symaddr = MSYMBOL_VALUE_RAW_ADDRESS (&msym);