Replace PrintStackTrace(FILE*) with PrintStackTrace(raw_ostream&)
[oota-llvm.git] / lib / Support / Unix / Signals.inc
1 //===- Signals.cpp - Generic Unix Signals Implementation -----*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file defines some helpful functions for dealing with the possibility of
11 // Unix signals occurring while your program is running.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #include "Unix.h"
16 #include "llvm/ADT/STLExtras.h"
17 #include "llvm/Support/Format.h"
18 #include "llvm/Support/FileSystem.h"
19 #include "llvm/Support/FileUtilities.h"
20 #include "llvm/Support/ManagedStatic.h"
21 #include "llvm/Support/MemoryBuffer.h"
22 #include "llvm/Support/Mutex.h"
23 #include "llvm/Support/Program.h"
24 #include "llvm/Support/UniqueLock.h"
25 #include "llvm/Support/raw_ostream.h"
26 #include <algorithm>
27 #include <string>
28 #include <vector>
29 #if HAVE_EXECINFO_H
30 # include <execinfo.h>         // For backtrace().
31 #endif
32 #if HAVE_SIGNAL_H
33 #include <signal.h>
34 #endif
35 #if HAVE_SYS_STAT_H
36 #include <sys/stat.h>
37 #endif
38 #if HAVE_CXXABI_H
39 #include <cxxabi.h>
40 #endif
41 #if HAVE_DLFCN_H
42 #include <dlfcn.h>
43 #endif
44 #if HAVE_MACH_MACH_H
45 #include <mach/mach.h>
46 #endif
47 #if HAVE_LINK_H
48 #include <link.h>
49 #endif
50
51 using namespace llvm;
52
53 static RETSIGTYPE SignalHandler(int Sig);  // defined below.
54
55 static ManagedStatic<SmartMutex<true> > SignalsMutex;
56
57 /// InterruptFunction - The function to call if ctrl-c is pressed.
58 static void (*InterruptFunction)() = nullptr;
59
60 static ManagedStatic<std::vector<std::string>> FilesToRemove;
61 static ManagedStatic<std::vector<std::pair<void (*)(void *), void *>>>
62     CallBacksToRun;
63
64 // IntSigs - Signals that represent requested termination. There's no bug
65 // or failure, or if there is, it's not our direct responsibility. For whatever
66 // reason, our continued execution is no longer desirable.
67 static const int IntSigs[] = {
68   SIGHUP, SIGINT, SIGPIPE, SIGTERM, SIGUSR1, SIGUSR2
69 };
70
71 // KillSigs - Signals that represent that we have a bug, and our prompt
72 // termination has been ordered.
73 static const int KillSigs[] = {
74   SIGILL, SIGTRAP, SIGABRT, SIGFPE, SIGBUS, SIGSEGV, SIGQUIT
75 #ifdef SIGSYS
76   , SIGSYS
77 #endif
78 #ifdef SIGXCPU
79   , SIGXCPU
80 #endif
81 #ifdef SIGXFSZ
82   , SIGXFSZ
83 #endif
84 #ifdef SIGEMT
85   , SIGEMT
86 #endif
87 };
88
89 static unsigned NumRegisteredSignals = 0;
90 static struct {
91   struct sigaction SA;
92   int SigNo;
93 } RegisteredSignalInfo[(sizeof(IntSigs)+sizeof(KillSigs))/sizeof(KillSigs[0])];
94
95
96 static void RegisterHandler(int Signal) {
97   assert(NumRegisteredSignals <
98          sizeof(RegisteredSignalInfo)/sizeof(RegisteredSignalInfo[0]) &&
99          "Out of space for signal handlers!");
100
101   struct sigaction NewHandler;
102
103   NewHandler.sa_handler = SignalHandler;
104   NewHandler.sa_flags = SA_NODEFER|SA_RESETHAND;
105   sigemptyset(&NewHandler.sa_mask);
106
107   // Install the new handler, save the old one in RegisteredSignalInfo.
108   sigaction(Signal, &NewHandler,
109             &RegisteredSignalInfo[NumRegisteredSignals].SA);
110   RegisteredSignalInfo[NumRegisteredSignals].SigNo = Signal;
111   ++NumRegisteredSignals;
112 }
113
114 static void RegisterHandlers() {
115   // If the handlers are already registered, we're done.
116   if (NumRegisteredSignals != 0) return;
117
118   for (auto S : IntSigs) RegisterHandler(S);
119   for (auto S : KillSigs) RegisterHandler(S);
120 }
121
122 static void UnregisterHandlers() {
123   // Restore all of the signal handlers to how they were before we showed up.
124   for (unsigned i = 0, e = NumRegisteredSignals; i != e; ++i)
125     sigaction(RegisteredSignalInfo[i].SigNo,
126               &RegisteredSignalInfo[i].SA, nullptr);
127   NumRegisteredSignals = 0;
128 }
129
130
131 /// RemoveFilesToRemove - Process the FilesToRemove list. This function
132 /// should be called with the SignalsMutex lock held.
133 /// NB: This must be an async signal safe function. It cannot allocate or free
134 /// memory, even in debug builds.
135 static void RemoveFilesToRemove() {
136   // We avoid iterators in case of debug iterators that allocate or release
137   // memory.
138   std::vector<std::string>& FilesToRemoveRef = *FilesToRemove;
139   for (unsigned i = 0, e = FilesToRemoveRef.size(); i != e; ++i) {
140     // We rely on a std::string implementation for which repeated calls to
141     // 'c_str()' don't allocate memory. We pre-call 'c_str()' on all of these
142     // strings to try to ensure this is safe.
143     const char *path = FilesToRemoveRef[i].c_str();
144
145     // Get the status so we can determine if it's a file or directory. If we
146     // can't stat the file, ignore it.
147     struct stat buf;
148     if (stat(path, &buf) != 0)
149       continue;
150
151     // If this is not a regular file, ignore it. We want to prevent removal of
152     // special files like /dev/null, even if the compiler is being run with the
153     // super-user permissions.
154     if (!S_ISREG(buf.st_mode))
155       continue;
156   
157     // Otherwise, remove the file. We ignore any errors here as there is nothing
158     // else we can do.
159     unlink(path);
160   }
161 }
162
163 // SignalHandler - The signal handler that runs.
164 static RETSIGTYPE SignalHandler(int Sig) {
165   // Restore the signal behavior to default, so that the program actually
166   // crashes when we return and the signal reissues.  This also ensures that if
167   // we crash in our signal handler that the program will terminate immediately
168   // instead of recursing in the signal handler.
169   UnregisterHandlers();
170
171   // Unmask all potentially blocked kill signals.
172   sigset_t SigMask;
173   sigfillset(&SigMask);
174   sigprocmask(SIG_UNBLOCK, &SigMask, nullptr);
175
176   {
177     unique_lock<SmartMutex<true>> Guard(*SignalsMutex);
178     RemoveFilesToRemove();
179
180     if (std::find(std::begin(IntSigs), std::end(IntSigs), Sig)
181         != std::end(IntSigs)) {
182       if (InterruptFunction) {
183         void (*IF)() = InterruptFunction;
184         Guard.unlock();
185         InterruptFunction = nullptr;
186         IF();        // run the interrupt function.
187         return;
188       }
189
190       Guard.unlock();
191       raise(Sig);   // Execute the default handler.
192       return;
193    }
194   }
195
196   // Otherwise if it is a fault (like SEGV) run any handler.
197   std::vector<std::pair<void (*)(void *), void *>>& CallBacksToRunRef =
198       *CallBacksToRun;
199   for (unsigned i = 0, e = CallBacksToRun->size(); i != e; ++i)
200     CallBacksToRunRef[i].first(CallBacksToRunRef[i].second);
201
202 #ifdef __s390__
203   // On S/390, certain signals are delivered with PSW Address pointing to
204   // *after* the faulting instruction.  Simply returning from the signal
205   // handler would continue execution after that point, instead of
206   // re-raising the signal.  Raise the signal manually in those cases.
207   if (Sig == SIGILL || Sig == SIGFPE || Sig == SIGTRAP)
208     raise(Sig);
209 #endif
210 }
211
212 void llvm::sys::RunInterruptHandlers() {
213   sys::SmartScopedLock<true> Guard(*SignalsMutex);
214   RemoveFilesToRemove();
215 }
216
217 void llvm::sys::SetInterruptFunction(void (*IF)()) {
218   {
219     sys::SmartScopedLock<true> Guard(*SignalsMutex);
220     InterruptFunction = IF;
221   }
222   RegisterHandlers();
223 }
224
225 // RemoveFileOnSignal - The public API
226 bool llvm::sys::RemoveFileOnSignal(StringRef Filename,
227                                    std::string* ErrMsg) {
228   {
229     sys::SmartScopedLock<true> Guard(*SignalsMutex);
230     std::vector<std::string>& FilesToRemoveRef = *FilesToRemove;
231     std::string *OldPtr =
232         FilesToRemoveRef.empty() ? nullptr : &FilesToRemoveRef[0];
233     FilesToRemoveRef.push_back(Filename);
234
235     // We want to call 'c_str()' on every std::string in this vector so that if
236     // the underlying implementation requires a re-allocation, it happens here
237     // rather than inside of the signal handler. If we see the vector grow, we
238     // have to call it on every entry. If it remains in place, we only need to
239     // call it on the latest one.
240     if (OldPtr == &FilesToRemoveRef[0])
241       FilesToRemoveRef.back().c_str();
242     else
243       for (unsigned i = 0, e = FilesToRemoveRef.size(); i != e; ++i)
244         FilesToRemoveRef[i].c_str();
245   }
246
247   RegisterHandlers();
248   return false;
249 }
250
251 // DontRemoveFileOnSignal - The public API
252 void llvm::sys::DontRemoveFileOnSignal(StringRef Filename) {
253   sys::SmartScopedLock<true> Guard(*SignalsMutex);
254   std::vector<std::string>::reverse_iterator RI =
255     std::find(FilesToRemove->rbegin(), FilesToRemove->rend(), Filename);
256   std::vector<std::string>::iterator I = FilesToRemove->end();
257   if (RI != FilesToRemove->rend())
258     I = FilesToRemove->erase(RI.base()-1);
259
260   // We need to call c_str() on every element which would have been moved by
261   // the erase. These elements, in a C++98 implementation where c_str()
262   // requires a reallocation on the first call may have had the call to c_str()
263   // made on insertion become invalid by being copied down an element.
264   for (std::vector<std::string>::iterator E = FilesToRemove->end(); I != E; ++I)
265     I->c_str();
266 }
267
268 /// AddSignalHandler - Add a function to be called when a signal is delivered
269 /// to the process.  The handler can have a cookie passed to it to identify
270 /// what instance of the handler it is.
271 void llvm::sys::AddSignalHandler(void (*FnPtr)(void *), void *Cookie) {
272   CallBacksToRun->push_back(std::make_pair(FnPtr, Cookie));
273   RegisterHandlers();
274 }
275
276 #if defined(HAVE_BACKTRACE) && defined(ENABLE_BACKTRACES)
277
278 #if HAVE_LINK_H && (defined(__linux__) || defined(__FreeBSD__) ||              \
279                     defined(__FreeBSD_kernel__) || defined(__NetBSD__))
280 struct DlIteratePhdrData {
281   void **StackTrace;
282   int depth;
283   bool first;
284   const char **modules;
285   intptr_t *offsets;
286   const char *main_exec_name;
287 };
288
289 static int dl_iterate_phdr_cb(dl_phdr_info *info, size_t size, void *arg) {
290   DlIteratePhdrData *data = (DlIteratePhdrData*)arg;
291   const char *name = data->first ? data->main_exec_name : info->dlpi_name;
292   data->first = false;
293   for (int i = 0; i < info->dlpi_phnum; i++) {
294     const auto *phdr = &info->dlpi_phdr[i];
295     if (phdr->p_type != PT_LOAD)
296       continue;
297     intptr_t beg = info->dlpi_addr + phdr->p_vaddr;
298     intptr_t end = beg + phdr->p_memsz;
299     for (int j = 0; j < data->depth; j++) {
300       if (data->modules[j])
301         continue;
302       intptr_t addr = (intptr_t)data->StackTrace[j];
303       if (beg <= addr && addr < end) {
304         data->modules[j] = name;
305         data->offsets[j] = addr - info->dlpi_addr;
306       }
307     }
308   }
309   return 0;
310 }
311
312 static bool findModulesAndOffsets(void **StackTrace, int Depth,
313                                   const char **Modules, intptr_t *Offsets,
314                                   const char *MainExecutableName) {
315   DlIteratePhdrData data = {StackTrace, Depth,   true,
316                             Modules,    Offsets, MainExecutableName};
317   dl_iterate_phdr(dl_iterate_phdr_cb, &data);
318   return true;
319 }
320 #else
321 static bool findModulesAndOffsets(void **StackTrace, int Depth,
322                                   const char **Modules, intptr_t *Offsets,
323                                   const char *MainExecutableName) {
324   return false;
325 }
326 #endif
327
328 static bool printSymbolizedStackTrace(void **StackTrace, int Depth,
329                                       llvm::raw_ostream &OS) {
330   // FIXME: Subtract necessary number from StackTrace entries to turn return addresses
331   // into actual instruction addresses.
332   // Use llvm-symbolizer tool to symbolize the stack traces.
333   ErrorOr<std::string> LLVMSymbolizerPathOrErr =
334       sys::findProgramByName("llvm-symbolizer");
335   if (!LLVMSymbolizerPathOrErr)
336     return false;
337   const std::string &LLVMSymbolizerPath = *LLVMSymbolizerPathOrErr;
338   // We don't know argv0 or the address of main() at this point, but try
339   // to guess it anyway (it's possible on some platforms).
340   std::string MainExecutableName = sys::fs::getMainExecutable(nullptr, nullptr);
341   if (MainExecutableName.empty() ||
342       MainExecutableName.find("llvm-symbolizer") != std::string::npos)
343     return false;
344
345   std::vector<const char *> Modules(Depth, nullptr);
346   std::vector<intptr_t> Offsets(Depth, 0);
347   if (!findModulesAndOffsets(StackTrace, Depth, Modules.data(), Offsets.data(),
348                              MainExecutableName.c_str()))
349     return false;
350   int InputFD;
351   SmallString<32> InputFile, OutputFile;
352   sys::fs::createTemporaryFile("symbolizer-input", "", InputFD, InputFile);
353   sys::fs::createTemporaryFile("symbolizer-output", "", OutputFile);
354   FileRemover InputRemover(InputFile.c_str());
355   FileRemover OutputRemover(OutputFile.c_str());
356
357   {
358     raw_fd_ostream Input(InputFD, true);
359     for (int i = 0; i < Depth; i++) {
360       if (Modules[i])
361         Input << Modules[i] << " " << (void*)Offsets[i] << "\n";
362     }
363   }
364
365   StringRef InputFileStr(InputFile);
366   StringRef OutputFileStr(OutputFile);
367   StringRef StderrFileStr;
368   const StringRef *Redirects[] = {&InputFileStr, &OutputFileStr,
369                                   &StderrFileStr};
370   const char *Args[] = {"llvm-symbolizer", "--functions=linkage", "--inlining",
371                         "--demangle", nullptr};
372   int RunResult =
373       sys::ExecuteAndWait(LLVMSymbolizerPath, Args, nullptr, Redirects);
374   if (RunResult != 0)
375     return false;
376
377   auto OutputBuf = MemoryBuffer::getFile(OutputFile.c_str());
378   if (!OutputBuf)
379     return false;
380   StringRef Output = OutputBuf.get()->getBuffer();
381   SmallVector<StringRef, 32> Lines;
382   Output.split(Lines, "\n");
383   auto CurLine = Lines.begin();
384   int frame_no = 0;
385   for (int i = 0; i < Depth; i++) {
386     if (!Modules[i]) {
387       OS << format("#%d %p\n", frame_no++, StackTrace[i]);
388       continue;
389     }
390     // Read pairs of lines (function name and file/line info) until we
391     // encounter empty line.
392     for (;;) {
393       if (CurLine == Lines.end())
394         return false;
395       StringRef FunctionName = *CurLine++;
396       if (FunctionName.empty())
397         break;
398       OS << format("#%d %p ", frame_no++, StackTrace[i]);
399       if (!FunctionName.startswith("??"))
400         OS << format("%s ", FunctionName.str().c_str());
401       if (CurLine == Lines.end())
402         return false;
403       StringRef FileLineInfo = *CurLine++;
404       if (!FileLineInfo.startswith("??"))
405         OS << format("%s", FileLineInfo.str().c_str());
406       else
407         OS << format("(%s+%p)", Modules[i], (void *)Offsets[i]);
408       OS << "\n";
409     }
410   }
411   return true;
412 }
413 #endif // defined(HAVE_BACKTRACE) && defined(ENABLE_BACKTRACES)
414
415 // PrintStackTrace - In the case of a program crash or fault, print out a stack
416 // trace so that the user has an indication of why and where we died.
417 //
418 // On glibc systems we have the 'backtrace' function, which works nicely, but
419 // doesn't demangle symbols.
420 void llvm::sys::PrintStackTrace(raw_ostream &OS) {
421 #if defined(HAVE_BACKTRACE) && defined(ENABLE_BACKTRACES)
422   static void* StackTrace[256];
423   // Use backtrace() to output a backtrace on Linux systems with glibc.
424   int depth = backtrace(StackTrace,
425                         static_cast<int>(array_lengthof(StackTrace)));
426   if (printSymbolizedStackTrace(StackTrace, depth, OS))
427     return;
428 #if HAVE_DLFCN_H && __GNUG__
429   int width = 0;
430   for (int i = 0; i < depth; ++i) {
431     Dl_info dlinfo;
432     dladdr(StackTrace[i], &dlinfo);
433     const char* name = strrchr(dlinfo.dli_fname, '/');
434
435     int nwidth;
436     if (!name) nwidth = strlen(dlinfo.dli_fname);
437     else       nwidth = strlen(name) - 1;
438
439     if (nwidth > width) width = nwidth;
440   }
441
442   for (int i = 0; i < depth; ++i) {
443     Dl_info dlinfo;
444     dladdr(StackTrace[i], &dlinfo);
445
446     OS << format("%-2d", i);
447
448     const char* name = strrchr(dlinfo.dli_fname, '/');
449     if (!name) OS << format(" %-*s", width, dlinfo.dli_fname);
450     else       OS << format(" %-*s", width, name+1);
451
452     OS << format(" %#0*lx", (int)(sizeof(void*) * 2) + 2,
453                  (unsigned long)StackTrace[i]);
454
455     if (dlinfo.dli_sname != nullptr) {
456       OS << ' ';
457 #  if HAVE_CXXABI_H
458       int res;
459       char* d = abi::__cxa_demangle(dlinfo.dli_sname, nullptr, nullptr, &res);
460 #  else
461       char* d = NULL;
462 #  endif
463       if (!d) OS << dlinfo.dli_sname;
464       else    OS << d;
465       free(d);
466
467       // FIXME: When we move to C++11, use %t length modifier. It's not in
468       // C++03 and causes gcc to issue warnings. Losing the upper 32 bits of
469       // the stack offset for a stack dump isn't likely to cause any problems.
470       OS << format(" + %u",(unsigned)((char*)StackTrace[i]-
471                                       (char*)dlinfo.dli_saddr));
472     }
473     OS << '\n';
474   }
475 #else
476   backtrace_symbols_fd(StackTrace, depth, STDERR_FILENO);
477 #endif
478 #endif
479 }
480
481 static void PrintStackTraceSignalHandler(void *) {
482   PrintStackTrace(llvm::errs());
483 }
484
485 void llvm::sys::DisableSystemDialogsOnCrash() {}
486
487 /// PrintStackTraceOnErrorSignal - When an error signal (such as SIGABRT or
488 /// SIGSEGV) is delivered to the process, print a stack trace and then exit.
489 void llvm::sys::PrintStackTraceOnErrorSignal() {
490   AddSignalHandler(PrintStackTraceSignalHandler, nullptr);
491
492 #if defined(__APPLE__) && defined(ENABLE_CRASH_OVERRIDES)
493   // Environment variable to disable any kind of crash dialog.
494   if (getenv("LLVM_DISABLE_CRASH_REPORT")) {
495     mach_port_t self = mach_task_self();
496
497     exception_mask_t mask = EXC_MASK_CRASH;
498
499     kern_return_t ret = task_set_exception_ports(self,
500                              mask,
501                              MACH_PORT_NULL,
502                              EXCEPTION_STATE_IDENTITY | MACH_EXCEPTION_CODES,
503                              THREAD_STATE_NONE);
504     (void)ret;
505   }
506 #endif
507 }
508
509
510 /***/
511
512 // On Darwin, raise sends a signal to the main thread instead of the current
513 // thread. This has the unfortunate effect that assert() and abort() will end up
514 // bypassing our crash recovery attempts. We work around this for anything in
515 // the same linkage unit by just defining our own versions of the assert handler
516 // and abort.
517
518 #if defined(__APPLE__) && defined(ENABLE_CRASH_OVERRIDES)
519
520 #include <signal.h>
521 #include <pthread.h>
522
523 int raise(int sig) {
524   return pthread_kill(pthread_self(), sig);
525 }
526
527 void __assert_rtn(const char *func,
528                   const char *file,
529                   int line,
530                   const char *expr) {
531   if (func)
532     fprintf(stderr, "Assertion failed: (%s), function %s, file %s, line %d.\n",
533             expr, func, file, line);
534   else
535     fprintf(stderr, "Assertion failed: (%s), file %s, line %d.\n",
536             expr, file, line);
537   abort();
538 }
539
540 void abort() {
541   raise(SIGABRT);
542   usleep(1000);
543   __builtin_trap();
544 }
545
546 #endif