Fix handling of invalid -O options.

We were checking the value after truncating it to a bitfield.

Thanks to Yunzhong Gao for noticing it.

llvm-svn: 224378
This commit is contained in:
Rafael Espindola 2014-12-16 21:57:03 +00:00
parent 39f9dbc877
commit fd8de1c3ae
3 changed files with 11 additions and 8 deletions

View File

@ -87,7 +87,7 @@ CODEGENOPT(NoZeroInitializedInBSS , 1, 0) ///< -fno-zero-initialized-in-bss.
ENUM_CODEGENOPT(ObjCDispatchMethod, ObjCDispatchMethodKind, 2, Legacy)
CODEGENOPT(OmitLeafFramePointer , 1, 0) ///< Set when -momit-leaf-frame-pointer is
///< enabled.
VALUE_CODEGENOPT(OptimizationLevel, 3, 0) ///< The -O[0-4] option specified.
VALUE_CODEGENOPT(OptimizationLevel, 2, 0) ///< The -O[0-3] option specified.
VALUE_CODEGENOPT(OptimizeSize, 2, 0) ///< If -Os (==1) or -Oz (==2) is specified.
CODEGENOPT(ProfileInstrGenerate , 1, 0) ///< Instrument code to generate

View File

@ -330,15 +330,17 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
using namespace options;
bool Success = true;
Opts.OptimizationLevel = getOptimizationLevel(Args, IK, Diags);
unsigned OptimizationLevel = getOptimizationLevel(Args, IK, Diags);
// TODO: This could be done in Driver
unsigned MaxOptLevel = 3;
if (Opts.OptimizationLevel > MaxOptLevel) {
// If the optimization level is not supported, fall back on the default optimization
if (OptimizationLevel > MaxOptLevel) {
// If the optimization level is not supported, fall back on the default
// optimization
Diags.Report(diag::warn_drv_optimization_value)
<< Args.getLastArg(OPT_O)->getAsString(Args) << "-O" << MaxOptLevel;
Opts.OptimizationLevel = MaxOptLevel;
OptimizationLevel = MaxOptLevel;
}
Opts.OptimizationLevel = OptimizationLevel;
// We must always run at least the always inlining pass.
Opts.setInlining(

View File

@ -1,4 +1,5 @@
// RUN: %clang_cc1 %s -O900 -o /dev/null 2> %t.log
// RUN: FileCheck %s -input-file=%t.log
// RUN: %clang_cc1 %s -O900 -o /dev/null 2>&1 | FileCheck %s
// CHECK: warning: optimization level '-O900' is not supported; using '-O3' instead
// RUN: %clang_cc1 %s -O8 -o /dev/null 2>&1 | FileCheck %s
// CHECK: warning: optimization level '-O{{.*}}' is not supported; using '-O3' instead