summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/X86/X86FrameLowering.cpp
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2012-01-12 20:24:30 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2012-01-12 20:24:30 +0000
commit00e861ed57ffa8bb6cfe011d518f6a947d899181 (patch)
tree25bb13154a7a310bd0e5dd583765554e237a4955 /llvm/lib/Target/X86/X86FrameLowering.cpp
parent10745d3381c9142ea75aba2c85b41ff57c1de4c9 (diff)
downloadbcm5719-llvm-00e861ed57ffa8bb6cfe011d518f6a947d899181.tar.gz
bcm5719-llvm-00e861ed57ffa8bb6cfe011d518f6a947d899181.zip
Support segmented stacks on 64-bit FreeBSD.
This patch uses tcb_spare field in the tcb structure to store info. Patch by Jyun-Yan You. llvm-svn: 148041
Diffstat (limited to 'llvm/lib/Target/X86/X86FrameLowering.cpp')
-rw-r--r--llvm/lib/Target/X86/X86FrameLowering.cpp10
1 files changed, 8 insertions, 2 deletions
diff --git a/llvm/lib/Target/X86/X86FrameLowering.cpp b/llvm/lib/Target/X86/X86FrameLowering.cpp
index 639f5c20559..e5f67526143 100644
--- a/llvm/lib/Target/X86/X86FrameLowering.cpp
+++ b/llvm/lib/Target/X86/X86FrameLowering.cpp
@@ -1357,8 +1357,9 @@ X86FrameLowering::adjustForSegmentedStacks(MachineFunction &MF) const {
if (MF.getFunction()->isVarArg())
report_fatal_error("Segmented stacks do not support vararg functions.");
- if (!ST->isTargetLinux() && !ST->isTargetDarwin() && !ST->isTargetWin32())
- report_fatal_error("Segmented stacks supported only on linux, darwin and win32.");
+ if (!ST->isTargetLinux() && !ST->isTargetDarwin() &&
+ !ST->isTargetWin32() && !ST->isTargetFreeBSD())
+ report_fatal_error("Segmented stacks not supported on this platform.");
MachineBasicBlock *allocMBB = MF.CreateMachineBasicBlock();
MachineBasicBlock *checkMBB = MF.CreateMachineBasicBlock();
@@ -1401,6 +1402,9 @@ X86FrameLowering::adjustForSegmentedStacks(MachineFunction &MF) const {
} else if (ST->isTargetDarwin()) {
TlsReg = X86::GS;
TlsOffset = 0x60 + 90*8; // See pthread_machdep.h. Steal TLS slot 90.
+ } else if (ST->isTargetFreeBSD()) {
+ TlsReg = X86::FS;
+ TlsOffset = 0x18;
} else {
report_fatal_error("Segmented stacks not supported on this platform.");
}
@@ -1423,6 +1427,8 @@ X86FrameLowering::adjustForSegmentedStacks(MachineFunction &MF) const {
} else if (ST->isTargetWin32()) {
TlsReg = X86::FS;
TlsOffset = 0x14; // pvArbitrary, reserved for application use
+ } else if (ST->isTargetFreeBSD()) {
+ report_fatal_error("Segmented stacks not supported on FreeBSD i386.");
} else {
report_fatal_error("Segmented stacks not supported on this platform.");
}
OpenPOWER on IntegriCloud