driver.cpp revision af96def468042cfbed55a4cc12b1bb917ead4f33
13ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar//===-- driver.cpp - Clang GCC-Compatible Driver --------------------------===// 23ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// 33ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// The LLVM Compiler Infrastructure 43ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// 53ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// This file is distributed under the University of Illinois Open Source 63ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// License. See LICENSE.TXT for details. 73ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// 83ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar//===----------------------------------------------------------------------===// 93ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// 101eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar// This is the entry point to the clang driver; it is a thin wrapper 111eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar// for functionality in the Driver clang library. 123ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// 133ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar//===----------------------------------------------------------------------===// 143ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar 153ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar#include "clang/Driver/Compilation.h" 163ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar#include "clang/Driver/Driver.h" 172c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar#include "clang/Driver/Option.h" 182c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar#include "clang/Driver/Options.h" 192c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar 20510d73200ec48496a2b10703385fe99b51e31fa5Daniel Dunbar#include "llvm/ADT/SmallString.h" 213ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar#include "llvm/ADT/OwningPtr.h" 22dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar#include "llvm/Config/config.h" 238f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar#include "llvm/Support/ManagedStatic.h" 248f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar#include "llvm/Support/PrettyStackTrace.h" 254ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar#include "llvm/Support/raw_ostream.h" 26365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar#include "llvm/System/Path.h" 273ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar#include "llvm/System/Signals.h" 284ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbarusing namespace clang; 291b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbarusing namespace clang::driver; 303ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar 31510d73200ec48496a2b10703385fe99b51e31fa5Daniel Dunbarclass DriverDiagnosticPrinter : public DiagnosticClient { 32510d73200ec48496a2b10703385fe99b51e31fa5Daniel Dunbar std::string ProgName; 33510d73200ec48496a2b10703385fe99b51e31fa5Daniel Dunbar llvm::raw_ostream &OS; 34510d73200ec48496a2b10703385fe99b51e31fa5Daniel Dunbar 35510d73200ec48496a2b10703385fe99b51e31fa5Daniel Dunbarpublic: 36510d73200ec48496a2b10703385fe99b51e31fa5Daniel Dunbar DriverDiagnosticPrinter(const std::string _ProgName, 37510d73200ec48496a2b10703385fe99b51e31fa5Daniel Dunbar llvm::raw_ostream &_OS) 38510d73200ec48496a2b10703385fe99b51e31fa5Daniel Dunbar : ProgName(_ProgName), 39510d73200ec48496a2b10703385fe99b51e31fa5Daniel Dunbar OS(_OS) {} 40510d73200ec48496a2b10703385fe99b51e31fa5Daniel Dunbar 41510d73200ec48496a2b10703385fe99b51e31fa5Daniel Dunbar virtual void HandleDiagnostic(Diagnostic::Level DiagLevel, 42510d73200ec48496a2b10703385fe99b51e31fa5Daniel Dunbar const DiagnosticInfo &Info); 43510d73200ec48496a2b10703385fe99b51e31fa5Daniel Dunbar}; 44510d73200ec48496a2b10703385fe99b51e31fa5Daniel Dunbar 45510d73200ec48496a2b10703385fe99b51e31fa5Daniel Dunbarvoid DriverDiagnosticPrinter::HandleDiagnostic(Diagnostic::Level Level, 46510d73200ec48496a2b10703385fe99b51e31fa5Daniel Dunbar const DiagnosticInfo &Info) { 47510d73200ec48496a2b10703385fe99b51e31fa5Daniel Dunbar OS << ProgName << ": "; 48510d73200ec48496a2b10703385fe99b51e31fa5Daniel Dunbar 49510d73200ec48496a2b10703385fe99b51e31fa5Daniel Dunbar switch (Level) { 50510d73200ec48496a2b10703385fe99b51e31fa5Daniel Dunbar case Diagnostic::Ignored: assert(0 && "Invalid diagnostic type"); 51510d73200ec48496a2b10703385fe99b51e31fa5Daniel Dunbar case Diagnostic::Note: OS << "note: "; break; 52510d73200ec48496a2b10703385fe99b51e31fa5Daniel Dunbar case Diagnostic::Warning: OS << "warning: "; break; 53510d73200ec48496a2b10703385fe99b51e31fa5Daniel Dunbar case Diagnostic::Error: OS << "error: "; break; 54510d73200ec48496a2b10703385fe99b51e31fa5Daniel Dunbar case Diagnostic::Fatal: OS << "fatal error: "; break; 55510d73200ec48496a2b10703385fe99b51e31fa5Daniel Dunbar } 56510d73200ec48496a2b10703385fe99b51e31fa5Daniel Dunbar 57510d73200ec48496a2b10703385fe99b51e31fa5Daniel Dunbar llvm::SmallString<100> OutStr; 58510d73200ec48496a2b10703385fe99b51e31fa5Daniel Dunbar Info.FormatDiagnostic(OutStr); 59510d73200ec48496a2b10703385fe99b51e31fa5Daniel Dunbar OS.write(OutStr.begin(), OutStr.size()); 60510d73200ec48496a2b10703385fe99b51e31fa5Daniel Dunbar OS << '\n'; 61510d73200ec48496a2b10703385fe99b51e31fa5Daniel Dunbar} 62510d73200ec48496a2b10703385fe99b51e31fa5Daniel Dunbar 63734932c7dc77a16b15d466588e10d76bcd6d13c7Daniel Dunbarllvm::sys::Path GetExecutablePath(const char *Argv0) { 64734932c7dc77a16b15d466588e10d76bcd6d13c7Daniel Dunbar // This just needs to be some symbol in the binary; C++ doesn't 65734932c7dc77a16b15d466588e10d76bcd6d13c7Daniel Dunbar // allow taking the address of ::main however. 66734932c7dc77a16b15d466588e10d76bcd6d13c7Daniel Dunbar void *P = (void*) (intptr_t) GetExecutablePath; 67734932c7dc77a16b15d466588e10d76bcd6d13c7Daniel Dunbar return llvm::sys::Path::GetMainExecutable(Argv0, P); 68734932c7dc77a16b15d466588e10d76bcd6d13c7Daniel Dunbar} 69734932c7dc77a16b15d466588e10d76bcd6d13c7Daniel Dunbar 703ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbarint main(int argc, const char **argv) { 713ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar llvm::sys::PrintStackTraceOnErrorSignal(); 728f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar llvm::PrettyStackTraceProgram X(argc, argv); 733ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar 74734932c7dc77a16b15d466588e10d76bcd6d13c7Daniel Dunbar llvm::sys::Path Path = GetExecutablePath(argv[0]); 75510d73200ec48496a2b10703385fe99b51e31fa5Daniel Dunbar llvm::OwningPtr<DiagnosticClient> 76510d73200ec48496a2b10703385fe99b51e31fa5Daniel Dunbar DiagClient(new DriverDiagnosticPrinter(Path.getBasename(), llvm::errs())); 77510d73200ec48496a2b10703385fe99b51e31fa5Daniel Dunbar 78510d73200ec48496a2b10703385fe99b51e31fa5Daniel Dunbar Diagnostic Diags(DiagClient.get()); 79510d73200ec48496a2b10703385fe99b51e31fa5Daniel Dunbar 80dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar // FIXME: Use the triple of the host, not the triple that we were 81dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar // compiled on. 82365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar llvm::OwningPtr<Driver> TheDriver(new Driver(Path.getBasename().c_str(), 83dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar Path.getDirname().c_str(), 844ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar LLVM_HOSTTRIPLE, 85f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar "a.out", 864ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar Diags)); 874ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar 883ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar llvm::OwningPtr<Compilation> C(TheDriver->BuildCompilation(argc, argv)); 893ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar 90af96def468042cfbed55a4cc12b1bb917ead4f33Daniel Dunbar int Res = 0; 91af96def468042cfbed55a4cc12b1bb917ead4f33Daniel Dunbar if (C.get()) 92af96def468042cfbed55a4cc12b1bb917ead4f33Daniel Dunbar Res = C->Execute(); 938f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar 948f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar llvm::llvm_shutdown(); 958f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar 96af96def468042cfbed55a4cc12b1bb917ead4f33Daniel Dunbar return Res; 973ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar} 98