1263320SdimThis patch applies a workaround for an ARM EABI issue, where clang would 2263320Sdimsometimes incorrectly align the stack in a leaf function that uses TLS. 3263320Sdim 4269012SemasteIntroduced here: http://svnweb.freebsd.org/changeset/base/252503 5263320Sdim 6263320SdimIndex: test/CodeGen/Thumb2/large-stack.ll 7263320Sdim=================================================================== 8263320Sdim--- test/CodeGen/Thumb2/large-stack.ll 9263320Sdim+++ test/CodeGen/Thumb2/large-stack.ll 10263320Sdim@@ -13,7 +13,7 @@ define void @test1() { 11263320Sdim define void @test2() { 12263320Sdim ; DARWIN-LABEL: test2: 13263320Sdim ; DARWIN: sub.w sp, sp, #4160 14263320Sdim-; DARWIN: sub sp, #8 15263320Sdim+; DARWIN: sub sp, #12 16263320Sdim ; LINUX-LABEL: test2: 17263320Sdim ; LINUX: sub.w sp, sp, #4160 18263320Sdim ; LINUX: sub sp, #8 19263320SdimIndex: test/CodeGen/ARM/2009-10-30.ll 20263320Sdim=================================================================== 21263320Sdim--- test/CodeGen/ARM/2009-10-30.ll 22263320Sdim+++ test/CodeGen/ARM/2009-10-30.ll 23263320Sdim@@ -4,9 +4,10 @@ 24263320Sdim 25263320Sdim define void @f(i32 %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5, ...) { 26263320Sdim entry: 27263320Sdim-;CHECK: sub sp, sp, #4 28263320Sdim-;CHECK: add r{{[0-9]+}}, sp, #8 29263320Sdim-;CHECK: str r{{[0-9]+}}, [sp], #4 30263320Sdim+;CHECK: sub sp, sp, #8 31263320Sdim+;CHECK: add r{{[0-9]+}}, sp, #12 32263320Sdim+;CHECK: str r{{[0-9]+}}, [sp, #4] 33263320Sdim+;CHECK: add sp, sp, #8 34263320Sdim ;CHECK: bx lr 35263320Sdim %ap = alloca i8*, align 4 36263320Sdim %ap1 = bitcast i8** %ap to i8* 37263320SdimIndex: test/CodeGen/ARM/vargs_align.ll 38263320Sdim=================================================================== 39263320Sdim--- test/CodeGen/ARM/vargs_align.ll 40263320Sdim+++ test/CodeGen/ARM/vargs_align.ll 41263320Sdim@@ -15,8 +15,8 @@ entry: 42263320Sdim return: ; preds = %entry 43263320Sdim %retval2 = load i32* %retval ; <i32> [#uses=1] 44263320Sdim ret i32 %retval2 45263320Sdim-; EABI: add sp, sp, #12 46263320Sdim ; EABI: add sp, sp, #16 47263320Sdim+; EABI: add sp, sp, #16 48263320Sdim+; OABI: add sp, sp, #16 49263320Sdim ; OABI: add sp, sp, #12 50263320Sdim-; OABI: add sp, sp, #12 51263320Sdim } 52263320SdimIndex: test/CodeGen/ARM/prefetch-thumb.ll 53263320Sdim=================================================================== 54263320Sdim--- test/CodeGen/ARM/prefetch-thumb.ll 55263320Sdim+++ test/CodeGen/ARM/prefetch-thumb.ll 56263320Sdim@@ -10,8 +10,8 @@ entry: 57263320Sdim ;ARM: pld [sp, #50] 58263320Sdim 59263320Sdim ;THUMB2: t6: 60263320Sdim-;THUMB2: pld [sp] 61263320Sdim-;THUMB2: pld [sp, #50] 62263320Sdim+;THUMB2: pld [sp, #4] 63263320Sdim+;THUMB2: pld [sp, #54] 64263320Sdim 65263320Sdim %red = alloca [100 x i8], align 1 66263320Sdim %0 = getelementptr inbounds [100 x i8]* %red, i32 0, i32 0 67263320SdimIndex: lib/Target/ARM/ARMFrameLowering.h 68263320Sdim=================================================================== 69263320Sdim--- lib/Target/ARM/ARMFrameLowering.h 70263320Sdim+++ lib/Target/ARM/ARMFrameLowering.h 71263320Sdim@@ -27,7 +27,7 @@ class ARMFrameLowering : public TargetFrameLowerin 72263320Sdim 73263320Sdim public: 74263320Sdim explicit ARMFrameLowering(const ARMSubtarget &sti) 75263320Sdim- : TargetFrameLowering(StackGrowsDown, sti.getStackAlignment(), 0, 4), 76263320Sdim+ : TargetFrameLowering(StackGrowsDown, sti.getStackAlignment(), 0, 8), 77263320Sdim STI(sti) { 78263320Sdim } 79263320Sdim 80