summaryrefslogtreecommitdiffstats
path: root/gnu
diff options
context:
space:
mode:
authordavidxu <davidxu@FreeBSD.org>2006-02-06 06:07:56 +0000
committerdavidxu <davidxu@FreeBSD.org>2006-02-06 06:07:56 +0000
commit0fdc8d7b7221f0a885507e06716a1e61419a4b35 (patch)
tree707c96f109f73ea37c22f506e1dfb4e7f3ee5762 /gnu
parentefc29c5782bf616a8dddb3589f2e99eef8d755c7 (diff)
downloadFreeBSD-src-0fdc8d7b7221f0a885507e06716a1e61419a4b35.zip
FreeBSD-src-0fdc8d7b7221f0a885507e06716a1e61419a4b35.tar.gz
1. Eliminate compile warnings.
2. Add command 'thread signal' to print out current thread's signal mask and pending signals.
Diffstat (limited to 'gnu')
-rw-r--r--gnu/usr.bin/gdb/libgdb/fbsd-threads.c68
1 files changed, 60 insertions, 8 deletions
diff --git a/gnu/usr.bin/gdb/libgdb/fbsd-threads.c b/gnu/usr.bin/gdb/libgdb/fbsd-threads.c
index 6e9184d..e9f83a9 100644
--- a/gnu/usr.bin/gdb/libgdb/fbsd-threads.c
+++ b/gnu/usr.bin/gdb/libgdb/fbsd-threads.c
@@ -22,6 +22,7 @@
#include <dlfcn.h>
#include <sys/types.h>
#include <sys/ptrace.h>
+#include <signal.h>
#include "proc_service.h"
#include "thread_db.h"
@@ -327,8 +328,8 @@ enable_thread_event (td_thragent_t *thread_agent, int event, CORE_ADDR *bp)
/* Set up the breakpoint. */
(*bp) = gdbarch_convert_from_func_ptr_addr (current_gdbarch,
- (CORE_ADDR)notify.u.bptaddr,
- &current_target);
+ extract_typed_address(&notify.u.bptaddr, builtin_type_void_func_ptr),
+ &current_target);
create_thread_event_breakpoint ((*bp));
return TD_OK;
@@ -1198,6 +1199,7 @@ fbsd_thread_get_local_address(ptid_t ptid, struct objfile *objfile,
td_thrhandle_t th;
void *address;
CORE_ADDR lm;
+ void *lm2;
int ret, is_library = (objfile->flags & OBJF_SHARED);
if (IS_THREAD (ptid))
@@ -1222,7 +1224,8 @@ fbsd_thread_get_local_address(ptid_t ptid, struct objfile *objfile,
ret = td_ta_map_id2thr_p (thread_agent, GET_THREAD(ptid), &th);
/* get the address of the variable. */
- ret = td_thr_tls_get_addr_p (&th, (void *)lm, offset, &address);
+ store_typed_address(&lm2, builtin_type_void_data_ptr, lm);
+ ret = td_thr_tls_get_addr_p (&th, lm2, offset, &address);
if (ret != TD_OK)
{
@@ -1239,7 +1242,7 @@ fbsd_thread_get_local_address(ptid_t ptid, struct objfile *objfile,
}
/* Cast assuming host == target. */
- return (CORE_ADDR) address;
+ return extract_typed_address(&address, builtin_type_void_data_ptr);
}
return (0);
}
@@ -1250,7 +1253,8 @@ tsd_cb (thread_key_t key, void (*destructor)(void *), void *ignore)
struct minimal_symbol *ms;
char *name;
- ms = lookup_minimal_symbol_by_pc ((CORE_ADDR)destructor);
+ ms = lookup_minimal_symbol_by_pc (
+ extract_typed_address(&destructor, builtin_type_void_func_ptr));
if (!ms)
name = "???";
else
@@ -1267,6 +1271,46 @@ fbsd_thread_tsd_cmd (char *exp, int from_tty)
td_ta_tsd_iter_p (thread_agent, tsd_cb, NULL);
}
+static void
+fbsd_print_sigset (sigset_t *set)
+{
+ int i;
+
+ for (i = 1; i <= _SIG_MAXSIG; ++i) {
+ if (sigismember(set, i)) {
+ if (i < sizeof(sys_signame)/sizeof(sys_signame[0]))
+ printf_filtered("%s ", sys_signame[i]);
+ else
+ printf_filtered("sig%d ", i);
+ }
+ }
+ printf_filtered("\n");
+}
+
+static void
+fbsd_thread_signal_cmd (char *exp, int from_tty)
+{
+ td_thrhandle_t th;
+ td_thrinfo_t ti;
+ td_err_e err;
+
+ if (!fbsd_thread_active || !IS_THREAD(inferior_ptid))
+ return;
+
+ err = td_ta_map_id2thr_p (thread_agent, GET_THREAD (inferior_ptid), &th);
+ if (err != TD_OK)
+ return;
+
+ err = td_thr_get_info_p (&th, &ti);
+ if (err != TD_OK)
+ return;
+
+ printf_filtered("signal mask:\n");
+ fbsd_print_sigset(&ti.ti_sigmask);
+ printf_filtered("signal pending:\n");
+ fbsd_print_sigset(&ti.ti_pending);
+}
+
static int
ignore (CORE_ADDR addr, char *contents)
{
@@ -1473,6 +1517,10 @@ _initialize_thread_db (void)
"for the process.\n",
&thread_cmd_list);
+ add_cmd ("signal", class_run, fbsd_thread_signal_cmd,
+ "Show the thread signal info.\n",
+ &thread_cmd_list);
+
memcpy (&orig_core_ops, &core_ops, sizeof (struct target_ops));
memcpy (&core_ops, &fbsd_core_ops, sizeof (struct target_ops));
add_target (&core_ops);
@@ -1509,19 +1557,22 @@ ps_pglobal_lookup (struct ps_prochandle *ph, const char *obj,
const char *name, psaddr_t *sym_addr)
{
struct minimal_symbol *ms;
+ CORE_ADDR addr;
ms = lookup_minimal_symbol (name, NULL, NULL);
if (ms == NULL)
return PS_NOSYM;
- *sym_addr = (psaddr_t) SYMBOL_VALUE_ADDRESS (ms);
+ addr = SYMBOL_VALUE_ADDRESS (ms);
+ store_typed_address(sym_addr, builtin_type_void_data_ptr, addr);
return PS_OK;
}
ps_err_e
ps_pread (struct ps_prochandle *ph, psaddr_t addr, void *buf, size_t len)
{
- int err = target_read_memory ((CORE_ADDR) addr, buf, len);
+ int err = target_read_memory (
+ extract_typed_address(&addr, builtin_type_void_data_ptr), buf, len);
return (err == 0 ? PS_OK : PS_ERR);
}
@@ -1529,7 +1580,8 @@ ps_err_e
ps_pwrite (struct ps_prochandle *ph, psaddr_t addr, const void *buf,
size_t len)
{
- int err = target_write_memory ((CORE_ADDR) addr, (void *)buf, len);
+ int err = target_write_memory (
+ extract_typed_address(&addr, builtin_type_void_data_ptr), (void *)buf, len);
return (err == 0 ? PS_OK : PS_ERR);
}
OpenPOWER on IntegriCloud