ExecuteCompilerInvocation.cpp revision 08b86531ade68727c56918f162816075b87c864a
18eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar//===--- ExecuteCompilerInvocation.cpp ------------------------------------===//
28eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar//
38eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar//                     The LLVM Compiler Infrastructure
48eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar//
58eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar// This file is distributed under the University of Illinois Open Source
68eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar// License. See LICENSE.TXT for details.
78eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar//
88eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar//===----------------------------------------------------------------------===//
98eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar//
108eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar// This file holds ExecuteCompilerInvocation(). It is split into its own file to
118eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar// minimize the impact of pulling in essentially everything else in Clang.
128eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar//
138eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar//===----------------------------------------------------------------------===//
148eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar
151b7255de78c99ef2b8a06bb5261a3c776ac1db36Peter Collingbourne#include "clang/FrontendTool/Utils.h"
1643dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis#include "clang/StaticAnalyzer/Frontend/FrontendActions.h"
17f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth#include "clang/ARCMigrate/ARCMTActions.h"
188eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar#include "clang/CodeGen/CodeGenAction.h"
198eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar#include "clang/Driver/CC1Options.h"
208eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar#include "clang/Driver/OptTable.h"
218eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar#include "clang/Frontend/CompilerInvocation.h"
228eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar#include "clang/Frontend/CompilerInstance.h"
238eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar#include "clang/Frontend/FrontendActions.h"
248eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar#include "clang/Frontend/FrontendDiagnostic.h"
258eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar#include "clang/Frontend/FrontendPluginRegistry.h"
268eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar#include "clang/Rewrite/FrontendActions.h"
278eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar#include "llvm/Support/ErrorHandling.h"
2803013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/DynamicLibrary.h"
298eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbarusing namespace clang;
308eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar
318eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbarstatic FrontendAction *CreateFrontendBaseAction(CompilerInstance &CI) {
328eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  using namespace clang::frontend;
338eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar
348eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  switch (CI.getFrontendOpts().ProgramAction) {
358eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  default:
368eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    llvm_unreachable("Invalid program action!");
378eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar
388eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case ASTDump:                return new ASTDumpAction();
39f35142413974e9dfe2c5f202084db4bd1c2073e9John McCall  case ASTDumpXML:             return new ASTDumpXMLAction();
408eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case ASTPrint:               return new ASTPrintAction();
418eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case ASTView:                return new ASTViewAction();
42e55fd871b0cf3e4ebc708cf46831908d74eab40aSebastian Redl  case CreateModule:           return 0;
438eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case DumpRawTokens:          return new DumpRawTokensAction();
448eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case DumpTokens:             return new DumpTokensAction();
458eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case EmitAssembly:           return new EmitAssemblyAction();
468eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case EmitBC:                 return new EmitBCAction();
478eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case EmitHTML:               return new HTMLPrintAction();
488eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case EmitLLVM:               return new EmitLLVMAction();
498eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case EmitLLVMOnly:           return new EmitLLVMOnlyAction();
508eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case EmitCodeGenOnly:        return new EmitCodeGenOnlyAction();
518eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case EmitObj:                return new EmitObjAction();
528eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case FixIt:                  return new FixItAction();
538eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case GeneratePCH:            return new GeneratePCHAction();
548eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case GeneratePTH:            return new GeneratePTHAction();
558eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case InitOnly:               return new InitOnlyAction();
568eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case ParseSyntaxOnly:        return new SyntaxOnlyAction();
578eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar
588eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case PluginAction: {
598eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    for (FrontendPluginRegistry::iterator it =
608eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar           FrontendPluginRegistry::begin(), ie = FrontendPluginRegistry::end();
618eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar         it != ie; ++it) {
628eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar      if (it->getName() == CI.getFrontendOpts().ActionName) {
638eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar        llvm::OwningPtr<PluginASTAction> P(it->instantiate());
648eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar        if (!P->ParseArgs(CI, CI.getFrontendOpts().PluginArgs))
658eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar          return 0;
668eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar        return P.take();
678eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar      }
688eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    }
698eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar
708eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    CI.getDiagnostics().Report(diag::err_fe_invalid_plugin_name)
718eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar      << CI.getFrontendOpts().ActionName;
728eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    return 0;
738eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  }
748eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar
758eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case PrintDeclContext:       return new DeclContextPrintAction();
768eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case PrintPreamble:          return new PrintPreambleAction();
778eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case PrintPreprocessedInput: return new PrintPreprocessedAction();
788eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case RewriteMacros:          return new RewriteMacrosAction();
798eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case RewriteObjC:            return new RewriteObjCAction();
808eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case RewriteTest:            return new RewriteTestAction();
819ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenek  case RunAnalysis:            return new ento::AnalysisAction();
828eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case RunPreprocessorOnly:    return new PreprocessOnlyAction();
838eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  }
848eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar}
858eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar
868eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbarstatic FrontendAction *CreateFrontendAction(CompilerInstance &CI) {
878eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  // Create the underlying action.
888eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  FrontendAction *Act = CreateFrontendBaseAction(CI);
898eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  if (!Act)
908eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    return 0;
918eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar
92f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth  // Potentially wrap the base FE action in an ARC Migrate Tool action.
93f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth  switch (CI.getFrontendOpts().ARCMTAction) {
94f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth  case FrontendOptions::ARCMT_None:
95f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth    break;
96f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth  case FrontendOptions::ARCMT_Check:
97f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth    Act = new arcmt::CheckAction(Act);
98f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth    break;
99f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth  case FrontendOptions::ARCMT_Modify:
10069325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis    Act = new arcmt::ModifyAction(Act);
10169325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis    break;
10269325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis  case FrontendOptions::ARCMT_Migrate:
1037ee2049278b98d42709380054eb83f4952af1200Argyrios Kyrtzidis    Act = new arcmt::MigrateAction(Act,
1047ee2049278b98d42709380054eb83f4952af1200Argyrios Kyrtzidis                                   CI.getFrontendOpts().ARCMTMigrateDir,
1057ee2049278b98d42709380054eb83f4952af1200Argyrios Kyrtzidis                                   CI.getFrontendOpts().ARCMTMigrateReportOut,
1067ee2049278b98d42709380054eb83f4952af1200Argyrios Kyrtzidis                                CI.getFrontendOpts().ARCMTMigrateEmitARCErrors);
107f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth    break;
108f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth  }
109f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth
1108eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  // If there are any AST files to merge, create a frontend action
1118eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  // adaptor to perform the merge.
1128eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  if (!CI.getFrontendOpts().ASTMergeFiles.empty())
1138eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    Act = new ASTMergeAction(Act, &CI.getFrontendOpts().ASTMergeFiles[0],
1148eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar                             CI.getFrontendOpts().ASTMergeFiles.size());
1158eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar
1168eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  return Act;
1178eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar}
1188eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar
1198eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbarbool clang::ExecuteCompilerInvocation(CompilerInstance *Clang) {
1208eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  // Honor -help.
1218eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  if (Clang->getFrontendOpts().ShowHelp) {
1228eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    llvm::OwningPtr<driver::OptTable> Opts(driver::createCC1OptTable());
1238eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    Opts->PrintHelp(llvm::outs(), "clang -cc1",
1248eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar                    "LLVM 'Clang' Compiler: http://clang.llvm.org");
1258eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    return 0;
1268eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  }
1278eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar
1288eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  // Honor -version.
1298eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  //
1308eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  // FIXME: Use a better -version message?
1318eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  if (Clang->getFrontendOpts().ShowVersion) {
1328eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    llvm::cl::PrintVersionMessage();
1338eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    return 0;
1348eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  }
1358eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar
1368eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  // Honor -mllvm.
1378eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  //
1388eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  // FIXME: Remove this, one day.
1398eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  if (!Clang->getFrontendOpts().LLVMArgs.empty()) {
1408eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    unsigned NumArgs = Clang->getFrontendOpts().LLVMArgs.size();
1418eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    const char **Args = new const char*[NumArgs + 2];
1428eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    Args[0] = "clang (LLVM option parsing)";
1438eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    for (unsigned i = 0; i != NumArgs; ++i)
1448eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar      Args[i + 1] = Clang->getFrontendOpts().LLVMArgs[i].c_str();
1458eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    Args[NumArgs + 1] = 0;
1468eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    llvm::cl::ParseCommandLineOptions(NumArgs + 1, const_cast<char **>(Args));
1478eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  }
1488eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar
1498eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  // Load any requested plugins.
1508eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  for (unsigned i = 0,
1518eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar         e = Clang->getFrontendOpts().Plugins.size(); i != e; ++i) {
1528eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    const std::string &Path = Clang->getFrontendOpts().Plugins[i];
1538eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    std::string Error;
1548eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    if (llvm::sys::DynamicLibrary::LoadLibraryPermanently(Path.c_str(), &Error))
1558eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar      Clang->getDiagnostics().Report(diag::err_fe_unable_to_load_plugin)
1568eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar        << Path << Error;
1578eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  }
1588eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar
15908b86531ade68727c56918f162816075b87c864aJordy Rose  // Honor -analyzer-checker-help.
16008b86531ade68727c56918f162816075b87c864aJordy Rose  // This should happen AFTER plugins have been loaded!
16108b86531ade68727c56918f162816075b87c864aJordy Rose  if (Clang->getAnalyzerOpts().ShowCheckerHelp) {
16208b86531ade68727c56918f162816075b87c864aJordy Rose    ento::printCheckerHelp(llvm::outs(), Clang->getFrontendOpts().Plugins);
16308b86531ade68727c56918f162816075b87c864aJordy Rose    return 0;
16408b86531ade68727c56918f162816075b87c864aJordy Rose  }
16508b86531ade68727c56918f162816075b87c864aJordy Rose
1668eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  // If there were errors in processing arguments, don't do anything else.
1678eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  bool Success = false;
168e8f0ba75a39b2fa2d34d14e8401ae96f43e1fc14Argyrios Kyrtzidis  if (!Clang->getDiagnostics().hasErrorOccurred()) {
1698eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    // Create and execute the frontend action.
1708eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    llvm::OwningPtr<FrontendAction> Act(CreateFrontendAction(*Clang));
17172e3a0a2a54cdc9cf1c5324c348f1c10f205b2c0Ted Kremenek    if (Act) {
1728eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar      Success = Clang->ExecuteAction(*Act);
17372e3a0a2a54cdc9cf1c5324c348f1c10f205b2c0Ted Kremenek      if (Clang->getFrontendOpts().DisableFree)
17472e3a0a2a54cdc9cf1c5324c348f1c10f205b2c0Ted Kremenek        Act.take();
17572e3a0a2a54cdc9cf1c5324c348f1c10f205b2c0Ted Kremenek    }
1768eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  }
1778eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar
1788eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  return Success;
1798eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar}
180