diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2012-01-11 18:41:19 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2012-01-11 18:41:19 +0000 |
commit | 25cd4ff97e882ad5039dec15b0c9be8fef062b6b (patch) | |
tree | 510cf4f8702c2c9b709fe2ba1e048f14cedc5bb5 | |
parent | 11f0e7b158d669a8c630068a0d8bdd107caef487 (diff) | |
download | llvm-25cd4ff97e882ad5039dec15b0c9be8fef062b6b.tar.gz llvm-25cd4ff97e882ad5039dec15b0c9be8fef062b6b.tar.bz2 llvm-25cd4ff97e882ad5039dec15b0c9be8fef062b6b.tar.xz |
Generate the segmented stack prologue for fastcc too.
Patch by Brian Anderson.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@147958 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Target/X86/X86FrameLowering.cpp | 3 | ||||
-rw-r--r-- | test/CodeGen/X86/segmented-stacks.ll | 55 |
2 files changed, 57 insertions, 1 deletions
diff --git a/lib/Target/X86/X86FrameLowering.cpp b/lib/Target/X86/X86FrameLowering.cpp index fba4788d6a..4386762c85 100644 --- a/lib/Target/X86/X86FrameLowering.cpp +++ b/lib/Target/X86/X86FrameLowering.cpp @@ -1306,7 +1306,8 @@ GetScratchRegister(bool Is64Bit, const MachineFunction &MF) { CallingConv::ID CallingConvention = MF.getFunction()->getCallingConv(); bool IsNested = HasNestArgument(&MF); - if (CallingConvention == CallingConv::X86_FastCall) { + if (CallingConvention == CallingConv::X86_FastCall || + CallingConvention == CallingConv::Fast) { if (IsNested) { report_fatal_error("Segmented stacks does not support fastcall with " "nested function."); diff --git a/test/CodeGen/X86/segmented-stacks.ll b/test/CodeGen/X86/segmented-stacks.ll index 27537c085c..0e125d36a7 100644 --- a/test/CodeGen/X86/segmented-stacks.ll +++ b/test/CodeGen/X86/segmented-stacks.ll @@ -114,3 +114,58 @@ define void @test_large() { ; X64-NEXT: ret } + +define fastcc void @test_fastcc() { + %mem = alloca i32, i32 10 + call void @dummy_use (i32* %mem, i32 10) + ret void + +; X32: test_fastcc: + +; X32: cmpl %gs:48, %esp +; X32-NEXT: ja .LBB3_2 + +; X32: pushl $0 +; X32-NEXT: pushl $60 +; X32-NEXT: calll __morestack +; X32-NEXT: ret + +; X64: test_fastcc: + +; X64: cmpq %fs:112, %rsp +; X64-NEXT: ja .LBB3_2 + +; X64: movabsq $40, %r10 +; X64-NEXT: movabsq $0, %r11 +; X64-NEXT: callq __morestack +; X64-NEXT: ret + +} + +define fastcc void @test_fastcc_large() { + %mem = alloca i32, i32 10000 + call void @dummy_use (i32* %mem, i32 0) + ret void + +; X32: test_fastcc_large: + +; X32: leal -40012(%esp), %eax +; X32-NEXT: cmpl %gs:48, %eax +; X32-NEXT: ja .LBB4_2 + +; X32: pushl $0 +; X32-NEXT: pushl $40012 +; X32-NEXT: calll __morestack +; X32-NEXT: ret + +; X64: test_fastcc_large: + +; X64: leaq -40008(%rsp), %r11 +; X64-NEXT: cmpq %fs:112, %r11 +; X64-NEXT: ja .LBB4_2 + +; X64: movabsq $40008, %r10 +; X64-NEXT: movabsq $0, %r11 +; X64-NEXT: callq __morestack +; X64-NEXT: ret +} |