More Solaris procfs cleanup

This procfs.c (and friends) cleanup patch grew along a couple of lines:

* First I noticed that PR_MODEL_NATIVE is always defined now that
  Solaris 10 is the minimum supported version.

* Then there was a cleanup that I'd missed when removing support for
  !NEW_PROC_API, IRIX, and Tru64 UNIX: given that sysset_t is no longer
  dynamic, there's no need for the special sysset_t_alloc, but we can
  just use XNEW instead.

* Then I found one of those ARI warning mails on gdb-patches, discovered
  how to run it myself and fixed a large number of the warnings, among
  them all uses of sprintf.

  I had to silence the warnings in only 3 instances of the same issue,
  namely references to LDT in function names which are due to the
  libthread_db API.

* Even so, there were several formatting glitches, like braces around
  single statements in an if, which I chose to fix while I was at it.

The result has been tested on amd64-pc-solaris2.11 and
amd64-pc-solaris2.11.

	* proc-utils.h (PROC_CTL_WORD_TYPE): Remove.

	* procfs.c: Don't check for PR_MODEL_NATIVE definition.
	* sparc-sol2-nat.c: Likewise.  Remove Linux, __arch64__ references.
	* sol-thread.c (ps_pdmodel): Don't guard definition.

	* procfs.c: Fix formatting.

	* procfs.c (sysset_t_alloc): Remove.
	(create_procinfo): Use XNEW instead of sysset_t_alloc.
	(procfs_debug_inferior): Likewise.
	(procfs_set_exec_trap): Likewise.
	(proc_set_traced_sysentry): Don't allocate argp dynamically.
	(proc_set_traced_sysexit): Likewise.

	* procfs.c (create_procinfo): Use xsnprintf to fix ARI warning.
	(dead_procinfo): Likewise.
	(proc_warn): Likewise.
	(proc_error): Likewise.
	(proc_get_LDT_entry): Likewise.
	(do_attach): Likewise.
	(procfs_target::pid_to_str): Likewise.
	(iterate_over_mappings): Likewise.

	* procfs.c (create_procinfo): Fix ARI warning.
	(proc_get_status): Likewise.
	(proc_stop_process): Likewise.
	(proc_run_process): Likewise.
	(proc_kill): Likewise.
	(proc_get_LDT_entry): Likewise.
	(procfs_find_LDT_entry): Likewise.
	(proc_update_threads): Likewise.
	(proc_iterate_over_threads): Likewise.
	(do_attach): Likewise.
	(procfs_xfer_memory): Likewise.
	(invalidate_cache): Likewise.
	(procfs_target::resume): Likewise.
	(procfs_init_inferior): Likewise.
	(procfs_set_exec_trap): Likewise.
	(procfs_target::thread_alive): Likewise.
	(procfs_target::pid_to_exec_file): Likewise.
	(iterate_over_mappings): Likewise.
	(procfs_target::make_corefile_notes): Likewise.
	* sol-thread.c (sol_thread_target::thread_alive): Likewise.

	* procfs.c (procfs_find_LDT_entry): Silence ARI warning.
	(procfs_find_LDT_entry): Likewise.
	* sol-thread.c (ps_lgetLDT): Likewise.
This commit is contained in:
Rainer Orth 2018-09-20 20:01:05 +02:00
parent ddb77fcccb
commit c475f56919
5 changed files with 166 additions and 149 deletions

View File

@ -1,3 +1,54 @@
2018-09-20 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* proc-utils.h (PROC_CTL_WORD_TYPE): Remove.
* procfs.c: Don't check for PR_MODEL_NATIVE definition.
* sparc-sol2-nat.c: Likewise. Remove Linux, __arch64__ references.
* sol-thread.c (ps_pdmodel): Don't guard definition.
* procfs.c: Fix formatting.
* procfs.c (sysset_t_alloc): Remove.
(create_procinfo): Use XNEW instead of sysset_t_alloc.
(procfs_debug_inferior): Likewise.
(procfs_set_exec_trap): Likewise.
(proc_set_traced_sysentry): Don't allocate argp dynamically.
(proc_set_traced_sysexit): Likewise.
* procfs.c (create_procinfo): Use xsnprintf to fix ARI warning.
(dead_procinfo): Likewise.
(proc_warn): Likewise.
(proc_error): Likewise.
(proc_get_LDT_entry): Likewise.
(do_attach): Likewise.
(procfs_target::pid_to_str): Likewise.
(iterate_over_mappings): Likewise.
* procfs.c (create_procinfo): Fix ARI warning.
(proc_get_status): Likewise.
(proc_stop_process): Likewise.
(proc_run_process): Likewise.
(proc_kill): Likewise.
(proc_get_LDT_entry): Likewise.
(procfs_find_LDT_entry): Likewise.
(proc_update_threads): Likewise.
(proc_iterate_over_threads): Likewise.
(do_attach): Likewise.
(procfs_xfer_memory): Likewise.
(invalidate_cache): Likewise.
(procfs_target::resume): Likewise.
(procfs_init_inferior): Likewise.
(procfs_set_exec_trap): Likewise.
(procfs_target::thread_alive): Likewise.
(procfs_target::pid_to_exec_file): Likewise.
(iterate_over_mappings): Likewise.
(procfs_target::make_corefile_notes): Likewise.
* sol-thread.c (sol_thread_target::thread_alive): Likewise.
* procfs.c (procfs_find_LDT_entry): Silence ARI warning.
(procfs_find_LDT_entry): Likewise.
* sol-thread.c (ps_lgetLDT): Likewise.
2018-09-20 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
PR tdep/17903

View File

@ -112,8 +112,4 @@ extern void procfs_note (const char *, const char *, int);
/* Define the type (and more importantly the width) of the control
word used to write to the /proc/PID/ctl file. */
#if defined (PROC_CTL_WORD_TYPE)
typedef PROC_CTL_WORD_TYPE procfs_ctl_t;
#else
typedef long procfs_ctl_t;
#endif

View File

@ -141,7 +141,7 @@ class procfs_target final : public inf_child_target
bool info_proc (const char *, enum info_proc_what) override;
#if defined(PR_MODEL_NATIVE) && (PR_MODEL_NATIVE == PR_MODEL_LP64)
#if PR_MODEL_NATIVE == PR_MODEL_LP64
int auxv_parse (gdb_byte **readptr,
gdb_byte *endptr, CORE_ADDR *typep, CORE_ADDR *valp)
override;
@ -163,7 +163,7 @@ class procfs_target final : public inf_child_target
static procfs_target the_procfs_target;
#if defined (PR_MODEL_NATIVE) && (PR_MODEL_NATIVE == PR_MODEL_LP64)
#if PR_MODEL_NATIVE == PR_MODEL_LP64
/* When GDB is built as 64-bit application on Solaris, the auxv data
is presented in 64-bit format. We need to provide a custom parser
to handle that. */
@ -277,7 +277,6 @@ static void destroy_procinfo (procinfo *p);
static void dead_procinfo (procinfo *p, const char *msg, int killp);
static int open_procinfo_files (procinfo *p, int which);
static void close_procinfo_files (procinfo *p);
static sysset_t *sysset_t_alloc (procinfo *pi);
static int iterate_over_mappings
(procinfo *pi, find_memory_region_ftype child_func, void *data,
@ -456,7 +455,8 @@ create_procinfo (int pid, int tid)
{
procinfo *pi, *parent = NULL;
if ((pi = find_procinfo (pid, tid)))
pi = find_procinfo (pid, tid);
if (pi != NULL)
return pi; /* Already exists, nothing to do. */
/* Find parent before doing malloc, to save having to cleanup. */
@ -470,19 +470,20 @@ create_procinfo (int pid, int tid)
pi->pid = pid;
pi->tid = tid;
pi->saved_entryset = sysset_t_alloc (pi);
pi->saved_exitset = sysset_t_alloc (pi);
pi->saved_entryset = XNEW (sysset_t);
pi->saved_exitset = XNEW (sysset_t);
/* Chain into list. */
if (tid == 0)
{
sprintf (pi->pathname, MAIN_PROC_NAME_FMT, pid);
xsnprintf (pi->pathname, sizeof (pi->pathname), MAIN_PROC_NAME_FMT, pid);
pi->next = procinfo_list;
procinfo_list = pi;
}
else
{
sprintf (pi->pathname, "/proc/%d/lwp/%d", pid, tid);
xsnprintf (pi->pathname, sizeof (pi->pathname), "/proc/%d/lwp/%d",
pid, tid);
pi->next = parent->thread_list;
parent->thread_list = pi;
}
@ -573,12 +574,10 @@ dead_procinfo (procinfo *pi, const char *msg, int kill_p)
char procfile[80];
if (pi->pathname)
{
print_sys_errmsg (pi->pathname, errno);
}
print_sys_errmsg (pi->pathname, errno);
else
{
sprintf (procfile, "process %d", pi->pid);
xsnprintf (procfile, sizeof (procfile), "process %d", pi->pid);
print_sys_errmsg (procfile, errno);
}
if (kill_p == KILL)
@ -588,14 +587,6 @@ dead_procinfo (procinfo *pi, const char *msg, int kill_p)
error ("%s", msg);
}
/* Allocate and (partially) initialize a sysset_t struct. */
static sysset_t *
sysset_t_alloc (procinfo *pi)
{
return (sysset_t *) xmalloc (sizeof (sysset_t));
}
/* =================== END, STRUCT PROCINFO "MODULE" =================== */
/* =================== /proc "MODULE" =================== */
@ -623,14 +614,16 @@ static int proc_iterate_over_threads
static void
proc_warn (procinfo *pi, const char *func, int line)
{
sprintf (errmsg, "procfs: %s line %d, %s", func, line, pi->pathname);
xsnprintf (errmsg, sizeof (errmsg), "procfs: %s line %d, %s",
func, line, pi->pathname);
print_sys_errmsg (errmsg, errno);
}
static void
proc_error (procinfo *pi, const char *func, int line)
{
sprintf (errmsg, "procfs: %s line %d, %s", func, line, pi->pathname);
xsnprintf (errmsg, sizeof (errmsg), "procfs: %s line %d, %s",
func, line, pi->pathname);
perror_with_name (errmsg);
}
@ -644,8 +637,7 @@ static int
proc_get_status (procinfo *pi)
{
/* Status file descriptor is opened "lazily". */
if (pi->status_fd == 0 &&
open_procinfo_files (pi, FD_STATUS) == 0)
if (pi->status_fd == 0 && open_procinfo_files (pi, FD_STATUS) == 0)
{
pi->status_valid = 0;
return 0;
@ -886,8 +878,7 @@ proc_stop_process (procinfo *pi)
/* We might conceivably apply this operation to an LWP, and the
LWP's ctl file descriptor might not be open. */
if (pi->ctl_fd == 0 &&
open_procinfo_files (pi, FD_CTL) == 0)
if (pi->ctl_fd == 0 && open_procinfo_files (pi, FD_CTL) == 0)
return 0;
else
{
@ -952,11 +943,8 @@ proc_run_process (procinfo *pi, int step, int signo)
/* We will probably have to apply this operation to individual
threads, so make sure the control file descriptor is open. */
if (pi->ctl_fd == 0 &&
open_procinfo_files (pi, FD_CTL) == 0)
{
return 0;
}
if (pi->ctl_fd == 0 && open_procinfo_files (pi, FD_CTL) == 0)
return 0;
runflags = PRCFAULT; /* Always clear current fault. */
if (step)
@ -1059,20 +1047,16 @@ proc_set_traced_sysentry (procinfo *pi, sysset_t *sysset)
if (pi->tid != 0)
pi = find_procinfo_or_die (pi->pid, 0);
struct gdb_proc_ctl_pcsentry {
struct {
procfs_ctl_t cmd;
/* Use char array to avoid alignment issues. */
char sysset[sizeof (sysset_t)];
} *argp;
int argp_size = sizeof (struct gdb_proc_ctl_pcsentry);
} arg;
argp = (struct gdb_proc_ctl_pcsentry *) xmalloc (argp_size);
arg.cmd = PCSENTRY;
memcpy (&arg.sysset, sysset, sizeof (sysset_t));
argp->cmd = PCSENTRY;
memcpy (&argp->sysset, sysset, sizeof (sysset_t));
win = (write (pi->ctl_fd, (char *) argp, argp_size) == argp_size);
xfree (argp);
win = (write (pi->ctl_fd, (char *) &arg, sizeof (arg)) == sizeof (arg));
/* The above operation renders the procinfo's cached pstatus
obsolete. */
@ -1101,16 +1085,12 @@ proc_set_traced_sysexit (procinfo *pi, sysset_t *sysset)
procfs_ctl_t cmd;
/* Use char array to avoid alignment issues. */
char sysset[sizeof (sysset_t)];
} *argp;
int argp_size = sizeof (struct gdb_proc_ctl_pcsexit);
} arg;
argp = (struct gdb_proc_ctl_pcsexit *) xmalloc (argp_size);
arg.cmd = PCSEXIT;
memcpy (&arg.sysset, sysset, sizeof (sysset_t));
argp->cmd = PCSEXIT;
memcpy (&argp->sysset, sysset, sizeof (sysset_t));
win = (write (pi->ctl_fd, (char *) argp, argp_size) == argp_size);
xfree (argp);
win = (write (pi->ctl_fd, (char *) &arg, sizeof (arg)) == sizeof (arg));
/* The above operation renders the procinfo's cached pstatus
obsolete. */
@ -1445,9 +1425,7 @@ proc_set_gregs (procinfo *pi)
return 0; /* proc_get_regs has already warned. */
if (pi->ctl_fd == 0 && open_procinfo_files (pi, FD_CTL) == 0)
{
return 0;
}
return 0;
else
{
struct {
@ -1481,9 +1459,7 @@ proc_set_fpregs (procinfo *pi)
return 0; /* proc_get_fpregs has already warned. */
if (pi->ctl_fd == 0 && open_procinfo_files (pi, FD_CTL) == 0)
{
return 0;
}
return 0;
else
{
struct {
@ -1513,11 +1489,8 @@ proc_kill (procinfo *pi, int signo)
/* We might conceivably apply this operation to an LWP, and the
LWP's ctl file descriptor might not be open. */
if (pi->ctl_fd == 0 &&
open_procinfo_files (pi, FD_CTL) == 0)
{
return 0;
}
if (pi->ctl_fd == 0 && open_procinfo_files (pi, FD_CTL) == 0)
return 0;
else
{
procfs_ctl_t cmd[2];
@ -1595,7 +1568,7 @@ proc_set_watchpoint (procinfo *pi, CORE_ADDR addr, int len, int wflags)
matching ssh struct (LDT entry). */
static struct ssd *
proc_get_LDT_entry (procinfo *pi, int key)
proc_get_LDT_entry (procinfo *pi, int key) /* ARI: editCase function */
{
static struct ssd *ldt_entry = NULL;
char pathname[MAX_PROC_NAME_SIZE];
@ -1606,7 +1579,7 @@ proc_get_LDT_entry (procinfo *pi, int key)
ldt_entry = XNEW (struct ssd);
/* Open the file descriptor for the LDT table. */
sprintf (pathname, "/proc/%d/ldt", pi->pid);
xsnprintf (pathname, sizeof (pathname), "/proc/%d/ldt", pi->pid);
scoped_fd fd (open_with_retry (pathname, O_RDONLY));
if (fd.get () < 0)
{
@ -1618,10 +1591,10 @@ proc_get_LDT_entry (procinfo *pi, int key)
while (read (fd.get (), ldt_entry, sizeof (struct ssd))
== sizeof (struct ssd))
{
if (ldt_entry->sel == 0 &&
ldt_entry->bo == 0 &&
ldt_entry->acc1 == 0 &&
ldt_entry->acc2 == 0)
if (ldt_entry->sel == 0
&& ldt_entry->bo == 0
&& ldt_entry->acc1 == 0
&& ldt_entry->acc2 == 0)
break; /* end of table */
/* If key matches, return this entry. */
if (ldt_entry->sel == key)
@ -1634,21 +1607,23 @@ proc_get_LDT_entry (procinfo *pi, int key)
/* Returns the pointer to the LDT entry of PTID. */
struct ssd *
procfs_find_LDT_entry (ptid_t ptid)
procfs_find_LDT_entry (ptid_t ptid) /* ARI: editCase function */
{
gdb_gregset_t *gregs;
int key;
procinfo *pi;
/* Find procinfo for the lwp. */
if ((pi = find_procinfo (ptid.pid (), ptid.lwp ())) == NULL)
pi = find_procinfo (ptid.pid (), ptid.lwp ());
if (pi == NULL)
{
warning (_("procfs_find_LDT_entry: could not find procinfo for %d:%ld."),
ptid.pid (), ptid.lwp ());
return NULL;
}
/* get its general registers. */
if ((gregs = proc_get_gregs (pi)) == NULL)
gregs = proc_get_gregs (pi);
if (gregs == NULL)
{
warning (_("procfs_find_LDT_entry: could not read gregs for %d:%ld."),
ptid.pid (), ptid.lwp ());
@ -1763,7 +1738,8 @@ proc_update_threads (procinfo *pi)
if (direntry->d_name[0] != '.') /* skip '.' and '..' */
{
lwpid = atoi (&direntry->d_name[0]);
if ((thread = create_procinfo (pi->pid, lwpid)) == NULL)
thread = create_procinfo (pi->pid, lwpid);
if (thread == NULL)
proc_error (pi, "update_threads, create_procinfo", __LINE__);
}
pi->threads_valid = 1;
@ -1802,7 +1778,8 @@ proc_iterate_over_threads (procinfo *pi,
for (thread = pi->thread_list; thread != NULL; thread = next)
{
next = thread->next; /* In case thread is destroyed. */
if ((retval = (*func) (pi, thread, ptr)) != 0)
retval = (*func) (pi, thread, ptr);
if (retval != 0)
break;
}
@ -1851,7 +1828,7 @@ procfs_debug_inferior (procinfo *pi)
/* Register to trace the 'exit' system call (on entry). */
traced_syscall_entries = sysset_t_alloc (pi);
traced_syscall_entries = XNEW (sysset_t);
premptyset (traced_syscall_entries);
praddset (traced_syscall_entries, SYS_exit);
praddset (traced_syscall_entries, SYS_lwp_exit);
@ -1867,7 +1844,7 @@ procfs_debug_inferior (procinfo *pi)
names. On the SGI, for example, there is no SYS_exec, but there
*is* a SYS_execv. So, we try to account for that. */
traced_syscall_exits = sysset_t_alloc (pi);
traced_syscall_exits = XNEW (sysset_t);
premptyset (traced_syscall_exits);
#ifdef SYS_exec
praddset (traced_syscall_exits, SYS_exec);
@ -1946,14 +1923,16 @@ do_attach (ptid_t ptid)
int fail;
int lwpid;
if ((pi = create_procinfo (ptid.pid (), 0)) == NULL)
pi = create_procinfo (ptid.pid (), 0);
if (pi == NULL)
perror (_("procfs: out of memory in 'attach'"));
if (!open_procinfo_files (pi, FD_CTL))
{
fprintf_filtered (gdb_stderr, "procfs:%d -- ", __LINE__);
sprintf (errmsg, "do_attach: couldn't open /proc file for process %d",
ptid.pid ());
xsnprintf (errmsg, sizeof (errmsg),
"do_attach: couldn't open /proc file for process %d",
ptid.pid ());
dead_procinfo (pi, errmsg, NOKILL);
}
@ -1989,7 +1968,8 @@ do_attach (ptid_t ptid)
if (!proc_get_held_signals (pi, &pi->saved_sighold))
dead_procinfo (pi, "do_attach: couldn't save held signals.", NOKILL);
if ((fail = procfs_debug_inferior (pi)) != 0)
fail = procfs_debug_inferior (pi);
if (fail != 0)
dead_procinfo (pi, "do_attach: failed in procfs_debug_inferior", NOKILL);
inf = current_inferior ();
@ -2232,8 +2212,8 @@ procfs_target::wait (ptid_t ptid, struct target_waitstatus *status,
pi->status_valid = 0; /* re-read again, IMMEDIATELY... */
#endif
/* If child is not stopped, wait for it to stop. */
if (!(proc_flags (pi) & (PR_STOPPED | PR_ISTOP)) &&
!proc_wait_for_stop (pi))
if (!(proc_flags (pi) & (PR_STOPPED | PR_ISTOP))
&& !proc_wait_for_stop (pi))
{
/* wait_for_stop failed: has the child terminated? */
if (errno == ENOENT)
@ -2357,8 +2337,10 @@ procfs_target::wait (ptid_t ptid, struct target_waitstatus *status,
long i, nsysargs, *sysargs;
if ((nsysargs = proc_nsysarg (pi)) > 0 &&
(sysargs = proc_sysargs (pi)) != NULL)
nsysargs = proc_nsysarg (pi);
sysargs = proc_sysargs (pi);
if (nsysargs > 0 && sysargs != NULL)
{
printf_filtered (_("%ld syscall arguments:\n"),
nsysargs);
@ -2441,8 +2423,10 @@ procfs_target::wait (ptid_t ptid, struct target_waitstatus *status,
long i, nsysargs, *sysargs;
if ((nsysargs = proc_nsysarg (pi)) > 0 &&
(sysargs = proc_sysargs (pi)) != NULL)
nsysargs = proc_nsysarg (pi);
sysargs = proc_sysargs (pi);
if (nsysargs > 0 && sysargs != NULL)
{
printf_filtered (_("%ld syscall arguments:\n"),
nsysargs);
@ -2530,9 +2514,9 @@ procfs_target::wait (ptid_t ptid, struct target_waitstatus *status,
}
/* Got this far without error: If retval isn't in the
threads database, add it. */
if (retval.pid () > 0 &&
retval != inferior_ptid &&
!in_thread_list (retval))
if (retval.pid () > 0
&& retval != inferior_ptid
&& !in_thread_list (retval))
{
/* We have a new thread. We need to add it both to
GDB's list and to our own. If we don't create a
@ -2598,8 +2582,7 @@ procfs_xfer_memory (gdb_byte *readbuf, const gdb_byte *writebuf,
/* Find procinfo for main process. */
pi = find_procinfo_or_die (inferior_ptid.pid (), 0);
if (pi->as_fd == 0 &&
open_procinfo_files (pi, FD_AS) == 0)
if (pi->as_fd == 0 && open_procinfo_files (pi, FD_AS) == 0)
{
proc_warn (pi, "xfer_memory, open_proc_files", __LINE__);
return TARGET_XFER_E_IO;
@ -2647,15 +2630,13 @@ invalidate_cache (procinfo *parent, procinfo *pi, void *ptr)
#if 0
if (pi->gregs_dirty)
if (parent == NULL ||
proc_get_current_thread (parent) != pi->tid)
if (parent == NULL || proc_get_current_thread (parent) != pi->tid)
if (!proc_set_gregs (pi)) /* flush gregs cache */
proc_warn (pi, "target_resume, set_gregs",
__LINE__);
if (gdbarch_fp0_regnum (target_gdbarch ()) >= 0)
if (pi->fpregs_dirty)
if (parent == NULL ||
proc_get_current_thread (parent) != pi->tid)
if (parent == NULL || proc_get_current_thread (parent) != pi->tid)
if (!proc_set_fpregs (pi)) /* flush fpregs cache */
proc_warn (pi, "target_resume, set_fpregs",
__LINE__);
@ -2740,8 +2721,7 @@ procfs_target::resume (ptid_t ptid, int step, enum gdb_signal signo)
errno = 0;
/* Convert signal to host numbering. */
if (signo == 0 ||
(signo == GDB_SIGNAL_STOP && pi->ignore_next_sigstop))
if (signo == 0 || (signo == GDB_SIGNAL_STOP && pi->ignore_next_sigstop))
native_signo = 0;
else
native_signo = gdb_signal_to_host (signo);
@ -2906,7 +2886,8 @@ procfs_init_inferior (struct target_ops *ops, int pid)
if (!target_is_pushed (ops))
push_target (ops);
if ((pi = create_procinfo (pid, 0)) == NULL)
pi = create_procinfo (pid, 0);
if (pi == NULL)
perror (_("procfs: out of memory in 'init_inferior'"));
if (!open_procinfo_files (pi, FD_CTL))
@ -2925,8 +2906,7 @@ procfs_init_inferior (struct target_ops *ops, int pid)
*/
/* If not stopped yet, wait for it to stop. */
if (!(proc_flags (pi) & PR_STOPPED) &&
!(proc_wait_for_stop (pi)))
if (!(proc_flags (pi) & PR_STOPPED) && !(proc_wait_for_stop (pi)))
dead_procinfo (pi, "init_inferior: wait_for_stop failed", KILL);
/* Save some of the /proc state to be restored if we detach. */
@ -2943,7 +2923,8 @@ procfs_init_inferior (struct target_ops *ops, int pid)
if (!proc_get_traced_sysexit (pi, pi->saved_exitset))
proc_error (pi, "init_inferior, get_traced_sysexit", __LINE__);
if ((fail = procfs_debug_inferior (pi)) != 0)
fail = procfs_debug_inferior (pi);
if (fail != 0)
proc_error (pi, "init_inferior (procfs_debug_inferior)", fail);
/* FIXME: logically, we should really be turning OFF run-on-last-close,
@ -2988,7 +2969,8 @@ procfs_set_exec_trap (void)
procinfo *pi;
sysset_t *exitset;
if ((pi = create_procinfo (getpid (), 0)) == NULL)
pi = create_procinfo (getpid (), 0);
if (pi == NULL)
perror_with_name (_("procfs: create_procinfo failed in child."));
if (open_procinfo_files (pi, FD_CTL) == 0)
@ -3006,7 +2988,7 @@ procfs_set_exec_trap (void)
names. On the SGI, for example, there is no SYS_exec, but there
*is* a SYS_execv. So, we try to account for that. */
exitset = sysset_t_alloc (pi);
exitset = XNEW (sysset_t);
premptyset (exitset);
#ifdef SYS_exec
praddset (exitset, SYS_exec);
@ -3185,7 +3167,8 @@ procfs_target::thread_alive (ptid_t ptid)
proc = ptid.pid ();
thread = ptid.lwp ();
/* If I don't know it, it ain't alive! */
if ((pi = find_procinfo (proc, thread)) == NULL)
pi = find_procinfo (proc, thread);
if (pi == NULL)
return false;
/* If I can't get its status, it ain't alive!
@ -3209,9 +3192,9 @@ procfs_target::pid_to_str (ptid_t ptid)
static char buf[80];
if (ptid.lwp () == 0)
sprintf (buf, "process %d", ptid.pid ());
xsnprintf (buf, sizeof (buf), "process %d", ptid.pid ());
else
sprintf (buf, "LWP %ld", ptid.lwp ());
xsnprintf (buf, sizeof (buf), "LWP %ld", ptid.lwp ());
return buf;
}
@ -3226,7 +3209,7 @@ procfs_target::pid_to_exec_file (int pid)
char name[PATH_MAX];
/* Solaris 11 introduced /proc/<proc-id>/execname. */
xsnprintf (name, PATH_MAX, "/proc/%d/execname", pid);
xsnprintf (name, sizeof (name), "/proc/%d/execname", pid);
scoped_fd fd (gdb_open_cloexec (name, O_RDONLY, 0));
if (fd.get () < 0 || read (fd.get (), buf, PATH_MAX - 1) < 0)
{
@ -3234,7 +3217,7 @@ procfs_target::pid_to_exec_file (int pid)
Solaris 10. */
ssize_t len;
xsnprintf (name, PATH_MAX, "/proc/%d/path/a.out", pid);
xsnprintf (name, sizeof (name), "/proc/%d/path/a.out", pid);
len = readlink (name, buf, PATH_MAX - 1);
if (len <= 0)
strcpy (buf, name);
@ -3335,13 +3318,9 @@ procfs_target::stopped_by_watchpoint ()
pi = find_procinfo_or_die (inferior_ptid.pid (), 0);
if (proc_flags (pi) & (PR_STOPPED | PR_ISTOP))
{
if (proc_why (pi) == PR_FAULTED)
{
if (proc_what (pi) == FLTWATCH)
return true;
}
}
if (proc_why (pi) == PR_FAULTED)
if (proc_what (pi) == FLTWATCH)
return true;
return false;
}
@ -3367,20 +3346,16 @@ procfs_target::insert_watchpoint (CORE_ADDR addr, int len,
{
if (!target_have_steppable_watchpoint
&& !gdbarch_have_nonsteppable_watchpoint (target_gdbarch ()))
{
/* When a hardware watchpoint fires off the PC will be left at
the instruction following the one which caused the
watchpoint. It will *NOT* be necessary for GDB to step over
the watchpoint. */
return procfs_set_watchpoint (inferior_ptid, addr, len, type, 1);
}
/* When a hardware watchpoint fires off the PC will be left at
the instruction following the one which caused the
watchpoint. It will *NOT* be necessary for GDB to step over
the watchpoint. */
return procfs_set_watchpoint (inferior_ptid, addr, len, type, 1);
else
{
/* When a hardware watchpoint fires off the PC will be left at
the instruction which caused the watchpoint. It will be
necessary for GDB to step over the watchpoint. */
return procfs_set_watchpoint (inferior_ptid, addr, len, type, 0);
}
/* When a hardware watchpoint fires off the PC will be left at
the instruction which caused the watchpoint. It will be
necessary for GDB to step over the watchpoint. */
return procfs_set_watchpoint (inferior_ptid, addr, len, type, 0);
}
int
@ -3433,7 +3408,7 @@ iterate_over_mappings (procinfo *pi, find_memory_region_ftype child_func,
/* Get the number of mappings, allocate space,
and read the mappings into prmaps. */
/* Open map fd. */
sprintf (pathname, "/proc/%d/map", pi->pid);
xsnprintf (pathname, sizeof (pathname), "/proc/%d/map", pi->pid);
scoped_fd map_fd (open (pathname, O_RDONLY));
if (map_fd.get () < 0)
@ -3451,8 +3426,11 @@ iterate_over_mappings (procinfo *pi, find_memory_region_ftype child_func,
proc_error (pi, "iterate_over_mappings (read)", __LINE__);
for (prmap = prmaps; nmap > 0; prmap++, nmap--)
if ((funcstat = (*func) (prmap, child_func, data)) != 0)
return funcstat;
{
funcstat = (*func) (prmap, child_func, data);
if (funcstat != 0)
return funcstat;
}
return 0;
}
@ -3658,9 +3636,7 @@ procfs_target::info_proc (const char *args, enum info_proc_what what)
}
if (mappings)
{
info_proc_mappings (process, 0);
}
info_proc_mappings (process, 0);
return true;
}
@ -3891,8 +3867,9 @@ procfs_target::make_corefile_notes (bfd *obfd, int *note_size)
psargs[sizeof (psargs) - 1] = 0;
inf_args = get_inferior_args ();
if (inf_args && *inf_args &&
strlen (inf_args) < ((int) sizeof (psargs) - (int) strlen (psargs)))
if (inf_args && *inf_args
&& (strlen (inf_args)
< ((int) sizeof (psargs) - (int) strlen (psargs))))
{
strncat (psargs, " ",
sizeof (psargs) - strlen (psargs));

View File

@ -705,9 +705,11 @@ sol_thread_target::thread_alive (ptid_t ptid)
int pid;
pid = ptid.tid ();
if ((val = p_td_ta_map_id2thr (main_ta, pid, &th)) != TD_OK)
val = p_td_ta_map_id2thr (main_ta, pid, &th);
if (val != TD_OK)
return false; /* Thread not found. */
if ((val = p_td_thr_validate (&th)) != TD_OK)
val = p_td_thr_validate (&th);
if (val != TD_OK)
return false; /* Thread not valid. */
return true; /* Known thread. */
}
@ -943,7 +945,6 @@ ps_lsetfpregs (struct ps_prochandle *ph, lwpid_t lwpid,
return PS_OK;
}
#ifdef PR_MODEL_LP64
/* Identify process as 32-bit or 64-bit. At the moment we're using
BFD to do this. There might be a more Solaris-specific
(e.g. procfs) method, but this ought to work. */
@ -960,7 +961,6 @@ ps_pdmodel (struct ps_prochandle *ph, int *data_model)
return PS_OK;
}
#endif /* PR_MODEL_LP64 */
#if (defined(__i386__) || defined(__x86_64__)) && defined (sun)
@ -970,8 +970,7 @@ ps_pdmodel (struct ps_prochandle *ph, int *data_model)
of libthread_db would fail because of ps_lgetLDT being undefined. */
ps_err_e
ps_lgetLDT (struct ps_prochandle *ph, lwpid_t lwpid,
struct ssd *pldt)
ps_lgetLDT (struct ps_prochandle *ph, lwpid_t lwpid, struct ssd *pldt) /* ARI: editCase function */
{
/* NOTE: only used on Solaris, therefore OK to refer to procfs.c. */
struct ssd *ret;

View File

@ -40,16 +40,10 @@
PR_MODEL_LP64, we know that GDB is being compiled as a 64-bit
program.
GNU/Linux uses the same formats as Solaris for its core files (but
not for ptrace(2)). The GNU/Linux headers don't define
PR_MODEL_NATIVE though. Therefore we rely on the __arch64__ define
provided by GCC to determine the appropriate data model.
Note that a 32-bit GDB won't be able to debug a 64-bit target
process using /proc on Solaris. */
#if (defined (__arch64__) || \
(defined (PR_MODEL_NATIVE) && (PR_MODEL_NATIVE == PR_MODEL_LP64)))
#if PR_MODEL_NATIVE == PR_MODEL_LP64
#include "sparc64-tdep.h"