141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar//===-- cc1_main.cpp - Clang CC1 Compiler Frontend ------------------------===// 2217acbfa3524d5805fda7900b26c1e779443588dDaniel Dunbar// 3217acbfa3524d5805fda7900b26c1e779443588dDaniel Dunbar// The LLVM Compiler Infrastructure 4217acbfa3524d5805fda7900b26c1e779443588dDaniel Dunbar// 5217acbfa3524d5805fda7900b26c1e779443588dDaniel Dunbar// This file is distributed under the University of Illinois Open Source 6217acbfa3524d5805fda7900b26c1e779443588dDaniel Dunbar// License. See LICENSE.TXT for details. 7217acbfa3524d5805fda7900b26c1e779443588dDaniel Dunbar// 8217acbfa3524d5805fda7900b26c1e779443588dDaniel Dunbar//===----------------------------------------------------------------------===// 9217acbfa3524d5805fda7900b26c1e779443588dDaniel Dunbar// 102108577809989bd5c591128b48aac6715b3f61b6Daniel Dunbar// This is the entry point to the clang -cc1 functionality, which implements the 112108577809989bd5c591128b48aac6715b3f61b6Daniel Dunbar// core compiler functionality along with a number of additional tools for 122108577809989bd5c591128b48aac6715b3f61b6Daniel Dunbar// demonstration and testing purposes. 13217acbfa3524d5805fda7900b26c1e779443588dDaniel Dunbar// 14217acbfa3524d5805fda7900b26c1e779443588dDaniel Dunbar//===----------------------------------------------------------------------===// 15217acbfa3524d5805fda7900b26c1e779443588dDaniel Dunbar 16b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner#include "llvm/Option/Arg.h" 172108577809989bd5c591128b48aac6715b3f61b6Daniel Dunbar#include "clang/Driver/DriverDiagnostic.h" 18f59edb96b2d0bfe612b732f19519ab84bb995bd4Chandler Carruth#include "clang/Driver/Options.h" 192108577809989bd5c591128b48aac6715b3f61b6Daniel Dunbar#include "clang/Frontend/CompilerInstance.h" 202108577809989bd5c591128b48aac6715b3f61b6Daniel Dunbar#include "clang/Frontend/CompilerInvocation.h" 212108577809989bd5c591128b48aac6715b3f61b6Daniel Dunbar#include "clang/Frontend/FrontendDiagnostic.h" 222108577809989bd5c591128b48aac6715b3f61b6Daniel Dunbar#include "clang/Frontend/TextDiagnosticBuffer.h" 232108577809989bd5c591128b48aac6715b3f61b6Daniel Dunbar#include "clang/Frontend/TextDiagnosticPrinter.h" 24651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "clang/Frontend/Utils.h" 251b7255de78c99ef2b8a06bb5261a3c776ac1db36Peter Collingbourne#include "clang/FrontendTool/Utils.h" 2695dd5583e3900443a1d7970d557d8c54aa320601Douglas Gregor#include "llvm/ADT/Statistic.h" 27f59edb96b2d0bfe612b732f19519ab84bb995bd4Chandler Carruth#include "llvm/LinkAllPasses.h" 28b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner#include "llvm/Option/ArgList.h" 29b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner#include "llvm/Option/OptTable.h" 302108577809989bd5c591128b48aac6715b3f61b6Daniel Dunbar#include "llvm/Support/ErrorHandling.h" 312108577809989bd5c591128b48aac6715b3f61b6Daniel Dunbar#include "llvm/Support/ManagedStatic.h" 32b0afe833e41cac21ded36a4d98df502fa5b3d758Chad Rosier#include "llvm/Support/Signals.h" 33a6b4045dc462c03cd1e7cb9c3ec9dbfdb9c6ad62Evan Cheng#include "llvm/Support/TargetSelect.h" 3430bc7e8e560941f730fd94109e81ac600767b0abChris Lattner#include "llvm/Support/Timer.h" 35217acbfa3524d5805fda7900b26c1e779443588dDaniel Dunbar#include "llvm/Support/raw_ostream.h" 362108577809989bd5c591128b48aac6715b3f61b6Daniel Dunbar#include <cstdio> 372108577809989bd5c591128b48aac6715b3f61b6Daniel Dunbarusing namespace clang; 38b1e25a1bc03292dc538d336573e0be1490223171Reid Klecknerusing namespace llvm::opt; 392108577809989bd5c591128b48aac6715b3f61b6Daniel Dunbar 402108577809989bd5c591128b48aac6715b3f61b6Daniel Dunbar//===----------------------------------------------------------------------===// 412108577809989bd5c591128b48aac6715b3f61b6Daniel Dunbar// Main driver 422108577809989bd5c591128b48aac6715b3f61b6Daniel Dunbar//===----------------------------------------------------------------------===// 432108577809989bd5c591128b48aac6715b3f61b6Daniel Dunbar 449083628fec737679eb95abe8e2e5e23717a96e18Chad Rosierstatic void LLVMErrorHandler(void *UserData, const std::string &Message, 459083628fec737679eb95abe8e2e5e23717a96e18Chad Rosier bool GenCrashDiag) { 46d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie DiagnosticsEngine &Diags = *static_cast<DiagnosticsEngine*>(UserData); 472108577809989bd5c591128b48aac6715b3f61b6Daniel Dunbar 482108577809989bd5c591128b48aac6715b3f61b6Daniel Dunbar Diags.Report(diag::err_fe_error_backend) << Message; 492108577809989bd5c591128b48aac6715b3f61b6Daniel Dunbar 50b0afe833e41cac21ded36a4d98df502fa5b3d758Chad Rosier // Run the interrupt handlers to make sure any special cleanups get done, in 51b0afe833e41cac21ded36a4d98df502fa5b3d758Chad Rosier // particular that we remove files registered with RemoveFileOnSignal. 52b0afe833e41cac21ded36a4d98df502fa5b3d758Chad Rosier llvm::sys::RunInterruptHandlers(); 53b0afe833e41cac21ded36a4d98df502fa5b3d758Chad Rosier 545af8de8c7255ca4df52cbb0d5e0d28d67c53524cChad Rosier // We cannot recover from llvm errors. When reporting a fatal error, exit 559083628fec737679eb95abe8e2e5e23717a96e18Chad Rosier // with status 70 to generate crash diagnostics. For BSD systems this is 569083628fec737679eb95abe8e2e5e23717a96e18Chad Rosier // defined as an internal software error. Otherwise, exit with status 1. 579083628fec737679eb95abe8e2e5e23717a96e18Chad Rosier exit(GenCrashDiag ? 70 : 1); 582108577809989bd5c591128b48aac6715b3f61b6Daniel Dunbar} 592108577809989bd5c591128b48aac6715b3f61b6Daniel Dunbar 60651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#ifdef LINK_POLLY_INTO_TOOLS 61651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace polly { 62651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid initializePollyPasses(llvm::PassRegistry &Registry); 63651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 64651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif 65651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 662108577809989bd5c591128b48aac6715b3f61b6Daniel Dunbarint cc1_main(const char **ArgBegin, const char **ArgEnd, 672108577809989bd5c591128b48aac6715b3f61b6Daniel Dunbar const char *Argv0, void *MainAddr) { 68651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::unique_ptr<CompilerInstance> Clang(new CompilerInstance()); 69c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs()); 7042e9f8e4983d50f896ec716207817b9d96e7e79cDaniel Dunbar 712108577809989bd5c591128b48aac6715b3f61b6Daniel Dunbar // Initialize targets first, so that --version shows registered targets. 722108577809989bd5c591128b48aac6715b3f61b6Daniel Dunbar llvm::InitializeAllTargets(); 73d99d3e1c01874d3f07b9670ae1cfdc4bef895049Evan Cheng llvm::InitializeAllTargetMCs(); 742108577809989bd5c591128b48aac6715b3f61b6Daniel Dunbar llvm::InitializeAllAsmPrinters(); 7501ae93fde8497978c860c8b61d098cf22c0e5d3dChris Lattner llvm::InitializeAllAsmParsers(); 762108577809989bd5c591128b48aac6715b3f61b6Daniel Dunbar 77651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#ifdef LINK_POLLY_INTO_TOOLS 78651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::PassRegistry &Registry = *llvm::PassRegistry::getPassRegistry(); 79651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines polly::initializePollyPasses(Registry); 80651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif 81651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 822108577809989bd5c591128b48aac6715b3f61b6Daniel Dunbar // Buffer diagnostics from argument parsing so that we can output them using a 832108577809989bd5c591128b48aac6715b3f61b6Daniel Dunbar // well formed diagnostic object. 8402c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = new DiagnosticOptions(); 85bdbb004f38978da0c4a75af3294d1c7b5ff84af1Douglas Gregor TextDiagnosticBuffer *DiagsBuffer = new TextDiagnosticBuffer; 8602c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor DiagnosticsEngine Diags(DiagID, &*DiagOpts, DiagsBuffer); 878fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith bool Success; 888fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith Success = CompilerInvocation::CreateFromArgs(Clang->getInvocation(), 898fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith ArgBegin, ArgEnd, Diags); 901e69fe3a9f0a42b32a3000bda51677d51416564eDaniel Dunbar 911e69fe3a9f0a42b32a3000bda51677d51416564eDaniel Dunbar // Infer the builtin include path if unspecified. 9242444fb53cc8f3ee221d3dfe3e7f23d3f9adc1dbDaniel Dunbar if (Clang->getHeaderSearchOpts().UseBuiltinIncludes && 9342444fb53cc8f3ee221d3dfe3e7f23d3f9adc1dbDaniel Dunbar Clang->getHeaderSearchOpts().ResourceDir.empty()) 9442444fb53cc8f3ee221d3dfe3e7f23d3f9adc1dbDaniel Dunbar Clang->getHeaderSearchOpts().ResourceDir = 958b9adfea5e834eaee0f45d8cc7fb052d68df4a46Daniel Dunbar CompilerInvocation::GetResourcesPath(Argv0, MainAddr); 962108577809989bd5c591128b48aac6715b3f61b6Daniel Dunbar 97a6bf47f855fa205015e8904c3b80fafbf7bd896dDaniel Dunbar // Create the actual diagnostics engine. 98d47afb96a3f988e6d21a92fe4dfe875ab227c7c0Sean Silva Clang->createDiagnostics(); 99a6bf47f855fa205015e8904c3b80fafbf7bd896dDaniel Dunbar if (!Clang->hasDiagnostics()) 100a6bf47f855fa205015e8904c3b80fafbf7bd896dDaniel Dunbar return 1; 101a6bf47f855fa205015e8904c3b80fafbf7bd896dDaniel Dunbar 102a6bf47f855fa205015e8904c3b80fafbf7bd896dDaniel Dunbar // Set an error handler, so that any LLVM backend diagnostics go through our 103a6bf47f855fa205015e8904c3b80fafbf7bd896dDaniel Dunbar // error handler. 104a6bf47f855fa205015e8904c3b80fafbf7bd896dDaniel Dunbar llvm::install_fatal_error_handler(LLVMErrorHandler, 105a6bf47f855fa205015e8904c3b80fafbf7bd896dDaniel Dunbar static_cast<void*>(&Clang->getDiagnostics())); 106a6bf47f855fa205015e8904c3b80fafbf7bd896dDaniel Dunbar 107bdbb004f38978da0c4a75af3294d1c7b5ff84af1Douglas Gregor DiagsBuffer->FlushDiagnostics(Clang->getDiagnostics()); 108ada4fa7978dc91a5e615af2ec29e12e3c6973c7fArgyrios Kyrtzidis if (!Success) 109ada4fa7978dc91a5e615af2ec29e12e3c6973c7fArgyrios Kyrtzidis return 1; 110a6bf47f855fa205015e8904c3b80fafbf7bd896dDaniel Dunbar 1118eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar // Execute the frontend actions. 1128fdb6dee2da0dee97d64fe12eda46fb318414de9Dylan Noblesmith Success = ExecuteCompilerInvocation(Clang.get()); 11342444fb53cc8f3ee221d3dfe3e7f23d3f9adc1dbDaniel Dunbar 11430bc7e8e560941f730fd94109e81ac600767b0abChris Lattner // If any timers were active but haven't been destroyed yet, print their 11530bc7e8e560941f730fd94109e81ac600767b0abChris Lattner // results now. This happens in -disable-free mode. 11630bc7e8e560941f730fd94109e81ac600767b0abChris Lattner llvm::TimerGroup::printAll(llvm::errs()); 117f56a488a6bdfe56ca814f37d384afa67c67f9dd5Daniel Dunbar 118726578c22e9e33774435257664f8f6dc4cf8dfa9Dan Gohman // Our error handler depends on the Diagnostics object, which we're 119726578c22e9e33774435257664f8f6dc4cf8dfa9Dan Gohman // potentially about to delete. Uninstall the handler now so that any 120726578c22e9e33774435257664f8f6dc4cf8dfa9Dan Gohman // later errors use the default handling behavior instead. 121726578c22e9e33774435257664f8f6dc4cf8dfa9Dan Gohman llvm::remove_fatal_error_handler(); 122726578c22e9e33774435257664f8f6dc4cf8dfa9Dan Gohman 12342444fb53cc8f3ee221d3dfe3e7f23d3f9adc1dbDaniel Dunbar // When running with -disable-free, don't do any destruction or shutdown. 12442444fb53cc8f3ee221d3dfe3e7f23d3f9adc1dbDaniel Dunbar if (Clang->getFrontendOpts().DisableFree) { 12577d2c5f66aac32546c016f57143f2d0f399acbd1Benjamin Kramer if (llvm::AreStatisticsEnabled() || Clang->getFrontendOpts().ShowStats) 12695dd5583e3900443a1d7970d557d8c54aa320601Douglas Gregor llvm::PrintStatistics(); 127651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines BuryPointer(Clang.release()); 12842444fb53cc8f3ee221d3dfe3e7f23d3f9adc1dbDaniel Dunbar return !Success; 1292108577809989bd5c591128b48aac6715b3f61b6Daniel Dunbar } 1302108577809989bd5c591128b48aac6715b3f61b6Daniel Dunbar 1312108577809989bd5c591128b48aac6715b3f61b6Daniel Dunbar // Managed static deconstruction. Useful for making things like 1322108577809989bd5c591128b48aac6715b3f61b6Daniel Dunbar // -time-passes usable. 1332108577809989bd5c591128b48aac6715b3f61b6Daniel Dunbar llvm::llvm_shutdown(); 1342108577809989bd5c591128b48aac6715b3f61b6Daniel Dunbar 1350397af277e3bba16da1fd125ddba07415686b429Daniel Dunbar return !Success; 1362108577809989bd5c591128b48aac6715b3f61b6Daniel Dunbar} 137