//===-- driver.cpp - Clang GCC-Compatible Driver --------------------------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This is the entry point to the clang driver; it is a thin wrapper // for functionality in the Driver clang library. // //===----------------------------------------------------------------------===// #include "clang/Driver/Compilation.h" #include "clang/Driver/Driver.h" #include "clang/Driver/Option.h" #include "clang/Driver/Options.h" #include "llvm/ADT/SmallString.h" #include "llvm/ADT/OwningPtr.h" #include "llvm/Config/config.h" #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/PrettyStackTrace.h" #include "llvm/Support/raw_ostream.h" #include "llvm/System/Path.h" #include "llvm/System/Signals.h" 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); // 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(), Path.getDirname().c_str(), LLVM_HOSTTRIPLE, "a.out", Diags)); llvm::OwningPtr C(TheDriver->BuildCompilation(argc, argv)); // If there were errors building the compilation, quit now. if (Diags.getNumErrors()) return 1; if (!C.get()) return 0; int res = C->Execute(); llvm::llvm_shutdown(); return res; }