aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/jit.c43
-rw-r--r--gdb/jit.h13
-rw-r--r--gdb/testsuite/gdb.base/jit-elf-fork.exp36
3 files changed, 78 insertions, 14 deletions
diff --git a/gdb/jit.c b/gdb/jit.c
index 7819d76..9f57d52 100644
--- a/gdb/jit.c
+++ b/gdb/jit.c
@@ -82,6 +82,8 @@ maint_info_jit_cmd (const char *args, int from_tty)
inferior *inf = current_inferior ();
bool printed_header = false;
+ gdb::optional<ui_out_emit_table> table_emitter;
+
/* Print a line for each JIT-ed objfile. */
for (objfile *obj : inf->pspace->objfiles ())
{
@@ -90,11 +92,35 @@ maint_info_jit_cmd (const char *args, int from_tty)
if (!printed_header)
{
- printf_filtered ("Base address of known JIT-ed objfiles:\n");
+ table_emitter.emplace (current_uiout, 3, -1, "jit-created-objfiles");
+
+ /* The +2 allows for the leading '0x', then one character for
+ every 4-bits. */
+ int addr_width = 2 + (gdbarch_ptr_bit (obj->arch ()) / 4);
+
+ /* The std::max here selects between the width of an address (as
+ a string) and the width of the column header string. */
+ current_uiout->table_header (std::max (addr_width, 22), ui_left,
+ "jit_code_entry-address",
+ "jit_code_entry address");
+ current_uiout->table_header (std::max (addr_width, 15), ui_left,
+ "symfile-address", "symfile address");
+ current_uiout->table_header (20, ui_left,
+ "symfile-size", "symfile size");
+ current_uiout->table_body ();
+
printed_header = true;
}
- printf_filtered (" %s\n", paddress (obj->arch (), obj->jited_data->addr));
+ ui_out_emit_tuple tuple_emitter (current_uiout, "jit-objfile");
+
+ current_uiout->field_core_addr ("jit_code_entry-address", obj->arch (),
+ obj->jited_data->addr);
+ current_uiout->field_core_addr ("symfile-address", obj->arch (),
+ obj->jited_data->symfile_addr);
+ current_uiout->field_unsigned ("symfile-size",
+ obj->jited_data->symfile_size);
+ current_uiout->text ("\n");
}
}
@@ -211,11 +237,13 @@ get_jiter_objfile_data (objfile *objf)
at inferior address ENTRY. */
static void
-add_objfile_entry (struct objfile *objfile, CORE_ADDR entry)
+add_objfile_entry (struct objfile *objfile, CORE_ADDR entry,
+ CORE_ADDR symfile_addr, ULONGEST symfile_size)
{
gdb_assert (objfile->jited_data == nullptr);
- objfile->jited_data.reset (new jited_objfile_data (entry));
+ objfile->jited_data.reset (new jited_objfile_data (entry, symfile_addr,
+ symfile_size));
}
/* Helper function for reading the global JIT descriptor from remote
@@ -644,7 +672,9 @@ jit_object_close_impl (struct gdb_symbol_callbacks *cb,
for (gdb_symtab &symtab : obj->symtabs)
finalize_symtab (&symtab, objfile);
- add_objfile_entry (objfile, priv_data->entry_addr);
+ add_objfile_entry (objfile, priv_data->entry_addr,
+ priv_data->entry.symfile_addr,
+ priv_data->entry.symfile_size);
delete obj;
}
@@ -773,7 +803,8 @@ JITed symbol file is not an object file, ignoring it.\n"));
&sai,
OBJF_SHARED | OBJF_NOT_FILENAME, NULL);
- add_objfile_entry (objfile, entry_addr);
+ add_objfile_entry (objfile, entry_addr, code_entry->symfile_addr,
+ code_entry->symfile_size);
}
/* This function registers code associated with a JIT code entry. It uses the
diff --git a/gdb/jit.h b/gdb/jit.h
index 09dbce2..274ce45 100644
--- a/gdb/jit.h
+++ b/gdb/jit.h
@@ -95,12 +95,21 @@ struct jiter_objfile_data
struct jited_objfile_data
{
- jited_objfile_data (CORE_ADDR addr)
- : addr (addr)
+ jited_objfile_data (CORE_ADDR addr, CORE_ADDR symfile_addr,
+ ULONGEST symfile_size)
+ : addr (addr),
+ symfile_addr (symfile_addr),
+ symfile_size (symfile_size)
{}
/* Address of struct jit_code_entry for this objfile. */
CORE_ADDR addr;
+
+ /* Value of jit_code_entry->symfile_addr for this objfile. */
+ CORE_ADDR symfile_addr;
+
+ /* Value of jit_code_entry->symfile_size for this objfile. */
+ ULONGEST symfile_size;
};
/* Re-establish the jit breakpoint(s). */
diff --git a/gdb/testsuite/gdb.base/jit-elf-fork.exp b/gdb/testsuite/gdb.base/jit-elf-fork.exp
index e5b9a18..635248c 100644
--- a/gdb/testsuite/gdb.base/jit-elf-fork.exp
+++ b/gdb/testsuite/gdb.base/jit-elf-fork.exp
@@ -81,7 +81,11 @@ proc do_setup { detach-on-fork follow-fork-mode } {
gdb_continue_to_breakpoint "continue to before fork" ".*break before fork.*"
# We should have one JIT object loaded.
- gdb_test "maint info jit" " ${::hex}" "jit-ed objfiles before fork"
+ gdb_test "maint info jit" \
+ [multi_line \
+ "jit_code_entry address\\s+symfile address\\s+symfile size\\s*" \
+ "${::hex}\\s+${::hex}\\s+${::decimal}\\s*"] \
+ "jit-ed objfiles before fork"
# Put a breakpoint just after the fork, continue there.
gdb_breakpoint [gdb_get_line_number "break after fork" $::main_srcfile]
@@ -89,7 +93,11 @@ proc do_setup { detach-on-fork follow-fork-mode } {
# We should still have one JIT object loaded in whatever inferior we are
# currently stopped in, regardless of the mode.
- gdb_test "maint info jit" " ${::hex}" "jit-ed objfiles after fork"
+ gdb_test "maint info jit" \
+ [multi_line \
+ "jit_code_entry address\\s+symfile address\\s+symfile size\\s*" \
+ "${::hex}\\s+${::hex}\\s+${::decimal}\\s*"] \
+ "jit-ed objfiles after fork"
# Delete our breakpoints.
delete_breakpoints
@@ -108,7 +116,11 @@ proc_with_prefix test_detach_on_fork_off_follow_fork_mode_parent { } {
# Switch to the child, verify there is a JIT-ed objfile.
gdb_test "inferior 2" "Switching to inferior 2.*"
- gdb_test "maint info jit" " ${::hex}" "jit-ed objfile in child"
+ gdb_test "maint info jit" \
+ [multi_line \
+ "jit_code_entry address\\s+symfile address\\s+symfile size\\s*" \
+ "${::hex}\\s+${::hex}\\s+${::decimal}\\s*"] \
+ "jit-ed objfile in child"
# Continue child past JIT unload, verify there are no more JIT-ed objfiles.
gdb_continue_to_breakpoint "continue to before return - child" ".*break before return.*"
@@ -116,7 +128,11 @@ proc_with_prefix test_detach_on_fork_off_follow_fork_mode_parent { } {
# Go back to parent, the JIT-ed objfile should still be there.
gdb_test "inferior 1" "Switching to inferior 1.*"
- gdb_test "maint info jit" " ${::hex}" "jit-ed objfile in parent"
+ gdb_test "maint info jit" \
+ [multi_line \
+ "jit_code_entry address\\s+symfile address\\s+symfile size\\s*" \
+ "${::hex}\\s+${::hex}\\s+${::decimal}\\s*"] \
+ "jit-ed objfile in parent"
# Continue parent past JIT unload, verify there are no more JIT-ed objfiles.
gdb_continue_to_breakpoint "continue to before return - parent" ".*break before return.*"
@@ -135,7 +151,11 @@ proc_with_prefix test_detach_on_fork_off_follow_fork_mode_child { } {
# Switch to the parent, verify there is a JIT-ed objfile.
gdb_test "inferior 1" "Switching to inferior 1.*"
- gdb_test "maint info jit" " ${::hex}" "jit-ed objfile in parent"
+ gdb_test "maint info jit" \
+ [multi_line \
+ "jit_code_entry address\\s+symfile address\\s+symfile size\\s*" \
+ "${::hex}\\s+${::hex}\\s+${::decimal}\\s*"] \
+ "jit-ed objfile in parent"
# Continue parent past JIT unload, verify there are no more JIT-ed objfiles.
gdb_continue_to_breakpoint "continue to before return - parent" ".*break before return.*"
@@ -143,7 +163,11 @@ proc_with_prefix test_detach_on_fork_off_follow_fork_mode_child { } {
# Go back to child, the JIT-ed objfile should still be there.
gdb_test "inferior 2" "Switching to inferior 2.*"
- gdb_test "maint info jit" " ${::hex}" "jit-ed objfile in child"
+ gdb_test "maint info jit" \
+ [multi_line \
+ "jit_code_entry address\\s+symfile address\\s+symfile size\\s*" \
+ "${::hex}\\s+${::hex}\\s+${::decimal}\\s*"] \
+ "jit-ed objfile in child"
# Continue child past JIT unload, verify there are no more JIT-ed objfiles.
gdb_continue_to_breakpoint "continue to before return - child" ".*break before return.*"