/* Darwin support for GDB, the GNU debugger.
- Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2008, 2009
- Free Software Foundation, Inc.
+ Copyright (C) 1997-2017 Free Software Foundation, Inc.
Contributed by Apple Computer, Inc.
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 2 of the License, or
+ the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
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, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* The name of the ppc_thread_state structure, and the names of its
members, have been changed for Unix conformance reasons. The easiest
#include "gdbcmd.h"
#include "inferior.h"
-#include <sys/param.h>
#include <sys/sysctl.h>
#include "darwin-nat.h"
#define CHECK_ARGS(what, args) do { \
if ((NULL == args) || ((args[0] != '0') && (args[1] != 'x'))) \
- error("%s must be specified with 0x...", what); \
+ error(_("%s must be specified with 0x..."), what); \
} while (0)
#define PRINT_FIELD(structure, field) \
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 ()->priv->task;
}
if (strcmp (args, "gdb") == 0)
return mach_task_self ();
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->priv->task)
+ printf_unfiltered (_(" inferior-task"));
+ else if (port == inf->priv->notify_port)
+ printf_unfiltered (_(" inferior-notify"));
+ else
+ {
+ int k;
+ darwin_thread_t *t;
+
+ for (k = 0; k < inf->priv->exception_info.count; k++)
+ if (port == inf->priv->exception_info.ports[k])
+ {
+ printf_unfiltered (_(" inferior-excp-port"));
+ break;
+ }
+
+ if (inf->priv->threads)
+ {
+ for (k = 0;
+ VEC_iterate(darwin_thread_t,
+ inf->priv->threads, k, t);
+ k++)
+ if (port == t->gdb_port)
+ {
+ printf_unfiltered (_(" inferior-thread for 0x%x"),
+ inf->priv->task);
+ break;
+ }
+ }
+ }
}
}
printf_unfiltered (_("\n"));
}
-void
+static void
darwin_debug_port_info (task_t task, mach_port_t port)
{
kern_return_t kret;
address = prev_address + prev_size;
- /* Check to see if address space has wrapped around. */
+ /* Check to see if address space has wrapped around. */
if (address == 0)
print = done = 1;
if (print)
{
printf_filtered (_("%s-%s %s/%s %s %s %s"),
- paddr(prev_address),
- paddr(prev_address + prev_size),
+ paddress (target_gdbarch (), prev_address),
+ paddress (target_gdbarch (), prev_address + prev_size),
unparse_protection (prev_info.protection),
unparse_protection (prev_info.max_protection),
unparse_inheritance (prev_info.inheritance),
vm_region_submap_short_info_data_64_t r_info;
kern_return_t kret;
int ret;
+ struct ui_out *uiout = current_uiout;
+
+ ui_out_emit_table table_emitter (uiout, 9, -1, "regions");
+
+ if (gdbarch_addr_bit (target_gdbarch ()) <= 32)
+ {
+ uiout->table_header (10, ui_left, "start", "Start");
+ uiout->table_header (10, ui_left, "end", "End");
+ }
+ else
+ {
+ uiout->table_header (18, ui_left, "start", "Start");
+ uiout->table_header (18, ui_left, "end", "End");
+ }
+ uiout->table_header (3, ui_left, "min-prot", "Min");
+ uiout->table_header (3, ui_left, "max-prot", "Max");
+ uiout->table_header (5, ui_left, "inheritence", "Inh");
+ uiout->table_header (9, ui_left, "share-mode", "Shr");
+ uiout->table_header (1, ui_left, "depth", "D");
+ uiout->table_header (3, ui_left, "submap", "Sm");
+ uiout->table_header (0, ui_noalign, "tag", "Tag");
+
+ uiout->table_body ();
r_start = 0;
r_depth = 0;
&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"));
- tag = unparse_user_tag (r_info.user_tag);
- if (tag)
- printf_unfiltered (_(" %s\n"), tag);
- else
- printf_unfiltered (_(" %u\n"), r_info.user_tag);
+
+ {
+ ui_out_emit_tuple tuple_emitter (uiout, "regions-row");
+
+ uiout->field_core_addr ("start", target_gdbarch (), r_start);
+ uiout->field_core_addr ("end", target_gdbarch (), r_start + r_size);
+ uiout->field_string ("min-prot",
+ unparse_protection (r_info.protection));
+ uiout->field_string ("max-prot",
+ unparse_protection (r_info.max_protection));
+ uiout->field_string ("inheritence",
+ unparse_inheritance (r_info.inheritance));
+ uiout->field_string ("share-mode",
+ unparse_share_mode (r_info.share_mode));
+ uiout->field_int ("depth", r_depth);
+ uiout->field_string ("submap",
+ r_info.is_submap ? _("sm ") : _("obj"));
+ tag = unparse_user_tag (r_info.user_tag);
+ if (tag)
+ uiout->field_string ("tag", tag);
+ else
+ uiout->field_int ("tag", r_info.user_tag);
+ }
+
+ if (!uiout->is_mi_like_p ())
+ uiout->text ("\n");
+
if (r_info.is_submap)
r_depth++;
else
static void
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);
- if (TYPE_CODE (value_type (val)) == TYPE_CODE_REF)
+ expression_up expr = parse_expression (exp);
+ val = evaluate_expression (expr.get ());
+ if (TYPE_IS_REFERENCE (value_type (val)))
{
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->priv->task, address);
}
static void
{
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 (¤t_inferior ()->priv->exception_info);
return;
}
else if (strcmp (args, "host") == 0)
{
- /* FIXME: This need a the privilegied host port! */
+ /* FIXME: This need a privilegied host port! */
kret = host_get_exception_ports
(darwin_host_self, EXC_MASK_ALL, info.masks,
&info.count, info.ports, info.behaviors, info.flavors);
}
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->priv->task, EXC_MASK_ALL, info.masks,
&info.count, info.ports, info.behaviors, info.flavors);
MACH_CHECK_ERROR (kret);
disp_exception (&info);
}
}
-static void
-darwin_list_gdb_ports (const char *msg)
-{
- mach_port_name_array_t names;
- mach_port_type_array_t types;
- unsigned int name_count, type_count;
- kern_return_t result;
- int i;
-
- result = mach_port_names (mach_task_self (),
- &names, &name_count, &types, &type_count);
- MACH_CHECK_ERROR (result);
-
- gdb_assert (name_count == type_count);
-
- printf_unfiltered (_("Ports for %s:"), msg);
- for (i = 0; i < name_count; ++i)
- printf_unfiltered (_(" 0x%04x"), names[i]);
- printf_unfiltered (_("\n"));
-
- vm_deallocate (mach_task_self (), (vm_address_t) names,
- (name_count * sizeof (mach_port_t)));
- vm_deallocate (mach_task_self (), (vm_address_t) types,
- (type_count * sizeof (mach_port_type_t)));
-}
-
void
_initialize_darwin_info_commands (void)
{