Add support for a user supplied pointer argument to llvm_install_error_handler.
authorDaniel Dunbar <daniel@zuster.org>
Mon, 10 Aug 2009 03:36:26 +0000 (03:36 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Mon, 10 Aug 2009 03:36:26 +0000 (03:36 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78553 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/ErrorHandling.h
lib/Support/ErrorHandling.cpp

index 94541b52f7fcf7109d87f54ed945135b10aa9ff7..dccdf9b29cfcf08778b2e22056c684cb81bca204 100644 (file)
@@ -22,19 +22,25 @@ namespace llvm {
   class Twine;
 
   /// An error handler callback.
-  typedef void (*llvm_error_handler_t)(const std::string& reason);
+  typedef void (*llvm_error_handler_t)(void *user_data,
+                                       const std::string& reason);
 
-  /// Installs a new error handler: this function will be called whenever a
-  /// serious error is encountered by LLVM.
+  /// llvm_instal_error_handler - Installs a new error handler to be used
+  /// whenever a serious (non-recoverable) error is encountered by LLVM.
+  ///
   /// If you are using llvm_start_multithreaded, you should register the handler
   /// before doing that.
   ///
   /// If no error handler is installed the default is to print the error message
-  /// to stderr, and call exit(1).
-  /// If an error handler is installed then it is the handler's responsibility
-  /// to log the message, it will no longer be printed to stderr.
-  /// If the error handler returns, then exit(1) will be called.
-  void llvm_install_error_handler(llvm_error_handler_t handler);
+  /// to stderr, and call exit(1).  If an error handler is installed then it is
+  /// the handler's responsibility to log the message, it will no longer be
+  /// printed to stderr.  If the error handler returns, then exit(1) will be
+  /// called.
+  ///
+  /// \param user_data - An argument which will be passed to the install error
+  /// handler.
+  void llvm_install_error_handler(llvm_error_handler_t handler,
+                                  void *user_data = 0);
 
   /// Restores default error handling behaviour.
   /// This must not be called between llvm_start_multithreaded() and
index d60dc1d2ad200b0e728279f9ba3a3cd0a68fbfb5..81669223b0527e83d31945ee2481cf3615e3fff1 100644 (file)
@@ -23,12 +23,16 @@ using namespace llvm;
 using namespace std;
 
 static llvm_error_handler_t ErrorHandler = 0;
+static void *ErrorHandlerUserData = 0;
+
 namespace llvm {
-void llvm_install_error_handler(llvm_error_handler_t handler) {
+void llvm_install_error_handler(llvm_error_handler_t handler,
+                                void *user_data) {
   assert(!llvm_is_multithreaded() &&
          "Cannot register error handlers after starting multithreaded mode!\n");
   assert(!ErrorHandler && "Error handler already registered!\n");
   ErrorHandler = handler;
+  ErrorHandlerUserData = user_data;
 }
 
 void llvm_remove_error_handler(void) {
@@ -47,7 +51,7 @@ void llvm_report_error(const Twine &reason) {
   if (!ErrorHandler) {
     errs() << "LLVM ERROR: " << reason << "\n";
   } else {
-    ErrorHandler(reason.str());
+    ErrorHandler(ErrorHandlerUserData, reason.str());
   }
   exit(1);
 }