summaryrefslogtreecommitdiff
path: root/lld/Common/ErrorHandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lld/Common/ErrorHandler.cpp')
-rw-r--r--lld/Common/ErrorHandler.cpp42
1 files changed, 23 insertions, 19 deletions
diff --git a/lld/Common/ErrorHandler.cpp b/lld/Common/ErrorHandler.cpp
index b91854c51cef..b6066b557cbf 100644
--- a/lld/Common/ErrorHandler.cpp
+++ b/lld/Common/ErrorHandler.cpp
@@ -26,7 +26,8 @@ using namespace llvm;
using namespace lld;
// The functions defined in this file can be called from multiple threads,
-// but outs() or errs() are not thread-safe. We protect them using a mutex.
+// but lld::outs() or lld::errs() are not thread-safe. We protect them using a
+// mutex.
static std::mutex mu;
// We want to separate multi-line messages with a newline. `sep` is "\n"
@@ -39,27 +40,30 @@ static StringRef getSeparator(const Twine &msg) {
return "";
}
+raw_ostream *lld::stdoutOS;
+raw_ostream *lld::stderrOS;
+
+raw_ostream &lld::outs() { return stdoutOS ? *stdoutOS : llvm::outs(); }
+raw_ostream &lld::errs() { return stderrOS ? *stderrOS : llvm::errs(); }
+
ErrorHandler &lld::errorHandler() {
static ErrorHandler handler;
return handler;
}
-void lld::enableColors(bool enable) {
- errorHandler().errorOS->enable_colors(enable);
-}
-
void lld::exitLld(int val) {
// Delete any temporary file, while keeping the memory mapping open.
if (errorHandler().outputBuffer)
errorHandler().outputBuffer->discard();
- // Dealloc/destroy ManagedStatic variables before calling
- // _exit(). In a non-LTO build, this is a nop. In an LTO
- // build allows us to get the output of -time-passes.
+ // Dealloc/destroy ManagedStatic variables before calling _exit().
+ // In an LTO build, allows us to get the output of -time-passes.
+ // Ensures that the thread pool for the parallel algorithms is stopped to
+ // avoid intermittent crashes on Windows when exiting.
llvm_shutdown();
- outs().flush();
- errs().flush();
+ lld::outs().flush();
+ lld::errs().flush();
_exit(val);
}
@@ -149,13 +153,13 @@ void ErrorHandler::log(const Twine &msg) {
if (!verbose)
return;
std::lock_guard<std::mutex> lock(mu);
- *errorOS << logName << ": " << msg << "\n";
+ lld::errs() << logName << ": " << msg << "\n";
}
void ErrorHandler::message(const Twine &msg) {
std::lock_guard<std::mutex> lock(mu);
- outs() << msg << "\n";
- outs().flush();
+ lld::outs() << msg << "\n";
+ lld::outs().flush();
}
void ErrorHandler::warn(const Twine &msg) {
@@ -165,8 +169,8 @@ void ErrorHandler::warn(const Twine &msg) {
}
std::lock_guard<std::mutex> lock(mu);
- *errorOS << sep << getLocation(msg) << ": " << Colors::MAGENTA
- << "warning: " << Colors::RESET << msg << "\n";
+ lld::errs() << sep << getLocation(msg) << ": " << Colors::MAGENTA
+ << "warning: " << Colors::RESET << msg << "\n";
sep = getSeparator(msg);
}
@@ -190,11 +194,11 @@ void ErrorHandler::error(const Twine &msg) {
std::lock_guard<std::mutex> lock(mu);
if (errorLimit == 0 || errorCount < errorLimit) {
- *errorOS << sep << getLocation(msg) << ": " << Colors::RED
- << "error: " << Colors::RESET << msg << "\n";
+ lld::errs() << sep << getLocation(msg) << ": " << Colors::RED
+ << "error: " << Colors::RESET << msg << "\n";
} else if (errorCount == errorLimit) {
- *errorOS << sep << getLocation(msg) << ": " << Colors::RED
- << "error: " << Colors::RESET << errorLimitExceededMsg << "\n";
+ lld::errs() << sep << getLocation(msg) << ": " << Colors::RED
+ << "error: " << Colors::RESET << errorLimitExceededMsg << "\n";
if (exitEarly)
exitLld(1);
}