Index: cfe/trunk/lib/CodeGen/CodeGenFunction.cpp =================================================================== --- cfe/trunk/lib/CodeGen/CodeGenFunction.cpp +++ cfe/trunk/lib/CodeGen/CodeGenFunction.cpp @@ -979,6 +979,13 @@ if (FD->isMain()) Fn->addFnAttr(llvm::Attribute::NoRecurse); + // If a custom alignment is used, force realigning to this alignment on + // any main function which certainly will need it. + if (const FunctionDecl *FD = dyn_cast_or_null(D)) + if ((FD->isMain() || FD->isMSVCRTEntryPoint()) && + CGM.getCodeGenOpts().StackAlignment) + Fn->addFnAttr("stackrealign"); + llvm::BasicBlock *EntryBB = createBasicBlock("entry", CurFn); // Create a marker to make it easy to insert allocas into the entryblock Index: cfe/trunk/test/CodeGen/stackrealign-main.c =================================================================== --- cfe/trunk/test/CodeGen/stackrealign-main.c +++ cfe/trunk/test/CodeGen/stackrealign-main.c @@ -0,0 +1,19 @@ +// RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm -o - -mstack-alignment=64 %s | FileCheck %s + +// CHECK-LABEL: define void @other() +// CHECK: [[OTHER:#[0-9]+]] +// CHECK: { +void other(void) {} + +// CHECK-LABEL: define i32 @main( +// CHECK: [[MAIN:#[0-9]+]] +// CHECK: { +int main(int argc, char **argv) { + other(); + return 0; +} + +// CHECK: attributes [[OTHER]] = { noinline nounwind optnone +// CHECK-NOT: "stackrealign" +// CHECK: } +// CHECK: attributes [[MAIN]] = { noinline nounwind optnone {{.*}}"stackrealign"{{.*}} }