Merge remote-tracking branch 'origin/swift-4.0-branch' into stable
diff --git a/lib/profile/InstrProfilingFile.c b/lib/profile/InstrProfilingFile.c
index 3ee34b9..ba717ee 100644
--- a/lib/profile/InstrProfilingFile.c
+++ b/lib/profile/InstrProfilingFile.c
@@ -269,16 +269,9 @@
 
 static void installExitSignalHandlers(void) {
   unsigned I;
-  struct sigaction sigact;
-  int err;
   for (I = 0; I < lprofCurFilename.NumExitSignals; ++I) {
-    memset(&sigact, 0, sizeof(sigact));
-    sigact.sa_handler = exitSignalHandler;
-    err = sigaction(lprofCurFilename.ExitOnSignals[I], &sigact, NULL);
-    if (err)
-      PROF_WARN(
-          "Unable to install an exit signal handler for %d (errno = %d).\n",
-          lprofCurFilename.ExitOnSignals[I], err);
+    lprofInstallSignalHandler(lprofCurFilename.ExitOnSignals[I],
+                              exitSignalHandler);
   }
 }
 
diff --git a/lib/profile/InstrProfilingUtil.c b/lib/profile/InstrProfilingUtil.c
index d116041..9b96309 100644
--- a/lib/profile/InstrProfilingUtil.c
+++ b/lib/profile/InstrProfilingUtil.c
@@ -26,6 +26,7 @@
 #include <sys/utsname.h>
 #endif
 
+#include <signal.h>
 #include <stdlib.h>
 #include <string.h>
 
@@ -245,3 +246,21 @@
   prctl(PR_SET_PDEATHSIG, SIGKILL);
 #endif
 }
+
+COMPILER_RT_VISIBILITY void lprofInstallSignalHandler(int sig,
+                                                      void (*handler)(int)) {
+#ifdef _WIN32
+  void (*err)(int) = signal(sig, handler);
+  if (err == SIG_ERR)
+    PROF_WARN("Unable to install an exit signal handler for %d (errno = %d).\n",
+              sig, errno);
+#else
+  struct sigaction sigact;
+  memset(&sigact, 0, sizeof(sigact));
+  sigact.sa_handler = handler;
+  int err = sigaction(sig, &sigact, NULL);
+  if (err)
+    PROF_WARN("Unable to install an exit signal handler for %d (errno = %d).\n",
+              sig, err);
+#endif
+}
diff --git a/lib/profile/InstrProfilingUtil.h b/lib/profile/InstrProfilingUtil.h
index 9698599..f4b5b7d 100644
--- a/lib/profile/InstrProfilingUtil.h
+++ b/lib/profile/InstrProfilingUtil.h
@@ -59,4 +59,6 @@
 /* Restore previously suspended SIGKILL. */
 void lprofRestoreSigKill();
 
+void lprofInstallSignalHandler(int sig, void(*handler)(int));
+
 #endif /* PROFILE_INSTRPROFILINGUTIL_H */