mirror of
https://github.com/llvm/llvm-project.git
synced 2025-05-10 18:26:06 +00:00

on darwin systems and re-execing itself, to creating two separate test programs; lldb runs the first program and it exec's the second. Support for compiling for i386 is going away. llvm-svn: 334783
77 lines
1.9 KiB
C++
77 lines
1.9 KiB
C++
#include <errno.h>
|
|
#include <mach/mach.h>
|
|
#include <signal.h>
|
|
#include <stdio.h>
|
|
#include <stdint.h>
|
|
#include <stdlib.h>
|
|
#include <spawn.h>
|
|
#include <unistd.h>
|
|
#include <libgen.h>
|
|
#include <string>
|
|
|
|
static void
|
|
exit_with_errno (int err, const char *prefix)
|
|
{
|
|
if (err)
|
|
{
|
|
fprintf (stderr,
|
|
"%s%s",
|
|
prefix ? prefix : "",
|
|
strerror(err));
|
|
exit (err);
|
|
}
|
|
}
|
|
|
|
static pid_t
|
|
spawn_process (const char *progname,
|
|
const char **argv,
|
|
const char **envp,
|
|
int &err)
|
|
{
|
|
pid_t pid = 0;
|
|
|
|
const posix_spawn_file_actions_t *file_actions = NULL;
|
|
posix_spawnattr_t attr;
|
|
err = posix_spawnattr_init (&attr);
|
|
if (err)
|
|
return pid;
|
|
|
|
short flags = POSIX_SPAWN_SETEXEC | POSIX_SPAWN_SETSIGDEF | POSIX_SPAWN_SETSIGMASK;
|
|
err = posix_spawnattr_setflags (&attr, flags);
|
|
if (err == 0)
|
|
{
|
|
// Use the default signal masks
|
|
sigset_t no_signals;
|
|
sigset_t all_signals;
|
|
sigemptyset (&no_signals);
|
|
sigfillset (&all_signals);
|
|
posix_spawnattr_setsigmask(&attr, &no_signals);
|
|
posix_spawnattr_setsigdefault(&attr, &all_signals);
|
|
|
|
err = posix_spawn (&pid,
|
|
progname,
|
|
file_actions,
|
|
&attr,
|
|
(char * const *)argv,
|
|
(char * const *)envp);
|
|
|
|
posix_spawnattr_destroy(&attr);
|
|
}
|
|
return pid;
|
|
}
|
|
|
|
int
|
|
main (int argc, char const **argv)
|
|
{
|
|
char *buf = (char*) malloc (strlen (argv[0]) + 12);
|
|
strlcpy (buf, argv[0], strlen (argv[0]) + 1);
|
|
std::string directory_name (::dirname (buf));
|
|
|
|
std::string other_program = directory_name + "/secondprog";
|
|
int err = 0; // Set breakpoint 1 here
|
|
spawn_process (other_program.c_str(), argv, NULL, err);
|
|
if (err)
|
|
exit_with_errno (err, "posix_spawn x86_64 error");
|
|
return 0;
|
|
}
|