2009-06-19 Tristan Gingold <gingold@adacore.com>

* machoread.c (macho_symtab_read): Adjust for bfd changes.
	* darwin-nat.h (struct darwin_exception_msg): New type to describe
	a mach exception.
	(struct private_thread_info): New type to describe the state of the
	thread.
	(DEF_VEC_I thread_t): Removed, replaced by ...
	(DEF_VEC_O darwin_thread_t): ... this new type.
	(struct darwin_inferior): Renamed to ...
	(struct private_inferior): ... this type.  Fields added.
	(darwin_not_port): Moved into the private inferior structure.
	* darwin-nat.c: Add includes, improve comments.
	Rewrite to handle multiple threads and processes.
	(darwin_resume_to): New function and protype.
	(darwin_resume, darwin_wait_to, darwin_wait): Ditto.
	(darwin_kill_inferior): Add ops argument.
	(darwin_pid_to_str): New function.
	(darwin_thread_alive): Ditto.
	(darwin_inf, darwin_not_port): Removed.
	(darwin_inf_fake_stop): New variable.
	(msgin, msgout, msg_state, exc_msg): Removed.
	(mach_check_error): Use warning instead of error.
	(darwin_ptrace): Adjust debug level.
	(cmp_thread_t): Fix names (typo).
	(darwin_check_new_threads): Argument is now an inferior,
	adjust for new structures, add no change check, ignore dead ports,
	handle first thread case.
	(find_inferior_task_it): New function.
	(find_inferior_notify_it): Ditto.
	(darwin_find_inferior_by_task): Ditto.
	(darwin_find_inferior_by_notify): Ditto.
	(darwin_find_thread): Ditto.
	(darwin_suspend_inferior): Ditto.
	(darwin_resume_inferior): Ditto.
	(catch_exception_raise_state): Removed.
	(catch_exception_raise_state_identity): Removed.
	(darwin_suspend_inferior_it): New function.
	(darwin_resume_inferior_it): Ditto.
	(darwin_dump_message): New function, extracted from darwin_wait.
	(darwin_decode_exception_message): New function.
	(darwin_encode_reply): New function.
	(catch_exception_raise): Removed.
	(darwin_send_reply): New function, extracted from darwin_resume.
	(darwin_resume_thread): New function, extracted from darwin_resume.
	(struct resume_inferior_threads_param): New type.
	(darwin_resume_inferior_threads_it): New function.
	(darwin_resume_inferior_threads): New function.
	(darwin_suspend_inferior_threads): New function.
	(darwin_resume): Mostly rewritten to handle multiple threads and
	some corner cases.
	(darwin_decode_message): New function extracted from darwin_wait.
	(cancel_breakpoint): New function.
	(darwin_wait): Mostly rewritten.  Handle multiple threads.
	(darwin_mourn_inferior): Adjust for per process structures.
	(darwin_reply_to_all_pending_messages): New function.
	(darwin_stop_inferior): Adjust for per inferior structures.
	(darwin_attach_pid): Ditto.
	(darwin_init_thread_list): Ditto.
	(darwin_attach): Ditto.
	(darwin_detach): Ditto.
	(darwin_files_info): Now empty.
	(darwin_pid_to_str): Adjust returns string to match one expected by
	the testsuite.
	(darwin_read_write_inferior): Rename err variable to match other uses.
	Adjust debug message.  Handle submaps.
	(darwin_xfer_memory): Adjust for per inferior structures.
	(set_enable_mach_exceptions): Ditto.
	(darwin_pid_to_exec_file): New function.
	(darwin_get_ada_task_ptid): Ditto.
	(darwin_supports_multi_process): Ditto.
	(_initialize_darwin_inferior): Remove useless assertion, adjust for
	per inferior structures.  Add new target operations.
This commit is contained in:
Tristan Gingold
2009-06-19 14:30:30 +00:00
parent cf8fd78b38
commit bb00b29d78
5 changed files with 1449 additions and 617 deletions

View File

@@ -1,5 +1,5 @@
/* Darwin support for GDB, the GNU debugger.
Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2008, 2009
Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2008
Free Software Foundation, Inc.
Contributed by Apple Computer, Inc.
@@ -8,7 +8,7 @@
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
@@ -17,7 +17,9 @@
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/* The name of the ppc_thread_state structure, and the names of its
members, have been changed for Unix conformance reasons. The easiest
@@ -118,9 +120,9 @@ get_task_from_args (char *args)
if (args == NULL || *args == 0)
{
if (darwin_inf->task == TASK_NULL)
if (ptid_equal (inferior_ptid, null_ptid))
printf_unfiltered (_("No inferior running\n"));
return darwin_inf->task;
return current_inferior ()->private->task;
}
if (strcmp (args, "gdb") == 0)
return mach_task_self ();
@@ -252,25 +254,44 @@ info_mach_ports_command (char *args, int from_tty)
printf_unfiltered (_(" gdb-task"));
else if (port == darwin_host_self)
printf_unfiltered (_(" host-self"));
else if (port == darwin_not_port)
printf_unfiltered (_(" gdb-notifier"));
else if (port == darwin_ex_port)
printf_unfiltered (_(" gdb-exception"));
else if (port == darwin_port_set)
printf_unfiltered (_(" gdb-port_set"));
else if (darwin_inf && port == darwin_inf->task)
printf_unfiltered (_(" inferior-task"));
else if (darwin_inf && darwin_inf->threads)
else if (!ptid_equal (inferior_ptid, null_ptid))
{
int k;
thread_t t;
for (k = 0; VEC_iterate(thread_t, darwin_inf->threads, k, t); k++)
if (port == t)
{
printf_unfiltered (_(" inferior-thread for 0x%x"),
darwin_inf->task);
break;
}
struct inferior *inf = current_inferior ();
if (port == inf->private->task)
printf_unfiltered (_(" inferior-task"));
else if (port == inf->private->notify_port)
printf_unfiltered (_(" inferior-notify"));
else
{
int k;
darwin_thread_t *t;
for (k = 0; k < inf->private->exception_info.count; k++)
if (port == inf->private->exception_info.ports[k])
{
printf_unfiltered (_(" inferior-excp-port"));
break;
}
if (inf->private->threads)
{
for (k = 0;
VEC_iterate(darwin_thread_t,
inf->private->threads, k, t);
k++)
if (port == t->gdb_port)
{
printf_unfiltered (_(" inferior-thread for 0x%x"),
inf->private->task);
break;
}
}
}
}
}
printf_unfiltered (_("\n"));
@@ -600,12 +621,36 @@ darwin_debug_regions_recurse (task_t task)
vm_region_submap_short_info_data_64_t r_info;
kern_return_t kret;
int ret;
struct cleanup *table_chain;
table_chain = make_cleanup_ui_out_table_begin_end (uiout, 9, -1, "regions");
if (gdbarch_addr_bit (current_gdbarch) <= 32)
{
ui_out_table_header (uiout, 10, ui_left, "start", "Start");
ui_out_table_header (uiout, 10, ui_left, "end", "End");
}
else
{
ui_out_table_header (uiout, 18, ui_left, "start", "Start");
ui_out_table_header (uiout, 18, ui_left, "end", "End");
}
ui_out_table_header (uiout, 3, ui_left, "min-prot", "Min");
ui_out_table_header (uiout, 3, ui_left, "max-prot", "Max");
ui_out_table_header (uiout, 5, ui_left, "inheritence", "Inh");
ui_out_table_header (uiout, 9, ui_left, "share-mode", "Shr");
ui_out_table_header (uiout, 1, ui_left, "depth", "D");
ui_out_table_header (uiout, 3, ui_left, "submap", "Sm");
ui_out_table_header (uiout, 0, ui_noalign, "tag", "Tag");
ui_out_table_body (uiout);
r_start = 0;
r_depth = 0;
while (1)
{
const char *tag;
struct cleanup *row_chain;
r_info_size = VM_REGION_SUBMAP_SHORT_INFO_COUNT_64;
r_size = -1;
@@ -614,25 +659,39 @@ darwin_debug_regions_recurse (task_t task)
&r_info_size);
if (kret != KERN_SUCCESS)
break;
printf_filtered (_("%s-%s %s/%s %-5s %-10s %2d %s"),
paddr(r_start),
paddr(r_start + r_size),
unparse_protection (r_info.protection),
unparse_protection (r_info.max_protection),
unparse_inheritance (r_info.inheritance),
unparse_share_mode (r_info.share_mode),
r_depth,
r_info.is_submap ? _("sm ") : _("obj"));
row_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "regions-row");
ui_out_field_core_addr (uiout, "start", r_start);
ui_out_field_core_addr (uiout, "end", r_start + r_size);
ui_out_field_string (uiout, "min-prot",
unparse_protection (r_info.protection));
ui_out_field_string (uiout, "max-prot",
unparse_protection (r_info.max_protection));
ui_out_field_string (uiout, "inheritence",
unparse_inheritance (r_info.inheritance));
ui_out_field_string (uiout, "share-mode",
unparse_share_mode (r_info.share_mode));
ui_out_field_int (uiout, "depth", r_depth);
ui_out_field_string (uiout, "submap",
r_info.is_submap ? _("sm ") : _("obj"));
tag = unparse_user_tag (r_info.user_tag);
if (tag)
printf_unfiltered (_(" %s\n"), tag);
ui_out_field_string (uiout, "tag", tag);
else
printf_unfiltered (_(" %u\n"), r_info.user_tag);
ui_out_field_int (uiout, "tag", r_info.user_tag);
do_cleanups (row_chain);
if (!ui_out_is_mi_like_p (uiout))
ui_out_text (uiout, "\n");
if (r_info.is_submap)
r_depth++;
else
r_start += r_size;
}
do_cleanups (table_chain);
}
@@ -672,6 +731,7 @@ info_mach_region_command (char *exp, int from_tty)
struct expression *expr;
struct value *val;
mach_vm_address_t address;
struct inferior *inf;
expr = parse_expression (exp);
val = evaluate_expression (expr);
@@ -679,22 +739,13 @@ info_mach_region_command (char *exp, int from_tty)
{
val = value_ind (val);
}
/* In rvalue contexts, such as this, functions are coerced into
pointers to functions. */
if (TYPE_CODE (value_type (val)) == TYPE_CODE_FUNC
&& VALUE_LVAL (val) == lval_memory)
{
address = value_address (val);
}
else
{
address = value_as_address (val);
}
address = value_as_address (val);
if ((!darwin_inf) || (darwin_inf->task == TASK_NULL))
if (ptid_equal (inferior_ptid, null_ptid))
error (_("Inferior not available"));
darwin_debug_region (darwin_inf->task, address);
inf = current_inferior ();
darwin_debug_region (inf->private->task, address);
}
static void
@@ -761,9 +812,9 @@ info_mach_exceptions_command (char *args, int from_tty)
{
if (strcmp (args, "saved") == 0)
{
if (darwin_inf->task == TASK_NULL)
error (_("No inferior running\n"));
disp_exception (&darwin_inf->exception_info);
if (ptid_equal (inferior_ptid, null_ptid))
printf_unfiltered (_("No inferior running\n"));
disp_exception (&current_inferior ()->private->exception_info);
return;
}
else if (strcmp (args, "host") == 0)
@@ -780,11 +831,14 @@ info_mach_exceptions_command (char *args, int from_tty)
}
else
{
if (darwin_inf->task == TASK_NULL)
error (_("No inferior running\n"));
struct inferior *inf;
if (ptid_equal (inferior_ptid, null_ptid))
printf_unfiltered (_("No inferior running\n"));
inf = current_inferior ();
kret = task_get_exception_ports
(darwin_inf->task, EXC_MASK_ALL, info.masks,
(inf->private->task, EXC_MASK_ALL, info.masks,
&info.count, info.ports, info.behaviors, info.flavors);
MACH_CHECK_ERROR (kret);
disp_exception (&info);