[Sanitizers] PGO implements enable/disable SIGKILL on callers on FreeBSD.
authorDavid Carlier <devnexen@gmail.com>
Sat, 28 Aug 2021 21:53:16 +0000 (22:53 +0100)
committerDavid Carlier <devnexen@gmail.com>
Sat, 28 Aug 2021 21:53:16 +0000 (22:53 +0100)
Reviewed By: phosek

Differential Revision: https://reviews.llvm.org/D108867

compiler-rt/lib/profile/InstrProfilingUtil.c

index 062727f..76b8843 100644 (file)
 #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
 }