authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-07-18 15:20:58-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-07-18 15:20:58-04:00
log03a3b1ca39e73c7edf615d26bb7647d7565a09f7
tree7a06ca0960e8fb2827aa34662a6fccd99a5ff2bf
parenta3854d042e0d05a87ae9f0b71d12474c8d0e57ec
signature Commit is signed but in an unrecognized format.

riscv workarounds for llvm not having good asm integration


4 files changed, 99 insertions(+), 44 deletions(-)

src/codegen.cpp+4
...@@ -8148,6 +8148,10 @@ static void init(CodeGen *g) {...@@ -8148,6 +8148,10 @@ static void init(CodeGen *g) {
8148 target_specific_cpu_args = ZigLLVMGetHostCPUName();8148 target_specific_cpu_args = ZigLLVMGetHostCPUName();
8149 target_specific_features = ZigLLVMGetNativeFeatures();8149 target_specific_features = ZigLLVMGetNativeFeatures();
8150 }8150 }
8151 } else if (target_is_riscv(g->zig_target)) {
8152 // TODO https://github.com/ziglang/zig/issues/2883
8153 target_specific_cpu_args = "";
8154 target_specific_features = "+a";
8151 } else {8155 } else {
8152 target_specific_cpu_args = "";8156 target_specific_cpu_args = "";
8153 target_specific_features = "";8157 target_specific_features = "";
std/os/linux/riscv64.zig+90-42
...@@ -1,58 +1,96 @@...@@ -1,58 +1,96 @@
1pub fn syscall0(number: usize) usize {1pub fn syscall0(number: usize) usize {
2 return asm volatile ("ecall"2 return asm volatile (
3 : [ret] "={a0}" (-> usize)3 \\ mv a7, %[number]
4 : [number] "{a7}" (number)4 \\ ecall
5 \\ mv %[ret], a0
6 : [ret] "=r" (-> usize)
7 : [number] "r" (number)
5 : "memory"8 : "memory"
6 );9 );
7}10}
811
9pub fn syscall1(number: usize, arg1: usize) usize {12pub fn syscall1(number: usize, arg1: usize) usize {
10 return asm volatile ("ecall"13 return asm volatile (
11 : [ret] "={a0}" (-> usize)14 \\ mv a7, %[number]
12 : [number] "{a7}" (number),15 \\ mv a0, %[arg1]
13 [arg1] "{a0}" (arg1)16 \\ ecall
17 \\ mv %[ret], a0
18 : [ret] "=r" (-> usize)
19 : [number] "r" (number),
20 [arg1] "r" (arg1)
21 : "memory"
14 );22 );
15}23}
1624
17pub fn syscall2(number: usize, arg1: usize, arg2: usize) usize {25pub fn syscall2(number: usize, arg1: usize, arg2: usize) usize {
18 return asm volatile ("ecall"26 return asm volatile (
19 : [ret] "={a0}" (-> usize)27 \\ mv a7, %[number]
20 : [number] "{a7}" (number),28 \\ mv a0, %[arg1]
21 [arg1] "{a0}" (arg1),29 \\ mv a1, %[arg2]
22 [arg2] "{a1}" (arg2)30 \\ ecall
31 \\ mv %[ret], a0
32 : [ret] "=r" (-> usize)
33 : [number] "r" (number),
34 [arg1] "r" (arg1),
35 [arg2] "r" (arg2)
36 : "memory"
23 );37 );
24}38}
2539
26pub fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) usize {40pub fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) usize {
27 return asm volatile ("ecall"41 return asm volatile (
28 : [ret] "={a0}" (-> usize)42 \\ mv a7, %[number]
29 : [number] "{a7}" (number),43 \\ mv a0, %[arg1]
30 [arg1] "{a0}" (arg1),44 \\ mv a1, %[arg2]
31 [arg2] "{a1}" (arg2),45 \\ mv a2, %[arg3]
32 [arg3] "{a2}" (arg3)46 \\ ecall
47 \\ mv %[ret], a0
48 : [ret] "=r" (-> usize)
49 : [number] "r" (number),
50 [arg1] "r" (arg1),
51 [arg2] "r" (arg2),
52 [arg3] "r" (arg3)
53 : "memory"
33 );54 );
34}55}
3556
36pub fn syscall4(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {57pub fn syscall4(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
37 return asm volatile ("ecall"58 return asm volatile (
38 : [ret] "={a0}" (-> usize)59 \\ mv a7, %[number]
39 : [number] "{a7}" (number),60 \\ mv a0, %[arg1]
40 [arg1] "{a0}" (arg1),61 \\ mv a1, %[arg2]
41 [arg2] "{a1}" (arg2),62 \\ mv a2, %[arg3]
42 [arg3] "{a2}" (arg3),63 \\ mv a3, %[arg4]
43 [arg4] "{a3}" (arg4)64 \\ ecall
65 \\ mv %[ret], a0
66 : [ret] "=r" (-> usize)
67 : [number] "r" (number),
68 [arg1] "r" (arg1),
69 [arg2] "r" (arg2),
70 [arg3] "r" (arg3),
71 [arg4] "r" (arg4)
72 : "memory"
44 );73 );
45}74}
4675
47pub fn syscall5(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {76pub fn syscall5(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
48 return asm volatile ("ecall"77 return asm volatile (
49 : [ret] "={a0}" (-> usize)78 \\ mv a7, %[number]
50 : [number] "{a7}" (number),79 \\ mv a0, %[arg1]
51 [arg1] "{a0}" (arg1),80 \\ mv a1, %[arg2]
52 [arg2] "{a1}" (arg2),81 \\ mv a2, %[arg3]
53 [arg3] "{a2}" (arg3),82 \\ mv a3, %[arg4]
54 [arg4] "{a3}" (arg4),83 \\ mv a4, %[arg5]
55 [arg5] "{a4}" (arg5)84 \\ ecall
85 \\ mv %[ret], a0
86 : [ret] "=r" (-> usize)
87 : [number] "r" (number),
88 [arg1] "r" (arg1),
89 [arg2] "r" (arg2),
90 [arg3] "r" (arg3),
91 [arg4] "r" (arg4),
92 [arg5] "r" (arg5)
93 : "memory"
56 );94 );
57}95}
5896
...@@ -65,14 +103,24 @@ pub fn syscall6(...@@ -65,14 +103,24 @@ pub fn syscall6(
65 arg5: usize,103 arg5: usize,
66 arg6: usize,104 arg6: usize,
67) usize {105) usize {
68 return asm volatile ("ecall"106 return asm volatile (
69 : [ret] "={a0}" (-> usize)107 \\ mv a7, %[number]
70 : [number] "{a7}" (number),108 \\ mv a0, %[arg1]
71 [arg1] "{a0}" (arg1),109 \\ mv a1, %[arg2]
72 [arg2] "{a1}" (arg2),110 \\ mv a2, %[arg3]
73 [arg3] "{a2}" (arg3),111 \\ mv a3, %[arg4]
74 [arg4] "{a3}" (arg4),112 \\ mv a4, %[arg5]
75 [arg5] "{a4}" (arg5),113 \\ mv a5, %[arg6]
76 [arg6] "{a5}" (arg6)114 \\ ecall
115 \\ mv %[ret], a0
116 : [ret] "=r" (-> usize)
117 : [number] "r" (number),
118 [arg1] "r" (arg1),
119 [arg2] "r" (arg2),
120 [arg3] "r" (arg3),
121 [arg4] "r" (arg4),
122 [arg5] "r" (arg5),
123 [arg6] "r" (arg6)
124 : "memory"
77 );125 );
78}126}
std/special/c.zig+4-1
...@@ -180,7 +180,10 @@ comptime {...@@ -180,7 +180,10 @@ comptime {
180 @export("__stack_chk_fail", __stack_chk_fail, builtin.GlobalLinkage.Strong);180 @export("__stack_chk_fail", __stack_chk_fail, builtin.GlobalLinkage.Strong);
181 }181 }
182 if (builtin.os == builtin.Os.linux) {182 if (builtin.os == builtin.Os.linux) {
183 @export("clone", clone, builtin.GlobalLinkage.Strong);183 // TODO implement clone for riscv64
184 if (builtin.arch != .riscv64) {
185 @export("clone", clone, builtin.GlobalLinkage.Strong);
186 }
184 }187 }
185}188}
186extern fn __stack_chk_fail() noreturn {189extern fn __stack_chk_fail() noreturn {
std/special/start.zig+1-1
...@@ -60,7 +60,7 @@ nakedcc fn _start() noreturn {...@@ -60,7 +60,7 @@ nakedcc fn _start() noreturn {
60 );60 );
61 },61 },
62 .riscv64 => {62 .riscv64 => {
63 argc_ptr = asm ("mov %[argc], sp"63 argc_ptr = asm ("mv %[argc], sp"
64 : [argc] "=r" (-> [*]usize)64 : [argc] "=r" (-> [*]usize)
65 );65 );
66 },66 },