[SystemZ] Don't allow CL option -mpacked-stack with -mbackchain.
authorJonas Paulsson <paulsson@linux.vnet.ibm.com>
Mon, 30 Dec 2019 22:03:49 +0000 (23:03 +0100)
committerJonas Paulsson <paulsson@linux.vnet.ibm.com>
Fri, 3 Jan 2020 20:26:54 +0000 (12:26 -0800)
-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
clang/lib/Driver/ToolChains/Clang.cpp
clang/test/Driver/mbackchain.c [new file with mode: 0644]
llvm/lib/Target/SystemZ/SystemZFrameLowering.cpp

index 86aee33..808cca7 100644 (file)
@@ -2481,6 +2481,7 @@ def mrecord_mcount : Flag<["-"], "mrecord-mcount">, HelpText<"Generate a __mcoun
   Flags<[CC1Option]>, Group<m_Group>;
 def mpacked_stack : Flag<["-"], "mpacked-stack">, HelpText<"Use packed stack layout (SystemZ only).">,
   Flags<[CC1Option]>, Group<m_Group>;
+def mno_packed_stack : Flag<["-"], "mno-packed-stack">, Flags<[CC1Option]>, Group<m_Group>;
 def mips16 : Flag<["-"], "mips16">, Group<m_mips_Features_Group>;
 def mno_mips16 : Flag<["-"], "mno-mips16">, Group<m_mips_Features_Group>;
 def mmicromips : Flag<["-"], "mmicromips">, Group<m_mips_Features_Group>;
index 1b8eca0..e75dd6b 100644 (file)
@@ -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 (file)
index 0000000..3307682
--- /dev/null
@@ -0,0 +1,3 @@
+// RUN: %clang -target s390x -c -### %s -mpacked-stack -mbackchain 2>&1 | FileCheck %s
+
+// CHECK: error: unsupported option '-mpacked-stack -mbackchain'
index 3e2b376..3cdf6bf 100644 (file)
@@ -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;
 }