driver.cpp revision 4ad4b3ebbe5769143389dccfcfadb666a4ba5940
1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)//===-- driver.cpp - Clang GCC-Compatible Driver --------------------------===//
2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)//
3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)//                     The LLVM Compiler Infrastructure
4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)//
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// This file is distributed under the University of Illinois Open Source
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// License. See LICENSE.TXT for details.
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)//
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)//===----------------------------------------------------------------------===//
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)//
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// This is the entry point to the clang driver; it is a thin wrapper
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// for functionality in the Driver clang library.
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)//
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)//===----------------------------------------------------------------------===//
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "clang/Driver/Compilation.h"
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "clang/Driver/Driver.h"
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "clang/Driver/Option.h"
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "clang/Driver/Options.h"
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "clang/Frontend/TextDiagnosticPrinter.h"
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "llvm/ADT/OwningPtr.h"
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "llvm/Config/config.h"
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "llvm/Support/raw_ostream.h"
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "llvm/System/Path.h"
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "llvm/System/Signals.h"
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using namespace clang;
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using namespace clang::driver;
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)int main(int argc, const char **argv) {
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  llvm::sys::PrintStackTraceOnErrorSignal();
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  llvm::OwningPtr<DiagnosticClient>
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    DiagClient(new TextDiagnosticPrinter(llvm::errs()));
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  Diagnostic Diags(DiagClient.get());
37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // FIXME: We should use GetMainExecutable here, probably, but we may
39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // want to handle symbolic links slightly differently. The problem
40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // is that the path derived from this will influence search paths.
41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  llvm::sys::Path Path(argv[0]);
42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // FIXME: Use the triple of the host, not the triple that we were
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // compiled on.
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  llvm::OwningPtr<Driver> TheDriver(new Driver(Path.getBasename().c_str(),
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                               Path.getDirname().c_str(),
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                               LLVM_HOSTTRIPLE,
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                               Diags));
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  llvm::OwningPtr<Compilation> C(TheDriver->BuildCompilation(argc, argv));
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // If there were errors building the compilation, quit now.
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (Diags.getNumErrors())
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return 1;
55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return C->Execute();
57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)