| author | |
| committer | |
| log | c5cfc9bf686b5d39d8524c72950eb332814f9707 |
| tree | 1b5ebd5b7f160d2c5848c2b2c29e7c96ea5e144e |
| parent | 5d5345728a0bbcd397a7667148f0c87dd0d7d14d |
4 files changed, 12 insertions(+), 11 deletions(-)
lib/std/os/linux/arm-eabi.zig-9| ... | ... | @@ -88,15 +88,6 @@ pub fn syscall6( |
| 88 | 88 | /// This matches the libc clone function. |
| 89 | 89 | pub extern fn clone(func: extern fn (arg: usize) u8, stack: usize, flags: u32, arg: usize, ptid: *i32, tls: usize, ctid: *i32) usize; |
| 90 | 90 | |
| 91 | // LLVM calls this when the read-tp-hard feature is set to false. Currently, there is no way to pass | |
| 92 | // that to llvm via zig, see https://github.com/ziglang/zig/issues/2883. | |
| 93 | // LLVM expects libc to provide this function as __aeabi_read_tp, so it is exported if needed from special/c.zig. | |
| 94 | pub fn getThreadPointer() callconv(.C) usize { | |
| 95 | return asm volatile ("mrc p15, 0, %[ret], c13, c0, 3" | |
| 96 | : [ret] "=r" (-> usize) | |
| 97 | ); | |
| 98 | } | |
| 99 | ||
| 100 | 91 | pub fn restore() callconv(.Naked) void { |
| 101 | 92 | return asm volatile ("svc #0" |
| 102 | 93 | : |
lib/std/special/c.zig-2| ... | ... | @@ -32,8 +32,6 @@ comptime { |
| 32 | 32 | @export(strlen, .{ .name = "strlen", .linkage = .Strong }); |
| 33 | 33 | } else if (is_msvc) { |
| 34 | 34 | @export(_fltused, .{ .name = "_fltused", .linkage = .Strong }); |
| 35 | } else if (builtin.arch == builtin.Arch.arm and builtin.os == .linux) { | |
| 36 | @export(std.os.linux.getThreadPointer, .{ .name = "__aeabi_read_tp", .linkage = .Strong }); | |
| 37 | 35 | } |
| 38 | 36 | } |
| 39 | 37 |
lib/std/special/compiler_rt.zig+2| ... | ... | @@ -177,6 +177,8 @@ comptime { |
| 177 | 177 | @export(@import("compiler_rt/arm.zig").__aeabi_memclr, .{ .name = "__aeabi_memclr4", .linkage = linkage }); |
| 178 | 178 | @export(@import("compiler_rt/arm.zig").__aeabi_memclr, .{ .name = "__aeabi_memclr8", .linkage = linkage }); |
| 179 | 179 | |
| 180 | @export(@import("compiler_rt/arm.zig").__aeabi_read_tp, .{ .name = "__aeabi_read_tp", .linkage = linkage }); | |
| 181 | ||
| 180 | 182 | @export(@import("compiler_rt/extendXfYf2.zig").__aeabi_f2d, .{ .name = "__aeabi_f2d", .linkage = linkage }); |
| 181 | 183 | @export(@import("compiler_rt/floatsiXf.zig").__aeabi_i2d, .{ .name = "__aeabi_i2d", .linkage = linkage }); |
| 182 | 184 | @export(@import("compiler_rt/floatdidf.zig").__aeabi_l2d, .{ .name = "__aeabi_l2d", .linkage = linkage }); |
lib/std/special/compiler_rt/arm.zig+10| ... | ... | @@ -32,6 +32,7 @@ pub fn __aeabi_memclr(dest: [*]u8, n: usize) callconv(.AAPCS) void { |
| 32 | 32 | @setRuntimeSafety(false); |
| 33 | 33 | _ = memset(dest, 0, n); |
| 34 | 34 | } |
| 35 | ||
| 35 | 36 | pub fn __aeabi_unwind_cpp_pr0() callconv(.C) void { |
| 36 | 37 | unreachable; |
| 37 | 38 | } |
| ... | ... | @@ -42,6 +43,15 @@ pub fn __aeabi_unwind_cpp_pr2() callconv(.C) void { |
| 42 | 43 | unreachable; |
| 43 | 44 | } |
| 44 | 45 | |
| 46 | // This function can only clobber r0 according to the ABI | |
| 47 | pub fn __aeabi_read_tp() callconv(.Naked) void { | |
| 48 | asm volatile ( | |
| 49 | \\ mrc p15, 0, r0, c13, c0, 3 | |
| 50 | \\ bx lr | |
| 51 | ); | |
| 52 | unreachable; | |
| 53 | } | |
| 54 | ||
| 45 | 55 | // The following functions are wrapped in an asm block to ensure the required |
| 46 | 56 | // calling convention is always respected |
| 47 | 57 |