diff options
Diffstat (limited to 'ELF/Error.cpp')
| -rw-r--r-- | ELF/Error.cpp | 48 |
1 files changed, 27 insertions, 21 deletions
diff --git a/ELF/Error.cpp b/ELF/Error.cpp index d9b41f9c599e..2c61b58dfed5 100644 --- a/ELF/Error.cpp +++ b/ELF/Error.cpp @@ -20,10 +20,10 @@ #include <unistd.h> #endif -using namespace lld::elf; using namespace llvm; -namespace lld { +using namespace lld; +using namespace lld::elf; uint64_t elf::ErrorCount; raw_ostream *elf::ErrorOS; @@ -33,6 +33,18 @@ StringRef elf::Argv0; // but outs() or errs() are not thread-safe. We protect them using a mutex. static std::mutex Mu; +// Prints "\n" or does nothing, depending on Msg contents of +// the previous call of this function. +static void newline(const Twine &Msg) { + // True if the previous error message contained "\n". + // We want to separate multi-line error messages with a newline. + static bool Flag; + + if (Flag) + *ErrorOS << "\n"; + Flag = (StringRef(Msg.str()).find('\n') != StringRef::npos); +} + static void print(StringRef S, raw_ostream::Colors C) { *ErrorOS << Argv0 + ": "; if (Config->ColorDiagnostics) { @@ -45,9 +57,16 @@ static void print(StringRef S, raw_ostream::Colors C) { } void elf::log(const Twine &Msg) { - std::lock_guard<std::mutex> Lock(Mu); - if (Config->Verbose) + if (Config->Verbose) { + std::lock_guard<std::mutex> Lock(Mu); outs() << Argv0 << ": " << Msg << "\n"; + } +} + +void elf::message(const Twine &Msg) { + std::lock_guard<std::mutex> Lock(Mu); + outs() << Msg << "\n"; + outs().flush(); } void elf::warn(const Twine &Msg) { @@ -55,13 +74,16 @@ void elf::warn(const Twine &Msg) { error(Msg); return; } + std::lock_guard<std::mutex> Lock(Mu); + newline(Msg); print("warning: ", raw_ostream::MAGENTA); *ErrorOS << Msg << "\n"; } void elf::error(const Twine &Msg) { std::lock_guard<std::mutex> Lock(Mu); + newline(Msg); if (Config->ErrorLimit == 0 || ErrorCount < Config->ErrorLimit) { print("error: ", raw_ostream::RED); @@ -77,10 +99,6 @@ void elf::error(const Twine &Msg) { ++ErrorCount; } -void elf::error(std::error_code EC, const Twine &Prefix) { - error(Prefix + ": " + EC.message()); -} - void elf::exitLld(int Val) { // Dealloc/destroy ManagedStatic variables before calling // _exit(). In a non-LTO build, this is a nop. In an LTO @@ -93,18 +111,6 @@ void elf::exitLld(int Val) { } void elf::fatal(const Twine &Msg) { - std::lock_guard<std::mutex> Lock(Mu); - print("error: ", raw_ostream::RED); - *ErrorOS << Msg << "\n"; + error(Msg); exitLld(1); } - -void elf::fatal(std::error_code EC, const Twine &Prefix) { - fatal(Prefix + ": " + EC.message()); -} - -void elf::fatal(Error &E, const Twine &Prefix) { - fatal(Prefix + ": " + llvm::toString(std::move(E))); -} - -} // namespace lld |
