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"
16f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth#include "clang/ARCMigrate/ARCMTActions.h"
178eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar#include "clang/CodeGen/CodeGenAction.h"
18bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy#include "clang/Driver/Options.h"
198eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar#include "clang/Frontend/CompilerInstance.h"
2055fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Frontend/CompilerInvocation.h"
218eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar#include "clang/Frontend/FrontendActions.h"
228eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar#include "clang/Frontend/FrontendDiagnostic.h"
238eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar#include "clang/Frontend/FrontendPluginRegistry.h"
24305c613af6cfc40e519c75d9d2c84c6fa9a841c0Ted Kremenek#include "clang/Rewrite/Frontend/FrontendActions.h"
2555fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/StaticAnalyzer/Frontend/FrontendActions.h"
26b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner#include "llvm/Option/OptTable.h"
27b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner#include "llvm/Option/Option.h"
2803013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/DynamicLibrary.h"
2955fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/Support/ErrorHandling.h"
308eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbarusing namespace clang;
31b1e25a1bc03292dc538d336573e0be1490223171Reid Klecknerusing namespace llvm::opt;
328eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar
338eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbarstatic FrontendAction *CreateFrontendBaseAction(CompilerInstance &CI) {
348eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  using namespace clang::frontend;
35fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky  StringRef Action("unknown");
368eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar
378eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  switch (CI.getFrontendOpts().ProgramAction) {
38171af64ef10ae816ed2a4f15f5d17aca1d71769fAlexander Kornienko  case ASTDeclList:            return new ASTDeclListAction();
398eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case ASTDump:                return new ASTDumpAction();
40f35142413974e9dfe2c5f202084db4bd1c2073e9John McCall  case ASTDumpXML:             return new ASTDumpXMLAction();
418eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case ASTPrint:               return new ASTPrintAction();
428eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case ASTView:                return new ASTViewAction();
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();
47fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#ifdef CLANG_ENABLE_REWRITER
488eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case EmitHTML:               return new HTMLPrintAction();
49fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#else
50fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky  case EmitHTML:               Action = "EmitHTML"; break;
51fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#endif
528eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case EmitLLVM:               return new EmitLLVMAction();
538eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case EmitLLVMOnly:           return new EmitLLVMOnlyAction();
548eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case EmitCodeGenOnly:        return new EmitCodeGenOnlyAction();
558eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case EmitObj:                return new EmitObjAction();
56fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#ifdef CLANG_ENABLE_REWRITER
578eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case FixIt:                  return new FixItAction();
58fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#else
59fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky  case FixIt:                  Action = "FixIt"; break;
60fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#endif
616649014b792f8a4b1bc1e8be8f844a72220af508Douglas Gregor  case GenerateModule:         return new GenerateModuleAction;
626649014b792f8a4b1bc1e8be8f844a72220af508Douglas Gregor  case GeneratePCH:            return new GeneratePCHAction;
638eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case GeneratePTH:            return new GeneratePTHAction();
648eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case InitOnly:               return new InitOnlyAction();
658eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case ParseSyntaxOnly:        return new SyntaxOnlyAction();
66c544ba09695e300f31355af342258bd57619e737Douglas Gregor  case ModuleFileInfo:         return new DumpModuleInfoAction();
678eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar
688eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case PluginAction: {
698eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    for (FrontendPluginRegistry::iterator it =
708eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar           FrontendPluginRegistry::begin(), ie = FrontendPluginRegistry::end();
718eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar         it != ie; ++it) {
728eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar      if (it->getName() == CI.getFrontendOpts().ActionName) {
736f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith        OwningPtr<PluginASTAction> P(it->instantiate());
748eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar        if (!P->ParseArgs(CI, CI.getFrontendOpts().PluginArgs))
758eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar          return 0;
768eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar        return P.take();
778eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar      }
788eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    }
798eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar
808eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    CI.getDiagnostics().Report(diag::err_fe_invalid_plugin_name)
818eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar      << CI.getFrontendOpts().ActionName;
828eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    return 0;
838eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  }
848eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar
858eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case PrintDeclContext:       return new DeclContextPrintAction();
868eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case PrintPreamble:          return new PrintPreambleAction();
87f1492f970c7c6eb85dc18f13fb864b185bed1d23David Blaikie  case PrintPreprocessedInput: {
88fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky    if (CI.getPreprocessorOutputOpts().RewriteIncludes) {
89fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#ifdef CLANG_ENABLE_REWRITER
90f1492f970c7c6eb85dc18f13fb864b185bed1d23David Blaikie      return new RewriteIncludesAction();
91fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#else
92fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky      Action = "RewriteIncludesAction";
93fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky      break;
94fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#endif
95fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky    }
96f1492f970c7c6eb85dc18f13fb864b185bed1d23David Blaikie    return new PrintPreprocessedAction();
97f1492f970c7c6eb85dc18f13fb864b185bed1d23David Blaikie  }
98f1492f970c7c6eb85dc18f13fb864b185bed1d23David Blaikie
99fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#ifdef CLANG_ENABLE_REWRITER
1008eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case RewriteMacros:          return new RewriteMacrosAction();
1018eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case RewriteObjC:            return new RewriteObjCAction();
1028eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case RewriteTest:            return new RewriteTestAction();
103fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#else
104fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky  case RewriteMacros:          Action = "RewriteMacros"; break;
105fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky  case RewriteObjC:            Action = "RewriteObjC"; break;
106fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky  case RewriteTest:            Action = "RewriteTest"; break;
107fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#endif
108fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#ifdef CLANG_ENABLE_ARCMT
10930660a898545416f0fea2d717f16f75640001e38Ted Kremenek  case MigrateSource:          return new arcmt::MigrateSourceAction();
110fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#else
111fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky  case MigrateSource:          Action = "MigrateSource"; break;
112fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#endif
113fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#ifdef CLANG_ENABLE_STATIC_ANALYZER
114fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky  case RunAnalysis:            return new ento::AnalysisAction();
115fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#else
116fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky  case RunAnalysis:            Action = "RunAnalysis"; break;
117fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#endif
1188eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case RunPreprocessorOnly:    return new PreprocessOnlyAction();
1198eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  }
120fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky
121fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#if !defined(CLANG_ENABLE_ARCMT) || !defined(CLANG_ENABLE_STATIC_ANALYZER) \
122fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky  || !defined(CLANG_ENABLE_REWRITER)
123fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky  CI.getDiagnostics().Report(diag::err_fe_action_not_available) << Action;
124fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky  return 0;
125fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#else
126561d3abc881033776ece385a01a510e1cbc1fa92David Blaikie  llvm_unreachable("Invalid program action!");
127fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#endif
1288eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar}
1298eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar
1308eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbarstatic FrontendAction *CreateFrontendAction(CompilerInstance &CI) {
1318eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  // Create the underlying action.
1328eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  FrontendAction *Act = CreateFrontendBaseAction(CI);
1338eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  if (!Act)
1348eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    return 0;
1358eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar
136b3ca2637a9a3aeac5c7103eb4d612528680e7e20Argyrios Kyrtzidis  const FrontendOptions &FEOpts = CI.getFrontendOpts();
137b3ca2637a9a3aeac5c7103eb4d612528680e7e20Argyrios Kyrtzidis
138fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#ifdef CLANG_ENABLE_REWRITER
139b3ca2637a9a3aeac5c7103eb4d612528680e7e20Argyrios Kyrtzidis  if (FEOpts.FixAndRecompile) {
14061d679ab2831b161c857cf3f974312fbd4ef1efdArgyrios Kyrtzidis    Act = new FixItRecompile(Act);
14161d679ab2831b161c857cf3f974312fbd4ef1efdArgyrios Kyrtzidis  }
142fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#endif
14361d679ab2831b161c857cf3f974312fbd4ef1efdArgyrios Kyrtzidis
144fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#ifdef CLANG_ENABLE_ARCMT
145f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth  // Potentially wrap the base FE action in an ARC Migrate Tool action.
146b3ca2637a9a3aeac5c7103eb4d612528680e7e20Argyrios Kyrtzidis  switch (FEOpts.ARCMTAction) {
147f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth  case FrontendOptions::ARCMT_None:
148f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth    break;
149f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth  case FrontendOptions::ARCMT_Check:
150f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth    Act = new arcmt::CheckAction(Act);
151f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth    break;
152f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth  case FrontendOptions::ARCMT_Modify:
15369325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis    Act = new arcmt::ModifyAction(Act);
15469325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis    break;
15569325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis  case FrontendOptions::ARCMT_Migrate:
1567ee2049278b98d42709380054eb83f4952af1200Argyrios Kyrtzidis    Act = new arcmt::MigrateAction(Act,
15730660a898545416f0fea2d717f16f75640001e38Ted Kremenek                                   FEOpts.MTMigrateDir,
158b3ca2637a9a3aeac5c7103eb4d612528680e7e20Argyrios Kyrtzidis                                   FEOpts.ARCMTMigrateReportOut,
159b3ca2637a9a3aeac5c7103eb4d612528680e7e20Argyrios Kyrtzidis                                   FEOpts.ARCMTMigrateEmitARCErrors);
160f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth    break;
161f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth  }
162f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth
16330660a898545416f0fea2d717f16f75640001e38Ted Kremenek  if (FEOpts.ObjCMTAction != FrontendOptions::ObjCMT_None) {
16430660a898545416f0fea2d717f16f75640001e38Ted Kremenek    Act = new arcmt::ObjCMigrateAction(Act, FEOpts.MTMigrateDir,
165d412999a3da6387dbfaf00f7647132082e94310eFariborz Jahanian                   FEOpts.ObjCMTAction & FrontendOptions::ObjCMT_Literals,
166d412999a3da6387dbfaf00f7647132082e94310eFariborz Jahanian                   FEOpts.ObjCMTAction & FrontendOptions::ObjCMT_Subscripting,
167d412999a3da6387dbfaf00f7647132082e94310eFariborz Jahanian                   FEOpts.ObjCMTAction & FrontendOptions::ObjCMT_Property);
16830660a898545416f0fea2d717f16f75640001e38Ted Kremenek  }
169fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#endif
17030660a898545416f0fea2d717f16f75640001e38Ted Kremenek
1718eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  // If there are any AST files to merge, create a frontend action
1728eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  // adaptor to perform the merge.
173b3ca2637a9a3aeac5c7103eb4d612528680e7e20Argyrios Kyrtzidis  if (!FEOpts.ASTMergeFiles.empty())
174e839806cad021306510f72da63217ba57648929eArgyrios Kyrtzidis    Act = new ASTMergeAction(Act, FEOpts.ASTMergeFiles);
1758eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar
1768eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  return Act;
1778eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar}
1788eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar
1798eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbarbool clang::ExecuteCompilerInvocation(CompilerInstance *Clang) {
1808eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  // Honor -help.
1818eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  if (Clang->getFrontendOpts().ShowHelp) {
182b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner    OwningPtr<OptTable> Opts(driver::createDriverOptTable());
1838eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    Opts->PrintHelp(llvm::outs(), "clang -cc1",
184f1eaab122932a5c61b13ce9ae6d590e24558eb84Richard Smith                    "LLVM 'Clang' Compiler: http://clang.llvm.org",
185b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner                    /*Include=*/ driver::options::CC1Option, /*Exclude=*/ 0);
186201d3fb13c0fe7b22bdf6832fe16c317036aad7cRafael Espindola    return true;
1878eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  }
1888eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar
1898eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  // Honor -version.
1908eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  //
1918eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  // FIXME: Use a better -version message?
1928eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  if (Clang->getFrontendOpts().ShowVersion) {
1938eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    llvm::cl::PrintVersionMessage();
194201d3fb13c0fe7b22bdf6832fe16c317036aad7cRafael Espindola    return true;
1958eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  }
1968eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar
1976e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser  // Load any requested plugins.
1986e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser  for (unsigned i = 0,
1996e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser         e = Clang->getFrontendOpts().Plugins.size(); i != e; ++i) {
2006e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser    const std::string &Path = Clang->getFrontendOpts().Plugins[i];
2016e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser    std::string Error;
2026e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser    if (llvm::sys::DynamicLibrary::LoadLibraryPermanently(Path.c_str(), &Error))
2036e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser      Clang->getDiagnostics().Report(diag::err_fe_unable_to_load_plugin)
2046e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser        << Path << Error;
2056e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser  }
2066e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser
2078eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  // Honor -mllvm.
2088eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  //
2098eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  // FIXME: Remove this, one day.
2106e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser  // This should happen AFTER plugins have been loaded!
2118eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  if (!Clang->getFrontendOpts().LLVMArgs.empty()) {
2128eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    unsigned NumArgs = Clang->getFrontendOpts().LLVMArgs.size();
2138eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    const char **Args = new const char*[NumArgs + 2];
2148eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    Args[0] = "clang (LLVM option parsing)";
2158eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    for (unsigned i = 0; i != NumArgs; ++i)
2168eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar      Args[i + 1] = Clang->getFrontendOpts().LLVMArgs[i].c_str();
2178eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    Args[NumArgs + 1] = 0;
2186bd17d2f2e6e498b0ff01e2e755f044de046d138David Blaikie    llvm::cl::ParseCommandLineOptions(NumArgs + 1, Args);
2198eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  }
2208eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar
221fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#ifdef CLANG_ENABLE_STATIC_ANALYZER
22208b86531ade68727c56918f162816075b87c864aJordy Rose  // Honor -analyzer-checker-help.
22308b86531ade68727c56918f162816075b87c864aJordy Rose  // This should happen AFTER plugins have been loaded!
22445796b10d11869e86c6b85e24df165410536b313Ted Kremenek  if (Clang->getAnalyzerOpts()->ShowCheckerHelp) {
22508b86531ade68727c56918f162816075b87c864aJordy Rose    ento::printCheckerHelp(llvm::outs(), Clang->getFrontendOpts().Plugins);
226201d3fb13c0fe7b22bdf6832fe16c317036aad7cRafael Espindola    return true;
22708b86531ade68727c56918f162816075b87c864aJordy Rose  }
228fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#endif
22908b86531ade68727c56918f162816075b87c864aJordy Rose
2308eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  // If there were errors in processing arguments, don't do anything else.
2318da06bbd90d070c9a43557b6ecd55583db5b4083Sean Silva  if (Clang->getDiagnostics().hasErrorOccurred())
2328da06bbd90d070c9a43557b6ecd55583db5b4083Sean Silva    return false;
2338da06bbd90d070c9a43557b6ecd55583db5b4083Sean Silva  // Create and execute the frontend action.
2348da06bbd90d070c9a43557b6ecd55583db5b4083Sean Silva  OwningPtr<FrontendAction> Act(CreateFrontendAction(*Clang));
2358da06bbd90d070c9a43557b6ecd55583db5b4083Sean Silva  if (!Act)
2368da06bbd90d070c9a43557b6ecd55583db5b4083Sean Silva    return false;
2378da06bbd90d070c9a43557b6ecd55583db5b4083Sean Silva  bool Success = Clang->ExecuteAction(*Act);
2388da06bbd90d070c9a43557b6ecd55583db5b4083Sean Silva  if (Clang->getFrontendOpts().DisableFree)
2398da06bbd90d070c9a43557b6ecd55583db5b4083Sean Silva    Act.take();
2408eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  return Success;
2418eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar}
242