|
80 | 80 |
|
81 | 81 | using namespace llvm; |
82 | 82 |
|
83 | | -static void SignalHandler(int Sig); // defined below. |
| 83 | +static void SignalHandler(int Sig, siginfo_t *Info, |
| 84 | + void *Context); // defined below. |
84 | 85 | static void InfoSignalHandler(int Sig); // defined below. |
85 | 86 |
|
86 | 87 | using SignalHandlerFunctionType = void (*)(); |
@@ -313,8 +314,8 @@ static void RegisterHandlers() { // Not signal-safe. |
313 | 314 |
|
314 | 315 | switch (Kind) { |
315 | 316 | case SignalKind::IsKill: |
316 | | - NewHandler.sa_handler = SignalHandler; |
317 | | - NewHandler.sa_flags = SA_NODEFER | SA_RESETHAND | SA_ONSTACK; |
| 317 | + NewHandler.sa_sigaction = SignalHandler; |
| 318 | + NewHandler.sa_flags = SA_NODEFER | SA_RESETHAND | SA_ONSTACK | SA_SIGINFO; |
318 | 319 | break; |
319 | 320 | case SignalKind::IsInfo: |
320 | 321 | NewHandler.sa_handler = InfoSignalHandler; |
@@ -370,7 +371,7 @@ void sys::CleanupOnSignal(uintptr_t Context) { |
370 | 371 | } |
371 | 372 |
|
372 | 373 | // The signal handler that runs. |
373 | | -static void SignalHandler(int Sig) { |
| 374 | +static void SignalHandler(int Sig, siginfo_t *Info, void *Context) { |
374 | 375 | // Restore the signal behavior to default, so that the program actually |
375 | 376 | // crashes when we return and the signal reissues. This also ensures that if |
376 | 377 | // we crash in our signal handler that the program will terminate immediately |
@@ -401,6 +402,11 @@ static void SignalHandler(int Sig) { |
401 | 402 | } |
402 | 403 | } |
403 | 404 |
|
| 405 | + // Signal sent from another process, do not assume that continuing the |
| 406 | + // execution would re-raise it. |
| 407 | + if (Info->si_pid != getpid()) |
| 408 | + raise(Sig); |
| 409 | + |
404 | 410 | // Otherwise if it is a fault (like SEGV) run any handler. |
405 | 411 | llvm::sys::RunSignalHandlers(); |
406 | 412 |
|
@@ -468,8 +474,7 @@ void llvm::sys::AddSignalHandler(sys::SignalHandlerCallback FnPtr, |
468 | 474 |
|
469 | 475 | #if ENABLE_BACKTRACES && defined(HAVE_BACKTRACE) && \ |
470 | 476 | (defined(__linux__) || defined(__FreeBSD__) || \ |
471 | | - defined(__FreeBSD_kernel__) || defined(__NetBSD__) || \ |
472 | | - defined(__OpenBSD__) || defined(__DragonFly__)) |
| 477 | + defined(__FreeBSD_kernel__) || defined(__NetBSD__)) |
473 | 478 | struct DlIteratePhdrData { |
474 | 479 | void **StackTrace; |
475 | 480 | int depth; |
|
0 commit comments