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