diff options
author | David Carlier <devnexen@gmail.com> | 2021-08-28 22:53:16 +0100 |
---|---|---|
committer | David Carlier <devnexen@gmail.com> | 2021-08-28 22:53:16 +0100 |
commit | b35e636e40b549cd31566c9468dfbb97380ba068 (patch) | |
tree | 17ca3bf82c26ba7acc86bb2d8793de3703738c04 | |
parent | 510e106fa8635e7f9c51c896180b971de6309b2f (diff) | |
download | llvm-b35e636e40b549cd31566c9468dfbb97380ba068.tar.gz |
[Sanitizers] PGO implements enable/disable SIGKILL on callers on FreeBSD.
Reviewed By: phosek
Differential Revision: https://reviews.llvm.org/D108867
-rw-r--r-- | compiler-rt/lib/profile/InstrProfilingUtil.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/compiler-rt/lib/profile/InstrProfilingUtil.c b/compiler-rt/lib/profile/InstrProfilingUtil.c index 062727faf7e7..76b88432b0f1 100644 --- a/compiler-rt/lib/profile/InstrProfilingUtil.c +++ b/compiler-rt/lib/profile/InstrProfilingUtil.c @@ -38,6 +38,11 @@ #include <zircon/syscalls.h> #endif +#if defined(__FreeBSD__) +#include <signal.h> +#include <sys/procctl.h> +#endif + #include "InstrProfiling.h" #include "InstrProfilingUtil.h" @@ -326,6 +331,11 @@ COMPILER_RT_VISIBILITY int lprofSuspendSigKill() { if (prctl(PR_GET_PDEATHSIG, &PDeachSig) == 0 && PDeachSig == SIGKILL) prctl(PR_SET_PDEATHSIG, 0); return (PDeachSig == SIGKILL); +#elif defined(__FreeBSD__) + int PDeachSig = 0, PDisableSig = 0; + if (procctl(P_PID, 0, PROC_PDEATHSIG_STATUS, &PDeachSig) == 0 && + PDeachSig == SIGKILL) + procctl(P_PID, 0, PROC_PDEATHSIG_CTL, &PDisableSig); #else return 0; #endif @@ -334,6 +344,9 @@ COMPILER_RT_VISIBILITY int lprofSuspendSigKill() { COMPILER_RT_VISIBILITY void lprofRestoreSigKill() { #if defined(__linux__) prctl(PR_SET_PDEATHSIG, SIGKILL); +#elif defined(__FreeBSD__) + int PEnableSig = SIGKILL; + procctl(P_PID, 0, PROC_PDEATHSIG_CTL, &PEnableSig); #endif } |