<div dir="ltr">Forgot to mention:<div><br>Patch by klutzy!</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Apr 1, 2014 at 11:34 AM, Reid Kleckner <span dir="ltr"><<a href="mailto:reid@kleckner.net" target="_blank">reid@kleckner.net</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: rnk<br>
Date: Tue Apr  1 13:34:21 2014<br>
New Revision: 205342<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=205342&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=205342&view=rev</a><br>
Log:<br>
Support segmented stacks on Win64<br>
<br>
Identical to Win32 method except the GS segment register is used for TLS<br>
instead of FS and pvArbitrary is at TEB offset 0x28 instead of 0x14.<br>
<br>
Modified:<br>
    llvm/trunk/lib/Target/X86/X86FrameLowering.cpp<br>
    llvm/trunk/test/CodeGen/X86/segmented-stacks.ll<br>
<br>
Modified: llvm/trunk/lib/Target/X86/X86FrameLowering.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86FrameLowering.cpp?rev=205342&r1=205341&r2=205342&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86FrameLowering.cpp?rev=205342&r1=205341&r2=205342&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/lib/Target/X86/X86FrameLowering.cpp (original)<br>
+++ llvm/trunk/lib/Target/X86/X86FrameLowering.cpp Tue Apr  1 13:34:21 2014<br>
@@ -1167,7 +1167,7 @@ X86FrameLowering::adjustForSegmentedStac<br>
   if (MF.getFunction()->isVarArg())<br>
     report_fatal_error("Segmented stacks do not support vararg functions.");<br>
   if (!STI.isTargetLinux() && !STI.isTargetDarwin() &&<br>
-      !STI.isTargetWin32() && !STI.isTargetFreeBSD())<br>
+      !STI.isTargetWin32() && !STI.isTargetWin64() && !STI.isTargetFreeBSD())<br>
     report_fatal_error("Segmented stacks not supported on this platform.");<br>
<br>
   MachineBasicBlock *allocMBB = MF.CreateMachineBasicBlock();<br>
@@ -1211,6 +1211,9 @@ X86FrameLowering::adjustForSegmentedStac<br>
     } else if (STI.isTargetDarwin()) {<br>
       TlsReg = X86::GS;<br>
       TlsOffset = 0x60 + 90*8; // See pthread_machdep.h. Steal TLS slot 90.<br>
+    } else if (STI.isTargetWin64()) {<br>
+      TlsReg = X86::GS;<br>
+      TlsOffset = 0x28; // pvArbitrary, reserved for application use<br>
     } else if (STI.isTargetFreeBSD()) {<br>
       TlsReg = X86::FS;<br>
       TlsOffset = 0x18;<br>
@@ -1248,7 +1251,7 @@ X86FrameLowering::adjustForSegmentedStac<br>
       BuildMI(checkMBB, DL, TII.get(X86::LEA32r), ScratchReg).addReg(X86::ESP)<br>
         .addImm(1).addReg(0).addImm(-StackSize).addReg(0);<br>
<br>
-    if (STI.isTargetLinux() || STI.isTargetWin32()) {<br>
+    if (STI.isTargetLinux() || STI.isTargetWin32() || STI.isTargetWin64()) {<br>
       BuildMI(checkMBB, DL, TII.get(X86::CMP32rm)).addReg(ScratchReg)<br>
         .addReg(0).addImm(0).addReg(0).addImm(TlsOffset).addReg(TlsReg);<br>
     } else if (STI.isTargetDarwin()) {<br>
<br>
Modified: llvm/trunk/test/CodeGen/X86/segmented-stacks.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/segmented-stacks.ll?rev=205342&r1=205341&r2=205342&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/segmented-stacks.ll?rev=205342&r1=205341&r2=205342&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/test/CodeGen/X86/segmented-stacks.ll (original)<br>
+++ llvm/trunk/test/CodeGen/X86/segmented-stacks.ll Tue Apr  1 13:34:21 2014<br>
@@ -4,6 +4,7 @@<br>
 ; RUN: llc < %s -mcpu=generic -mtriple=x86_64-darwin -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=X64-Darwin<br>
 ; RUN: llc < %s -mcpu=generic -mtriple=i686-mingw32 -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=X32-MinGW<br>
 ; RUN: llc < %s -mcpu=generic -mtriple=x86_64-freebsd -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=X64-FreeBSD<br>
+; RUN: llc < %s -mcpu=generic -mtriple=x86_64-mingw32 -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=X64-MinGW<br>
<br>
 ; We used to crash with filetype=obj<br>
 ; RUN: llc < %s -mcpu=generic -mtriple=i686-linux -segmented-stacks -filetype=obj<br>
@@ -12,16 +13,14 @@<br>
 ; RUN: llc < %s -mcpu=generic -mtriple=x86_64-darwin -segmented-stacks -filetype=obj<br>
 ; RUN: llc < %s -mcpu=generic -mtriple=i686-mingw32 -segmented-stacks -filetype=obj<br>
 ; RUN: llc < %s -mcpu=generic -mtriple=x86_64-freebsd -segmented-stacks -filetype=obj<br>
+; RUN: llc < %s -mcpu=generic -mtriple=x86_64-mingw32 -segmented-stacks -filetype=obj<br>
<br>
 ; RUN: not llc < %s -mcpu=generic -mtriple=x86_64-solaris -segmented-stacks 2> %t.log<br>
 ; RUN: FileCheck %s -input-file=%t.log -check-prefix=X64-Solaris<br>
-; RUN: not llc < %s -mcpu=generic -mtriple=x86_64-mingw32 -segmented-stacks 2> %t.log<br>
-; RUN: FileCheck %s -input-file=%t.log -check-prefix=X64-MinGW<br>
 ; RUN: not llc < %s -mcpu=generic -mtriple=i686-freebsd -segmented-stacks 2> %t.log<br>
 ; RUN: FileCheck %s -input-file=%t.log -check-prefix=X32-FreeBSD<br>
<br>
 ; X64-Solaris: Segmented stacks not supported on this platform<br>
-; X64-MinGW: Segmented stacks not supported on this platform<br>
 ; X32-FreeBSD: Segmented stacks not supported on FreeBSD i386<br>
<br>
 ; Just to prevent the alloca from being optimized away<br>
@@ -83,6 +82,16 @@ define void @test_basic() {<br>
 ; X32-MinGW-NEXT:  calll ___morestack<br>
 ; X32-MinGW-NEXT:  ret<br>
<br>
+; X64-MinGW-LABEL:       test_basic:<br>
+<br>
+; X64-MinGW:       cmpq %gs:40, %rsp<br>
+; X64-MinGW-NEXT:  ja      .LBB0_2<br>
+<br>
+; X64-MinGW:       movabsq $72, %r10<br>
+; X64-MinGW-NEXT:  movabsq $32, %r11<br>
+; X64-MinGW-NEXT:  callq __morestack<br>
+; X64-MinGW-NEXT:  retq<br>
+<br>
 ; X64-FreeBSD-LABEL:       test_basic:<br>
<br>
 ; X64-FreeBSD:       cmpq %fs:24, %rsp<br>
@@ -145,6 +154,17 @@ define i32 @test_nested(i32 * nest %clos<br>
 ; X32-MinGW-NEXT:  calll ___morestack<br>
 ; X32-MinGW-NEXT:  ret<br>
<br>
+; X64-MinGW-LABEL: test_nested:<br>
+; X64-MinGW:       cmpq %gs:40, %rsp<br>
+; X64-MinGW-NEXT:  ja      .LBB1_2<br>
+<br>
+; X64-MinGW:       movq %r10, %rax<br>
+; X64-MinGW-NEXT:  movabsq $0, %r10<br>
+; X64-MinGW-NEXT:  movabsq $32, %r11<br>
+; X64-MinGW-NEXT:  callq __morestack<br>
+; X64-MinGW-NEXT:  retq<br>
+; X64-MinGW-NEXT:  movq %rax, %r10<br>
+<br>
 ; X64-FreeBSD:       cmpq %fs:24, %rsp<br>
 ; X64-FreeBSD-NEXT:  ja      .LBB1_2<br>
<br>
@@ -208,6 +228,16 @@ define void @test_large() {<br>
 ; X32-MinGW-NEXT:  calll ___morestack<br>
 ; X32-MinGW-NEXT:  ret<br>
<br>
+; X64-MinGW-LABEL: test_large:<br>
+; X64-MinGW:       leaq -40040(%rsp), %r11<br>
+; X64-MinGW-NEXT:  cmpq %gs:40, %r11<br>
+; X64-MinGW-NEXT:  ja      .LBB2_2<br>
+<br>
+; X64-MinGW:       movabsq $40040, %r10<br>
+; X64-MinGW-NEXT:  movabsq $32, %r11<br>
+; X64-MinGW-NEXT:  callq __morestack<br>
+; X64-MinGW-NEXT:  retq<br>
+<br>
 ; X64-FreeBSD:       leaq -40008(%rsp), %r11<br>
 ; X64-FreeBSD-NEXT:  cmpq %fs:24, %r11<br>
 ; X64-FreeBSD-NEXT:  ja      .LBB2_2<br>
@@ -275,6 +305,16 @@ define fastcc void @test_fastcc() {<br>
 ; X32-MinGW-NEXT:  calll ___morestack<br>
 ; X32-MinGW-NEXT:  ret<br>
<br>
+; X64-MinGW-LABEL:       test_fastcc:<br>
+<br>
+; X64-MinGW:       cmpq %gs:40, %rsp<br>
+; X64-MinGW-NEXT:  ja      .LBB3_2<br>
+<br>
+; X64-MinGW:       movabsq $72, %r10<br>
+; X64-MinGW-NEXT:  movabsq $32, %r11<br>
+; X64-MinGW-NEXT:  callq __morestack<br>
+; X64-MinGW-NEXT:  retq<br>
+<br>
 ; X64-FreeBSD-LABEL:       test_fastcc:<br>
<br>
 ; X64-FreeBSD:       cmpq %fs:24, %rsp<br>
@@ -348,6 +388,17 @@ define fastcc void @test_fastcc_large()<br>
 ; X32-MinGW-NEXT:  calll ___morestack<br>
 ; X32-MinGW-NEXT:  ret<br>
<br>
+; X64-MinGW-LABEL:       test_fastcc_large:<br>
+<br>
+; X64-MinGW:       leaq -40040(%rsp), %r11<br>
+; X64-MinGW-NEXT:  cmpq %gs:40, %r11<br>
+; X64-MinGW-NEXT:  ja      .LBB4_2<br>
+<br>
+; X64-MinGW:       movabsq $40040, %r10<br>
+; X64-MinGW-NEXT:  movabsq $32, %r11<br>
+; X64-MinGW-NEXT:  callq __morestack<br>
+; X64-MinGW-NEXT:  retq<br>
+<br>
 ; X64-FreeBSD-LABEL:       test_fastcc_large:<br>
<br>
 ; X64-FreeBSD:       leaq -40008(%rsp), %r11<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>