mirror of
https://github.com/ziglang/zig.git
synced 2024-11-26 15:12:31 +00:00
compiler_rt: Implement __chkstk() for thumb-windows-gnu.
ad435bcc14/compiler-rt/lib/builtins/arm/chkstk.S
This commit is contained in:
parent
338730d2fa
commit
3106998412
@ -5,9 +5,6 @@ const arch = builtin.cpu.arch;
|
||||
const abi = builtin.abi;
|
||||
const is_test = builtin.is_test;
|
||||
|
||||
const is_gnu = abi.isGnu();
|
||||
const is_mingw = os_tag == .windows and is_gnu;
|
||||
|
||||
const linkage: std.builtin.GlobalLinkage = if (builtin.is_test) .internal else .weak;
|
||||
const strong_linkage: std.builtin.GlobalLinkage = if (builtin.is_test) .internal else .strong;
|
||||
pub const panic = @import("common.zig").panic;
|
||||
@ -15,11 +12,11 @@ pub const panic = @import("common.zig").panic;
|
||||
comptime {
|
||||
if (builtin.os.tag == .windows) {
|
||||
// Default stack-probe functions emitted by LLVM
|
||||
if (is_mingw) {
|
||||
if (builtin.target.isMinGW()) {
|
||||
@export(&_chkstk, .{ .name = "_alloca", .linkage = linkage });
|
||||
@export(&___chkstk_ms, .{ .name = "___chkstk_ms", .linkage = linkage });
|
||||
|
||||
if (arch.isAARCH64()) {
|
||||
if (arch == .thumb or arch == .aarch64) {
|
||||
@export(&__chkstk, .{ .name = "__chkstk", .linkage = linkage });
|
||||
}
|
||||
} else if (!builtin.link_libc) {
|
||||
@ -100,6 +97,35 @@ fn win_probe_stack_only() void {
|
||||
@setRuntimeSafety(false);
|
||||
|
||||
switch (arch) {
|
||||
.thumb => {
|
||||
asm volatile (
|
||||
\\ lsl r4, r4, #2
|
||||
\\ mov r12, sp
|
||||
\\ push {r5, r6}
|
||||
\\ mov r5, r4
|
||||
\\1:
|
||||
\\ sub r12, r12, #4096
|
||||
\\ subs r5, r5, #4096
|
||||
\\ ldr r6, [r12]
|
||||
\\ bgt 1b
|
||||
\\ pop {r5, r6}
|
||||
\\ bx lr
|
||||
);
|
||||
},
|
||||
.aarch64 => {
|
||||
asm volatile (
|
||||
\\ lsl x16, x15, #4
|
||||
\\ mov x17, sp
|
||||
\\1:
|
||||
\\
|
||||
\\ sub x17, x17, 4096
|
||||
\\ subs x16, x16, 4096
|
||||
\\ ldr xzr, [x17]
|
||||
\\ b.gt 1b
|
||||
\\
|
||||
\\ ret
|
||||
);
|
||||
},
|
||||
.x86_64 => {
|
||||
asm volatile (
|
||||
\\ push %%rcx
|
||||
@ -144,21 +170,6 @@ fn win_probe_stack_only() void {
|
||||
},
|
||||
else => {},
|
||||
}
|
||||
if (comptime arch.isAARCH64()) {
|
||||
// NOTE: page size hardcoded to 4096 for now
|
||||
asm volatile (
|
||||
\\ lsl x16, x15, #4
|
||||
\\ mov x17, sp
|
||||
\\1:
|
||||
\\
|
||||
\\ sub x17, x17, 4096
|
||||
\\ subs x16, x16, 4096
|
||||
\\ ldr xzr, [x17]
|
||||
\\ b.gt 1b
|
||||
\\
|
||||
\\ ret
|
||||
);
|
||||
}
|
||||
|
||||
unreachable;
|
||||
}
|
||||
@ -240,7 +251,7 @@ pub fn _chkstk() callconv(.Naked) void {
|
||||
}
|
||||
pub fn __chkstk() callconv(.Naked) void {
|
||||
@setRuntimeSafety(false);
|
||||
if (comptime arch.isAARCH64()) {
|
||||
if (arch == .thumb or arch == .aarch64) {
|
||||
@call(.always_inline, win_probe_stack_only, .{});
|
||||
} else switch (arch) {
|
||||
.x86 => @call(.always_inline, win_probe_stack_adjust_sp, .{}),
|
||||
|
Loading…
Reference in New Issue
Block a user