clang-cl: ignore compile-only options in link-only invocations.
Previously we would warn about unused arguments such as /MD when linking. Clang already has logic to ignore compile-only options, e.g. for -D and -U. This patch extends that to include clang-cl's compile-only options too. Also, some clang-cl options should always be ignored. Doing this earlier means they get ignored both for compilation and link-only invocations. llvm-svn: 190825
This commit is contained in:
parent
fab61e95f3
commit
a8ef14f3f4
|
@ -14,28 +14,43 @@
|
|||
def cl_Group : OptionGroup<"<clang-cl options>">,
|
||||
HelpText<"CL.EXE COMPATIBILITY OPTIONS">;
|
||||
|
||||
def cl_compile_Group : OptionGroup<"<clang-cl compile-only options>">,
|
||||
Group<cl_Group>;
|
||||
|
||||
def cl_ignored_Group : OptionGroup<"<clang-cl ignored options>">,
|
||||
Group<cl_Group>;
|
||||
|
||||
class CLFlag<string name> : Option<["/", "-"], name, KIND_FLAG>,
|
||||
Group<cl_Group>, Flags<[CLOption, DriverOption]>;
|
||||
|
||||
class CLCompileFlag<string name> : Option<["/", "-"], name, KIND_FLAG>,
|
||||
Group<cl_compile_Group>, Flags<[CLOption, DriverOption]>;
|
||||
|
||||
class CLIgnoredFlag<string name> : Option<["/", "-"], name, KIND_FLAG>,
|
||||
Group<cl_ignored_Group>, Flags<[CLOption, DriverOption]>;
|
||||
|
||||
class CLJoined<string name> : Option<["/", "-"], name, KIND_JOINED>,
|
||||
Group<cl_Group>, Flags<[CLOption, DriverOption]>;
|
||||
|
||||
class CLCompileJoined<string name> : Option<["/", "-"], name, KIND_JOINED>,
|
||||
Group<cl_compile_Group>, Flags<[CLOption, DriverOption]>;
|
||||
|
||||
class CLIgnoredJoined<string name> : Option<["/", "-"], name, KIND_JOINED>,
|
||||
Group<cl_ignored_Group>, Flags<[CLOption, DriverOption]>;
|
||||
|
||||
class CLJoinedOrSeparate<string name> : Option<["/", "-"], name,
|
||||
KIND_JOINED_OR_SEPARATE>, Group<cl_Group>, Flags<[CLOption, DriverOption]>;
|
||||
|
||||
class CLCompileJoinedOrSeparate<string name> : Option<["/", "-"], name,
|
||||
KIND_JOINED_OR_SEPARATE>, Group<cl_compile_Group>,
|
||||
Flags<[CLOption, DriverOption]>;
|
||||
|
||||
class CLRemainingArgs<string name> : Option<["/", "-"], name,
|
||||
KIND_REMAINING_ARGS>, Group<cl_Group>, Flags<[CLOption, DriverOption]>;
|
||||
|
||||
// Aliases:
|
||||
// (We don't put any of these in cl_compile_Group as the options they alias are
|
||||
// already in the right group.)
|
||||
|
||||
def _SLASH_c : CLFlag<"c">, HelpText<"Compile only">, Alias<c>;
|
||||
def _SLASH_D : CLJoinedOrSeparate<"D">, HelpText<"Define macro">,
|
||||
|
@ -93,12 +108,12 @@ def _SLASH_Zs : CLFlag<"Zs">, HelpText<"Syntax-check only">,
|
|||
|
||||
// Non-aliases:
|
||||
|
||||
def _SLASH_M_Group : OptionGroup<"</M group>">, Group<cl_Group>;
|
||||
def _SLASH_M_Group : OptionGroup<"</M group>">, Group<cl_compile_Group>;
|
||||
|
||||
def _SLASH_Fe : CLJoined<"Fe">,
|
||||
HelpText<"Set output executable file or directory (ends in / or \\)">,
|
||||
MetaVarName<"<file or directory>">;
|
||||
def _SLASH_Fo : CLJoined<"Fo">,
|
||||
def _SLASH_Fo : CLCompileJoined<"Fo">,
|
||||
HelpText<"Set output object file, or directory (ends in / or \\)">,
|
||||
MetaVarName<"<file or directory>">;
|
||||
def _SLASH_LD : CLFlag<"LD">, HelpText<"Create DLL">;
|
||||
|
@ -113,12 +128,12 @@ def _SLASH_MT : Option<["/", "-"], "MT", KIND_FLAG>, Group<_SLASH_M_Group>,
|
|||
Flags<[CLOption, DriverOption]>, HelpText<"Use static run-time">;
|
||||
def _SLASH_MTd : Option<["/", "-"], "MTd", KIND_FLAG>, Group<_SLASH_M_Group>,
|
||||
Flags<[CLOption, DriverOption]>, HelpText<"Use static debug run-time">;
|
||||
def _SLASH_Tc : CLJoinedOrSeparate<"Tc">, HelpText<"Specify a C source file">,
|
||||
MetaVarName<"<filename>">;
|
||||
def _SLASH_TC : CLFlag<"TC">, HelpText<"Treat all source files as C">;
|
||||
def _SLASH_Tp : CLJoinedOrSeparate<"Tp">, HelpText<"Specify a C++ source file">,
|
||||
MetaVarName<"<filename>">;
|
||||
def _SLASH_TP : CLFlag<"TP">, HelpText<"Treat all source files as C++">;
|
||||
def _SLASH_Tc : CLCompileJoinedOrSeparate<"Tc">,
|
||||
HelpText<"Specify a C source file">, MetaVarName<"<filename>">;
|
||||
def _SLASH_TC : CLCompileFlag<"TC">, HelpText<"Treat all source files as C">;
|
||||
def _SLASH_Tp : CLCompileJoinedOrSeparate<"Tp">,
|
||||
HelpText<"Specify a C++ source file">, MetaVarName<"<filename>">;
|
||||
def _SLASH_TP : CLCompileFlag<"TP">, HelpText<"Treat all source files as C++">;
|
||||
|
||||
|
||||
// Ignored:
|
||||
|
|
|
@ -1268,8 +1268,13 @@ void Driver::BuildActions(const ToolChain &TC, DerivedArgList &Args,
|
|||
|
||||
// If we are linking, claim any options which are obviously only used for
|
||||
// compilation.
|
||||
if (FinalPhase == phases::Link && PL.size() == 1)
|
||||
if (FinalPhase == phases::Link && PL.size() == 1) {
|
||||
Args.ClaimAllArgs(options::OPT_CompileOnly_Group);
|
||||
Args.ClaimAllArgs(options::OPT_cl_compile_Group);
|
||||
}
|
||||
|
||||
// Claim ignored clang-cl options.
|
||||
Args.ClaimAllArgs(options::OPT_cl_ignored_Group);
|
||||
}
|
||||
|
||||
Action *Driver::ConstructPhaseAction(const ArgList &Args, phases::ID Phase,
|
||||
|
|
|
@ -3587,9 +3587,6 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
|
|||
Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
|
||||
Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
|
||||
|
||||
// Claim ignored clang-cl options.
|
||||
Args.ClaimAllArgs(options::OPT_cl_ignored_Group);
|
||||
|
||||
// Disable warnings for clang -E -emit-llvm foo.c
|
||||
Args.ClaimAllArgs(options::OPT_emit_llvm);
|
||||
}
|
||||
|
|
|
@ -93,11 +93,19 @@
|
|||
// WJoined: "-cc1"
|
||||
// WJoined: "-Wunused-pragmas"
|
||||
|
||||
|
||||
// Ignored options. Check that we don't get "unused during compilation" errors.
|
||||
// (/Zs is for syntax-only, /WX is for -Werror)
|
||||
// RUN: %clang_cl /Zs /WX /analyze- /errorReport:foo /nologo /Ob1 /Ob2 -- %s
|
||||
// RUN: %clang_cl /Zs /WX /Zc:forScope /Zc:wchar_t /w12345 /wd1234 /RTC1 -- %s
|
||||
|
||||
// Ignored options and compile-only options are ignored for link jobs.
|
||||
// RUN: %clang_cl /c /Fo%t.obj /Tc%s
|
||||
// RUN: %clang_cl /nologo -### -- %t.obj 2>&1 | FileCheck -check-prefix=LINKUNUSED %s
|
||||
// RUN: %clang_cl /Dfoo -### -- %t.obj 2>&1 | FileCheck -check-prefix=LINKUNUSED %s
|
||||
// RUN: %clang_cl /MD -### -- %t.obj 2>&1 | FileCheck -check-prefix=LINKUNUSED %s
|
||||
// LINKUNUSED-NOT: argument unused during compilation
|
||||
|
||||
// Support ignoring warnings about unused arguments.
|
||||
// RUN: %clang_cl /Abracadabra -Qunused-arguments -### -- %s 2>&1 | FileCheck -check-prefix=UNUSED %s
|
||||
// UNUSED-NOT: warning
|
||||
|
@ -116,3 +124,5 @@
|
|||
// RUN: %clang_cl -Xclang hellocc1 -### -- %s 2>&1 | FileCheck -check-prefix=Xclang %s
|
||||
// Xclang: "-cc1"
|
||||
// Xclang: "hellocc1"
|
||||
|
||||
void f() { }
|
||||
|
|
Loading…
Reference in New Issue