| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 1 | //===--- CompilerInvocation.cpp -------------------------------------------===// | 
 | 2 | // | 
 | 3 | //                     The LLVM Compiler Infrastructure | 
 | 4 | // | 
 | 5 | // This file is distributed under the University of Illinois Open Source | 
 | 6 | // License. See LICENSE.TXT for details. | 
 | 7 | // | 
 | 8 | //===----------------------------------------------------------------------===// | 
 | 9 |  | 
 | 10 | #include "clang/Frontend/CompilerInvocation.h" | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 11 | #include "clang/Basic/Diagnostic.h" | 
 | 12 | #include "clang/Basic/Version.h" | 
 | 13 | #include "clang/Driver/Arg.h" | 
 | 14 | #include "clang/Driver/ArgList.h" | 
 | 15 | #include "clang/Driver/CC1Options.h" | 
 | 16 | #include "clang/Driver/DriverDiagnostic.h" | 
 | 17 | #include "clang/Driver/OptTable.h" | 
 | 18 | #include "clang/Driver/Option.h" | 
 | 19 | #include "clang/Frontend/CompilerInvocation.h" | 
 | 20 | #include "clang/Frontend/LangStandard.h" | 
 | 21 | #include "clang/Frontend/PCHReader.h" | 
 | 22 | #include "llvm/ADT/OwningPtr.h" | 
 | 23 | #include "llvm/ADT/SmallVector.h" | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 24 | #include "llvm/ADT/StringExtras.h" | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 25 | #include "llvm/ADT/StringSwitch.h" | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 26 | #include "llvm/Support/ErrorHandling.h" | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 27 | #include "llvm/System/Host.h" | 
 | 28 | #include "llvm/System/Path.h" | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 29 | using namespace clang; | 
 | 30 |  | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 31 | static const char *getAnalysisName(Analyses Kind) { | 
 | 32 |   switch (Kind) { | 
 | 33 |   default: | 
| Jeffrey Yasskin | 9f61aa9 | 2009-12-12 05:05:38 +0000 | [diff] [blame] | 34 |     llvm_unreachable("Unknown analysis kind!"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 35 | #define ANALYSIS(NAME, CMDFLAG, DESC, SCOPE)\ | 
| Daniel Dunbar | e2814d8 | 2009-11-22 22:08:20 +0000 | [diff] [blame] | 36 |   case NAME: return "-" CMDFLAG; | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 37 | #include "clang/Frontend/Analyses.def" | 
 | 38 |   } | 
 | 39 | } | 
 | 40 |  | 
 | 41 | static const char *getAnalysisStoreName(AnalysisStores Kind) { | 
 | 42 |   switch (Kind) { | 
 | 43 |   default: | 
| Jeffrey Yasskin | 9f61aa9 | 2009-12-12 05:05:38 +0000 | [diff] [blame] | 44 |     llvm_unreachable("Unknown analysis store!"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 45 | #define ANALYSIS_STORE(NAME, CMDFLAG, DESC, CREATFN) \ | 
 | 46 |   case NAME##Model: return CMDFLAG; | 
 | 47 | #include "clang/Frontend/Analyses.def" | 
 | 48 |   } | 
 | 49 | } | 
 | 50 |  | 
 | 51 | static const char *getAnalysisConstraintName(AnalysisConstraints Kind) { | 
 | 52 |   switch (Kind) { | 
 | 53 |   default: | 
| Jeffrey Yasskin | 9f61aa9 | 2009-12-12 05:05:38 +0000 | [diff] [blame] | 54 |     llvm_unreachable("Unknown analysis constraints!"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 55 | #define ANALYSIS_CONSTRAINTS(NAME, CMDFLAG, DESC, CREATFN) \ | 
 | 56 |   case NAME##Model: return CMDFLAG; | 
 | 57 | #include "clang/Frontend/Analyses.def" | 
 | 58 |   } | 
 | 59 | } | 
 | 60 |  | 
 | 61 | static const char *getAnalysisDiagClientName(AnalysisDiagClients Kind) { | 
 | 62 |   switch (Kind) { | 
 | 63 |   default: | 
| Jeffrey Yasskin | 9f61aa9 | 2009-12-12 05:05:38 +0000 | [diff] [blame] | 64 |     llvm_unreachable("Unknown analysis client!"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 65 | #define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN, AUTOCREATE) \ | 
 | 66 |   case PD_##NAME: return CMDFLAG; | 
 | 67 | #include "clang/Frontend/Analyses.def" | 
 | 68 |   } | 
 | 69 | } | 
 | 70 |  | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 71 | //===----------------------------------------------------------------------===// | 
 | 72 | // Serialization (to args) | 
 | 73 | //===----------------------------------------------------------------------===// | 
 | 74 |  | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 75 | static void AnalyzerOptsToArgs(const AnalyzerOptions &Opts, | 
 | 76 |                                std::vector<std::string> &Res) { | 
 | 77 |   for (unsigned i = 0, e = Opts.AnalysisList.size(); i != e; ++i) | 
 | 78 |     Res.push_back(getAnalysisName(Opts.AnalysisList[i])); | 
 | 79 |   if (Opts.AnalysisStoreOpt != BasicStoreModel) { | 
 | 80 |     Res.push_back("-analyzer-store"); | 
 | 81 |     Res.push_back(getAnalysisStoreName(Opts.AnalysisStoreOpt)); | 
 | 82 |   } | 
 | 83 |   if (Opts.AnalysisConstraintsOpt != RangeConstraintsModel) { | 
 | 84 |     Res.push_back("-analyzer-constraints"); | 
 | 85 |     Res.push_back(getAnalysisConstraintName(Opts.AnalysisConstraintsOpt)); | 
 | 86 |   } | 
 | 87 |   if (Opts.AnalysisDiagOpt != PD_HTML) { | 
 | 88 |     Res.push_back("-analyzer-output"); | 
 | 89 |     Res.push_back(getAnalysisDiagClientName(Opts.AnalysisDiagOpt)); | 
 | 90 |   } | 
 | 91 |   if (!Opts.AnalyzeSpecificFunction.empty()) { | 
 | 92 |     Res.push_back("-analyze-function"); | 
 | 93 |     Res.push_back(Opts.AnalyzeSpecificFunction); | 
 | 94 |   } | 
 | 95 |   if (Opts.AnalyzeAll) | 
 | 96 |     Res.push_back("-analyzer-opt-analyze-headers"); | 
 | 97 |   if (Opts.AnalyzerDisplayProgress) | 
 | 98 |     Res.push_back("-analyzer-display-progress"); | 
| Ted Kremenek | fc57651 | 2009-12-07 22:06:12 +0000 | [diff] [blame] | 99 |   if (Opts.AnalyzeNestedBlocks) | 
 | 100 |     Res.push_back("-analyzer-opt-analyze-nested-blocks"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 101 |   if (Opts.EagerlyAssume) | 
 | 102 |     Res.push_back("-analyzer-eagerly-assume"); | 
| Daniel Dunbar | 4db166b | 2009-11-19 05:32:09 +0000 | [diff] [blame] | 103 |   if (!Opts.PurgeDead) | 
 | 104 |     Res.push_back("-analyzer-no-purge-dead"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 105 |   if (Opts.TrimGraph) | 
 | 106 |     Res.push_back("-trim-egraph"); | 
 | 107 |   if (Opts.VisualizeEGDot) | 
 | 108 |     Res.push_back("-analyzer-viz-egraph-graphviz"); | 
 | 109 |   if (Opts.VisualizeEGDot) | 
 | 110 |     Res.push_back("-analyzer-viz-egraph-ubigraph"); | 
 | 111 |   if (Opts.EnableExperimentalChecks) | 
 | 112 |     Res.push_back("-analyzer-experimental-checks"); | 
 | 113 |   if (Opts.EnableExperimentalInternalChecks) | 
| Daniel Dunbar | e2814d8 | 2009-11-22 22:08:20 +0000 | [diff] [blame] | 114 |     Res.push_back("-analyzer-experimental-internal-checks"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 115 | } | 
 | 116 |  | 
 | 117 | static void CodeGenOptsToArgs(const CodeGenOptions &Opts, | 
 | 118 |                               std::vector<std::string> &Res) { | 
 | 119 |   if (Opts.DebugInfo) | 
 | 120 |     Res.push_back("-g"); | 
 | 121 |   if (Opts.DisableLLVMOpts) | 
 | 122 |     Res.push_back("-disable-llvm-optzns"); | 
 | 123 |   if (Opts.DisableRedZone) | 
 | 124 |     Res.push_back("-disable-red-zone"); | 
| Daniel Dunbar | f2d8b9f | 2009-12-18 02:43:17 +0000 | [diff] [blame] | 125 |   if (!Opts.DwarfDebugFlags.empty()) { | 
 | 126 |     Res.push_back("-dwarf-debug-flags"); | 
 | 127 |     Res.push_back(Opts.DwarfDebugFlags); | 
 | 128 |   } | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 129 |   if (!Opts.MergeAllConstants) | 
 | 130 |     Res.push_back("-fno-merge-all-constants"); | 
| Daniel Dunbar | 50a4487 | 2009-11-20 17:23:30 +0000 | [diff] [blame] | 131 |   if (Opts.NoCommon) | 
 | 132 |     Res.push_back("-fno-common"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 133 |   if (Opts.NoImplicitFloat) | 
 | 134 |     Res.push_back("-no-implicit-float"); | 
 | 135 |   if (Opts.OptimizeSize) { | 
 | 136 |     assert(Opts.OptimizationLevel == 2 && "Invalid options!"); | 
 | 137 |     Res.push_back("-Os"); | 
| Daniel Dunbar | 1be3b3b | 2009-11-19 20:54:59 +0000 | [diff] [blame] | 138 |   } else if (Opts.OptimizationLevel != 0) | 
 | 139 |     Res.push_back("-O" + llvm::utostr(Opts.OptimizationLevel)); | 
| Daniel Dunbar | 7d065d0 | 2009-11-29 02:38:34 +0000 | [diff] [blame] | 140 |   if (!Opts.MainFileName.empty()) { | 
 | 141 |     Res.push_back("-main-file-name"); | 
 | 142 |     Res.push_back(Opts.MainFileName); | 
 | 143 |   } | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 144 |   // SimplifyLibCalls is only derived. | 
 | 145 |   // TimePasses is only derived. | 
 | 146 |   // UnitAtATime is unused. | 
 | 147 |   // UnrollLoops is only derived. | 
 | 148 |   // VerifyModule is only derived. | 
 | 149 |   // Inlining is only derived. | 
| Daniel Dunbar | f219e7c | 2009-11-29 07:18:39 +0000 | [diff] [blame] | 150 |  | 
| Chris Lattner | bbea716 | 2010-04-13 00:38:24 +0000 | [diff] [blame] | 151 |   if (Opts.DataSections) | 
 | 152 |     Res.push_back("-fdata-sections"); | 
 | 153 |   if (Opts.FunctionSections) | 
 | 154 |     Res.push_back("-ffunction-sections"); | 
| Daniel Dunbar | f219e7c | 2009-11-29 07:18:39 +0000 | [diff] [blame] | 155 |   if (Opts.AsmVerbose) | 
 | 156 |     Res.push_back("-masm-verbose"); | 
 | 157 |   if (!Opts.CodeModel.empty()) { | 
 | 158 |     Res.push_back("-mcode-model"); | 
 | 159 |     Res.push_back(Opts.CodeModel); | 
 | 160 |   } | 
| Daniel Dunbar | efb0fa9 | 2010-03-20 04:15:41 +0000 | [diff] [blame] | 161 |   if (!Opts.CXAAtExit) | 
 | 162 |     Res.push_back("-fno-use-cxa-atexit"); | 
 | 163 |   if (Opts.CXXCtorDtorAliases) | 
 | 164 |     Res.push_back("-mconstructor-aliases"); | 
| Daniel Dunbar | f219e7c | 2009-11-29 07:18:39 +0000 | [diff] [blame] | 165 |   if (!Opts.DebugPass.empty()) { | 
 | 166 |     Res.push_back("-mdebug-pass"); | 
 | 167 |     Res.push_back(Opts.DebugPass); | 
 | 168 |   } | 
 | 169 |   if (Opts.DisableFPElim) | 
 | 170 |     Res.push_back("-mdisable-fp-elim"); | 
| Daniel Dunbar | 3b31526 | 2009-11-30 08:42:00 +0000 | [diff] [blame] | 171 |   if (!Opts.FloatABI.empty()) { | 
 | 172 |     Res.push_back("-mfloat-abi"); | 
 | 173 |     Res.push_back(Opts.FloatABI); | 
 | 174 |   } | 
| Daniel Dunbar | f219e7c | 2009-11-29 07:18:39 +0000 | [diff] [blame] | 175 |   if (!Opts.LimitFloatPrecision.empty()) { | 
 | 176 |     Res.push_back("-mlimit-float-precision"); | 
 | 177 |     Res.push_back(Opts.LimitFloatPrecision); | 
 | 178 |   } | 
 | 179 |   if (Opts.NoZeroInitializedInBSS) | 
 | 180 |     Res.push_back("-mno-zero-initialized-bss"); | 
| Daniel Dunbar | f643b9b | 2010-04-24 17:56:46 +0000 | [diff] [blame^] | 181 |   switch (Opts.getObjCDispatchMethod()) { | 
 | 182 |   case CodeGenOptions::Legacy: | 
 | 183 |     break; | 
 | 184 |   case CodeGenOptions::Mixed: | 
 | 185 |     Res.push_back("-fobjc-dispatch-method=mixed"); | 
 | 186 |     break; | 
 | 187 |   case CodeGenOptions::NonLegacy: | 
 | 188 |     Res.push_back("-fobjc-dispatch-method=non-legacy"); | 
 | 189 |     break; | 
 | 190 |   } | 
| Daniel Dunbar | 3b31526 | 2009-11-30 08:42:00 +0000 | [diff] [blame] | 191 |   if (Opts.SoftFloat) | 
 | 192 |     Res.push_back("-msoft-float"); | 
| Daniel Dunbar | f219e7c | 2009-11-29 07:18:39 +0000 | [diff] [blame] | 193 |   if (Opts.UnwindTables) | 
 | 194 |     Res.push_back("-munwind-tables"); | 
 | 195 |   if (Opts.RelocationModel != "pic") { | 
 | 196 |     Res.push_back("-mrelocation-model"); | 
 | 197 |     Res.push_back(Opts.RelocationModel); | 
 | 198 |   } | 
| John McCall | b689afb | 2010-02-13 03:50:24 +0000 | [diff] [blame] | 199 |   if (!Opts.VerifyModule) | 
 | 200 |     Res.push_back("-disable-llvm-verifier"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 201 | } | 
 | 202 |  | 
 | 203 | static void DependencyOutputOptsToArgs(const DependencyOutputOptions &Opts, | 
 | 204 |                                        std::vector<std::string> &Res) { | 
 | 205 |   if (Opts.IncludeSystemHeaders) | 
 | 206 |     Res.push_back("-sys-header-deps"); | 
 | 207 |   if (Opts.UsePhonyTargets) | 
 | 208 |     Res.push_back("-MP"); | 
 | 209 |   if (!Opts.OutputFile.empty()) { | 
 | 210 |     Res.push_back("-dependency-file"); | 
 | 211 |     Res.push_back(Opts.OutputFile); | 
 | 212 |   } | 
 | 213 |   for (unsigned i = 0, e = Opts.Targets.size(); i != e; ++i) { | 
 | 214 |     Res.push_back("-MT"); | 
 | 215 |     Res.push_back(Opts.Targets[i]); | 
 | 216 |   } | 
 | 217 | } | 
 | 218 |  | 
 | 219 | static void DiagnosticOptsToArgs(const DiagnosticOptions &Opts, | 
 | 220 |                                  std::vector<std::string> &Res) { | 
 | 221 |   if (Opts.IgnoreWarnings) | 
 | 222 |     Res.push_back("-w"); | 
 | 223 |   if (Opts.NoRewriteMacros) | 
 | 224 |     Res.push_back("-Wno-rewrite-macros"); | 
 | 225 |   if (Opts.Pedantic) | 
 | 226 |     Res.push_back("-pedantic"); | 
 | 227 |   if (Opts.PedanticErrors) | 
 | 228 |     Res.push_back("-pedantic-errors"); | 
 | 229 |   if (!Opts.ShowColumn) | 
 | 230 |     Res.push_back("-fno-show-column"); | 
 | 231 |   if (!Opts.ShowLocation) | 
 | 232 |     Res.push_back("-fno-show-source-location"); | 
 | 233 |   if (!Opts.ShowCarets) | 
 | 234 |     Res.push_back("-fno-caret-diagnostics"); | 
 | 235 |   if (!Opts.ShowFixits) | 
 | 236 |     Res.push_back("-fno-diagnostics-fixit-info"); | 
 | 237 |   if (Opts.ShowSourceRanges) | 
 | 238 |     Res.push_back("-fdiagnostics-print-source-range-info"); | 
 | 239 |   if (Opts.ShowColors) | 
 | 240 |     Res.push_back("-fcolor-diagnostics"); | 
 | 241 |   if (Opts.VerifyDiagnostics) | 
 | 242 |     Res.push_back("-verify"); | 
| Douglas Gregor | d93256e | 2010-01-28 06:00:51 +0000 | [diff] [blame] | 243 |   if (Opts.BinaryOutput) | 
 | 244 |     Res.push_back("-fdiagnostics-binary"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 245 |   if (Opts.ShowOptionNames) | 
 | 246 |     Res.push_back("-fdiagnostics-show-option"); | 
| Chris Lattner | c100214 | 2010-04-07 20:37:06 +0000 | [diff] [blame] | 247 |   if (Opts.ErrorLimit) { | 
 | 248 |     Res.push_back("-ferror-limit"); | 
 | 249 |     Res.push_back(llvm::utostr(Opts.ErrorLimit)); | 
 | 250 |   } | 
| Douglas Gregor | 575cf37 | 2010-04-20 07:18:24 +0000 | [diff] [blame] | 251 |   if (Opts.TemplateBacktraceLimit != 10) { | 
 | 252 |     Res.push_back("-ftemplate-backtrace-limit"); | 
 | 253 |     Res.push_back(llvm::utostr(Opts.TemplateBacktraceLimit)); | 
 | 254 |   } | 
 | 255 |  | 
| Chris Lattner | 52388f9 | 2010-01-13 03:06:50 +0000 | [diff] [blame] | 256 |   if (Opts.TabStop != DiagnosticOptions::DefaultTabStop) { | 
| Chris Lattner | 124fca5 | 2010-01-09 21:54:33 +0000 | [diff] [blame] | 257 |     Res.push_back("-ftabstop"); | 
 | 258 |     Res.push_back(llvm::utostr(Opts.TabStop)); | 
 | 259 |   } | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 260 |   if (Opts.MessageLength) { | 
 | 261 |     Res.push_back("-fmessage-length"); | 
 | 262 |     Res.push_back(llvm::utostr(Opts.MessageLength)); | 
 | 263 |   } | 
 | 264 |   if (!Opts.DumpBuildInformation.empty()) { | 
 | 265 |     Res.push_back("-dump-build-information"); | 
 | 266 |     Res.push_back(Opts.DumpBuildInformation); | 
 | 267 |   } | 
 | 268 |   for (unsigned i = 0, e = Opts.Warnings.size(); i != e; ++i) | 
 | 269 |     Res.push_back("-W" + Opts.Warnings[i]); | 
 | 270 | } | 
 | 271 |  | 
 | 272 | static const char *getInputKindName(FrontendOptions::InputKind Kind) { | 
 | 273 |   switch (Kind) { | 
| Daniel Dunbar | 1b09695 | 2009-11-29 02:38:47 +0000 | [diff] [blame] | 274 |   case FrontendOptions::IK_None:              break; | 
 | 275 |   case FrontendOptions::IK_AST:               return "ast"; | 
 | 276 |   case FrontendOptions::IK_Asm:               return "assembler-with-cpp"; | 
 | 277 |   case FrontendOptions::IK_C:                 return "c"; | 
 | 278 |   case FrontendOptions::IK_CXX:               return "c++"; | 
 | 279 |   case FrontendOptions::IK_ObjC:              return "objective-c"; | 
 | 280 |   case FrontendOptions::IK_ObjCXX:            return "objective-c++"; | 
 | 281 |   case FrontendOptions::IK_OpenCL:            return "cl"; | 
 | 282 |   case FrontendOptions::IK_PreprocessedC:     return "cpp-output"; | 
 | 283 |   case FrontendOptions::IK_PreprocessedCXX:   return "c++-cpp-output"; | 
 | 284 |   case FrontendOptions::IK_PreprocessedObjC:  return "objective-c-cpp-output"; | 
 | 285 |   case FrontendOptions::IK_PreprocessedObjCXX:return "objective-c++-cpp-output"; | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 286 |   } | 
 | 287 |  | 
| Jeffrey Yasskin | 9f61aa9 | 2009-12-12 05:05:38 +0000 | [diff] [blame] | 288 |   llvm_unreachable("Unexpected language kind!"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 289 |   return 0; | 
 | 290 | } | 
 | 291 |  | 
 | 292 | static const char *getActionName(frontend::ActionKind Kind) { | 
 | 293 |   switch (Kind) { | 
 | 294 |   case frontend::PluginAction: | 
 | 295 |   case frontend::InheritanceView: | 
| Jeffrey Yasskin | 9f61aa9 | 2009-12-12 05:05:38 +0000 | [diff] [blame] | 296 |     llvm_unreachable("Invalid kind!"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 297 |  | 
 | 298 |   case frontend::ASTDump:                return "-ast-dump"; | 
 | 299 |   case frontend::ASTPrint:               return "-ast-print"; | 
 | 300 |   case frontend::ASTPrintXML:            return "-ast-print-xml"; | 
 | 301 |   case frontend::ASTView:                return "-ast-view"; | 
 | 302 |   case frontend::DumpRawTokens:          return "-dump-raw-tokens"; | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 303 |   case frontend::DumpTokens:             return "-dump-tokens"; | 
 | 304 |   case frontend::EmitAssembly:           return "-S"; | 
 | 305 |   case frontend::EmitBC:                 return "-emit-llvm-bc"; | 
 | 306 |   case frontend::EmitHTML:               return "-emit-html"; | 
 | 307 |   case frontend::EmitLLVM:               return "-emit-llvm"; | 
 | 308 |   case frontend::EmitLLVMOnly:           return "-emit-llvm-only"; | 
| Daniel Dunbar | da1573f | 2010-02-03 01:18:43 +0000 | [diff] [blame] | 309 |   case frontend::EmitObj:                return "-emit-obj"; | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 310 |   case frontend::FixIt:                  return "-fixit"; | 
 | 311 |   case frontend::GeneratePCH:            return "-emit-pch"; | 
 | 312 |   case frontend::GeneratePTH:            return "-emit-pth"; | 
| Daniel Dunbar | 2758595 | 2010-03-19 19:44:04 +0000 | [diff] [blame] | 313 |   case frontend::InitOnly:               return "-init-only"; | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 314 |   case frontend::ParseNoop:              return "-parse-noop"; | 
 | 315 |   case frontend::ParsePrintCallbacks:    return "-parse-print-callbacks"; | 
 | 316 |   case frontend::ParseSyntaxOnly:        return "-fsyntax-only"; | 
 | 317 |   case frontend::PrintDeclContext:       return "-print-decl-contexts"; | 
 | 318 |   case frontend::PrintPreprocessedInput: return "-E"; | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 319 |   case frontend::RewriteMacros:          return "-rewrite-macros"; | 
 | 320 |   case frontend::RewriteObjC:            return "-rewrite-objc"; | 
 | 321 |   case frontend::RewriteTest:            return "-rewrite-test"; | 
 | 322 |   case frontend::RunAnalysis:            return "-analyze"; | 
 | 323 |   case frontend::RunPreprocessorOnly:    return "-Eonly"; | 
 | 324 |   } | 
 | 325 |  | 
| Jeffrey Yasskin | 9f61aa9 | 2009-12-12 05:05:38 +0000 | [diff] [blame] | 326 |   llvm_unreachable("Unexpected language kind!"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 327 |   return 0; | 
 | 328 | } | 
 | 329 |  | 
 | 330 | static void FrontendOptsToArgs(const FrontendOptions &Opts, | 
 | 331 |                                std::vector<std::string> &Res) { | 
 | 332 |   if (!Opts.DebugCodeCompletionPrinter) | 
| Daniel Dunbar | 4db166b | 2009-11-19 05:32:09 +0000 | [diff] [blame] | 333 |     Res.push_back("-no-code-completion-debug-printer"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 334 |   if (Opts.DisableFree) | 
 | 335 |     Res.push_back("-disable-free"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 336 |   if (Opts.RelocatablePCH) | 
 | 337 |     Res.push_back("-relocatable-pch"); | 
| Daniel Dunbar | 9b5e9ae | 2009-12-03 07:01:58 +0000 | [diff] [blame] | 338 |   if (Opts.ShowHelp) | 
 | 339 |     Res.push_back("-help"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 340 |   if (Opts.ShowMacrosInCodeCompletion) | 
 | 341 |     Res.push_back("-code-completion-macros"); | 
 | 342 |   if (Opts.ShowStats) | 
| Daniel Dunbar | eb01ac8 | 2009-11-25 10:14:52 +0000 | [diff] [blame] | 343 |     Res.push_back("-print-stats"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 344 |   if (Opts.ShowTimers) | 
 | 345 |     Res.push_back("-ftime-report"); | 
| Daniel Dunbar | 9b5e9ae | 2009-12-03 07:01:58 +0000 | [diff] [blame] | 346 |   if (Opts.ShowVersion) | 
 | 347 |     Res.push_back("-version"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 348 |  | 
 | 349 |   bool NeedLang = false; | 
 | 350 |   for (unsigned i = 0, e = Opts.Inputs.size(); i != e; ++i) | 
 | 351 |     if (FrontendOptions::getInputKindForExtension(Opts.Inputs[i].second) != | 
 | 352 |         Opts.Inputs[i].first) | 
 | 353 |       NeedLang = true; | 
 | 354 |   if (NeedLang) { | 
 | 355 |     Res.push_back("-x"); | 
 | 356 |     Res.push_back(getInputKindName(Opts.Inputs[0].first)); | 
 | 357 |   } | 
 | 358 |   for (unsigned i = 0, e = Opts.Inputs.size(); i != e; ++i) { | 
 | 359 |     assert((!NeedLang || Opts.Inputs[i].first == Opts.Inputs[0].first) && | 
 | 360 |            "Unable to represent this input vector!"); | 
 | 361 |     Res.push_back(Opts.Inputs[i].second); | 
 | 362 |   } | 
 | 363 |  | 
 | 364 |   if (!Opts.OutputFile.empty()) { | 
 | 365 |     Res.push_back("-o"); | 
 | 366 |     Res.push_back(Opts.OutputFile); | 
 | 367 |   } | 
 | 368 |   if (!Opts.ViewClassInheritance.empty()) { | 
 | 369 |     Res.push_back("-cxx-inheritance-view"); | 
 | 370 |     Res.push_back(Opts.ViewClassInheritance); | 
 | 371 |   } | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 372 |   if (!Opts.CodeCompletionAt.FileName.empty()) { | 
 | 373 |     Res.push_back("-code-completion-at"); | 
 | 374 |     Res.push_back(Opts.CodeCompletionAt.FileName + ":" + | 
 | 375 |                   llvm::utostr(Opts.CodeCompletionAt.Line) + ":" + | 
 | 376 |                   llvm::utostr(Opts.CodeCompletionAt.Column)); | 
 | 377 |   } | 
 | 378 |   if (Opts.ProgramAction != frontend::InheritanceView && | 
 | 379 |       Opts.ProgramAction != frontend::PluginAction) | 
 | 380 |     Res.push_back(getActionName(Opts.ProgramAction)); | 
 | 381 |   if (!Opts.ActionName.empty()) { | 
 | 382 |     Res.push_back("-plugin"); | 
 | 383 |     Res.push_back(Opts.ActionName); | 
 | 384 |   } | 
| Daniel Dunbar | efba227 | 2009-12-03 05:11:05 +0000 | [diff] [blame] | 385 |   for (unsigned i = 0, e = Opts.Plugins.size(); i != e; ++i) { | 
 | 386 |     Res.push_back("-load"); | 
 | 387 |     Res.push_back(Opts.Plugins[i]); | 
 | 388 |   } | 
| Douglas Gregor | 9bed879 | 2010-02-09 19:21:46 +0000 | [diff] [blame] | 389 |   for (unsigned i = 0, e = Opts.ASTMergeFiles.size(); i != e; ++i) { | 
 | 390 |     Res.push_back("-ast-merge"); | 
 | 391 |     Res.push_back(Opts.ASTMergeFiles[i]); | 
 | 392 |   } | 
| Daniel Dunbar | 3f87fb0 | 2010-04-15 06:09:03 +0000 | [diff] [blame] | 393 |   for (unsigned i = 0, e = Opts.LLVMArgs.size(); i != e; ++i) { | 
 | 394 |     Res.push_back("-mllvm"); | 
 | 395 |     Res.push_back(Opts.LLVMArgs[i]); | 
 | 396 |   } | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 397 | } | 
 | 398 |  | 
 | 399 | static void HeaderSearchOptsToArgs(const HeaderSearchOptions &Opts, | 
 | 400 |                                    std::vector<std::string> &Res) { | 
| Daniel Dunbar | c59dc92 | 2009-11-19 05:32:21 +0000 | [diff] [blame] | 401 |   if (Opts.Sysroot != "/") { | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 402 |     Res.push_back("-isysroot"); | 
 | 403 |     Res.push_back(Opts.Sysroot); | 
 | 404 |   } | 
 | 405 |  | 
 | 406 |   /// User specified include entries. | 
 | 407 |   for (unsigned i = 0, e = Opts.UserEntries.size(); i != e; ++i) { | 
 | 408 |     const HeaderSearchOptions::Entry &E = Opts.UserEntries[i]; | 
| Daniel Dunbar | d8c7806 | 2009-11-26 02:13:54 +0000 | [diff] [blame] | 409 |     if (E.IsFramework && (E.Group != frontend::Angled || !E.IsUserSupplied)) | 
| Chris Lattner | 83e7a78 | 2010-04-07 22:58:06 +0000 | [diff] [blame] | 410 |       llvm::report_fatal_error("Invalid option set!"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 411 |     if (E.IsUserSupplied) { | 
 | 412 |       if (E.Group == frontend::After) { | 
 | 413 |         Res.push_back("-idirafter"); | 
 | 414 |       } else if (E.Group == frontend::Quoted) { | 
| Daniel Dunbar | d8c7806 | 2009-11-26 02:13:54 +0000 | [diff] [blame] | 415 |         Res.push_back("-iquote"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 416 |       } else if (E.Group == frontend::System) { | 
 | 417 |         Res.push_back("-isystem"); | 
 | 418 |       } else { | 
 | 419 |         assert(E.Group == frontend::Angled && "Invalid group!"); | 
 | 420 |         Res.push_back(E.IsFramework ? "-F" : "-I"); | 
 | 421 |       } | 
 | 422 |     } else { | 
 | 423 |       if (E.Group != frontend::Angled && E.Group != frontend::System) | 
| Chris Lattner | 83e7a78 | 2010-04-07 22:58:06 +0000 | [diff] [blame] | 424 |         llvm::report_fatal_error("Invalid option set!"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 425 |       Res.push_back(E.Group == frontend::Angled ? "-iwithprefixbefore" : | 
 | 426 |                     "-iwithprefix"); | 
 | 427 |     } | 
 | 428 |     Res.push_back(E.Path); | 
 | 429 |   } | 
 | 430 |  | 
 | 431 |   if (!Opts.EnvIncPath.empty()) { | 
 | 432 |     // FIXME: Provide an option for this, and move env detection to driver. | 
| Chris Lattner | 83e7a78 | 2010-04-07 22:58:06 +0000 | [diff] [blame] | 433 |     llvm::report_fatal_error("Not yet implemented!"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 434 |   } | 
 | 435 |   if (!Opts.CEnvIncPath.empty()) { | 
 | 436 |     // FIXME: Provide an option for this, and move env detection to driver. | 
| Chris Lattner | 83e7a78 | 2010-04-07 22:58:06 +0000 | [diff] [blame] | 437 |     llvm::report_fatal_error("Not yet implemented!"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 438 |   } | 
 | 439 |   if (!Opts.ObjCEnvIncPath.empty()) { | 
 | 440 |     // FIXME: Provide an option for this, and move env detection to driver. | 
| Chris Lattner | 83e7a78 | 2010-04-07 22:58:06 +0000 | [diff] [blame] | 441 |     llvm::report_fatal_error("Not yet implemented!"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 442 |   } | 
 | 443 |   if (!Opts.CXXEnvIncPath.empty()) { | 
 | 444 |     // FIXME: Provide an option for this, and move env detection to driver. | 
| Chris Lattner | 83e7a78 | 2010-04-07 22:58:06 +0000 | [diff] [blame] | 445 |     llvm::report_fatal_error("Not yet implemented!"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 446 |   } | 
 | 447 |   if (!Opts.ObjCXXEnvIncPath.empty()) { | 
 | 448 |     // FIXME: Provide an option for this, and move env detection to driver. | 
| Chris Lattner | 83e7a78 | 2010-04-07 22:58:06 +0000 | [diff] [blame] | 449 |     llvm::report_fatal_error("Not yet implemented!"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 450 |   } | 
| Daniel Dunbar | 8b9adfe | 2009-12-15 00:06:45 +0000 | [diff] [blame] | 451 |   if (!Opts.ResourceDir.empty()) { | 
 | 452 |     Res.push_back("-resource-dir"); | 
 | 453 |     Res.push_back(Opts.ResourceDir); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 454 |   } | 
 | 455 |   if (!Opts.UseStandardIncludes) | 
 | 456 |     Res.push_back("-nostdinc"); | 
| Douglas Gregor | 4c2bcad | 2010-03-24 20:13:48 +0000 | [diff] [blame] | 457 |   if (!Opts.UseStandardCXXIncludes) | 
 | 458 |     Res.push_back("-nostdinc++"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 459 |   if (Opts.Verbose) | 
 | 460 |     Res.push_back("-v"); | 
 | 461 | } | 
 | 462 |  | 
 | 463 | static void LangOptsToArgs(const LangOptions &Opts, | 
 | 464 |                            std::vector<std::string> &Res) { | 
 | 465 |   LangOptions DefaultLangOpts; | 
 | 466 |  | 
 | 467 |   // FIXME: Need to set -std to get all the implicit options. | 
 | 468 |  | 
 | 469 |   // FIXME: We want to only pass options relative to the defaults, which | 
 | 470 |   // requires constructing a target. :( | 
 | 471 |   // | 
 | 472 |   // It would be better to push the all target specific choices into the driver, | 
 | 473 |   // so that everything below that was more uniform. | 
 | 474 |  | 
 | 475 |   if (Opts.Trigraphs) | 
 | 476 |     Res.push_back("-trigraphs"); | 
 | 477 |   // Implicit based on the input kind: | 
 | 478 |   //   AsmPreprocessor, CPlusPlus, ObjC1, ObjC2, OpenCL | 
 | 479 |   // Implicit based on the input language standard: | 
 | 480 |   //   BCPLComment, C99, CPlusPlus0x, Digraphs, GNUInline, ImplicitInt, GNUMode | 
 | 481 |   if (Opts.DollarIdents) | 
 | 482 |     Res.push_back("-fdollars-in-identifiers"); | 
| Chandler Carruth | eb5d7b7 | 2010-04-17 20:17:31 +0000 | [diff] [blame] | 483 |   if (Opts.GNUMode && !Opts.GNUKeywords) | 
 | 484 |     Res.push_back("-fno-gnu-keywords"); | 
 | 485 |   if (!Opts.GNUMode && Opts.GNUKeywords) | 
 | 486 |     Res.push_back("-fgnu-keywords"); | 
| Daniel Dunbar | a51ca52 | 2009-11-17 09:15:57 +0000 | [diff] [blame] | 487 |   if (Opts.Microsoft) | 
| Daniel Dunbar | 8663b18 | 2009-12-16 20:10:18 +0000 | [diff] [blame] | 488 |     Res.push_back("-fms-extensions"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 489 |   if (Opts.ObjCNonFragileABI) | 
 | 490 |     Res.push_back("-fobjc-nonfragile-abi"); | 
| Fariborz Jahanian | 412e798 | 2010-02-09 19:31:38 +0000 | [diff] [blame] | 491 |   if (Opts.ObjCNonFragileABI2) | 
 | 492 |     Res.push_back("-fobjc-nonfragile-abi2"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 493 |   // NoInline is implicit. | 
 | 494 |   if (!Opts.CXXOperatorNames) | 
 | 495 |     Res.push_back("-fno-operator-names"); | 
 | 496 |   if (Opts.PascalStrings) | 
 | 497 |     Res.push_back("-fpascal-strings"); | 
| Mike Stump | 9c276ae | 2009-12-12 01:27:46 +0000 | [diff] [blame] | 498 |   if (Opts.CatchUndefined) | 
 | 499 |     Res.push_back("-fcatch-undefined-behavior"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 500 |   if (Opts.WritableStrings) | 
 | 501 |     Res.push_back("-fwritable-strings"); | 
| John McCall | 4b7a834 | 2010-03-15 10:54:44 +0000 | [diff] [blame] | 502 |   if (Opts.ConstStrings) | 
 | 503 |     Res.push_back("-Wwrite-strings"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 504 |   if (!Opts.LaxVectorConversions) | 
 | 505 |     Res.push_back("-fno-lax-vector-conversions"); | 
 | 506 |   if (Opts.AltiVec) | 
 | 507 |     Res.push_back("-faltivec"); | 
| Daniel Dunbar | 1be3b3b | 2009-11-19 20:54:59 +0000 | [diff] [blame] | 508 |   if (Opts.Exceptions) | 
 | 509 |     Res.push_back("-fexceptions"); | 
| Daniel Dunbar | 7348288 | 2010-02-10 18:48:44 +0000 | [diff] [blame] | 510 |   if (Opts.SjLjExceptions) | 
 | 511 |     Res.push_back("-fsjlj-exceptions"); | 
| Mike Stump | de05057 | 2009-12-02 18:57:08 +0000 | [diff] [blame] | 512 |   if (!Opts.RTTI) | 
| Daniel Dunbar | 4db166b | 2009-11-19 05:32:09 +0000 | [diff] [blame] | 513 |     Res.push_back("-fno-rtti"); | 
| Daniel Dunbar | c5a97ec | 2009-11-17 07:07:28 +0000 | [diff] [blame] | 514 |   if (!Opts.NeXTRuntime) | 
 | 515 |     Res.push_back("-fgnu-runtime"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 516 |   if (Opts.Freestanding) | 
 | 517 |     Res.push_back("-ffreestanding"); | 
 | 518 |   if (Opts.NoBuiltin) | 
 | 519 |     Res.push_back("-fno-builtin"); | 
| Nuno Lopes | fc28448 | 2009-12-16 16:59:22 +0000 | [diff] [blame] | 520 |   if (!Opts.AssumeSaneOperatorNew) | 
 | 521 |     Res.push_back("-fno-assume-sane-operator-new"); | 
| Anders Carlsson | a508b7d | 2010-02-06 23:23:06 +0000 | [diff] [blame] | 522 |   if (!Opts.ThreadsafeStatics) | 
 | 523 |     Res.push_back("-fno-threadsafe-statics"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 524 |   if (Opts.POSIXThreads) | 
 | 525 |     Res.push_back("-pthread"); | 
| Daniel Dunbar | a51ca52 | 2009-11-17 09:15:57 +0000 | [diff] [blame] | 526 |   if (Opts.Blocks) | 
| Daniel Dunbar | e50c167 | 2009-11-29 05:52:21 +0000 | [diff] [blame] | 527 |     Res.push_back("-fblocks"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 528 |   if (Opts.EmitAllDecls) | 
 | 529 |     Res.push_back("-femit-all-decls"); | 
| Dan Gohman | c31176d | 2010-01-08 02:20:44 +0000 | [diff] [blame] | 530 |   if (Opts.MathErrno) | 
 | 531 |     Res.push_back("-fmath-errno"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 532 |   if (Opts.OverflowChecking) | 
 | 533 |     Res.push_back("-ftrapv"); | 
 | 534 |   if (Opts.HeinousExtensions) | 
 | 535 |     Res.push_back("-fheinous-gnu-extensions"); | 
 | 536 |   // Optimize is implicit. | 
 | 537 |   // OptimizeSize is implicit. | 
 | 538 |   if (Opts.Static) | 
 | 539 |     Res.push_back("-static-define"); | 
| Daniel Dunbar | fb937b8 | 2010-04-15 15:06:22 +0000 | [diff] [blame] | 540 |   if (Opts.DumpRecordLayouts) | 
 | 541 |     Res.push_back("-fdump-record-layouts"); | 
| Anders Carlsson | 046c294 | 2010-04-17 20:15:18 +0000 | [diff] [blame] | 542 |   if (Opts.DumpVTableLayouts) | 
| Daniel Dunbar | fb937b8 | 2010-04-15 15:06:22 +0000 | [diff] [blame] | 543 |     Res.push_back("-fdump-vtable-layouts"); | 
 | 544 |   if (Opts.NoBitFieldTypeAlign) | 
 | 545 |     Res.push_back("-fno-bitfield-type-alignment"); | 
 | 546 |   if (Opts.SjLjExceptions) | 
 | 547 |     Res.push_back("-fsjlj-exceptions"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 548 |   if (Opts.PICLevel) { | 
 | 549 |     Res.push_back("-pic-level"); | 
 | 550 |     Res.push_back(llvm::utostr(Opts.PICLevel)); | 
 | 551 |   } | 
 | 552 |   if (Opts.ObjCGCBitmapPrint) | 
 | 553 |     Res.push_back("-print-ivar-layout"); | 
| Fariborz Jahanian | 33e982b | 2010-04-22 20:26:39 +0000 | [diff] [blame] | 554 |   if (Opts.NoConstantCFStrings) | 
 | 555 |     Res.push_back("-fno-constant-cfstrings"); | 
| John McCall | 7002f4c | 2010-04-09 19:03:51 +0000 | [diff] [blame] | 556 |   if (!Opts.AccessControl) | 
 | 557 |     Res.push_back("-fno-access-control"); | 
| Daniel Dunbar | 1be3b3b | 2009-11-19 20:54:59 +0000 | [diff] [blame] | 558 |   if (!Opts.CharIsSigned) | 
| Daniel Dunbar | e50c167 | 2009-11-29 05:52:21 +0000 | [diff] [blame] | 559 |     Res.push_back("-fno-signed-char"); | 
| Daniel Dunbar | 1be3b3b | 2009-11-19 20:54:59 +0000 | [diff] [blame] | 560 |   if (Opts.ShortWChar) | 
 | 561 |     Res.push_back("-fshort-wchar"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 562 |   if (!Opts.ElideConstructors) | 
 | 563 |     Res.push_back("-fno-elide-constructors"); | 
 | 564 |   if (Opts.getGCMode() != LangOptions::NonGC) { | 
 | 565 |     if (Opts.getGCMode() == LangOptions::HybridGC) { | 
 | 566 |       Res.push_back("-fobjc-gc"); | 
 | 567 |     } else { | 
 | 568 |       assert(Opts.getGCMode() == LangOptions::GCOnly && "Invalid GC mode!"); | 
 | 569 |       Res.push_back("-fobjc-gc-only"); | 
 | 570 |     } | 
 | 571 |   } | 
 | 572 |   if (Opts.getVisibilityMode() != LangOptions::Default) { | 
 | 573 |     Res.push_back("-fvisibility"); | 
 | 574 |     if (Opts.getVisibilityMode() == LangOptions::Hidden) { | 
| Daniel Dunbar | 1be3b3b | 2009-11-19 20:54:59 +0000 | [diff] [blame] | 575 |       Res.push_back("hidden"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 576 |     } else { | 
 | 577 |       assert(Opts.getVisibilityMode() == LangOptions::Protected && | 
 | 578 |              "Invalid visibility!"); | 
 | 579 |       Res.push_back("protected"); | 
 | 580 |     } | 
 | 581 |   } | 
 | 582 |   if (Opts.getStackProtectorMode() != 0) { | 
 | 583 |     Res.push_back("-stack-protector"); | 
 | 584 |     Res.push_back(llvm::utostr(Opts.getStackProtectorMode())); | 
 | 585 |   } | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 586 |   if (Opts.InstantiationDepth != DefaultLangOpts.InstantiationDepth) { | 
 | 587 |     Res.push_back("-ftemplate-depth"); | 
 | 588 |     Res.push_back(llvm::utostr(Opts.InstantiationDepth)); | 
 | 589 |   } | 
| Daniel Dunbar | 1b09695 | 2009-11-29 02:38:47 +0000 | [diff] [blame] | 590 |   if (!Opts.ObjCConstantStringClass.empty()) { | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 591 |     Res.push_back("-fconstant-string-class"); | 
 | 592 |     Res.push_back(Opts.ObjCConstantStringClass); | 
 | 593 |   } | 
 | 594 | } | 
 | 595 |  | 
 | 596 | static void PreprocessorOptsToArgs(const PreprocessorOptions &Opts, | 
 | 597 |                                    std::vector<std::string> &Res) { | 
 | 598 |   for (unsigned i = 0, e = Opts.Macros.size(); i != e; ++i) | 
| Daniel Dunbar | 0ff679f | 2009-11-26 02:14:07 +0000 | [diff] [blame] | 599 |     Res.push_back(std::string(Opts.Macros[i].second ? "-U" : "-D") + | 
 | 600 |                   Opts.Macros[i].first); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 601 |   for (unsigned i = 0, e = Opts.Includes.size(); i != e; ++i) { | 
| Daniel Dunbar | 0ff679f | 2009-11-26 02:14:07 +0000 | [diff] [blame] | 602 |     // FIXME: We need to avoid reincluding the implicit PCH and PTH includes. | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 603 |     Res.push_back("-include"); | 
 | 604 |     Res.push_back(Opts.Includes[i]); | 
 | 605 |   } | 
 | 606 |   for (unsigned i = 0, e = Opts.MacroIncludes.size(); i != e; ++i) { | 
 | 607 |     Res.push_back("-imacros"); | 
| Daniel Dunbar | 0ff679f | 2009-11-26 02:14:07 +0000 | [diff] [blame] | 608 |     Res.push_back(Opts.MacroIncludes[i]); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 609 |   } | 
 | 610 |   if (!Opts.UsePredefines) | 
 | 611 |     Res.push_back("-undef"); | 
| Douglas Gregor | 94dc8f6 | 2010-03-19 16:15:56 +0000 | [diff] [blame] | 612 |   if (Opts.DetailedRecord) | 
 | 613 |     Res.push_back("-detailed-preprocessing-record"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 614 |   if (!Opts.ImplicitPCHInclude.empty()) { | 
| Daniel Dunbar | 0ff679f | 2009-11-26 02:14:07 +0000 | [diff] [blame] | 615 |     Res.push_back("-include-pch"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 616 |     Res.push_back(Opts.ImplicitPCHInclude); | 
 | 617 |   } | 
 | 618 |   if (!Opts.ImplicitPTHInclude.empty()) { | 
| Daniel Dunbar | 0ff679f | 2009-11-26 02:14:07 +0000 | [diff] [blame] | 619 |     Res.push_back("-include-pth"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 620 |     Res.push_back(Opts.ImplicitPTHInclude); | 
 | 621 |   } | 
 | 622 |   if (!Opts.TokenCache.empty()) { | 
| Daniel Dunbar | 0ff679f | 2009-11-26 02:14:07 +0000 | [diff] [blame] | 623 |     if (Opts.ImplicitPTHInclude.empty()) { | 
 | 624 |       Res.push_back("-token-cache"); | 
 | 625 |       Res.push_back(Opts.TokenCache); | 
 | 626 |     } else | 
 | 627 |       assert(Opts.ImplicitPTHInclude == Opts.TokenCache && | 
 | 628 |              "Unsupported option combination!"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 629 |   } | 
| Daniel Dunbar | e14b5f5 | 2009-12-03 05:11:16 +0000 | [diff] [blame] | 630 |   for (unsigned i = 0, e = Opts.RemappedFiles.size(); i != e; ++i) { | 
 | 631 |     Res.push_back("-remap-file"); | 
 | 632 |     Res.push_back(Opts.RemappedFiles[i].first + ";" + | 
 | 633 |                   Opts.RemappedFiles[i].second); | 
 | 634 |   } | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 635 | } | 
 | 636 |  | 
 | 637 | static void PreprocessorOutputOptsToArgs(const PreprocessorOutputOptions &Opts, | 
 | 638 |                                          std::vector<std::string> &Res) { | 
 | 639 |   if (!Opts.ShowCPP && !Opts.ShowMacros) | 
| Chris Lattner | 83e7a78 | 2010-04-07 22:58:06 +0000 | [diff] [blame] | 640 |     llvm::report_fatal_error("Invalid option combination!"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 641 |  | 
 | 642 |   if (Opts.ShowCPP && Opts.ShowMacros) | 
 | 643 |     Res.push_back("-dD"); | 
 | 644 |   else if (!Opts.ShowCPP && Opts.ShowMacros) | 
 | 645 |     Res.push_back("-dM"); | 
 | 646 |  | 
 | 647 |   if (!Opts.ShowLineMarkers) | 
 | 648 |     Res.push_back("-P"); | 
 | 649 |   if (Opts.ShowComments) | 
 | 650 |     Res.push_back("-C"); | 
 | 651 |   if (Opts.ShowMacroComments) | 
 | 652 |     Res.push_back("-CC"); | 
 | 653 | } | 
 | 654 |  | 
 | 655 | static void TargetOptsToArgs(const TargetOptions &Opts, | 
 | 656 |                              std::vector<std::string> &Res) { | 
 | 657 |   Res.push_back("-triple"); | 
 | 658 |   Res.push_back(Opts.Triple); | 
 | 659 |   if (!Opts.CPU.empty()) { | 
| Daniel Dunbar | 38b48af | 2009-12-18 06:30:12 +0000 | [diff] [blame] | 660 |     Res.push_back("-target-cpu"); | 
| Daniel Dunbar | b3375cb | 2009-11-17 06:02:29 +0000 | [diff] [blame] | 661 |     Res.push_back(Opts.CPU); | 
 | 662 |   } | 
 | 663 |   if (!Opts.ABI.empty()) { | 
 | 664 |     Res.push_back("-target-abi"); | 
 | 665 |     Res.push_back(Opts.ABI); | 
 | 666 |   } | 
 | 667 |   for (unsigned i = 0, e = Opts.Features.size(); i != e; ++i) { | 
 | 668 |     Res.push_back("-target-feature"); | 
 | 669 |     Res.push_back(Opts.Features[i]); | 
 | 670 |   } | 
 | 671 | } | 
 | 672 |  | 
 | 673 | void CompilerInvocation::toArgs(std::vector<std::string> &Res) { | 
 | 674 |   AnalyzerOptsToArgs(getAnalyzerOpts(), Res); | 
 | 675 |   CodeGenOptsToArgs(getCodeGenOpts(), Res); | 
 | 676 |   DependencyOutputOptsToArgs(getDependencyOutputOpts(), Res); | 
 | 677 |   DiagnosticOptsToArgs(getDiagnosticOpts(), Res); | 
 | 678 |   FrontendOptsToArgs(getFrontendOpts(), Res); | 
 | 679 |   HeaderSearchOptsToArgs(getHeaderSearchOpts(), Res); | 
 | 680 |   LangOptsToArgs(getLangOpts(), Res); | 
 | 681 |   PreprocessorOptsToArgs(getPreprocessorOpts(), Res); | 
 | 682 |   PreprocessorOutputOptsToArgs(getPreprocessorOutputOpts(), Res); | 
 | 683 |   TargetOptsToArgs(getTargetOpts(), Res); | 
 | 684 | } | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 685 |  | 
 | 686 | //===----------------------------------------------------------------------===// | 
 | 687 | // Deserialization (to args) | 
 | 688 | //===----------------------------------------------------------------------===// | 
 | 689 |  | 
 | 690 | using namespace clang::driver; | 
 | 691 | using namespace clang::driver::cc1options; | 
 | 692 |  | 
 | 693 | static llvm::StringRef getLastArgValue(ArgList &Args, cc1options::ID ID, | 
 | 694 |                                        llvm::StringRef Default = "") { | 
 | 695 |   if (Arg *A = Args.getLastArg(ID)) | 
 | 696 |     return A->getValue(Args); | 
 | 697 |   return Default; | 
 | 698 | } | 
 | 699 |  | 
 | 700 | static int getLastArgIntValue(ArgList &Args, cc1options::ID ID, | 
 | 701 |                               int Default, Diagnostic &Diags) { | 
 | 702 |   Arg *A = Args.getLastArg(ID); | 
 | 703 |   if (!A) | 
 | 704 |     return Default; | 
 | 705 |  | 
 | 706 |   int Res = Default; | 
 | 707 |   if (llvm::StringRef(A->getValue(Args)).getAsInteger(10, Res)) | 
 | 708 |     Diags.Report(diag::err_drv_invalid_int_value) | 
 | 709 |         << A->getAsString(Args) << A->getValue(Args); | 
 | 710 |  | 
 | 711 |   return Res; | 
 | 712 | } | 
 | 713 |  | 
 | 714 | static std::vector<std::string> | 
 | 715 | getAllArgValues(ArgList &Args, cc1options::ID ID) { | 
 | 716 |   llvm::SmallVector<const char *, 16> Values; | 
 | 717 |   Args.AddAllArgValues(Values, ID); | 
 | 718 |   return std::vector<std::string>(Values.begin(), Values.end()); | 
 | 719 | } | 
 | 720 |  | 
 | 721 | // | 
 | 722 |  | 
 | 723 | static void ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args, | 
 | 724 |                               Diagnostic &Diags) { | 
 | 725 |   using namespace cc1options; | 
 | 726 |  | 
 | 727 |   Opts.AnalysisList.clear(); | 
 | 728 | #define ANALYSIS(NAME, CMDFLAG, DESC, SCOPE) \ | 
 | 729 |   if (Args.hasArg(OPT_analysis_##NAME)) Opts.AnalysisList.push_back(NAME); | 
 | 730 | #include "clang/Frontend/Analyses.def" | 
 | 731 |  | 
 | 732 |   if (Arg *A = Args.getLastArg(OPT_analyzer_store)) { | 
 | 733 |     llvm::StringRef Name = A->getValue(Args); | 
 | 734 |     AnalysisStores Value = llvm::StringSwitch<AnalysisStores>(Name) | 
 | 735 | #define ANALYSIS_STORE(NAME, CMDFLAG, DESC, CREATFN) \ | 
 | 736 |       .Case(CMDFLAG, NAME##Model) | 
 | 737 | #include "clang/Frontend/Analyses.def" | 
 | 738 |       .Default(NumStores); | 
 | 739 |     // FIXME: Error handling. | 
 | 740 |     if (Value == NumStores) | 
 | 741 |       Diags.Report(diag::err_drv_invalid_value) | 
 | 742 |         << Args.getLastArg(OPT_O)->getAsString(Args) << Name; | 
 | 743 |     else | 
 | 744 |       Opts.AnalysisStoreOpt = Value; | 
 | 745 |   } | 
 | 746 |  | 
 | 747 |   if (Arg *A = Args.getLastArg(OPT_analyzer_constraints)) { | 
 | 748 |     llvm::StringRef Name = A->getValue(Args); | 
 | 749 |     AnalysisConstraints Value = llvm::StringSwitch<AnalysisConstraints>(Name) | 
 | 750 | #define ANALYSIS_CONSTRAINTS(NAME, CMDFLAG, DESC, CREATFN) \ | 
 | 751 |       .Case(CMDFLAG, NAME##Model) | 
 | 752 | #include "clang/Frontend/Analyses.def" | 
 | 753 |       .Default(NumConstraints); | 
 | 754 |     // FIXME: Error handling. | 
 | 755 |     if (Value == NumConstraints) | 
 | 756 |       Diags.Report(diag::err_drv_invalid_value) | 
 | 757 |         << Args.getLastArg(OPT_O)->getAsString(Args) << Name; | 
 | 758 |     else | 
 | 759 |       Opts.AnalysisConstraintsOpt = Value; | 
 | 760 |   } | 
 | 761 |  | 
 | 762 |   if (Arg *A = Args.getLastArg(OPT_analyzer_output)) { | 
 | 763 |     llvm::StringRef Name = A->getValue(Args); | 
 | 764 |     AnalysisDiagClients Value = llvm::StringSwitch<AnalysisDiagClients>(Name) | 
 | 765 | #define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN, AUTOCREAT) \ | 
 | 766 |       .Case(CMDFLAG, PD_##NAME) | 
 | 767 | #include "clang/Frontend/Analyses.def" | 
 | 768 |       .Default(NUM_ANALYSIS_DIAG_CLIENTS); | 
 | 769 |     // FIXME: Error handling. | 
 | 770 |     if (Value == NUM_ANALYSIS_DIAG_CLIENTS) | 
 | 771 |       Diags.Report(diag::err_drv_invalid_value) | 
 | 772 |         << Args.getLastArg(OPT_O)->getAsString(Args) << Name; | 
 | 773 |     else | 
 | 774 |       Opts.AnalysisDiagOpt = Value; | 
 | 775 |   } | 
 | 776 |  | 
 | 777 |   Opts.VisualizeEGDot = Args.hasArg(OPT_analyzer_viz_egraph_graphviz); | 
 | 778 |   Opts.VisualizeEGUbi = Args.hasArg(OPT_analyzer_viz_egraph_ubigraph); | 
 | 779 |   Opts.AnalyzeAll = Args.hasArg(OPT_analyzer_opt_analyze_headers); | 
 | 780 |   Opts.AnalyzerDisplayProgress = Args.hasArg(OPT_analyzer_display_progress); | 
| Ted Kremenek | fc57651 | 2009-12-07 22:06:12 +0000 | [diff] [blame] | 781 |   Opts.AnalyzeNestedBlocks = | 
 | 782 |     Args.hasArg(OPT_analyzer_opt_analyze_nested_blocks); | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 783 |   Opts.PurgeDead = !Args.hasArg(OPT_analyzer_no_purge_dead); | 
 | 784 |   Opts.EagerlyAssume = Args.hasArg(OPT_analyzer_eagerly_assume); | 
 | 785 |   Opts.AnalyzeSpecificFunction = getLastArgValue(Args, OPT_analyze_function); | 
 | 786 |   Opts.EnableExperimentalChecks = Args.hasArg(OPT_analyzer_experimental_checks); | 
 | 787 |   Opts.EnableExperimentalInternalChecks = | 
 | 788 |     Args.hasArg(OPT_analyzer_experimental_internal_checks); | 
 | 789 |   Opts.TrimGraph = Args.hasArg(OPT_trim_egraph); | 
| Zhongxing Xu | c09289d | 2010-04-13 06:44:31 +0000 | [diff] [blame] | 790 |   Opts.MaxNodes = getLastArgIntValue(Args, OPT_analyzer_max_nodes,150000,Diags); | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 791 | } | 
 | 792 |  | 
 | 793 | static void ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, | 
 | 794 |                              Diagnostic &Diags) { | 
 | 795 |   using namespace cc1options; | 
 | 796 |   // -Os implies -O2 | 
 | 797 |   if (Args.hasArg(OPT_Os)) | 
 | 798 |     Opts.OptimizationLevel = 2; | 
 | 799 |   else { | 
 | 800 |     Opts.OptimizationLevel = getLastArgIntValue(Args, OPT_O, 0, Diags); | 
 | 801 |     if (Opts.OptimizationLevel > 3) { | 
 | 802 |       Diags.Report(diag::err_drv_invalid_value) | 
 | 803 |         << Args.getLastArg(OPT_O)->getAsString(Args) << Opts.OptimizationLevel; | 
 | 804 |       Opts.OptimizationLevel = 3; | 
 | 805 |     } | 
 | 806 |   } | 
 | 807 |  | 
 | 808 |   // We must always run at least the always inlining pass. | 
 | 809 |   Opts.Inlining = (Opts.OptimizationLevel > 1) ? CodeGenOptions::NormalInlining | 
 | 810 |     : CodeGenOptions::OnlyAlwaysInlining; | 
 | 811 |  | 
 | 812 |   Opts.DebugInfo = Args.hasArg(OPT_g); | 
 | 813 |   Opts.DisableLLVMOpts = Args.hasArg(OPT_disable_llvm_optzns); | 
 | 814 |   Opts.DisableRedZone = Args.hasArg(OPT_disable_red_zone); | 
| Daniel Dunbar | f2d8b9f | 2009-12-18 02:43:17 +0000 | [diff] [blame] | 815 |   Opts.DwarfDebugFlags = getLastArgValue(Args, OPT_dwarf_debug_flags); | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 816 |   Opts.MergeAllConstants = !Args.hasArg(OPT_fno_merge_all_constants); | 
 | 817 |   Opts.NoCommon = Args.hasArg(OPT_fno_common); | 
 | 818 |   Opts.NoImplicitFloat = Args.hasArg(OPT_no_implicit_float); | 
 | 819 |   Opts.OptimizeSize = Args.hasArg(OPT_Os); | 
 | 820 |   Opts.UnrollLoops = (Opts.OptimizationLevel > 1 && !Opts.OptimizeSize); | 
 | 821 |  | 
 | 822 |   Opts.AsmVerbose = Args.hasArg(OPT_masm_verbose); | 
| Daniel Dunbar | efb0fa9 | 2010-03-20 04:15:41 +0000 | [diff] [blame] | 823 |   Opts.CXAAtExit = !Args.hasArg(OPT_fno_use_cxa_atexit); | 
 | 824 |   Opts.CXXCtorDtorAliases = Args.hasArg(OPT_mconstructor_aliases); | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 825 |   Opts.CodeModel = getLastArgValue(Args, OPT_mcode_model); | 
 | 826 |   Opts.DebugPass = getLastArgValue(Args, OPT_mdebug_pass); | 
 | 827 |   Opts.DisableFPElim = Args.hasArg(OPT_mdisable_fp_elim); | 
 | 828 |   Opts.FloatABI = getLastArgValue(Args, OPT_mfloat_abi); | 
 | 829 |   Opts.LimitFloatPrecision = getLastArgValue(Args, OPT_mlimit_float_precision); | 
 | 830 |   Opts.NoZeroInitializedInBSS = Args.hasArg(OPT_mno_zero_initialized_in_bss); | 
 | 831 |   Opts.SoftFloat = Args.hasArg(OPT_msoft_float); | 
 | 832 |   Opts.UnwindTables = Args.hasArg(OPT_munwind_tables); | 
 | 833 |   Opts.RelocationModel = getLastArgValue(Args, OPT_mrelocation_model, "pic"); | 
 | 834 |  | 
| Chris Lattner | bbea716 | 2010-04-13 00:38:24 +0000 | [diff] [blame] | 835 |   Opts.FunctionSections = Args.hasArg(OPT_ffunction_sections); | 
 | 836 |   Opts.DataSections = Args.hasArg(OPT_fdata_sections); | 
 | 837 |  | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 838 |   Opts.MainFileName = getLastArgValue(Args, OPT_main_file_name); | 
| John McCall | 824e19e | 2010-02-12 23:47:27 +0000 | [diff] [blame] | 839 |   Opts.VerifyModule = !Args.hasArg(OPT_disable_llvm_verifier); | 
| Daniel Dunbar | f643b9b | 2010-04-24 17:56:46 +0000 | [diff] [blame^] | 840 |  | 
 | 841 |   if (Arg *A = Args.getLastArg(OPT_fobjc_dispatch_method_EQ)) { | 
 | 842 |     llvm::StringRef Name = A->getValue(Args); | 
 | 843 |     unsigned Method = llvm::StringSwitch<unsigned>(Name) | 
 | 844 |       .Case("legacy", CodeGenOptions::Legacy) | 
 | 845 |       .Case("non-legacy", CodeGenOptions::NonLegacy) | 
 | 846 |       .Case("mixed", CodeGenOptions::Mixed) | 
 | 847 |       .Default(~0U); | 
 | 848 |     if (Method == ~0U) | 
 | 849 |       Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name; | 
 | 850 |     else | 
 | 851 |       Opts.ObjCDispatchMethod = Method; | 
 | 852 |   } | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 853 | } | 
 | 854 |  | 
 | 855 | static void ParseDependencyOutputArgs(DependencyOutputOptions &Opts, | 
 | 856 |                                       ArgList &Args) { | 
 | 857 |   using namespace cc1options; | 
 | 858 |   Opts.OutputFile = getLastArgValue(Args, OPT_dependency_file); | 
 | 859 |   Opts.Targets = getAllArgValues(Args, OPT_MT); | 
 | 860 |   Opts.IncludeSystemHeaders = Args.hasArg(OPT_sys_header_deps); | 
 | 861 |   Opts.UsePhonyTargets = Args.hasArg(OPT_MP); | 
 | 862 | } | 
 | 863 |  | 
 | 864 | static void ParseDiagnosticArgs(DiagnosticOptions &Opts, ArgList &Args, | 
 | 865 |                                 Diagnostic &Diags) { | 
 | 866 |   using namespace cc1options; | 
 | 867 |   Opts.IgnoreWarnings = Args.hasArg(OPT_w); | 
 | 868 |   Opts.NoRewriteMacros = Args.hasArg(OPT_Wno_rewrite_macros); | 
 | 869 |   Opts.Pedantic = Args.hasArg(OPT_pedantic); | 
 | 870 |   Opts.PedanticErrors = Args.hasArg(OPT_pedantic_errors); | 
 | 871 |   Opts.ShowCarets = !Args.hasArg(OPT_fno_caret_diagnostics); | 
 | 872 |   Opts.ShowColors = Args.hasArg(OPT_fcolor_diagnostics); | 
 | 873 |   Opts.ShowColumn = !Args.hasArg(OPT_fno_show_column); | 
 | 874 |   Opts.ShowFixits = !Args.hasArg(OPT_fno_diagnostics_fixit_info); | 
 | 875 |   Opts.ShowLocation = !Args.hasArg(OPT_fno_show_source_location); | 
 | 876 |   Opts.ShowOptionNames = Args.hasArg(OPT_fdiagnostics_show_option); | 
 | 877 |   Opts.ShowSourceRanges = Args.hasArg(OPT_fdiagnostics_print_source_range_info); | 
 | 878 |   Opts.VerifyDiagnostics = Args.hasArg(OPT_verify); | 
| Douglas Gregor | d93256e | 2010-01-28 06:00:51 +0000 | [diff] [blame] | 879 |   Opts.BinaryOutput = Args.hasArg(OPT_fdiagnostics_binary); | 
| Chris Lattner | c100214 | 2010-04-07 20:37:06 +0000 | [diff] [blame] | 880 |   Opts.ErrorLimit = getLastArgIntValue(Args, OPT_ferror_limit, 0, Diags); | 
| Douglas Gregor | 575cf37 | 2010-04-20 07:18:24 +0000 | [diff] [blame] | 881 |   Opts.TemplateBacktraceLimit | 
 | 882 |     = getLastArgIntValue(Args, OPT_ftemplate_backtrace_limit, 0, Diags); | 
| Chris Lattner | 52388f9 | 2010-01-13 03:06:50 +0000 | [diff] [blame] | 883 |   Opts.TabStop = getLastArgIntValue(Args, OPT_ftabstop, | 
 | 884 |                                     DiagnosticOptions::DefaultTabStop, Diags); | 
 | 885 |   if (Opts.TabStop == 0 || Opts.TabStop > DiagnosticOptions::MaxTabStop) { | 
 | 886 |     Diags.Report(diag::warn_ignoring_ftabstop_value) | 
 | 887 |       << Opts.TabStop << DiagnosticOptions::DefaultTabStop; | 
 | 888 |     Opts.TabStop = DiagnosticOptions::DefaultTabStop; | 
 | 889 |   } | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 890 |   Opts.MessageLength = getLastArgIntValue(Args, OPT_fmessage_length, 0, Diags); | 
 | 891 |   Opts.DumpBuildInformation = getLastArgValue(Args, OPT_dump_build_information); | 
 | 892 |   Opts.Warnings = getAllArgValues(Args, OPT_W); | 
 | 893 | } | 
 | 894 |  | 
 | 895 | static FrontendOptions::InputKind | 
 | 896 | ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args, Diagnostic &Diags) { | 
 | 897 |   using namespace cc1options; | 
 | 898 |   Opts.ProgramAction = frontend::ParseSyntaxOnly; | 
 | 899 |   if (const Arg *A = Args.getLastArg(OPT_Action_Group)) { | 
 | 900 |     switch (A->getOption().getID()) { | 
 | 901 |     default: | 
 | 902 |       assert(0 && "Invalid option in group!"); | 
 | 903 |     case OPT_ast_dump: | 
 | 904 |       Opts.ProgramAction = frontend::ASTDump; break; | 
 | 905 |     case OPT_ast_print: | 
 | 906 |       Opts.ProgramAction = frontend::ASTPrint; break; | 
 | 907 |     case OPT_ast_print_xml: | 
 | 908 |       Opts.ProgramAction = frontend::ASTPrintXML; break; | 
 | 909 |     case OPT_ast_view: | 
 | 910 |       Opts.ProgramAction = frontend::ASTView; break; | 
 | 911 |     case OPT_dump_raw_tokens: | 
 | 912 |       Opts.ProgramAction = frontend::DumpRawTokens; break; | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 913 |     case OPT_dump_tokens: | 
 | 914 |       Opts.ProgramAction = frontend::DumpTokens; break; | 
 | 915 |     case OPT_S: | 
 | 916 |       Opts.ProgramAction = frontend::EmitAssembly; break; | 
 | 917 |     case OPT_emit_llvm_bc: | 
 | 918 |       Opts.ProgramAction = frontend::EmitBC; break; | 
 | 919 |     case OPT_emit_html: | 
 | 920 |       Opts.ProgramAction = frontend::EmitHTML; break; | 
 | 921 |     case OPT_emit_llvm: | 
 | 922 |       Opts.ProgramAction = frontend::EmitLLVM; break; | 
 | 923 |     case OPT_emit_llvm_only: | 
 | 924 |       Opts.ProgramAction = frontend::EmitLLVMOnly; break; | 
| Daniel Dunbar | da1573f | 2010-02-03 01:18:43 +0000 | [diff] [blame] | 925 |     case OPT_emit_obj: | 
 | 926 |       Opts.ProgramAction = frontend::EmitObj; break; | 
| Nick Lewycky | ba5f6ec | 2010-04-24 01:30:46 +0000 | [diff] [blame] | 927 |     case OPT_fixit_EQ: | 
 | 928 |       Opts.FixItSuffix = A->getValue(Args); | 
 | 929 |       // fall-through! | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 930 |     case OPT_fixit: | 
 | 931 |       Opts.ProgramAction = frontend::FixIt; break; | 
 | 932 |     case OPT_emit_pch: | 
 | 933 |       Opts.ProgramAction = frontend::GeneratePCH; break; | 
 | 934 |     case OPT_emit_pth: | 
 | 935 |       Opts.ProgramAction = frontend::GeneratePTH; break; | 
| Daniel Dunbar | 2758595 | 2010-03-19 19:44:04 +0000 | [diff] [blame] | 936 |     case OPT_init_only: | 
 | 937 |       Opts.ProgramAction = frontend::InitOnly; break; | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 938 |     case OPT_parse_noop: | 
 | 939 |       Opts.ProgramAction = frontend::ParseNoop; break; | 
 | 940 |     case OPT_parse_print_callbacks: | 
 | 941 |       Opts.ProgramAction = frontend::ParsePrintCallbacks; break; | 
 | 942 |     case OPT_fsyntax_only: | 
 | 943 |       Opts.ProgramAction = frontend::ParseSyntaxOnly; break; | 
 | 944 |     case OPT_print_decl_contexts: | 
 | 945 |       Opts.ProgramAction = frontend::PrintDeclContext; break; | 
 | 946 |     case OPT_E: | 
 | 947 |       Opts.ProgramAction = frontend::PrintPreprocessedInput; break; | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 948 |     case OPT_rewrite_macros: | 
 | 949 |       Opts.ProgramAction = frontend::RewriteMacros; break; | 
 | 950 |     case OPT_rewrite_objc: | 
 | 951 |       Opts.ProgramAction = frontend::RewriteObjC; break; | 
 | 952 |     case OPT_rewrite_test: | 
 | 953 |       Opts.ProgramAction = frontend::RewriteTest; break; | 
 | 954 |     case OPT_analyze: | 
 | 955 |       Opts.ProgramAction = frontend::RunAnalysis; break; | 
 | 956 |     case OPT_Eonly: | 
 | 957 |       Opts.ProgramAction = frontend::RunPreprocessorOnly; break; | 
 | 958 |     } | 
 | 959 |   } | 
 | 960 |   if (const Arg *A = Args.getLastArg(OPT_plugin)) { | 
 | 961 |     Opts.ProgramAction = frontend::PluginAction; | 
 | 962 |     Opts.ActionName = A->getValue(Args); | 
 | 963 |   } | 
 | 964 |  | 
 | 965 |   if (const Arg *A = Args.getLastArg(OPT_code_completion_at)) { | 
 | 966 |     Opts.CodeCompletionAt = | 
 | 967 |       ParsedSourceLocation::FromString(A->getValue(Args)); | 
 | 968 |     if (Opts.CodeCompletionAt.FileName.empty()) | 
 | 969 |       Diags.Report(diag::err_drv_invalid_value) | 
 | 970 |         << A->getAsString(Args) << A->getValue(Args); | 
 | 971 |   } | 
 | 972 |   Opts.DebugCodeCompletionPrinter = | 
 | 973 |     !Args.hasArg(OPT_no_code_completion_debug_printer); | 
 | 974 |   Opts.DisableFree = Args.hasArg(OPT_disable_free); | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 975 |  | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 976 |   Opts.OutputFile = getLastArgValue(Args, OPT_o); | 
| Daniel Dunbar | efba227 | 2009-12-03 05:11:05 +0000 | [diff] [blame] | 977 |   Opts.Plugins = getAllArgValues(Args, OPT_load); | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 978 |   Opts.RelocatablePCH = Args.hasArg(OPT_relocatable_pch); | 
| Daniel Dunbar | 9b5e9ae | 2009-12-03 07:01:58 +0000 | [diff] [blame] | 979 |   Opts.ShowHelp = Args.hasArg(OPT_help); | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 980 |   Opts.ShowMacrosInCodeCompletion = Args.hasArg(OPT_code_completion_macros); | 
 | 981 |   Opts.ShowStats = Args.hasArg(OPT_print_stats); | 
 | 982 |   Opts.ShowTimers = Args.hasArg(OPT_ftime_report); | 
| Daniel Dunbar | 9b5e9ae | 2009-12-03 07:01:58 +0000 | [diff] [blame] | 983 |   Opts.ShowVersion = Args.hasArg(OPT_version); | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 984 |   Opts.ViewClassInheritance = getLastArgValue(Args, OPT_cxx_inheritance_view); | 
| Douglas Gregor | 9bed879 | 2010-02-09 19:21:46 +0000 | [diff] [blame] | 985 |   Opts.ASTMergeFiles = getAllArgValues(Args, OPT_ast_merge); | 
| Daniel Dunbar | 3f87fb0 | 2010-04-15 06:09:03 +0000 | [diff] [blame] | 986 |   Opts.LLVMArgs = getAllArgValues(Args, OPT_mllvm); | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 987 |  | 
 | 988 |   FrontendOptions::InputKind DashX = FrontendOptions::IK_None; | 
 | 989 |   if (const Arg *A = Args.getLastArg(OPT_x)) { | 
 | 990 |     DashX = llvm::StringSwitch<FrontendOptions::InputKind>(A->getValue(Args)) | 
 | 991 |       .Case("c", FrontendOptions::IK_C) | 
 | 992 |       .Case("cl", FrontendOptions::IK_OpenCL) | 
 | 993 |       .Case("c", FrontendOptions::IK_C) | 
 | 994 |       .Case("cl", FrontendOptions::IK_OpenCL) | 
 | 995 |       .Case("c++", FrontendOptions::IK_CXX) | 
 | 996 |       .Case("objective-c", FrontendOptions::IK_ObjC) | 
 | 997 |       .Case("objective-c++", FrontendOptions::IK_ObjCXX) | 
 | 998 |       .Case("cpp-output", FrontendOptions::IK_PreprocessedC) | 
 | 999 |       .Case("assembler-with-cpp", FrontendOptions::IK_Asm) | 
 | 1000 |       .Case("c++-cpp-output", FrontendOptions::IK_PreprocessedCXX) | 
 | 1001 |       .Case("objective-c-cpp-output", FrontendOptions::IK_PreprocessedObjC) | 
 | 1002 |       .Case("objective-c++-cpp-output", FrontendOptions::IK_PreprocessedObjCXX) | 
 | 1003 |       .Case("c-header", FrontendOptions::IK_C) | 
 | 1004 |       .Case("objective-c-header", FrontendOptions::IK_ObjC) | 
 | 1005 |       .Case("c++-header", FrontendOptions::IK_CXX) | 
 | 1006 |       .Case("objective-c++-header", FrontendOptions::IK_ObjCXX) | 
 | 1007 |       .Case("ast", FrontendOptions::IK_AST) | 
 | 1008 |       .Default(FrontendOptions::IK_None); | 
 | 1009 |     if (DashX == FrontendOptions::IK_None) | 
 | 1010 |       Diags.Report(diag::err_drv_invalid_value) | 
 | 1011 |         << A->getAsString(Args) << A->getValue(Args); | 
 | 1012 |   } | 
 | 1013 |  | 
 | 1014 |   // '-' is the default input if none is given. | 
 | 1015 |   std::vector<std::string> Inputs = getAllArgValues(Args, OPT_INPUT); | 
 | 1016 |   Opts.Inputs.clear(); | 
 | 1017 |   if (Inputs.empty()) | 
 | 1018 |     Inputs.push_back("-"); | 
 | 1019 |   for (unsigned i = 0, e = Inputs.size(); i != e; ++i) { | 
 | 1020 |     FrontendOptions::InputKind IK = DashX; | 
 | 1021 |     if (IK == FrontendOptions::IK_None) { | 
 | 1022 |       IK = FrontendOptions::getInputKindForExtension( | 
 | 1023 |         llvm::StringRef(Inputs[i]).rsplit('.').second); | 
 | 1024 |       // FIXME: Remove this hack. | 
 | 1025 |       if (i == 0) | 
 | 1026 |         DashX = IK; | 
 | 1027 |     } | 
 | 1028 |     Opts.Inputs.push_back(std::make_pair(IK, Inputs[i])); | 
 | 1029 |   } | 
 | 1030 |  | 
 | 1031 |   return DashX; | 
 | 1032 | } | 
 | 1033 |  | 
| Daniel Dunbar | 8b9adfe | 2009-12-15 00:06:45 +0000 | [diff] [blame] | 1034 | std::string CompilerInvocation::GetResourcesPath(const char *Argv0, | 
 | 1035 |                                                  void *MainAddr) { | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 1036 |   llvm::sys::Path P = llvm::sys::Path::GetMainExecutable(Argv0, MainAddr); | 
 | 1037 |  | 
 | 1038 |   if (!P.isEmpty()) { | 
 | 1039 |     P.eraseComponent();  // Remove /clang from foo/bin/clang | 
 | 1040 |     P.eraseComponent();  // Remove /bin   from foo/bin | 
 | 1041 |  | 
 | 1042 |     // Get foo/lib/clang/<version>/include | 
 | 1043 |     P.appendComponent("lib"); | 
 | 1044 |     P.appendComponent("clang"); | 
 | 1045 |     P.appendComponent(CLANG_VERSION_STRING); | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 1046 |   } | 
 | 1047 |  | 
 | 1048 |   return P.str(); | 
 | 1049 | } | 
 | 1050 |  | 
| Daniel Dunbar | 1e69fe3 | 2009-12-13 03:45:58 +0000 | [diff] [blame] | 1051 | static void ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args) { | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 1052 |   using namespace cc1options; | 
 | 1053 |   Opts.Sysroot = getLastArgValue(Args, OPT_isysroot, "/"); | 
 | 1054 |   Opts.Verbose = Args.hasArg(OPT_v); | 
| Daniel Dunbar | 1e69fe3 | 2009-12-13 03:45:58 +0000 | [diff] [blame] | 1055 |   Opts.UseBuiltinIncludes = !Args.hasArg(OPT_nobuiltininc); | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 1056 |   Opts.UseStandardIncludes = !Args.hasArg(OPT_nostdinc); | 
| Douglas Gregor | 4c2bcad | 2010-03-24 20:13:48 +0000 | [diff] [blame] | 1057 |   Opts.UseStandardCXXIncludes = !Args.hasArg(OPT_nostdincxx); | 
| Daniel Dunbar | 8b9adfe | 2009-12-15 00:06:45 +0000 | [diff] [blame] | 1058 |   Opts.ResourceDir = getLastArgValue(Args, OPT_resource_dir); | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 1059 |  | 
 | 1060 |   // Add -I... and -F... options in order. | 
 | 1061 |   for (arg_iterator it = Args.filtered_begin(OPT_I, OPT_F), | 
 | 1062 |          ie = Args.filtered_end(); it != ie; ++it) | 
 | 1063 |     Opts.AddPath(it->getValue(Args), frontend::Angled, true, | 
 | 1064 |                  /*IsFramework=*/ it->getOption().matches(OPT_F)); | 
 | 1065 |  | 
 | 1066 |   // Add -iprefix/-iwith-prefix/-iwithprefixbefore options. | 
 | 1067 |   llvm::StringRef Prefix = ""; // FIXME: This isn't the correct default prefix. | 
 | 1068 |   for (arg_iterator it = Args.filtered_begin(OPT_iprefix, OPT_iwithprefix, | 
 | 1069 |                                              OPT_iwithprefixbefore), | 
 | 1070 |          ie = Args.filtered_end(); it != ie; ++it) { | 
 | 1071 |     if (it->getOption().matches(OPT_iprefix)) | 
 | 1072 |       Prefix = it->getValue(Args); | 
 | 1073 |     else if (it->getOption().matches(OPT_iwithprefix)) | 
 | 1074 |       Opts.AddPath(Prefix.str() + it->getValue(Args), | 
 | 1075 |                    frontend::System, false, false); | 
 | 1076 |     else | 
 | 1077 |       Opts.AddPath(Prefix.str() + it->getValue(Args), | 
 | 1078 |                    frontend::Angled, false, false); | 
 | 1079 |   } | 
 | 1080 |  | 
 | 1081 |   for (arg_iterator it = Args.filtered_begin(OPT_idirafter), | 
 | 1082 |          ie = Args.filtered_end(); it != ie; ++it) | 
 | 1083 |     Opts.AddPath(it->getValue(Args), frontend::After, true, false); | 
 | 1084 |   for (arg_iterator it = Args.filtered_begin(OPT_iquote), | 
 | 1085 |          ie = Args.filtered_end(); it != ie; ++it) | 
 | 1086 |     Opts.AddPath(it->getValue(Args), frontend::Quoted, true, false); | 
 | 1087 |   for (arg_iterator it = Args.filtered_begin(OPT_isystem), | 
 | 1088 |          ie = Args.filtered_end(); it != ie; ++it) | 
 | 1089 |     Opts.AddPath(it->getValue(Args), frontend::System, true, false); | 
 | 1090 |  | 
 | 1091 |   // FIXME: Need options for the various environment variables! | 
 | 1092 | } | 
 | 1093 |  | 
 | 1094 | static void ParseLangArgs(LangOptions &Opts, ArgList &Args, | 
 | 1095 |                           FrontendOptions::InputKind IK, | 
 | 1096 |                           Diagnostic &Diags) { | 
 | 1097 |   // FIXME: Cleanup per-file based stuff. | 
 | 1098 |  | 
 | 1099 |   // Set some properties which depend soley on the input kind; it would be nice | 
 | 1100 |   // to move these to the language standard, and have the driver resolve the | 
 | 1101 |   // input kind + language standard. | 
 | 1102 |   if (IK == FrontendOptions::IK_Asm) { | 
 | 1103 |     Opts.AsmPreprocessor = 1; | 
 | 1104 |   } else if (IK == FrontendOptions::IK_ObjC || | 
 | 1105 |              IK == FrontendOptions::IK_ObjCXX || | 
 | 1106 |              IK == FrontendOptions::IK_PreprocessedObjC || | 
 | 1107 |              IK == FrontendOptions::IK_PreprocessedObjCXX) { | 
 | 1108 |     Opts.ObjC1 = Opts.ObjC2 = 1; | 
 | 1109 |   } | 
 | 1110 |  | 
 | 1111 |   LangStandard::Kind LangStd = LangStandard::lang_unspecified; | 
 | 1112 |   if (const Arg *A = Args.getLastArg(OPT_std_EQ)) { | 
 | 1113 |     LangStd = llvm::StringSwitch<LangStandard::Kind>(A->getValue(Args)) | 
 | 1114 | #define LANGSTANDARD(id, name, desc, features) \ | 
 | 1115 |       .Case(name, LangStandard::lang_##id) | 
 | 1116 | #include "clang/Frontend/LangStandards.def" | 
 | 1117 |       .Default(LangStandard::lang_unspecified); | 
 | 1118 |     if (LangStd == LangStandard::lang_unspecified) | 
 | 1119 |       Diags.Report(diag::err_drv_invalid_value) | 
 | 1120 |         << A->getAsString(Args) << A->getValue(Args); | 
 | 1121 |   } | 
 | 1122 |  | 
 | 1123 |   if (LangStd == LangStandard::lang_unspecified) { | 
 | 1124 |     // Based on the base language, pick one. | 
 | 1125 |     switch (IK) { | 
 | 1126 |     case FrontendOptions::IK_None: | 
 | 1127 |     case FrontendOptions::IK_AST: | 
 | 1128 |       assert(0 && "Invalid input kind!"); | 
 | 1129 |     case FrontendOptions::IK_OpenCL: | 
 | 1130 |       LangStd = LangStandard::lang_opencl; | 
 | 1131 |       break; | 
 | 1132 |     case FrontendOptions::IK_Asm: | 
 | 1133 |     case FrontendOptions::IK_C: | 
 | 1134 |     case FrontendOptions::IK_PreprocessedC: | 
 | 1135 |     case FrontendOptions::IK_ObjC: | 
 | 1136 |     case FrontendOptions::IK_PreprocessedObjC: | 
 | 1137 |       LangStd = LangStandard::lang_gnu99; | 
 | 1138 |       break; | 
 | 1139 |     case FrontendOptions::IK_CXX: | 
 | 1140 |     case FrontendOptions::IK_PreprocessedCXX: | 
 | 1141 |     case FrontendOptions::IK_ObjCXX: | 
 | 1142 |     case FrontendOptions::IK_PreprocessedObjCXX: | 
 | 1143 |       LangStd = LangStandard::lang_gnucxx98; | 
 | 1144 |       break; | 
 | 1145 |     } | 
 | 1146 |   } | 
 | 1147 |  | 
 | 1148 |   const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd); | 
 | 1149 |   Opts.BCPLComment = Std.hasBCPLComments(); | 
 | 1150 |   Opts.C99 = Std.isC99(); | 
 | 1151 |   Opts.CPlusPlus = Std.isCPlusPlus(); | 
 | 1152 |   Opts.CPlusPlus0x = Std.isCPlusPlus0x(); | 
 | 1153 |   Opts.Digraphs = Std.hasDigraphs(); | 
 | 1154 |   Opts.GNUMode = Std.isGNUMode(); | 
 | 1155 |   Opts.GNUInline = !Std.isC99(); | 
 | 1156 |   Opts.HexFloats = Std.hasHexFloats(); | 
 | 1157 |   Opts.ImplicitInt = Std.hasImplicitInt(); | 
 | 1158 |  | 
 | 1159 |   // OpenCL has some additional defaults. | 
 | 1160 |   if (LangStd == LangStandard::lang_opencl) { | 
 | 1161 |     Opts.OpenCL = 1; | 
 | 1162 |     Opts.AltiVec = 1; | 
 | 1163 |     Opts.CXXOperatorNames = 1; | 
 | 1164 |     Opts.LaxVectorConversions = 1; | 
 | 1165 |   } | 
 | 1166 |  | 
 | 1167 |   // OpenCL and C++ both have bool, true, false keywords. | 
 | 1168 |   Opts.Bool = Opts.OpenCL || Opts.CPlusPlus; | 
 | 1169 |  | 
| Chandler Carruth | eb5d7b7 | 2010-04-17 20:17:31 +0000 | [diff] [blame] | 1170 |   // We abuse '-f[no-]gnu-keywords' to force overriding all GNU-extension | 
 | 1171 |   // keywords. This behavior is provided by GCC's poorly named '-fasm' flag, | 
 | 1172 |   // while a subset (the non-C++ GNU keywords) is provided by GCC's | 
 | 1173 |   // '-fgnu-keywords'. Clang conflates the two for simplicity under the single | 
 | 1174 |   // name, as it doesn't seem a useful distinction. | 
 | 1175 |   Opts.GNUKeywords = Args.hasFlag(OPT_fgnu_keywords, OPT_fno_gnu_keywords, | 
 | 1176 |                                   Opts.GNUMode); | 
 | 1177 |  | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 1178 |   if (Opts.CPlusPlus) | 
 | 1179 |     Opts.CXXOperatorNames = !Args.hasArg(OPT_fno_operator_names); | 
 | 1180 |  | 
 | 1181 |   if (Args.hasArg(OPT_fobjc_gc_only)) | 
 | 1182 |     Opts.setGCMode(LangOptions::GCOnly); | 
 | 1183 |   else if (Args.hasArg(OPT_fobjc_gc)) | 
 | 1184 |     Opts.setGCMode(LangOptions::HybridGC); | 
 | 1185 |  | 
 | 1186 |   if (Args.hasArg(OPT_print_ivar_layout)) | 
 | 1187 |     Opts.ObjCGCBitmapPrint = 1; | 
| Fariborz Jahanian | 33e982b | 2010-04-22 20:26:39 +0000 | [diff] [blame] | 1188 |   if (Args.hasArg(OPT_fno_constant_cfstrings)) | 
 | 1189 |     Opts.NoConstantCFStrings = 1; | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 1190 |  | 
 | 1191 |   if (Args.hasArg(OPT_faltivec)) | 
 | 1192 |     Opts.AltiVec = 1; | 
 | 1193 |  | 
 | 1194 |   if (Args.hasArg(OPT_pthread)) | 
 | 1195 |     Opts.POSIXThreads = 1; | 
 | 1196 |  | 
 | 1197 |   llvm::StringRef Vis = getLastArgValue(Args, OPT_fvisibility, | 
 | 1198 |                                         "default"); | 
 | 1199 |   if (Vis == "default") | 
 | 1200 |     Opts.setVisibilityMode(LangOptions::Default); | 
 | 1201 |   else if (Vis == "hidden") | 
 | 1202 |     Opts.setVisibilityMode(LangOptions::Hidden); | 
 | 1203 |   else if (Vis == "protected") | 
 | 1204 |     Opts.setVisibilityMode(LangOptions::Protected); | 
 | 1205 |   else | 
 | 1206 |     Diags.Report(diag::err_drv_invalid_value) | 
 | 1207 |       << Args.getLastArg(OPT_fvisibility)->getAsString(Args) << Vis; | 
 | 1208 |  | 
 | 1209 |   Opts.OverflowChecking = Args.hasArg(OPT_ftrapv); | 
 | 1210 |  | 
 | 1211 |   // Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs | 
 | 1212 |   // is specified, or -std is set to a conforming mode. | 
 | 1213 |   Opts.Trigraphs = !Opts.GNUMode; | 
 | 1214 |   if (Args.hasArg(OPT_trigraphs)) | 
 | 1215 |     Opts.Trigraphs = 1; | 
 | 1216 |  | 
| Daniel Dunbar | 8663b18 | 2009-12-16 20:10:18 +0000 | [diff] [blame] | 1217 |   Opts.DollarIdents = Args.hasFlag(OPT_fdollars_in_identifiers, | 
 | 1218 |                                    OPT_fno_dollars_in_identifiers, | 
 | 1219 |                                    !Opts.AsmPreprocessor); | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 1220 |   Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings); | 
 | 1221 |   Opts.Microsoft = Args.hasArg(OPT_fms_extensions); | 
 | 1222 |   Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings); | 
| John McCall | 4b7a834 | 2010-03-15 10:54:44 +0000 | [diff] [blame] | 1223 |   Opts.ConstStrings = Args.hasArg(OPT_Wwrite_strings); | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 1224 |   if (Args.hasArg(OPT_fno_lax_vector_conversions)) | 
| Anders Carlsson | a508b7d | 2010-02-06 23:23:06 +0000 | [diff] [blame] | 1225 |     Opts.LaxVectorConversions = 0; | 
 | 1226 |   if (Args.hasArg(OPT_fno_threadsafe_statics)) | 
| Anders Carlsson | 824d7ea | 2010-02-11 08:02:13 +0000 | [diff] [blame] | 1227 |     Opts.ThreadsafeStatics = 0; | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 1228 |   Opts.Exceptions = Args.hasArg(OPT_fexceptions); | 
| Mike Stump | de05057 | 2009-12-02 18:57:08 +0000 | [diff] [blame] | 1229 |   Opts.RTTI = !Args.hasArg(OPT_fno_rtti); | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 1230 |   Opts.Blocks = Args.hasArg(OPT_fblocks); | 
 | 1231 |   Opts.CharIsSigned = !Args.hasArg(OPT_fno_signed_char); | 
 | 1232 |   Opts.ShortWChar = Args.hasArg(OPT_fshort_wchar); | 
 | 1233 |   Opts.Freestanding = Args.hasArg(OPT_ffreestanding); | 
 | 1234 |   Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding; | 
| Nuno Lopes | fc28448 | 2009-12-16 16:59:22 +0000 | [diff] [blame] | 1235 |   Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new); | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 1236 |   Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions); | 
| John McCall | 7002f4c | 2010-04-09 19:03:51 +0000 | [diff] [blame] | 1237 |   Opts.AccessControl = !Args.hasArg(OPT_fno_access_control); | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 1238 |   Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors); | 
| Dan Gohman | c31176d | 2010-01-08 02:20:44 +0000 | [diff] [blame] | 1239 |   Opts.MathErrno = Args.hasArg(OPT_fmath_errno); | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 1240 |   Opts.InstantiationDepth = getLastArgIntValue(Args, OPT_ftemplate_depth, 99, | 
 | 1241 |                                                Diags); | 
 | 1242 |   Opts.NeXTRuntime = !Args.hasArg(OPT_fgnu_runtime); | 
 | 1243 |   Opts.ObjCConstantStringClass = getLastArgValue(Args, | 
 | 1244 |                                                  OPT_fconstant_string_class); | 
 | 1245 |   Opts.ObjCNonFragileABI = Args.hasArg(OPT_fobjc_nonfragile_abi); | 
| Fariborz Jahanian | 412e798 | 2010-02-09 19:31:38 +0000 | [diff] [blame] | 1246 |   Opts.ObjCNonFragileABI2 = Args.hasArg(OPT_fobjc_nonfragile_abi2); | 
 | 1247 |   if (Opts.ObjCNonFragileABI2) | 
 | 1248 |     Opts.ObjCNonFragileABI = true; | 
| Mike Stump | 9c276ae | 2009-12-12 01:27:46 +0000 | [diff] [blame] | 1249 |   Opts.CatchUndefined = Args.hasArg(OPT_fcatch_undefined_behavior); | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 1250 |   Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls); | 
 | 1251 |   Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags); | 
| Daniel Dunbar | 7348288 | 2010-02-10 18:48:44 +0000 | [diff] [blame] | 1252 |   Opts.SjLjExceptions = Args.hasArg(OPT_fsjlj_exceptions); | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 1253 |   Opts.Static = Args.hasArg(OPT_static_define); | 
| Anders Carlsson | 46116ce | 2010-04-10 19:09:13 +0000 | [diff] [blame] | 1254 |   Opts.DumpRecordLayouts = Args.hasArg(OPT_fdump_record_layouts); | 
| Anders Carlsson | 046c294 | 2010-04-17 20:15:18 +0000 | [diff] [blame] | 1255 |   Opts.DumpVTableLayouts = Args.hasArg(OPT_fdump_vtable_layouts); | 
| Daniel Dunbar | fb937b8 | 2010-04-15 15:06:22 +0000 | [diff] [blame] | 1256 |   Opts.NoBitFieldTypeAlign = Args.hasArg(OPT_fno_bitfield_type_align); | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 1257 |   Opts.OptimizeSize = 0; | 
 | 1258 |  | 
 | 1259 |   // FIXME: Eliminate this dependency. | 
 | 1260 |   unsigned Opt = | 
 | 1261 |     Args.hasArg(OPT_Os) ? 2 : getLastArgIntValue(Args, OPT_O, 0, Diags); | 
 | 1262 |   Opts.Optimize = Opt != 0; | 
 | 1263 |  | 
 | 1264 |   // This is the __NO_INLINE__ define, which just depends on things like the | 
 | 1265 |   // optimization level and -fno-inline, not actually whether the backend has | 
 | 1266 |   // inlining enabled. | 
 | 1267 |   // | 
 | 1268 |   // FIXME: This is affected by other options (-fno-inline). | 
 | 1269 |   Opts.NoInline = !Opt; | 
 | 1270 |  | 
 | 1271 |   unsigned SSP = getLastArgIntValue(Args, OPT_stack_protector, 0, Diags); | 
 | 1272 |   switch (SSP) { | 
 | 1273 |   default: | 
 | 1274 |     Diags.Report(diag::err_drv_invalid_value) | 
 | 1275 |       << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP; | 
 | 1276 |     break; | 
 | 1277 |   case 0: Opts.setStackProtectorMode(LangOptions::SSPOff); break; | 
 | 1278 |   case 1: Opts.setStackProtectorMode(LangOptions::SSPOn);  break; | 
 | 1279 |   case 2: Opts.setStackProtectorMode(LangOptions::SSPReq); break; | 
 | 1280 |   } | 
 | 1281 | } | 
 | 1282 |  | 
| Daniel Dunbar | e14b5f5 | 2009-12-03 05:11:16 +0000 | [diff] [blame] | 1283 | static void ParsePreprocessorArgs(PreprocessorOptions &Opts, ArgList &Args, | 
 | 1284 |                                   Diagnostic &Diags) { | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 1285 |   using namespace cc1options; | 
 | 1286 |   Opts.ImplicitPCHInclude = getLastArgValue(Args, OPT_include_pch); | 
 | 1287 |   Opts.ImplicitPTHInclude = getLastArgValue(Args, OPT_include_pth); | 
 | 1288 |   if (const Arg *A = Args.getLastArg(OPT_token_cache)) | 
 | 1289 |       Opts.TokenCache = A->getValue(Args); | 
 | 1290 |   else | 
 | 1291 |     Opts.TokenCache = Opts.ImplicitPTHInclude; | 
 | 1292 |   Opts.UsePredefines = !Args.hasArg(OPT_undef); | 
| Douglas Gregor | 94dc8f6 | 2010-03-19 16:15:56 +0000 | [diff] [blame] | 1293 |   Opts.DetailedRecord = Args.hasArg(OPT_detailed_preprocessing_record); | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 1294 |   // Add macros from the command line. | 
 | 1295 |   for (arg_iterator it = Args.filtered_begin(OPT_D, OPT_U), | 
 | 1296 |          ie = Args.filtered_end(); it != ie; ++it) { | 
 | 1297 |     if (it->getOption().matches(OPT_D)) | 
 | 1298 |       Opts.addMacroDef(it->getValue(Args)); | 
 | 1299 |     else | 
 | 1300 |       Opts.addMacroUndef(it->getValue(Args)); | 
 | 1301 |   } | 
 | 1302 |  | 
 | 1303 |   Opts.MacroIncludes = getAllArgValues(Args, OPT_imacros); | 
 | 1304 |  | 
 | 1305 |   // Add the ordered list of -includes. | 
 | 1306 |   for (arg_iterator it = Args.filtered_begin(OPT_include, OPT_include_pch, | 
 | 1307 |                                              OPT_include_pth), | 
 | 1308 |          ie = Args.filtered_end(); it != ie; ++it) { | 
 | 1309 |     // PCH is handled specially, we need to extra the original include path. | 
 | 1310 |     if (it->getOption().matches(OPT_include_pch)) { | 
 | 1311 |       std::string OriginalFile = | 
| Daniel Dunbar | 93ebb1b | 2009-12-03 09:13:06 +0000 | [diff] [blame] | 1312 |         PCHReader::getOriginalSourceFile(it->getValue(Args), Diags); | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 1313 |       if (OriginalFile.empty()) | 
| Daniel Dunbar | 93ebb1b | 2009-12-03 09:13:06 +0000 | [diff] [blame] | 1314 |         continue; | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 1315 |  | 
 | 1316 |       Opts.Includes.push_back(OriginalFile); | 
 | 1317 |     } else | 
 | 1318 |       Opts.Includes.push_back(it->getValue(Args)); | 
 | 1319 |   } | 
| Daniel Dunbar | e14b5f5 | 2009-12-03 05:11:16 +0000 | [diff] [blame] | 1320 |  | 
| Chris Lattner | dd17394 | 2010-04-14 03:54:58 +0000 | [diff] [blame] | 1321 |   // Include 'altivec.h' if -faltivec option present | 
 | 1322 |   if (Args.hasArg(OPT_faltivec)) | 
 | 1323 |     Opts.Includes.push_back("altivec.h"); | 
 | 1324 |  | 
| Daniel Dunbar | e14b5f5 | 2009-12-03 05:11:16 +0000 | [diff] [blame] | 1325 |   for (arg_iterator it = Args.filtered_begin(OPT_remap_file), | 
 | 1326 |          ie = Args.filtered_end(); it != ie; ++it) { | 
 | 1327 |     std::pair<llvm::StringRef,llvm::StringRef> Split = | 
 | 1328 |       llvm::StringRef(it->getValue(Args)).split(';'); | 
 | 1329 |  | 
 | 1330 |     if (Split.second.empty()) { | 
 | 1331 |       Diags.Report(diag::err_drv_invalid_remap_file) << it->getAsString(Args); | 
 | 1332 |       continue; | 
 | 1333 |     } | 
 | 1334 |  | 
 | 1335 |     Opts.addRemappedFile(Split.first, Split.second); | 
 | 1336 |   } | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 1337 | } | 
 | 1338 |  | 
 | 1339 | static void ParsePreprocessorOutputArgs(PreprocessorOutputOptions &Opts, | 
 | 1340 |                                         ArgList &Args) { | 
 | 1341 |   using namespace cc1options; | 
 | 1342 |   Opts.ShowCPP = !Args.hasArg(OPT_dM); | 
 | 1343 |   Opts.ShowMacros = Args.hasArg(OPT_dM) || Args.hasArg(OPT_dD); | 
 | 1344 |   Opts.ShowLineMarkers = !Args.hasArg(OPT_P); | 
 | 1345 |   Opts.ShowComments = Args.hasArg(OPT_C); | 
 | 1346 |   Opts.ShowMacroComments = Args.hasArg(OPT_CC); | 
 | 1347 | } | 
 | 1348 |  | 
 | 1349 | static void ParseTargetArgs(TargetOptions &Opts, ArgList &Args) { | 
 | 1350 |   using namespace cc1options; | 
 | 1351 |   Opts.ABI = getLastArgValue(Args, OPT_target_abi); | 
| Daniel Dunbar | 38b48af | 2009-12-18 06:30:12 +0000 | [diff] [blame] | 1352 |   Opts.CPU = getLastArgValue(Args, OPT_target_cpu); | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 1353 |   Opts.Triple = getLastArgValue(Args, OPT_triple); | 
 | 1354 |   Opts.Features = getAllArgValues(Args, OPT_target_feature); | 
 | 1355 |  | 
 | 1356 |   // Use the host triple if unspecified. | 
 | 1357 |   if (Opts.Triple.empty()) | 
 | 1358 |     Opts.Triple = llvm::sys::getHostTriple(); | 
 | 1359 | } | 
 | 1360 |  | 
 | 1361 | // | 
 | 1362 |  | 
 | 1363 | void CompilerInvocation::CreateFromArgs(CompilerInvocation &Res, | 
 | 1364 |                                         const char **ArgBegin, | 
 | 1365 |                                         const char **ArgEnd, | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 1366 |                                         Diagnostic &Diags) { | 
 | 1367 |   // Parse the arguments. | 
 | 1368 |   llvm::OwningPtr<OptTable> Opts(createCC1OptTable()); | 
 | 1369 |   unsigned MissingArgIndex, MissingArgCount; | 
 | 1370 |   llvm::OwningPtr<InputArgList> Args( | 
 | 1371 |     Opts->ParseArgs(ArgBegin, ArgEnd,MissingArgIndex, MissingArgCount)); | 
 | 1372 |  | 
 | 1373 |   // Check for missing argument error. | 
 | 1374 |   if (MissingArgCount) | 
 | 1375 |     Diags.Report(diag::err_drv_missing_argument) | 
 | 1376 |       << Args->getArgString(MissingArgIndex) << MissingArgCount; | 
 | 1377 |  | 
 | 1378 |   // Issue errors on unknown arguments. | 
 | 1379 |   for (arg_iterator it = Args->filtered_begin(OPT_UNKNOWN), | 
 | 1380 |          ie = Args->filtered_end(); it != ie; ++it) | 
 | 1381 |     Diags.Report(diag::err_drv_unknown_argument) << it->getAsString(*Args); | 
 | 1382 |  | 
 | 1383 |   ParseAnalyzerArgs(Res.getAnalyzerOpts(), *Args, Diags); | 
 | 1384 |   ParseCodeGenArgs(Res.getCodeGenOpts(), *Args, Diags); | 
 | 1385 |   ParseDependencyOutputArgs(Res.getDependencyOutputOpts(), *Args); | 
 | 1386 |   ParseDiagnosticArgs(Res.getDiagnosticOpts(), *Args, Diags); | 
 | 1387 |   FrontendOptions::InputKind DashX = | 
 | 1388 |     ParseFrontendArgs(Res.getFrontendOpts(), *Args, Diags); | 
| Daniel Dunbar | 1e69fe3 | 2009-12-13 03:45:58 +0000 | [diff] [blame] | 1389 |   ParseHeaderSearchArgs(Res.getHeaderSearchOpts(), *Args); | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 1390 |   if (DashX != FrontendOptions::IK_AST) | 
 | 1391 |     ParseLangArgs(Res.getLangOpts(), *Args, DashX, Diags); | 
| Daniel Dunbar | e14b5f5 | 2009-12-03 05:11:16 +0000 | [diff] [blame] | 1392 |   ParsePreprocessorArgs(Res.getPreprocessorOpts(), *Args, Diags); | 
| Daniel Dunbar | 56ac85c | 2009-12-01 03:16:53 +0000 | [diff] [blame] | 1393 |   ParsePreprocessorOutputArgs(Res.getPreprocessorOutputOpts(), *Args); | 
 | 1394 |   ParseTargetArgs(Res.getTargetOpts(), *Args); | 
 | 1395 | } |