From 44eae72c405692c4d1339b7d344ff398af49e9df Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Mon, 29 Dec 2014 15:47:28 +0000 Subject: [PATCH] Add segmented stack support for DragonFlyBSD. Patch by Michael Neumann. llvm-svn: 224936 --- llvm/include/llvm/ADT/Triple.h | 2 + llvm/lib/Target/X86/X86FrameLowering.cpp | 14 +++- llvm/lib/Target/X86/X86Subtarget.h | 1 + llvm/test/CodeGen/X86/segmented-stacks.ll | 108 ++++++++++++++++++++++++++++++ 4 files changed, 122 insertions(+), 3 deletions(-) diff --git a/llvm/include/llvm/ADT/Triple.h b/llvm/include/llvm/ADT/Triple.h index 0932040..bebbdeb 100644 --- a/llvm/include/llvm/ADT/Triple.h +++ b/llvm/include/llvm/ADT/Triple.h @@ -377,6 +377,8 @@ public: return getOS() == Triple::FreeBSD; } + bool isOSDragonFly() const { return getOS() == Triple::DragonFly; } + bool isOSSolaris() const { return getOS() == Triple::Solaris; } diff --git a/llvm/lib/Target/X86/X86FrameLowering.cpp b/llvm/lib/Target/X86/X86FrameLowering.cpp index cf738f4..c408fdd 100644 --- a/llvm/lib/Target/X86/X86FrameLowering.cpp +++ b/llvm/lib/Target/X86/X86FrameLowering.cpp @@ -1476,8 +1476,9 @@ X86FrameLowering::adjustForSegmentedStacks(MachineFunction &MF) const { if (MF.getFunction()->isVarArg()) report_fatal_error("Segmented stacks do not support vararg functions."); - if (!STI.isTargetLinux() && !STI.isTargetDarwin() && - !STI.isTargetWin32() && !STI.isTargetWin64() && !STI.isTargetFreeBSD()) + if (!STI.isTargetLinux() && !STI.isTargetDarwin() && !STI.isTargetWin32() && + !STI.isTargetWin64() && !STI.isTargetFreeBSD() && + !STI.isTargetDragonFly()) report_fatal_error("Segmented stacks not supported on this platform."); // Eventually StackSize will be calculated by a link-time pass; which will @@ -1531,6 +1532,9 @@ X86FrameLowering::adjustForSegmentedStacks(MachineFunction &MF) const { } else if (STI.isTargetFreeBSD()) { TlsReg = X86::FS; TlsOffset = 0x18; + } else if (STI.isTargetDragonFly()) { + TlsReg = X86::FS; + TlsOffset = 0x20; // use tls_tcb.tcb_segstack } else { report_fatal_error("Segmented stacks not supported on this platform."); } @@ -1553,6 +1557,9 @@ X86FrameLowering::adjustForSegmentedStacks(MachineFunction &MF) const { } else if (STI.isTargetWin32()) { TlsReg = X86::FS; TlsOffset = 0x14; // pvArbitrary, reserved for application use + } else if (STI.isTargetDragonFly()) { + TlsReg = X86::FS; + TlsOffset = 0x10; // use tls_tcb.tcb_segstack } else if (STI.isTargetFreeBSD()) { report_fatal_error("Segmented stacks not supported on FreeBSD i386."); } else { @@ -1565,7 +1572,8 @@ X86FrameLowering::adjustForSegmentedStacks(MachineFunction &MF) const { BuildMI(checkMBB, DL, TII.get(X86::LEA32r), ScratchReg).addReg(X86::ESP) .addImm(1).addReg(0).addImm(-StackSize).addReg(0); - if (STI.isTargetLinux() || STI.isTargetWin32() || STI.isTargetWin64()) { + if (STI.isTargetLinux() || STI.isTargetWin32() || STI.isTargetWin64() || + STI.isTargetDragonFly()) { BuildMI(checkMBB, DL, TII.get(X86::CMP32rm)).addReg(ScratchReg) .addReg(0).addImm(0).addReg(0).addImm(TlsOffset).addReg(TlsReg); } else if (STI.isTargetDarwin()) { diff --git a/llvm/lib/Target/X86/X86Subtarget.h b/llvm/lib/Target/X86/X86Subtarget.h index 7533be5..754b5b9 100644 --- a/llvm/lib/Target/X86/X86Subtarget.h +++ b/llvm/lib/Target/X86/X86Subtarget.h @@ -404,6 +404,7 @@ public: bool isTargetDarwin() const { return TargetTriple.isOSDarwin(); } bool isTargetFreeBSD() const { return TargetTriple.isOSFreeBSD(); } + bool isTargetDragonFly() const { return TargetTriple.isOSDragonFly(); } bool isTargetSolaris() const { return TargetTriple.isOSSolaris(); } bool isTargetELF() const { return TargetTriple.isOSBinFormatELF(); } diff --git a/llvm/test/CodeGen/X86/segmented-stacks.ll b/llvm/test/CodeGen/X86/segmented-stacks.ll index 2db7c11..45e157f 100644 --- a/llvm/test/CodeGen/X86/segmented-stacks.ll +++ b/llvm/test/CodeGen/X86/segmented-stacks.ll @@ -5,6 +5,8 @@ ; RUN: llc < %s -mcpu=generic -mtriple=x86_64-darwin -verify-machineinstrs | FileCheck %s -check-prefix=X64-Darwin ; RUN: llc < %s -mcpu=generic -mtriple=i686-mingw32 -verify-machineinstrs | FileCheck %s -check-prefix=X32-MinGW ; RUN: llc < %s -mcpu=generic -mtriple=x86_64-freebsd -verify-machineinstrs | FileCheck %s -check-prefix=X64-FreeBSD +; RUN: llc < %s -mcpu=generic -mtriple=i686-dragonfly -verify-machineinstrs | FileCheck %s -check-prefix=X32-DFlyBSD +; RUN: llc < %s -mcpu=generic -mtriple=x86_64-dragonfly -verify-machineinstrs | FileCheck %s -check-prefix=X64-DFlyBSD ; RUN: llc < %s -mcpu=generic -mtriple=x86_64-mingw32 -verify-machineinstrs | FileCheck %s -check-prefix=X64-MinGW ; We used to crash with filetype=obj @@ -15,6 +17,8 @@ ; RUN: llc < %s -mcpu=generic -mtriple=x86_64-darwin -filetype=obj ; RUN: llc < %s -mcpu=generic -mtriple=i686-mingw32 -filetype=obj ; RUN: llc < %s -mcpu=generic -mtriple=x86_64-freebsd -filetype=obj +; RUN: llc < %s -mcpu=generic -mtriple=i686-dragonfly -filetype=obj +; RUN: llc < %s -mcpu=generic -mtriple=x86_64-dragonfly -filetype=obj ; RUN: llc < %s -mcpu=generic -mtriple=x86_64-mingw32 -filetype=obj ; RUN: not llc < %s -mcpu=generic -mtriple=x86_64-solaris 2> %t.log @@ -114,6 +118,26 @@ define void @test_basic() #0 { ; X64-FreeBSD-NEXT: callq __morestack ; X64-FreeBSD-NEXT: ret +; X32-DFlyBSD-LABEL: test_basic: + +; X32-DFlyBSD: cmpl %fs:16, %esp +; X32-DFlyBSD-NEXT: ja .LBB0_2 + +; X32-DFlyBSD: pushl $0 +; X32-DFlyBSD-NEXT: pushl $48 +; X32-DFlyBSD-NEXT: calll __morestack +; X32-DFlyBSD-NEXT: ret + +; X64-DFlyBSD-LABEL: test_basic: + +; X64-DFlyBSD: cmpq %fs:32, %rsp +; X64-DFlyBSD-NEXT: ja .LBB0_2 + +; X64-DFlyBSD: movabsq $40, %r10 +; X64-DFlyBSD-NEXT: movabsq $0, %r11 +; X64-DFlyBSD-NEXT: callq __morestack +; X64-DFlyBSD-NEXT: ret + } define i32 @test_nested(i32 * nest %closure, i32 %other) #0 { @@ -199,6 +223,24 @@ define i32 @test_nested(i32 * nest %closure, i32 %other) #0 { ; X64-FreeBSD-NEXT: ret ; X64-FreeBSD-NEXT: movq %rax, %r10 +; X32-DFlyBSD: cmpl %fs:16, %esp +; X32-DFlyBSD-NEXT: ja .LBB1_2 + +; X32-DFlyBSD: pushl $4 +; X32-DFlyBSD-NEXT: pushl $52 +; X32-DFlyBSD-NEXT: calll __morestack +; X32-DFlyBSD-NEXT: ret + +; X64-DFlyBSD: cmpq %fs:32, %rsp +; X64-DFlyBSD-NEXT: ja .LBB1_2 + +; X64-DFlyBSD: movq %r10, %rax +; X64-DFlyBSD-NEXT: movabsq $56, %r10 +; X64-DFlyBSD-NEXT: movabsq $0, %r11 +; X64-DFlyBSD-NEXT: callq __morestack +; X64-DFlyBSD-NEXT: ret +; X64-DFlyBSD-NEXT: movq %rax, %r10 + } define void @test_large() #0 { @@ -280,6 +322,24 @@ define void @test_large() #0 { ; X64-FreeBSD-NEXT: callq __morestack ; X64-FreeBSD-NEXT: ret +; X32-DFlyBSD: leal -40008(%esp), %ecx +; X32-DFlyBSD-NEXT: cmpl %fs:16, %ecx +; X32-DFlyBSD-NEXT: ja .LBB2_2 + +; X32-DFlyBSD: pushl $0 +; X32-DFlyBSD-NEXT: pushl $40008 +; X32-DFlyBSD-NEXT: calll __morestack +; X32-DFlyBSD-NEXT: ret + +; X64-DFlyBSD: leaq -40008(%rsp), %r11 +; X64-DFlyBSD-NEXT: cmpq %fs:32, %r11 +; X64-DFlyBSD-NEXT: ja .LBB2_2 + +; X64-DFlyBSD: movabsq $40008, %r10 +; X64-DFlyBSD-NEXT: movabsq $0, %r11 +; X64-DFlyBSD-NEXT: callq __morestack +; X64-DFlyBSD-NEXT: ret + } define fastcc void @test_fastcc() #0 { @@ -368,6 +428,26 @@ define fastcc void @test_fastcc() #0 { ; X64-FreeBSD-NEXT: callq __morestack ; X64-FreeBSD-NEXT: ret +; X32-DFlyBSD-LABEL: test_fastcc: + +; X32-DFlyBSD: cmpl %fs:16, %esp +; X32-DFlyBSD-NEXT: ja .LBB3_2 + +; X32-DFlyBSD: pushl $0 +; X32-DFlyBSD-NEXT: pushl $48 +; X32-DFlyBSD-NEXT: calll __morestack +; X32-DFlyBSD-NEXT: ret + +; X64-DFlyBSD-LABEL: test_fastcc: + +; X64-DFlyBSD: cmpq %fs:32, %rsp +; X64-DFlyBSD-NEXT: ja .LBB3_2 + +; X64-DFlyBSD: movabsq $40, %r10 +; X64-DFlyBSD-NEXT: movabsq $0, %r11 +; X64-DFlyBSD-NEXT: callq __morestack +; X64-DFlyBSD-NEXT: ret + } define fastcc void @test_fastcc_large() #0 { @@ -464,6 +544,28 @@ define fastcc void @test_fastcc_large() #0 { ; X64-FreeBSD-NEXT: callq __morestack ; X64-FreeBSD-NEXT: ret +; X32-DFlyBSD-LABEL: test_fastcc_large: + +; X32-DFlyBSD: leal -40008(%esp), %eax +; X32-DFlyBSD-NEXT: cmpl %fs:16, %eax +; X32-DFlyBSD-NEXT: ja .LBB4_2 + +; X32-DFlyBSD: pushl $0 +; X32-DFlyBSD-NEXT: pushl $40008 +; X32-DFlyBSD-NEXT: calll __morestack +; X32-DFlyBSD-NEXT: ret + +; X64-DFlyBSD-LABEL: test_fastcc_large: + +; X64-DFlyBSD: leaq -40008(%rsp), %r11 +; X64-DFlyBSD-NEXT: cmpq %fs:32, %r11 +; X64-DFlyBSD-NEXT: ja .LBB4_2 + +; X64-DFlyBSD: movabsq $40008, %r10 +; X64-DFlyBSD-NEXT: movabsq $0, %r11 +; X64-DFlyBSD-NEXT: callq __morestack +; X64-DFlyBSD-NEXT: ret + } define fastcc void @test_fastcc_large_with_ecx_arg(i32 %a) #0 { @@ -515,6 +617,12 @@ define void @test_nostack() #0 { ; X64-FreeBSD-LABEL: test_nostack: ; X64-FreeBSD-NOT: callq __morestack + +; X32-DFlyBSD-LABEL: test_nostack: +; X32-DFlyBSD-NOT: calll __morestack + +; X64-DFlyBSD-LABEL: test_nostack: +; X64-DFlyBSD-NOT: callq __morestack } attributes #0 = { "split-stack" } -- 2.7.4