From 510d73200ec48496a2b10703385fe99b51e31fa5 Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Wed, 18 Mar 2009 02:11:26 +0000 Subject: [PATCH] Driver: Use custom diag printer to drop dependency on libFrontend and libLex. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67155 91177308-0d34-0410-b5e6-96231b3b80d8 --- tools/driver/Makefile | 5 +---- tools/driver/driver.cpp | 45 ++++++++++++++++++++++++++++++++++------- 2 files changed, 39 insertions(+), 11 deletions(-) diff --git a/tools/driver/Makefile b/tools/driver/Makefile index 0ba65e516b..9ad719fa07 100644 --- a/tools/driver/Makefile +++ b/tools/driver/Makefile @@ -15,10 +15,7 @@ CXXFLAGS = -fno-rtti # FIXME: It is unfortunate we need to pull in the bitcode reader and # writer just to get the serializer stuff used by clangBasic. LINK_COMPONENTS := system support bitreader bitwriter - -# FIXME: We shouldn't need clangLex.a here; we do because the -# TextDiagnosticPrinter is pulling it in. :( -USEDLIBS = clangDriver.a clangFrontend.a clangLex.a clangBasic.a +USEDLIBS = clangDriver.a clangBasic.a # This tool has no plugins, optimize startup time. TOOL_NO_EXPORTS = 1 diff --git a/tools/driver/driver.cpp b/tools/driver/driver.cpp index 0724fbd08c..fac4403251 100644 --- a/tools/driver/driver.cpp +++ b/tools/driver/driver.cpp @@ -17,8 +17,7 @@ #include "clang/Driver/Option.h" #include "clang/Driver/Options.h" -#include "clang/Frontend/TextDiagnosticPrinter.h" - +#include "llvm/ADT/SmallString.h" #include "llvm/ADT/OwningPtr.h" #include "llvm/Config/config.h" #include "llvm/Support/ManagedStatic.h" @@ -29,20 +28,52 @@ using namespace clang; using namespace clang::driver; +class DriverDiagnosticPrinter : public DiagnosticClient { + std::string ProgName; + llvm::raw_ostream &OS; + +public: + DriverDiagnosticPrinter(const std::string _ProgName, + llvm::raw_ostream &_OS) + : ProgName(_ProgName), + OS(_OS) {} + + virtual void HandleDiagnostic(Diagnostic::Level DiagLevel, + const DiagnosticInfo &Info); +}; + +void DriverDiagnosticPrinter::HandleDiagnostic(Diagnostic::Level Level, + const DiagnosticInfo &Info) { + OS << ProgName << ": "; + + switch (Level) { + case Diagnostic::Ignored: assert(0 && "Invalid diagnostic type"); + case Diagnostic::Note: OS << "note: "; break; + case Diagnostic::Warning: OS << "warning: "; break; + case Diagnostic::Error: OS << "error: "; break; + case Diagnostic::Fatal: OS << "fatal error: "; break; + } + + llvm::SmallString<100> OutStr; + Info.FormatDiagnostic(OutStr); + OS.write(OutStr.begin(), OutStr.size()); + OS << '\n'; +} + int main(int argc, const char **argv) { llvm::sys::PrintStackTraceOnErrorSignal(); llvm::PrettyStackTraceProgram X(argc, argv); - llvm::OwningPtr - DiagClient(new TextDiagnosticPrinter(llvm::errs())); - - Diagnostic Diags(DiagClient.get()); - // FIXME: We should use GetMainExecutable here, probably, but we may // want to handle symbolic links slightly differently. The problem // is that the path derived from this will influence search paths. llvm::sys::Path Path(argv[0]); + llvm::OwningPtr + DiagClient(new DriverDiagnosticPrinter(Path.getBasename(), llvm::errs())); + + Diagnostic Diags(DiagClient.get()); + // FIXME: Use the triple of the host, not the triple that we were // compiled on. llvm::OwningPtr TheDriver(new Driver(Path.getBasename().c_str(), -- 2.40.0