diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/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))