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