]> granicus.if.org Git - clang/commitdiff
Add clang -cc1 parsing of CodeGenOptions.
authorDaniel Dunbar <daniel@zuster.org>
Fri, 20 Nov 2009 17:23:30 +0000 (17:23 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Fri, 20 Nov 2009 17:23:30 +0000 (17:23 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@89464 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Driver/CC1Options.td
lib/Driver/CC1Options.cpp
lib/Frontend/CompilerInvocation.cpp

index 2ce2d4c95136d11c85144ddcdedd20f79bcfd56d..5b64199e0213912371bab3d3146748514204a8de 100644 (file)
@@ -24,3 +24,19 @@ def target_feature : Separate<"-target-feature">,
   HelpText<"Target specific attributes">;
 def triple : Separate<"-triple">,
   HelpText<"Specify target triple (e.g. i686-apple-darwin9)">;
+
+// CodeGen Options
+
+def disable_llvm_optzns : Flag<"-disable-llvm-optzns">,
+  HelpText<"Don't run LLVM optimization passes">;
+def disable_red_zone : Flag<"-disable-red-zone">,
+  HelpText<"Do not emit code that uses the red zone.">;
+def g : Flag<"-g">, HelpText<"Generate source level debug information">;
+def fno_common : Flag<"-fno-common">,
+  HelpText<"Compile common globals like normal definitions">;
+def no_implicit_float : Flag<"-no-implicit-float">,
+  HelpText<"Don't generate implicit floating point instructions (x86-only)">;
+def fno_merge_all_constants : Flag<"-fno-merge-all-constants">,
+  HelpText<"Disallow merging of constants.">;
+def O : Joined<"-O">, HelpText<"Optimization level">;
+def Os : Flag<"-Os">, HelpText<"Optimize for size">;
index c9bb5d08f55a88b91cedfee070febdd6352f82c0..7655770ccca117debf7181ae7237a21b8b31b959 100644 (file)
@@ -55,6 +55,21 @@ static llvm::StringRef getLastArgValue(ArgList &Args, cc1options::ID ID,
   return Default;
 }
 
+static int getLastArgIntValue(ArgList &Args, cc1options::ID ID,
+                              int Default = 0) {
+  Arg *A = Args.getLastArg(ID);
+  if (!A)
+    return Default;
+
+  int Res = Default;
+  // FIXME: What to do about argument parsing errors?
+  if (llvm::StringRef(A->getValue(Args)).getAsInteger(10, Res))
+    llvm::errs() << "error: invalid integral argument in '"
+                 << A->getAsString(Args) << "'\n";
+
+  return Res;
+}
+
 static std::vector<std::string>
 getAllArgValues(ArgList &Args, cc1options::ID ID) {
   llvm::SmallVector<const char *, 16> Values;
@@ -62,6 +77,50 @@ getAllArgValues(ArgList &Args, cc1options::ID ID) {
   return std::vector<std::string>(Values.begin(), Values.end());
 }
 
+//
+
+static void ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args) {
+  // -Os implies -O2
+  if (Args.hasArg(cc1options::OPT_Os))
+    Opts.OptimizationLevel = 2;
+  else
+    Opts.OptimizationLevel = getLastArgIntValue(Args, cc1options::OPT_O);
+
+  // FIXME: What to do about argument parsing errors?
+  if (Opts.OptimizationLevel > 3) {
+    llvm::errs() << "error: invalid optimization level '"
+                 << Opts.OptimizationLevel << "' (out of range)\n";
+    Opts.OptimizationLevel = 3;
+  }
+
+  // We must always run at least the always inlining pass.
+  Opts.Inlining = (Opts.OptimizationLevel > 1) ? CodeGenOptions::NormalInlining
+    : CodeGenOptions::OnlyAlwaysInlining;
+
+  Opts.DebugInfo = Args.hasArg(cc1options::OPT_g);
+  Opts.DisableLLVMOpts = Args.hasArg(cc1options::OPT_disable_llvm_optzns);
+  Opts.DisableRedZone = Args.hasArg(cc1options::OPT_disable_red_zone);
+  Opts.MergeAllConstants = !Args.hasArg(cc1options::OPT_fno_merge_all_constants);
+  Opts.NoCommon = Args.hasArg(cc1options::OPT_fno_common);
+  Opts.NoImplicitFloat = Args.hasArg(cc1options::OPT_no_implicit_float);
+  Opts.OptimizeSize = Args.hasArg(cc1options::OPT_Os);
+  Opts.SimplifyLibCalls = 1;
+  Opts.UnrollLoops = (Opts.OptimizationLevel > 1 && !Opts.OptimizeSize);
+
+  // FIXME: Implement!
+  // FIXME: Eliminate this dependency?
+//   if (Lang.NoBuiltin)
+//     Opts.SimplifyLibCalls = 0;
+//   if (Lang.CPlusPlus)
+//     Opts.NoCommon = 1;
+//   Opts.TimePasses = TimePasses;
+
+  // FIXME: Put elsewhere?
+#ifdef NDEBUG
+  Opts.VerifyModule = 0;
+#endif
+}
+
 static void ParseTargetArgs(TargetOptions &Opts, ArgList &Args) {
   Opts.ABI = getLastArgValue(Args, cc1options::OPT_target_abi);
   Opts.CPU = getLastArgValue(Args, cc1options::OPT_mcpu);
@@ -73,6 +132,8 @@ static void ParseTargetArgs(TargetOptions &Opts, ArgList &Args) {
     Opts.Triple = llvm::sys::getHostTriple();
 }
 
+//
+
 void CompilerInvocation::CreateFromArgs(CompilerInvocation &Res,
                            const llvm::SmallVectorImpl<llvm::StringRef> &Args) {
   // This is gratuitous, but until we switch the driver to using StringRe we
@@ -98,5 +159,6 @@ void CompilerInvocation::CreateFromArgs(CompilerInvocation &Res,
                  << " value )\n";
   }
 
+  ParseCodeGenArgs(Res.getCodeGenOpts(), *InputArgs);
   ParseTargetArgs(Res.getTargetOpts(), *InputArgs);
 }
index 89fd70a09360135247b4683aa7b2dbdd389c7596..eecd97684a5636fa58e679b27679ba319eda5f21 100644 (file)
@@ -102,7 +102,8 @@ static void CodeGenOptsToArgs(const CodeGenOptions &Opts,
     Res.push_back("-disable-red-zone");
   if (!Opts.MergeAllConstants)
     Res.push_back("-fno-merge-all-constants");
-  // NoCommon is only derived.
+  if (Opts.NoCommon)
+    Res.push_back("-fno-common");
   if (Opts.NoImplicitFloat)
     Res.push_back("-no-implicit-float");
   if (Opts.OptimizeSize) {