<div style="white-space:pre-wrap">What happens if the process wants to handle SIGSEGV?<br>You can't say it's in JITted code on the handler, as the signal might come from other parts of code, no?<br><br>Thank you,<br> Filipe<br></div><br><div class="gmail_quote"><div dir="ltr">On Thu, 17 Nov 2016 at 20:22, Davide Italiano via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">davide created this revision.<br class="gmail_msg">
davide added reviewers: lhames, Bigcheese, rnk.<br class="gmail_msg">
davide added a subscriber: llvm-commits.<br class="gmail_msg">
<br class="gmail_msg">
Before, this just crashed lli. Now, instead, SIGSEGV is intercepted and an error message is emitted.<br class="gmail_msg">
*TODO: test on windows (the signal interface seems to be the same, but I haven't a machine to try on ATM.<br class="gmail_msg">
Fixes <a href="https://llvm.org/bugs/show_bug.cgi?id=30650" rel="noreferrer" class="gmail_msg" target="_blank">https://llvm.org/bugs/show_bug.cgi?id=30650</a><br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
<a href="https://reviews.llvm.org/D26809" rel="noreferrer" class="gmail_msg" target="_blank">https://reviews.llvm.org/D26809</a><br class="gmail_msg">
<br class="gmail_msg">
Files:<br class="gmail_msg">
  include/llvm/Support/Process.h<br class="gmail_msg">
  lib/Support/Unix/Process.inc<br class="gmail_msg">
  lib/Support/Windows/Process.inc<br class="gmail_msg">
  tools/lli/lli.cpp<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
Index: tools/lli/lli.cpp<br class="gmail_msg">
===================================================================<br class="gmail_msg">
--- tools/lli/lli.cpp<br class="gmail_msg">
+++ tools/lli/lli.cpp<br class="gmail_msg">
@@ -357,6 +357,14 @@<br class="gmail_msg">
   llvm_unreachable("Unrecognized opt level.");<br class="gmail_msg">
 }<br class="gmail_msg">
<br class="gmail_msg">
+void segfaultHandler(int arg0) {<br class="gmail_msg">
+  // FIXME: is llvm::errs() signal-safe? If not,<br class="gmail_msg">
+  // maybe we should just set a flag and return/exit<br class="gmail_msg">
+  // in the main loop.<br class="gmail_msg">
+  llvm::errs() << "SIGSEGV in JIT'ed code\n";<br class="gmail_msg">
+  exit(1);<br class="gmail_msg">
+}<br class="gmail_msg">
+<br class="gmail_msg">
 //===----------------------------------------------------------------------===//<br class="gmail_msg">
 // main Driver function<br class="gmail_msg">
 //<br class="gmail_msg">
@@ -366,6 +374,11 @@<br class="gmail_msg">
<br class="gmail_msg">
   atexit(llvm_shutdown); // Call llvm_shutdown() on exit.<br class="gmail_msg">
<br class="gmail_msg">
+  // We can have undefined behaviour in JIT'ed code, e.g.<br class="gmail_msg">
+  // unreachable, and that causes lli to crash. Try to<br class="gmail_msg">
+  // instead intercept the signal and output a sane diagnostic.<br class="gmail_msg">
+  sys::Process::setSIGSEGVHandler(segfaultHandler);<br class="gmail_msg">
+<br class="gmail_msg">
   if (argc > 1)<br class="gmail_msg">
     ExitOnErr.setBanner(std::string(argv[0]) + ": ");<br class="gmail_msg">
<br class="gmail_msg">
Index: lib/Support/Windows/Process.inc<br class="gmail_msg">
===================================================================<br class="gmail_msg">
--- lib/Support/Windows/Process.inc<br class="gmail_msg">
+++ lib/Support/Windows/Process.inc<br class="gmail_msg">
@@ -272,6 +272,9 @@<br class="gmail_msg">
   return std::error_code();<br class="gmail_msg">
 }<br class="gmail_msg">
<br class="gmail_msg">
+// FIXME: just a stub for now.<br class="gmail_msg">
+void Process::setSIGSEGVHandler(void (*handler)(int)) {}<br class="gmail_msg">
+<br class="gmail_msg">
 std::error_code Process::SafelyCloseFileDescriptor(int FD) {<br class="gmail_msg">
   if (::close(FD) < 0)<br class="gmail_msg">
     return std::error_code(errno, std::generic_category());<br class="gmail_msg">
Index: lib/Support/Unix/Process.inc<br class="gmail_msg">
===================================================================<br class="gmail_msg">
--- lib/Support/Unix/Process.inc<br class="gmail_msg">
+++ lib/Support/Unix/Process.inc<br class="gmail_msg">
@@ -237,6 +237,10 @@<br class="gmail_msg">
   return std::error_code();<br class="gmail_msg">
 }<br class="gmail_msg">
<br class="gmail_msg">
+void Process::setSIGSEGVHandler(void (*handler)(int)) {<br class="gmail_msg">
+  signal(SIGSEGV, handler);<br class="gmail_msg">
+}<br class="gmail_msg">
+<br class="gmail_msg">
 std::error_code Process::SafelyCloseFileDescriptor(int FD) {<br class="gmail_msg">
   // Create a signal set filled with *all* signals.<br class="gmail_msg">
   sigset_t FullSet;<br class="gmail_msg">
Index: include/llvm/Support/Process.h<br class="gmail_msg">
===================================================================<br class="gmail_msg">
--- include/llvm/Support/Process.h<br class="gmail_msg">
+++ include/llvm/Support/Process.h<br class="gmail_msg">
@@ -98,6 +98,9 @@<br class="gmail_msg">
   // components should not call this.<br class="gmail_msg">
   static std::error_code FixupStandardFileDescriptors();<br class="gmail_msg">
<br class="gmail_msg">
+  // This function sets a signal handler for SIGSEGV.<br class="gmail_msg">
+  static void setSIGSEGVHandler(void (*handler)(int));<br class="gmail_msg">
+<br class="gmail_msg">
   // This function safely closes a file descriptor.  It is not safe to retry<br class="gmail_msg">
   // close(2) when it returns with errno equivalent to EINTR; this is because<br class="gmail_msg">
   // *nixen cannot agree if the file descriptor is, in fact, closed when this<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
_______________________________________________<br class="gmail_msg">
llvm-commits mailing list<br class="gmail_msg">
<a href="mailto:llvm-commits@lists.llvm.org" class="gmail_msg" target="_blank">llvm-commits@lists.llvm.org</a><br class="gmail_msg">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" class="gmail_msg" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br class="gmail_msg">
</blockquote></div>