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 /lib/Driver/CC1Options.cpp | |
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
Diffstat (limited to 'lib/Driver/CC1Options.cpp')
-rw-r--r-- | lib/Driver/CC1Options.cpp | 62 |
1 files changed, 62 insertions, 0 deletions
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); } |