r340334 - [CodeGen] Implicitly set stackrealign on the main function, if custom stack alignment is used

Martin Storsjo via cfe-commits cfe-commits at lists.llvm.org
Tue Aug 21 13:41:17 PDT 2018


Author: mstorsjo
Date: Tue Aug 21 13:41:17 2018
New Revision: 340334

URL: http://llvm.org/viewvc/llvm-project?rev=340334&view=rev
Log:
[CodeGen] Implicitly set stackrealign on the main function, if custom stack alignment is used

If using a custom stack alignment, one is expected to make sure
that all callers provide such alignment, or realign the stack in
all entry points (and callbacks).

Despite this, the compiler can assume that the main function will
need realignment in these cases, since the startup routines calling
the main function most probably won't provide the custom alignment.

This matches what GCC does in similar cases; if compiling with
-mincoming-stack-boundary=X -mpreferred-stack-boundary=X, GCC normally
assumes such alignment on entry to a function, but specifically for
the main function still does realignment.

Differential Revision: https://reviews.llvm.org/D51026

Added:
    cfe/trunk/test/CodeGen/stackrealign-main.c
Modified:
    cfe/trunk/lib/CodeGen/CodeGenFunction.cpp

Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.cpp?rev=340334&r1=340333&r2=340334&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenFunction.cpp (original)
+++ cfe/trunk/lib/CodeGen/CodeGenFunction.cpp Tue Aug 21 13:41:17 2018
@@ -979,6 +979,13 @@ void CodeGenFunction::StartFunction(Glob
       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<FunctionDecl>(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

Added: cfe/trunk/test/CodeGen/stackrealign-main.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/stackrealign-main.c?rev=340334&view=auto
==============================================================================
--- cfe/trunk/test/CodeGen/stackrealign-main.c (added)
+++ cfe/trunk/test/CodeGen/stackrealign-main.c Tue Aug 21 13:41:17 2018
@@ -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"{{.*}} }




More information about the cfe-commits mailing list