From c0f1eac008e61e8345e3f41347cfd191e4ecb215 Mon Sep 17 00:00:00 2001 From: Jonas Paulsson Date: Mon, 30 Dec 2019 23:03:49 +0100 Subject: [PATCH] [SystemZ] Don't allow CL option -mpacked-stack with -mbackchain. -mpacked-stack is currently not supported with -mbackchain, so this should result in a compilation error message instead of being silently ignored. Review: Ulrich Weigand --- clang/include/clang/Driver/Options.td | 1 + clang/lib/Driver/ToolChains/Clang.cpp | 16 +++++++++++++--- clang/test/Driver/mbackchain.c | 3 +++ llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp | 2 ++ 4 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 clang/test/Driver/mbackchain.c diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 86aee334436a..808cca76c6be 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -2481,6 +2481,7 @@ def mrecord_mcount : Flag<["-"], "mrecord-mcount">, HelpText<"Generate a __mcoun Flags<[CC1Option]>, Group; def mpacked_stack : Flag<["-"], "mpacked-stack">, HelpText<"Use packed stack layout (SystemZ only).">, Flags<[CC1Option]>, Group; +def mno_packed_stack : Flag<["-"], "mno-packed-stack">, Flags<[CC1Option]>, Group; def mips16 : Flag<["-"], "mips16">, Group; def mno_mips16 : Flag<["-"], "mno-mips16">, Group; def mmicromips : Flag<["-"], "mmicromips">, Group; diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 1b8eca0ea0d7..e75dd6badc14 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -1991,8 +1991,20 @@ void Clang::AddSparcTargetArgs(const ArgList &Args, void Clang::AddSystemZTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const { - if (Args.hasFlag(options::OPT_mbackchain, options::OPT_mno_backchain, false)) + bool HasBackchain = Args.hasFlag(options::OPT_mbackchain, + options::OPT_mno_backchain, false); + bool HasPackedStack = Args.hasFlag(options::OPT_mpacked_stack, + options::OPT_mno_packed_stack, false); + if (HasBackchain && HasPackedStack) { + const Driver &D = getToolChain().getDriver(); + D.Diag(diag::err_drv_unsupported_opt) + << Args.getLastArg(options::OPT_mpacked_stack)->getAsString(Args) + + " " + Args.getLastArg(options::OPT_mbackchain)->getAsString(Args); + } + if (HasBackchain) CmdArgs.push_back("-mbackchain"); + if (HasPackedStack) + CmdArgs.push_back("-mpacked-stack"); } void Clang::AddX86TargetArgs(const ArgList &Args, @@ -5014,8 +5026,6 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, } } - Args.AddLastArg(CmdArgs, options::OPT_mpacked_stack); - if (Args.getLastArg(options::OPT_fapple_kext) || (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType))) CmdArgs.push_back("-fapple-kext"); diff --git a/clang/test/Driver/mbackchain.c b/clang/test/Driver/mbackchain.c new file mode 100644 index 000000000000..33076829ccd7 --- /dev/null +++ b/clang/test/Driver/mbackchain.c @@ -0,0 +1,3 @@ +// RUN: %clang -target s390x -c -### %s -mpacked-stack -mbackchain 2>&1 | FileCheck %s + +// CHECK: error: unsupported option '-mpacked-stack -mbackchain' diff --git a/llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp b/llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp index 3e2b376d3be6..3cdf6bf98ee0 100644 --- a/llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp +++ b/llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp @@ -68,6 +68,8 @@ static bool usePackedStack(MachineFunction &MF) { bool CallConv = MF.getFunction().getCallingConv() != CallingConv::GHC; bool BackChain = MF.getFunction().hasFnAttribute("backchain"); bool FramAddressTaken = MF.getFrameInfo().isFrameAddressTaken(); + if (HasPackedStackAttr && BackChain) + report_fatal_error("packed-stack with backchain is currently unsupported."); return HasPackedStackAttr && !IsVarArg && CallConv && !BackChain && !FramAddressTaken; } -- GitLab