<div dir="ltr">How was this not handled by r214980?</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Aug 20, 2014 at 12:40 PM, Duncan P. N. Exon Smith <span dir="ltr"><<a href="mailto:dexonsmith@apple.com" target="_blank">dexonsmith@apple.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: dexonsmith<br>
Date: Wed Aug 20 14:40:59 2014<br>
New Revision: 216119<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=216119&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=216119&view=rev</a><br>
Log:<br>
X86: Align the stack on word boundaries in LowerFormalArguments()<br>
<br>
The goal of the patch is to implement section 3.2.3 of the AMD64 ABI<br>
correctly.  The controlling sentence is, "The size of each argument gets<br>
rounded up to eightbytes.  Therefore the stack will always be eightbyte<br>
aligned." The equivalent sentence in the i386 ABI page 37 says, "At all<br>
times, the stack pointer should point to a word-aligned area."  For both<br>
architectures, the stack pointer is not being rounded up to the nearest<br>
eightbyte or word between the last normal argument and the first<br>
variadic argument.<br>
<br>
Patch by Thomas Jablin!<br>
<br>
Added:<br>
    llvm/trunk/test/CodeGen/X86/aligned-variadic.ll<br>
Modified:<br>
    llvm/trunk/include/llvm/CodeGen/CallingConvLower.h<br>
    llvm/trunk/lib/Target/X86/X86ISelLowering.cpp<br>
<br>
Modified: llvm/trunk/include/llvm/CodeGen/CallingConvLower.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/CallingConvLower.h?rev=216119&r1=216118&r2=216119&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/CallingConvLower.h?rev=216119&r1=216118&r2=216119&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/include/llvm/CodeGen/CallingConvLower.h (original)<br>
+++ llvm/trunk/include/llvm/CodeGen/CallingConvLower.h Wed Aug 20 14:40:59 2014<br>
@@ -371,11 +371,16 @@ public:<br>
     return Reg;<br>
   }<br>
<br>
+  /// AlignStack - Align the top of the stakc to the specified alignment.<br>
+  void AlignStack(unsigned Align) {<br>
+    assert(Align && ((Align - 1) & Align) == 0); // Align is power of 2.<br>
+    StackOffset = ((StackOffset + Align - 1) & ~(Align - 1));<br>
+  }<br>
+<br>
   /// AllocateStack - Allocate a chunk of stack space with the specified size<br>
   /// and alignment.<br>
   unsigned AllocateStack(unsigned Size, unsigned Align) {<br>
-    assert(Align && ((Align-1) & Align) == 0); // Align is power of 2.<br>
-    StackOffset = ((StackOffset + Align-1) & ~(Align-1));<br>
+    AlignStack(Align);<br>
     unsigned Result = StackOffset;<br>
     StackOffset += Size;<br>
     MF.getFrameInfo()->ensureMaxAlignment(Align);<br>
<br>
Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=216119&r1=216118&r2=216119&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=216119&r1=216118&r2=216119&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)<br>
+++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Wed Aug 20 14:40:59 2014<br>
@@ -2300,6 +2300,7 @@ X86TargetLowering::LowerFormalArguments(<br>
     CCInfo.AllocateStack(32, 8);<br>
<br>
   CCInfo.AnalyzeFormalArguments(Ins, CC_X86);<br>
+  CCInfo.AlignStack(Is64Bit ? 8 : 4);<br>
<br>
   unsigned LastVal = ~0U;<br>
   SDValue ArgValue;<br>
<br>
Added: llvm/trunk/test/CodeGen/X86/aligned-variadic.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/aligned-variadic.ll?rev=216119&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/aligned-variadic.ll?rev=216119&view=auto</a><br>

==============================================================================<br>
--- llvm/trunk/test/CodeGen/X86/aligned-variadic.ll (added)<br>
+++ llvm/trunk/test/CodeGen/X86/aligned-variadic.ll Wed Aug 20 14:40:59 2014<br>
@@ -0,0 +1,30 @@<br>
+; RUN: llc < %s -march=x86-64 | FileCheck %s -check-prefix=X64<br>
+; RUN: llc < %s -march=x86    | FileCheck %s -check-prefix=X32<br>
+<br>
+%struct.Baz = type { [17 x i8] }<br>
+%struct.__va_list_tag = type { i32, i32, i8*, i8* }<br>
+<br>
+; Function Attrs: nounwind uwtable<br>
+define void @bar(%struct.Baz* byval nocapture readnone align 8 %x, ...) {<br>
+entry:<br>
+  %va = alloca [1 x %struct.__va_list_tag], align 16<br>
+  %arraydecay = getelementptr inbounds [1 x %struct.__va_list_tag]* %va, i64 0, i64 0<br>
+  %arraydecay1 = bitcast [1 x %struct.__va_list_tag]* %va to i8*<br>
+  call void @llvm.va_start(i8* %arraydecay1)<br>
+  %overflow_arg_area_p = getelementptr inbounds [1 x %struct.__va_list_tag]* %va, i64 0, i64 0, i32 2<br>
+  %overflow_arg_area = load i8** %overflow_arg_area_p, align 8<br>
+  %overflow_arg_area.next = getelementptr i8* %overflow_arg_area, i64 24<br>
+  store i8* %overflow_arg_area.next, i8** %overflow_arg_area_p, align 8<br>
+; X32: leal    68(%esp), [[REG:%.*]]<br>
+; X32: movl    [[REG]], 16(%esp)<br>
+; X64: leaq    232(%rsp), [[REG:%.*]]<br>
+; X64: movq    [[REG]], 184(%rsp)<br>
+; X64: leaq    176(%rsp), %rdi<br>
+  call void @qux(%struct.__va_list_tag* %arraydecay)<br>
+  ret void<br>
+}<br>
+<br>
+; Function Attrs: nounwind<br>
+declare void @llvm.va_start(i8*)<br>
+<br>
+declare void @qux(%struct.__va_list_tag*)<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>