forked from llvm/llvm-project
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Support for 32-bit mingw-w64 in compiler-rt.
Add chkstk/alloca for gcc objects. Replace or instructions with test, the latter should be marginally more efficent, as it does not write to memory. Differential Revision: http://reviews.llvm.org/D14044 Patch by vadimcn llvm-svn: 251928
- Loading branch information
Showing
5 changed files
with
88 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
// This file is dual licensed under the MIT and the University of Illinois Open | ||
// Source Licenses. See LICENSE.TXT for details. | ||
|
||
#include "../assembly.h" | ||
|
||
#ifdef __i386__ | ||
|
||
// _chkstk (_alloca) routine - probe stack between %esp and (%esp-%eax) in 4k increments, | ||
// then decrement %esp by %eax. Preserves all registers except %esp and flags. | ||
// This routine is windows specific | ||
// http://msdn.microsoft.com/en-us/library/ms648426.aspx | ||
|
||
.text | ||
.balign 4 | ||
DEFINE_COMPILERRT_FUNCTION(_alloca) // _chkstk and _alloca are the same function | ||
DEFINE_COMPILERRT_FUNCTION(__chkstk) | ||
push %ecx | ||
cmp $0x1000,%eax | ||
lea 8(%esp),%ecx // esp before calling this routine -> ecx | ||
jb 1f | ||
2: | ||
sub $0x1000,%ecx | ||
test %ecx,(%ecx) | ||
sub $0x1000,%eax | ||
cmp $0x1000,%eax | ||
ja 2b | ||
1: | ||
sub %eax,%ecx | ||
test %ecx,(%ecx) | ||
|
||
lea 4(%esp),%eax // load pointer to the return address into eax | ||
mov %ecx,%esp // install the new top of stack pointer into esp | ||
mov -4(%eax),%ecx // restore ecx | ||
push (%eax) // push return address onto the stack | ||
sub %esp,%eax // restore the original value in eax | ||
ret | ||
END_COMPILERRT_FUNCTION(__chkstk) | ||
END_COMPILERRT_FUNCTION(_alloca) | ||
|
||
#endif // __i386__ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
// This file is dual licensed under the MIT and the University of Illinois Open | ||
// Source Licenses. See LICENSE.TXT for details. | ||
|
||
#include "../assembly.h" | ||
|
||
#ifdef __x86_64__ | ||
|
||
// _chkstk (_alloca) routine - probe stack between %rsp and (%rsp-%rax) in 4k increments, | ||
// then decrement %rsp by %rax. Preserves all registers except %rsp and flags. | ||
// This routine is windows specific | ||
// http://msdn.microsoft.com/en-us/library/ms648426.aspx | ||
|
||
.text | ||
.balign 4 | ||
DEFINE_COMPILERRT_FUNCTION(__alloca) | ||
mov %rcx,%rax // x64 _alloca is a normal function with parameter in rcx | ||
// fallthrough | ||
DEFINE_COMPILERRT_FUNCTION(___chkstk) | ||
push %rcx | ||
cmp $0x1000,%rax | ||
lea 16(%rsp),%rcx // rsp before calling this routine -> rcx | ||
jb 1f | ||
2: | ||
sub $0x1000,%rcx | ||
test %rcx,(%rcx) | ||
sub $0x1000,%rax | ||
cmp $0x1000,%rax | ||
ja 2b | ||
1: | ||
sub %rax,%rcx | ||
test %rcx,(%rcx) | ||
|
||
lea 8(%rsp),%rax // load pointer to the return address into rax | ||
mov %rcx,%rsp // install the new top of stack pointer into rsp | ||
mov -8(%rax),%rcx // restore rcx | ||
push (%rax) // push return address onto the stack | ||
sub %rsp,%rax // restore the original value in rax | ||
ret | ||
END_COMPILERRT_FUNCTION(___chkstk) | ||
END_COMPILERRT_FUNCTION(__alloca) | ||
|
||
#endif // __x86_64__ |