/* Handle JIT code generation in the inferior for GDB, the GNU Debugger.
- Copyright (C) 2009-2018 Free Software Foundation, Inc.
+ Copyright (C) 2009-2019 Free Software Foundation, Inc.
This file is part of GDB.
#include "gdbcmd.h"
#include "gdbcore.h"
#include "inferior.h"
-#include "observer.h"
+#include "observable.h"
#include "objfiles.h"
#include "regcache.h"
#include "symfile.h"
ptr_type = builtin_type (gdbarch)->builtin_data_ptr;
ptr_size = TYPE_LENGTH (ptr_type);
- /* Figure out where the longlong value will be. */
- align_bytes = gdbarch_long_long_align_bit (gdbarch) / 8;
+ /* Figure out where the uint64_t value will be. */
+ align_bytes = type_align (builtin_type (gdbarch)->builtin_uint64);
off = 3 * ptr_size;
off = (off + (align_bytes - 1)) & ~(align_bytes - 1);
size_t blockvector_size;
CORE_ADDR begin, end;
struct blockvector *bv;
- enum language language;
actual_nblocks = FIRST_LOCAL_BLOCK + stab->nblocks;
cust = allocate_compunit_symtab (objfile, stab->file_name);
allocate_symtab (cust, stab->file_name);
add_compunit_symtab_to_objfile (cust);
- language = compunit_language (cust);
/* JIT compilers compile in memory. */
COMPUNIT_DIRNAME (cust) = NULL;
TARGET_CHAR_BIT,
"void");
- BLOCK_DICT (new_block) = dict_create_linear (&objfile->objfile_obstack,
- language, NULL);
+ BLOCK_MULTIDICT (new_block)
+ = mdict_create_linear (&objfile->objfile_obstack, NULL);
/* The address range. */
BLOCK_START (new_block) = (CORE_ADDR) gdb_block_iter->begin;
BLOCK_END (new_block) = (CORE_ADDR) gdb_block_iter->end;
new_block = (i == GLOBAL_BLOCK
? allocate_global_block (&objfile->objfile_obstack)
: allocate_block (&objfile->objfile_obstack));
- BLOCK_DICT (new_block) = dict_create_linear (&objfile->objfile_obstack,
- language, NULL);
+ BLOCK_MULTIDICT (new_block)
+ = mdict_create_linear (&objfile->objfile_obstack, NULL);
BLOCK_SUPERBLOCK (new_block) = block_iter;
block_iter = new_block;
CORE_ADDR entry_addr,
struct gdbarch *gdbarch)
{
- struct section_addr_info *sai;
struct bfd_section *sec;
struct objfile *objfile;
- struct cleanup *old_cleanups;
- int i;
const struct bfd_arch_info *b;
if (jit_debug)
/* Read the section address information out of the symbol file. Since the
file is generated by the JIT at runtime, it should all of the absolute
addresses that we care about. */
- sai = alloc_section_addr_info (bfd_count_sections (nbfd.get ()));
- old_cleanups = make_cleanup_free_section_addr_info (sai);
- i = 0;
+ section_addr_info sai;
for (sec = nbfd->sections; sec != NULL; sec = sec->next)
if ((bfd_get_section_flags (nbfd.get (), sec) & (SEC_ALLOC|SEC_LOAD)) != 0)
{
/* We assume that these virtual addresses are absolute, and do not
treat them as offsets. */
- sai->other[i].addr = bfd_get_section_vma (nbfd.get (), sec);
- sai->other[i].name = xstrdup (bfd_get_section_name (nbfd.get (), sec));
- sai->other[i].sectindex = sec->index;
- ++i;
+ sai.emplace_back (bfd_get_section_vma (nbfd.get (), sec),
+ bfd_get_section_name (nbfd.get (), sec),
+ sec->index);
}
- sai->num_sections = i;
/* This call does not take ownership of SAI. */
objfile = symbol_file_add_from_bfd (nbfd.get (),
- bfd_get_filename (nbfd.get ()), 0, sai,
+ bfd_get_filename (nbfd.get ()), 0,
+ &sai,
OBJF_SHARED | OBJF_NOT_FILENAME, NULL);
- do_cleanups (old_cleanups);
add_objfile_entry (objfile, entry_addr);
}
static struct objfile *
jit_find_objf_with_entry_addr (CORE_ADDR entry_addr)
{
- struct objfile *objf;
-
- ALL_OBJFILES (objf)
+ for (objfile *objf : current_program_space->objfiles ())
{
struct jit_objfile_data *objf_data;
{
/* Lookup the registration symbol. If it is missing, then we
assume we are not attached to a JIT. */
- reg_symbol = lookup_minimal_symbol_and_objfile (jit_break_name);
+ reg_symbol = lookup_bound_minimal_symbol (jit_break_name);
if (reg_symbol.minsym == NULL
|| BMSYMBOL_VALUE_ADDRESS (reg_symbol) == 0)
return 1;
static void
jit_inferior_exit_hook (struct inferior *inf)
{
- struct objfile *objf;
- struct objfile *temp;
-
- ALL_OBJFILES_SAFE (objf, temp)
+ for (objfile *objf : current_program_space->objfiles_safe ())
{
struct jit_objfile_data *objf_data
= (struct jit_objfile_data *) objfile_data (objf, jit_objfile_data);
if (ps_data != NULL && ps_data->objfile == objfile)
{
ps_data->objfile = NULL;
- delete_breakpoint (ps_data->jit_breakpoint);
+ if (ps_data->jit_breakpoint != NULL)
+ delete_breakpoint (ps_data->jit_breakpoint);
ps_data->cached_code_address = 0;
}
}
show_jit_debug,
&setdebuglist, &showdebuglist);
- observer_attach_inferior_created (jit_inferior_created);
- observer_attach_inferior_exit (jit_inferior_exit_hook);
- observer_attach_breakpoint_deleted (jit_breakpoint_deleted);
+ gdb::observers::inferior_created.attach (jit_inferior_created);
+ gdb::observers::inferior_exit.attach (jit_inferior_exit_hook);
+ gdb::observers::breakpoint_deleted.attach (jit_breakpoint_deleted);
jit_objfile_data =
register_objfile_data_with_cleanup (NULL, free_objfile_data);