|
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
|
@@ -412,6 +413,11 @@ static void SignalHandler(int Sig) {
|
412 | 413 | if (Sig == SIGILL || Sig == SIGFPE || Sig == SIGTRAP)
|
413 | 414 | raise(Sig);
|
414 | 415 | #endif
|
| 416 | + |
| 417 | + // Signal sent from another process, do not assume that continuing the |
| 418 | + // execution would re-raise it. |
| 419 | + if (Info->si_pid != getpid()) |
| 420 | + raise(Sig); |
415 | 421 | }
|
416 | 422 |
|
417 | 423 | static void InfoSignalHandler(int Sig) {
|
|
0 commit comments