driver.cpp revision 8f25c79e59d88df41c5a3cabba1c58035d384a6e
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 204ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar#include "clang/Frontend/TextDiagnosticPrinter.h" 214ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar 223ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar#include "llvm/ADT/OwningPtr.h" 23dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar#include "llvm/Config/config.h" 248f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar#include "llvm/Support/ManagedStatic.h" 258f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar#include "llvm/Support/PrettyStackTrace.h" 264ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar#include "llvm/Support/raw_ostream.h" 27365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar#include "llvm/System/Path.h" 283ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar#include "llvm/System/Signals.h" 294ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbarusing namespace clang; 301b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbarusing namespace clang::driver; 313ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar 323ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbarint main(int argc, const char **argv) { 333ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar llvm::sys::PrintStackTraceOnErrorSignal(); 348f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar llvm::PrettyStackTraceProgram X(argc, argv); 353ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar 364ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar llvm::OwningPtr<DiagnosticClient> 374ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar DiagClient(new TextDiagnosticPrinter(llvm::errs())); 384ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar 394ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar Diagnostic Diags(DiagClient.get()); 404ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar 41365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar // FIXME: We should use GetMainExecutable here, probably, but we may 42365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar // want to handle symbolic links slightly differently. The problem 43365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar // is that the path derived from this will influence search paths. 44365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar llvm::sys::Path Path(argv[0]); 45365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar 46dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar // FIXME: Use the triple of the host, not the triple that we were 47dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar // compiled on. 48365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar llvm::OwningPtr<Driver> TheDriver(new Driver(Path.getBasename().c_str(), 49dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar Path.getDirname().c_str(), 504ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar LLVM_HOSTTRIPLE, 51f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar "a.out", 524ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar Diags)); 534ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar 543ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar llvm::OwningPtr<Compilation> C(TheDriver->BuildCompilation(argc, argv)); 553ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar 564ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar // If there were errors building the compilation, quit now. 574ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar if (Diags.getNumErrors()) 584ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar return 1; 59ab835430b4f758dd49903251c7c7f21b95933c89Daniel Dunbar if (!C.get()) 60ab835430b4f758dd49903251c7c7f21b95933c89Daniel Dunbar return 0; 614ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar 628f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar int res = C->Execute(); 638f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar 648f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar llvm::llvm_shutdown(); 658f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar 668f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar return res; 673ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar} 68