[PATCH] D87615: [clang][Driver] Force stack realignment on 32-bit Solaris/x86

Rainer Orth via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Mon Sep 14 07:55:15 PDT 2020


ro created this revision.
ro added reviewers: MaskRay, rahmanl, efriedma, RKSimon.
ro added a project: clang.
Herald added a subscriber: fedor.sergeev.
ro requested review of this revision.

On Solaris/x86, several hundred 32-bit tests `FAIL`, all in the same way:

  env ASAN_OPTIONS=halt_on_error=false ./halt_on_error_suppress_equal_pcs.cpp.tmp
  Segmentation Fault (core dumped)

They segfault during startup:

  Thread 2 received signal SIGSEGV, Segmentation fault.
  [Switching to Thread 1 (LWP 1)]
  0x080f21f0 in __sanitizer::internal_mmap(void*, unsigned long, int, int, int, unsigned long long) () at /vol/llvm/src/llvm-project/dist/compiler-rt/lib/sanitizer_common/sanitizer_solaris.cpp:65
  65	                             int prot, int flags, int fd, OFF_T offset) {
  1: x/i $pc
  => 0x80f21f0 <_ZN11__sanitizer13internal_mmapEPvmiiiy+16>:	movaps 0x30(%esp),%xmm0
  (gdb) p/x $esp
  $3 = 0xfeffd488

The problem is that `movaps` expects 16-byte alignment, while 32-bit Solaris/x86
only guarantees 4-byte alignment following the i386 psABI.

This patch avoid the issue by defaulting to `-mstackrealign`, just like `gcc`.

Tested on `amd64-pc-solaris2.11`.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D87615

Files:
  clang/lib/Driver/ToolChains/Clang.cpp


Index: clang/lib/Driver/ToolChains/Clang.cpp
===================================================================
--- clang/lib/Driver/ToolChains/Clang.cpp
+++ clang/lib/Driver/ToolChains/Clang.cpp
@@ -2030,6 +2030,14 @@
   const Driver &D = getToolChain().getDriver();
   addX86AlignBranchArgs(D, Args, CmdArgs, /*IsLTO=*/false);
 
+  // 32-bit Solaris/x86 only guarantees 4-byte stack alignment as required by
+  // the i386 psABI, so realign it as necessary for SSE instructions.
+  const llvm::Triple &Triple = getToolChain().getTriple();
+  if (Triple.isOSSolaris() && Triple.getArch() == llvm::Triple::x86 &&
+      Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
+                   true))
+    CmdArgs.push_back("-mstackrealign");
+
   if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
       Args.hasArg(options::OPT_mkernel) ||
       Args.hasArg(options::OPT_fapple_kext))


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D87615.291568.patch
Type: text/x-patch
Size: 935 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20200914/d2a007eb/attachment.bin>


More information about the cfe-commits mailing list