[MachineOutliner] Emit a warning when using -moutline on unsupported targets

Instead of just saying "flag unused", we should tell the user that the
outliner isn't (at least officially) supported for some given architecture.

This adds a warning that will state something like

The 'blah' architecture does not support -moutline; flag ignored

when we call -moutline with the 'blah' architecture.

Since the outliner is still mostly an AArch64 thing, any architecture
other than AArch64 will emit this warning.

llvm-svn: 335672
This commit is contained in:
Jessica Paquette 2018-06-26 22:09:48 +00:00
parent c9e60adcb5
commit a67abc83b7
3 changed files with 27 additions and 13 deletions

View File

@ -385,4 +385,8 @@ def warn_drv_experimental_isel_incomplete : Warning<
def warn_drv_experimental_isel_incomplete_opt : Warning<
"-fexperimental-isel support is incomplete for this architecture at the current optimization level">,
InGroup<ExperimentalISel>;
def warn_drv_moutline_unsupported_opt : Warning<
"The '%0' architecture does not support -moutline; flag ignored">,
InGroup<OptionIgnored>;
}

View File

@ -1476,19 +1476,6 @@ void Clang::AddAArch64TargetArgs(const ArgList &Args,
else
CmdArgs.push_back("-aarch64-enable-global-merge=true");
}
if (Args.hasFlag(options::OPT_moutline, options::OPT_mno_outline, false)) {
CmdArgs.push_back("-mllvm");
CmdArgs.push_back("-enable-machine-outliner");
// The outliner shouldn't compete with linkers that dedupe linkonceodr
// functions in LTO. Enable that behaviour by default when compiling with
// LTO.
if (getToolChain().getDriver().isUsingLTO()) {
CmdArgs.push_back("-mllvm");
CmdArgs.push_back("-enable-linkonceodr-outlining");
}
}
}
void Clang::AddMIPSTargetArgs(const ArgList &Args,
@ -4814,6 +4801,26 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
options::OPT_fno_complete_member_pointers, false))
CmdArgs.push_back("-fcomplete-member-pointers");
if (Args.hasFlag(options::OPT_moutline, options::OPT_mno_outline, false)) {
// We only support -moutline in AArch64 right now. If we're not compiling
// for AArch64, emit a warning and ignore the flag. Otherwise, add the
// proper mllvm flags.
if (Triple.getArch() != llvm::Triple::aarch64) {
D.Diag(diag::warn_drv_moutline_unsupported_opt) << Triple.getArchName();
} else {
CmdArgs.push_back("-mllvm");
CmdArgs.push_back("-enable-machine-outliner");
// The outliner shouldn't compete with linkers that dedupe linkonceodr
// functions in LTO. Enable that behaviour by default when compiling with
// LTO.
if (getToolChain().getDriver().isUsingLTO()) {
CmdArgs.push_back("-mllvm");
CmdArgs.push_back("-enable-linkonceodr-outlining");
}
}
}
// Finally add the compile command to the compilation.
if (Args.hasArg(options::OPT__SLASH_fallback) &&
Output.getType() == types::TY_Object &&

View File

@ -7,3 +7,6 @@
// FLTO: "-mllvm" "-enable-linkonceodr-outlining"
// RUN: %clang -target aarch64 -moutline -flto=full -S %s -### 2>&1 | FileCheck %s -check-prefix=TLTO
// TLTO: "-mllvm" "-enable-linkonceodr-outlining"
// RUN: %clang -target x86_64 -moutline -S %s -### 2>&1 | FileCheck %s -check-prefix=WARN
// WARN: warning: The 'x86_64' architecture does not support -moutline; flag ignored [-Woption-ignored]
// WARN-NOT: "-mllvm" "-enable-machine-outliner"