Zig Version
0.15.2
Steps to Reproduce and Observed Behavior
Write some inline assembly that makes use of specific register constraints, e.g.:
fnsys_setup_thread(gp:*anyopaque,stack:*anyopaque,stack_size:c_uint,args:*SysThreadArgs,root:*constanyopaque,)void{asmvolatile(\\syscall::[nr]"{3ドル}"(0x3c),[gp]"{4ドル}"(gp),[stack]"{5ドル}"(stack),[stack_size]"{6ドル}"(stack_size),[args]"{7ドル}"(args),[root]"{8ドル}"(root),);}
This results in the following C code being generated:
static void main_sys_setup_thread__235(void *const a0, void *const a1, unsigned int const a2, struct main_SysThreadArgs__1010 *const a3, void const *const a4) {
register uintptr_t t0 __asm("3ドル") = (uintptr_t)60ul;
register void * t1 __asm("4ドル") = a0;
register void * t2 __asm("5ドル") = a1;
register unsigned int t3 __asm("6ドル") = a2;
register struct main_SysThreadArgs__1010 * t4 __asm("7ドル") = a3;
register void const * t5 __asm("8ドル") = a4;
__asm volatile("syscall":: "r"(t0), "r"(t1), "r"(t2), "r"(t3), "r"(t4), "r"(t5));
return;
}
This should really be correct, but gcc emits the following assembly for it:
100060: 3c0501ff lui a1,0x1ff
100064: 3c060200 lui a2,0x200
100068: 24a50000 addiu a1,a1,0
10006c: 3c040010 lui a0,0x10
100070: 24c60000 addiu a2,a2,0
100074: 3c080010 lui a4,0x10
100078: 248400cc addiu a0,a0,204
10007c: 00c53023 subu a2,a2,a1
100080: 03a03825 move a3,sp
100084: 25080018 addiu a4,a4,24
100088: 2402003c li v0,60
10008c: 0000000c syscall
As you can see, li v0, 60 for instance is bogus as v0 names 2ドル not 3ドル. This seems to be a known issue (see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86673), that was apparently never fixed.
Expected Behavior
The C backend should avoid declaring explicit register variables as const or volatile to make gcc behave properly. As such
tryf.object.dg.renderTypeAndName(w,input_ty,input_local,Const,.none,.complete);
should be adjusted to not render as Const as far as I can see.
### Zig Version
0.15.2
### Steps to Reproduce and Observed Behavior
Write some inline assembly that makes use of specific register constraints, e.g.:
```zig
fn sys_setup_thread(
gp: *anyopaque,
stack: *anyopaque,
stack_size: c_uint,
args: *SysThreadArgs,
root: *const anyopaque,
) void {
asm volatile (
\\syscall
:
: [nr] "{3ドル}" (0x3c),
[gp] "{4ドル}" (gp),
[stack] "{5ドル}" (stack),
[stack_size] "{6ドル}" (stack_size),
[args] "{7ドル}" (args),
[root] "{8ドル}" (root),
);
}
```
This results in the following C code being generated:
```c
static void main_sys_setup_thread__235(void *const a0, void *const a1, unsigned int const a2, struct main_SysThreadArgs__1010 *const a3, void const *const a4) {
register uintptr_t t0 __asm("3ドル") = (uintptr_t)60ul;
register void * t1 __asm("4ドル") = a0;
register void * t2 __asm("5ドル") = a1;
register unsigned int t3 __asm("6ドル") = a2;
register struct main_SysThreadArgs__1010 * t4 __asm("7ドル") = a3;
register void const * t5 __asm("8ドル") = a4;
__asm volatile("syscall":: "r"(t0), "r"(t1), "r"(t2), "r"(t3), "r"(t4), "r"(t5));
return;
}
```
This should really be correct, but `gcc` emits the following assembly for it:
```
100060: 3c0501ff lui a1,0x1ff
100064: 3c060200 lui a2,0x200
100068: 24a50000 addiu a1,a1,0
10006c: 3c040010 lui a0,0x10
100070: 24c60000 addiu a2,a2,0
100074: 3c080010 lui a4,0x10
100078: 248400cc addiu a0,a0,204
10007c: 00c53023 subu a2,a2,a1
100080: 03a03825 move a3,sp
100084: 25080018 addiu a4,a4,24
100088: 2402003c li v0,60
10008c: 0000000c syscall
```
As you can see, `li v0, 60` for instance is bogus as `v0` names `2ドル` not `3ドル`. This seems to be a known issue (see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86673), that was apparently never fixed.
### Expected Behavior
The C backend should avoid declaring explicit register variables as `const` or `volatile` to make `gcc` behave properly. As such https://codeberg.org/ziglang/zig/src/commit/96ba0ab930214e15ce09cde0cbddec797f0d2d9f/src/codegen/c.zig#L5532 should be adjusted to not render as `Const` as far as I can see.