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)