GCC compatibility: Create a Group to ignore unsupported optimization.

Returns a warning when using an unknown optimization flag.
This patch includes -finline-limit as one of those ignored flags.
More options will be moved in this group

Patch by Arthur Marble <arthur@info9.net> in the context of
Debian Google Summer of code 2014.

Reviewers: rnk, Sylvestre
llvm-svn: 212805
This commit is contained in:
Sylvestre Ledru 2014-07-11 11:43:57 +00:00
parent 9c2e8ee72f
commit 2fe501eef9
4 changed files with 23 additions and 1 deletions

View File

@ -119,6 +119,8 @@ def err_drv_emit_llvm_link : Error<
def err_drv_optimization_remark_pattern : Error<
"%0 in '%1'">;
def warn_ignored_gcc_optimization : Warning<"ignoring unsupported optimization flag '%0'">,
InGroup<UnusedCommandLineArgument>;
def warn_O4_is_O3 : Warning<"-O4 is equivalent to -O3">, InGroup<Deprecated>;
def warn_drv_optimization_value : Warning<"optimization level '%0' is unsupported; using '%1%2' instead">,
InGroup<InvalidCommandLineArgument>;

View File

@ -91,6 +91,10 @@ def clang_ignored_f_Group : OptionGroup<"<clang ignored f group>">,
def clang_ignored_m_Group : OptionGroup<"<clang ignored m group>">,
Group<m_Group>;
// Group that ignores all gcc optimizations that won't be implemented
def clang_ignored_gcc_optimization_f_Group : OptionGroup<
"<clang_ignored_gcc_optimization_f_Group>">, Group<f_Group>;
/////////
// Options
@ -1591,7 +1595,8 @@ defm gcse : BooleanFFlag<"gcse">, Group<clang_ignored_f_Group>;
defm gnu : BooleanFFlag<"gnu">, Group<clang_ignored_f_Group>;
defm ident : BooleanFFlag<"ident">, Group<clang_ignored_f_Group>;
defm implicit_templates : BooleanFFlag<"implicit-templates">, Group<clang_ignored_f_Group>;
defm inline_limit : BooleanFFlag<"inline-limit">, Group<clang_ignored_f_Group>;
def finline_limit_EQ : Joined<["-"], "finline-limit=">, Group<clang_ignored_gcc_optimization_f_Group>;
defm finline_limit : BooleanFFlag<"inline-limit">, Group<clang_ignored_gcc_optimization_f_Group>;
defm ivopts : BooleanFFlag<"ivopts">, Group<clang_ignored_f_Group>;
defm non_call_exceptions : BooleanFFlag<"non-call-exceptions">, Group<clang_ignored_f_Group>;
defm permissive : BooleanFFlag<"permissive">, Group<clang_ignored_f_Group>;

View File

@ -3138,6 +3138,13 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
}
}
// Warn about ignored options to clang.
for (arg_iterator it = Args.filtered_begin(
options::OPT_clang_ignored_gcc_optimization_f_Group),
ie = Args.filtered_end(); it != ie; ++it) {
D.Diag(diag::warn_ignored_gcc_optimization) << (*it)->getAsString(Args);
}
// Don't warn about unused -flto. This can happen when we're preprocessing or
// precompiling.
Args.ClaimAllArgs(options::OPT_flto);

View File

@ -164,9 +164,17 @@
// RUN: -fno-unsigned-char \
// RUN: -fno-signed-char \
// RUN: -fstrength-reduce -fno-strength-reduce \
// RUN: -finline-limit=1000 \
// RUN: -finline-limit \
// RUN: %s 2>&1 | FileCheck --check-prefix=IGNORE %s
// IGNORE-NOT: error: unknown argument
// Test that the warning is displayed on these.
// RUN: %clang -### -finline-limit=1000 %s 2>&1 | FileCheck --check-prefix=CHECK-WARNING1 %s
// RUN: %clang -### -finline-limit %s 2>&1 | FileCheck --check-prefix=CHECK-WARNING2 %s
// CHECK-WARNING1: ignoring unsupported optimization flag '-finline-limit=1000
// CHECK-WARNING2: ignoring unsupported optimization flag '-finline-limit'
// RUN: %clang -### -fshort-wchar -fno-short-wchar %s 2>&1 | FileCheck -check-prefix=CHECK-WCHAR1 %s
// RUN: %clang -### -fno-short-wchar -fshort-wchar %s 2>&1 | FileCheck -check-prefix=CHECK-WCHAR2 %s
// CHECK-WCHAR1: -fno-short-wchar