mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-18 01:17:46 +00:00
Add segmented stack support for DragonFlyBSD.
Patch by Michael Neumann. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@224936 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
2a1c1c9dea
commit
a21d820952
@ -377,6 +377,8 @@ public:
|
||||
return getOS() == Triple::FreeBSD;
|
||||
}
|
||||
|
||||
bool isOSDragonFly() const { return getOS() == Triple::DragonFly; }
|
||||
|
||||
bool isOSSolaris() const {
|
||||
return getOS() == Triple::Solaris;
|
||||
}
|
||||
|
@ -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()) {
|
||||
|
@ -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(); }
|
||||
|
@ -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" }
|
||||
|
Loading…
Reference in New Issue
Block a user