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,3 +1,77 @@
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.
2009-06-18 Hui Zhu <teawater@gmail.com>
Michael Snyder <msnyder@vmware.com>

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,27 +254,46 @@ 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)
else if (!ptid_equal (inferior_ptid, null_ptid))
{
struct inferior *inf = current_inferior ();
if (port == inf->private->task)
printf_unfiltered (_(" inferior-task"));
else if (darwin_inf && darwin_inf->threads)
else if (port == inf->private->notify_port)
printf_unfiltered (_(" inferior-notify"));
else
{
int k;
thread_t t;
for (k = 0; VEC_iterate(thread_t, darwin_inf->threads, k, t); k++)
if (port == t)
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"),
darwin_inf->task);
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,
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);
}
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);

File diff suppressed because it is too large Load Diff

View File

@ -22,9 +22,6 @@
#include <mach/mach.h>
#include "gdb_assert.h"
/* Define the threads vector type. */
DEF_VEC_I (thread_t);
/* Describe the mach exception handling state for a task. This state is saved
before being changed and restored when a process is detached.
For more information on these fields see task_get_exception_ports manual
@ -48,35 +45,83 @@ struct darwin_exception_info
};
typedef struct darwin_exception_info darwin_exception_info;
/* Describe an inferior. */
struct darwin_inferior
struct darwin_exception_msg
{
/* Inferior PID. */
int pid;
mach_msg_header_t header;
/* Thread and task taking the exception. */
mach_port_t thread_port;
mach_port_t task_port;
/* Type of the exception. */
exception_type_t ex_type;
/* Machine dependent details. */
mach_msg_type_number_t data_count;
integer_t ex_data[2];
};
enum darwin_msg_state { DARWIN_RUNNING, DARWIN_STOPPED, DARWIN_MESSAGE };
struct private_thread_info
{
/* The thread port from a GDB point of view. */
thread_t gdb_port;
/* The thread port from the inferior point of view. Not to be used inside
gdb except for get_ada_task_ptid. */
thread_t inf_port;
/* Current message state.
If the kernel has sent a message it expects a reply and the inferior
can't be killed before. */
enum darwin_msg_state msg_state;
/* True if this thread is single-stepped. */
unsigned char single_step;
/* True if a signal was manually sent to the thread. */
unsigned char signaled;
/* The last exception received. */
struct darwin_exception_msg event;
};
typedef struct private_thread_info darwin_thread_t;
/* Define the threads vector type. */
DEF_VEC_O (darwin_thread_t);
/* Describe an inferior. */
struct private_inferior
{
/* Corresponding task port. */
task_t task;
/* Previous port for request notification on task. */
mach_port_t prev_not_port;
/* Port which will receive the dead-name notification for the task port.
This is used to detect the death of the task. */
mach_port_t notify_port;
/* Initial exception handling. */
darwin_exception_info exception_info;
/* Sorted vector of known threads. */
VEC(thread_t) *threads;
};
typedef struct darwin_inferior darwin_inferior;
/* Number of messages that have been received but not yet replied. */
unsigned int pending_messages;
/* Current inferior. */
extern darwin_inferior *darwin_inf;
/* Set if inferior is not controlled by ptrace(2) but through Mach. */
unsigned char no_ptrace;
/* True if this task is suspended. */
unsigned char suspended;
/* Sorted vector of known threads. */
VEC(darwin_thread_t) *threads;
};
typedef struct private_inferior darwin_inferior;
/* Exception port. */
extern mach_port_t darwin_ex_port;
/* Notification port. */
extern mach_port_t darwin_not_port;
/* Port set. */
extern mach_port_t darwin_port_set;

View File

@ -103,7 +103,6 @@ macho_symtab_read (struct objfile *objfile,
{
struct gdbarch *gdbarch = get_objfile_arch (objfile);
long storage_needed;
asymbol *sym;
long i, j;
CORE_ADDR offset;
enum minimal_symbol_type ms_type;
@ -114,15 +113,16 @@ macho_symtab_read (struct objfile *objfile,
for (i = 0; i < number_of_symbols; i++)
{
sym = symbol_table[i];
asymbol *sym = symbol_table[i];
bfd_mach_o_asymbol *mach_o_sym = (bfd_mach_o_asymbol *)sym;
offset = ANOFFSET (objfile->section_offsets, sym->section->index);
if (sym->flags & BSF_DEBUGGING)
{
unsigned char type = BFD_MACH_O_SYM_NTYPE(sym);
bfd_vma addr;
switch (type)
switch (mach_o_sym->n_type)
{
case N_SO:
if ((sym->name == NULL || sym->name[0] == 0)