17ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens//===- llvm/Support/Signals.h - Signal Handling support ----------*- C++ -*-===//
27ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens//
37ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens//                     The LLVM Compiler Infrastructure
47ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens//
57ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens// This file is distributed under the University of Illinois Open Source
67ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens// License. See LICENSE.TXT for details.
77ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens//
87ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens//===----------------------------------------------------------------------===//
97ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens//
107ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens// This file defines some helpful functions for dealing with the possibility of
117ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens// unix signals occurring while your program is running.
127ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens//
137ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens//===----------------------------------------------------------------------===//
147ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens
157ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens#ifndef LLVM_SUPPORT_SIGNALS_H
167ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens#define LLVM_SUPPORT_SIGNALS_H
177ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens
187ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens#include <string>
197ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens
207ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capensnamespace llvm {
217ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capensclass StringRef;
227ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capensclass raw_ostream;
237ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens
247ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capensnamespace sys {
257ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens
267ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens  /// This function runs all the registered interrupt handlers, including the
277ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens  /// removal of files registered by RemoveFileOnSignal.
287ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens  void RunInterruptHandlers();
297ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens
307ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens  /// This function registers signal handlers to ensure that if a signal gets
317ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens  /// delivered that the named file is removed.
327ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens  /// @brief Remove a file if a fatal signal occurs.
337ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens  bool RemoveFileOnSignal(StringRef Filename, std::string* ErrMsg = nullptr);
347ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens
357ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens  /// This function removes a file from the list of files to be removed on
367ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens  /// signal delivery.
377ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens  void DontRemoveFileOnSignal(StringRef Filename);
387ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens
397ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens  /// When an error signal (such as SIBABRT or SIGSEGV) is delivered to the
407ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens  /// process, print a stack trace and then exit.
417ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens  /// \brief Print a stack trace if a fatal signal occurs.
427ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens  /// \param Argv0 the current binary name, used to find the symbolizer
437ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens  ///        relative to the current binary before searching $PATH; can be
447ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens  ///        StringRef(), in which case we will only search $PATH.
457ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens  /// \param DisableCrashReporting if \c true, disable the normal crash
467ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens  ///        reporting mechanisms on the underlying operating system.
477ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens  void PrintStackTraceOnErrorSignal(StringRef Argv0,
487ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens                                    bool DisableCrashReporting = false);
497ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens
507ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens  /// Disable all system dialog boxes that appear when the process crashes.
517ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens  void DisableSystemDialogsOnCrash();
527ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens
537ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens  /// \brief Print the stack trace using the given \c raw_ostream object.
547ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens  void PrintStackTrace(raw_ostream &OS);
557ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens
567ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens  // Run all registered signal handlers.
577ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens  void RunSignalHandlers();
587ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens
597ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens  /// AddSignalHandler - Add a function to be called when an abort/kill signal
607ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens  /// is delivered to the process.  The handler can have a cookie passed to it
617ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens  /// to identify what instance of the handler it is.
627ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens  void AddSignalHandler(void (*FnPtr)(void *), void *Cookie);
637ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens
647ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens  /// This function registers a function to be called when the user "interrupts"
657ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens  /// the program (typically by pressing ctrl-c).  When the user interrupts the
667ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens  /// program, the specified interrupt function is called instead of the program
677ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens  /// being killed, and the interrupt function automatically disabled.  Note
687ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens  /// that interrupt functions are not allowed to call any non-reentrant
697ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens  /// functions.  An null interrupt function pointer disables the current
707ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens  /// installed function.  Note also that the handler may be executed on a
717ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens  /// different thread on some platforms.
727ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens  /// @brief Register a function to be called when ctrl-c is pressed.
737ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens  void SetInterruptFunction(void (*IF)());
747ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens} // End sys namespace
757ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens} // End llvm namespace
767ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens
777ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens#endif
78