diff options
author | Chris Lattner <sabre@nondot.org> | 2010-08-17 23:03:53 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2010-08-17 23:03:53 +0000 |
commit | 6217082dc3227a6cca70a5e038a6d682b2e87c5b (patch) | |
tree | f29974986ad46a61dc55b8eb3a91786a43278ccc /llvm/lib/Support/ErrorHandling.cpp | |
parent | 83072afbcd2e7b972594229240b9cefd2913158c (diff) | |
download | bcm5719-llvm-6217082dc3227a6cca70a5e038a6d682b2e87c5b.tar.gz bcm5719-llvm-6217082dc3227a6cca70a5e038a6d682b2e87c5b.zip |
report_fatal_error can't use errs(), because errs() can call
into report_fatal_error. Just blast the string to stderr with write(2)
and hope for the best! Part of rdar://8318441
llvm-svn: 111320
Diffstat (limited to 'llvm/lib/Support/ErrorHandling.cpp')
-rw-r--r-- | llvm/lib/Support/ErrorHandling.cpp | 34 |
1 files changed, 26 insertions, 8 deletions
diff --git a/llvm/lib/Support/ErrorHandling.cpp b/llvm/lib/Support/ErrorHandling.cpp index 7e7ca9debe9..c4d5ea4c3db 100644 --- a/llvm/lib/Support/ErrorHandling.cpp +++ b/llvm/lib/Support/ErrorHandling.cpp @@ -18,8 +18,18 @@ #include "llvm/Support/raw_ostream.h" #include "llvm/System/Signals.h" #include "llvm/System/Threading.h" +#include "llvm/ADT/SmallVector.h" #include <cassert> #include <cstdlib> + +#if defined(HAVE_UNISTD_H) +# include <unistd.h> +#endif +#if defined(_MSC_VER) +# include <io.h> +# include <fcntl.h> +#endif + using namespace llvm; using namespace std; @@ -39,19 +49,27 @@ void llvm::remove_fatal_error_handler() { ErrorHandler = 0; } -void llvm::report_fatal_error(const char *reason) { - report_fatal_error(Twine(reason)); +void llvm::report_fatal_error(const char *Reason) { + report_fatal_error(Twine(Reason)); } -void llvm::report_fatal_error(const std::string &reason) { - report_fatal_error(Twine(reason)); +void llvm::report_fatal_error(const std::string &Reason) { + report_fatal_error(Twine(Reason)); } -void llvm::report_fatal_error(const Twine &reason) { - if (!ErrorHandler) { - errs() << "LLVM ERROR: " << reason << "\n"; +void llvm::report_fatal_error(const Twine &Reason) { + if (ErrorHandler) { + ErrorHandler(ErrorHandlerUserData, Reason.str()); } else { - ErrorHandler(ErrorHandlerUserData, reason.str()); + // Blast the result out to stderr. We don't try hard to make sure this + // succeeds (e.g. handling EINTR) and we can't use errs() here because + // raw ostreams can call report_fatal_error. + SmallVector<char, 64> Buffer; + StringRef ReasonStr = Reason.toStringRef(Buffer); + + ::write(2, "LLVM ERROR: ", 12); + ::write(2, ReasonStr.data(), ReasonStr.size()); + ::write(2, "\n", 1); } // If we reached here, we are failing ungracefully. Run the interrupt handlers |