ExecuteCompilerInvocation.cpp revision fc2929fdb7cce47daf5b2857a56013fad0257cb6
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"
1855fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Driver/OptTable.h"
19f1eaab122932a5c61b13ce9ae6d590e24558eb84Richard Smith#include "clang/Driver/Option.h"
20bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy#include "clang/Driver/Options.h"
218eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar#include "clang/Frontend/CompilerInstance.h"
2255fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Frontend/CompilerInvocation.h"
238eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar#include "clang/Frontend/FrontendActions.h"
248eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar#include "clang/Frontend/FrontendDiagnostic.h"
258eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar#include "clang/Frontend/FrontendPluginRegistry.h"
26305c613af6cfc40e519c75d9d2c84c6fa9a841c0Ted Kremenek#include "clang/Rewrite/Frontend/FrontendActions.h"
2755fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/StaticAnalyzer/Frontend/FrontendActions.h"
2803013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/DynamicLibrary.h"
2955fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/Support/ErrorHandling.h"
308eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbarusing namespace clang;
318eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar
328eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbarstatic FrontendAction *CreateFrontendBaseAction(CompilerInstance &CI) {
338eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  using namespace clang::frontend;
34fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky  StringRef Action("unknown");
358eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar
368eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  switch (CI.getFrontendOpts().ProgramAction) {
37171af64ef10ae816ed2a4f15f5d17aca1d71769fAlexander Kornienko  case ASTDeclList:            return new ASTDeclListAction();
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();
428eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case DumpRawTokens:          return new DumpRawTokensAction();
438eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case DumpTokens:             return new DumpTokensAction();
448eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case EmitAssembly:           return new EmitAssemblyAction();
458eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case EmitBC:                 return new EmitBCAction();
46fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#ifdef CLANG_ENABLE_REWRITER
478eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case EmitHTML:               return new HTMLPrintAction();
48fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#else
49fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky  case EmitHTML:               Action = "EmitHTML"; break;
50fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#endif
518eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case EmitLLVM:               return new EmitLLVMAction();
528eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case EmitLLVMOnly:           return new EmitLLVMOnlyAction();
538eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case EmitCodeGenOnly:        return new EmitCodeGenOnlyAction();
548eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case EmitObj:                return new EmitObjAction();
55fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#ifdef CLANG_ENABLE_REWRITER
568eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case FixIt:                  return new FixItAction();
57fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#else
58fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky  case FixIt:                  Action = "FixIt"; break;
59fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#endif
606649014b792f8a4b1bc1e8be8f844a72220af508Douglas Gregor  case GenerateModule:         return new GenerateModuleAction;
616649014b792f8a4b1bc1e8be8f844a72220af508Douglas Gregor  case GeneratePCH:            return new GeneratePCHAction;
628eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case GeneratePTH:            return new GeneratePTHAction();
638eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case InitOnly:               return new InitOnlyAction();
648eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case ParseSyntaxOnly:        return new SyntaxOnlyAction();
658eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar
668eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case PluginAction: {
678eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    for (FrontendPluginRegistry::iterator it =
688eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar           FrontendPluginRegistry::begin(), ie = FrontendPluginRegistry::end();
698eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar         it != ie; ++it) {
708eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar      if (it->getName() == CI.getFrontendOpts().ActionName) {
716f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith        OwningPtr<PluginASTAction> P(it->instantiate());
728eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar        if (!P->ParseArgs(CI, CI.getFrontendOpts().PluginArgs))
738eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar          return 0;
748eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar        return P.take();
758eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar      }
768eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    }
778eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar
788eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    CI.getDiagnostics().Report(diag::err_fe_invalid_plugin_name)
798eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar      << CI.getFrontendOpts().ActionName;
808eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    return 0;
818eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  }
828eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar
838eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case PrintDeclContext:       return new DeclContextPrintAction();
848eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case PrintPreamble:          return new PrintPreambleAction();
85f1492f970c7c6eb85dc18f13fb864b185bed1d23David Blaikie  case PrintPreprocessedInput: {
86fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky    if (CI.getPreprocessorOutputOpts().RewriteIncludes) {
87fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#ifdef CLANG_ENABLE_REWRITER
88f1492f970c7c6eb85dc18f13fb864b185bed1d23David Blaikie      return new RewriteIncludesAction();
89fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#else
90fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky      Action = "RewriteIncludesAction";
91fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky      break;
92fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#endif
93fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky    }
94f1492f970c7c6eb85dc18f13fb864b185bed1d23David Blaikie    return new PrintPreprocessedAction();
95f1492f970c7c6eb85dc18f13fb864b185bed1d23David Blaikie  }
96f1492f970c7c6eb85dc18f13fb864b185bed1d23David Blaikie
97fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#ifdef CLANG_ENABLE_REWRITER
988eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case RewriteMacros:          return new RewriteMacrosAction();
998eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case RewriteObjC:            return new RewriteObjCAction();
1008eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case RewriteTest:            return new RewriteTestAction();
101fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#else
102fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky  case RewriteMacros:          Action = "RewriteMacros"; break;
103fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky  case RewriteObjC:            Action = "RewriteObjC"; break;
104fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky  case RewriteTest:            Action = "RewriteTest"; break;
105fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#endif
106fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#ifdef CLANG_ENABLE_ARCMT
10730660a898545416f0fea2d717f16f75640001e38Ted Kremenek  case MigrateSource:          return new arcmt::MigrateSourceAction();
108fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#else
109fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky  case MigrateSource:          Action = "MigrateSource"; break;
110fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#endif
111fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#ifdef CLANG_ENABLE_STATIC_ANALYZER
112fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky  case RunAnalysis:            return new ento::AnalysisAction();
113fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#else
114fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky  case RunAnalysis:            Action = "RunAnalysis"; break;
115fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#endif
1168eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  case RunPreprocessorOnly:    return new PreprocessOnlyAction();
1178eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  }
118fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky
119fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#if !defined(CLANG_ENABLE_ARCMT) || !defined(CLANG_ENABLE_STATIC_ANALYZER) \
120fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky  || !defined(CLANG_ENABLE_REWRITER)
121fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky  CI.getDiagnostics().Report(diag::err_fe_action_not_available) << Action;
122fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky  return 0;
123fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#else
124561d3abc881033776ece385a01a510e1cbc1fa92David Blaikie  llvm_unreachable("Invalid program action!");
125fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#endif
1268eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar}
1278eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar
1288eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbarstatic FrontendAction *CreateFrontendAction(CompilerInstance &CI) {
1298eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  // Create the underlying action.
1308eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  FrontendAction *Act = CreateFrontendBaseAction(CI);
1318eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  if (!Act)
1328eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    return 0;
1338eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar
134b3ca2637a9a3aeac5c7103eb4d612528680e7e20Argyrios Kyrtzidis  const FrontendOptions &FEOpts = CI.getFrontendOpts();
135b3ca2637a9a3aeac5c7103eb4d612528680e7e20Argyrios Kyrtzidis
136fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#ifdef CLANG_ENABLE_REWRITER
137b3ca2637a9a3aeac5c7103eb4d612528680e7e20Argyrios Kyrtzidis  if (FEOpts.FixAndRecompile) {
13861d679ab2831b161c857cf3f974312fbd4ef1efdArgyrios Kyrtzidis    Act = new FixItRecompile(Act);
13961d679ab2831b161c857cf3f974312fbd4ef1efdArgyrios Kyrtzidis  }
140fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#endif
14161d679ab2831b161c857cf3f974312fbd4ef1efdArgyrios Kyrtzidis
142fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#ifdef CLANG_ENABLE_ARCMT
143f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth  // Potentially wrap the base FE action in an ARC Migrate Tool action.
144b3ca2637a9a3aeac5c7103eb4d612528680e7e20Argyrios Kyrtzidis  switch (FEOpts.ARCMTAction) {
145f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth  case FrontendOptions::ARCMT_None:
146f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth    break;
147f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth  case FrontendOptions::ARCMT_Check:
148f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth    Act = new arcmt::CheckAction(Act);
149f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth    break;
150f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth  case FrontendOptions::ARCMT_Modify:
15169325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis    Act = new arcmt::ModifyAction(Act);
15269325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis    break;
15369325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis  case FrontendOptions::ARCMT_Migrate:
1547ee2049278b98d42709380054eb83f4952af1200Argyrios Kyrtzidis    Act = new arcmt::MigrateAction(Act,
15530660a898545416f0fea2d717f16f75640001e38Ted Kremenek                                   FEOpts.MTMigrateDir,
156b3ca2637a9a3aeac5c7103eb4d612528680e7e20Argyrios Kyrtzidis                                   FEOpts.ARCMTMigrateReportOut,
157b3ca2637a9a3aeac5c7103eb4d612528680e7e20Argyrios Kyrtzidis                                   FEOpts.ARCMTMigrateEmitARCErrors);
158f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth    break;
159f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth  }
160f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth
16130660a898545416f0fea2d717f16f75640001e38Ted Kremenek  if (FEOpts.ObjCMTAction != FrontendOptions::ObjCMT_None) {
16230660a898545416f0fea2d717f16f75640001e38Ted Kremenek    Act = new arcmt::ObjCMigrateAction(Act, FEOpts.MTMigrateDir,
16330660a898545416f0fea2d717f16f75640001e38Ted Kremenek                   FEOpts.ObjCMTAction & ~FrontendOptions::ObjCMT_Literals,
16430660a898545416f0fea2d717f16f75640001e38Ted Kremenek                   FEOpts.ObjCMTAction & ~FrontendOptions::ObjCMT_Subscripting);
16530660a898545416f0fea2d717f16f75640001e38Ted Kremenek  }
166fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#endif
16730660a898545416f0fea2d717f16f75640001e38Ted Kremenek
1688eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  // If there are any AST files to merge, create a frontend action
1698eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  // adaptor to perform the merge.
170b3ca2637a9a3aeac5c7103eb4d612528680e7e20Argyrios Kyrtzidis  if (!FEOpts.ASTMergeFiles.empty())
171e839806cad021306510f72da63217ba57648929eArgyrios Kyrtzidis    Act = new ASTMergeAction(Act, FEOpts.ASTMergeFiles);
1728eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar
1738eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  return Act;
1748eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar}
1758eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar
1768eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbarbool clang::ExecuteCompilerInvocation(CompilerInstance *Clang) {
1778eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  // Honor -help.
1788eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  if (Clang->getFrontendOpts().ShowHelp) {
179bfd7a525bcf372004787cb641b8c1566b9e8aba5James Molloy    OwningPtr<driver::OptTable> Opts(driver::createDriverOptTable());
1808eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    Opts->PrintHelp(llvm::outs(), "clang -cc1",
181f1eaab122932a5c61b13ce9ae6d590e24558eb84Richard Smith                    "LLVM 'Clang' Compiler: http://clang.llvm.org",
182f1eaab122932a5c61b13ce9ae6d590e24558eb84Richard Smith                    /*Include=*/driver::options::CC1Option,
183f1eaab122932a5c61b13ce9ae6d590e24558eb84Richard Smith                    /*Exclude=*/0);
1848eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    return 0;
1858eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  }
1868eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar
1878eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  // Honor -version.
1888eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  //
1898eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  // FIXME: Use a better -version message?
1908eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  if (Clang->getFrontendOpts().ShowVersion) {
1918eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    llvm::cl::PrintVersionMessage();
1928eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    return 0;
1938eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  }
1948eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar
1956e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser  // Load any requested plugins.
1966e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser  for (unsigned i = 0,
1976e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser         e = Clang->getFrontendOpts().Plugins.size(); i != e; ++i) {
1986e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser    const std::string &Path = Clang->getFrontendOpts().Plugins[i];
1996e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser    std::string Error;
2006e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser    if (llvm::sys::DynamicLibrary::LoadLibraryPermanently(Path.c_str(), &Error))
2016e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser      Clang->getDiagnostics().Report(diag::err_fe_unable_to_load_plugin)
2026e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser        << Path << Error;
2036e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser  }
2046e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser
2058eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  // Honor -mllvm.
2068eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  //
2078eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  // FIXME: Remove this, one day.
2086e0afc8610d3ebe8f1ffae54597dd1dab9b865f5Tobias Grosser  // This should happen AFTER plugins have been loaded!
2098eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  if (!Clang->getFrontendOpts().LLVMArgs.empty()) {
2108eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    unsigned NumArgs = Clang->getFrontendOpts().LLVMArgs.size();
2118eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    const char **Args = new const char*[NumArgs + 2];
2128eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    Args[0] = "clang (LLVM option parsing)";
2138eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    for (unsigned i = 0; i != NumArgs; ++i)
2148eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar      Args[i + 1] = Clang->getFrontendOpts().LLVMArgs[i].c_str();
2158eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    Args[NumArgs + 1] = 0;
2166bd17d2f2e6e498b0ff01e2e755f044de046d138David Blaikie    llvm::cl::ParseCommandLineOptions(NumArgs + 1, Args);
2178eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  }
2188eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar
219fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#ifdef CLANG_ENABLE_STATIC_ANALYZER
22008b86531ade68727c56918f162816075b87c864aJordy Rose  // Honor -analyzer-checker-help.
22108b86531ade68727c56918f162816075b87c864aJordy Rose  // This should happen AFTER plugins have been loaded!
22245796b10d11869e86c6b85e24df165410536b313Ted Kremenek  if (Clang->getAnalyzerOpts()->ShowCheckerHelp) {
22308b86531ade68727c56918f162816075b87c864aJordy Rose    ento::printCheckerHelp(llvm::outs(), Clang->getFrontendOpts().Plugins);
22408b86531ade68727c56918f162816075b87c864aJordy Rose    return 0;
22508b86531ade68727c56918f162816075b87c864aJordy Rose  }
226fc2929fdb7cce47daf5b2857a56013fad0257cb6Roman Divacky#endif
22708b86531ade68727c56918f162816075b87c864aJordy Rose
2288eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  // If there were errors in processing arguments, don't do anything else.
2298eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  bool Success = false;
230e8f0ba75a39b2fa2d34d14e8401ae96f43e1fc14Argyrios Kyrtzidis  if (!Clang->getDiagnostics().hasErrorOccurred()) {
2318eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar    // Create and execute the frontend action.
2326f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith    OwningPtr<FrontendAction> Act(CreateFrontendAction(*Clang));
23372e3a0a2a54cdc9cf1c5324c348f1c10f205b2c0Ted Kremenek    if (Act) {
2348eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar      Success = Clang->ExecuteAction(*Act);
23572e3a0a2a54cdc9cf1c5324c348f1c10f205b2c0Ted Kremenek      if (Clang->getFrontendOpts().DisableFree)
23672e3a0a2a54cdc9cf1c5324c348f1c10f205b2c0Ted Kremenek        Act.take();
23772e3a0a2a54cdc9cf1c5324c348f1c10f205b2c0Ted Kremenek    }
2388eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  }
2398eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar
2408eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar  return Success;
2418eb2b0141d81d7d1026fad2d1a631f40eb3747a6Daniel Dunbar}
242