diff options
author | Daniel Dunbar <daniel@zuster.org> | 2009-11-20 17:23:30 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2009-11-20 17:23:30 +0000 |
commit | 50a4487683a7e09fb93e8b506181e034241a0ffe (patch) | |
tree | add4af7c6e09e01a66743e65dbc2b108cc552985 | |
parent | 33b26ea31381a1e161848116e96a87dcbb379921 (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.td | 16 | ||||
-rw-r--r-- | lib/Driver/CC1Options.cpp | 62 | ||||
-rw-r--r-- | lib/Frontend/CompilerInvocation.cpp | 3 |
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) { |