|
82 | 82 |
|
83 | 83 | using namespace llvm;
|
84 | 84 |
|
85 |
| -static void SignalHandler(int Sig); // defined below. |
| 85 | +static void SignalHandler(int Sig, siginfo_t *Info, void *); |
86 | 86 | static void InfoSignalHandler(int Sig); // defined below.
|
87 | 87 |
|
88 | 88 | using SignalHandlerFunctionType = void (*)();
|
@@ -311,8 +311,8 @@ static void RegisterHandlers() { // Not signal-safe.
|
311 | 311 |
|
312 | 312 | switch (Kind) {
|
313 | 313 | case SignalKind::IsKill:
|
314 |
| - NewHandler.sa_handler = SignalHandler; |
315 |
| - NewHandler.sa_flags = SA_NODEFER | SA_RESETHAND | SA_ONSTACK; |
| 314 | + NewHandler.sa_sigaction = SignalHandler; |
| 315 | + NewHandler.sa_flags = SA_NODEFER | SA_RESETHAND | SA_ONSTACK | SA_SIGINFO; |
316 | 316 | break;
|
317 | 317 | case SignalKind::IsInfo:
|
318 | 318 | NewHandler.sa_handler = InfoSignalHandler;
|
@@ -368,7 +368,7 @@ void sys::CleanupOnSignal(uintptr_t Context) {
|
368 | 368 | }
|
369 | 369 |
|
370 | 370 | // The signal handler that runs.
|
371 |
| -static void SignalHandler(int Sig) { |
| 371 | +static void SignalHandler(int Sig, siginfo_t *Info, void *) { |
372 | 372 | // Restore the signal behavior to default, so that the program actually
|
373 | 373 | // crashes when we return and the signal reissues. This also ensures that if
|
374 | 374 | // we crash in our signal handler that the program will terminate immediately
|
@@ -410,6 +410,11 @@ static void SignalHandler(int Sig) {
|
410 | 410 | if (Sig == SIGILL || Sig == SIGFPE || Sig == SIGTRAP)
|
411 | 411 | raise(Sig);
|
412 | 412 | #endif
|
| 413 | + |
| 414 | + // Signal sent from another process, do not assume that continuing the |
| 415 | + // execution would re-raise it. |
| 416 | + if (Info->si_pid != getpid()) |
| 417 | + raise(Sig); |
413 | 418 | }
|
414 | 419 |
|
415 | 420 | static void InfoSignalHandler(int Sig) {
|
|
0 commit comments