Index: include/llvm/CodeGen/CommandFlags.h =================================================================== --- include/llvm/CodeGen/CommandFlags.h +++ include/llvm/CodeGen/CommandFlags.h @@ -182,6 +182,11 @@ cl::desc("Override default stack alignment"), cl::init(0)); +cl::opt +ForceAlignStack("force-align-stack", + cl::desc("Force align the stack to the minimum alignment " + "needed for the function."), cl::init(false)); + cl::opt TrapFuncName("trap-func", cl::Hidden, cl::desc("Emit a call to trap function rather than a trap instruction"), @@ -330,6 +335,10 @@ "disable-tail-calls", toStringRef(DisableTailCalls)); + if (ForceAlignStack) + NewAttrs = NewAttrs.addAttribute(Ctx, AttributeSet::FunctionIndex, + "force-align-stack"); + if (TrapFuncName.getNumOccurrences() > 0) for (auto &B : F) for (auto &I : B) Index: include/llvm/Target/TargetRegisterInfo.h =================================================================== --- include/llvm/Target/TargetRegisterInfo.h +++ include/llvm/Target/TargetRegisterInfo.h @@ -35,8 +35,6 @@ class raw_ostream; class LiveRegMatrix; -extern cl::opt ForceStackAlign; - class TargetRegisterClass { public: typedef const MCPhysReg* iterator; Index: lib/CodeGen/TargetRegisterInfo.cpp =================================================================== --- lib/CodeGen/TargetRegisterInfo.cpp +++ lib/CodeGen/TargetRegisterInfo.cpp @@ -24,14 +24,6 @@ #define DEBUG_TYPE "target-reg-info" -namespace llvm { -cl::opt - ForceStackAlign("force-align-stack", - cl::desc("Force align the stack to the minimum alignment" - " needed for the function."), - cl::init(false), cl::Hidden); -} // end namespace llvm - using namespace llvm; TargetRegisterInfo::TargetRegisterInfo(const TargetRegisterInfoDesc *ID, @@ -321,7 +313,8 @@ unsigned StackAlign = TFI->getStackAlignment(); bool requiresRealignment = ((MFI->getMaxAlignment() > StackAlign) || F->hasFnAttribute(Attribute::StackAlignment)); - if (ForceStackAlign || requiresRealignment) { + if (MF.getFunction()->hasFnAttribute("force-align-stack") || + requiresRealignment) { if (canRealignStack(MF)) return true; DEBUG(dbgs() << "Can't realign function's stack: " << F->getName() << "\n"); Index: lib/Target/X86/X86FrameLowering.cpp =================================================================== --- lib/Target/X86/X86FrameLowering.cpp +++ lib/Target/X86/X86FrameLowering.cpp @@ -498,7 +498,7 @@ const MachineFrameInfo *MFI = MF.getFrameInfo(); uint64_t MaxAlign = MFI->getMaxAlignment(); // Desired stack alignment. unsigned StackAlign = getStackAlignment(); - if (ForceStackAlign) { + if (MF.getFunction()->hasFnAttribute("force-align-stack")) { if (MFI->hasCalls()) MaxAlign = (StackAlign > MaxAlign) ? StackAlign : MaxAlign; else if (MaxAlign < SlotSize)