diff --git a/doc/langref/Assembly Syntax Explained.zig b/doc/langref/Assembly Syntax Explained.zig
index e254d2ab35..8141cd0271 100644
--- a/doc/langref/Assembly Syntax Explained.zig
+++ b/doc/langref/Assembly Syntax Explained.zig
@@ -53,8 +53,7 @@ pub fn syscall1(number: usize, arg1: usize) usize {
// memory locations - not only the memory pointed to by a declared indirect
// output. In this example we list $rcx and $r11 because it is known the
// kernel syscall does not preserve these registers.
- : "rcx", "r11"
- );
+ : .{ .rcx = true, .r11 = true });
}
// syntax
diff --git a/doc/langref/inline_assembly.zig b/doc/langref/inline_assembly.zig
index bd2841f072..dd13e61c39 100644
--- a/doc/langref/inline_assembly.zig
+++ b/doc/langref/inline_assembly.zig
@@ -15,8 +15,7 @@ pub fn syscall1(number: usize, arg1: usize) usize {
: [ret] "={rax}" (-> usize),
: [number] "{rax}" (number),
[arg1] "{rdi}" (arg1),
- : "rcx", "r11"
- );
+ : .{ .rcx = true, .r11 = true });
}
pub fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) usize {
@@ -26,8 +25,7 @@ pub fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) usize {
[arg1] "{rdi}" (arg1),
[arg2] "{rsi}" (arg2),
[arg3] "{rdx}" (arg3),
- : "rcx", "r11"
- );
+ : .{ .rcx = true, .r11 = true });
}
// exe=succeed
diff --git a/lib/compiler_rt/aarch64_outline_atomics.zig b/lib/compiler_rt/aarch64_outline_atomics.zig
index f5f003c455..817800eb21 100644
--- a/lib/compiler_rt/aarch64_outline_atomics.zig
+++ b/lib/compiler_rt/aarch64_outline_atomics.zig
@@ -28,8 +28,7 @@ fn __aarch64_cas1_relax() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_swp1_relax() align(16) callconv(.naked) void {
@@ -48,8 +47,7 @@ fn __aarch64_swp1_relax() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldadd1_relax() align(16) callconv(.naked) void {
@@ -69,8 +67,7 @@ fn __aarch64_ldadd1_relax() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldclr1_relax() align(16) callconv(.naked) void {
@@ -90,8 +87,7 @@ fn __aarch64_ldclr1_relax() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldeor1_relax() align(16) callconv(.naked) void {
@@ -111,8 +107,7 @@ fn __aarch64_ldeor1_relax() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldset1_relax() align(16) callconv(.naked) void {
@@ -132,8 +127,7 @@ fn __aarch64_ldset1_relax() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_cas1_acq() align(16) callconv(.naked) void {
@@ -154,8 +148,7 @@ fn __aarch64_cas1_acq() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_swp1_acq() align(16) callconv(.naked) void {
@@ -174,8 +167,7 @@ fn __aarch64_swp1_acq() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldadd1_acq() align(16) callconv(.naked) void {
@@ -195,8 +187,7 @@ fn __aarch64_ldadd1_acq() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldclr1_acq() align(16) callconv(.naked) void {
@@ -216,8 +207,7 @@ fn __aarch64_ldclr1_acq() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldeor1_acq() align(16) callconv(.naked) void {
@@ -237,8 +227,7 @@ fn __aarch64_ldeor1_acq() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldset1_acq() align(16) callconv(.naked) void {
@@ -258,8 +247,7 @@ fn __aarch64_ldset1_acq() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_cas1_rel() align(16) callconv(.naked) void {
@@ -280,8 +268,7 @@ fn __aarch64_cas1_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_swp1_rel() align(16) callconv(.naked) void {
@@ -300,8 +287,7 @@ fn __aarch64_swp1_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldadd1_rel() align(16) callconv(.naked) void {
@@ -321,8 +307,7 @@ fn __aarch64_ldadd1_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldclr1_rel() align(16) callconv(.naked) void {
@@ -342,8 +327,7 @@ fn __aarch64_ldclr1_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldeor1_rel() align(16) callconv(.naked) void {
@@ -363,8 +347,7 @@ fn __aarch64_ldeor1_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldset1_rel() align(16) callconv(.naked) void {
@@ -384,8 +367,7 @@ fn __aarch64_ldset1_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_cas1_acq_rel() align(16) callconv(.naked) void {
@@ -406,8 +388,7 @@ fn __aarch64_cas1_acq_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_swp1_acq_rel() align(16) callconv(.naked) void {
@@ -426,8 +407,7 @@ fn __aarch64_swp1_acq_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldadd1_acq_rel() align(16) callconv(.naked) void {
@@ -447,8 +427,7 @@ fn __aarch64_ldadd1_acq_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldclr1_acq_rel() align(16) callconv(.naked) void {
@@ -468,8 +447,7 @@ fn __aarch64_ldclr1_acq_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldeor1_acq_rel() align(16) callconv(.naked) void {
@@ -489,8 +467,7 @@ fn __aarch64_ldeor1_acq_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldset1_acq_rel() align(16) callconv(.naked) void {
@@ -510,8 +487,7 @@ fn __aarch64_ldset1_acq_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_cas2_relax() align(16) callconv(.naked) void {
@@ -532,8 +508,7 @@ fn __aarch64_cas2_relax() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_swp2_relax() align(16) callconv(.naked) void {
@@ -552,8 +527,7 @@ fn __aarch64_swp2_relax() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldadd2_relax() align(16) callconv(.naked) void {
@@ -573,8 +547,7 @@ fn __aarch64_ldadd2_relax() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldclr2_relax() align(16) callconv(.naked) void {
@@ -594,8 +567,7 @@ fn __aarch64_ldclr2_relax() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldeor2_relax() align(16) callconv(.naked) void {
@@ -615,8 +587,7 @@ fn __aarch64_ldeor2_relax() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldset2_relax() align(16) callconv(.naked) void {
@@ -636,8 +607,7 @@ fn __aarch64_ldset2_relax() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_cas2_acq() align(16) callconv(.naked) void {
@@ -658,8 +628,7 @@ fn __aarch64_cas2_acq() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_swp2_acq() align(16) callconv(.naked) void {
@@ -678,8 +647,7 @@ fn __aarch64_swp2_acq() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldadd2_acq() align(16) callconv(.naked) void {
@@ -699,8 +667,7 @@ fn __aarch64_ldadd2_acq() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldclr2_acq() align(16) callconv(.naked) void {
@@ -720,8 +687,7 @@ fn __aarch64_ldclr2_acq() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldeor2_acq() align(16) callconv(.naked) void {
@@ -741,8 +707,7 @@ fn __aarch64_ldeor2_acq() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldset2_acq() align(16) callconv(.naked) void {
@@ -762,8 +727,7 @@ fn __aarch64_ldset2_acq() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_cas2_rel() align(16) callconv(.naked) void {
@@ -784,8 +748,7 @@ fn __aarch64_cas2_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_swp2_rel() align(16) callconv(.naked) void {
@@ -804,8 +767,7 @@ fn __aarch64_swp2_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldadd2_rel() align(16) callconv(.naked) void {
@@ -825,8 +787,7 @@ fn __aarch64_ldadd2_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldclr2_rel() align(16) callconv(.naked) void {
@@ -846,8 +807,7 @@ fn __aarch64_ldclr2_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldeor2_rel() align(16) callconv(.naked) void {
@@ -867,8 +827,7 @@ fn __aarch64_ldeor2_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldset2_rel() align(16) callconv(.naked) void {
@@ -888,8 +847,7 @@ fn __aarch64_ldset2_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_cas2_acq_rel() align(16) callconv(.naked) void {
@@ -910,8 +868,7 @@ fn __aarch64_cas2_acq_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_swp2_acq_rel() align(16) callconv(.naked) void {
@@ -930,8 +887,7 @@ fn __aarch64_swp2_acq_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldadd2_acq_rel() align(16) callconv(.naked) void {
@@ -951,8 +907,7 @@ fn __aarch64_ldadd2_acq_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldclr2_acq_rel() align(16) callconv(.naked) void {
@@ -972,8 +927,7 @@ fn __aarch64_ldclr2_acq_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldeor2_acq_rel() align(16) callconv(.naked) void {
@@ -993,8 +947,7 @@ fn __aarch64_ldeor2_acq_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldset2_acq_rel() align(16) callconv(.naked) void {
@@ -1014,8 +967,7 @@ fn __aarch64_ldset2_acq_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_cas4_relax() align(16) callconv(.naked) void {
@@ -1036,8 +988,7 @@ fn __aarch64_cas4_relax() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_swp4_relax() align(16) callconv(.naked) void {
@@ -1056,8 +1007,7 @@ fn __aarch64_swp4_relax() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldadd4_relax() align(16) callconv(.naked) void {
@@ -1077,8 +1027,7 @@ fn __aarch64_ldadd4_relax() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldclr4_relax() align(16) callconv(.naked) void {
@@ -1098,8 +1047,7 @@ fn __aarch64_ldclr4_relax() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldeor4_relax() align(16) callconv(.naked) void {
@@ -1119,8 +1067,7 @@ fn __aarch64_ldeor4_relax() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldset4_relax() align(16) callconv(.naked) void {
@@ -1140,8 +1087,7 @@ fn __aarch64_ldset4_relax() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_cas4_acq() align(16) callconv(.naked) void {
@@ -1162,8 +1108,7 @@ fn __aarch64_cas4_acq() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_swp4_acq() align(16) callconv(.naked) void {
@@ -1182,8 +1127,7 @@ fn __aarch64_swp4_acq() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldadd4_acq() align(16) callconv(.naked) void {
@@ -1203,8 +1147,7 @@ fn __aarch64_ldadd4_acq() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldclr4_acq() align(16) callconv(.naked) void {
@@ -1224,8 +1167,7 @@ fn __aarch64_ldclr4_acq() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldeor4_acq() align(16) callconv(.naked) void {
@@ -1245,8 +1187,7 @@ fn __aarch64_ldeor4_acq() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldset4_acq() align(16) callconv(.naked) void {
@@ -1266,8 +1207,7 @@ fn __aarch64_ldset4_acq() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_cas4_rel() align(16) callconv(.naked) void {
@@ -1288,8 +1228,7 @@ fn __aarch64_cas4_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_swp4_rel() align(16) callconv(.naked) void {
@@ -1308,8 +1247,7 @@ fn __aarch64_swp4_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldadd4_rel() align(16) callconv(.naked) void {
@@ -1329,8 +1267,7 @@ fn __aarch64_ldadd4_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldclr4_rel() align(16) callconv(.naked) void {
@@ -1350,8 +1287,7 @@ fn __aarch64_ldclr4_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldeor4_rel() align(16) callconv(.naked) void {
@@ -1371,8 +1307,7 @@ fn __aarch64_ldeor4_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldset4_rel() align(16) callconv(.naked) void {
@@ -1392,8 +1327,7 @@ fn __aarch64_ldset4_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_cas4_acq_rel() align(16) callconv(.naked) void {
@@ -1414,8 +1348,7 @@ fn __aarch64_cas4_acq_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_swp4_acq_rel() align(16) callconv(.naked) void {
@@ -1434,8 +1367,7 @@ fn __aarch64_swp4_acq_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldadd4_acq_rel() align(16) callconv(.naked) void {
@@ -1455,8 +1387,7 @@ fn __aarch64_ldadd4_acq_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldclr4_acq_rel() align(16) callconv(.naked) void {
@@ -1476,8 +1407,7 @@ fn __aarch64_ldclr4_acq_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldeor4_acq_rel() align(16) callconv(.naked) void {
@@ -1497,8 +1427,7 @@ fn __aarch64_ldeor4_acq_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldset4_acq_rel() align(16) callconv(.naked) void {
@@ -1518,8 +1447,7 @@ fn __aarch64_ldset4_acq_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_cas8_relax() align(16) callconv(.naked) void {
@@ -1540,8 +1468,7 @@ fn __aarch64_cas8_relax() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_swp8_relax() align(16) callconv(.naked) void {
@@ -1560,8 +1487,7 @@ fn __aarch64_swp8_relax() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldadd8_relax() align(16) callconv(.naked) void {
@@ -1581,8 +1507,7 @@ fn __aarch64_ldadd8_relax() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldclr8_relax() align(16) callconv(.naked) void {
@@ -1602,8 +1527,7 @@ fn __aarch64_ldclr8_relax() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldeor8_relax() align(16) callconv(.naked) void {
@@ -1623,8 +1547,7 @@ fn __aarch64_ldeor8_relax() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldset8_relax() align(16) callconv(.naked) void {
@@ -1644,8 +1567,7 @@ fn __aarch64_ldset8_relax() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_cas8_acq() align(16) callconv(.naked) void {
@@ -1666,8 +1588,7 @@ fn __aarch64_cas8_acq() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_swp8_acq() align(16) callconv(.naked) void {
@@ -1686,8 +1607,7 @@ fn __aarch64_swp8_acq() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldadd8_acq() align(16) callconv(.naked) void {
@@ -1707,8 +1627,7 @@ fn __aarch64_ldadd8_acq() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldclr8_acq() align(16) callconv(.naked) void {
@@ -1728,8 +1647,7 @@ fn __aarch64_ldclr8_acq() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldeor8_acq() align(16) callconv(.naked) void {
@@ -1749,8 +1667,7 @@ fn __aarch64_ldeor8_acq() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldset8_acq() align(16) callconv(.naked) void {
@@ -1770,8 +1687,7 @@ fn __aarch64_ldset8_acq() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_cas8_rel() align(16) callconv(.naked) void {
@@ -1792,8 +1708,7 @@ fn __aarch64_cas8_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_swp8_rel() align(16) callconv(.naked) void {
@@ -1812,8 +1727,7 @@ fn __aarch64_swp8_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldadd8_rel() align(16) callconv(.naked) void {
@@ -1833,8 +1747,7 @@ fn __aarch64_ldadd8_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldclr8_rel() align(16) callconv(.naked) void {
@@ -1854,8 +1767,7 @@ fn __aarch64_ldclr8_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldeor8_rel() align(16) callconv(.naked) void {
@@ -1875,8 +1787,7 @@ fn __aarch64_ldeor8_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldset8_rel() align(16) callconv(.naked) void {
@@ -1896,8 +1807,7 @@ fn __aarch64_ldset8_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_cas8_acq_rel() align(16) callconv(.naked) void {
@@ -1918,8 +1828,7 @@ fn __aarch64_cas8_acq_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_swp8_acq_rel() align(16) callconv(.naked) void {
@@ -1938,8 +1847,7 @@ fn __aarch64_swp8_acq_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldadd8_acq_rel() align(16) callconv(.naked) void {
@@ -1959,8 +1867,7 @@ fn __aarch64_ldadd8_acq_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldclr8_acq_rel() align(16) callconv(.naked) void {
@@ -1980,8 +1887,7 @@ fn __aarch64_ldclr8_acq_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldeor8_acq_rel() align(16) callconv(.naked) void {
@@ -2001,8 +1907,7 @@ fn __aarch64_ldeor8_acq_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_ldset8_acq_rel() align(16) callconv(.naked) void {
@@ -2022,8 +1927,7 @@ fn __aarch64_ldset8_acq_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_cas16_relax() align(16) callconv(.naked) void {
@@ -2046,8 +1950,7 @@ fn __aarch64_cas16_relax() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_cas16_acq() align(16) callconv(.naked) void {
@@ -2070,8 +1973,7 @@ fn __aarch64_cas16_acq() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_cas16_rel() align(16) callconv(.naked) void {
@@ -2094,8 +1996,7 @@ fn __aarch64_cas16_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
fn __aarch64_cas16_acq_rel() align(16) callconv(.naked) void {
@@ -2118,8 +2019,7 @@ fn __aarch64_cas16_acq_rel() align(16) callconv(.naked) void {
\\ ret
:
: [__aarch64_have_lse_atomics] "{w16}" (__aarch64_have_lse_atomics),
- : "w15", "w16", "w17", "memory"
- );
+ : .{ .w15 = true, .w16 = true, .w17 = true, .memory = true });
unreachable;
}
diff --git a/lib/compiler_rt/arm.zig b/lib/compiler_rt/arm.zig
index 8fd6f2938b..e349e18630 100644
--- a/lib/compiler_rt/arm.zig
+++ b/lib/compiler_rt/arm.zig
@@ -142,8 +142,7 @@ pub fn __aeabi_uidivmod() callconv(.naked) void {
\\ pop {pc}
:
: [__udivmodsi4] "X" (&__udivmodsi4),
- : "memory"
- );
+ : .{ .memory = true });
unreachable;
}
@@ -162,8 +161,7 @@ pub fn __aeabi_uldivmod() callconv(.naked) void {
\\ pop {r4, pc}
:
: [__udivmoddi4] "X" (&__udivmoddi4),
- : "memory"
- );
+ : .{ .memory = true });
unreachable;
}
@@ -180,8 +178,7 @@ pub fn __aeabi_idivmod() callconv(.naked) void {
\\ pop {pc}
:
: [__divmodsi4] "X" (&__divmodsi4),
- : "memory"
- );
+ : .{ .memory = true });
unreachable;
}
@@ -200,8 +197,7 @@ pub fn __aeabi_ldivmod() callconv(.naked) void {
\\ pop {r4, pc}
:
: [__divmoddi4] "X" (&__divmoddi4),
- : "memory"
- );
+ : .{ .memory = true });
unreachable;
}
diff --git a/lib/compiler_rt/atomics.zig b/lib/compiler_rt/atomics.zig
index 6eec50e1ba..09fd1c2c90 100644
--- a/lib/compiler_rt/atomics.zig
+++ b/lib/compiler_rt/atomics.zig
@@ -71,8 +71,7 @@ const SpinlockTable = struct {
break :flag asm volatile ("ldstub [%[addr]], %[flag]"
: [flag] "=r" (-> @TypeOf(self.v)),
: [addr] "r" (&self.v),
- : "memory"
- );
+ : .{ .memory = true });
} else flag: {
break :flag @atomicRmw(@TypeOf(self.v), &self.v, .Xchg, .Locked, .acquire);
};
@@ -88,8 +87,7 @@ const SpinlockTable = struct {
_ = asm volatile ("clrb [%[addr]]"
:
: [addr] "r" (&self.v),
- : "memory"
- );
+ : .{ .memory = true });
} else {
@atomicStore(@TypeOf(self.v), &self.v, .Unlocked, .release);
}
diff --git a/lib/compiler_rt/clear_cache.zig b/lib/compiler_rt/clear_cache.zig
index 6cf819ccf3..e4a0a9d00d 100644
--- a/lib/compiler_rt/clear_cache.zig
+++ b/lib/compiler_rt/clear_cache.zig
@@ -103,8 +103,7 @@ fn clear_cache(start: usize, end: usize) callconv(.c) void {
: [_] "{$2}" (165), // nr = SYS_sysarch
[_] "{$4}" (0), // op = MIPS_CACHEFLUSH
[_] "{$5}" (&cfa), // args = &cfa
- : "$1", "$2", "$3", "$4", "$5", "$6", "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"
- );
+ : .{ .r1 = true, .r2 = true, .r3 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
exportIt();
} else if (mips and os == .openbsd) {
// TODO
diff --git a/lib/docs/wasm/Walk.zig b/lib/docs/wasm/Walk.zig
index c20f4bbd90..ffa0f7d428 100644
--- a/lib/docs/wasm/Walk.zig
+++ b/lib/docs/wasm/Walk.zig
@@ -793,6 +793,8 @@ fn expr(w: *Walk, scope: *Scope, parent_decl: Decl.Index, node: Ast.Node.Index)
try expr(w, scope, parent_decl, full.ast.template);
},
+ .asm_legacy => {},
+
.builtin_call_two,
.builtin_call_two_comma,
.builtin_call,
diff --git a/lib/libc/include/generic-glibc/sys/single_threaded.h b/lib/libc/include/generic-glibc/sys/single_threaded.h
index b5a93d084a..5fec9a477c 100644
--- a/lib/libc/include/generic-glibc/sys/single_threaded.h
+++ b/lib/libc/include/generic-glibc/sys/single_threaded.h
@@ -16,10 +16,10 @@
License along with the GNU C Library; if not, see
. */
-// zig patch: sys/single_threaded.h header was added in glibc 2.35
-#if __GLIBC__ == 2 && __GLIBC_MINOR__ < 35
- #error "sys/single_threaded.h did not exist before glibc 2.35"
-#endif /* error for glibc before 2.35 */
+// zig patch: sys/single_threaded.h header was added in glibc 2.32
+#if __GLIBC__ == 2 && __GLIBC_MINOR__ < 32
+ #error "sys/single_threaded.h did not exist before glibc 2.32"
+#endif /* error for glibc before 2.32 */
#ifndef _SYS_SINGLE_THREADED_H
#define _SYS_SINGLE_THREADED_H
diff --git a/lib/std/Build/Cache.zig b/lib/std/Build/Cache.zig
index 2f8dd26ce0..211251d3d0 100644
--- a/lib/std/Build/Cache.zig
+++ b/lib/std/Build/Cache.zig
@@ -419,6 +419,7 @@ pub const Manifest = struct {
fn addFileInner(self: *Manifest, prefixed_path: PrefixedPath, handle: ?fs.File, max_file_size: ?usize) usize {
const gop = self.files.getOrPutAssumeCapacityAdapted(prefixed_path, FilesAdapter{});
if (gop.found_existing) {
+ self.cache.gpa.free(prefixed_path.sub_path);
gop.key_ptr.updateMaxSize(max_file_size);
gop.key_ptr.updateHandle(handle);
return gop.index;
diff --git a/lib/std/Io/Writer.zig b/lib/std/Io/Writer.zig
index 036c35b9e4..1d6abb2080 100644
--- a/lib/std/Io/Writer.zig
+++ b/lib/std/Io/Writer.zig
@@ -464,32 +464,52 @@ pub fn writeVecAll(w: *Writer, data: [][]const u8) Error!void {
/// The `data` parameter is mutable because this function needs to mutate the
/// fields in order to handle partial writes from `VTable.writeSplat`.
+/// `data` will be restored to its original state before returning.
pub fn writeSplatAll(w: *Writer, data: [][]const u8, splat: usize) Error!void {
var index: usize = 0;
var truncate: usize = 0;
- var remaining_splat = splat;
while (index + 1 < data.len) {
{
const untruncated = data[index];
data[index] = untruncated[truncate..];
defer data[index] = untruncated;
- truncate += try w.writeSplat(data[index..], remaining_splat);
+ truncate += try w.writeSplat(data[index..], splat);
}
- while (truncate >= data[index].len) {
- if (index + 1 < data.len) {
- truncate -= data[index].len;
- index += 1;
- } else {
- const last = data[data.len - 1];
- remaining_splat -= @divExact(truncate, last.len);
- while (remaining_splat > 0) {
- const n = try w.writeSplat(data[data.len - 1 ..][0..1], remaining_splat);
- remaining_splat -= @divExact(n, last.len);
- }
- return;
- }
+ while (truncate >= data[index].len and index + 1 < data.len) {
+ truncate -= data[index].len;
+ index += 1;
}
}
+
+ // Deal with any left over splats
+ if (data.len != 0 and truncate < data[index].len * splat) {
+ std.debug.assert(index == data.len - 1);
+ var remaining_splat = splat;
+ while (true) {
+ remaining_splat -= truncate / data[index].len;
+ truncate %= data[index].len;
+ if (remaining_splat == 0) break;
+ truncate += try w.writeSplat(&.{ data[index][truncate..], data[index] }, remaining_splat - 1);
+ }
+ }
+}
+
+test writeSplatAll {
+ var aw: Writer.Allocating = .init(testing.allocator);
+ defer aw.deinit();
+
+ var buffers = [_][]const u8{ "ba", "na" };
+ try aw.writer.writeSplatAll(&buffers, 2);
+ try testing.expectEqualStrings("banana", aw.writer.buffered());
+}
+
+test "writeSplatAll works with a single buffer" {
+ var aw: Writer.Allocating = .init(testing.allocator);
+ defer aw.deinit();
+
+ var message: [1][]const u8 = .{"hello"};
+ try aw.writer.writeSplatAll(&message, 3);
+ try testing.expectEqualStrings("hellohellohello", aw.writer.buffered());
}
pub fn write(w: *Writer, bytes: []const u8) Error!usize {
@@ -763,6 +783,14 @@ pub fn splatByteAll(w: *Writer, byte: u8, n: usize) Error!void {
while (remaining > 0) remaining -= try w.splatByte(byte, remaining);
}
+test splatByteAll {
+ var aw: Writer.Allocating = .init(testing.allocator);
+ defer aw.deinit();
+
+ try aw.writer.splatByteAll('7', 45);
+ try testing.expectEqualStrings("7" ** 45, aw.writer.buffered());
+}
+
/// Writes the same byte many times, allowing short writes.
///
/// Does maximum of one underlying `VTable.drain`.
@@ -778,13 +806,21 @@ pub fn splatBytesAll(w: *Writer, bytes: []const u8, splat: usize) Error!void {
while (remaining_bytes > 0) {
const leftover = remaining_bytes % bytes.len;
const buffers: [2][]const u8 = .{ bytes[bytes.len - leftover ..], bytes };
- remaining_bytes -= try w.splatBytes(&buffers, splat);
+ remaining_bytes -= try w.writeSplat(&buffers, splat);
}
}
+test splatBytesAll {
+ var aw: Writer.Allocating = .init(testing.allocator);
+ defer aw.deinit();
+
+ try aw.writer.splatBytesAll("hello", 3);
+ try testing.expectEqualStrings("hellohellohello", aw.writer.buffered());
+}
+
/// Writes the same slice many times, allowing short writes.
///
-/// Does maximum of one underlying `VTable.writeSplat`.
+/// Does maximum of one underlying `VTable.drain`.
pub fn splatBytes(w: *Writer, bytes: []const u8, n: usize) Error!usize {
return writeSplat(w, &.{bytes}, n);
}
diff --git a/lib/std/Thread.zig b/lib/std/Thread.zig
index 423a887b34..0669df2b0f 100644
--- a/lib/std/Thread.zig
+++ b/lib/std/Thread.zig
@@ -1199,8 +1199,7 @@ const LinuxThreadImpl = struct {
:
: [ptr] "r" (@intFromPtr(self.mapped.ptr)),
[len] "r" (self.mapped.len),
- : "memory"
- ),
+ : .{ .memory = true }),
.x86_64 => asm volatile (
\\ movq $11, %%rax # SYS_munmap
\\ syscall
@@ -1222,8 +1221,7 @@ const LinuxThreadImpl = struct {
:
: [ptr] "r" (@intFromPtr(self.mapped.ptr)),
[len] "r" (self.mapped.len),
- : "memory"
- ),
+ : .{ .memory = true }),
.aarch64, .aarch64_be => asm volatile (
\\ mov x8, #215 // SYS_munmap
\\ mov x0, %[ptr]
@@ -1235,8 +1233,7 @@ const LinuxThreadImpl = struct {
:
: [ptr] "r" (@intFromPtr(self.mapped.ptr)),
[len] "r" (self.mapped.len),
- : "memory"
- ),
+ : .{ .memory = true }),
.hexagon => asm volatile (
\\ r6 = #215 // SYS_munmap
\\ r0 = %[ptr]
@@ -1248,8 +1245,7 @@ const LinuxThreadImpl = struct {
:
: [ptr] "r" (@intFromPtr(self.mapped.ptr)),
[len] "r" (self.mapped.len),
- : "memory"
- ),
+ : .{ .memory = true }),
// We set `sp` to the address of the current function as a workaround for a Linux
// kernel bug that caused syscalls to return EFAULT if the stack pointer is invalid.
// The bug was introduced in 46e12c07b3b9603c60fc1d421ff18618241cb081 and fixed in
@@ -1266,8 +1262,7 @@ const LinuxThreadImpl = struct {
:
: [ptr] "r" (@intFromPtr(self.mapped.ptr)),
[len] "r" (self.mapped.len),
- : "memory"
- ),
+ : .{ .memory = true }),
.mips64, .mips64el => asm volatile (
\\ li $2, 5011 # SYS_munmap
\\ move $4, %[ptr]
@@ -1279,8 +1274,7 @@ const LinuxThreadImpl = struct {
:
: [ptr] "r" (@intFromPtr(self.mapped.ptr)),
[len] "r" (self.mapped.len),
- : "memory"
- ),
+ : .{ .memory = true }),
.powerpc, .powerpcle, .powerpc64, .powerpc64le => asm volatile (
\\ li 0, 91 # SYS_munmap
\\ mr 3, %[ptr]
@@ -1293,8 +1287,7 @@ const LinuxThreadImpl = struct {
:
: [ptr] "r" (@intFromPtr(self.mapped.ptr)),
[len] "r" (self.mapped.len),
- : "memory"
- ),
+ : .{ .memory = true }),
.riscv32, .riscv64 => asm volatile (
\\ li a7, 215 # SYS_munmap
\\ mv a0, %[ptr]
@@ -1306,8 +1299,7 @@ const LinuxThreadImpl = struct {
:
: [ptr] "r" (@intFromPtr(self.mapped.ptr)),
[len] "r" (self.mapped.len),
- : "memory"
- ),
+ : .{ .memory = true }),
.s390x => asm volatile (
\\ lgr %%r2, %[ptr]
\\ lgr %%r3, %[len]
@@ -1317,8 +1309,7 @@ const LinuxThreadImpl = struct {
:
: [ptr] "r" (@intFromPtr(self.mapped.ptr)),
[len] "r" (self.mapped.len),
- : "memory"
- ),
+ : .{ .memory = true }),
.sparc => asm volatile (
\\ # See sparc64 comments below.
\\ 1:
@@ -1339,8 +1330,7 @@ const LinuxThreadImpl = struct {
:
: [ptr] "r" (@intFromPtr(self.mapped.ptr)),
[len] "r" (self.mapped.len),
- : "memory"
- ),
+ : .{ .memory = true }),
.sparc64 => asm volatile (
\\ # SPARCs really don't like it when active stack frames
\\ # is unmapped (it will result in a segfault), so we
@@ -1366,8 +1356,7 @@ const LinuxThreadImpl = struct {
:
: [ptr] "r" (@intFromPtr(self.mapped.ptr)),
[len] "r" (self.mapped.len),
- : "memory"
- ),
+ : .{ .memory = true }),
.loongarch32, .loongarch64 => asm volatile (
\\ or $a0, $zero, %[ptr]
\\ or $a1, $zero, %[len]
@@ -1379,8 +1368,7 @@ const LinuxThreadImpl = struct {
:
: [ptr] "r" (@intFromPtr(self.mapped.ptr)),
[len] "r" (self.mapped.len),
- : "memory"
- ),
+ : .{ .memory = true }),
else => |cpu_arch| @compileError("Unsupported linux arch: " ++ @tagName(cpu_arch)),
}
unreachable;
diff --git a/lib/std/builtin.zig b/lib/std/builtin.zig
index ac0511a43b..308ac2cac6 100644
--- a/lib/std/builtin.zig
+++ b/lib/std/builtin.zig
@@ -1,6 +1,10 @@
//! Types and values provided by the Zig language.
const builtin = @import("builtin");
+const std = @import("std.zig");
+const root = @import("root");
+
+pub const assembly = @import("builtin/assembly.zig");
/// `explicit_subsystem` is missing when the subsystem is automatically detected,
/// so Zig standard library has the subsystem detection logic here. This should generally be
@@ -1102,6 +1106,3 @@ pub noinline fn returnError() void {
st.instruction_addresses[st.index] = @returnAddress();
st.index += 1;
}
-
-const std = @import("std.zig");
-const root = @import("root");
diff --git a/lib/std/builtin/assembly.zig b/lib/std/builtin/assembly.zig
new file mode 100644
index 0000000000..1377e654bd
--- /dev/null
+++ b/lib/std/builtin/assembly.zig
@@ -0,0 +1,2205 @@
+pub const Clobbers = switch (@import("builtin").cpu.arch) {
+ .x86, .x86_64 => packed struct {
+ /// Whether the inline assembly code may perform stores to memory
+ /// addresses other than those derived from input pointer provenance.
+ memory: bool = false,
+
+ /// Condition codes. Subset of the bits in `eflags` and `rflags`.
+ cc: bool = false,
+ dirflag: bool = false,
+ eflags: bool = false,
+ flags: bool = false,
+ fpcr: bool = false,
+ fpsr: bool = false,
+ mxcsr: bool = false,
+ rflags: bool = false,
+
+ rax: bool = false,
+ rcx: bool = false,
+ rdx: bool = false,
+ rbx: bool = false,
+ rsp: bool = false,
+ rbp: bool = false,
+ rsi: bool = false,
+ rdi: bool = false,
+ r8: bool = false,
+ r9: bool = false,
+ r10: bool = false,
+ r11: bool = false,
+ r12: bool = false,
+ r13: bool = false,
+ r14: bool = false,
+ r15: bool = false,
+ eax: bool = false,
+ ecx: bool = false,
+ edx: bool = false,
+ ebx: bool = false,
+ esp: bool = false,
+ ebp: bool = false,
+ esi: bool = false,
+ edi: bool = false,
+ r8d: bool = false,
+ r9d: bool = false,
+ r10d: bool = false,
+ r11d: bool = false,
+ r12d: bool = false,
+ r13d: bool = false,
+ r14d: bool = false,
+ r15d: bool = false,
+ ax: bool = false,
+ cx: bool = false,
+ dx: bool = false,
+ bx: bool = false,
+ sp: bool = false,
+ bp: bool = false,
+ si: bool = false,
+ di: bool = false,
+ r8w: bool = false,
+ r9w: bool = false,
+ r10w: bool = false,
+ r11w: bool = false,
+ r12w: bool = false,
+ r13w: bool = false,
+ r14w: bool = false,
+ r15w: bool = false,
+ al: bool = false,
+ cl: bool = false,
+ dl: bool = false,
+ bl: bool = false,
+ spl: bool = false,
+ bpl: bool = false,
+ sil: bool = false,
+ dil: bool = false,
+ r8b: bool = false,
+ r9b: bool = false,
+ r10b: bool = false,
+ r11b: bool = false,
+ r12b: bool = false,
+ r13b: bool = false,
+ r14b: bool = false,
+ r15b: bool = false,
+ ah: bool = false,
+ ch: bool = false,
+ dh: bool = false,
+ bh: bool = false,
+ zmm0: bool = false,
+ zmm1: bool = false,
+ zmm2: bool = false,
+ zmm3: bool = false,
+ zmm4: bool = false,
+ zmm5: bool = false,
+ zmm6: bool = false,
+ zmm7: bool = false,
+ zmm8: bool = false,
+ zmm9: bool = false,
+ zmm10: bool = false,
+ zmm11: bool = false,
+ zmm12: bool = false,
+ zmm13: bool = false,
+ zmm14: bool = false,
+ zmm15: bool = false,
+ zmm16: bool = false,
+ zmm17: bool = false,
+ zmm18: bool = false,
+ zmm19: bool = false,
+ zmm20: bool = false,
+ zmm21: bool = false,
+ zmm22: bool = false,
+ zmm23: bool = false,
+ zmm24: bool = false,
+ zmm25: bool = false,
+ zmm26: bool = false,
+ zmm27: bool = false,
+ zmm28: bool = false,
+ zmm29: bool = false,
+ zmm30: bool = false,
+ zmm31: bool = false,
+ ymm0: bool = false,
+ ymm1: bool = false,
+ ymm2: bool = false,
+ ymm3: bool = false,
+ ymm4: bool = false,
+ ymm5: bool = false,
+ ymm6: bool = false,
+ ymm7: bool = false,
+ ymm8: bool = false,
+ ymm9: bool = false,
+ ymm10: bool = false,
+ ymm11: bool = false,
+ ymm12: bool = false,
+ ymm13: bool = false,
+ ymm14: bool = false,
+ ymm15: bool = false,
+ ymm16: bool = false,
+ ymm17: bool = false,
+ ymm18: bool = false,
+ ymm19: bool = false,
+ ymm20: bool = false,
+ ymm21: bool = false,
+ ymm22: bool = false,
+ ymm23: bool = false,
+ ymm24: bool = false,
+ ymm25: bool = false,
+ ymm26: bool = false,
+ ymm27: bool = false,
+ ymm28: bool = false,
+ ymm29: bool = false,
+ ymm30: bool = false,
+ ymm31: bool = false,
+ xmm0: bool = false,
+ xmm1: bool = false,
+ xmm2: bool = false,
+ xmm3: bool = false,
+ xmm4: bool = false,
+ xmm5: bool = false,
+ xmm6: bool = false,
+ xmm7: bool = false,
+ xmm8: bool = false,
+ xmm9: bool = false,
+ xmm10: bool = false,
+ xmm11: bool = false,
+ xmm12: bool = false,
+ xmm13: bool = false,
+ xmm14: bool = false,
+ xmm15: bool = false,
+ xmm16: bool = false,
+ xmm17: bool = false,
+ xmm18: bool = false,
+ xmm19: bool = false,
+ xmm20: bool = false,
+ xmm21: bool = false,
+ xmm22: bool = false,
+ xmm23: bool = false,
+ xmm24: bool = false,
+ xmm25: bool = false,
+ xmm26: bool = false,
+ xmm27: bool = false,
+ xmm28: bool = false,
+ xmm29: bool = false,
+ xmm30: bool = false,
+ xmm31: bool = false,
+ mm0: bool = false,
+ mm1: bool = false,
+ mm2: bool = false,
+ mm3: bool = false,
+ mm4: bool = false,
+ mm5: bool = false,
+ mm6: bool = false,
+ mm7: bool = false,
+ st0: bool = false,
+ st1: bool = false,
+ st2: bool = false,
+ st3: bool = false,
+ st4: bool = false,
+ st5: bool = false,
+ st6: bool = false,
+ st7: bool = false,
+ es: bool = false,
+ cs: bool = false,
+ ss: bool = false,
+ ds: bool = false,
+ fs: bool = false,
+ gs: bool = false,
+ },
+ .aarch64, .aarch64_be => packed struct {
+ /// Whether the inline assembly code may perform stores to memory
+ /// addresses other than those derived from input pointer provenance.
+ memory: bool = false,
+
+ nzcv: bool = false,
+
+ x0: bool = false,
+ x1: bool = false,
+ x2: bool = false,
+ x3: bool = false,
+ x4: bool = false,
+ x5: bool = false,
+ x6: bool = false,
+ x7: bool = false,
+ x8: bool = false,
+ x9: bool = false,
+ x10: bool = false,
+ x11: bool = false,
+ x12: bool = false,
+ x13: bool = false,
+ x14: bool = false,
+ x15: bool = false,
+ x16: bool = false,
+ x17: bool = false,
+ x18: bool = false,
+ x19: bool = false,
+ x20: bool = false,
+ x21: bool = false,
+ x22: bool = false,
+ x23: bool = false,
+ x24: bool = false,
+ x25: bool = false,
+ x26: bool = false,
+ x27: bool = false,
+ x28: bool = false,
+ x29: bool = false,
+ x30: bool = false,
+
+ w0: bool = false,
+ w1: bool = false,
+ w2: bool = false,
+ w3: bool = false,
+ w4: bool = false,
+ w5: bool = false,
+ w6: bool = false,
+ w7: bool = false,
+ w8: bool = false,
+ w9: bool = false,
+ w10: bool = false,
+ w11: bool = false,
+ w12: bool = false,
+ w13: bool = false,
+ w14: bool = false,
+ w15: bool = false,
+ w16: bool = false,
+ w17: bool = false,
+ w18: bool = false,
+ w19: bool = false,
+ w20: bool = false,
+ w21: bool = false,
+ w22: bool = false,
+ w23: bool = false,
+ w24: bool = false,
+ w25: bool = false,
+ w26: bool = false,
+ w27: bool = false,
+ w28: bool = false,
+ w29: bool = false,
+
+ lr: bool = false,
+ sp: bool = false,
+ wsp: bool = false,
+ fpcr: bool = false,
+ fpmr: bool = false,
+ fpsr: bool = false,
+ ffr: bool = false,
+
+ p0: bool = false,
+ p1: bool = false,
+ p2: bool = false,
+ p3: bool = false,
+ p4: bool = false,
+ p5: bool = false,
+ p6: bool = false,
+ p7: bool = false,
+ p8: bool = false,
+ p9: bool = false,
+ p10: bool = false,
+ p11: bool = false,
+ p12: bool = false,
+ p13: bool = false,
+ p14: bool = false,
+ p15: bool = false,
+
+ z0: bool = false,
+ z1: bool = false,
+ z2: bool = false,
+ z3: bool = false,
+ z4: bool = false,
+ z5: bool = false,
+ z6: bool = false,
+ z7: bool = false,
+ z8: bool = false,
+ z9: bool = false,
+ z10: bool = false,
+ z11: bool = false,
+ z12: bool = false,
+ z13: bool = false,
+ z14: bool = false,
+ z15: bool = false,
+ z16: bool = false,
+ z17: bool = false,
+ z18: bool = false,
+ z19: bool = false,
+ z20: bool = false,
+ z21: bool = false,
+ z22: bool = false,
+ z23: bool = false,
+ z24: bool = false,
+ z25: bool = false,
+ z26: bool = false,
+ z27: bool = false,
+ z28: bool = false,
+ z29: bool = false,
+ z30: bool = false,
+ z31: bool = false,
+
+ v0: bool = false,
+ v1: bool = false,
+ v2: bool = false,
+ v3: bool = false,
+ v4: bool = false,
+ v5: bool = false,
+ v6: bool = false,
+ v7: bool = false,
+ v8: bool = false,
+ v9: bool = false,
+ v10: bool = false,
+ v11: bool = false,
+ v12: bool = false,
+ v13: bool = false,
+ v14: bool = false,
+ v15: bool = false,
+ v16: bool = false,
+ v17: bool = false,
+ v18: bool = false,
+ v19: bool = false,
+ v20: bool = false,
+ v21: bool = false,
+ v22: bool = false,
+ v23: bool = false,
+ v24: bool = false,
+ v25: bool = false,
+ v26: bool = false,
+ v27: bool = false,
+ v28: bool = false,
+ v29: bool = false,
+ v30: bool = false,
+ v31: bool = false,
+
+ d0: bool = false,
+ d1: bool = false,
+ d2: bool = false,
+ d3: bool = false,
+ d4: bool = false,
+ d5: bool = false,
+ d6: bool = false,
+ d7: bool = false,
+ d8: bool = false,
+ d9: bool = false,
+ d10: bool = false,
+ d11: bool = false,
+ d12: bool = false,
+ d13: bool = false,
+ d14: bool = false,
+ d15: bool = false,
+ d16: bool = false,
+ d17: bool = false,
+ d18: bool = false,
+ d19: bool = false,
+ d20: bool = false,
+ d21: bool = false,
+ d22: bool = false,
+ d23: bool = false,
+ d24: bool = false,
+ d25: bool = false,
+ d26: bool = false,
+ d27: bool = false,
+ d28: bool = false,
+ d29: bool = false,
+ d30: bool = false,
+ d31: bool = false,
+
+ s0: bool = false,
+ s1: bool = false,
+ s2: bool = false,
+ s3: bool = false,
+ s4: bool = false,
+ s5: bool = false,
+ s6: bool = false,
+ s7: bool = false,
+ s8: bool = false,
+ s9: bool = false,
+ s10: bool = false,
+ s11: bool = false,
+ s12: bool = false,
+ s13: bool = false,
+ s14: bool = false,
+ s15: bool = false,
+ s16: bool = false,
+ s17: bool = false,
+ s18: bool = false,
+ s19: bool = false,
+ s20: bool = false,
+ s21: bool = false,
+ s22: bool = false,
+ s23: bool = false,
+ s24: bool = false,
+ s25: bool = false,
+ s26: bool = false,
+ s27: bool = false,
+ s28: bool = false,
+ s29: bool = false,
+ s30: bool = false,
+ s31: bool = false,
+
+ h0: bool = false,
+ h1: bool = false,
+ h2: bool = false,
+ h3: bool = false,
+ h4: bool = false,
+ h5: bool = false,
+ h6: bool = false,
+ h7: bool = false,
+ h8: bool = false,
+ h9: bool = false,
+ h10: bool = false,
+ h11: bool = false,
+ h12: bool = false,
+ h13: bool = false,
+ h14: bool = false,
+ h15: bool = false,
+ h16: bool = false,
+ h17: bool = false,
+ h18: bool = false,
+ h19: bool = false,
+ h20: bool = false,
+ h21: bool = false,
+ h22: bool = false,
+ h23: bool = false,
+ h24: bool = false,
+ h25: bool = false,
+ h26: bool = false,
+ h27: bool = false,
+ h28: bool = false,
+ h29: bool = false,
+ h30: bool = false,
+ h31: bool = false,
+
+ b0: bool = false,
+ b1: bool = false,
+ b2: bool = false,
+ b3: bool = false,
+ b4: bool = false,
+ b5: bool = false,
+ b6: bool = false,
+ b7: bool = false,
+ b8: bool = false,
+ b9: bool = false,
+ b10: bool = false,
+ b11: bool = false,
+ b12: bool = false,
+ b13: bool = false,
+ b14: bool = false,
+ b15: bool = false,
+ b16: bool = false,
+ b17: bool = false,
+ b18: bool = false,
+ b19: bool = false,
+ b20: bool = false,
+ b21: bool = false,
+ b22: bool = false,
+ b23: bool = false,
+ b24: bool = false,
+ b25: bool = false,
+ b26: bool = false,
+ b27: bool = false,
+ b28: bool = false,
+ b29: bool = false,
+ b30: bool = false,
+ b31: bool = false,
+
+ za0q: bool = false,
+ za1q: bool = false,
+ za2q: bool = false,
+ za3q: bool = false,
+ za4q: bool = false,
+ za5q: bool = false,
+ za6q: bool = false,
+ za7q: bool = false,
+ za8q: bool = false,
+ za9q: bool = false,
+ za10q: bool = false,
+ za11q: bool = false,
+ za12q: bool = false,
+ za13q: bool = false,
+ za14q: bool = false,
+ za15q: bool = false,
+
+ za0d: bool = false,
+ za1d: bool = false,
+ za2d: bool = false,
+ za3d: bool = false,
+ za4d: bool = false,
+ za5d: bool = false,
+ za6d: bool = false,
+ za7d: bool = false,
+
+ za0s: bool = false,
+ za1s: bool = false,
+ za2s: bool = false,
+ za3s: bool = false,
+
+ za0h: bool = false,
+ za1h: bool = false,
+ za0b: bool = false,
+
+ zt0: bool = false,
+ },
+ .arm, .armeb, .thumb, .thumbeb => packed struct {
+ /// Whether the inline assembly code may perform stores to memory
+ /// addresses other than those derived from input pointer provenance.
+ memory: bool = false,
+
+ apsr: bool = false,
+ cpsr: bool = false,
+ spsr: bool = false,
+ r0: bool = false,
+ r1: bool = false,
+ r2: bool = false,
+ r3: bool = false,
+ r4: bool = false,
+ r5: bool = false,
+ r6: bool = false,
+ r7: bool = false,
+ r8: bool = false,
+ r9: bool = false,
+ r10: bool = false,
+ r11: bool = false,
+ r12: bool = false,
+ r13: bool = false,
+ r14: bool = false,
+
+ fpscr: bool = false,
+ vpr: bool = false,
+
+ d0: bool = false,
+ d1: bool = false,
+ d2: bool = false,
+ d3: bool = false,
+ d4: bool = false,
+ d5: bool = false,
+ d6: bool = false,
+ d7: bool = false,
+ d8: bool = false,
+ d9: bool = false,
+ d10: bool = false,
+ d11: bool = false,
+ d12: bool = false,
+ d13: bool = false,
+ d14: bool = false,
+ d15: bool = false,
+ d16: bool = false,
+ d17: bool = false,
+ d18: bool = false,
+ d19: bool = false,
+ d20: bool = false,
+ d21: bool = false,
+ d22: bool = false,
+ d23: bool = false,
+ d24: bool = false,
+ d25: bool = false,
+ d26: bool = false,
+ d27: bool = false,
+ d28: bool = false,
+ d29: bool = false,
+ d30: bool = false,
+ d31: bool = false,
+
+ s0: bool = false,
+ s1: bool = false,
+ s2: bool = false,
+ s3: bool = false,
+ s4: bool = false,
+ s5: bool = false,
+ s6: bool = false,
+ s7: bool = false,
+ s8: bool = false,
+ s9: bool = false,
+ s10: bool = false,
+ s11: bool = false,
+ s12: bool = false,
+ s13: bool = false,
+ s14: bool = false,
+ s15: bool = false,
+ s16: bool = false,
+ s17: bool = false,
+ s18: bool = false,
+ s19: bool = false,
+ s20: bool = false,
+ s21: bool = false,
+ s22: bool = false,
+ s23: bool = false,
+ s24: bool = false,
+ s25: bool = false,
+ s26: bool = false,
+ s27: bool = false,
+ s28: bool = false,
+ s29: bool = false,
+ s30: bool = false,
+ s31: bool = false,
+
+ q0: bool = false,
+ q1: bool = false,
+ q2: bool = false,
+ q3: bool = false,
+ q4: bool = false,
+ q5: bool = false,
+ q6: bool = false,
+ q7: bool = false,
+ q8: bool = false,
+ q9: bool = false,
+ q10: bool = false,
+ q11: bool = false,
+ q12: bool = false,
+ q13: bool = false,
+ q14: bool = false,
+ q15: bool = false,
+ },
+ .riscv32, .riscv64 => packed struct {
+ /// Whether the inline assembly code may perform stores to memory
+ /// addresses other than those derived from input pointer provenance.
+ memory: bool = false,
+
+ ssp: bool = false,
+
+ x1: bool = false,
+ x2: bool = false,
+ x3: bool = false,
+ x4: bool = false,
+ x5: bool = false,
+ x6: bool = false,
+ x7: bool = false,
+ x8: bool = false,
+ x9: bool = false,
+ x10: bool = false,
+ x11: bool = false,
+ x12: bool = false,
+ x13: bool = false,
+ x14: bool = false,
+ x15: bool = false,
+ x16: bool = false,
+ x17: bool = false,
+ x18: bool = false,
+ x19: bool = false,
+ x20: bool = false,
+ x21: bool = false,
+ x22: bool = false,
+ x23: bool = false,
+ x24: bool = false,
+ x25: bool = false,
+ x26: bool = false,
+ x27: bool = false,
+ x28: bool = false,
+ x29: bool = false,
+ x30: bool = false,
+ x31: bool = false,
+
+ fflags: bool = false,
+ frm: bool = false,
+
+ f0: bool = false,
+ f1: bool = false,
+ f2: bool = false,
+ f3: bool = false,
+ f4: bool = false,
+ f5: bool = false,
+ f6: bool = false,
+ f7: bool = false,
+ f8: bool = false,
+ f9: bool = false,
+ f10: bool = false,
+ f11: bool = false,
+ f12: bool = false,
+ f13: bool = false,
+ f14: bool = false,
+ f15: bool = false,
+ f16: bool = false,
+ f17: bool = false,
+ f18: bool = false,
+ f19: bool = false,
+ f20: bool = false,
+ f21: bool = false,
+ f22: bool = false,
+ f23: bool = false,
+ f24: bool = false,
+ f25: bool = false,
+ f26: bool = false,
+ f27: bool = false,
+ f28: bool = false,
+ f29: bool = false,
+ f30: bool = false,
+ f31: bool = false,
+
+ vtype: bool = false,
+ vl: bool = false,
+ vxsat: bool = false,
+ vxrm: bool = false,
+ vcsr: bool = false,
+
+ v0: bool = false,
+ v1: bool = false,
+ v2: bool = false,
+ v3: bool = false,
+ v4: bool = false,
+ v5: bool = false,
+ v6: bool = false,
+ v7: bool = false,
+ v8: bool = false,
+ v9: bool = false,
+ v10: bool = false,
+ v11: bool = false,
+ v12: bool = false,
+ v13: bool = false,
+ v14: bool = false,
+ v15: bool = false,
+ v16: bool = false,
+ v17: bool = false,
+ v18: bool = false,
+ v19: bool = false,
+ v20: bool = false,
+ v21: bool = false,
+ v22: bool = false,
+ v23: bool = false,
+ v24: bool = false,
+ v25: bool = false,
+ v26: bool = false,
+ v27: bool = false,
+ v28: bool = false,
+ v29: bool = false,
+ v30: bool = false,
+ v31: bool = false,
+ },
+ .xcore => packed struct {
+ /// Whether the inline assembly code may perform stores to memory
+ /// addresses other than those derived from input pointer provenance.
+ memory: bool = false,
+
+ r0: bool = false,
+ r1: bool = false,
+ r2: bool = false,
+ r3: bool = false,
+ r4: bool = false,
+ r5: bool = false,
+ r6: bool = false,
+ r7: bool = false,
+ r8: bool = false,
+ r9: bool = false,
+ r10: bool = false,
+ r11: bool = false,
+
+ cp: bool = false,
+ dp: bool = false,
+ sp: bool = false,
+ lr: bool = false,
+ sr: bool = false,
+ },
+ .xtensa => packed struct {
+ /// Whether the inline assembly code may perform stores to memory
+ /// addresses other than those derived from input pointer provenance.
+ memory: bool = false,
+
+ sar: bool = false,
+ lbeg: bool = false,
+ lend: bool = false,
+ lcount: bool = false,
+ atomctl: bool = false,
+ scompare1: bool = false,
+ threadptr: bool = false,
+ litbase: bool = false,
+ windowbase: bool = false,
+ windowstart: bool = false,
+ ps: bool = false,
+
+ a0: bool = false,
+ a1: bool = false,
+ a2: bool = false,
+ a3: bool = false,
+ a4: bool = false,
+ a5: bool = false,
+ a6: bool = false,
+ a7: bool = false,
+ a8: bool = false,
+ a9: bool = false,
+ a10: bool = false,
+ a11: bool = false,
+ a12: bool = false,
+ a13: bool = false,
+ a14: bool = false,
+ a15: bool = false,
+
+ br: bool = false,
+ b0: bool = false,
+ b1: bool = false,
+ b2: bool = false,
+ b3: bool = false,
+ b4: bool = false,
+ b5: bool = false,
+ b6: bool = false,
+ b7: bool = false,
+ b8: bool = false,
+ b9: bool = false,
+ b10: bool = false,
+ b11: bool = false,
+ b12: bool = false,
+ b13: bool = false,
+ b14: bool = false,
+ b15: bool = false,
+
+ acchi: bool = false,
+ acclo: bool = false,
+ m0: bool = false,
+ m1: bool = false,
+ m2: bool = false,
+ m3: bool = false,
+ fcr: bool = false,
+ fsr: bool = false,
+
+ f0: bool = false,
+ f1: bool = false,
+ f2: bool = false,
+ f3: bool = false,
+ f4: bool = false,
+ f5: bool = false,
+ f6: bool = false,
+ f7: bool = false,
+ f8: bool = false,
+ f9: bool = false,
+ f10: bool = false,
+ f11: bool = false,
+ f12: bool = false,
+ f13: bool = false,
+ f14: bool = false,
+ f15: bool = false,
+ },
+ .lanai => packed struct {
+ /// Whether the inline assembly code may perform stores to memory
+ /// addresses other than those derived from input pointer provenance.
+ memory: bool = false,
+ /// Condition flags which aren't accessible outside of conditional execution.
+ sw: bool = false,
+
+ r3: bool = false,
+ r4: bool = false,
+ r5: bool = false,
+ r6: bool = false,
+ r7: bool = false,
+ r8: bool = false,
+ r9: bool = false,
+ r10: bool = false,
+ r11: bool = false,
+ r12: bool = false,
+ r13: bool = false,
+ r14: bool = false,
+ r15: bool = false,
+ r16: bool = false,
+ r17: bool = false,
+ r18: bool = false,
+ r19: bool = false,
+ r20: bool = false,
+ r21: bool = false,
+ r22: bool = false,
+ r23: bool = false,
+ r24: bool = false,
+ r25: bool = false,
+ r26: bool = false,
+ r27: bool = false,
+ r28: bool = false,
+ r29: bool = false,
+ r30: bool = false,
+ r31: bool = false,
+ },
+ .avr => packed struct {
+ /// Whether the inline assembly code may perform stores to memory
+ /// addresses other than those derived from input pointer provenance.
+ memory: bool = false,
+ flags: bool = false,
+ r0: bool = false,
+ r1: bool = false,
+ r2: bool = false,
+ r3: bool = false,
+ r4: bool = false,
+ r5: bool = false,
+ r6: bool = false,
+ r7: bool = false,
+ r8: bool = false,
+ r9: bool = false,
+ r10: bool = false,
+ r11: bool = false,
+ r12: bool = false,
+ r13: bool = false,
+ r14: bool = false,
+ r15: bool = false,
+ r16: bool = false,
+ r17: bool = false,
+ r18: bool = false,
+ r19: bool = false,
+ r20: bool = false,
+ r21: bool = false,
+ r22: bool = false,
+ r23: bool = false,
+ r24: bool = false,
+ r25: bool = false,
+ r26: bool = false,
+ r27: bool = false,
+ r28: bool = false,
+ r29: bool = false,
+ r30: bool = false,
+ r31: bool = false,
+ },
+ .msp430 => packed struct {
+ /// Whether the inline assembly code may perform stores to memory
+ /// addresses other than those derived from input pointer provenance.
+ memory: bool = false,
+
+ r0: bool = false,
+ r1: bool = false,
+ r2: bool = false,
+
+ r4: bool = false,
+ r5: bool = false,
+ r6: bool = false,
+ r7: bool = false,
+ r8: bool = false,
+ r9: bool = false,
+ r10: bool = false,
+ r11: bool = false,
+ r12: bool = false,
+ r13: bool = false,
+ r14: bool = false,
+ r15: bool = false,
+ },
+ .m68k => packed struct {
+ /// Whether the inline assembly code may perform stores to memory
+ /// addresses other than those derived from input pointer provenance.
+ memory: bool = false,
+
+ ccr: bool = false,
+
+ d0: bool = false,
+ d1: bool = false,
+ d2: bool = false,
+ d3: bool = false,
+ d4: bool = false,
+ d5: bool = false,
+ d6: bool = false,
+ d7: bool = false,
+
+ a0: bool = false,
+ a1: bool = false,
+ a2: bool = false,
+ a3: bool = false,
+ a4: bool = false,
+ a5: bool = false,
+ a6: bool = false,
+ a7: bool = false,
+
+ macsr: bool = false,
+ acc: bool = false,
+ acc0: bool = false,
+ acc1: bool = false,
+ acc2: bool = false,
+ acc3: bool = false,
+
+ mask: bool = false,
+ fpcr: bool = false,
+ fpsr: bool = false,
+
+ fp0: bool = false,
+ fp1: bool = false,
+ fp2: bool = false,
+ fp3: bool = false,
+ fp4: bool = false,
+ fp5: bool = false,
+ fp6: bool = false,
+ fp7: bool = false,
+ },
+ .sparc, .sparc64 => packed struct {
+ /// Whether the inline assembly code may perform stores to memory
+ /// addresses other than those derived from input pointer provenance.
+ memory: bool = false,
+
+ psr: bool = false,
+ gsr: bool = false,
+ y: bool = false,
+
+ /// asr2; v9+
+ ccr: bool = false,
+ /// Lower bits of `ccr`.
+ icc: bool = false,
+ /// Upper bits of `ccr`.
+ xcc: bool = false,
+
+ g1: bool = false,
+ g2: bool = false,
+ g3: bool = false,
+ g4: bool = false,
+ g5: bool = false,
+ g6: bool = false,
+ g7: bool = false,
+
+ o0: bool = false,
+ o1: bool = false,
+ o2: bool = false,
+ o3: bool = false,
+ o4: bool = false,
+ o5: bool = false,
+ o6: bool = false,
+ o7: bool = false,
+
+ l0: bool = false,
+ l1: bool = false,
+ l2: bool = false,
+ l3: bool = false,
+ l4: bool = false,
+ l5: bool = false,
+ l6: bool = false,
+ l7: bool = false,
+
+ i0: bool = false,
+ i1: bool = false,
+ i2: bool = false,
+ i3: bool = false,
+ i4: bool = false,
+ i5: bool = false,
+ i6: bool = false,
+ i7: bool = false,
+
+ fsr: bool = false,
+ fprs: bool = false,
+
+ q0: bool = false,
+ q1: bool = false,
+ q2: bool = false,
+ q3: bool = false,
+ q4: bool = false,
+ q5: bool = false,
+ q6: bool = false,
+ q7: bool = false,
+ q8: bool = false,
+ q9: bool = false,
+ q10: bool = false,
+ q11: bool = false,
+ q12: bool = false,
+ q13: bool = false,
+ q14: bool = false,
+ q15: bool = false,
+ },
+ .bpfel, .bpfeb => packed struct {
+ /// Whether the inline assembly code may perform stores to memory
+ /// addresses other than those derived from input pointer provenance.
+ memory: bool = false,
+
+ r0: bool = false,
+ r1: bool = false,
+ r2: bool = false,
+ r3: bool = false,
+ r4: bool = false,
+ r5: bool = false,
+ r6: bool = false,
+ r7: bool = false,
+ r8: bool = false,
+ r9: bool = false,
+
+ w0: bool = false,
+ w1: bool = false,
+ w2: bool = false,
+ w3: bool = false,
+ w4: bool = false,
+ w5: bool = false,
+ w6: bool = false,
+ w7: bool = false,
+ w8: bool = false,
+ w9: bool = false,
+ },
+ .hexagon => packed struct {
+ /// Whether the inline assembly code may perform stores to memory
+ /// addresses other than those derived from input pointer provenance.
+ memory: bool = false,
+
+ sa0: bool = false,
+ sa1: bool = false,
+ lc0: bool = false,
+ lc1: bool = false,
+ m0: bool = false,
+ m1: bool = false,
+ usr: bool = false,
+ ugp: bool = false,
+ gp: bool = false,
+ cs0: bool = false,
+ cs1: bool = false,
+ framelimit: bool = false,
+ framekey: bool = false,
+
+ p0: bool = false,
+ p1: bool = false,
+ p2: bool = false,
+ p3: bool = false,
+
+ r0: bool = false,
+ r1: bool = false,
+ r2: bool = false,
+ r3: bool = false,
+ r4: bool = false,
+ r5: bool = false,
+ r6: bool = false,
+ r7: bool = false,
+ r8: bool = false,
+ r9: bool = false,
+ r10: bool = false,
+ r11: bool = false,
+ r12: bool = false,
+ r13: bool = false,
+ r14: bool = false,
+ r15: bool = false,
+ r16: bool = false,
+ r17: bool = false,
+ r18: bool = false,
+ r19: bool = false,
+ r20: bool = false,
+ r21: bool = false,
+ r22: bool = false,
+ r23: bool = false,
+ r24: bool = false,
+ r25: bool = false,
+ r26: bool = false,
+ r27: bool = false,
+ r28: bool = false,
+ r29: bool = false,
+ r30: bool = false,
+ r31: bool = false,
+
+ q0: bool = false,
+ q1: bool = false,
+ q2: bool = false,
+ q3: bool = false,
+
+ v0: bool = false,
+ v1: bool = false,
+ v2: bool = false,
+ v3: bool = false,
+ v4: bool = false,
+ v5: bool = false,
+ v6: bool = false,
+ v7: bool = false,
+ v8: bool = false,
+ v9: bool = false,
+ v10: bool = false,
+ v11: bool = false,
+ v12: bool = false,
+ v13: bool = false,
+ v14: bool = false,
+ v15: bool = false,
+ v16: bool = false,
+ v17: bool = false,
+ v18: bool = false,
+ v19: bool = false,
+ v20: bool = false,
+ v21: bool = false,
+ v22: bool = false,
+ v23: bool = false,
+ v24: bool = false,
+ v25: bool = false,
+ v26: bool = false,
+ v27: bool = false,
+ v28: bool = false,
+ v29: bool = false,
+ v30: bool = false,
+ v31: bool = false,
+ },
+ .s390x => packed struct {
+ /// Whether the inline assembly code may perform stores to memory
+ /// addresses other than those derived from input pointer provenance.
+ memory: bool = false,
+
+ ps: bool = false,
+ r0: bool = false,
+ r1: bool = false,
+ r2: bool = false,
+ r3: bool = false,
+ r4: bool = false,
+ r5: bool = false,
+ r6: bool = false,
+ r7: bool = false,
+ r8: bool = false,
+ r9: bool = false,
+ r10: bool = false,
+ r11: bool = false,
+ r12: bool = false,
+ r13: bool = false,
+ r14: bool = false,
+ r15: bool = false,
+
+ fpc: bool = false,
+
+ v0: bool = false,
+ v1: bool = false,
+ v2: bool = false,
+ v3: bool = false,
+ v4: bool = false,
+ v5: bool = false,
+ v6: bool = false,
+ v7: bool = false,
+ v8: bool = false,
+ v9: bool = false,
+ v10: bool = false,
+ v11: bool = false,
+ v12: bool = false,
+ v13: bool = false,
+ v14: bool = false,
+ v15: bool = false,
+ v16: bool = false,
+ v17: bool = false,
+ v18: bool = false,
+ v19: bool = false,
+ v20: bool = false,
+ v21: bool = false,
+ v22: bool = false,
+ v23: bool = false,
+ v24: bool = false,
+ v25: bool = false,
+ v26: bool = false,
+ v27: bool = false,
+ v28: bool = false,
+ v29: bool = false,
+ v30: bool = false,
+ v31: bool = false,
+
+ f0: bool = false,
+ f1: bool = false,
+ f2: bool = false,
+ f3: bool = false,
+ f4: bool = false,
+ f5: bool = false,
+ f6: bool = false,
+ f7: bool = false,
+ f8: bool = false,
+ f9: bool = false,
+ f10: bool = false,
+ f11: bool = false,
+ f12: bool = false,
+ f13: bool = false,
+ f14: bool = false,
+ f15: bool = false,
+ },
+ .ve => packed struct {
+ /// Whether the inline assembly code may perform stores to memory
+ /// addresses other than those derived from input pointer provenance.
+ memory: bool = false,
+
+ psw: bool = false,
+
+ s0: bool = false,
+ s1: bool = false,
+ s2: bool = false,
+ s3: bool = false,
+ s4: bool = false,
+ s5: bool = false,
+ s6: bool = false,
+ s7: bool = false,
+ s8: bool = false,
+ s9: bool = false,
+ s10: bool = false,
+ s11: bool = false,
+ s12: bool = false,
+ s13: bool = false,
+ s14: bool = false,
+ s15: bool = false,
+ s16: bool = false,
+ s17: bool = false,
+ s18: bool = false,
+ s19: bool = false,
+ s20: bool = false,
+ s21: bool = false,
+ s22: bool = false,
+ s23: bool = false,
+ s24: bool = false,
+ s25: bool = false,
+ s26: bool = false,
+ s27: bool = false,
+ s28: bool = false,
+ s29: bool = false,
+ s30: bool = false,
+ s31: bool = false,
+ s32: bool = false,
+ s33: bool = false,
+ s34: bool = false,
+ s35: bool = false,
+ s36: bool = false,
+ s37: bool = false,
+ s38: bool = false,
+ s39: bool = false,
+ s40: bool = false,
+ s41: bool = false,
+ s42: bool = false,
+ s43: bool = false,
+ s44: bool = false,
+ s45: bool = false,
+ s46: bool = false,
+ s47: bool = false,
+ s48: bool = false,
+ s49: bool = false,
+ s50: bool = false,
+ s51: bool = false,
+ s52: bool = false,
+ s53: bool = false,
+ s54: bool = false,
+ s55: bool = false,
+ s56: bool = false,
+ s57: bool = false,
+ s58: bool = false,
+ s59: bool = false,
+ s60: bool = false,
+ s61: bool = false,
+ s62: bool = false,
+ s63: bool = false,
+
+ vixr: bool = false,
+ vl: bool = false,
+
+ vm0: bool = false,
+ vm1: bool = false,
+ vm2: bool = false,
+ vm3: bool = false,
+ vm4: bool = false,
+ vm5: bool = false,
+ vm6: bool = false,
+ vm7: bool = false,
+ vm8: bool = false,
+ vm9: bool = false,
+ vm10: bool = false,
+ vm11: bool = false,
+ vm12: bool = false,
+ vm13: bool = false,
+ vm14: bool = false,
+ vm15: bool = false,
+
+ v0: bool = false,
+ v1: bool = false,
+ v2: bool = false,
+ v3: bool = false,
+ v4: bool = false,
+ v5: bool = false,
+ v6: bool = false,
+ v7: bool = false,
+ v8: bool = false,
+ v9: bool = false,
+ v10: bool = false,
+ v11: bool = false,
+ v12: bool = false,
+ v13: bool = false,
+ v14: bool = false,
+ v15: bool = false,
+ v16: bool = false,
+ v17: bool = false,
+ v18: bool = false,
+ v19: bool = false,
+ v20: bool = false,
+ v21: bool = false,
+ v22: bool = false,
+ v23: bool = false,
+ v24: bool = false,
+ v25: bool = false,
+ v26: bool = false,
+ v27: bool = false,
+ v28: bool = false,
+ v29: bool = false,
+ v30: bool = false,
+ v31: bool = false,
+ v32: bool = false,
+ v33: bool = false,
+ v34: bool = false,
+ v35: bool = false,
+ v36: bool = false,
+ v37: bool = false,
+ v38: bool = false,
+ v39: bool = false,
+ v40: bool = false,
+ v41: bool = false,
+ v42: bool = false,
+ v43: bool = false,
+ v44: bool = false,
+ v45: bool = false,
+ v46: bool = false,
+ v47: bool = false,
+ v48: bool = false,
+ v49: bool = false,
+ v50: bool = false,
+ v51: bool = false,
+ v52: bool = false,
+ v53: bool = false,
+ v54: bool = false,
+ v55: bool = false,
+ v56: bool = false,
+ v57: bool = false,
+ v58: bool = false,
+ v59: bool = false,
+ v60: bool = false,
+ v61: bool = false,
+ v62: bool = false,
+ v63: bool = false,
+ },
+ .kalimba => packed struct {
+ /// Whether the inline assembly code may perform stores to memory
+ /// addresses other than those derived from input pointer provenance.
+ memory: bool = false,
+
+ i0: bool = false,
+ i1: bool = false,
+ i2: bool = false,
+ i3: bool = false,
+ i4: bool = false,
+ i5: bool = false,
+ i6: bool = false,
+ i7: bool = false,
+
+ m0: bool = false,
+ m1: bool = false,
+ m2: bool = false,
+ m3: bool = false,
+ l0: bool = false,
+ l1: bool = false,
+ l2: bool = false,
+ l3: bool = false,
+ l4: bool = false,
+ l5: bool = false,
+ doloopstart: bool = false,
+ doloopend: bool = false,
+ divresult: bool = false,
+ divremainder: bool = false,
+ rmac: bool = false,
+ rmac0: bool = false,
+ rmac1: bool = false,
+ rmac2: bool = false,
+ rlink: bool = false,
+ rflags: bool = false,
+ r0: bool = false,
+ r1: bool = false,
+ r2: bool = false,
+ r3: bool = false,
+ r4: bool = false,
+ r5: bool = false,
+ r6: bool = false,
+ r7: bool = false,
+ r8: bool = false,
+ r9: bool = false,
+ r10: bool = false,
+ },
+ .or1k => packed struct {
+ /// Whether the inline assembly code may perform stores to memory
+ /// addresses other than those derived from input pointer provenance.
+ memory: bool = false,
+
+ maclo: bool = false,
+ machi: bool = false,
+ fpcsr: bool = false,
+ fpmaddlo: bool = false,
+ fpmaddhi: bool = false,
+ vmaclo: bool = false,
+ vmachi: bool = false,
+
+ r0: bool = false,
+ r1: bool = false,
+ r2: bool = false,
+ r3: bool = false,
+ r4: bool = false,
+ r5: bool = false,
+ r6: bool = false,
+ r7: bool = false,
+ r8: bool = false,
+ r9: bool = false,
+ r10: bool = false,
+ r11: bool = false,
+ r12: bool = false,
+ r13: bool = false,
+ r14: bool = false,
+ r15: bool = false,
+ r16: bool = false,
+ r17: bool = false,
+ r18: bool = false,
+ r19: bool = false,
+ r20: bool = false,
+ r21: bool = false,
+ r22: bool = false,
+ r23: bool = false,
+ r24: bool = false,
+ r25: bool = false,
+ r26: bool = false,
+ r27: bool = false,
+ r28: bool = false,
+ r29: bool = false,
+ r30: bool = false,
+ r31: bool = false,
+ },
+ .csky => packed struct {
+ /// Whether the inline assembly code may perform stores to memory
+ /// addresses other than those derived from input pointer provenance.
+ memory: bool = false,
+
+ psr: bool = false,
+ hi: bool = false,
+ lo: bool = false,
+
+ r0: bool = false,
+ r1: bool = false,
+ r2: bool = false,
+ r3: bool = false,
+ r4: bool = false,
+ r5: bool = false,
+ r6: bool = false,
+ r7: bool = false,
+ r8: bool = false,
+ r9: bool = false,
+ r10: bool = false,
+ r11: bool = false,
+ r12: bool = false,
+ r13: bool = false,
+ r14: bool = false,
+ r15: bool = false,
+ r16: bool = false,
+ r17: bool = false,
+ r18: bool = false,
+ r19: bool = false,
+ r20: bool = false,
+ r21: bool = false,
+ r22: bool = false,
+ r23: bool = false,
+ r24: bool = false,
+ r25: bool = false,
+ r26: bool = false,
+ r27: bool = false,
+ r28: bool = false,
+ r29: bool = false,
+ r30: bool = false,
+ r31: bool = false,
+
+ vr0: bool = false,
+ vr1: bool = false,
+ vr2: bool = false,
+ vr3: bool = false,
+ vr4: bool = false,
+ vr5: bool = false,
+ vr6: bool = false,
+ vr7: bool = false,
+ vr8: bool = false,
+ vr9: bool = false,
+ vr10: bool = false,
+ vr11: bool = false,
+ vr12: bool = false,
+ vr13: bool = false,
+ vr14: bool = false,
+ vr15: bool = false,
+ vr16: bool = false,
+ vr17: bool = false,
+ vr18: bool = false,
+ vr19: bool = false,
+ vr20: bool = false,
+ vr21: bool = false,
+ vr22: bool = false,
+ vr23: bool = false,
+ vr24: bool = false,
+ vr25: bool = false,
+ vr26: bool = false,
+ vr27: bool = false,
+ vr28: bool = false,
+ vr29: bool = false,
+ vr30: bool = false,
+ vr31: bool = false,
+ },
+ .arc => packed struct {
+ /// Whether the inline assembly code may perform stores to memory
+ /// addresses other than those derived from input pointer provenance.
+ memory: bool = false,
+
+ status32: bool = false,
+ aux_macmode: bool = false,
+ mulhi: bool = false,
+ lp_start: bool = false,
+ lp_end: bool = false,
+ jli_base: bool = false,
+ ldi_base: bool = false,
+ ei_base: bool = false,
+
+ r0: bool = false,
+ r1: bool = false,
+ r2: bool = false,
+ r3: bool = false,
+ r4: bool = false,
+ r5: bool = false,
+ r6: bool = false,
+ r7: bool = false,
+ r8: bool = false,
+ r9: bool = false,
+ r10: bool = false,
+ r11: bool = false,
+ r12: bool = false,
+ r13: bool = false,
+ r14: bool = false,
+ r15: bool = false,
+ r16: bool = false,
+ r17: bool = false,
+ r18: bool = false,
+ r19: bool = false,
+ r20: bool = false,
+ r21: bool = false,
+ r22: bool = false,
+ r23: bool = false,
+ r24: bool = false,
+ r25: bool = false,
+ r26: bool = false,
+ r27: bool = false,
+ r28: bool = false,
+ r29: bool = false,
+ r30: bool = false,
+ r31: bool = false,
+ r32: bool = false,
+ r33: bool = false,
+ r34: bool = false,
+ r35: bool = false,
+ r36: bool = false,
+ r37: bool = false,
+ r38: bool = false,
+ r39: bool = false,
+ r40: bool = false,
+ r41: bool = false,
+ r42: bool = false,
+ r43: bool = false,
+ r44: bool = false,
+ r45: bool = false,
+ r46: bool = false,
+ r47: bool = false,
+ r48: bool = false,
+ r49: bool = false,
+ r50: bool = false,
+ r51: bool = false,
+ r52: bool = false,
+ r53: bool = false,
+ r54: bool = false,
+ r55: bool = false,
+ r56: bool = false,
+ r57: bool = false,
+ r58: bool = false,
+ r59: bool = false,
+ r60: bool = false,
+
+ fmp_ctrl: bool = false,
+ dsp_ctrl: bool = false,
+ acc0_lo: bool = false,
+ acc0_glo: bool = false,
+ acc0_hi: bool = false,
+ acc0_ghi: bool = false,
+ fp_ctrl: bool = false,
+ fpu_status: bool = false,
+ vfpu_status: bool = false,
+
+ f0: bool = false,
+ f1: bool = false,
+ f2: bool = false,
+ f3: bool = false,
+ f4: bool = false,
+ f5: bool = false,
+ f6: bool = false,
+ f7: bool = false,
+ f8: bool = false,
+ f9: bool = false,
+ f10: bool = false,
+ f11: bool = false,
+ f12: bool = false,
+ f13: bool = false,
+ f14: bool = false,
+ f15: bool = false,
+ f16: bool = false,
+ f17: bool = false,
+ f18: bool = false,
+ f19: bool = false,
+ f20: bool = false,
+ f21: bool = false,
+ f22: bool = false,
+ f23: bool = false,
+ f24: bool = false,
+ f25: bool = false,
+ f26: bool = false,
+ f27: bool = false,
+ f28: bool = false,
+ f29: bool = false,
+ f30: bool = false,
+ f31: bool = false,
+ },
+ .loongarch32, .loongarch64 => packed struct {
+ /// Whether the inline assembly code may perform stores to memory
+ /// addresses other than those derived from input pointer provenance.
+ memory: bool = false,
+
+ r1: bool = false,
+ r2: bool = false,
+ r3: bool = false,
+ r4: bool = false,
+ r5: bool = false,
+ r6: bool = false,
+ r7: bool = false,
+ r8: bool = false,
+ r9: bool = false,
+ r10: bool = false,
+ r11: bool = false,
+ r12: bool = false,
+ r13: bool = false,
+ r14: bool = false,
+ r15: bool = false,
+ r16: bool = false,
+ r17: bool = false,
+ r18: bool = false,
+ r19: bool = false,
+ r20: bool = false,
+ r21: bool = false,
+ r22: bool = false,
+ r23: bool = false,
+ r24: bool = false,
+ r25: bool = false,
+ r26: bool = false,
+ r27: bool = false,
+ r28: bool = false,
+ r29: bool = false,
+ r30: bool = false,
+ r31: bool = false,
+
+ fcc0: bool = false,
+ fcc1: bool = false,
+ fcc2: bool = false,
+ fcc3: bool = false,
+ fcc4: bool = false,
+ fcc5: bool = false,
+ fcc6: bool = false,
+ fcc7: bool = false,
+
+ fcsr0: bool = false,
+ fcsr1: bool = false,
+ fcsr2: bool = false,
+ fcsr3: bool = false,
+
+ xr0: bool = false,
+ xr1: bool = false,
+ xr2: bool = false,
+ xr3: bool = false,
+ xr4: bool = false,
+ xr5: bool = false,
+ xr6: bool = false,
+ xr7: bool = false,
+ xr8: bool = false,
+ xr9: bool = false,
+ xr10: bool = false,
+ xr11: bool = false,
+ xr12: bool = false,
+ xr13: bool = false,
+ xr14: bool = false,
+ xr15: bool = false,
+ xr16: bool = false,
+ xr17: bool = false,
+ xr18: bool = false,
+ xr19: bool = false,
+ xr20: bool = false,
+ xr21: bool = false,
+ xr22: bool = false,
+ xr23: bool = false,
+ xr24: bool = false,
+ xr25: bool = false,
+ xr26: bool = false,
+ xr27: bool = false,
+ xr28: bool = false,
+ xr29: bool = false,
+ xr30: bool = false,
+ xr31: bool = false,
+
+ vr0: bool = false,
+ vr1: bool = false,
+ vr2: bool = false,
+ vr3: bool = false,
+ vr4: bool = false,
+ vr5: bool = false,
+ vr6: bool = false,
+ vr7: bool = false,
+ vr8: bool = false,
+ vr9: bool = false,
+ vr10: bool = false,
+ vr11: bool = false,
+ vr12: bool = false,
+ vr13: bool = false,
+ vr14: bool = false,
+ vr15: bool = false,
+ vr16: bool = false,
+ vr17: bool = false,
+ vr18: bool = false,
+ vr19: bool = false,
+ vr20: bool = false,
+ vr21: bool = false,
+ vr22: bool = false,
+ vr23: bool = false,
+ vr24: bool = false,
+ vr25: bool = false,
+ vr26: bool = false,
+ vr27: bool = false,
+ vr28: bool = false,
+ vr29: bool = false,
+ vr30: bool = false,
+ vr31: bool = false,
+
+ f0: bool = false,
+ f1: bool = false,
+ f2: bool = false,
+ f3: bool = false,
+ f4: bool = false,
+ f5: bool = false,
+ f6: bool = false,
+ f7: bool = false,
+ f8: bool = false,
+ f9: bool = false,
+ f10: bool = false,
+ f11: bool = false,
+ f12: bool = false,
+ f13: bool = false,
+ f14: bool = false,
+ f15: bool = false,
+ f16: bool = false,
+ f17: bool = false,
+ f18: bool = false,
+ f19: bool = false,
+ f20: bool = false,
+ f21: bool = false,
+ f22: bool = false,
+ f23: bool = false,
+ f24: bool = false,
+ f25: bool = false,
+ f26: bool = false,
+ f27: bool = false,
+ f28: bool = false,
+ f29: bool = false,
+ f30: bool = false,
+ f31: bool = false,
+ },
+ .powerpc, .powerpcle, .powerpc64, .powerpc64le => packed struct {
+ /// Whether the inline assembly code may perform stores to memory
+ /// addresses other than those derived from input pointer provenance.
+ memory: bool = false,
+
+ cr0: bool = false,
+ cr1: bool = false,
+ cr2: bool = false,
+ cr3: bool = false,
+ cr4: bool = false,
+ cr5: bool = false,
+ cr6: bool = false,
+ cr7: bool = false,
+
+ xer: bool = false,
+ ctr: bool = false,
+ lr: bool = false,
+
+ r0: bool = false,
+ r1: bool = false,
+ r2: bool = false,
+ r3: bool = false,
+ r4: bool = false,
+ r5: bool = false,
+ r6: bool = false,
+ r7: bool = false,
+ r8: bool = false,
+ r9: bool = false,
+ r10: bool = false,
+ r11: bool = false,
+ r12: bool = false,
+ r13: bool = false,
+ r14: bool = false,
+ r15: bool = false,
+ r16: bool = false,
+ r17: bool = false,
+ r18: bool = false,
+ r19: bool = false,
+ r20: bool = false,
+ r21: bool = false,
+ r22: bool = false,
+ r23: bool = false,
+ r24: bool = false,
+ r25: bool = false,
+ r26: bool = false,
+ r27: bool = false,
+ r28: bool = false,
+ r29: bool = false,
+ r30: bool = false,
+ r31: bool = false,
+
+ fpscr: bool = false,
+ vscr: bool = false,
+
+ vs0: bool = false,
+ vs1: bool = false,
+ vs2: bool = false,
+ vs3: bool = false,
+ vs4: bool = false,
+ vs5: bool = false,
+ vs6: bool = false,
+ vs7: bool = false,
+ vs8: bool = false,
+ vs9: bool = false,
+ vs10: bool = false,
+ vs11: bool = false,
+ vs12: bool = false,
+ vs13: bool = false,
+ vs14: bool = false,
+ vs15: bool = false,
+ vs16: bool = false,
+ vs17: bool = false,
+ vs18: bool = false,
+ vs19: bool = false,
+ vs20: bool = false,
+ vs21: bool = false,
+ vs22: bool = false,
+ vs23: bool = false,
+ vs24: bool = false,
+ vs25: bool = false,
+ vs26: bool = false,
+ vs27: bool = false,
+ vs28: bool = false,
+ vs29: bool = false,
+ vs30: bool = false,
+ vs31: bool = false,
+ vs32: bool = false,
+ vs33: bool = false,
+ vs34: bool = false,
+ vs35: bool = false,
+ vs36: bool = false,
+ vs37: bool = false,
+ vs38: bool = false,
+ vs39: bool = false,
+ vs40: bool = false,
+ vs41: bool = false,
+ vs42: bool = false,
+ vs43: bool = false,
+ vs44: bool = false,
+ vs45: bool = false,
+ vs46: bool = false,
+ vs47: bool = false,
+ vs48: bool = false,
+ vs49: bool = false,
+ vs50: bool = false,
+ vs51: bool = false,
+ vs52: bool = false,
+ vs53: bool = false,
+ vs54: bool = false,
+ vs55: bool = false,
+ vs56: bool = false,
+ vs57: bool = false,
+ vs58: bool = false,
+ vs59: bool = false,
+ vs60: bool = false,
+ vs61: bool = false,
+ vs62: bool = false,
+ vs63: bool = false,
+
+ f0: bool = false,
+ f1: bool = false,
+ f2: bool = false,
+ f3: bool = false,
+ f4: bool = false,
+ f5: bool = false,
+ f6: bool = false,
+ f7: bool = false,
+ f8: bool = false,
+ f9: bool = false,
+ f10: bool = false,
+ f11: bool = false,
+ f12: bool = false,
+ f13: bool = false,
+ f14: bool = false,
+ f15: bool = false,
+ f16: bool = false,
+ f17: bool = false,
+ f18: bool = false,
+ f19: bool = false,
+ f20: bool = false,
+ f21: bool = false,
+ f22: bool = false,
+ f23: bool = false,
+ f24: bool = false,
+ f25: bool = false,
+ f26: bool = false,
+ f27: bool = false,
+ f28: bool = false,
+ f29: bool = false,
+ f30: bool = false,
+ f31: bool = false,
+
+ v0: bool = false,
+ v1: bool = false,
+ v2: bool = false,
+ v3: bool = false,
+ v4: bool = false,
+ v5: bool = false,
+ v6: bool = false,
+ v7: bool = false,
+ v8: bool = false,
+ v9: bool = false,
+ v10: bool = false,
+ v11: bool = false,
+ v12: bool = false,
+ v13: bool = false,
+ v14: bool = false,
+ v15: bool = false,
+ v16: bool = false,
+ v17: bool = false,
+ v18: bool = false,
+ v19: bool = false,
+ v20: bool = false,
+ v21: bool = false,
+ v22: bool = false,
+ v23: bool = false,
+ v24: bool = false,
+ v25: bool = false,
+ v26: bool = false,
+ v27: bool = false,
+ v28: bool = false,
+ v29: bool = false,
+ v30: bool = false,
+ v31: bool = false,
+
+ acc0: bool = false,
+ acc1: bool = false,
+ acc2: bool = false,
+ acc3: bool = false,
+ acc4: bool = false,
+ acc5: bool = false,
+ acc6: bool = false,
+ acc7: bool = false,
+
+ acc: bool = false,
+ spefsc: bool = false,
+ },
+ .mips, .mipsel, .mips64, .mips64el => packed struct {
+ /// Whether the inline assembly code may perform stores to memory
+ /// addresses other than those derived from input pointer provenance.
+ memory: bool = false,
+
+ lr: bool = false,
+
+ hi: bool = false,
+ lo: bool = false,
+ ac0: bool = false,
+ ac1: bool = false,
+ ac2: bool = false,
+ ac3: bool = false,
+ acx: bool = false,
+
+ r1: bool = false,
+ r2: bool = false,
+ r3: bool = false,
+ r4: bool = false,
+ r5: bool = false,
+ r6: bool = false,
+ r7: bool = false,
+ r8: bool = false,
+ r9: bool = false,
+ r10: bool = false,
+ r11: bool = false,
+ r12: bool = false,
+ r13: bool = false,
+ r14: bool = false,
+ r15: bool = false,
+ r16: bool = false,
+ r17: bool = false,
+ r18: bool = false,
+ r19: bool = false,
+ r20: bool = false,
+ r21: bool = false,
+ r22: bool = false,
+ r23: bool = false,
+ r24: bool = false,
+ r25: bool = false,
+ r26: bool = false,
+ r27: bool = false,
+ r28: bool = false,
+ r29: bool = false,
+ r30: bool = false,
+ r31: bool = false,
+
+ fcsr: bool = false,
+ fcc0: bool = false,
+ fcc1: bool = false,
+ fcc2: bool = false,
+ fcc3: bool = false,
+ fcc4: bool = false,
+ fcc5: bool = false,
+ fcc6: bool = false,
+ fcc7: bool = false,
+
+ w0: bool = false,
+ w1: bool = false,
+ w2: bool = false,
+ w3: bool = false,
+ w4: bool = false,
+ w5: bool = false,
+ w6: bool = false,
+ w7: bool = false,
+ w8: bool = false,
+ w9: bool = false,
+ w10: bool = false,
+ w11: bool = false,
+ w12: bool = false,
+ w13: bool = false,
+ w14: bool = false,
+ w15: bool = false,
+ w16: bool = false,
+ w17: bool = false,
+ w18: bool = false,
+ w19: bool = false,
+ w20: bool = false,
+ w21: bool = false,
+ w22: bool = false,
+ w23: bool = false,
+ w24: bool = false,
+ w25: bool = false,
+ w26: bool = false,
+ w27: bool = false,
+ w28: bool = false,
+ w29: bool = false,
+ w30: bool = false,
+ w31: bool = false,
+
+ f0: bool = false,
+ f1: bool = false,
+ f2: bool = false,
+ f3: bool = false,
+ f4: bool = false,
+ f5: bool = false,
+ f6: bool = false,
+ f7: bool = false,
+ f8: bool = false,
+ f9: bool = false,
+ f10: bool = false,
+ f11: bool = false,
+ f12: bool = false,
+ f13: bool = false,
+ f14: bool = false,
+ f15: bool = false,
+ f16: bool = false,
+ f17: bool = false,
+ f18: bool = false,
+ f19: bool = false,
+ f20: bool = false,
+ f21: bool = false,
+ f22: bool = false,
+ f23: bool = false,
+ f24: bool = false,
+ f25: bool = false,
+ f26: bool = false,
+ f27: bool = false,
+ f28: bool = false,
+ f29: bool = false,
+ f30: bool = false,
+ f31: bool = false,
+
+ mpl0: bool = false,
+ mpl1: bool = false,
+ mpl2: bool = false,
+
+ p0: bool = false,
+ p1: bool = false,
+ p2: bool = false,
+
+ msa_ir: bool = false,
+ msa_csr: bool = false,
+ msa_access: bool = false,
+ msa_save: bool = false,
+ msa_modify: bool = false,
+ msa_request: bool = false,
+ msa_map: bool = false,
+ msa_unmap: bool = false,
+ },
+ else => packed struct {
+ /// Whether the inline assembly code may perform stores to memory
+ /// addresses other than those derived from input pointer provenance.
+ memory: bool = false,
+ },
+};
diff --git a/lib/std/crypto/sha2.zig b/lib/std/crypto/sha2.zig
index 8e74fe7899..335b92896f 100644
--- a/lib/std/crypto/sha2.zig
+++ b/lib/std/crypto/sha2.zig
@@ -235,8 +235,7 @@ fn Sha2x32(comptime iv: Iv32, digest_bits: comptime_int) type {
: [_] "0" (x),
[_] "1" (y),
[w] "w" (w),
- : "v0"
- );
+ : .{ .v0 = true });
}
d.s[0..4].* = x +% @as(V4u32, d.s[0..4].*);
diff --git a/lib/std/debug.zig b/lib/std/debug.zig
index fed06492c1..a453c322d7 100644
--- a/lib/std/debug.zig
+++ b/lib/std/debug.zig
@@ -785,7 +785,7 @@ pub const StackIterator = struct {
"flushw"
else
"ta 3" // ST_FLUSH_WINDOWS
- ::: "memory");
+ ::: .{ .memory = true });
}
return StackIterator{
diff --git a/lib/std/debug/SelfInfo.zig b/lib/std/debug/SelfInfo.zig
index 4f6f7d5130..b267f72d7d 100644
--- a/lib/std/debug/SelfInfo.zig
+++ b/lib/std/debug/SelfInfo.zig
@@ -1547,8 +1547,7 @@ pub inline fn stripInstructionPtrAuthCode(ptr: usize) usize {
\\mov x30, x16
: [ret] "={x15}" (-> usize),
: [ptr] "{x15}" (ptr),
- : "x16"
- );
+ : .{ .x16 = true });
}
return ptr;
diff --git a/lib/std/mem.zig b/lib/std/mem.zig
index c9d0bddc74..33e68eedad 100644
--- a/lib/std/mem.zig
+++ b/lib/std/mem.zig
@@ -4497,8 +4497,7 @@ pub fn doNotOptimizeAway(val: anytype) void {
asm volatile (""
:
: [val] "m" (val),
- : "memory"
- );
+ : .{ .memory = true });
}
},
.array => {
diff --git a/lib/std/os/linux/aarch64.zig b/lib/std/os/linux/aarch64.zig
index cd3d1ab027..2565e8984c 100644
--- a/lib/std/os/linux/aarch64.zig
+++ b/lib/std/os/linux/aarch64.zig
@@ -18,8 +18,7 @@ pub fn syscall0(number: SYS) usize {
return asm volatile ("svc #0"
: [ret] "={x0}" (-> usize),
: [number] "{x8}" (@intFromEnum(number)),
- : "memory", "cc"
- );
+ : .{ .memory = true });
}
pub fn syscall1(number: SYS, arg1: usize) usize {
@@ -27,8 +26,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
: [ret] "={x0}" (-> usize),
: [number] "{x8}" (@intFromEnum(number)),
[arg1] "{x0}" (arg1),
- : "memory", "cc"
- );
+ : .{ .memory = true });
}
pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
@@ -37,8 +35,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
: [number] "{x8}" (@intFromEnum(number)),
[arg1] "{x0}" (arg1),
[arg2] "{x1}" (arg2),
- : "memory", "cc"
- );
+ : .{ .memory = true });
}
pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
@@ -48,8 +45,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
[arg1] "{x0}" (arg1),
[arg2] "{x1}" (arg2),
[arg3] "{x2}" (arg3),
- : "memory", "cc"
- );
+ : .{ .memory = true });
}
pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
@@ -60,8 +56,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
[arg2] "{x1}" (arg2),
[arg3] "{x2}" (arg3),
[arg4] "{x3}" (arg4),
- : "memory", "cc"
- );
+ : .{ .memory = true });
}
pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
@@ -73,8 +68,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
[arg3] "{x2}" (arg3),
[arg4] "{x3}" (arg4),
[arg5] "{x4}" (arg5),
- : "memory", "cc"
- );
+ : .{ .memory = true });
}
pub fn syscall6(
@@ -95,8 +89,7 @@ pub fn syscall6(
[arg4] "{x3}" (arg4),
[arg5] "{x4}" (arg5),
[arg6] "{x5}" (arg6),
- : "memory", "cc"
- );
+ : .{ .memory = true });
}
pub fn clone() callconv(.naked) usize {
@@ -148,14 +141,12 @@ pub fn restore_rt() callconv(.naked) noreturn {
\\ svc #0
:
: [number] "i" (@intFromEnum(SYS.rt_sigreturn)),
- : "memory", "cc"
- ),
+ : .{ .memory = true }),
else => asm volatile (
\\ svc #0
:
: [number] "{x8}" (@intFromEnum(SYS.rt_sigreturn)),
- : "memory", "cc"
- ),
+ : .{ .memory = true }),
}
}
diff --git a/lib/std/os/linux/arm.zig b/lib/std/os/linux/arm.zig
index ec7616fe82..1b9bc913f8 100644
--- a/lib/std/os/linux/arm.zig
+++ b/lib/std/os/linux/arm.zig
@@ -17,8 +17,7 @@ pub fn syscall0(number: SYS) usize {
return asm volatile ("svc #0"
: [ret] "={r0}" (-> usize),
: [number] "{r7}" (@intFromEnum(number)),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall1(number: SYS, arg1: usize) usize {
@@ -26,8 +25,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
: [ret] "={r0}" (-> usize),
: [number] "{r7}" (@intFromEnum(number)),
[arg1] "{r0}" (arg1),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
@@ -36,8 +34,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
: [number] "{r7}" (@intFromEnum(number)),
[arg1] "{r0}" (arg1),
[arg2] "{r1}" (arg2),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
@@ -47,8 +44,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
[arg1] "{r0}" (arg1),
[arg2] "{r1}" (arg2),
[arg3] "{r2}" (arg3),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
@@ -59,8 +55,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
[arg2] "{r1}" (arg2),
[arg3] "{r2}" (arg3),
[arg4] "{r3}" (arg4),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
@@ -72,8 +67,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
[arg3] "{r2}" (arg3),
[arg4] "{r3}" (arg4),
[arg5] "{r4}" (arg5),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall6(
@@ -94,8 +88,7 @@ pub fn syscall6(
[arg4] "{r3}" (arg4),
[arg5] "{r4}" (arg5),
[arg6] "{r5}" (arg6),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn clone() callconv(.naked) usize {
@@ -141,14 +134,12 @@ pub fn restore() callconv(.naked) noreturn {
\\ svc #0
:
: [number] "I" (@intFromEnum(SYS.sigreturn)),
- : "memory"
- ),
+ : .{ .memory = true }),
else => asm volatile (
\\ svc #0
:
: [number] "{r7}" (@intFromEnum(SYS.sigreturn)),
- : "memory"
- ),
+ : .{ .memory = true }),
}
}
@@ -159,14 +150,12 @@ pub fn restore_rt() callconv(.naked) noreturn {
\\ svc #0
:
: [number] "I" (@intFromEnum(SYS.rt_sigreturn)),
- : "memory"
- ),
+ : .{ .memory = true }),
else => asm volatile (
\\ svc #0
:
: [number] "{r7}" (@intFromEnum(SYS.rt_sigreturn)),
- : "memory"
- ),
+ : .{ .memory = true }),
}
}
diff --git a/lib/std/os/linux/hexagon.zig b/lib/std/os/linux/hexagon.zig
index dcc19cd96b..a3acbee50b 100644
--- a/lib/std/os/linux/hexagon.zig
+++ b/lib/std/os/linux/hexagon.zig
@@ -15,8 +15,7 @@ pub fn syscall0(number: SYS) usize {
return asm volatile ("trap0(#1)"
: [ret] "={r0}" (-> usize),
: [number] "{r6}" (@intFromEnum(number)),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall1(number: SYS, arg1: usize) usize {
@@ -24,8 +23,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
: [ret] "={r0}" (-> usize),
: [number] "{r6}" (@intFromEnum(number)),
[arg1] "{r0}" (arg1),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
@@ -34,8 +32,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
: [number] "{r6}" (@intFromEnum(number)),
[arg1] "{r0}" (arg1),
[arg2] "{r1}" (arg2),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
@@ -45,8 +42,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
[arg1] "{r0}" (arg1),
[arg2] "{r1}" (arg2),
[arg3] "{r2}" (arg3),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
@@ -57,8 +53,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
[arg2] "{r1}" (arg2),
[arg3] "{r2}" (arg3),
[arg4] "{r3}" (arg4),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
@@ -70,8 +65,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
[arg3] "{r2}" (arg3),
[arg4] "{r3}" (arg4),
[arg5] "{r4}" (arg5),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall6(
@@ -92,8 +86,7 @@ pub fn syscall6(
[arg4] "{r3}" (arg4),
[arg5] "{r4}" (arg5),
[arg6] "{r5}" (arg6),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn clone() callconv(.naked) usize {
@@ -142,8 +135,7 @@ pub fn restore_rt() callconv(.naked) noreturn {
\\ trap0(#0)
:
: [number] "{r6}" (@intFromEnum(SYS.rt_sigreturn)),
- : "memory"
- );
+ : .{ .memory = true });
}
pub const F = struct {
diff --git a/lib/std/os/linux/loongarch64.zig b/lib/std/os/linux/loongarch64.zig
index 50c4664ac8..617a65d757 100644
--- a/lib/std/os/linux/loongarch64.zig
+++ b/lib/std/os/linux/loongarch64.zig
@@ -17,8 +17,7 @@ pub fn syscall0(number: SYS) usize {
\\ syscall 0
: [ret] "={$r4}" (-> usize),
: [number] "{$r11}" (@intFromEnum(number)),
- : "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8", "memory"
- );
+ : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
}
pub fn syscall1(number: SYS, arg1: usize) usize {
@@ -27,8 +26,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
: [ret] "={$r4}" (-> usize),
: [number] "{$r11}" (@intFromEnum(number)),
[arg1] "{$r4}" (arg1),
- : "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8", "memory"
- );
+ : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
}
pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
@@ -38,8 +36,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
: [number] "{$r11}" (@intFromEnum(number)),
[arg1] "{$r4}" (arg1),
[arg2] "{$r5}" (arg2),
- : "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8", "memory"
- );
+ : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
}
pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
@@ -50,8 +47,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
[arg1] "{$r4}" (arg1),
[arg2] "{$r5}" (arg2),
[arg3] "{$r6}" (arg3),
- : "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8", "memory"
- );
+ : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
}
pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
@@ -63,8 +59,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
[arg2] "{$r5}" (arg2),
[arg3] "{$r6}" (arg3),
[arg4] "{$r7}" (arg4),
- : "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8", "memory"
- );
+ : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
}
pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
@@ -77,8 +72,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
[arg3] "{$r6}" (arg3),
[arg4] "{$r7}" (arg4),
[arg5] "{$r8}" (arg5),
- : "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8", "memory"
- );
+ : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
}
pub fn syscall6(
@@ -100,8 +94,7 @@ pub fn syscall6(
[arg4] "{$r7}" (arg4),
[arg5] "{$r8}" (arg5),
[arg6] "{$r9}" (arg6),
- : "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8", "memory"
- );
+ : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
}
pub fn clone() callconv(.naked) usize {
@@ -150,8 +143,7 @@ pub fn restore_rt() callconv(.naked) noreturn {
\\ syscall 0
:
: [number] "r" (@intFromEnum(SYS.rt_sigreturn)),
- : "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8", "memory"
- );
+ : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
}
pub const msghdr = extern struct {
diff --git a/lib/std/os/linux/m68k.zig b/lib/std/os/linux/m68k.zig
index 0b89c329a8..fde03e3fa9 100644
--- a/lib/std/os/linux/m68k.zig
+++ b/lib/std/os/linux/m68k.zig
@@ -15,8 +15,7 @@ pub fn syscall0(number: SYS) usize {
return asm volatile ("trap #0"
: [ret] "={d0}" (-> usize),
: [number] "{d0}" (@intFromEnum(number)),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall1(number: SYS, arg1: usize) usize {
@@ -24,8 +23,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
: [ret] "={d0}" (-> usize),
: [number] "{d0}" (@intFromEnum(number)),
[arg1] "{d1}" (arg1),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
@@ -34,8 +32,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
: [number] "{d0}" (@intFromEnum(number)),
[arg1] "{d1}" (arg1),
[arg2] "{d2}" (arg2),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
@@ -45,8 +42,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
[arg1] "{d1}" (arg1),
[arg2] "{d2}" (arg2),
[arg3] "{d3}" (arg3),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
@@ -57,8 +53,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
[arg2] "{d2}" (arg2),
[arg3] "{d3}" (arg3),
[arg4] "{d4}" (arg4),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
@@ -70,8 +65,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
[arg3] "{d3}" (arg3),
[arg4] "{d4}" (arg4),
[arg5] "{d5}" (arg5),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall6(
@@ -92,8 +86,7 @@ pub fn syscall6(
[arg4] "{d4}" (arg4),
[arg5] "{d5}" (arg5),
[arg6] "{a0}" (arg6),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn clone() callconv(.naked) usize {
@@ -155,8 +148,7 @@ pub fn restore_rt() callconv(.naked) noreturn {
asm volatile ("trap #0"
:
: [number] "{d0}" (@intFromEnum(SYS.rt_sigreturn)),
- : "memory"
- );
+ : .{ .memory = true });
}
pub const F = struct {
diff --git a/lib/std/os/linux/mips.zig b/lib/std/os/linux/mips.zig
index b12854ea17..d7225eb7b3 100644
--- a/lib/std/os/linux/mips.zig
+++ b/lib/std/os/linux/mips.zig
@@ -21,8 +21,7 @@ pub fn syscall0(number: SYS) usize {
\\ 1:
: [ret] "={$2}" (-> usize),
: [number] "{$2}" (@intFromEnum(number)),
- : "$1", "$3", "$4", "$5", "$6", "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"
- );
+ : .{ .r1 = true, .r3 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
}
pub fn syscall_pipe(fd: *[2]i32) usize {
@@ -41,8 +40,7 @@ pub fn syscall_pipe(fd: *[2]i32) usize {
: [ret] "={$2}" (-> usize),
: [number] "{$2}" (@intFromEnum(SYS.pipe)),
[fd] "{$4}" (fd),
- : "$1", "$3", "$5", "$6", "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"
- );
+ : .{ .r1 = true, .r3 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
}
pub fn syscall1(number: SYS, arg1: usize) usize {
@@ -55,8 +53,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
: [ret] "={$2}" (-> usize),
: [number] "{$2}" (@intFromEnum(number)),
[arg1] "{$4}" (arg1),
- : "$1", "$3", "$5", "$6", "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"
- );
+ : .{ .r1 = true, .r3 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
}
pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
@@ -70,8 +67,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
: [number] "{$2}" (@intFromEnum(number)),
[arg1] "{$4}" (arg1),
[arg2] "{$5}" (arg2),
- : "$1", "$3", "$6", "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"
- );
+ : .{ .r1 = true, .r3 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
}
pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
@@ -86,8 +82,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
[arg1] "{$4}" (arg1),
[arg2] "{$5}" (arg2),
[arg3] "{$6}" (arg3),
- : "$1", "$3", "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"
- );
+ : .{ .r1 = true, .r3 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
}
pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
@@ -103,8 +98,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
[arg2] "{$5}" (arg2),
[arg3] "{$6}" (arg3),
[arg4] "{$7}" (arg4),
- : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"
- );
+ : .{ .r1 = true, .r3 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
}
pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
@@ -125,8 +119,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
[arg3] "{$6}" (arg3),
[arg4] "{$7}" (arg4),
[arg5] "r" (arg5),
- : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"
- );
+ : .{ .r1 = true, .r3 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
}
// NOTE: The o32 calling convention requires the callee to reserve 16 bytes for
@@ -160,8 +153,7 @@ pub fn syscall6(
[arg4] "{$7}" (arg4),
[arg5] "r" (arg5),
[arg6] "r" (arg6),
- : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"
- );
+ : .{ .r1 = true, .r3 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
}
pub fn syscall7(
@@ -195,8 +187,7 @@ pub fn syscall7(
[arg5] "r" (arg5),
[arg6] "r" (arg6),
[arg7] "r" (arg7),
- : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"
- );
+ : .{ .r1 = true, .r3 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
}
pub fn clone() callconv(.naked) usize {
@@ -255,8 +246,7 @@ pub fn restore() callconv(.naked) noreturn {
\\ syscall
:
: [number] "{$2}" (@intFromEnum(SYS.sigreturn)),
- : "$1", "$3", "$4", "$5", "$6", "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"
- );
+ : .{ .r1 = true, .r3 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
}
pub fn restore_rt() callconv(.naked) noreturn {
@@ -264,8 +254,7 @@ pub fn restore_rt() callconv(.naked) noreturn {
\\ syscall
:
: [number] "{$2}" (@intFromEnum(SYS.rt_sigreturn)),
- : "$1", "$3", "$4", "$5", "$6", "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"
- );
+ : .{ .r1 = true, .r3 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
}
pub const F = struct {
diff --git a/lib/std/os/linux/mips64.zig b/lib/std/os/linux/mips64.zig
index 6e47f203a6..db6e5dc1ea 100644
--- a/lib/std/os/linux/mips64.zig
+++ b/lib/std/os/linux/mips64.zig
@@ -21,8 +21,7 @@ pub fn syscall0(number: SYS) usize {
\\ 1:
: [ret] "={$2}" (-> usize),
: [number] "{$2}" (@intFromEnum(number)),
- : "$1", "$3", "$4", "$5", "$6", "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"
- );
+ : .{ .r1 = true, .r3 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
}
pub fn syscall_pipe(fd: *[2]i32) usize {
@@ -41,8 +40,7 @@ pub fn syscall_pipe(fd: *[2]i32) usize {
: [ret] "={$2}" (-> usize),
: [number] "{$2}" (@intFromEnum(SYS.pipe)),
[fd] "{$4}" (fd),
- : "$1", "$3", "$5", "$6", "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"
- );
+ : .{ .r1 = true, .r3 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
}
pub fn syscall1(number: SYS, arg1: usize) usize {
@@ -56,8 +54,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
: [ret] "={$2}" (-> usize),
: [number] "{$2}" (@intFromEnum(number)),
[arg1] "{$4}" (arg1),
- : "$1", "$3", "$5", "$6", "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"
- );
+ : .{ .r1 = true, .r3 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
}
pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
@@ -71,8 +68,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
: [number] "{$2}" (@intFromEnum(number)),
[arg1] "{$4}" (arg1),
[arg2] "{$5}" (arg2),
- : "$1", "$3", "$6", "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"
- );
+ : .{ .r1 = true, .r3 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
}
pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
@@ -87,8 +83,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
[arg1] "{$4}" (arg1),
[arg2] "{$5}" (arg2),
[arg3] "{$6}" (arg3),
- : "$1", "$3", "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"
- );
+ : .{ .r1 = true, .r3 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
}
pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
@@ -104,8 +99,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
[arg2] "{$5}" (arg2),
[arg3] "{$6}" (arg3),
[arg4] "{$7}" (arg4),
- : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"
- );
+ : .{ .r1 = true, .r3 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
}
pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
@@ -122,8 +116,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
[arg3] "{$6}" (arg3),
[arg4] "{$7}" (arg4),
[arg5] "{$8}" (arg5),
- : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"
- );
+ : .{ .r1 = true, .r3 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
}
pub fn syscall6(
@@ -149,8 +142,7 @@ pub fn syscall6(
[arg4] "{$7}" (arg4),
[arg5] "{$8}" (arg5),
[arg6] "{$9}" (arg6),
- : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"
- );
+ : .{ .r1 = true, .r3 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
}
pub fn syscall7(
@@ -178,8 +170,7 @@ pub fn syscall7(
[arg5] "{$8}" (arg5),
[arg6] "{$9}" (arg6),
[arg7] "{$10}" (arg7),
- : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"
- );
+ : .{ .r1 = true, .r3 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
}
pub fn clone() callconv(.naked) usize {
@@ -234,8 +225,7 @@ pub fn restore() callconv(.naked) noreturn {
\\ syscall
:
: [number] "{$2}" (@intFromEnum(SYS.rt_sigreturn)),
- : "$1", "$3", "$4", "$5", "$6", "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"
- );
+ : .{ .r1 = true, .r3 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
}
pub fn restore_rt() callconv(.naked) noreturn {
@@ -243,8 +233,7 @@ pub fn restore_rt() callconv(.naked) noreturn {
\\ syscall
:
: [number] "{$2}" (@intFromEnum(SYS.rt_sigreturn)),
- : "$1", "$3", "$4", "$5", "$6", "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"
- );
+ : .{ .r1 = true, .r3 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r24 = true, .r25 = true, .hi = true, .lo = true, .memory = true });
}
pub const F = struct {
diff --git a/lib/std/os/linux/powerpc.zig b/lib/std/os/linux/powerpc.zig
index 1fe4c8349f..018ea2309c 100644
--- a/lib/std/os/linux/powerpc.zig
+++ b/lib/std/os/linux/powerpc.zig
@@ -22,8 +22,7 @@ pub fn syscall0(number: SYS) usize {
\\ 1:
: [ret] "={r3}" (-> usize),
: [number] "{r0}" (@intFromEnum(number)),
- : "memory", "cr0", "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
- );
+ : .{ .memory = true, .cr0 = true, .r0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });
}
pub fn syscall1(number: SYS, arg1: usize) usize {
@@ -35,8 +34,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
: [ret] "={r3}" (-> usize),
: [number] "{r0}" (@intFromEnum(number)),
[arg1] "{r3}" (arg1),
- : "memory", "cr0", "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
- );
+ : .{ .memory = true, .cr0 = true, .r0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });
}
pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
@@ -49,8 +47,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
: [number] "{r0}" (@intFromEnum(number)),
[arg1] "{r3}" (arg1),
[arg2] "{r4}" (arg2),
- : "memory", "cr0", "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
- );
+ : .{ .memory = true, .cr0 = true, .r0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });
}
pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
@@ -64,8 +61,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
[arg1] "{r3}" (arg1),
[arg2] "{r4}" (arg2),
[arg3] "{r5}" (arg3),
- : "memory", "cr0", "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
- );
+ : .{ .memory = true, .cr0 = true, .r0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });
}
pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
@@ -80,8 +76,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
[arg2] "{r4}" (arg2),
[arg3] "{r5}" (arg3),
[arg4] "{r6}" (arg4),
- : "memory", "cr0", "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
- );
+ : .{ .memory = true, .cr0 = true, .r0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });
}
pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
@@ -97,8 +92,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
[arg3] "{r5}" (arg3),
[arg4] "{r6}" (arg4),
[arg5] "{r7}" (arg5),
- : "memory", "cr0", "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
- );
+ : .{ .memory = true, .cr0 = true, .r0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });
}
pub fn syscall6(
@@ -123,8 +117,7 @@ pub fn syscall6(
[arg4] "{r6}" (arg4),
[arg5] "{r7}" (arg5),
[arg6] "{r8}" (arg6),
- : "memory", "cr0", "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
- );
+ : .{ .memory = true, .cr0 = true, .r0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });
}
pub fn clone() callconv(.naked) usize {
@@ -204,8 +197,7 @@ pub fn restore_rt() callconv(.naked) noreturn {
\\ sc
:
: [number] "{r0}" (@intFromEnum(SYS.rt_sigreturn)),
- : "memory", "cr0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
- );
+ : .{ .memory = true, .cr0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });
}
pub const F = struct {
diff --git a/lib/std/os/linux/powerpc64.zig b/lib/std/os/linux/powerpc64.zig
index 88414b7207..d737738c4c 100644
--- a/lib/std/os/linux/powerpc64.zig
+++ b/lib/std/os/linux/powerpc64.zig
@@ -22,8 +22,7 @@ pub fn syscall0(number: SYS) usize {
\\ 1:
: [ret] "={r3}" (-> usize),
: [number] "{r0}" (@intFromEnum(number)),
- : "memory", "cr0", "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
- );
+ : .{ .memory = true, .cr0 = true, .r0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });
}
pub fn syscall1(number: SYS, arg1: usize) usize {
@@ -35,8 +34,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
: [ret] "={r3}" (-> usize),
: [number] "{r0}" (@intFromEnum(number)),
[arg1] "{r3}" (arg1),
- : "memory", "cr0", "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
- );
+ : .{ .memory = true, .cr0 = true, .r0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });
}
pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
@@ -49,8 +47,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
: [number] "{r0}" (@intFromEnum(number)),
[arg1] "{r3}" (arg1),
[arg2] "{r4}" (arg2),
- : "memory", "cr0", "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
- );
+ : .{ .memory = true, .cr0 = true, .r0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });
}
pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
@@ -64,8 +61,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
[arg1] "{r3}" (arg1),
[arg2] "{r4}" (arg2),
[arg3] "{r5}" (arg3),
- : "memory", "cr0", "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
- );
+ : .{ .memory = true, .cr0 = true, .r0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });
}
pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
@@ -80,8 +76,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
[arg2] "{r4}" (arg2),
[arg3] "{r5}" (arg3),
[arg4] "{r6}" (arg4),
- : "memory", "cr0", "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
- );
+ : .{ .memory = true, .cr0 = true, .r0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });
}
pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
@@ -97,8 +92,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
[arg3] "{r5}" (arg3),
[arg4] "{r6}" (arg4),
[arg5] "{r7}" (arg5),
- : "memory", "cr0", "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
- );
+ : .{ .memory = true, .cr0 = true, .r0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });
}
pub fn syscall6(
@@ -123,8 +117,7 @@ pub fn syscall6(
[arg4] "{r6}" (arg4),
[arg5] "{r7}" (arg5),
[arg6] "{r8}" (arg6),
- : "memory", "cr0", "r0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
- );
+ : .{ .memory = true, .cr0 = true, .r0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });
}
pub fn clone() callconv(.naked) usize {
@@ -189,8 +182,7 @@ pub fn restore_rt() callconv(.naked) noreturn {
\\ sc
:
: [number] "{r0}" (@intFromEnum(SYS.rt_sigreturn)),
- : "memory", "cr0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
- );
+ : .{ .memory = true, .cr0 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r9 = true, .r10 = true, .r11 = true, .r12 = true });
}
pub const F = struct {
diff --git a/lib/std/os/linux/riscv32.zig b/lib/std/os/linux/riscv32.zig
index bbe9fab8f0..31e97743dc 100644
--- a/lib/std/os/linux/riscv32.zig
+++ b/lib/std/os/linux/riscv32.zig
@@ -17,8 +17,7 @@ pub fn syscall0(number: SYS) usize {
return asm volatile ("ecall"
: [ret] "={x10}" (-> usize),
: [number] "{x17}" (@intFromEnum(number)),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall1(number: SYS, arg1: usize) usize {
@@ -26,8 +25,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
: [ret] "={x10}" (-> usize),
: [number] "{x17}" (@intFromEnum(number)),
[arg1] "{x10}" (arg1),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
@@ -36,8 +34,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
: [number] "{x17}" (@intFromEnum(number)),
[arg1] "{x10}" (arg1),
[arg2] "{x11}" (arg2),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
@@ -47,8 +44,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
[arg1] "{x10}" (arg1),
[arg2] "{x11}" (arg2),
[arg3] "{x12}" (arg3),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
@@ -59,8 +55,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
[arg2] "{x11}" (arg2),
[arg3] "{x12}" (arg3),
[arg4] "{x13}" (arg4),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
@@ -72,8 +67,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
[arg3] "{x12}" (arg3),
[arg4] "{x13}" (arg4),
[arg5] "{x14}" (arg5),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall6(
@@ -94,8 +88,7 @@ pub fn syscall6(
[arg4] "{x13}" (arg4),
[arg5] "{x14}" (arg5),
[arg6] "{x15}" (arg6),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn clone() callconv(.naked) usize {
@@ -149,8 +142,7 @@ pub fn restore_rt() callconv(.naked) noreturn {
\\ ecall
:
: [number] "{x17}" (@intFromEnum(SYS.rt_sigreturn)),
- : "memory"
- );
+ : .{ .memory = true });
}
pub const F = struct {
diff --git a/lib/std/os/linux/riscv64.zig b/lib/std/os/linux/riscv64.zig
index 5fea49b8e2..3498fb8fba 100644
--- a/lib/std/os/linux/riscv64.zig
+++ b/lib/std/os/linux/riscv64.zig
@@ -17,8 +17,7 @@ pub fn syscall0(number: SYS) usize {
return asm volatile ("ecall"
: [ret] "={x10}" (-> usize),
: [number] "{x17}" (@intFromEnum(number)),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall1(number: SYS, arg1: usize) usize {
@@ -26,8 +25,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
: [ret] "={x10}" (-> usize),
: [number] "{x17}" (@intFromEnum(number)),
[arg1] "{x10}" (arg1),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
@@ -36,8 +34,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
: [number] "{x17}" (@intFromEnum(number)),
[arg1] "{x10}" (arg1),
[arg2] "{x11}" (arg2),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
@@ -47,8 +44,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
[arg1] "{x10}" (arg1),
[arg2] "{x11}" (arg2),
[arg3] "{x12}" (arg3),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
@@ -59,8 +55,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
[arg2] "{x11}" (arg2),
[arg3] "{x12}" (arg3),
[arg4] "{x13}" (arg4),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
@@ -72,8 +67,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
[arg3] "{x12}" (arg3),
[arg4] "{x13}" (arg4),
[arg5] "{x14}" (arg5),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall6(
@@ -94,8 +88,7 @@ pub fn syscall6(
[arg4] "{x13}" (arg4),
[arg5] "{x14}" (arg5),
[arg6] "{x15}" (arg6),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn clone() callconv(.naked) usize {
@@ -149,8 +142,7 @@ pub fn restore_rt() callconv(.naked) noreturn {
\\ ecall
:
: [number] "{x17}" (@intFromEnum(SYS.rt_sigreturn)),
- : "memory"
- );
+ : .{ .memory = true });
}
pub const F = struct {
diff --git a/lib/std/os/linux/s390x.zig b/lib/std/os/linux/s390x.zig
index 614c33d076..50109aa35f 100644
--- a/lib/std/os/linux/s390x.zig
+++ b/lib/std/os/linux/s390x.zig
@@ -17,8 +17,7 @@ pub fn syscall0(number: SYS) usize {
return asm volatile ("svc 0"
: [ret] "={r2}" (-> usize),
: [number] "{r1}" (@intFromEnum(number)),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall1(number: SYS, arg1: usize) usize {
@@ -26,8 +25,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
: [ret] "={r2}" (-> usize),
: [number] "{r1}" (@intFromEnum(number)),
[arg1] "{r2}" (arg1),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
@@ -36,8 +34,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
: [number] "{r1}" (@intFromEnum(number)),
[arg1] "{r2}" (arg1),
[arg2] "{r3}" (arg2),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
@@ -47,8 +44,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
[arg1] "{r2}" (arg1),
[arg2] "{r3}" (arg2),
[arg3] "{r4}" (arg3),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
@@ -59,8 +55,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
[arg2] "{r3}" (arg2),
[arg3] "{r4}" (arg3),
[arg4] "{r5}" (arg4),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
@@ -72,8 +67,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
[arg3] "{r4}" (arg3),
[arg4] "{r5}" (arg4),
[arg5] "{r6}" (arg5),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall6(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize, arg6: usize) usize {
@@ -86,8 +80,7 @@ pub fn syscall6(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
[arg4] "{r5}" (arg4),
[arg5] "{r6}" (arg5),
[arg6] "{r7}" (arg6),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn clone() callconv(.naked) usize {
@@ -161,8 +154,7 @@ pub fn restore_rt() callconv(.naked) noreturn {
\\svc 0
:
: [number] "{r1}" (@intFromEnum(SYS.rt_sigreturn)),
- : "memory"
- );
+ : .{ .memory = true });
}
pub const F = struct {
diff --git a/lib/std/os/linux/sparc64.zig b/lib/std/os/linux/sparc64.zig
index d34ca92368..1377343888 100644
--- a/lib/std/os/linux/sparc64.zig
+++ b/lib/std/os/linux/sparc64.zig
@@ -32,8 +32,7 @@ pub fn syscall_pipe(fd: *[2]i32) usize {
: [ret] "={o0}" (-> usize),
: [number] "{g1}" (@intFromEnum(SYS.pipe)),
[arg] "r" (fd),
- : "memory", "g3"
- );
+ : .{ .memory = true, .g3 = true });
}
pub fn syscall_fork() usize {
@@ -55,8 +54,7 @@ pub fn syscall_fork() usize {
\\ 2:
: [ret] "={o0}" (-> usize),
: [number] "{g1}" (@intFromEnum(SYS.fork)),
- : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"
- );
+ : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
}
pub fn syscall0(number: SYS) usize {
@@ -68,8 +66,7 @@ pub fn syscall0(number: SYS) usize {
\\ 1:
: [ret] "={o0}" (-> usize),
: [number] "{g1}" (@intFromEnum(number)),
- : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"
- );
+ : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
}
pub fn syscall1(number: SYS, arg1: usize) usize {
@@ -82,8 +79,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
: [ret] "={o0}" (-> usize),
: [number] "{g1}" (@intFromEnum(number)),
[arg1] "{o0}" (arg1),
- : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"
- );
+ : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
}
pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
@@ -97,8 +93,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
: [number] "{g1}" (@intFromEnum(number)),
[arg1] "{o0}" (arg1),
[arg2] "{o1}" (arg2),
- : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"
- );
+ : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
}
pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
@@ -113,8 +108,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
[arg1] "{o0}" (arg1),
[arg2] "{o1}" (arg2),
[arg3] "{o2}" (arg3),
- : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"
- );
+ : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
}
pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
@@ -130,8 +124,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
[arg2] "{o1}" (arg2),
[arg3] "{o2}" (arg3),
[arg4] "{o3}" (arg4),
- : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"
- );
+ : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
}
pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
@@ -148,8 +141,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
[arg3] "{o2}" (arg3),
[arg4] "{o3}" (arg4),
[arg5] "{o4}" (arg5),
- : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"
- );
+ : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
}
pub fn syscall6(
@@ -175,8 +167,7 @@ pub fn syscall6(
[arg4] "{o3}" (arg4),
[arg5] "{o4}" (arg5),
[arg6] "{o5}" (arg6),
- : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"
- );
+ : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
}
pub fn clone() callconv(.naked) usize {
@@ -242,8 +233,7 @@ pub fn restore_rt() callconv(.c) void {
return asm volatile ("t 0x6d"
:
: [number] "{g1}" (@intFromEnum(SYS.rt_sigreturn)),
- : "memory", "xcc", "o0", "o1", "o2", "o3", "o4", "o5", "o7"
- );
+ : .{ .memory = true, .xcc = true, .o0 = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
}
pub const F = struct {
diff --git a/lib/std/os/linux/thumb.zig b/lib/std/os/linux/thumb.zig
index 6816b47c26..5146355d77 100644
--- a/lib/std/os/linux/thumb.zig
+++ b/lib/std/os/linux/thumb.zig
@@ -18,8 +18,7 @@ pub fn syscall0(number: SYS) usize {
\\ ldr r7, [%[tmp], #4]
: [ret] "={r0}" (-> usize),
: [tmp] "{r1}" (&buf),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall1(number: SYS, arg1: usize) usize {
@@ -34,8 +33,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
: [ret] "={r0}" (-> usize),
: [tmp] "{r1}" (&buf),
[arg1] "{r0}" (arg1),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
@@ -51,8 +49,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
: [tmp] "{r2}" (&buf),
[arg1] "{r0}" (arg1),
[arg2] "{r1}" (arg2),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
@@ -69,8 +66,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
[arg1] "{r0}" (arg1),
[arg2] "{r1}" (arg2),
[arg3] "{r2}" (arg3),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
@@ -88,8 +84,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
[arg2] "{r1}" (arg2),
[arg3] "{r2}" (arg3),
[arg4] "{r3}" (arg4),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
@@ -108,8 +103,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
[arg3] "{r2}" (arg3),
[arg4] "{r3}" (arg4),
[arg5] "{r4}" (arg5),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall6(
@@ -137,8 +131,7 @@ pub fn syscall6(
[arg4] "{r3}" (arg4),
[arg5] "{r4}" (arg5),
[arg6] "{r5}" (arg6),
- : "memory"
- );
+ : .{ .memory = true });
}
pub const clone = @import("arm.zig").clone;
@@ -158,6 +151,5 @@ pub fn restore_rt() callconv(.naked) noreturn {
\\ svc #0
:
: [number] "I" (@intFromEnum(SYS.rt_sigreturn)),
- : "memory"
- );
+ : .{ .memory = true });
}
diff --git a/lib/std/os/linux/tls.zig b/lib/std/os/linux/tls.zig
index 3587512e65..4433727d9a 100644
--- a/lib/std/os/linux/tls.zig
+++ b/lib/std/os/linux/tls.zig
@@ -308,8 +308,7 @@ pub fn setThreadPointer(addr: usize) void {
\\ sar %%a0, %%r0
:
: [addr] "r" (addr),
- : "r0"
- );
+ : .{ .r0 = true });
},
.sparc, .sparc64 => {
asm volatile (
diff --git a/lib/std/os/linux/x86.zig b/lib/std/os/linux/x86.zig
index cc3932c899..8a2310ebed 100644
--- a/lib/std/os/linux/x86.zig
+++ b/lib/std/os/linux/x86.zig
@@ -18,8 +18,7 @@ pub fn syscall0(number: SYS) usize {
return asm volatile ("int $0x80"
: [ret] "={eax}" (-> usize),
: [number] "{eax}" (@intFromEnum(number)),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall1(number: SYS, arg1: usize) usize {
@@ -27,8 +26,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
: [ret] "={eax}" (-> usize),
: [number] "{eax}" (@intFromEnum(number)),
[arg1] "{ebx}" (arg1),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
@@ -37,8 +35,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
: [number] "{eax}" (@intFromEnum(number)),
[arg1] "{ebx}" (arg1),
[arg2] "{ecx}" (arg2),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
@@ -48,8 +45,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
[arg1] "{ebx}" (arg1),
[arg2] "{ecx}" (arg2),
[arg3] "{edx}" (arg3),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
@@ -60,8 +56,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
[arg2] "{ecx}" (arg2),
[arg3] "{edx}" (arg3),
[arg4] "{esi}" (arg4),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
@@ -73,8 +68,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
[arg3] "{edx}" (arg3),
[arg4] "{esi}" (arg4),
[arg5] "{edi}" (arg5),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn syscall6(
@@ -108,8 +102,7 @@ pub fn syscall6(
[arg4] "{esi}" (arg4),
[arg5] "rm" (arg5),
[arg6] "rm" (arg6),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn socketcall(call: usize, args: [*]const usize) usize {
@@ -118,8 +111,7 @@ pub fn socketcall(call: usize, args: [*]const usize) usize {
: [number] "{eax}" (@intFromEnum(SYS.socketcall)),
[arg1] "{ebx}" (call),
[arg2] "{ecx}" (@intFromPtr(args)),
- : "memory"
- );
+ : .{ .memory = true });
}
pub fn clone() callconv(.naked) usize {
@@ -179,14 +171,12 @@ pub fn restore() callconv(.naked) noreturn {
\\ int $0x80
:
: [number] "i" (@intFromEnum(SYS.sigreturn)),
- : "memory"
- ),
+ : .{ .memory = true }),
else => asm volatile (
\\ int $0x80
:
: [number] "{eax}" (@intFromEnum(SYS.sigreturn)),
- : "memory"
- ),
+ : .{ .memory = true }),
}
}
@@ -197,14 +187,12 @@ pub fn restore_rt() callconv(.naked) noreturn {
\\ int $0x80
:
: [number] "i" (@intFromEnum(SYS.rt_sigreturn)),
- : "memory"
- ),
+ : .{ .memory = true }),
else => asm volatile (
\\ int $0x80
:
: [number] "{eax}" (@intFromEnum(SYS.rt_sigreturn)),
- : "memory"
- ),
+ : .{ .memory = true }),
}
}
@@ -442,8 +430,7 @@ pub fn getContextInternal() callconv(.naked) usize {
[sigprocmask] "i" (@intFromEnum(linux.SYS.rt_sigprocmask)),
[sigmask_offset] "i" (@offsetOf(ucontext_t, "sigmask")),
[sigset_size] "i" (linux.NSIG / 8),
- : "cc", "memory", "eax", "ecx", "edx"
- );
+ : .{ .cc = true, .memory = true, .eax = true, .ecx = true, .edx = true });
}
pub inline fn getcontext(context: *ucontext_t) usize {
@@ -457,6 +444,5 @@ pub inline fn getcontext(context: *ucontext_t) usize {
[_] "={edx}" (clobber_edx),
: [_] "{edx}" (context),
[getContextInternal] "X" (&getContextInternal),
- : "cc", "memory", "ecx"
- );
+ : .{ .cc = true, .memory = true, .ecx = true });
}
diff --git a/lib/std/os/linux/x86_64.zig b/lib/std/os/linux/x86_64.zig
index bd08c3f147..cf9714dd13 100644
--- a/lib/std/os/linux/x86_64.zig
+++ b/lib/std/os/linux/x86_64.zig
@@ -20,8 +20,7 @@ pub fn syscall0(number: SYS) usize {
return asm volatile ("syscall"
: [ret] "={rax}" (-> usize),
: [number] "{rax}" (@intFromEnum(number)),
- : "rcx", "r11", "memory"
- );
+ : .{ .rcx = true, .r11 = true, .memory = true });
}
pub fn syscall1(number: SYS, arg1: usize) usize {
@@ -29,8 +28,7 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
: [ret] "={rax}" (-> usize),
: [number] "{rax}" (@intFromEnum(number)),
[arg1] "{rdi}" (arg1),
- : "rcx", "r11", "memory"
- );
+ : .{ .rcx = true, .r11 = true, .memory = true });
}
pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
@@ -39,8 +37,7 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
: [number] "{rax}" (@intFromEnum(number)),
[arg1] "{rdi}" (arg1),
[arg2] "{rsi}" (arg2),
- : "rcx", "r11", "memory"
- );
+ : .{ .rcx = true, .r11 = true, .memory = true });
}
pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
@@ -50,8 +47,7 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
[arg1] "{rdi}" (arg1),
[arg2] "{rsi}" (arg2),
[arg3] "{rdx}" (arg3),
- : "rcx", "r11", "memory"
- );
+ : .{ .rcx = true, .r11 = true, .memory = true });
}
pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
@@ -62,8 +58,7 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
[arg2] "{rsi}" (arg2),
[arg3] "{rdx}" (arg3),
[arg4] "{r10}" (arg4),
- : "rcx", "r11", "memory"
- );
+ : .{ .rcx = true, .r11 = true, .memory = true });
}
pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
@@ -75,8 +70,7 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
[arg3] "{rdx}" (arg3),
[arg4] "{r10}" (arg4),
[arg5] "{r8}" (arg5),
- : "rcx", "r11", "memory"
- );
+ : .{ .rcx = true, .r11 = true, .memory = true });
}
pub fn syscall6(
@@ -97,8 +91,7 @@ pub fn syscall6(
[arg4] "{r10}" (arg4),
[arg5] "{r8}" (arg5),
[arg6] "{r9}" (arg6),
- : "rcx", "r11", "memory"
- );
+ : .{ .rcx = true, .r11 = true, .memory = true });
}
pub fn clone() callconv(.naked) usize {
@@ -144,14 +137,12 @@ pub fn restore_rt() callconv(.naked) noreturn {
\\ syscall
:
: [number] "i" (@intFromEnum(SYS.rt_sigreturn)),
- : "rcx", "r11", "memory"
- ),
+ : .{ .rcx = true, .r11 = true, .memory = true }),
else => asm volatile (
\\ syscall
:
: [number] "{rax}" (@intFromEnum(SYS.rt_sigreturn)),
- : "rcx", "r11", "memory"
- ),
+ : .{ .rcx = true, .r11 = true, .memory = true }),
}
}
@@ -440,8 +431,7 @@ fn getContextInternal() callconv(.naked) usize {
[sigprocmask] "i" (@intFromEnum(linux.SYS.rt_sigprocmask)),
[sigmask_offset] "i" (@offsetOf(ucontext_t, "sigmask")),
[sigset_size] "i" (@sizeOf(sigset_t)),
- : "cc", "memory", "rax", "rcx", "rdx", "rdi", "rsi", "r8", "r10", "r11"
- );
+ : .{ .cc = true, .memory = true, .rax = true, .rcx = true, .rdx = true, .rdi = true, .rsi = true, .r8 = true, .r10 = true, .r11 = true });
}
pub inline fn getcontext(context: *ucontext_t) usize {
@@ -455,6 +445,5 @@ pub inline fn getcontext(context: *ucontext_t) usize {
[_] "={rdi}" (clobber_rdi),
: [_] "{rdi}" (context),
[getContextInternal] "X" (&getContextInternal),
- : "cc", "memory", "rcx", "rdx", "rsi", "r8", "r10", "r11"
- );
+ : .{ .cc = true, .memory = true, .rcx = true, .rdx = true, .rsi = true, .r8 = true, .r10 = true, .r11 = true });
}
diff --git a/lib/std/os/plan9/x86_64.zig b/lib/std/os/plan9/x86_64.zig
index ce8d44ff46..b921c079ef 100644
--- a/lib/std/os/plan9/x86_64.zig
+++ b/lib/std/os/plan9/x86_64.zig
@@ -11,8 +11,7 @@ pub fn syscall1(sys: plan9.SYS, arg0: usize) usize {
: [ret] "={rax}" (-> usize),
: [arg0] "{r8}" (arg0),
[syscall_number] "{rbp}" (@intFromEnum(sys)),
- : "rcx", "rax", "rbp", "r11", "memory"
- );
+ : .{ .rcx = true, .rax = true, .rbp = true, .r11 = true, .memory = true });
}
pub fn syscall2(sys: plan9.SYS, arg0: usize, arg1: usize) usize {
return asm volatile (
@@ -27,8 +26,7 @@ pub fn syscall2(sys: plan9.SYS, arg0: usize, arg1: usize) usize {
: [arg0] "{r8}" (arg0),
[arg1] "{r9}" (arg1),
[syscall_number] "{rbp}" (@intFromEnum(sys)),
- : "rcx", "rax", "rbp", "r11", "memory"
- );
+ : .{ .rcx = true, .rax = true, .rbp = true, .r11 = true, .memory = true });
}
pub fn syscall3(sys: plan9.SYS, arg0: usize, arg1: usize, arg2: usize) usize {
return asm volatile (
@@ -46,8 +44,7 @@ pub fn syscall3(sys: plan9.SYS, arg0: usize, arg1: usize, arg2: usize) usize {
[arg1] "{r9}" (arg1),
[arg2] "{r10}" (arg2),
[syscall_number] "{rbp}" (@intFromEnum(sys)),
- : "rcx", "rax", "rbp", "r11", "memory"
- );
+ : .{ .rcx = true, .rax = true, .rbp = true, .r11 = true, .memory = true });
}
pub fn syscall4(sys: plan9.SYS, arg0: usize, arg1: usize, arg2: usize, arg3: usize) usize {
return asm volatile (
@@ -68,6 +65,5 @@ pub fn syscall4(sys: plan9.SYS, arg0: usize, arg1: usize, arg2: usize, arg3: usi
[arg2] "{r10}" (arg2),
[arg3] "{r11}" (arg3),
[syscall_number] "{rbp}" (@intFromEnum(sys)),
- : "rcx", "rax", "rbp", "r11", "memory"
- );
+ : .{ .rcx = true, .rax = true, .rbp = true, .r11 = true, .memory = true });
}
diff --git a/lib/std/pie.zig b/lib/std/pie.zig
index 0f4b4ff4b3..74cc02a635 100644
--- a/lib/std/pie.zig
+++ b/lib/std/pie.zig
@@ -100,8 +100,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {
\\ %[ret] = add(r1, %[ret])
: [ret] "=r" (-> [*]const elf.Dyn),
:
- : "r1"
- ),
+ : .{ .r1 = true }),
.loongarch32, .loongarch64 => asm volatile (
\\ .weak _DYNAMIC
\\ .hidden _DYNAMIC
@@ -127,8 +126,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {
\\ addu %[ret], %[ret], $gp
: [ret] "=r" (-> [*]const elf.Dyn),
:
- : "lr"
- ),
+ : .{ .lr = true }),
.mips64, .mips64el => asm volatile (
\\ .weak _DYNAMIC
\\ .hidden _DYNAMIC
@@ -140,8 +138,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {
\\ daddu %[ret], %[ret], $gp
: [ret] "=r" (-> [*]const elf.Dyn),
:
- : "lr"
- ),
+ : .{ .lr = true }),
.powerpc, .powerpcle => asm volatile (
\\ .weak _DYNAMIC
\\ .hidden _DYNAMIC
@@ -153,8 +150,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {
\\ add %[ret], 4, %[ret]
: [ret] "=r" (-> [*]const elf.Dyn),
:
- : "lr", "r4"
- ),
+ : .{ .lr = true, .r4 = true }),
.powerpc64, .powerpc64le => asm volatile (
\\ .weak _DYNAMIC
\\ .hidden _DYNAMIC
@@ -166,8 +162,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {
\\ add %[ret], 4, %[ret]
: [ret] "=r" (-> [*]const elf.Dyn),
:
- : "lr", "r4"
- ),
+ : .{ .lr = true, .r4 = true }),
.riscv32, .riscv64 => asm volatile (
\\ .weak _DYNAMIC
\\ .hidden _DYNAMIC
diff --git a/lib/std/start.zig b/lib/std/start.zig
index 68311463b0..22ccda1e40 100644
--- a/lib/std/start.zig
+++ b/lib/std/start.zig
@@ -131,32 +131,28 @@ fn exit2(code: usize) noreturn {
:
: [number] "{rax}" (231),
[arg1] "{rdi}" (code),
- : "rcx", "r11", "memory"
- );
+ : .{ .rcx = true, .r11 = true, .memory = true });
},
.arm => {
asm volatile ("svc #0"
:
: [number] "{r7}" (1),
[arg1] "{r0}" (code),
- : "memory"
- );
+ : .{ .memory = true });
},
.aarch64 => {
asm volatile ("svc #0"
:
: [number] "{x8}" (93),
[arg1] "{x0}" (code),
- : "memory", "cc"
- );
+ : .{ .memory = true });
},
.sparc64 => {
asm volatile ("ta 0x6d"
:
: [number] "{g1}" (1),
[arg1] "{o0}" (code),
- : "o0", "o1", "o2", "o3", "o4", "o5", "o6", "o7", "memory"
- );
+ : .{ .o0 = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o6 = true, .o7 = true, .memory = true });
},
else => @compileError("TODO"),
},
diff --git a/lib/std/valgrind.zig b/lib/std/valgrind.zig
index 5447eefc57..f12e0a9a7f 100644
--- a/lib/std/valgrind.zig
+++ b/lib/std/valgrind.zig
@@ -17,8 +17,7 @@ pub fn doClientRequest(default: usize, request: usize, a1: usize, a2: usize, a3:
: [_] "={r3}" (-> usize),
: [_] "{r4}" (args),
[_] "{r3}" (default),
- : "cc", "memory"
- ),
+ : .{ .memory = true }),
.aarch64, .aarch64_be => asm volatile (
\\ ror x12, x12, #3 ; ror x12, x12, #13
\\ ror x12, x12, #51 ; ror x12, x12, #61
@@ -26,8 +25,7 @@ pub fn doClientRequest(default: usize, request: usize, a1: usize, a2: usize, a3:
: [_] "={x3}" (-> usize),
: [_] "{x4}" (args),
[_] "{x3}" (default),
- : "cc", "memory"
- ),
+ : .{ .memory = true }),
.mips, .mipsel => asm volatile (
\\ srl $0, $0, 13
\\ srl $0, $0, 29
@@ -37,8 +35,7 @@ pub fn doClientRequest(default: usize, request: usize, a1: usize, a2: usize, a3:
: [_] "={$11}" (-> usize),
: [_] "{$12}" (args),
[_] "{$11}" (default),
- : "memory"
- ),
+ : .{ .memory = true }),
.mips64, .mips64el => asm volatile (
\\ dsll $0, $0, 3 ; dsll $0, $0, 13
\\ dsll $0, $0, 29 ; dsll $0, $0, 19
@@ -46,8 +43,7 @@ pub fn doClientRequest(default: usize, request: usize, a1: usize, a2: usize, a3:
: [_] "={$11}" (-> usize),
: [_] "{$12}" (args),
[_] "{$11}" (default),
- : "memory"
- ),
+ : .{ .memory = true }),
.powerpc, .powerpcle => asm volatile (
\\ rlwinm 0, 0, 3, 0, 31 ; rlwinm 0, 0, 13, 0, 31
\\ rlwinm 0, 0, 29, 0, 31 ; rlwinm 0, 0, 19, 0, 31
@@ -55,8 +51,7 @@ pub fn doClientRequest(default: usize, request: usize, a1: usize, a2: usize, a3:
: [_] "={r3}" (-> usize),
: [_] "{r4}" (args),
[_] "{r3}" (default),
- : "cc", "memory"
- ),
+ : .{ .memory = true }),
.powerpc64, .powerpc64le => asm volatile (
\\ rotldi 0, 0, 3 ; rotldi 0, 0, 13
\\ rotldi 0, 0, 61 ; rotldi 0, 0, 51
@@ -64,8 +59,7 @@ pub fn doClientRequest(default: usize, request: usize, a1: usize, a2: usize, a3:
: [_] "={r3}" (-> usize),
: [_] "{r4}" (args),
[_] "{r3}" (default),
- : "cc", "memory"
- ),
+ : .{ .memory = true }),
.riscv64 => asm volatile (
\\ .option push
\\ .option norvc
@@ -78,8 +72,7 @@ pub fn doClientRequest(default: usize, request: usize, a1: usize, a2: usize, a3:
: [_] "={a3}" (-> usize),
: [_] "{a4}" (args),
[_] "{a3}" (default),
- : "cc", "memory"
- ),
+ : .{ .memory = true }),
.s390x => asm volatile (
\\ lr %%r15, %%r15
\\ lr %%r1, %%r1
@@ -89,8 +82,7 @@ pub fn doClientRequest(default: usize, request: usize, a1: usize, a2: usize, a3:
: [_] "={r3}" (-> usize),
: [_] "{r2}" (args),
[_] "{r3}" (default),
- : "cc", "memory"
- ),
+ : .{ .memory = true }),
.x86 => asm volatile (
\\ roll $3, %%edi ; roll $13, %%edi
\\ roll $29, %%edi ; roll $19, %%edi
@@ -98,8 +90,7 @@ pub fn doClientRequest(default: usize, request: usize, a1: usize, a2: usize, a3:
: [_] "={edx}" (-> usize),
: [_] "{eax}" (args),
[_] "{edx}" (default),
- : "cc", "memory"
- ),
+ : .{ .memory = true }),
.x86_64 => asm volatile (
\\ rolq $3, %%rdi ; rolq $13, %%rdi
\\ rolq $61, %%rdi ; rolq $51, %%rdi
@@ -107,8 +98,7 @@ pub fn doClientRequest(default: usize, request: usize, a1: usize, a2: usize, a3:
: [_] "={rdx}" (-> usize),
: [_] "{rax}" (args),
[_] "{rdx}" (default),
- : "cc", "memory"
- ),
+ : .{ .memory = true }),
else => default,
};
}
diff --git a/lib/std/zig.zig b/lib/std/zig.zig
index 9bac2b97e2..6a64adc547 100644
--- a/lib/std/zig.zig
+++ b/lib/std/zig.zig
@@ -732,6 +732,7 @@ pub const SimpleComptimeReason = enum(u32) {
generic_call_target,
wasm_memory_index,
work_group_dim_index,
+ clobber,
// Evaluating at comptime because types must be comptime-known.
// Reasons other than `.type` are just more specific messages.
@@ -812,6 +813,7 @@ pub const SimpleComptimeReason = enum(u32) {
.generic_call_target => "generic function being called must be comptime-known",
.wasm_memory_index => "wasm memory index must be comptime-known",
.work_group_dim_index => "work group dimension index must be comptime-known",
+ .clobber => "clobber must be comptime-known",
.type => "types must be comptime-known",
.array_sentinel => "array sentinel value must be comptime-known",
diff --git a/lib/std/zig/Ast.zig b/lib/std/zig/Ast.zig
index 7a3ccf4c64..1b86b103c4 100644
--- a/lib/std/zig/Ast.zig
+++ b/lib/std/zig/Ast.zig
@@ -636,6 +636,7 @@ pub fn firstToken(tree: Ast, node: Node.Index) TokenIndex {
.@"nosuspend",
.asm_simple,
.@"asm",
+ .asm_legacy,
.array_type,
.array_type_sentinel,
.error_value,
@@ -1049,6 +1050,11 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex {
n = @enumFromInt(tree.extra_data[@intFromEnum(members.end) - 1]); // last parameter
}
},
+ .asm_legacy => {
+ _, const extra_index = tree.nodeData(n).node_and_extra;
+ const extra = tree.extraData(extra_index, Node.AsmLegacy);
+ return extra.rparen + end_offset;
+ },
.@"asm" => {
_, const extra_index = tree.nodeData(n).node_and_extra;
const extra = tree.extraData(extra_index, Node.Asm);
@@ -1887,6 +1893,19 @@ pub fn asmSimple(tree: Ast, node: Node.Index) full.Asm {
.template = template,
.items = &.{},
.rparen = rparen,
+ .clobbers = .none,
+ });
+}
+
+pub fn asmLegacy(tree: Ast, node: Node.Index) full.AsmLegacy {
+ const template, const extra_index = tree.nodeData(node).node_and_extra;
+ const extra = tree.extraData(extra_index, Node.AsmLegacy);
+ const items = tree.extraDataSlice(.{ .start = extra.items_start, .end = extra.items_end }, Node.Index);
+ return tree.legacyAsmComponents(.{
+ .asm_token = tree.nodeMainToken(node),
+ .template = template,
+ .items = items,
+ .rparen = extra.rparen,
});
}
@@ -1898,6 +1917,7 @@ pub fn asmFull(tree: Ast, node: Node.Index) full.Asm {
.asm_token = tree.nodeMainToken(node),
.template = template,
.items = items,
+ .clobbers = extra.clobbers,
.rparen = extra.rparen,
});
}
@@ -2194,8 +2214,8 @@ fn fullSwitchCaseComponents(tree: Ast, info: full.SwitchCase.Components, node: N
return result;
}
-fn fullAsmComponents(tree: Ast, info: full.Asm.Components) full.Asm {
- var result: full.Asm = .{
+fn legacyAsmComponents(tree: Ast, info: full.AsmLegacy.Components) full.AsmLegacy {
+ var result: full.AsmLegacy = .{
.ast = info,
.volatile_token = null,
.inputs = &.{},
@@ -2255,6 +2275,29 @@ fn fullAsmComponents(tree: Ast, info: full.Asm.Components) full.Asm {
return result;
}
+fn fullAsmComponents(tree: Ast, info: full.Asm.Components) full.Asm {
+ var result: full.Asm = .{
+ .ast = info,
+ .volatile_token = null,
+ .inputs = &.{},
+ .outputs = &.{},
+ };
+ if (tree.tokenTag(info.asm_token + 1) == .keyword_volatile) {
+ result.volatile_token = info.asm_token + 1;
+ }
+ const outputs_end: usize = for (info.items, 0..) |item, i| {
+ switch (tree.nodeTag(item)) {
+ .asm_output => continue,
+ else => break i,
+ }
+ } else info.items.len;
+
+ result.outputs = info.items[0..outputs_end];
+ result.inputs = info.items[outputs_end..];
+
+ return result;
+}
+
fn fullWhileComponents(tree: Ast, info: full.While.Components) full.While {
var result: full.While = .{
.ast = info,
@@ -2449,6 +2492,14 @@ pub fn fullAsm(tree: Ast, node: Node.Index) ?full.Asm {
};
}
+/// To be deleted after 0.15.0 is tagged
+pub fn legacyAsm(tree: Ast, node: Node.Index) ?full.AsmLegacy {
+ return switch (tree.nodeTag(node)) {
+ .asm_legacy => tree.asmLegacy(node),
+ else => null,
+ };
+}
+
pub fn fullCall(tree: Ast, buffer: *[1]Ast.Node.Index, node: Node.Index) ?full.Call {
return switch (tree.nodeTag(node)) {
.call, .call_comma => tree.callFull(node),
@@ -2829,6 +2880,21 @@ pub const full = struct {
};
pub const Asm = struct {
+ ast: Components,
+ volatile_token: ?TokenIndex,
+ outputs: []const Node.Index,
+ inputs: []const Node.Index,
+
+ pub const Components = struct {
+ asm_token: TokenIndex,
+ template: Node.Index,
+ items: []const Node.Index,
+ clobbers: Node.OptionalIndex,
+ rparen: TokenIndex,
+ };
+ };
+
+ pub const AsmLegacy = struct {
ast: Components,
volatile_token: ?TokenIndex,
first_clobber: ?TokenIndex,
@@ -3835,15 +3901,22 @@ pub const Node = struct {
/// Same as `block` except there is known to be a trailing comma before
/// the final rbrace.
block_semicolon,
- /// `asm(lhs)`.
+ /// `asm(a)`.
///
- /// rhs is a `Token.Index` to the `)` token.
/// The `main_token` field is the `asm` token.
asm_simple,
/// `asm(lhs, a)`.
///
/// The `data` field is a `.node_and_extra`:
/// 1. a `Node.Index` to lhs.
+ /// 2. a `ExtraIndex` to `AsmLegacy`.
+ ///
+ /// The `main_token` field is the `asm` token.
+ asm_legacy,
+ /// `asm(a, b)`.
+ ///
+ /// The `data` field is a `.node_and_extra`:
+ /// 1. a `Node.Index` to a.
/// 2. a `ExtraIndex` to `Asm`.
///
/// The `main_token` field is the `asm` token.
@@ -4016,9 +4089,18 @@ pub const Node = struct {
callconv_expr: OptionalIndex,
};
+ /// To be removed after 0.15.0 is tagged
+ pub const AsmLegacy = struct {
+ items_start: ExtraIndex,
+ items_end: ExtraIndex,
+ /// Needed to make lastToken() work.
+ rparen: TokenIndex,
+ };
+
pub const Asm = struct {
items_start: ExtraIndex,
items_end: ExtraIndex,
+ clobbers: OptionalIndex,
/// Needed to make lastToken() work.
rparen: TokenIndex,
};
diff --git a/lib/std/zig/Ast/Render.zig b/lib/std/zig/Ast/Render.zig
index 8ce3347220..b0c79df263 100644
--- a/lib/std/zig/Ast/Render.zig
+++ b/lib/std/zig/Ast/Render.zig
@@ -855,6 +855,9 @@ fn renderExpression(r: *Render, node: Ast.Node.Index, space: Space) Error!void {
.@"asm",
=> return renderAsm(r, tree.fullAsm(node).?, space),
+ // To be removed after 0.15.0 is tagged
+ .asm_legacy => return renderAsmLegacy(r, tree.legacyAsm(node).?, space),
+
.enum_literal => {
try renderToken(r, tree.nodeMainToken(node) - 1, .none); // .
return renderIdentifier(r, tree.nodeMainToken(node), space, .eagerly_unquote); // name
@@ -2368,9 +2371,9 @@ fn renderContainerDecl(
return renderToken(r, rbrace, space); // rbrace
}
-fn renderAsm(
+fn renderAsmLegacy(
r: *Render,
- asm_node: Ast.full.Asm,
+ asm_node: Ast.full.AsmLegacy,
space: Space,
) Error!void {
const tree = r.tree;
@@ -2396,17 +2399,24 @@ fn renderAsm(
try renderToken(r, first_clobber - 2, .none);
try renderToken(r, first_clobber - 1, .space);
+ try ais.writer().writeAll(".{ ");
+
var tok_i = first_clobber;
while (true) : (tok_i += 1) {
- try renderToken(r, tok_i, .none);
+ try ais.writer().writeByte('.');
+ _ = try writeStringLiteralAsIdentifier(r, tok_i);
+ try ais.writer().writeAll(" = true");
+
tok_i += 1;
switch (tree.tokenTag(tok_i)) {
.r_paren => {
+ try ais.writer().writeAll(" }");
ais.popIndent();
return renderToken(r, tok_i, space);
},
.comma => {
if (tree.tokenTag(tok_i + 1) == .r_paren) {
+ try ais.writer().writeAll(" }");
ais.popIndent();
return renderToken(r, tok_i + 1, space);
} else {
@@ -2417,10 +2427,7 @@ fn renderAsm(
}
}
} else {
- // asm ("foo")
- try renderExpression(r, asm_node.ast.template, .none);
- ais.popIndent();
- return renderToken(r, asm_node.ast.rparen, space); // rparen
+ unreachable;
}
}
@@ -2504,13 +2511,17 @@ fn renderAsm(
};
try renderToken(r, colon3, .space); // :
+ try ais.writer().writeAll(".{ ");
const first_clobber = asm_node.first_clobber.?;
var tok_i = first_clobber;
while (true) {
switch (tree.tokenTag(tok_i + 1)) {
.r_paren => {
ais.setIndentDelta(indent_delta);
- try renderToken(r, tok_i, .newline);
+ try ais.writer().writeByte('.');
+ const lexeme_len = try writeStringLiteralAsIdentifier(r, tok_i);
+ try ais.writer().writeAll(" = true }");
+ try renderSpace(r, tok_i, lexeme_len, .newline);
ais.popIndent();
return renderToken(r, tok_i + 1, space);
},
@@ -2518,12 +2529,17 @@ fn renderAsm(
switch (tree.tokenTag(tok_i + 2)) {
.r_paren => {
ais.setIndentDelta(indent_delta);
- try renderToken(r, tok_i, .newline);
+ try ais.writer().writeByte('.');
+ const lexeme_len = try writeStringLiteralAsIdentifier(r, tok_i);
+ try ais.writer().writeAll(" = true }");
+ try renderSpace(r, tok_i, lexeme_len, .newline);
ais.popIndent();
return renderToken(r, tok_i + 2, space);
},
else => {
- try renderToken(r, tok_i, .none);
+ try ais.writer().writeByte('.');
+ _ = try writeStringLiteralAsIdentifier(r, tok_i);
+ try ais.writer().writeAll(" = true");
try renderToken(r, tok_i + 1, .space);
tok_i += 2;
},
@@ -2534,6 +2550,131 @@ fn renderAsm(
}
}
+fn renderAsm(
+ r: *Render,
+ asm_node: Ast.full.Asm,
+ space: Space,
+) Error!void {
+ const tree = r.tree;
+ const ais = r.ais;
+
+ try renderToken(r, asm_node.ast.asm_token, .space); // asm
+
+ if (asm_node.volatile_token) |volatile_token| {
+ try renderToken(r, volatile_token, .space); // volatile
+ try renderToken(r, volatile_token + 1, .none); // lparen
+ } else {
+ try renderToken(r, asm_node.ast.asm_token + 1, .none); // lparen
+ }
+
+ if (asm_node.ast.items.len == 0) {
+ try ais.forcePushIndent(.normal);
+ if (asm_node.ast.clobbers.unwrap()) |clobbers| {
+ // asm ("foo" ::: clobbers)
+ try renderExpression(r, asm_node.ast.template, .space);
+ // Render the three colons.
+ const first_clobber = tree.firstToken(clobbers);
+ try renderToken(r, first_clobber - 3, .none);
+ try renderToken(r, first_clobber - 2, .none);
+ try renderToken(r, first_clobber - 1, .space);
+ try renderExpression(r, clobbers, .none);
+ ais.popIndent();
+ return renderToken(r, asm_node.ast.rparen, space); // rparen
+ }
+
+ // asm ("foo")
+ try renderExpression(r, asm_node.ast.template, .none);
+ ais.popIndent();
+ return renderToken(r, asm_node.ast.rparen, space); // rparen
+ }
+
+ try ais.forcePushIndent(.normal);
+ try renderExpression(r, asm_node.ast.template, .newline);
+ ais.setIndentDelta(asm_indent_delta);
+ const colon1 = tree.lastToken(asm_node.ast.template) + 1;
+
+ const colon2 = if (asm_node.outputs.len == 0) colon2: {
+ try renderToken(r, colon1, .newline); // :
+ break :colon2 colon1 + 1;
+ } else colon2: {
+ try renderToken(r, colon1, .space); // :
+
+ try ais.forcePushIndent(.normal);
+ for (asm_node.outputs, 0..) |asm_output, i| {
+ if (i + 1 < asm_node.outputs.len) {
+ const next_asm_output = asm_node.outputs[i + 1];
+ try renderAsmOutput(r, asm_output, .none);
+
+ const comma = tree.firstToken(next_asm_output) - 1;
+ try renderToken(r, comma, .newline); // ,
+ try renderExtraNewlineToken(r, tree.firstToken(next_asm_output));
+ } else if (asm_node.inputs.len == 0 and asm_node.ast.clobbers == .none) {
+ try ais.pushSpace(.comma);
+ try renderAsmOutput(r, asm_output, .comma);
+ ais.popSpace();
+ ais.popIndent();
+ ais.setIndentDelta(indent_delta);
+ ais.popIndent();
+ return renderToken(r, asm_node.ast.rparen, space); // rparen
+ } else {
+ try ais.pushSpace(.comma);
+ try renderAsmOutput(r, asm_output, .comma);
+ ais.popSpace();
+ const comma_or_colon = tree.lastToken(asm_output) + 1;
+ ais.popIndent();
+ break :colon2 switch (tree.tokenTag(comma_or_colon)) {
+ .comma => comma_or_colon + 1,
+ else => comma_or_colon,
+ };
+ }
+ } else unreachable;
+ };
+
+ const colon3 = if (asm_node.inputs.len == 0) colon3: {
+ try renderToken(r, colon2, .newline); // :
+ break :colon3 colon2 + 1;
+ } else colon3: {
+ try renderToken(r, colon2, .space); // :
+ try ais.forcePushIndent(.normal);
+ for (asm_node.inputs, 0..) |asm_input, i| {
+ if (i + 1 < asm_node.inputs.len) {
+ const next_asm_input = asm_node.inputs[i + 1];
+ try renderAsmInput(r, asm_input, .none);
+
+ const first_token = tree.firstToken(next_asm_input);
+ try renderToken(r, first_token - 1, .newline); // ,
+ try renderExtraNewlineToken(r, first_token);
+ } else if (asm_node.ast.clobbers == .none) {
+ try ais.pushSpace(.comma);
+ try renderAsmInput(r, asm_input, .comma);
+ ais.popSpace();
+ ais.popIndent();
+ ais.setIndentDelta(indent_delta);
+ ais.popIndent();
+ return renderToken(r, asm_node.ast.rparen, space); // rparen
+ } else {
+ try ais.pushSpace(.comma);
+ try renderAsmInput(r, asm_input, .comma);
+ ais.popSpace();
+ const comma_or_colon = tree.lastToken(asm_input) + 1;
+ ais.popIndent();
+ break :colon3 switch (tree.tokenTag(comma_or_colon)) {
+ .comma => comma_or_colon + 1,
+ else => comma_or_colon,
+ };
+ }
+ }
+ unreachable;
+ };
+
+ try renderToken(r, colon3, .space); // :
+ const clobbers = asm_node.ast.clobbers.unwrap().?;
+ try renderExpression(r, clobbers, .none);
+ ais.setIndentDelta(indent_delta);
+ ais.popIndent();
+ return renderToken(r, asm_node.ast.rparen, space); // rparen
+}
+
fn renderCall(
r: *Render,
call: Ast.full.Call,
@@ -3094,6 +3235,22 @@ fn tokenSliceForRender(tree: Ast, token_index: Ast.TokenIndex) []const u8 {
return ret;
}
+fn writeStringLiteralAsIdentifier(r: *Render, token_index: Ast.TokenIndex) !usize {
+ const tree = r.tree;
+ const ais = r.ais;
+ assert(tree.tokenTag(token_index) == .string_literal);
+ const lexeme = tokenSliceForRender(tree, token_index);
+ const unquoted = lexeme[1..][0 .. lexeme.len - 2];
+ if (std.zig.isValidId(unquoted)) {
+ try ais.writer().writeAll(unquoted);
+ return unquoted.len;
+ } else {
+ try ais.writer().writeByte('@');
+ try ais.writer().writeAll(lexeme);
+ return lexeme.len + 1;
+ }
+}
+
fn hasSameLineComment(tree: Ast, token_index: Ast.TokenIndex) bool {
const between_source = tree.source[tree.tokenStart(token_index)..tree.tokenStart(token_index + 1)];
for (between_source) |byte| switch (byte) {
diff --git a/lib/std/zig/AstGen.zig b/lib/std/zig/AstGen.zig
index 7b3c121baa..52fc41a2c9 100644
--- a/lib/std/zig/AstGen.zig
+++ b/lib/std/zig/AstGen.zig
@@ -505,6 +505,7 @@ fn lvalExpr(gz: *GenZir, scope: *Scope, node: Ast.Node.Index) InnerError!Zir.Ins
.bool_or,
.@"asm",
.asm_simple,
+ .asm_legacy,
.string_literal,
.number_literal,
.call,
@@ -811,6 +812,12 @@ fn expr(gz: *GenZir, scope: *Scope, ri: ResultInfo, node: Ast.Node.Index) InnerE
.@"asm",
=> return asmExpr(gz, scope, ri, node, tree.fullAsm(node).?),
+ .asm_legacy => {
+ return astgen.failNodeNotes(node, "legacy asm clobbers syntax", .{}, &[_]u32{
+ try astgen.errNoteNode(node, "use 'zig fmt' to auto-upgrade", .{}),
+ });
+ },
+
.string_literal => return stringLiteral(gz, ri, node),
.multiline_string_literal => return multilineStringLiteral(gz, ri, node),
@@ -8774,7 +8781,7 @@ fn asmExpr(
if (is_container_asm) {
if (full.volatile_token) |t|
return astgen.failTok(t, "volatile is meaningless on global assembly", .{});
- if (full.outputs.len != 0 or full.inputs.len != 0 or full.first_clobber != null)
+ if (full.outputs.len != 0 or full.inputs.len != 0 or full.ast.clobbers != .none)
return astgen.failNode(node, "global assembly cannot have inputs, outputs, or clobbers", .{});
} else {
if (full.outputs.len == 0 and full.volatile_token == null) {
@@ -8839,32 +8846,12 @@ fn asmExpr(
};
}
- var clobbers_buffer: [63]u32 = undefined;
- var clobber_i: usize = 0;
- if (full.first_clobber) |first_clobber| clobbers: {
- // asm ("foo" ::: "a", "b")
- // asm ("foo" ::: "a", "b",)
- var tok_i = first_clobber;
- while (true) : (tok_i += 1) {
- if (clobber_i >= clobbers_buffer.len) {
- return astgen.failTok(tok_i, "too many asm clobbers", .{});
- }
- clobbers_buffer[clobber_i] = @intFromEnum((try astgen.strLitAsString(tok_i)).index);
- clobber_i += 1;
- tok_i += 1;
- switch (tree.tokenTag(tok_i)) {
- .r_paren => break :clobbers,
- .comma => {
- if (tree.tokenTag(tok_i + 1) == .r_paren) {
- break :clobbers;
- } else {
- continue;
- }
- },
- else => unreachable,
- }
- }
- }
+ const clobbers: Zir.Inst.Ref = if (full.ast.clobbers.unwrap()) |clobbers_node|
+ try comptimeExpr(gz, scope, .{ .rl = .{
+ .coerced_ty = try gz.addBuiltinValue(clobbers_node, .clobbers),
+ } }, clobbers_node, .clobber)
+ else
+ .none;
const result = try gz.addAsm(.{
.tag = tag_and_tmpl.tag,
@@ -8874,7 +8861,7 @@ fn asmExpr(
.output_type_bits = output_type_bits,
.outputs = outputs,
.inputs = inputs,
- .clobbers = clobbers_buffer[0..clobber_i],
+ .clobbers = clobbers,
});
return rvalue(gz, ri, result, node);
}
@@ -10332,6 +10319,7 @@ fn nodeMayEvalToError(tree: *const Ast, start_node: Ast.Node.Index) BuiltinFn.Ev
.@"asm",
.asm_simple,
+ .asm_legacy,
.identifier,
.field_access,
.deref,
@@ -10575,6 +10563,7 @@ fn nodeImpliesMoreThanOnePossibleValue(tree: *const Ast, start_node: Ast.Node.In
.tagged_union_enum_tag_trailing,
.@"asm",
.asm_simple,
+ .asm_legacy,
.add,
.add_wrap,
.add_sat,
@@ -10813,6 +10802,7 @@ fn nodeImpliesComptimeOnly(tree: *const Ast, start_node: Ast.Node.Index) bool {
.tagged_union_enum_tag_trailing,
.@"asm",
.asm_simple,
+ .asm_legacy,
.add,
.add_wrap,
.add_sat,
@@ -12811,7 +12801,7 @@ const GenZir = struct {
is_volatile: bool,
outputs: []const Zir.Inst.Asm.Output,
inputs: []const Zir.Inst.Asm.Input,
- clobbers: []const u32,
+ clobbers: Zir.Inst.Ref,
},
) !Zir.Inst.Ref {
const astgen = gz.astgen;
@@ -12821,13 +12811,13 @@ const GenZir = struct {
try astgen.instructions.ensureUnusedCapacity(gpa, 1);
try astgen.extra.ensureUnusedCapacity(gpa, @typeInfo(Zir.Inst.Asm).@"struct".fields.len +
args.outputs.len * @typeInfo(Zir.Inst.Asm.Output).@"struct".fields.len +
- args.inputs.len * @typeInfo(Zir.Inst.Asm.Input).@"struct".fields.len +
- args.clobbers.len);
+ args.inputs.len * @typeInfo(Zir.Inst.Asm.Input).@"struct".fields.len);
const payload_index = gz.astgen.addExtraAssumeCapacity(Zir.Inst.Asm{
.src_node = gz.nodeIndexToRelative(args.node),
.asm_source = args.asm_source,
.output_type_bits = args.output_type_bits,
+ .clobbers = args.clobbers,
});
for (args.outputs) |output| {
_ = gz.astgen.addExtraAssumeCapacity(output);
@@ -12835,23 +12825,19 @@ const GenZir = struct {
for (args.inputs) |input| {
_ = gz.astgen.addExtraAssumeCapacity(input);
}
- gz.astgen.extra.appendSliceAssumeCapacity(args.clobbers);
- // * 0b00000000_0000XXXX - `outputs_len`.
- // * 0b0000000X_XXXX0000 - `inputs_len`.
- // * 0b0XXXXXX0_00000000 - `clobbers_len`.
- // * 0bX0000000_00000000 - is volatile
- const small: u16 = @as(u16, @as(u4, @intCast(args.outputs.len))) << 0 |
- @as(u16, @as(u5, @intCast(args.inputs.len))) << 4 |
- @as(u16, @as(u6, @intCast(args.clobbers.len))) << 9 |
- @as(u16, @intFromBool(args.is_volatile)) << 15;
+ const small: Zir.Inst.Asm.Small = .{
+ .outputs_len = @intCast(args.outputs.len),
+ .inputs_len = @intCast(args.inputs.len),
+ .is_volatile = args.is_volatile,
+ };
const new_index: Zir.Inst.Index = @enumFromInt(astgen.instructions.len);
astgen.instructions.appendAssumeCapacity(.{
.tag = .extended,
.data = .{ .extended = .{
.opcode = args.tag,
- .small = small,
+ .small = @bitCast(small),
.operand = payload_index,
} },
});
diff --git a/lib/std/zig/AstRlAnnotate.zig b/lib/std/zig/AstRlAnnotate.zig
index 52900224cc..cf0699cc01 100644
--- a/lib/std/zig/AstRlAnnotate.zig
+++ b/lib/std/zig/AstRlAnnotate.zig
@@ -310,6 +310,7 @@ fn expr(astrl: *AstRlAnnotate, node: Ast.Node.Index, block: ?*Block, ri: ResultI
.unreachable_literal,
.asm_simple,
.@"asm",
+ .asm_legacy,
.enum_literal,
.error_value,
.anyframe_literal,
diff --git a/lib/std/zig/Parse.zig b/lib/std/zig/Parse.zig
index fc8b61a403..428442c825 100644
--- a/lib/std/zig/Parse.zig
+++ b/lib/std/zig/Parse.zig
@@ -2801,7 +2801,7 @@ fn expectSwitchSuffix(p: *Parse, main_token: TokenIndex) !Node.Index {
///
/// AsmInput <- COLON AsmInputList AsmClobbers?
///
-/// AsmClobbers <- COLON StringList
+/// AsmClobbers <- COLON Expr
///
/// StringList <- (STRINGLITERAL COMMA)* STRINGLITERAL?
///
@@ -2841,7 +2841,8 @@ fn expectAsmExpr(p: *Parse) !Node.Index {
else => try p.warnExpected(.comma),
}
}
- if (p.eatToken(.colon)) |_| {
+
+ const clobbers: Node.OptionalIndex = if (p.eatToken(.colon)) |_| clobbers: {
while (true) {
const input_item = try p.parseAsmInputItem() orelse break;
try p.scratch.append(p.gpa, input_item);
@@ -2853,7 +2854,11 @@ fn expectAsmExpr(p: *Parse) !Node.Index {
else => try p.warnExpected(.comma),
}
}
- if (p.eatToken(.colon)) |_| {
+
+ _ = p.eatToken(.colon) orelse break :clobbers .none;
+
+ // For automatic upgrades; delete after 0.15.0 released.
+ if (p.tokenTag(p.tok_i) == .string_literal) {
while (p.eatToken(.string_literal)) |_| {
switch (p.tokenTag(p.tok_i)) {
.comma => p.tok_i += 1,
@@ -2862,8 +2867,25 @@ fn expectAsmExpr(p: *Parse) !Node.Index {
else => try p.warnExpected(.comma),
}
}
+ const rparen = try p.expectToken(.r_paren);
+ const span = try p.listToSpan(p.scratch.items[scratch_top..]);
+ return p.addNode(.{
+ .tag = .asm_legacy,
+ .main_token = asm_token,
+ .data = .{ .node_and_extra = .{
+ template,
+ try p.addExtra(Node.AsmLegacy{
+ .items_start = span.start,
+ .items_end = span.end,
+ .rparen = rparen,
+ }),
+ } },
+ });
}
- }
+
+ break :clobbers (try p.expectExpr()).toOptional();
+ } else .none;
+
const rparen = try p.expectToken(.r_paren);
const span = try p.listToSpan(p.scratch.items[scratch_top..]);
return p.addNode(.{
@@ -2874,6 +2896,7 @@ fn expectAsmExpr(p: *Parse) !Node.Index {
try p.addExtra(Node.Asm{
.items_start = span.start,
.items_end = span.end,
+ .clobbers = clobbers,
.rparen = rparen,
}),
} },
diff --git a/lib/std/zig/Zir.zig b/lib/std/zig/Zir.zig
index c53ec630ba..1bb0b9d37f 100644
--- a/lib/std/zig/Zir.zig
+++ b/lib/std/zig/Zir.zig
@@ -1939,11 +1939,6 @@ pub const Inst = struct {
/// `operand` is payload index to `BinNode`.
builtin_extern,
/// Inline assembly.
- /// `small`:
- /// * 0b00000000_000XXXXX - `outputs_len`.
- /// * 0b000000XX_XXX00000 - `inputs_len`.
- /// * 0b0XXXXX00_00000000 - `clobbers_len`.
- /// * 0bX0000000_00000000 - is volatile
/// `operand` is payload index to `Asm`.
@"asm",
/// Same as `asm` except the assembly template is not a string literal but a comptime
@@ -2495,7 +2490,6 @@ pub const Inst = struct {
/// Trailing:
/// 0. Output for every outputs_len
/// 1. Input for every inputs_len
- /// 2. clobber: NullTerminatedString // index into string_bytes (null terminated) for every clobbers_len.
pub const Asm = struct {
src_node: Ast.Node.Offset,
// null-terminated string index
@@ -2505,6 +2499,13 @@ pub const Inst = struct {
/// 0b1 - operand is a type; asm expression has the output as the result.
/// 0b0X is the first output, 0bX0 is the second, etc.
output_type_bits: u32,
+ clobbers: Ref,
+
+ pub const Small = packed struct(u16) {
+ is_volatile: bool,
+ outputs_len: u7,
+ inputs_len: u8,
+ };
pub const Output = struct {
/// index into string_bytes (null terminated)
@@ -3482,6 +3483,7 @@ pub const Inst = struct {
extern_options,
type_info,
branch_hint,
+ clobbers,
// Values
calling_convention_c,
calling_convention_inline,
diff --git a/lib/std/zig/ZonGen.zig b/lib/std/zig/ZonGen.zig
index 6dfb27dbd6..578ac28820 100644
--- a/lib/std/zig/ZonGen.zig
+++ b/lib/std/zig/ZonGen.zig
@@ -238,7 +238,7 @@ fn expr(zg: *ZonGen, node: Ast.Node.Index, dest_node: Zoir.Node.Index) Allocator
=> try zg.addErrorNode(node, "control flow is not allowed in ZON", .{}),
.@"comptime" => try zg.addErrorNode(node, "keyword 'comptime' is not allowed in ZON", .{}),
- .asm_simple, .@"asm" => try zg.addErrorNode(node, "inline asm is not allowed in ZON", .{}),
+ .asm_simple, .@"asm", .asm_legacy => try zg.addErrorNode(node, "inline asm is not allowed in ZON", .{}),
.builtin_call_two,
.builtin_call_two_comma,
diff --git a/lib/std/zig/parser_test.zig b/lib/std/zig/parser_test.zig
index 7c0a80c704..162b7d5fed 100644
--- a/lib/std/zig/parser_test.zig
+++ b/lib/std/zig/parser_test.zig
@@ -32,7 +32,7 @@ test "zig fmt: tuple struct" {
}
test "zig fmt: preserves clobbers in inline asm with stray comma" {
- try testCanonical(
+ try testTransform(
\\fn foo() void {
\\ asm volatile (""
\\ : [_] "" (-> type),
@@ -46,6 +46,20 @@ test "zig fmt: preserves clobbers in inline asm with stray comma" {
\\ );
\\}
\\
+ ,
+ \\fn foo() void {
+ \\ asm volatile (""
+ \\ : [_] "" (-> type),
+ \\ :
+ \\ : .{ .clobber = true }
+ \\ );
+ \\ asm volatile (""
+ \\ :
+ \\ : [_] "" (type),
+ \\ : .{ .clobber = true }
+ \\ );
+ \\}
+ \\
);
}
@@ -64,7 +78,7 @@ test "zig fmt: remove trailing comma at the end of assembly clobber" {
\\ asm volatile (""
\\ : [_] "" (-> type),
\\ :
- \\ : "clobber1", "clobber2"
+ \\ : .{ .clobber1 = true, .clobber2 = true }
\\ );
\\}
\\
@@ -628,7 +642,7 @@ test "zig fmt: builtin call with trailing comma" {
}
test "zig fmt: asm expression with comptime content" {
- try testCanonical(
+ try testTransform(
\\comptime {
\\ asm ("foo" ++ "bar");
\\}
@@ -648,6 +662,26 @@ test "zig fmt: asm expression with comptime content" {
\\ );
\\}
\\
+ ,
+ \\comptime {
+ \\ asm ("foo" ++ "bar");
+ \\}
+ \\pub fn main() void {
+ \\ asm volatile ("foo" ++ "bar");
+ \\ asm volatile ("foo" ++ "bar"
+ \\ : [_] "" (x),
+ \\ );
+ \\ asm volatile ("foo" ++ "bar"
+ \\ : [_] "" (x),
+ \\ : [_] "" (y),
+ \\ );
+ \\ asm volatile ("foo" ++ "bar"
+ \\ : [_] "" (x),
+ \\ : [_] "" (y),
+ \\ : .{ .h = true, .e = true, .l = true, .l = true, .o = true }
+ \\ );
+ \\}
+ \\
);
}
@@ -2182,7 +2216,7 @@ test "zig fmt: simple asm" {
\\ : [a] "x" (-> i32),
\\ : [a] "x" (1),
\\ );
- \\ asm ("still not real assembly" ::: "a", "b");
+ \\ asm ("still not real assembly" ::: .{ .a = true, .b = true });
\\}
\\
);
@@ -3907,7 +3941,7 @@ test "zig fmt: fn type" {
}
test "zig fmt: inline asm" {
- try testCanonical(
+ try testTransform(
\\pub fn syscall1(number: usize, arg1: usize) usize {
\\ return asm volatile ("syscall"
\\ : [ret] "={rax}" (-> usize),
@@ -3917,6 +3951,16 @@ test "zig fmt: inline asm" {
\\ );
\\}
\\
+ ,
+ \\pub fn syscall1(number: usize, arg1: usize) usize {
+ \\ return asm volatile ("syscall"
+ \\ : [ret] "={rax}" (-> usize),
+ \\ : [number] "{rax}" (number),
+ \\ [arg1] "{rdi}" (arg1),
+ \\ : .{ .rcx = true, .r11 = true }
+ \\ );
+ \\}
+ \\
);
}
@@ -3998,7 +4042,7 @@ test "zig fmt: inline asm parameter alignment" {
\\ asm volatile (
\\ \\ foo
\\ \\ bar
- \\ ::: "", "");
+ \\ ::: .{ .a = true, .b = true });
\\ asm volatile (
\\ \\ foo
\\ \\ bar
@@ -4006,8 +4050,7 @@ test "zig fmt: inline asm parameter alignment" {
\\ [_] "" (-> usize),
\\ : [_] "" (0),
\\ [_] "" (0),
- \\ : "", ""
- \\ );
+ \\ : .{});
\\}
\\
);
@@ -5325,7 +5368,7 @@ test "zig fmt: make single-line if no trailing comma, fmt: off" {
\\ asm ("not real assembly"
\\ :[a] "x" (->i32),:[a] "x" (1),);
\\ asm volatile ("still not real assembly"
- \\ :::"a","b",);
+ \\ :::.{.a = true,.b = true,});
\\ }
\\}
);
@@ -5737,7 +5780,7 @@ test "zig fmt: canonicalize symbols (asm)" {
\\ [@"arg1"] "{rdi}" (arg),
\\ [arg2] "{rsi}" (arg),
\\ [arg3] "{rdx}" (arg),
- \\ : "rcx", "r11"
+ \\ : "rcx", "fn"
\\ );
\\
\\ const @"false": usize = 10;
@@ -5759,7 +5802,7 @@ test "zig fmt: canonicalize symbols (asm)" {
\\ [arg1] "{rdi}" (arg),
\\ [arg2] "{rsi}" (arg),
\\ [arg3] "{rdx}" (arg),
- \\ : "rcx", "r11"
+ \\ : .{ .rcx = true, .@"fn" = true }
\\ );
\\
\\ const @"false": usize = 10;
diff --git a/lib/std/zig/system/x86.zig b/lib/std/zig/system/x86.zig
index 75d460400b..1c57b4323a 100644
--- a/lib/std/zig/system/x86.zig
+++ b/lib/std/zig/system/x86.zig
@@ -783,6 +783,5 @@ fn getXCR0() u32 {
\\ xgetbv
: [_] "={eax}" (-> u32),
:
- : "edx", "ecx"
- );
+ : .{ .edx = true, .ecx = true });
}
diff --git a/src/Air.zig b/src/Air.zig
index c9e38415a3..78f52718ab 100644
--- a/src/Air.zig
+++ b/src/Air.zig
@@ -1414,19 +1414,20 @@ pub const ShuffleTwoMask = enum(u32) {
/// terminated string.
/// - name: memory at this position is reinterpreted as a null
/// terminated string. pad to the next u32 after the null byte.
-/// 4. for every clobbers_len
-/// - clobber_name: memory at this position is reinterpreted as a null
-/// terminated string. pad to the next u32 after the null byte.
-/// 5. A number of u32 elements follow according to the equation `(source_len + 3) / 4`.
+/// 4. A number of u32 elements follow according to the equation `(source_len + 3) / 4`.
/// Memory starting at this position is reinterpreted as the source bytes.
pub const Asm = struct {
/// Length of the assembly source in bytes.
source_len: u32,
- outputs_len: u32,
inputs_len: u32,
- /// The MSB is `is_volatile`.
- /// The rest of the bits are `clobbers_len`.
- flags: u32,
+ /// A comptime `std.builtin.assembly.Clobbers` value for the target architecture.
+ clobbers: InternPool.Index,
+ flags: Flags,
+
+ pub const Flags = packed struct(u32) {
+ outputs_len: u31,
+ is_volatile: bool,
+ };
};
pub const Cmpxchg = struct {
@@ -1750,7 +1751,7 @@ pub fn extraData(air: Air, comptime T: type, index: usize) struct { data: T, end
@field(result, field.name) = switch (field.type) {
u32 => air.extra.items[i],
InternPool.Index, Inst.Ref => @enumFromInt(air.extra.items[i]),
- i32, CondBr.BranchHints => @bitCast(air.extra.items[i]),
+ i32, CondBr.BranchHints, Asm.Flags => @bitCast(air.extra.items[i]),
else => @compileError("bad field type: " ++ @typeName(field.type)),
};
i += 1;
diff --git a/src/Air/Liveness.zig b/src/Air/Liveness.zig
index 83d5fd0919..2a039337bd 100644
--- a/src/Air/Liveness.zig
+++ b/src/Air/Liveness.zig
@@ -1209,8 +1209,9 @@ fn analyzeInst(
.assembly => {
const extra = a.air.extraData(Air.Asm, inst_datas[@intFromEnum(inst)].ty_pl.payload);
+ const outputs_len = extra.data.flags.outputs_len;
var extra_i: usize = extra.end;
- const outputs = @as([]const Air.Inst.Ref, @ptrCast(a.air.extra.items[extra_i..][0..extra.data.outputs_len]));
+ const outputs = @as([]const Air.Inst.Ref, @ptrCast(a.air.extra.items[extra_i..][0..outputs_len]));
extra_i += outputs.len;
const inputs = @as([]const Air.Inst.Ref, @ptrCast(a.air.extra.items[extra_i..][0..extra.data.inputs_len]));
extra_i += inputs.len;
diff --git a/src/Air/Liveness/Verify.zig b/src/Air/Liveness/Verify.zig
index b1e13dbf40..a1cce26a64 100644
--- a/src/Air/Liveness/Verify.zig
+++ b/src/Air/Liveness/Verify.zig
@@ -366,16 +366,11 @@ fn verifyBody(self: *Verify, body: []const Air.Inst.Index) Error!void {
.assembly => {
const ty_pl = data[@intFromEnum(inst)].ty_pl;
const extra = self.air.extraData(Air.Asm, ty_pl.payload);
+ const outputs_len = extra.data.flags.outputs_len;
var extra_i = extra.end;
- const outputs = @as(
- []const Air.Inst.Ref,
- @ptrCast(self.air.extra.items[extra_i..][0..extra.data.outputs_len]),
- );
+ const outputs: []const Air.Inst.Ref = @ptrCast(self.air.extra.items[extra_i..][0..outputs_len]);
extra_i += outputs.len;
- const inputs = @as(
- []const Air.Inst.Ref,
- @ptrCast(self.air.extra.items[extra_i..][0..extra.data.inputs_len]),
- );
+ const inputs: []const Air.Inst.Ref = @ptrCast(self.air.extra.items[extra_i..][0..extra.data.inputs_len]);
extra_i += inputs.len;
var bt = self.liveness.iterateBigTomb(inst);
diff --git a/src/Air/print.zig b/src/Air/print.zig
index 8ff199c02f..60e62097c3 100644
--- a/src/Air/print.zig
+++ b/src/Air/print.zig
@@ -1,5 +1,6 @@
const std = @import("std");
const Allocator = std.mem.Allocator;
+const assert = std.debug.assert;
const build_options = @import("build_options");
const Zcu = @import("../Zcu.zig");
@@ -9,7 +10,7 @@ const Air = @import("../Air.zig");
const InternPool = @import("../InternPool.zig");
pub fn write(air: Air, stream: *std.io.Writer, pt: Zcu.PerThread, liveness: ?Air.Liveness) void {
- comptime std.debug.assert(build_options.enable_debug_extensions);
+ comptime assert(build_options.enable_debug_extensions);
const instruction_bytes = air.instructions.len *
// Here we don't use @sizeOf(Air.Inst.Data) because it would include
// the debug safety tag but we want to measure release size.
@@ -59,7 +60,7 @@ pub fn writeInst(
pt: Zcu.PerThread,
liveness: ?Air.Liveness,
) void {
- comptime std.debug.assert(build_options.enable_debug_extensions);
+ comptime assert(build_options.enable_debug_extensions);
var writer: Writer = .{
.pt = pt,
.gpa = pt.zcu.gpa,
@@ -643,8 +644,8 @@ const Writer = struct {
fn writeAssembly(w: *Writer, s: *std.io.Writer, inst: Air.Inst.Index) Error!void {
const ty_pl = w.air.instructions.items(.data)[@intFromEnum(inst)].ty_pl;
const extra = w.air.extraData(Air.Asm, ty_pl.payload);
- const is_volatile = @as(u1, @truncate(extra.data.flags >> 31)) != 0;
- const clobbers_len = @as(u31, @truncate(extra.data.flags));
+ const is_volatile = extra.data.flags.is_volatile;
+ const outputs_len = extra.data.flags.outputs_len;
var extra_i: usize = extra.end;
var op_index: usize = 0;
@@ -655,7 +656,7 @@ const Writer = struct {
try s.writeAll(", volatile");
}
- const outputs = @as([]const Air.Inst.Ref, @ptrCast(w.air.extra.items[extra_i..][0..extra.data.outputs_len]));
+ const outputs = @as([]const Air.Inst.Ref, @ptrCast(w.air.extra.items[extra_i..][0..outputs_len]));
extra_i += outputs.len;
const inputs = @as([]const Air.Inst.Ref, @ptrCast(w.air.extra.items[extra_i..][0..extra.data.inputs_len]));
extra_i += inputs.len;
@@ -695,19 +696,35 @@ const Writer = struct {
try s.writeByte(')');
}
- {
- var clobber_i: u32 = 0;
- while (clobber_i < clobbers_len) : (clobber_i += 1) {
- const extra_bytes = std.mem.sliceAsBytes(w.air.extra.items[extra_i..]);
- const clobber = std.mem.sliceTo(extra_bytes, 0);
- // This equation accounts for the fact that even if we have exactly 4 bytes
- // for the string, we still use the next u32 for the null terminator.
- extra_i += clobber.len / 4 + 1;
-
- try s.writeAll(", ~{");
- try s.writeAll(clobber);
- try s.writeAll("}");
- }
+ const zcu = w.pt.zcu;
+ const ip = &zcu.intern_pool;
+ const aggregate = ip.indexToKey(extra.data.clobbers).aggregate;
+ const struct_type: Type = .fromInterned(aggregate.ty);
+ switch (aggregate.storage) {
+ .elems => |elems| for (elems, 0..) |elem, i| {
+ switch (elem) {
+ .bool_true => {
+ const clobber = struct_type.structFieldName(i, zcu).toSlice(ip).?;
+ assert(clobber.len != 0);
+ try s.writeAll(", ~{");
+ try s.writeAll(clobber);
+ try s.writeAll("}");
+ },
+ .bool_false => continue,
+ else => unreachable,
+ }
+ },
+ .repeated_elem => |elem| {
+ try s.writeAll(", ");
+ try s.writeAll(switch (elem) {
+ .bool_true => "",
+ .bool_false => "",
+ else => unreachable,
+ });
+ },
+ .bytes => |bytes| {
+ try s.print(", {x}", .{bytes});
+ },
}
const asm_source = std.mem.sliceAsBytes(w.air.extra.items[extra_i..])[0..extra.data.source_len];
try s.print(", \"{f}\"", .{std.zig.fmtString(asm_source)});
diff --git a/src/Air/types_resolved.zig b/src/Air/types_resolved.zig
index 2bf1ef108f..44669b82df 100644
--- a/src/Air/types_resolved.zig
+++ b/src/Air/types_resolved.zig
@@ -416,8 +416,9 @@ fn checkBody(air: Air, body: []const Air.Inst.Index, zcu: *Zcu) bool {
if (!checkType(data.ty_pl.ty.toType(), zcu)) return false;
// Luckily, we only care about the inputs and outputs, so we don't have to do
// the whole null-terminated string dance.
- const outputs: []const Air.Inst.Ref = @ptrCast(air.extra.items[extra.end..][0..extra.data.outputs_len]);
- const inputs: []const Air.Inst.Ref = @ptrCast(air.extra.items[extra.end + extra.data.outputs_len ..][0..extra.data.inputs_len]);
+ const outputs_len = extra.data.flags.outputs_len;
+ const outputs: []const Air.Inst.Ref = @ptrCast(air.extra.items[extra.end..][0..outputs_len]);
+ const inputs: []const Air.Inst.Ref = @ptrCast(air.extra.items[extra.end + outputs_len ..][0..extra.data.inputs_len]);
for (outputs) |output| if (output != .none and !checkRef(output, zcu)) return false;
for (inputs) |input| if (input != .none and !checkRef(input, zcu)) return false;
},
diff --git a/src/InternPool.zig b/src/InternPool.zig
index ba5725ec30..c9036da45b 100644
--- a/src/InternPool.zig
+++ b/src/InternPool.zig
@@ -54,6 +54,7 @@ namespace_name_deps: std.AutoArrayHashMapUnmanaged(NamespaceNameKey, DepEntry.In
memoized_state_main_deps: DepEntry.Index.Optional,
memoized_state_panic_deps: DepEntry.Index.Optional,
memoized_state_va_list_deps: DepEntry.Index.Optional,
+memoized_state_assembly_deps: DepEntry.Index.Optional,
/// Given a `Depender`, points to an entry in `dep_entries` whose `depender`
/// matches. The `next_dependee` field can be used to iterate all such entries
@@ -96,6 +97,7 @@ pub const empty: InternPool = .{
.memoized_state_main_deps = .none,
.memoized_state_panic_deps = .none,
.memoized_state_va_list_deps = .none,
+ .memoized_state_assembly_deps = .none,
.first_dependency = .empty,
.dep_entries = .empty,
.free_dep_entries = .empty,
@@ -458,6 +460,8 @@ pub const MemoizedStateStage = enum(u32) {
panic,
/// Specifically `std.builtin.VaList`. See `Zcu.BuiltinDecl.stage`.
va_list,
+ /// Everything within `std.builtin.assembly`. See `Zcu.BuiltinDecl.stage`.
+ assembly,
};
pub const ComptimeUnit = extern struct {
@@ -880,6 +884,7 @@ pub fn dependencyIterator(ip: *const InternPool, dependee: Dependee) DependencyI
.main => ip.memoized_state_main_deps.unwrap(),
.panic => ip.memoized_state_panic_deps.unwrap(),
.va_list => ip.memoized_state_va_list_deps.unwrap(),
+ .assembly => ip.memoized_state_assembly_deps.unwrap(),
},
} orelse return .{
.ip = ip,
@@ -915,6 +920,7 @@ pub fn addDependency(ip: *InternPool, gpa: Allocator, depender: AnalUnit, depend
.main => &ip.memoized_state_main_deps,
.panic => &ip.memoized_state_panic_deps,
.va_list => &ip.memoized_state_va_list_deps,
+ .assembly => &ip.memoized_state_assembly_deps,
};
if (deps.unwrap()) |first| {
diff --git a/src/Sema.zig b/src/Sema.zig
index 6672ba5b36..40ac0f958c 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -16413,10 +16413,10 @@ fn zirAsm(
const extra = sema.code.extraData(Zir.Inst.Asm, extended.operand);
const src = block.nodeOffset(extra.data.src_node);
const ret_ty_src = block.src(.{ .node_offset_asm_ret_ty = extra.data.src_node });
- const outputs_len: u4 = @truncate(extended.small);
- const inputs_len: u5 = @truncate(extended.small >> 4);
- const clobbers_len: u6 = @truncate(extended.small >> 9);
- const is_volatile = @as(u1, @truncate(extended.small >> 15)) != 0;
+ const small: Zir.Inst.Asm.Small = @bitCast(extended.small);
+ const outputs_len = small.outputs_len;
+ const inputs_len = small.inputs_len;
+ const is_volatile = small.is_volatile;
const is_global_assembly = sema.func_index == .none;
const zir_tags = sema.code.instructions.items(.tag);
@@ -16432,7 +16432,7 @@ fn zirAsm(
if (inputs_len != 0) {
return sema.fail(block, src, "module-level assembly does not support inputs", .{});
}
- if (clobbers_len != 0) {
+ if (extra.data.clobbers != .none) {
return sema.fail(block, src, "module-level assembly does not support clobbers", .{});
}
if (is_volatile) {
@@ -16506,15 +16506,11 @@ fn zirAsm(
inputs[arg_i] = .{ .c = constraint, .n = name };
}
- const clobbers = try sema.arena.alloc([]const u8, clobbers_len);
- for (clobbers) |*name| {
- const name_index: Zir.NullTerminatedString = @enumFromInt(sema.code.extra[extra_i]);
- name.* = sema.code.nullTerminatedString(name_index);
- extra_i += 1;
-
- needed_capacity += name.*.len / 4 + 1;
- }
-
+ const clobbers = if (extra.data.clobbers == .none) empty: {
+ const clobbers_ty = try sema.getBuiltinType(src, .@"assembly.Clobbers");
+ break :empty try sema.structInitEmpty(block, clobbers_ty, src, src);
+ } else try sema.resolveInst(extra.data.clobbers); // Already coerced by AstGen.
+ const clobbers_val = try sema.resolveConstDefinedValue(block, src, clobbers, .{ .simple = .clobber });
needed_capacity += (asm_source.len + 3) / 4;
const gpa = sema.gpa;
@@ -16525,9 +16521,12 @@ fn zirAsm(
.ty = expr_ty,
.payload = sema.addExtraAssumeCapacity(Air.Asm{
.source_len = @intCast(asm_source.len),
- .outputs_len = outputs_len,
.inputs_len = @intCast(args.len),
- .flags = (@as(u32, @intFromBool(is_volatile)) << 31) | @as(u32, @intCast(clobbers.len)),
+ .clobbers = clobbers_val.toIntern(),
+ .flags = .{
+ .is_volatile = is_volatile,
+ .outputs_len = outputs_len,
+ },
}),
} },
});
@@ -16549,12 +16548,6 @@ fn zirAsm(
buffer[input.c.len + 1 + input.n.len] = 0;
sema.air_extra.items.len += (input.c.len + input.n.len + (2 + 3)) / 4;
}
- for (clobbers) |clobber| {
- const buffer = mem.sliceAsBytes(sema.air_extra.unusedCapacitySlice());
- @memcpy(buffer[0..clobber.len], clobber);
- buffer[clobber.len] = 0;
- sema.air_extra.items.len += clobber.len / 4 + 1;
- }
{
const buffer = mem.sliceAsBytes(sema.air_extra.unusedCapacitySlice());
@memcpy(buffer[0..asm_source.len], asm_source);
@@ -26197,6 +26190,7 @@ fn zirBuiltinValue(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstD
.extern_options => try sema.getBuiltinType(src, .ExternOptions),
.type_info => try sema.getBuiltinType(src, .Type),
.branch_hint => try sema.getBuiltinType(src, .BranchHint),
+ .clobbers => try sema.getBuiltinType(src, .@"assembly.Clobbers"),
// zig fmt: on
// Values are handled here.
@@ -36546,7 +36540,7 @@ fn payloadToExtraItems(data: anytype) [@typeInfo(@TypeOf(data)).@"struct".fields
inline for (&result, fields) |*val, field| {
val.* = switch (field.type) {
u32 => @field(data, field.name),
- i32, Air.CondBr.BranchHints => @bitCast(@field(data, field.name)),
+ i32, Air.CondBr.BranchHints, Air.Asm.Flags => @bitCast(@field(data, field.name)),
Air.Inst.Ref, InternPool.Index => @intFromEnum(@field(data, field.name)),
else => @compileError("bad field type: " ++ @typeName(field.type)),
};
diff --git a/src/Zcu.zig b/src/Zcu.zig
index b2b0f71e32..897bb6e89e 100644
--- a/src/Zcu.zig
+++ b/src/Zcu.zig
@@ -460,6 +460,9 @@ pub const BuiltinDecl = enum {
VaList,
+ assembly,
+ @"assembly.Clobbers",
+
/// Determines what kind of validation will be done to the decl's value.
pub fn kind(decl: BuiltinDecl) enum { type, func, string } {
return switch (decl) {
@@ -480,6 +483,8 @@ pub const BuiltinDecl = enum {
.ExportOptions,
.ExternOptions,
.BranchHint,
+ .assembly,
+ .@"assembly.Clobbers",
=> .type,
.Type,
@@ -540,6 +545,7 @@ pub const BuiltinDecl = enum {
/// Resolution of these values is done in three distinct stages:
/// * Resolution of `std.builtin.Panic` and everything under it
/// * Resolution of `VaList`
+ /// * Resolution of `assembly`
/// * Everything else
///
/// Panics are separated because they are provided by the user, so must be able to use
@@ -548,14 +554,20 @@ pub const BuiltinDecl = enum {
/// `VaList` is separate because its value depends on the target, so it needs some reflection
/// machinery to work; additionally, it is `@compileError` on some targets, so must be referenced
/// by itself.
+ ///
+ /// `assembly` is separate because its value depends on the target.
pub fn stage(decl: BuiltinDecl) InternPool.MemoizedStateStage {
- if (decl == .VaList) return .va_list;
-
- if (@intFromEnum(decl) <= @intFromEnum(BuiltinDecl.@"Type.Declaration")) {
- return .main;
- } else {
- return .panic;
- }
+ return switch (decl) {
+ .VaList => .va_list,
+ .assembly, .@"assembly.Clobbers" => .assembly,
+ else => {
+ if (@intFromEnum(decl) <= @intFromEnum(BuiltinDecl.@"Type.Declaration")) {
+ return .main;
+ } else {
+ return .panic;
+ }
+ },
+ };
}
/// Based on the tag name, determines how to access this decl; either as a direct child of the
diff --git a/src/Zcu/PerThread.zig b/src/Zcu/PerThread.zig
index 1be84d964f..dc2308add1 100644
--- a/src/Zcu/PerThread.zig
+++ b/src/Zcu/PerThread.zig
@@ -635,6 +635,7 @@ pub fn ensureMemoizedStateUpToDate(pt: Zcu.PerThread, stage: InternPool.Memoized
.main => .Type,
.panic => .panic,
.va_list => .VaList,
+ .assembly => .assembly,
};
if (zcu.builtin_decl_values.get(to_check) != .none) return;
}
diff --git a/src/arch/riscv64/CodeGen.zig b/src/arch/riscv64/CodeGen.zig
index 5aec8a91ab..54777f9866 100644
--- a/src/arch/riscv64/CodeGen.zig
+++ b/src/arch/riscv64/CodeGen.zig
@@ -6048,10 +6048,10 @@ fn airBoolOp(func: *Func, inst: Air.Inst.Index) !void {
fn airAsm(func: *Func, inst: Air.Inst.Index) !void {
const ty_pl = func.air.instructions.items(.data)[@intFromEnum(inst)].ty_pl;
const extra = func.air.extraData(Air.Asm, ty_pl.payload);
- const clobbers_len: u31 = @truncate(extra.data.flags);
+ const outputs_len = extra.data.flags.outputs_len;
var extra_i: usize = extra.end;
const outputs: []const Air.Inst.Ref =
- @ptrCast(func.air.extra.items[extra_i..][0..extra.data.outputs_len]);
+ @ptrCast(func.air.extra.items[extra_i..][0..outputs_len]);
extra_i += outputs.len;
const inputs: []const Air.Inst.Ref = @ptrCast(func.air.extra.items[extra_i..][0..extra.data.inputs_len]);
extra_i += inputs.len;
@@ -6162,21 +6162,33 @@ fn airAsm(func: *Func, inst: Air.Inst.Index) !void {
args.appendAssumeCapacity(arg_mcv);
}
- {
- var clobber_i: u32 = 0;
- while (clobber_i < clobbers_len) : (clobber_i += 1) {
- const clobber = std.mem.sliceTo(std.mem.sliceAsBytes(func.air.extra.items[extra_i..]), 0);
- // This equation accounts for the fact that even if we have exactly 4 bytes
- // for the string, we still use the next u32 for the null terminator.
- extra_i += clobber.len / 4 + 1;
-
- if (std.mem.eql(u8, clobber, "") or std.mem.eql(u8, clobber, "memory")) {
- // nothing really to do
- } else {
- try func.register_manager.getReg(parseRegName(clobber) orelse
- return func.fail("invalid clobber: '{s}'", .{clobber}), null);
+ const zcu = func.pt.zcu;
+ const ip = &zcu.intern_pool;
+ const aggregate = ip.indexToKey(extra.data.clobbers).aggregate;
+ const struct_type: Type = .fromInterned(aggregate.ty);
+ switch (aggregate.storage) {
+ .elems => |elems| for (elems, 0..) |elem, i| {
+ switch (elem) {
+ .bool_true => {
+ const clobber = struct_type.structFieldName(i, zcu).toSlice(ip).?;
+ assert(clobber.len != 0);
+ if (std.mem.eql(u8, clobber, "memory")) {
+ // nothing really to do
+ } else {
+ try func.register_manager.getReg(parseRegName(clobber) orelse
+ return func.fail("invalid clobber: '{s}'", .{clobber}), null);
+ }
+ },
+ .bool_false => continue,
+ else => unreachable,
}
- }
+ },
+ .repeated_elem => |elem| switch (elem) {
+ .bool_true => @panic("TODO"),
+ .bool_false => {},
+ else => unreachable,
+ },
+ .bytes => @panic("TODO"),
}
const Label = struct {
diff --git a/src/arch/sparc64/CodeGen.zig b/src/arch/sparc64/CodeGen.zig
index 9174a5850e..31a7f39d69 100644
--- a/src/arch/sparc64/CodeGen.zig
+++ b/src/arch/sparc64/CodeGen.zig
@@ -873,10 +873,10 @@ fn airArrayToSlice(self: *Self, inst: Air.Inst.Index) !void {
fn airAsm(self: *Self, inst: Air.Inst.Index) !void {
const ty_pl = self.air.instructions.items(.data)[@intFromEnum(inst)].ty_pl;
const extra = self.air.extraData(Air.Asm, ty_pl.payload);
- const is_volatile = (extra.data.flags & 0x80000000) != 0;
- const clobbers_len: u31 = @truncate(extra.data.flags);
+ const is_volatile = extra.data.flags.is_volatile;
+ const outputs_len = extra.data.flags.outputs_len;
var extra_i: usize = extra.end;
- const outputs: []const Air.Inst.Ref = @ptrCast(self.air.extra.items[extra_i .. extra_i + extra.data.outputs_len]);
+ const outputs: []const Air.Inst.Ref = @ptrCast(self.air.extra.items[extra_i .. extra_i + outputs_len]);
extra_i += outputs.len;
const inputs: []const Air.Inst.Ref = @ptrCast(self.air.extra.items[extra_i .. extra_i + extra.data.inputs_len]);
extra_i += inputs.len;
@@ -921,17 +921,8 @@ fn airAsm(self: *Self, inst: Air.Inst.Index) !void {
try self.genSetReg(self.typeOf(input), reg, arg_mcv);
}
- {
- var clobber_i: u32 = 0;
- while (clobber_i < clobbers_len) : (clobber_i += 1) {
- const clobber = std.mem.sliceTo(std.mem.sliceAsBytes(self.air.extra.items[extra_i..]), 0);
- // This equation accounts for the fact that even if we have exactly 4 bytes
- // for the string, we still use the next u32 for the null terminator.
- extra_i += clobber.len / 4 + 1;
-
- // TODO honor these
- }
- }
+ // TODO honor the clobbers
+ _ = extra.data.clobbers;
const asm_source = std.mem.sliceAsBytes(self.air.extra.items[extra_i..])[0..extra.data.source_len];
diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig
index 80542b551f..6341f7e3d2 100644
--- a/src/arch/x86_64/CodeGen.zig
+++ b/src/arch/x86_64/CodeGen.zig
@@ -179788,9 +179788,9 @@ fn airAsm(self: *CodeGen, inst: Air.Inst.Index) !void {
const zcu = pt.zcu;
const ty_pl = self.air.instructions.items(.data)[@intFromEnum(inst)].ty_pl;
const extra = self.air.extraData(Air.Asm, ty_pl.payload);
- const clobbers_len: u31 = @truncate(extra.data.flags);
+ const outputs_len = extra.data.flags.outputs_len;
var extra_i: usize = extra.end;
- const outputs: []const Air.Inst.Ref = @ptrCast(self.air.extra.items[extra_i..][0..extra.data.outputs_len]);
+ const outputs: []const Air.Inst.Ref = @ptrCast(self.air.extra.items[extra_i..][0..outputs_len]);
extra_i += outputs.len;
const inputs: []const Air.Inst.Ref = @ptrCast(self.air.extra.items[extra_i..][0..extra.data.inputs_len]);
extra_i += inputs.len;
@@ -179981,30 +179981,42 @@ fn airAsm(self: *CodeGen, inst: Air.Inst.Index) !void {
args.appendAssumeCapacity(arg_mcv);
}
- {
- var clobber_i: u32 = 0;
- while (clobber_i < clobbers_len) : (clobber_i += 1) {
- const clobber = std.mem.sliceTo(std.mem.sliceAsBytes(self.air.extra.items[extra_i..]), 0);
- // This equation accounts for the fact that even if we have exactly 4 bytes
- // for the string, we still use the next u32 for the null terminator.
- extra_i += clobber.len / 4 + 1;
+ const ip = &zcu.intern_pool;
+ const aggregate = ip.indexToKey(extra.data.clobbers).aggregate;
+ const struct_type: Type = .fromInterned(aggregate.ty);
+ switch (aggregate.storage) {
+ .elems => |elems| for (elems, 0..) |elem, i| switch (elem) {
+ .bool_true => {
+ const clobber = struct_type.structFieldName(i, zcu).toSlice(ip).?;
+ assert(clobber.len != 0);
- if (std.mem.eql(u8, clobber, "") or std.mem.eql(u8, clobber, "memory") or
- std.mem.eql(u8, clobber, "fpsr") or std.mem.eql(u8, clobber, "fpcr") or
- std.mem.eql(u8, clobber, "mxcsr") or std.mem.eql(u8, clobber, "dirflag"))
- {
- // ok, sure
- } else if (std.mem.eql(u8, clobber, "cc") or
- std.mem.eql(u8, clobber, "flags") or
- std.mem.eql(u8, clobber, "eflags") or
- std.mem.eql(u8, clobber, "rflags"))
- {
- try self.spillEflagsIfOccupied();
- } else {
- try self.register_manager.getReg(parseRegName(clobber) orelse
- return self.fail("invalid clobber: '{s}'", .{clobber}), null);
- }
- }
+ if (std.mem.eql(u8, clobber, "memory") or
+ std.mem.eql(u8, clobber, "fpsr") or
+ std.mem.eql(u8, clobber, "fpcr") or
+ std.mem.eql(u8, clobber, "mxcsr") or
+ std.mem.eql(u8, clobber, "dirflag"))
+ {
+ // ok, sure
+ } else if (std.mem.eql(u8, clobber, "cc") or
+ std.mem.eql(u8, clobber, "flags") or
+ std.mem.eql(u8, clobber, "eflags") or
+ std.mem.eql(u8, clobber, "rflags"))
+ {
+ try self.spillEflagsIfOccupied();
+ } else {
+ try self.register_manager.getReg(parseRegName(clobber) orelse
+ return self.fail("invalid clobber: '{s}'", .{clobber}), null);
+ }
+ },
+ .bool_false => continue,
+ else => unreachable,
+ },
+ .repeated_elem => |elem| switch (elem) {
+ .bool_true => @panic("TODO"),
+ .bool_false => {},
+ else => unreachable,
+ },
+ .bytes => @panic("TODO"),
}
const Label = struct {
diff --git a/src/codegen/c.zig b/src/codegen/c.zig
index 61bd5259ae..955a83bc33 100644
--- a/src/codegen/c.zig
+++ b/src/codegen/c.zig
@@ -5545,11 +5545,11 @@ fn airAsm(f: *Function, inst: Air.Inst.Index) !CValue {
const zcu = pt.zcu;
const ty_pl = f.air.instructions.items(.data)[@intFromEnum(inst)].ty_pl;
const extra = f.air.extraData(Air.Asm, ty_pl.payload);
- const is_volatile = @as(u1, @truncate(extra.data.flags >> 31)) != 0;
- const clobbers_len: u31 = @truncate(extra.data.flags);
+ const is_volatile = extra.data.flags.is_volatile;
+ const outputs_len = extra.data.flags.outputs_len;
const gpa = f.object.dg.gpa;
var extra_i: usize = extra.end;
- const outputs: []const Air.Inst.Ref = @ptrCast(f.air.extra.items[extra_i..][0..extra.data.outputs_len]);
+ const outputs: []const Air.Inst.Ref = @ptrCast(f.air.extra.items[extra_i..][0..outputs_len]);
extra_i += outputs.len;
const inputs: []const Air.Inst.Ref = @ptrCast(f.air.extra.items[extra_i..][0..extra.data.inputs_len]);
extra_i += inputs.len;
@@ -5645,12 +5645,6 @@ fn airAsm(f: *Function, inst: Air.Inst.Index) !CValue {
try f.object.newline();
}
}
- for (0..clobbers_len) |_| {
- const clobber = mem.sliceTo(mem.sliceAsBytes(f.air.extra.items[extra_i..]), 0);
- // This equation accounts for the fact that even if we have exactly 4 bytes
- // for the string, we still use the next u32 for the null terminator.
- extra_i += clobber.len / 4 + 1;
- }
{
const asm_source = mem.sliceAsBytes(f.air.extra.items[extra_i..])[0..extra.data.source_len];
@@ -5757,17 +5751,28 @@ fn airAsm(f: *Function, inst: Air.Inst.Index) !CValue {
try w.writeByte(')');
}
try w.writeByte(':');
- for (0..clobbers_len) |clobber_i| {
- const clobber = mem.sliceTo(mem.sliceAsBytes(f.air.extra.items[extra_i..]), 0);
- // This equation accounts for the fact that even if we have exactly 4 bytes
- // for the string, we still use the next u32 for the null terminator.
- extra_i += clobber.len / 4 + 1;
-
- if (clobber.len == 0) continue;
-
- if (clobber_i > 0) try w.writeByte(',');
- try w.print(" {f}", .{fmtStringLiteral(clobber, null)});
+ const ip = &zcu.intern_pool;
+ const aggregate = ip.indexToKey(extra.data.clobbers).aggregate;
+ const struct_type: Type = .fromInterned(aggregate.ty);
+ switch (aggregate.storage) {
+ .elems => |elems| for (elems, 0..) |elem, i| switch (elem) {
+ .bool_true => {
+ const name = struct_type.structFieldName(i, zcu).toSlice(ip).?;
+ assert(name.len != 0);
+ try w.print(" {f}", .{fmtStringLiteral(name, null)});
+ (try w.writableArray(1))[0] = ',';
+ },
+ .bool_false => continue,
+ else => unreachable,
+ },
+ .repeated_elem => |elem| switch (elem) {
+ .bool_true => @panic("TODO"),
+ .bool_false => {},
+ else => unreachable,
+ },
+ .bytes => @panic("TODO"),
}
+ w.undo(1); // erase the last comma
try w.writeAll(");");
try f.object.newline();
diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig
index e726a2bdd3..b3391cfb6a 100644
--- a/src/codegen/llvm.zig
+++ b/src/codegen/llvm.zig
@@ -7241,19 +7241,20 @@ pub const FuncGen = struct {
const o = self.ng.object;
const ty_pl = self.air.instructions.items(.data)[@intFromEnum(inst)].ty_pl;
const extra = self.air.extraData(Air.Asm, ty_pl.payload);
- const is_volatile = @as(u1, @truncate(extra.data.flags >> 31)) != 0;
- const clobbers_len: u31 = @truncate(extra.data.flags);
+ const is_volatile = extra.data.flags.is_volatile;
+ const outputs_len = extra.data.flags.outputs_len;
+ const gpa = self.gpa;
var extra_i: usize = extra.end;
- const outputs: []const Air.Inst.Ref = @ptrCast(self.air.extra.items[extra_i..][0..extra.data.outputs_len]);
+ const outputs: []const Air.Inst.Ref = @ptrCast(self.air.extra.items[extra_i..][0..outputs_len]);
extra_i += outputs.len;
const inputs: []const Air.Inst.Ref = @ptrCast(self.air.extra.items[extra_i..][0..extra.data.inputs_len]);
extra_i += inputs.len;
var llvm_constraints: std.ArrayListUnmanaged(u8) = .empty;
- defer llvm_constraints.deinit(self.gpa);
+ defer llvm_constraints.deinit(gpa);
- var arena_allocator = std.heap.ArenaAllocator.init(self.gpa);
+ var arena_allocator = std.heap.ArenaAllocator.init(gpa);
defer arena_allocator.deinit();
const arena = arena_allocator.allocator();
@@ -7276,7 +7277,7 @@ pub const FuncGen = struct {
var llvm_ret_i: usize = 0;
var llvm_param_i: usize = 0;
- var total_i: u16 = 0;
+ var total_i: usize = 0;
var name_map: std.StringArrayHashMapUnmanaged(u16) = .empty;
try name_map.ensureUnusedCapacity(arena, max_param_count);
@@ -7290,7 +7291,7 @@ pub const FuncGen = struct {
// for the string, we still use the next u32 for the null terminator.
extra_i += (constraint.len + name.len + (2 + 3)) / 4;
- try llvm_constraints.ensureUnusedCapacity(self.gpa, constraint.len + 3);
+ try llvm_constraints.ensureUnusedCapacity(gpa, constraint.len + 3);
if (total_i != 0) {
llvm_constraints.appendAssumeCapacity(',');
}
@@ -7358,7 +7359,7 @@ pub const FuncGen = struct {
if (!std.mem.eql(u8, name, "_")) {
const gop = name_map.getOrPutAssumeCapacity(name);
if (gop.found_existing) return self.todo("duplicate asm output name '{s}'", .{name});
- gop.value_ptr.* = total_i;
+ gop.value_ptr.* = @intCast(total_i);
}
total_i += 1;
}
@@ -7399,7 +7400,7 @@ pub const FuncGen = struct {
}
}
- try llvm_constraints.ensureUnusedCapacity(self.gpa, constraint.len + 1);
+ try llvm_constraints.ensureUnusedCapacity(gpa, constraint.len + 1);
if (total_i != 0) {
llvm_constraints.appendAssumeCapacity(',');
}
@@ -7413,7 +7414,7 @@ pub const FuncGen = struct {
if (!std.mem.eql(u8, name, "_")) {
const gop = name_map.getOrPutAssumeCapacity(name);
if (gop.found_existing) return self.todo("duplicate asm input name '{s}'", .{name});
- gop.value_ptr.* = total_i;
+ gop.value_ptr.* = @intCast(total_i);
}
// In the case of indirect inputs, LLVM requires the callsite to have
@@ -7456,7 +7457,7 @@ pub const FuncGen = struct {
llvm_param_types[llvm_param_i] = llvm_elem_ty;
}
- try llvm_constraints.print(self.gpa, ",{d}", .{output_index});
+ try llvm_constraints.print(gpa, ",{d}", .{output_index});
// In the case of indirect inputs, LLVM requires the callsite to have
// an elementtype() attribute.
@@ -7466,24 +7467,30 @@ pub const FuncGen = struct {
total_i += 1;
}
- {
- var clobber_i: u32 = 0;
- while (clobber_i < clobbers_len) : (clobber_i += 1) {
- const clobber = std.mem.sliceTo(std.mem.sliceAsBytes(self.air.extra.items[extra_i..]), 0);
- // This equation accounts for the fact that even if we have exactly 4 bytes
- // for the string, we still use the next u32 for the null terminator.
- extra_i += clobber.len / 4 + 1;
-
- try llvm_constraints.ensureUnusedCapacity(self.gpa, clobber.len + 4);
- if (total_i != 0) {
- llvm_constraints.appendAssumeCapacity(',');
+ const ip = &zcu.intern_pool;
+ const aggregate = ip.indexToKey(extra.data.clobbers).aggregate;
+ const struct_type: Type = .fromInterned(aggregate.ty);
+ if (total_i != 0) try llvm_constraints.append(gpa, ',');
+ switch (aggregate.storage) {
+ .elems => |elems| for (elems, 0..) |elem, i| {
+ switch (elem) {
+ .bool_true => {
+ const name = struct_type.structFieldName(i, zcu).toSlice(ip).?;
+ total_i += try appendConstraints(gpa, &llvm_constraints, name, target);
+ },
+ .bool_false => continue,
+ else => unreachable,
}
- llvm_constraints.appendSliceAssumeCapacity("~{");
- llvm_constraints.appendSliceAssumeCapacity(clobber);
- llvm_constraints.appendSliceAssumeCapacity("}");
-
- total_i += 1;
- }
+ },
+ .repeated_elem => |elem| switch (elem) {
+ .bool_true => for (0..struct_type.structFieldCount(zcu)) |i| {
+ const name = struct_type.structFieldName(i, zcu).toSlice(ip).?;
+ total_i += try appendConstraints(gpa, &llvm_constraints, name, target);
+ },
+ .bool_false => {},
+ else => unreachable,
+ },
+ .bytes => @panic("TODO"),
}
// We have finished scanning through all inputs/outputs, so the number of
@@ -7497,22 +7504,22 @@ pub const FuncGen = struct {
// to be buggy and regress often.
switch (target.cpu.arch) {
.x86_64, .x86 => {
- if (total_i != 0) try llvm_constraints.append(self.gpa, ',');
- try llvm_constraints.appendSlice(self.gpa, "~{dirflag},~{fpsr},~{flags}");
+ try llvm_constraints.appendSlice(gpa, "~{dirflag},~{fpsr},~{flags},");
total_i += 3;
},
.mips, .mipsel, .mips64, .mips64el => {
- if (total_i != 0) try llvm_constraints.append(self.gpa, ',');
- try llvm_constraints.appendSlice(self.gpa, "~{$1}");
+ try llvm_constraints.appendSlice(gpa, "~{$1},");
total_i += 1;
},
else => {},
}
+ if (std.mem.endsWith(u8, llvm_constraints.items, ",")) llvm_constraints.items.len -= 1;
+
const asm_source = std.mem.sliceAsBytes(self.air.extra.items[extra_i..])[0..extra.data.source_len];
// hackety hacks until stage2 has proper inline asm in the frontend.
- var rendered_template = std.ArrayList(u8).init(self.gpa);
+ var rendered_template = std.ArrayList(u8).init(gpa);
defer rendered_template.deinit();
const State = enum { start, percent, input, modifier };
@@ -13188,3 +13195,257 @@ fn maxIntConst(b: *Builder, max_ty: Type, as_ty: Builder.Type, zcu: *const Zcu)
try res.setTwosCompIntLimit(.max, info.signedness, info.bits);
return b.bigIntConst(as_ty, res.toConst());
}
+
+/// Appends zero or more LLVM constraints to `llvm_constraints`, returning how many were added.
+fn appendConstraints(
+ gpa: Allocator,
+ llvm_constraints: *std.ArrayListUnmanaged(u8),
+ zig_name: []const u8,
+ target: *const std.Target,
+) error{OutOfMemory}!usize {
+ switch (target.cpu.arch) {
+ .mips, .mipsel, .mips64, .mips64el => if (mips_clobber_overrides.get(zig_name)) |llvm_tag| {
+ const llvm_name = @tagName(llvm_tag);
+ try llvm_constraints.ensureUnusedCapacity(gpa, llvm_name.len + 4);
+ llvm_constraints.appendSliceAssumeCapacity("~{");
+ llvm_constraints.appendSliceAssumeCapacity(llvm_name);
+ llvm_constraints.appendSliceAssumeCapacity("},");
+ return 1;
+ },
+ else => {},
+ }
+
+ try llvm_constraints.ensureUnusedCapacity(gpa, zig_name.len + 4);
+ llvm_constraints.appendSliceAssumeCapacity("~{");
+ llvm_constraints.appendSliceAssumeCapacity(zig_name);
+ llvm_constraints.appendSliceAssumeCapacity("},");
+ return 1;
+}
+
+const mips_clobber_overrides = std.StaticStringMap(enum {
+ @"$msair",
+ @"$msacsr",
+ @"$msaaccess",
+ @"$msasave",
+ @"$msamodify",
+ @"$msarequest",
+ @"$msamap",
+ @"$msaunmap",
+ @"$f0",
+ @"$f1",
+ @"$f2",
+ @"$f3",
+ @"$f4",
+ @"$f5",
+ @"$f6",
+ @"$f7",
+ @"$f8",
+ @"$f9",
+ @"$f10",
+ @"$f11",
+ @"$f12",
+ @"$f13",
+ @"$f14",
+ @"$f15",
+ @"$f16",
+ @"$f17",
+ @"$f18",
+ @"$f19",
+ @"$f20",
+ @"$f21",
+ @"$f22",
+ @"$f23",
+ @"$f24",
+ @"$f25",
+ @"$f26",
+ @"$f27",
+ @"$f28",
+ @"$f29",
+ @"$f30",
+ @"$f31",
+ @"$fcc0",
+ @"$fcc1",
+ @"$fcc2",
+ @"$fcc3",
+ @"$fcc4",
+ @"$fcc5",
+ @"$fcc6",
+ @"$fcc7",
+ @"$w0",
+ @"$w1",
+ @"$w2",
+ @"$w3",
+ @"$w4",
+ @"$w5",
+ @"$w6",
+ @"$w7",
+ @"$w8",
+ @"$w9",
+ @"$w10",
+ @"$w11",
+ @"$w12",
+ @"$w13",
+ @"$w14",
+ @"$w15",
+ @"$w16",
+ @"$w17",
+ @"$w18",
+ @"$w19",
+ @"$w20",
+ @"$w21",
+ @"$w22",
+ @"$w23",
+ @"$w24",
+ @"$w25",
+ @"$w26",
+ @"$w27",
+ @"$w28",
+ @"$w29",
+ @"$w30",
+ @"$w31",
+ @"$0",
+ @"$1",
+ @"$2",
+ @"$3",
+ @"$4",
+ @"$5",
+ @"$6",
+ @"$7",
+ @"$8",
+ @"$9",
+ @"$10",
+ @"$11",
+ @"$12",
+ @"$13",
+ @"$14",
+ @"$15",
+ @"$16",
+ @"$17",
+ @"$18",
+ @"$19",
+ @"$20",
+ @"$21",
+ @"$22",
+ @"$23",
+ @"$24",
+ @"$25",
+ @"$26",
+ @"$27",
+ @"$28",
+ @"$29",
+ @"$30",
+ @"$31",
+}).initComptime(.{
+ .{ "msa_ir", .@"$msair" },
+ .{ "msa_csr", .@"$msacsr" },
+ .{ "msa_access", .@"$msaaccess" },
+ .{ "msa_save", .@"$msasave" },
+ .{ "msa_modify", .@"$msamodify" },
+ .{ "msa_request", .@"$msarequest" },
+ .{ "msa_map", .@"$msamap" },
+ .{ "msa_unmap", .@"$msaunmap" },
+ .{ "f0", .@"$f0" },
+ .{ "f1", .@"$f1" },
+ .{ "f2", .@"$f2" },
+ .{ "f3", .@"$f3" },
+ .{ "f4", .@"$f4" },
+ .{ "f5", .@"$f5" },
+ .{ "f6", .@"$f6" },
+ .{ "f7", .@"$f7" },
+ .{ "f8", .@"$f8" },
+ .{ "f9", .@"$f9" },
+ .{ "f10", .@"$f10" },
+ .{ "f11", .@"$f11" },
+ .{ "f12", .@"$f12" },
+ .{ "f13", .@"$f13" },
+ .{ "f14", .@"$f14" },
+ .{ "f15", .@"$f15" },
+ .{ "f16", .@"$f16" },
+ .{ "f17", .@"$f17" },
+ .{ "f18", .@"$f18" },
+ .{ "f19", .@"$f19" },
+ .{ "f20", .@"$f20" },
+ .{ "f21", .@"$f21" },
+ .{ "f22", .@"$f22" },
+ .{ "f23", .@"$f23" },
+ .{ "f24", .@"$f24" },
+ .{ "f25", .@"$f25" },
+ .{ "f26", .@"$f26" },
+ .{ "f27", .@"$f27" },
+ .{ "f28", .@"$f28" },
+ .{ "f29", .@"$f29" },
+ .{ "f30", .@"$f30" },
+ .{ "f31", .@"$f31" },
+ .{ "fcc0", .@"$fcc0" },
+ .{ "fcc1", .@"$fcc1" },
+ .{ "fcc2", .@"$fcc2" },
+ .{ "fcc3", .@"$fcc3" },
+ .{ "fcc4", .@"$fcc4" },
+ .{ "fcc5", .@"$fcc5" },
+ .{ "fcc6", .@"$fcc6" },
+ .{ "fcc7", .@"$fcc7" },
+ .{ "w0", .@"$w0" },
+ .{ "w1", .@"$w1" },
+ .{ "w2", .@"$w2" },
+ .{ "w3", .@"$w3" },
+ .{ "w4", .@"$w4" },
+ .{ "w5", .@"$w5" },
+ .{ "w6", .@"$w6" },
+ .{ "w7", .@"$w7" },
+ .{ "w8", .@"$w8" },
+ .{ "w9", .@"$w9" },
+ .{ "w10", .@"$w10" },
+ .{ "w11", .@"$w11" },
+ .{ "w12", .@"$w12" },
+ .{ "w13", .@"$w13" },
+ .{ "w14", .@"$w14" },
+ .{ "w15", .@"$w15" },
+ .{ "w16", .@"$w16" },
+ .{ "w17", .@"$w17" },
+ .{ "w18", .@"$w18" },
+ .{ "w19", .@"$w19" },
+ .{ "w20", .@"$w20" },
+ .{ "w21", .@"$w21" },
+ .{ "w22", .@"$w22" },
+ .{ "w23", .@"$w23" },
+ .{ "w24", .@"$w24" },
+ .{ "w25", .@"$w25" },
+ .{ "w26", .@"$w26" },
+ .{ "w27", .@"$w27" },
+ .{ "w28", .@"$w28" },
+ .{ "w29", .@"$w29" },
+ .{ "w30", .@"$w30" },
+ .{ "w31", .@"$w31" },
+ .{ "r0", .@"$0" },
+ .{ "r1", .@"$1" },
+ .{ "r2", .@"$2" },
+ .{ "r3", .@"$3" },
+ .{ "r4", .@"$4" },
+ .{ "r5", .@"$5" },
+ .{ "r6", .@"$6" },
+ .{ "r7", .@"$7" },
+ .{ "r8", .@"$8" },
+ .{ "r9", .@"$9" },
+ .{ "r10", .@"$10" },
+ .{ "r11", .@"$11" },
+ .{ "r12", .@"$12" },
+ .{ "r13", .@"$13" },
+ .{ "r14", .@"$14" },
+ .{ "r15", .@"$15" },
+ .{ "r16", .@"$16" },
+ .{ "r17", .@"$17" },
+ .{ "r18", .@"$18" },
+ .{ "r19", .@"$19" },
+ .{ "r20", .@"$20" },
+ .{ "r21", .@"$21" },
+ .{ "r22", .@"$22" },
+ .{ "r23", .@"$23" },
+ .{ "r24", .@"$24" },
+ .{ "r25", .@"$25" },
+ .{ "r26", .@"$26" },
+ .{ "r27", .@"$27" },
+ .{ "r28", .@"$28" },
+ .{ "r29", .@"$29" },
+ .{ "r30", .@"$30" },
+ .{ "r31", .@"$31" },
+});
diff --git a/src/codegen/spirv.zig b/src/codegen/spirv.zig
index 255e957c8b..292f5a62fc 100644
--- a/src/codegen/spirv.zig
+++ b/src/codegen/spirv.zig
@@ -6387,13 +6387,13 @@ const NavGen = struct {
const ty_pl = self.air.instructions.items(.data)[@intFromEnum(inst)].ty_pl;
const extra = self.air.extraData(Air.Asm, ty_pl.payload);
- const is_volatile = @as(u1, @truncate(extra.data.flags >> 31)) != 0;
- const clobbers_len: u31 = @truncate(extra.data.flags);
+ const is_volatile = extra.data.flags.is_volatile;
+ const outputs_len = extra.data.flags.outputs_len;
if (!is_volatile and self.liveness.isUnused(inst)) return null;
var extra_i: usize = extra.end;
- const outputs: []const Air.Inst.Ref = @ptrCast(self.air.extra.items[extra_i..][0..extra.data.outputs_len]);
+ const outputs: []const Air.Inst.Ref = @ptrCast(self.air.extra.items[extra_i..][0..outputs_len]);
extra_i += outputs.len;
const inputs: []const Air.Inst.Ref = @ptrCast(self.air.extra.items[extra_i..][0..extra.data.inputs_len]);
extra_i += inputs.len;
@@ -6402,7 +6402,7 @@ const NavGen = struct {
return self.todo("implement inline asm with more than 1 output", .{});
}
- var as = SpvAssembler{
+ var as: SpvAssembler = .{
.gpa = self.gpa,
.spv = self.spv,
.func = &self.func,
@@ -6486,14 +6486,8 @@ const NavGen = struct {
}
}
- {
- var clobber_i: u32 = 0;
- while (clobber_i < clobbers_len) : (clobber_i += 1) {
- const clobber = std.mem.sliceTo(std.mem.sliceAsBytes(self.air.extra.items[extra_i..]), 0);
- extra_i += clobber.len / 4 + 1;
- // TODO: Record clobber and use it somewhere.
- }
- }
+ // TODO: do something with clobbers
+ _ = extra.data.clobbers;
const asm_source = std.mem.sliceAsBytes(self.air.extra.items[extra_i..])[0..extra.data.source_len];
diff --git a/stage1/zig1.wasm b/stage1/zig1.wasm
index f1c50d438d..b6d4e8ba00 100644
Binary files a/stage1/zig1.wasm and b/stage1/zig1.wasm differ
diff --git a/test/behavior/asm.zig b/test/behavior/asm.zig
index ec4824855b..d79fca930a 100644
--- a/test/behavior/asm.zig
+++ b/test/behavior/asm.zig
@@ -55,13 +55,11 @@ test "output constraint modifiers" {
asm volatile (""
: [_] "=m,r" (a),
:
- : ""
- );
+ : .{});
asm volatile (""
: [_] "=r,m" (a),
:
- : ""
- );
+ : .{});
}
test "alternative constraints" {
@@ -79,7 +77,6 @@ test "alternative constraints" {
asm volatile (""
: [_] "=r,m" (a),
: [_] "r,m" (a),
- : ""
);
}
@@ -96,42 +93,34 @@ test "sized integer/float in asm input" {
asm volatile (""
:
: [_] "m" (@as(usize, 3)),
- : ""
);
asm volatile (""
:
: [_] "m" (@as(i15, -3)),
- : ""
);
asm volatile (""
:
: [_] "m" (@as(u3, 3)),
- : ""
);
asm volatile (""
:
: [_] "m" (@as(i3, 3)),
- : ""
);
asm volatile (""
:
: [_] "m" (@as(u121, 3)),
- : ""
);
asm volatile (""
:
: [_] "m" (@as(i121, 3)),
- : ""
);
asm volatile (""
:
: [_] "m" (@as(f32, 3.17)),
- : ""
);
asm volatile (""
:
: [_] "m" (@as(f64, 3.17)),
- : ""
);
}
@@ -172,8 +161,7 @@ test "rw constraint (x86_64)" {
asm ("addl %[b], %[a]"
: [a] "+r" (res),
: [b] "r" (@as(i32, 13)),
- : "flags"
- );
+ : .{ .flags = true });
try expectEqual(@as(i32, 18), res);
}
diff --git a/test/cases/llvm/f_segment_address_space_reading_and_writing.zig b/test/cases/llvm/f_segment_address_space_reading_and_writing.zig
index adf0a4da4d..73c08ec1a7 100644
--- a/test/cases/llvm/f_segment_address_space_reading_and_writing.zig
+++ b/test/cases/llvm/f_segment_address_space_reading_and_writing.zig
@@ -9,7 +9,7 @@ fn setFs(value: c_ulong) void {
: [number] "{rax}" (158),
[code] "{rdi}" (0x1002),
[val] "{rsi}" (value),
- : "rcx", "r11", "memory"
+ : .{ .rcx = true, .r11 = true, .memory = true }
);
}
@@ -21,7 +21,7 @@ fn getFs() c_ulong {
: [number] "{rax}" (158),
[code] "{rdi}" (0x1003),
[ptr] "{rsi}" (@intFromPtr(&result)),
- : "rcx", "r11", "memory"
+ : .{ .rcx = true, .r11 = true, .memory = true }
);
return result;
}
diff --git a/test/standalone/build.zig b/test/standalone/build.zig
index 48956d01f2..cf08c9b182 100644
--- a/test/standalone/build.zig
+++ b/test/standalone/build.zig
@@ -38,20 +38,38 @@ pub fn build(b: *std.Build) void {
"../../tools/gen_spirv_spec.zig",
"../../tools/gen_stubs.zig",
"../../tools/generate_c_size_and_align_checks.zig",
+ "../../tools/generate_JSONTestSuite.zig",
"../../tools/generate_linux_syscalls.zig",
"../../tools/process_headers.zig",
+ "../../tools/migrate_langref.zig",
"../../tools/update-linux-headers.zig",
"../../tools/update_clang_options.zig",
"../../tools/update_cpu_features.zig",
+ "../../tools/update_crc_catalog.zig",
"../../tools/update_freebsd_libc.zig",
"../../tools/update_glibc.zig",
+ "../../tools/update_mingw.zig",
"../../tools/update_netbsd_libc.zig",
+ }) |tool_src_path| {
+ if (std.mem.endsWith(u8, tool_src_path, "dump-cov.zig") and tools_target.result.os.tag == .windows) continue;
+
+ const tool = b.addExecutable(.{
+ .name = std.fs.path.stem(tool_src_path),
+ .root_module = b.createModule(.{
+ .root_source_file = b.path(tool_src_path),
+ .target = tools_target,
+ }),
+ });
+ tools_tests_step.dependOn(&tool.step);
+ }
+ for ([_][]const u8{
+ // Alphabetically sorted. Only ones with `test` blocks.
+ "../../tools/doctest.zig",
}) |tool_src_path| {
const tool = b.addTest(.{
.name = std.fs.path.stem(tool_src_path),
.root_module = b.createModule(.{
.root_source_file = b.path(tool_src_path),
- .optimize = .Debug,
.target = tools_target,
}),
});
diff --git a/test/standalone/stack_iterator/unwind.zig b/test/standalone/stack_iterator/unwind.zig
index c8ad8e120f..aaaefbddbb 100644
--- a/test/standalone/stack_iterator/unwind.zig
+++ b/test/standalone/stack_iterator/unwind.zig
@@ -31,7 +31,7 @@ noinline fn frame2(expected: *[4]usize, unwound: *[4]usize) void {
\\movl $7, %%edi
\\movl $6, %%esi
\\movl $5, %%ebp
- ::: "ebx", "ecx", "edx", "edi", "esi", "ebp");
+ ::: .{ .ebx = true, .ecx = true, .edx = true, .edi = true, .esi = true, .ebp = true });
} else {
asm volatile (
\\movl $3, %%ebx
@@ -39,7 +39,7 @@ noinline fn frame2(expected: *[4]usize, unwound: *[4]usize) void {
\\movl $2, %%edx
\\movl $7, %%edi
\\movl $6, %%esi
- ::: "ebx", "ecx", "edx", "edi", "esi");
+ ::: .{ .ebx = true, .ecx = true, .edx = true, .edi = true, .esi = true });
}
},
.x86_64 => {
@@ -51,7 +51,7 @@ noinline fn frame2(expected: *[4]usize, unwound: *[4]usize) void {
\\movq $14, %%r14
\\movq $15, %%r15
\\movq $6, %%rbp
- ::: "rbx", "r12", "r13", "r14", "r15", "rbp");
+ ::: .{ .rbx = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true, .rbp = true });
} else {
asm volatile (
\\movq $3, %%rbx
@@ -59,7 +59,7 @@ noinline fn frame2(expected: *[4]usize, unwound: *[4]usize) void {
\\movq $13, %%r13
\\movq $14, %%r14
\\movq $15, %%r15
- ::: "rbx", "r12", "r13", "r14", "r15");
+ ::: .{ .rbx = true, .r12 = true, .r13 = true, .r14 = true, .r15 = true });
}
},
else => {},
diff --git a/test/standalone/stack_iterator/unwind_freestanding.zig b/test/standalone/stack_iterator/unwind_freestanding.zig
index d95b0d4fcf..ec4bb5d00e 100644
--- a/test/standalone/stack_iterator/unwind_freestanding.zig
+++ b/test/standalone/stack_iterator/unwind_freestanding.zig
@@ -58,8 +58,7 @@ export fn _start() callconv(.c) noreturn {
\\syscall
:
: [missed] "{edi}" (missed),
- : "edi", "eax"
- );
+ : .{ .edi = true, .eax = true });
while (true) {} // unreached
}
diff --git a/test/tests.zig b/test/tests.zig
index bdc41e47bd..2a6c4166fa 100644
--- a/test/tests.zig
+++ b/test/tests.zig
@@ -847,6 +847,7 @@ const test_targets = blk: {
.arch_os_abi = "riscv32-linux-none",
.cpu_features = "baseline-d-f",
}) catch unreachable,
+ .extra_target = true,
},
.{
.target = .{
@@ -872,6 +873,7 @@ const test_targets = blk: {
.cpu_features = "baseline-d-f",
}) catch unreachable,
.link_libc = true,
+ .extra_target = true,
},
.{
.target = .{
@@ -904,6 +906,7 @@ const test_targets = blk: {
.arch_os_abi = "riscv64-linux-none",
.cpu_features = "baseline-d-f",
}) catch unreachable,
+ .extra_target = true,
},
.{
.target = .{
@@ -929,6 +932,7 @@ const test_targets = blk: {
.cpu_features = "baseline-d-f",
}) catch unreachable,
.link_libc = true,
+ .extra_target = true,
},
.{
.target = .{
diff --git a/tools/fetch_them_macos_headers.zig b/tools/fetch_them_macos_headers.zig
index b81ee001b5..44f3e7bb86 100644
--- a/tools/fetch_them_macos_headers.zig
+++ b/tools/fetch_them_macos_headers.zig
@@ -87,7 +87,7 @@ pub fn main() anyerror!void {
const sysroot_path = sysroot orelse blk: {
const target = try std.zig.system.resolveTargetQuery(.{});
- break :blk std.zig.system.darwin.getSdk(allocator, target) orelse
+ break :blk std.zig.system.darwin.getSdk(allocator, &target) orelse
fatal("no SDK found; you can provide one explicitly with '--sysroot' flag", .{});
};
@@ -112,7 +112,7 @@ pub fn main() anyerror!void {
15 => .sequoia,
else => unreachable,
};
- info("found SDK deployment target macOS {} aka '{s}'", .{ version, @tagName(os_ver) });
+ info("found SDK deployment target macOS {f} aka '{s}'", .{ version, @tagName(os_ver) });
var tmp = tmpDir(.{});
defer tmp.cleanup();
@@ -198,7 +198,7 @@ fn fetchTarget(
var dirs = std.StringHashMap(fs.Dir).init(arena);
try dirs.putNoClobber(".", dest_dir);
- const headers_list_str = try headers_list_file.reader().readAllAlloc(arena, std.math.maxInt(usize));
+ const headers_list_str = try headers_list_file.deprecatedReader().readAllAlloc(arena, std.math.maxInt(usize));
const prefix = "/usr/include";
var it = mem.splitScalar(u8, headers_list_str, '\n');
@@ -270,12 +270,8 @@ const Version = struct {
pub fn format(
v: Version,
- comptime unused_fmt_string: []const u8,
- options: std.fmt.FormatOptions,
- writer: anytype,
- ) !void {
- _ = unused_fmt_string;
- _ = options;
+ writer: *std.Io.Writer,
+ ) std.Io.Writer.Error!void {
try writer.print("{d}.{d}.{d}", .{ v.major, v.minor, v.patch });
}
};
diff --git a/tools/gen_stubs.zig b/tools/gen_stubs.zig
index 4978611cc1..ed60d7e67d 100644
--- a/tools/gen_stubs.zig
+++ b/tools/gen_stubs.zig
@@ -303,7 +303,7 @@ pub fn main() !void {
libc_so_path,
100 * 1024 * 1024,
1 * 1024 * 1024,
- @alignOf(elf.Elf64_Ehdr),
+ .of(elf.Elf64_Ehdr),
null,
) catch |err| {
std.debug.panic("unable to read '{s}/{s}': {s}", .{
diff --git a/tools/generate_linux_syscalls.zig b/tools/generate_linux_syscalls.zig
index 1ee153c40c..9c60329f2b 100644
--- a/tools/generate_linux_syscalls.zig
+++ b/tools/generate_linux_syscalls.zig
@@ -477,7 +477,7 @@ fn processPreprocessedFile(
const name = (getOverridenNameNew(value) orelse sys_name)["sys_".len..];
const fixed_name = if (stdlib_renames_new.get(name)) |f| f else if (stdlib_renames.get(name)) |f| f else name;
- try writer.print(" {p} = {s},\n", .{ zig.fmtId(fixed_name), value });
+ try writer.print(" {f} = {s},\n", .{ zig.fmtId(fixed_name), value });
}
}
@@ -510,7 +510,7 @@ fn processTableBasedArch(
}
const fixed_name = if (filters.fixedName) |fixedNameFn| fixedNameFn(name) else name;
- try writer.print(" {p} = {s},\n", .{ zig.fmtId(fixed_name), number });
+ try writer.print(" {f} = {s},\n", .{ zig.fmtId(fixed_name), number });
}
}
@@ -543,7 +543,7 @@ fn processMipsBasedArch(
}
const fixed_name = if (filters.fixedName) |fixedNameFn| fixedNameFn(name) else name;
- try writer.print(" {p} = linux_base + {s},\n", .{ zig.fmtId(fixed_name), number });
+ try writer.print(" {f} = linux_base + {s},\n", .{ zig.fmtId(fixed_name), number });
}
}
@@ -568,12 +568,12 @@ fn processPowerPcBasedArch(
if (mem.eql(u8, abi, "spu")) {
continue;
} else if (mem.eql(u8, abi, "32")) {
- try writer.print(" {p} = {s},\n", .{ zig.fmtId(fixed_name), number });
+ try writer.print(" {f} = {s},\n", .{ zig.fmtId(fixed_name), number });
} else if (mem.eql(u8, abi, "64")) {
- try optional_writer.?.print(" {p} = {s},\n", .{ zig.fmtId(fixed_name), number });
+ try optional_writer.?.print(" {f} = {s},\n", .{ zig.fmtId(fixed_name), number });
} else { // common/nospu
- try writer.print(" {p} = {s},\n", .{ zig.fmtId(fixed_name), number });
- try optional_writer.?.print(" {p} = {s},\n", .{ zig.fmtId(fixed_name), number });
+ try writer.print(" {f} = {s},\n", .{ zig.fmtId(fixed_name), number });
+ try optional_writer.?.print(" {f} = {s},\n", .{ zig.fmtId(fixed_name), number });
}
}
}
diff --git a/tools/migrate_langref.zig b/tools/migrate_langref.zig
index 327bedff74..c0c17e0076 100644
--- a/tools/migrate_langref.zig
+++ b/tools/migrate_langref.zig
@@ -27,9 +27,9 @@ pub fn main() !void {
var out_dir = try fs.cwd().openDir(fs.path.dirname(output_file).?, .{});
defer out_dir.close();
- const input_file_bytes = try in_file.reader().readAllAlloc(arena, std.math.maxInt(u32));
+ const input_file_bytes = try in_file.deprecatedReader().readAllAlloc(arena, std.math.maxInt(u32));
- var buffered_writer = io.bufferedWriter(out_file.writer());
+ var buffered_writer = io.bufferedWriter(out_file.deprecatedWriter());
var tokenizer = Tokenizer.init(input_file, input_file_bytes);
@@ -388,39 +388,39 @@ fn walk(arena: Allocator, tokenizer: *Tokenizer, out_dir: std.fs.Dir, w: anytype
try file.writeAll("\n\n");
if (just_check_syntax) {
- try file.writer().print("// syntax\n", .{});
+ try file.deprecatedWriter().print("// syntax\n", .{});
} else switch (code_kind_id) {
- .@"test" => try file.writer().print("// test\n", .{}),
- .lib => try file.writer().print("// lib\n", .{}),
- .test_error => |s| try file.writer().print("// test_error={s}\n", .{s}),
- .test_safety => |s| try file.writer().print("// test_safety={s}\n", .{s}),
- .exe => |s| try file.writer().print("// exe={s}\n", .{@tagName(s)}),
+ .@"test" => try file.deprecatedWriter().print("// test\n", .{}),
+ .lib => try file.deprecatedWriter().print("// lib\n", .{}),
+ .test_error => |s| try file.deprecatedWriter().print("// test_error={s}\n", .{s}),
+ .test_safety => |s| try file.deprecatedWriter().print("// test_safety={s}\n", .{s}),
+ .exe => |s| try file.deprecatedWriter().print("// exe={s}\n", .{@tagName(s)}),
.obj => |opt| if (opt) |s| {
- try file.writer().print("// obj={s}\n", .{s});
+ try file.deprecatedWriter().print("// obj={s}\n", .{s});
} else {
- try file.writer().print("// obj\n", .{});
+ try file.deprecatedWriter().print("// obj\n", .{});
},
}
if (mode != .Debug)
- try file.writer().print("// optimize={s}\n", .{@tagName(mode)});
+ try file.deprecatedWriter().print("// optimize={s}\n", .{@tagName(mode)});
for (link_objects.items) |link_object| {
- try file.writer().print("// link_object={s}\n", .{link_object});
+ try file.deprecatedWriter().print("// link_object={s}\n", .{link_object});
}
if (target_str) |s|
- try file.writer().print("// target={s}\n", .{s});
+ try file.deprecatedWriter().print("// target={s}\n", .{s});
- if (link_libc) try file.writer().print("// link_libc\n", .{});
- if (disable_cache) try file.writer().print("// disable_cache\n", .{});
- if (verbose_cimport) try file.writer().print("// verbose_cimport\n", .{});
+ if (link_libc) try file.deprecatedWriter().print("// link_libc\n", .{});
+ if (disable_cache) try file.deprecatedWriter().print("// disable_cache\n", .{});
+ if (verbose_cimport) try file.deprecatedWriter().print("// verbose_cimport\n", .{});
if (link_mode) |m|
- try file.writer().print("// link_mode={s}\n", .{@tagName(m)});
+ try file.deprecatedWriter().print("// link_mode={s}\n", .{@tagName(m)});
for (additional_options.items) |o| {
- try file.writer().print("// additional_option={s}\n", .{o});
+ try file.deprecatedWriter().print("// additional_option={s}\n", .{o});
}
try w.print("{{#code|{s}#}}\n", .{basename});
} else {
diff --git a/tools/process_headers.zig b/tools/process_headers.zig
index 0219f04d0e..51d4436540 100644
--- a/tools/process_headers.zig
+++ b/tools/process_headers.zig
@@ -266,10 +266,10 @@ pub fn main() !void {
if (gop.found_existing) {
max_bytes_saved += raw_bytes.len;
gop.value_ptr.hit_count += 1;
- std.debug.print("duplicate: {s} {s} ({:2})\n", .{
+ std.debug.print("duplicate: {s} {s} ({B})\n", .{
libc_dir,
rel_path,
- std.fmt.fmtIntSizeDec(raw_bytes.len),
+ raw_bytes.len,
});
} else {
gop.value_ptr.* = Contents{
@@ -311,9 +311,9 @@ pub fn main() !void {
std.debug.print("warning: libc target not found: {s}\n", .{libc_dir});
}
}
- std.debug.print("summary: {:2} could be reduced to {:2}\n", .{
- std.fmt.fmtIntSizeDec(total_bytes),
- std.fmt.fmtIntSizeDec(total_bytes - max_bytes_saved),
+ std.debug.print("summary: {B} could be reduced to {B}\n", .{
+ total_bytes,
+ total_bytes - max_bytes_saved,
});
try std.fs.cwd().makePath(out_dir);
@@ -343,8 +343,8 @@ pub fn main() !void {
if (contender.hit_count > 1) {
const this_missed_bytes = contender.hit_count * contender.bytes.len;
missed_opportunity_bytes += this_missed_bytes;
- std.debug.print("Missed opportunity ({:2}): {s}\n", .{
- std.fmt.fmtIntSizeDec(this_missed_bytes),
+ std.debug.print("Missed opportunity ({B}): {s}\n", .{
+ this_missed_bytes,
path_kv.key_ptr.*,
});
} else break;
diff --git a/tools/update-linux-headers.zig b/tools/update-linux-headers.zig
index 956b1ffe9e..3bf310e8e3 100644
--- a/tools/update-linux-headers.zig
+++ b/tools/update-linux-headers.zig
@@ -218,10 +218,10 @@ pub fn main() !void {
if (gop.found_existing) {
max_bytes_saved += raw_bytes.len;
gop.value_ptr.hit_count += 1;
- std.debug.print("duplicate: {s} {s} ({:2})\n", .{
+ std.debug.print("duplicate: {s} {s} ({B})\n", .{
linux_target.name,
rel_path,
- std.fmt.fmtIntSizeDec(raw_bytes.len),
+ raw_bytes.len,
});
} else {
gop.value_ptr.* = Contents{
@@ -249,9 +249,9 @@ pub fn main() !void {
std.debug.print("warning: libc target not found: {s}\n", .{linux_target.name});
}
}
- std.debug.print("summary: {:2} could be reduced to {:2}\n", .{
- std.fmt.fmtIntSizeDec(total_bytes),
- std.fmt.fmtIntSizeDec(total_bytes - max_bytes_saved),
+ std.debug.print("summary: {B} could be reduced to {B}\n", .{
+ total_bytes,
+ total_bytes - max_bytes_saved,
});
try std.fs.cwd().makePath(out_dir);
@@ -281,8 +281,8 @@ pub fn main() !void {
if (contender.hit_count > 1) {
const this_missed_bytes = contender.hit_count * contender.bytes.len;
missed_opportunity_bytes += this_missed_bytes;
- std.debug.print("Missed opportunity ({:2}): {s}\n", .{
- std.fmt.fmtIntSizeDec(this_missed_bytes),
+ std.debug.print("Missed opportunity ({B}): {s}\n", .{
+ this_missed_bytes,
path_kv.key_ptr.*,
});
} else break;
diff --git a/tools/update_clang_options.zig b/tools/update_clang_options.zig
index 8bf49ad93a..95fc68fa55 100644
--- a/tools/update_clang_options.zig
+++ b/tools/update_clang_options.zig
@@ -635,7 +635,7 @@ pub fn main() anyerror!void {
const args = try std.process.argsAlloc(allocator);
var stdout_buffer: [4000]u8 = undefined;
- var stdout_writer = fs.stdout().writerStreaming(&stdout_buffer);
+ var stdout_writer = fs.File.stdout().writerStreaming(&stdout_buffer);
const stdout = &stdout_writer.interface;
if (args.len <= 1) printUsageAndExit(args[0]);
@@ -767,7 +767,7 @@ pub fn main() anyerror!void {
try stdout.print(
\\.{{
\\ .name = "{s}",
- \\ .syntax = {s},
+ \\ .syntax = {f},
\\ .zig_equivalent = .{s},
\\ .pd1 = {},
\\ .pd2 = {},
@@ -797,7 +797,7 @@ pub fn main() anyerror!void {
try stdout.print(
\\.{{
\\ .name = "{s}",
- \\ .syntax = {s},
+ \\ .syntax = {f},
\\ .zig_equivalent = .other,
\\ .pd1 = {},
\\ .pd2 = {},
@@ -845,14 +845,10 @@ const Syntax = union(enum) {
pub fn format(
self: Syntax,
- comptime fmt: []const u8,
- options: std.fmt.FormatOptions,
- out_stream: anytype,
- ) !void {
- _ = fmt;
- _ = options;
+ out_stream: *std.Io.Writer,
+ ) std.Io.Writer.Error!void {
switch (self) {
- .multi_arg => |n| return out_stream.print(".{{.{s}={}}}", .{ @tagName(self), n }),
+ .multi_arg => |n| return out_stream.print(".{{.{t}={d}}}", .{ self, n }),
else => return out_stream.print(".{s}", .{@tagName(self)}),
}
}
diff --git a/tools/update_cpu_features.zig b/tools/update_cpu_features.zig
index b54d74ca1c..49ee63a31d 100644
--- a/tools/update_cpu_features.zig
+++ b/tools/update_cpu_features.zig
@@ -1906,7 +1906,7 @@ fn processOneTarget(job: Job) void {
var zig_code_file = try target_dir.createFile(zig_code_basename, .{});
defer zig_code_file.close();
- var bw = std.io.bufferedWriter(zig_code_file.writer());
+ var bw = std.io.bufferedWriter(zig_code_file.deprecatedWriter());
const w = bw.writer();
try w.writeAll(
@@ -1920,7 +1920,7 @@ fn processOneTarget(job: Job) void {
);
for (all_features.items, 0..) |feature, i| {
- try w.print("\n {p},", .{std.zig.fmtId(feature.zig_name)});
+ try w.print("\n {f},", .{std.zig.fmtId(feature.zig_name)});
if (i == all_features.items.len - 1) try w.writeAll("\n");
}
@@ -1949,27 +1949,27 @@ fn processOneTarget(job: Job) void {
for (all_features.items) |feature| {
if (feature.llvm_name) |llvm_name| {
try w.print(
- \\ result[@intFromEnum(Feature.{p_})] = .{{
- \\ .llvm_name = "{}",
- \\ .description = "{}",
+ \\ result[@intFromEnum(Feature.{f})] = .{{
+ \\ .llvm_name = "{f}",
+ \\ .description = "{f}",
\\ .dependencies = featureSet(&[_]Feature{{
,
.{
- std.zig.fmtId(feature.zig_name),
- std.zig.fmtEscapes(llvm_name),
- std.zig.fmtEscapes(feature.desc),
+ std.zig.fmtIdPU(feature.zig_name),
+ std.zig.fmtString(llvm_name),
+ std.zig.fmtString(feature.desc),
},
);
} else {
try w.print(
- \\ result[@intFromEnum(Feature.{p_})] = .{{
+ \\ result[@intFromEnum(Feature.{f})] = .{{
\\ .llvm_name = null,
- \\ .description = "{}",
+ \\ .description = "{f}",
\\ .dependencies = featureSet(&[_]Feature{{
,
.{
- std.zig.fmtId(feature.zig_name),
- std.zig.fmtEscapes(feature.desc),
+ std.zig.fmtIdPU(feature.zig_name),
+ std.zig.fmtString(feature.desc),
},
);
}
@@ -1996,7 +1996,7 @@ fn processOneTarget(job: Job) void {
} else {
try w.writeAll("\n");
for (dependencies.items) |dep| {
- try w.print(" .{p_},\n", .{std.zig.fmtId(dep)});
+ try w.print(" .{f},\n", .{std.zig.fmtIdPU(dep)});
}
try w.writeAll(
\\ }),
@@ -2033,24 +2033,24 @@ fn processOneTarget(job: Job) void {
mem.sort([]const u8, cpu_features.items, {}, asciiLessThan);
if (cpu.llvm_name) |llvm_name| {
try w.print(
- \\ pub const {}: CpuModel = .{{
- \\ .name = "{}",
- \\ .llvm_name = "{}",
+ \\ pub const {f}: CpuModel = .{{
+ \\ .name = "{f}",
+ \\ .llvm_name = "{f}",
\\ .features = featureSet(&[_]Feature{{
, .{
std.zig.fmtId(cpu.zig_name),
- std.zig.fmtEscapes(cpu.zig_name),
- std.zig.fmtEscapes(llvm_name),
+ std.zig.fmtString(cpu.zig_name),
+ std.zig.fmtString(llvm_name),
});
} else {
try w.print(
- \\ pub const {}: CpuModel = .{{
- \\ .name = "{}",
+ \\ pub const {f}: CpuModel = .{{
+ \\ .name = "{f}",
\\ .llvm_name = null,
\\ .features = featureSet(&[_]Feature{{
, .{
std.zig.fmtId(cpu.zig_name),
- std.zig.fmtEscapes(cpu.zig_name),
+ std.zig.fmtString(cpu.zig_name),
});
}
if (cpu_features.items.len == 0) {
@@ -2062,7 +2062,7 @@ fn processOneTarget(job: Job) void {
} else {
try w.writeAll("\n");
for (cpu_features.items) |feature_zig_name| {
- try w.print(" .{p_},\n", .{std.zig.fmtId(feature_zig_name)});
+ try w.print(" .{f},\n", .{std.zig.fmtIdPU(feature_zig_name)});
}
try w.writeAll(
\\ }),
diff --git a/tools/update_crc_catalog.zig b/tools/update_crc_catalog.zig
index 1ae45cf1bc..47bb6c37d6 100644
--- a/tools/update_crc_catalog.zig
+++ b/tools/update_crc_catalog.zig
@@ -30,7 +30,7 @@ pub fn main() anyerror!void {
var zig_code_file = try hash_target_dir.createFile("crc.zig", .{});
defer zig_code_file.close();
- var cbw = std.io.bufferedWriter(zig_code_file.writer());
+ var cbw = std.io.bufferedWriter(zig_code_file.deprecatedWriter());
defer cbw.flush() catch unreachable;
const code_writer = cbw.writer();
@@ -55,7 +55,7 @@ pub fn main() anyerror!void {
var zig_test_file = try crc_target_dir.createFile("test.zig", .{});
defer zig_test_file.close();
- var tbw = std.io.bufferedWriter(zig_test_file.writer());
+ var tbw = std.io.bufferedWriter(zig_test_file.deprecatedWriter());
defer tbw.flush() catch unreachable;
const test_writer = tbw.writer();