patch-r252503-arm-transient-stack-alignment.diff revision 269012
1This patch applies a workaround for an ARM EABI issue, where clang would 2sometimes incorrectly align the stack in a leaf function that uses TLS. 3 4Introduced here: http://svnweb.freebsd.org/changeset/base/252503 5 6Index: test/CodeGen/Thumb2/large-stack.ll 7=================================================================== 8--- test/CodeGen/Thumb2/large-stack.ll 9+++ test/CodeGen/Thumb2/large-stack.ll 10@@ -13,7 +13,7 @@ define void @test1() { 11 define void @test2() { 12 ; DARWIN-LABEL: test2: 13 ; DARWIN: sub.w sp, sp, #4160 14-; DARWIN: sub sp, #8 15+; DARWIN: sub sp, #12 16 ; LINUX-LABEL: test2: 17 ; LINUX: sub.w sp, sp, #4160 18 ; LINUX: sub sp, #8 19Index: test/CodeGen/ARM/2009-10-30.ll 20=================================================================== 21--- test/CodeGen/ARM/2009-10-30.ll 22+++ test/CodeGen/ARM/2009-10-30.ll 23@@ -4,9 +4,10 @@ 24 25 define void @f(i32 %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5, ...) { 26 entry: 27-;CHECK: sub sp, sp, #4 28-;CHECK: add r{{[0-9]+}}, sp, #8 29-;CHECK: str r{{[0-9]+}}, [sp], #4 30+;CHECK: sub sp, sp, #8 31+;CHECK: add r{{[0-9]+}}, sp, #12 32+;CHECK: str r{{[0-9]+}}, [sp, #4] 33+;CHECK: add sp, sp, #8 34 ;CHECK: bx lr 35 %ap = alloca i8*, align 4 36 %ap1 = bitcast i8** %ap to i8* 37Index: test/CodeGen/ARM/vargs_align.ll 38=================================================================== 39--- test/CodeGen/ARM/vargs_align.ll 40+++ test/CodeGen/ARM/vargs_align.ll 41@@ -15,8 +15,8 @@ entry: 42 return: ; preds = %entry 43 %retval2 = load i32* %retval ; <i32> [#uses=1] 44 ret i32 %retval2 45-; EABI: add sp, sp, #12 46 ; EABI: add sp, sp, #16 47+; EABI: add sp, sp, #16 48+; OABI: add sp, sp, #16 49 ; OABI: add sp, sp, #12 50-; OABI: add sp, sp, #12 51 } 52Index: test/CodeGen/ARM/prefetch-thumb.ll 53=================================================================== 54--- test/CodeGen/ARM/prefetch-thumb.ll 55+++ test/CodeGen/ARM/prefetch-thumb.ll 56@@ -10,8 +10,8 @@ entry: 57 ;ARM: pld [sp, #50] 58 59 ;THUMB2: t6: 60-;THUMB2: pld [sp] 61-;THUMB2: pld [sp, #50] 62+;THUMB2: pld [sp, #4] 63+;THUMB2: pld [sp, #54] 64 65 %red = alloca [100 x i8], align 1 66 %0 = getelementptr inbounds [100 x i8]* %red, i32 0, i32 0 67Index: lib/Target/ARM/ARMFrameLowering.h 68=================================================================== 69--- lib/Target/ARM/ARMFrameLowering.h 70+++ lib/Target/ARM/ARMFrameLowering.h 71@@ -27,7 +27,7 @@ class ARMFrameLowering : public TargetFrameLowerin 72 73 public: 74 explicit ARMFrameLowering(const ARMSubtarget &sti) 75- : TargetFrameLowering(StackGrowsDown, sti.getStackAlignment(), 0, 4), 76+ : TargetFrameLowering(StackGrowsDown, sti.getStackAlignment(), 0, 8), 77 STI(sti) { 78 } 79 80