authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-07-18 15:03:21-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-07-18 15:03:21-04:00
loga3854d042e0d05a87ae9f0b71d12474c8d0e57ec
tree7f0a97f024aea3eb3d1f6775acd9439075aebe0f
parent07f0de6a8a9a152cfbd76e458d99d992b59e9e06
signature Commit is signed but in an unrecognized format.

basic riscv support

llvm is giving me `error: couldn't allocate output register for constraint '{a0}'` which is a bug that needs to be fixed upstream.

9 files changed, 388 insertions(+), 10 deletions(-)

src/target.cpp+2-2
......@@ -1320,6 +1320,8 @@ const char *arch_stack_pointer_register_name(ZigLLVM_ArchType arch) {
13201320 case ZigLLVM_aarch64:
13211321 case ZigLLVM_aarch64_be:
13221322 case ZigLLVM_aarch64_32:
1323 case ZigLLVM_riscv32:
1324 case ZigLLVM_riscv64:
13231325 return "sp";
13241326
13251327 case ZigLLVM_arm:
......@@ -1350,8 +1352,6 @@ const char *arch_stack_pointer_register_name(ZigLLVM_ArchType arch) {
13501352 case ZigLLVM_r600:
13511353 case ZigLLVM_renderscript32:
13521354 case ZigLLVM_renderscript64:
1353 case ZigLLVM_riscv32:
1354 case ZigLLVM_riscv64:
13551355 case ZigLLVM_shave:
13561356 case ZigLLVM_sparc:
13571357 case ZigLLVM_sparcel:
std/os/bits/linux.zig+1
......@@ -7,6 +7,7 @@ pub usingnamespace @import("linux/errno.zig");
77pub usingnamespace switch (builtin.arch) {
88 .x86_64 => @import("linux/x86_64.zig"),
99 .aarch64 => @import("linux/arm64.zig"),
10 .riscv64 => @import("linux/riscv64.zig"),
1011 else => struct {},
1112};
1213
std/os/bits/linux/riscv64.zig created+279
......@@ -0,0 +1,279 @@
1// riscv64-specific declarations that are intended to be imported into the POSIX namespace.
2
3pub const SYS_io_setup = 0;
4pub const SYS_io_destroy = 1;
5pub const SYS_io_submit = 2;
6pub const SYS_io_cancel = 3;
7pub const SYS_io_getevents = 4;
8pub const SYS_setxattr = 5;
9pub const SYS_lsetxattr = 6;
10pub const SYS_fsetxattr = 7;
11pub const SYS_getxattr = 8;
12pub const SYS_lgetxattr = 9;
13pub const SYS_fgetxattr = 10;
14pub const SYS_listxattr = 11;
15pub const SYS_llistxattr = 12;
16pub const SYS_flistxattr = 13;
17pub const SYS_removexattr = 14;
18pub const SYS_lremovexattr = 15;
19pub const SYS_fremovexattr = 16;
20pub const SYS_getcwd = 17;
21pub const SYS_lookup_dcookie = 18;
22pub const SYS_eventfd2 = 19;
23pub const SYS_epoll_create1 = 20;
24pub const SYS_epoll_ctl = 21;
25pub const SYS_epoll_pwait = 22;
26pub const SYS_dup = 23;
27pub const SYS_dup3 = 24;
28pub const SYS_fcntl = 25;
29pub const SYS_inotify_init1 = 26;
30pub const SYS_inotify_add_watch = 27;
31pub const SYS_inotify_rm_watch = 28;
32pub const SYS_ioctl = 29;
33pub const SYS_ioprio_set = 30;
34pub const SYS_ioprio_get = 31;
35pub const SYS_flock = 32;
36pub const SYS_mknodat = 33;
37pub const SYS_mkdirat = 34;
38pub const SYS_unlinkat = 35;
39pub const SYS_symlinkat = 36;
40pub const SYS_linkat = 37;
41pub const SYS_umount2 = 39;
42pub const SYS_mount = 40;
43pub const SYS_pivot_root = 41;
44pub const SYS_nfsservctl = 42;
45pub const SYS_statfs = 43;
46pub const SYS_fstatfs = 44;
47pub const SYS_truncate = 45;
48pub const SYS_ftruncate = 46;
49pub const SYS_fallocate = 47;
50pub const SYS_faccessat = 48;
51pub const SYS_chdir = 49;
52pub const SYS_fchdir = 50;
53pub const SYS_chroot = 51;
54pub const SYS_fchmod = 52;
55pub const SYS_fchmodat = 53;
56pub const SYS_fchownat = 54;
57pub const SYS_fchown = 55;
58pub const SYS_openat = 56;
59pub const SYS_close = 57;
60pub const SYS_vhangup = 58;
61pub const SYS_pipe2 = 59;
62pub const SYS_quotactl = 60;
63pub const SYS_getdents64 = 61;
64pub const SYS_lseek = 62;
65pub const SYS_read = 63;
66pub const SYS_write = 64;
67pub const SYS_readv = 65;
68pub const SYS_writev = 66;
69pub const SYS_pread64 = 67;
70pub const SYS_pwrite64 = 68;
71pub const SYS_preadv = 69;
72pub const SYS_pwritev = 70;
73pub const SYS_sendfile = 71;
74pub const SYS_pselect6 = 72;
75pub const SYS_ppoll = 73;
76pub const SYS_signalfd4 = 74;
77pub const SYS_vmsplice = 75;
78pub const SYS_splice = 76;
79pub const SYS_tee = 77;
80pub const SYS_readlinkat = 78;
81pub const SYS_fstatat = 79;
82pub const SYS_fstat = 80;
83pub const SYS_sync = 81;
84pub const SYS_fsync = 82;
85pub const SYS_fdatasync = 83;
86pub const SYS_sync_file_range = 84;
87pub const SYS_timerfd_create = 85;
88pub const SYS_timerfd_settime = 86;
89pub const SYS_timerfd_gettime = 87;
90pub const SYS_utimensat = 88;
91pub const SYS_acct = 89;
92pub const SYS_capget = 90;
93pub const SYS_capset = 91;
94pub const SYS_personality = 92;
95pub const SYS_exit = 93;
96pub const SYS_exit_group = 94;
97pub const SYS_waitid = 95;
98pub const SYS_set_tid_address = 96;
99pub const SYS_unshare = 97;
100pub const SYS_futex = 98;
101pub const SYS_set_robust_list = 99;
102pub const SYS_get_robust_list = 100;
103pub const SYS_nanosleep = 101;
104pub const SYS_getitimer = 102;
105pub const SYS_setitimer = 103;
106pub const SYS_kexec_load = 104;
107pub const SYS_init_module = 105;
108pub const SYS_delete_module = 106;
109pub const SYS_timer_create = 107;
110pub const SYS_timer_gettime = 108;
111pub const SYS_timer_getoverrun = 109;
112pub const SYS_timer_settime = 110;
113pub const SYS_timer_delete = 111;
114pub const SYS_clock_settime = 112;
115pub const SYS_clock_gettime = 113;
116pub const SYS_clock_getres = 114;
117pub const SYS_clock_nanosleep = 115;
118pub const SYS_syslog = 116;
119pub const SYS_ptrace = 117;
120pub const SYS_sched_setparam = 118;
121pub const SYS_sched_setscheduler = 119;
122pub const SYS_sched_getscheduler = 120;
123pub const SYS_sched_getparam = 121;
124pub const SYS_sched_setaffinity = 122;
125pub const SYS_sched_getaffinity = 123;
126pub const SYS_sched_yield = 124;
127pub const SYS_sched_get_priority_max = 125;
128pub const SYS_sched_get_priority_min = 126;
129pub const SYS_sched_rr_get_interval = 127;
130pub const SYS_restart_syscall = 128;
131pub const SYS_kill = 129;
132pub const SYS_tkill = 130;
133pub const SYS_tgkill = 131;
134pub const SYS_sigaltstack = 132;
135pub const SYS_rt_sigsuspend = 133;
136pub const SYS_rt_sigaction = 134;
137pub const SYS_rt_sigprocmask = 135;
138pub const SYS_rt_sigpending = 136;
139pub const SYS_rt_sigtimedwait = 137;
140pub const SYS_rt_sigqueueinfo = 138;
141pub const SYS_rt_sigreturn = 139;
142pub const SYS_setpriority = 140;
143pub const SYS_getpriority = 141;
144pub const SYS_reboot = 142;
145pub const SYS_setregid = 143;
146pub const SYS_setgid = 144;
147pub const SYS_setreuid = 145;
148pub const SYS_setuid = 146;
149pub const SYS_setresuid = 147;
150pub const SYS_getresuid = 148;
151pub const SYS_setresgid = 149;
152pub const SYS_getresgid = 150;
153pub const SYS_setfsuid = 151;
154pub const SYS_setfsgid = 152;
155pub const SYS_times = 153;
156pub const SYS_setpgid = 154;
157pub const SYS_getpgid = 155;
158pub const SYS_getsid = 156;
159pub const SYS_setsid = 157;
160pub const SYS_getgroups = 158;
161pub const SYS_setgroups = 159;
162pub const SYS_uname = 160;
163pub const SYS_sethostname = 161;
164pub const SYS_setdomainname = 162;
165pub const SYS_getrlimit = 163;
166pub const SYS_setrlimit = 164;
167pub const SYS_getrusage = 165;
168pub const SYS_umask = 166;
169pub const SYS_prctl = 167;
170pub const SYS_getcpu = 168;
171pub const SYS_gettimeofday = 169;
172pub const SYS_settimeofday = 170;
173pub const SYS_adjtimex = 171;
174pub const SYS_getpid = 172;
175pub const SYS_getppid = 173;
176pub const SYS_getuid = 174;
177pub const SYS_geteuid = 175;
178pub const SYS_getgid = 176;
179pub const SYS_getegid = 177;
180pub const SYS_gettid = 178;
181pub const SYS_sysinfo = 179;
182pub const SYS_mq_open = 180;
183pub const SYS_mq_unlink = 181;
184pub const SYS_mq_timedsend = 182;
185pub const SYS_mq_timedreceive = 183;
186pub const SYS_mq_notify = 184;
187pub const SYS_mq_getsetattr = 185;
188pub const SYS_msgget = 186;
189pub const SYS_msgctl = 187;
190pub const SYS_msgrcv = 188;
191pub const SYS_msgsnd = 189;
192pub const SYS_semget = 190;
193pub const SYS_semctl = 191;
194pub const SYS_semtimedop = 192;
195pub const SYS_semop = 193;
196pub const SYS_shmget = 194;
197pub const SYS_shmctl = 195;
198pub const SYS_shmat = 196;
199pub const SYS_shmdt = 197;
200pub const SYS_socket = 198;
201pub const SYS_socketpair = 199;
202pub const SYS_bind = 200;
203pub const SYS_listen = 201;
204pub const SYS_accept = 202;
205pub const SYS_connect = 203;
206pub const SYS_getsockname = 204;
207pub const SYS_getpeername = 205;
208pub const SYS_sendto = 206;
209pub const SYS_recvfrom = 207;
210pub const SYS_setsockopt = 208;
211pub const SYS_getsockopt = 209;
212pub const SYS_shutdown = 210;
213pub const SYS_sendmsg = 211;
214pub const SYS_recvmsg = 212;
215pub const SYS_readahead = 213;
216pub const SYS_brk = 214;
217pub const SYS_munmap = 215;
218pub const SYS_mremap = 216;
219pub const SYS_add_key = 217;
220pub const SYS_request_key = 218;
221pub const SYS_keyctl = 219;
222pub const SYS_clone = 220;
223pub const SYS_execve = 221;
224pub const SYS_mmap = 222;
225pub const SYS_fadvise64 = 223;
226pub const SYS_swapon = 224;
227pub const SYS_swapoff = 225;
228pub const SYS_mprotect = 226;
229pub const SYS_msync = 227;
230pub const SYS_mlock = 228;
231pub const SYS_munlock = 229;
232pub const SYS_mlockall = 230;
233pub const SYS_munlockall = 231;
234pub const SYS_mincore = 232;
235pub const SYS_madvise = 233;
236pub const SYS_remap_file_pages = 234;
237pub const SYS_mbind = 235;
238pub const SYS_get_mempolicy = 236;
239pub const SYS_set_mempolicy = 237;
240pub const SYS_migrate_pages = 238;
241pub const SYS_move_pages = 239;
242pub const SYS_rt_tgsigqueueinfo = 240;
243pub const SYS_perf_event_open = 241;
244pub const SYS_accept4 = 242;
245pub const SYS_recvmmsg = 243;
246pub const SYS_arch_specific_syscall = 244;
247pub const SYS_wait4 = 260;
248pub const SYS_prlimit64 = 261;
249pub const SYS_fanotify_init = 262;
250pub const SYS_fanotify_mark = 263;
251pub const SYS_name_to_handle_at = 264;
252pub const SYS_open_by_handle_at = 265;
253pub const SYS_clock_adjtime = 266;
254pub const SYS_syncfs = 267;
255pub const SYS_setns = 268;
256pub const SYS_sendmmsg = 269;
257pub const SYS_process_vm_readv = 270;
258pub const SYS_process_vm_writev = 271;
259pub const SYS_kcmp = 272;
260pub const SYS_finit_module = 273;
261pub const SYS_sched_setattr = 274;
262pub const SYS_sched_getattr = 275;
263pub const SYS_renameat2 = 276;
264pub const SYS_seccomp = 277;
265pub const SYS_getrandom = 278;
266pub const SYS_memfd_create = 279;
267pub const SYS_bpf = 280;
268pub const SYS_execveat = 281;
269pub const SYS_userfaultfd = 282;
270pub const SYS_membarrier = 283;
271pub const SYS_mlock2 = 284;
272pub const SYS_copy_file_range = 285;
273pub const SYS_preadv2 = 286;
274pub const SYS_pwritev2 = 287;
275pub const SYS_pkey_mprotect = 288;
276pub const SYS_pkey_alloc = 289;
277pub const SYS_pkey_free = 290;
278pub const SYS_sysriscv = 244;
279pub const SYS_riscv_flush_icache = SYS_sysriscv + 15;
std/os/linux.zig+1
......@@ -17,6 +17,7 @@ pub const is_the_target = builtin.os == .linux;
1717pub usingnamespace switch (builtin.arch) {
1818 .x86_64 => @import("linux/x86_64.zig"),
1919 .aarch64 => @import("linux/arm64.zig"),
20 .riscv64 => @import("linux/riscv64.zig"),
2021 else => struct {},
2122};
2223pub usingnamespace @import("bits.zig");
std/os/linux/arm64.zig+7
......@@ -2,6 +2,7 @@ pub fn syscall0(number: usize) usize {
22 return asm volatile ("svc #0"
33 : [ret] "={x0}" (-> usize)
44 : [number] "{x8}" (number)
5 : "memory"
56 );
67}
78
......@@ -10,6 +11,7 @@ pub fn syscall1(number: usize, arg1: usize) usize {
1011 : [ret] "={x0}" (-> usize)
1112 : [number] "{x8}" (number),
1213 [arg1] "{x0}" (arg1)
14 : "memory"
1315 );
1416}
1517
......@@ -19,6 +21,7 @@ pub fn syscall2(number: usize, arg1: usize, arg2: usize) usize {
1921 : [number] "{x8}" (number),
2022 [arg1] "{x0}" (arg1),
2123 [arg2] "{x1}" (arg2)
24 : "memory"
2225 );
2326}
2427
......@@ -29,6 +32,7 @@ pub fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) usize {
2932 [arg1] "{x0}" (arg1),
3033 [arg2] "{x1}" (arg2),
3134 [arg3] "{x2}" (arg3)
35 : "memory"
3236 );
3337}
3438
......@@ -40,6 +44,7 @@ pub fn syscall4(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usiz
4044 [arg2] "{x1}" (arg2),
4145 [arg3] "{x2}" (arg3),
4246 [arg4] "{x3}" (arg4)
47 : "memory"
4348 );
4449}
4550
......@@ -52,6 +57,7 @@ pub fn syscall5(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usiz
5257 [arg3] "{x2}" (arg3),
5358 [arg4] "{x3}" (arg4),
5459 [arg5] "{x4}" (arg5)
60 : "memory"
5561 );
5662}
5763
......@@ -73,6 +79,7 @@ pub fn syscall6(
7379 [arg4] "{x3}" (arg4),
7480 [arg5] "{x4}" (arg5),
7581 [arg6] "{x5}" (arg6)
82 : "memory"
7683 );
7784}
7885
std/os/linux/riscv64.zig created+78
......@@ -0,0 +1,78 @@
1pub fn syscall0(number: usize) usize {
2 return asm volatile ("ecall"
3 : [ret] "={a0}" (-> usize)
4 : [number] "{a7}" (number)
5 : "memory"
6 );
7}
8
9pub fn syscall1(number: usize, arg1: usize) usize {
10 return asm volatile ("ecall"
11 : [ret] "={a0}" (-> usize)
12 : [number] "{a7}" (number),
13 [arg1] "{a0}" (arg1)
14 );
15}
16
17pub fn syscall2(number: usize, arg1: usize, arg2: usize) usize {
18 return asm volatile ("ecall"
19 : [ret] "={a0}" (-> usize)
20 : [number] "{a7}" (number),
21 [arg1] "{a0}" (arg1),
22 [arg2] "{a1}" (arg2)
23 );
24}
25
26pub fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) usize {
27 return asm volatile ("ecall"
28 : [ret] "={a0}" (-> usize)
29 : [number] "{a7}" (number),
30 [arg1] "{a0}" (arg1),
31 [arg2] "{a1}" (arg2),
32 [arg3] "{a2}" (arg3)
33 );
34}
35
36pub fn syscall4(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
37 return asm volatile ("ecall"
38 : [ret] "={a0}" (-> usize)
39 : [number] "{a7}" (number),
40 [arg1] "{a0}" (arg1),
41 [arg2] "{a1}" (arg2),
42 [arg3] "{a2}" (arg3),
43 [arg4] "{a3}" (arg4)
44 );
45}
46
47pub fn syscall5(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
48 return asm volatile ("ecall"
49 : [ret] "={a0}" (-> usize)
50 : [number] "{a7}" (number),
51 [arg1] "{a0}" (arg1),
52 [arg2] "{a1}" (arg2),
53 [arg3] "{a2}" (arg3),
54 [arg4] "{a3}" (arg4),
55 [arg5] "{a4}" (arg5)
56 );
57}
58
59pub fn syscall6(
60 number: usize,
61 arg1: usize,
62 arg2: usize,
63 arg3: usize,
64 arg4: usize,
65 arg5: usize,
66 arg6: usize,
67) usize {
68 return asm volatile ("ecall"
69 : [ret] "={a0}" (-> usize)
70 : [number] "{a7}" (number),
71 [arg1] "{a0}" (arg1),
72 [arg2] "{a1}" (arg2),
73 [arg3] "{a2}" (arg3),
74 [arg4] "{a3}" (arg4),
75 [arg5] "{a4}" (arg5),
76 [arg6] "{a5}" (arg6)
77 );
78}
std/os/linux/tls.zig+8-1
......@@ -47,7 +47,7 @@ const TLSVariant = enum {
4747};
4848
4949const tls_variant = switch (builtin.arch) {
50 .arm, .armeb, .aarch64, .aarch64_be => TLSVariant.VariantI,
50 .arm, .armeb, .aarch64, .aarch64_be, .riscv32, .riscv64 => TLSVariant.VariantI,
5151 .x86_64, .i386 => TLSVariant.VariantII,
5252 else => @compileError("undefined tls_variant for this architecture"),
5353};
......@@ -118,6 +118,13 @@ pub fn setThreadPointer(addr: usize) void {
118118 : [addr] "r" (addr)
119119 );
120120 },
121 .riscv64 => {
122 asm volatile (
123 \\ mv tp, %[addr]
124 :
125 : [addr] "r" (addr)
126 );
127 },
121128 else => @compileError("Unsupported architecture"),
122129 }
123130}
std/os/linux/x86_64.zig+7-7
......@@ -4,7 +4,7 @@ pub fn syscall0(number: usize) usize {
44 return asm volatile ("syscall"
55 : [ret] "={rax}" (-> usize)
66 : [number] "{rax}" (number)
7 : "rcx", "r11"
7 : "rcx", "r11", "memory"
88 );
99}
1010
......@@ -13,7 +13,7 @@ pub fn syscall1(number: usize, arg1: usize) usize {
1313 : [ret] "={rax}" (-> usize)
1414 : [number] "{rax}" (number),
1515 [arg1] "{rdi}" (arg1)
16 : "rcx", "r11"
16 : "rcx", "r11", "memory"
1717 );
1818}
1919
......@@ -23,7 +23,7 @@ pub fn syscall2(number: usize, arg1: usize, arg2: usize) usize {
2323 : [number] "{rax}" (number),
2424 [arg1] "{rdi}" (arg1),
2525 [arg2] "{rsi}" (arg2)
26 : "rcx", "r11"
26 : "rcx", "r11", "memory"
2727 );
2828}
2929
......@@ -34,7 +34,7 @@ pub fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) usize {
3434 [arg1] "{rdi}" (arg1),
3535 [arg2] "{rsi}" (arg2),
3636 [arg3] "{rdx}" (arg3)
37 : "rcx", "r11"
37 : "rcx", "r11", "memory"
3838 );
3939}
4040
......@@ -46,7 +46,7 @@ pub fn syscall4(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usiz
4646 [arg2] "{rsi}" (arg2),
4747 [arg3] "{rdx}" (arg3),
4848 [arg4] "{r10}" (arg4)
49 : "rcx", "r11"
49 : "rcx", "r11", "memory"
5050 );
5151}
5252
......@@ -59,7 +59,7 @@ pub fn syscall5(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usiz
5959 [arg3] "{rdx}" (arg3),
6060 [arg4] "{r10}" (arg4),
6161 [arg5] "{r8}" (arg5)
62 : "rcx", "r11"
62 : "rcx", "r11", "memory"
6363 );
6464}
6565
......@@ -81,7 +81,7 @@ pub fn syscall6(
8181 [arg4] "{r10}" (arg4),
8282 [arg5] "{r8}" (arg5),
8383 [arg6] "{r9}" (arg6)
84 : "rcx", "r11"
84 : "rcx", "r11", "memory"
8585 );
8686}
8787
std/special/start.zig+5
......@@ -59,6 +59,11 @@ nakedcc fn _start() noreturn {
5959 : [argc] "=r" (-> [*]usize)
6060 );
6161 },
62 .riscv64 => {
63 argc_ptr = asm ("mov %[argc], sp"
64 : [argc] "=r" (-> [*]usize)
65 );
66 },
6267 else => @compileError("unsupported arch"),
6368 }
6469 // If LLVM inlines stack variables into _start, they will overwrite