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