aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2009-11-20 17:23:30 +0000
committerDaniel Dunbar <daniel@zuster.org>2009-11-20 17:23:30 +0000
commit50a4487683a7e09fb93e8b506181e034241a0ffe (patch)
treeadd4af7c6e09e01a66743e65dbc2b108cc552985
parent33b26ea31381a1e161848116e96a87dcbb379921 (diff)
Add clang -cc1 parsing of CodeGenOptions.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@89464 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/clang/Driver/CC1Options.td16
-rw-r--r--lib/Driver/CC1Options.cpp62
-rw-r--r--lib/Frontend/CompilerInvocation.cpp3
3 files changed, 80 insertions, 1 deletions
diff --git a/include/clang/Driver/CC1Options.td b/include/clang/Driver/CC1Options.td
index 2ce2d4c951..5b64199e02 100644
--- a/include/clang/Driver/CC1Options.td
+++ b/include/clang/Driver/CC1Options.td
@@ -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">;
diff --git a/lib/Driver/CC1Options.cpp b/lib/Driver/CC1Options.cpp
index c9bb5d08f5..7655770ccc 100644
--- a/lib/Driver/CC1Options.cpp
+++ b/lib/Driver/CC1Options.cpp
@@ -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);
}
diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp
index 89fd70a093..eecd97684a 100644
--- a/lib/Frontend/CompilerInvocation.cpp
+++ b/lib/Frontend/CompilerInvocation.cpp
@@ -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) {