authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-08-31 18:44:15-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-08-31 18:44:15-07:00
log7efca2e6f51458de8e70a6f5cbbc292026321681
tree67595e90e73b9cb2637848d1fdd950f3463f2c4e
parentdb4fea6689eb34959028cad3b63de45da65683d3
parent75263e160e477a210a3d2a007b6d66c63b85001f

Merge remote-tracking branch 'origin/master' into llvm13


53 files changed, 1291 insertions(+), 767 deletions(-)

ci/azure/linux_script+1-1
......@@ -9,7 +9,7 @@ sudo apt-get install -y cmake s3cmd tidy
99ZIGDIR="$(pwd)"
1010ARCH="$(uname -m)"
1111TARGET="$ARCH-linux-musl"
12CACHE_BASENAME="zig+llvm+lld+clang-$TARGET-0.8.0-dev.2703+c12704a33"
12CACHE_BASENAME="zig+llvm+lld+clang-$TARGET-0.8.1-dev.94+535615117"
1313PREFIX="$HOME/$CACHE_BASENAME"
1414MCPU="baseline"
1515JOBS="-j$(nproc)"
ci/azure/macos_script+1-1
......@@ -9,7 +9,7 @@ ZIGDIR="$(pwd)"
99ARCH="x86_64"
1010TARGET="$ARCH-macos-gnu"
1111MCPU="baseline"
12CACHE_BASENAME="zig+llvm+lld+clang-$TARGET-0.8.0-dev.2703+c12704a33"
12CACHE_BASENAME="zig+llvm+lld+clang-$TARGET-0.8.1-dev.94+535615117"
1313PREFIX="$HOME/$CACHE_BASENAME"
1414JOBS="-j2"
1515
doc/langref.html.in+1-1
......@@ -783,7 +783,7 @@ pub fn main() void {
783783 Because Zig source code is {#link|UTF-8 encoded|Source Encoding#}, any non-ASCII bytes appearing within a string literal
784784 in source code carry their UTF-8 meaning into the content of the string in the Zig program;
785785 the bytes are not modified by the compiler.
786 However, it is possible to embbed non-UTF-8 bytes into a string literal using <code>\xNN</code> notation.
786 However, it is possible to embed non-UTF-8 bytes into a string literal using <code>\xNN</code> notation.
787787 </p>
788788 <p>
789789 Unicode code point literals have type {#syntax#}comptime_int{#endsyntax#}, the same as
lib/std/Thread.zig+9-9
......@@ -700,7 +700,7 @@ const LinuxThreadImpl = struct {
700700 \\ int $128
701701 :
702702 : [ptr] "r" (@ptrToInt(self.mapped.ptr)),
703 [len] "r" (self.mapped.len)
703 [len] "r" (self.mapped.len),
704704 : "memory"
705705 ),
706706 .x86_64 => asm volatile (
......@@ -713,7 +713,7 @@ const LinuxThreadImpl = struct {
713713 \\ syscall
714714 :
715715 : [ptr] "r" (@ptrToInt(self.mapped.ptr)),
716 [len] "r" (self.mapped.len)
716 [len] "r" (self.mapped.len),
717717 : "memory"
718718 ),
719719 .arm, .armeb, .thumb, .thumbeb => asm volatile (
......@@ -726,7 +726,7 @@ const LinuxThreadImpl = struct {
726726 \\ svc 0
727727 :
728728 : [ptr] "r" (@ptrToInt(self.mapped.ptr)),
729 [len] "r" (self.mapped.len)
729 [len] "r" (self.mapped.len),
730730 : "memory"
731731 ),
732732 .aarch64, .aarch64_be, .aarch64_32 => asm volatile (
......@@ -739,7 +739,7 @@ const LinuxThreadImpl = struct {
739739 \\ svc 0
740740 :
741741 : [ptr] "r" (@ptrToInt(self.mapped.ptr)),
742 [len] "r" (self.mapped.len)
742 [len] "r" (self.mapped.len),
743743 : "memory"
744744 ),
745745 .mips, .mipsel => asm volatile (
......@@ -753,7 +753,7 @@ const LinuxThreadImpl = struct {
753753 \\ syscall
754754 :
755755 : [ptr] "r" (@ptrToInt(self.mapped.ptr)),
756 [len] "r" (self.mapped.len)
756 [len] "r" (self.mapped.len),
757757 : "memory"
758758 ),
759759 .mips64, .mips64el => asm volatile (
......@@ -766,7 +766,7 @@ const LinuxThreadImpl = struct {
766766 \\ syscall
767767 :
768768 : [ptr] "r" (@ptrToInt(self.mapped.ptr)),
769 [len] "r" (self.mapped.len)
769 [len] "r" (self.mapped.len),
770770 : "memory"
771771 ),
772772 .powerpc, .powerpcle, .powerpc64, .powerpc64le => asm volatile (
......@@ -780,7 +780,7 @@ const LinuxThreadImpl = struct {
780780 \\ blr
781781 :
782782 : [ptr] "r" (@ptrToInt(self.mapped.ptr)),
783 [len] "r" (self.mapped.len)
783 [len] "r" (self.mapped.len),
784784 : "memory"
785785 ),
786786 .riscv64 => asm volatile (
......@@ -793,7 +793,7 @@ const LinuxThreadImpl = struct {
793793 \\ ecall
794794 :
795795 : [ptr] "r" (@ptrToInt(self.mapped.ptr)),
796 [len] "r" (self.mapped.len)
796 [len] "r" (self.mapped.len),
797797 : "memory"
798798 ),
799799 .sparcv9 => asm volatile (
......@@ -821,7 +821,7 @@ const LinuxThreadImpl = struct {
821821 \\ t 0x6d
822822 :
823823 : [ptr] "r" (@ptrToInt(self.mapped.ptr)),
824 [len] "r" (self.mapped.len)
824 [len] "r" (self.mapped.len),
825825 : "memory"
826826 ),
827827 else => |cpu_arch| @compileError("Unsupported linux arch: " ++ @tagName(cpu_arch)),
lib/std/array_hash_map.zig+44
......@@ -293,6 +293,22 @@ pub fn ArrayHashMap(
293293 return self.unmanaged.getPtrAdapted(key, ctx);
294294 }
295295
296 /// Find the actual key associated with an adapted key
297 pub fn getKey(self: Self, key: K) ?K {
298 return self.unmanaged.getKeyContext(key, self.ctx);
299 }
300 pub fn getKeyAdapted(self: Self, key: anytype, ctx: anytype) ?K {
301 return self.unmanaged.getKeyAdapted(key, ctx);
302 }
303
304 /// Find a pointer to the actual key associated with an adapted key
305 pub fn getKeyPtr(self: Self, key: K) ?*K {
306 return self.unmanaged.getKeyPtrContext(key, self.ctx);
307 }
308 pub fn getKeyPtrAdapted(self: Self, key: anytype, ctx: anytype) ?*K {
309 return self.unmanaged.getKeyPtrAdapted(key, ctx);
310 }
311
296312 /// Check whether a key is stored in the map
297313 pub fn contains(self: Self, key: K) bool {
298314 return self.unmanaged.containsContext(key, self.ctx);
......@@ -967,6 +983,34 @@ pub fn ArrayHashMapUnmanaged(
967983 return if (@sizeOf(*V) == 0) @as(*V, undefined) else &self.values()[index];
968984 }
969985
986 /// Find the actual key associated with an adapted key
987 pub fn getKey(self: Self, key: K) ?K {
988 if (@sizeOf(Context) != 0)
989 @compileError("Cannot infer context " ++ @typeName(Context) ++ ", call getKeyContext instead.");
990 return self.getKeyContext(key, undefined);
991 }
992 pub fn getKeyContext(self: Self, key: K, ctx: Context) ?K {
993 return self.getKeyAdapted(key, ctx);
994 }
995 pub fn getKeyAdapted(self: Self, key: anytype, ctx: anytype) ?K {
996 const index = self.getIndexAdapted(key, ctx) orelse return null;
997 return self.keys()[index];
998 }
999
1000 /// Find a pointer to the actual key associated with an adapted key
1001 pub fn getKeyPtr(self: Self, key: K) ?*K {
1002 if (@sizeOf(Context) != 0)
1003 @compileError("Cannot infer context " ++ @typeName(Context) ++ ", call getKeyPtrContext instead.");
1004 return self.getKeyPtrContext(key, undefined);
1005 }
1006 pub fn getKeyPtrContext(self: Self, key: K, ctx: Context) ?*K {
1007 return self.getKeyPtrAdapted(key, ctx);
1008 }
1009 pub fn getKeyPtrAdapted(self: Self, key: anytype, ctx: anytype) ?*K {
1010 const index = self.getIndexAdapted(key, ctx) orelse return null;
1011 return &self.keys()[index];
1012 }
1013
9701014 /// Check whether a key is stored in the map
9711015 pub fn contains(self: Self, key: K) bool {
9721016 if (@sizeOf(Context) != 0)
lib/std/atomic/Atomic.zig+18-18
......@@ -176,69 +176,69 @@ pub fn Atomic(comptime T: type) type {
176176 2 => switch (op) {
177177 .Set => asm volatile ("lock btsw %[bit], %[ptr]"
178178 // LLVM doesn't support u1 flag register return values
179 : [result] "={@ccc}" (-> u8)
179 : [result] "={@ccc}" (-> u8),
180180 : [ptr] "*p" (&self.value),
181 [bit] "X" (@as(T, bit))
181 [bit] "X" (@as(T, bit)),
182182 : "cc", "memory"
183183 ),
184184 .Reset => asm volatile ("lock btrw %[bit], %[ptr]"
185185 // LLVM doesn't support u1 flag register return values
186 : [result] "={@ccc}" (-> u8)
186 : [result] "={@ccc}" (-> u8),
187187 : [ptr] "*p" (&self.value),
188 [bit] "X" (@as(T, bit))
188 [bit] "X" (@as(T, bit)),
189189 : "cc", "memory"
190190 ),
191191 .Toggle => asm volatile ("lock btcw %[bit], %[ptr]"
192192 // LLVM doesn't support u1 flag register return values
193 : [result] "={@ccc}" (-> u8)
193 : [result] "={@ccc}" (-> u8),
194194 : [ptr] "*p" (&self.value),
195 [bit] "X" (@as(T, bit))
195 [bit] "X" (@as(T, bit)),
196196 : "cc", "memory"
197197 ),
198198 },
199199 4 => switch (op) {
200200 .Set => asm volatile ("lock btsl %[bit], %[ptr]"
201201 // LLVM doesn't support u1 flag register return values
202 : [result] "={@ccc}" (-> u8)
202 : [result] "={@ccc}" (-> u8),
203203 : [ptr] "*p" (&self.value),
204 [bit] "X" (@as(T, bit))
204 [bit] "X" (@as(T, bit)),
205205 : "cc", "memory"
206206 ),
207207 .Reset => asm volatile ("lock btrl %[bit], %[ptr]"
208208 // LLVM doesn't support u1 flag register return values
209 : [result] "={@ccc}" (-> u8)
209 : [result] "={@ccc}" (-> u8),
210210 : [ptr] "*p" (&self.value),
211 [bit] "X" (@as(T, bit))
211 [bit] "X" (@as(T, bit)),
212212 : "cc", "memory"
213213 ),
214214 .Toggle => asm volatile ("lock btcl %[bit], %[ptr]"
215215 // LLVM doesn't support u1 flag register return values
216 : [result] "={@ccc}" (-> u8)
216 : [result] "={@ccc}" (-> u8),
217217 : [ptr] "*p" (&self.value),
218 [bit] "X" (@as(T, bit))
218 [bit] "X" (@as(T, bit)),
219219 : "cc", "memory"
220220 ),
221221 },
222222 8 => switch (op) {
223223 .Set => asm volatile ("lock btsq %[bit], %[ptr]"
224224 // LLVM doesn't support u1 flag register return values
225 : [result] "={@ccc}" (-> u8)
225 : [result] "={@ccc}" (-> u8),
226226 : [ptr] "*p" (&self.value),
227 [bit] "X" (@as(T, bit))
227 [bit] "X" (@as(T, bit)),
228228 : "cc", "memory"
229229 ),
230230 .Reset => asm volatile ("lock btrq %[bit], %[ptr]"
231231 // LLVM doesn't support u1 flag register return values
232 : [result] "={@ccc}" (-> u8)
232 : [result] "={@ccc}" (-> u8),
233233 : [ptr] "*p" (&self.value),
234 [bit] "X" (@as(T, bit))
234 [bit] "X" (@as(T, bit)),
235235 : "cc", "memory"
236236 ),
237237 .Toggle => asm volatile ("lock btcq %[bit], %[ptr]"
238238 // LLVM doesn't support u1 flag register return values
239 : [result] "={@ccc}" (-> u8)
239 : [result] "={@ccc}" (-> u8),
240240 : [ptr] "*p" (&self.value),
241 [bit] "X" (@as(T, bit))
241 [bit] "X" (@as(T, bit)),
242242 : "cc", "memory"
243243 ),
244244 },
lib/std/build.zig+13
......@@ -94,6 +94,8 @@ pub const Builder = struct {
9494 name: []const u8,
9595 type_id: TypeId,
9696 description: []const u8,
97 /// If the `type_id` is `enum` this provides the list of enum options
98 enum_options: ?[]const []const u8,
9799 };
98100
99101 const UserInputOption = struct {
......@@ -482,10 +484,21 @@ pub const Builder = struct {
482484 const name = self.dupe(name_raw);
483485 const description = self.dupe(description_raw);
484486 const type_id = comptime typeToEnum(T);
487 const enum_options = if (type_id == .@"enum") blk: {
488 const fields = comptime std.meta.fields(T);
489 var options = ArrayList([]const u8).initCapacity(self.allocator, fields.len) catch unreachable;
490
491 inline for (fields) |field| {
492 options.appendAssumeCapacity(field.name);
493 }
494
495 break :blk options.toOwnedSlice();
496 } else null;
485497 const available_option = AvailableOption{
486498 .name = name,
487499 .type_id = type_id,
488500 .description = description,
501 .enum_options = enum_options,
489502 };
490503 if ((self.available_options_map.fetchPut(name, available_option) catch unreachable) != null) {
491504 panic("Option '{s}' declared twice", .{name});
lib/std/crypto/aes/aesni.zig+12-12
......@@ -34,9 +34,9 @@ pub const Block = struct {
3434 return Block{
3535 .repr = asm (
3636 \\ vaesenc %[rk], %[in], %[out]
37 : [out] "=x" (-> BlockVec)
37 : [out] "=x" (-> BlockVec),
3838 : [in] "x" (block.repr),
39 [rk] "x" (round_key.repr)
39 [rk] "x" (round_key.repr),
4040 ),
4141 };
4242 }
......@@ -46,9 +46,9 @@ pub const Block = struct {
4646 return Block{
4747 .repr = asm (
4848 \\ vaesenclast %[rk], %[in], %[out]
49 : [out] "=x" (-> BlockVec)
49 : [out] "=x" (-> BlockVec),
5050 : [in] "x" (block.repr),
51 [rk] "x" (round_key.repr)
51 [rk] "x" (round_key.repr),
5252 ),
5353 };
5454 }
......@@ -58,9 +58,9 @@ pub const Block = struct {
5858 return Block{
5959 .repr = asm (
6060 \\ vaesdec %[rk], %[in], %[out]
61 : [out] "=x" (-> BlockVec)
61 : [out] "=x" (-> BlockVec),
6262 : [in] "x" (block.repr),
63 [rk] "x" (inv_round_key.repr)
63 [rk] "x" (inv_round_key.repr),
6464 ),
6565 };
6666 }
......@@ -70,9 +70,9 @@ pub const Block = struct {
7070 return Block{
7171 .repr = asm (
7272 \\ vaesdeclast %[rk], %[in], %[out]
73 : [out] "=x" (-> BlockVec)
73 : [out] "=x" (-> BlockVec),
7474 : [in] "x" (block.repr),
75 [rk] "x" (inv_round_key.repr)
75 [rk] "x" (inv_round_key.repr),
7676 ),
7777 };
7878 }
......@@ -190,11 +190,11 @@ fn KeySchedule(comptime Aes: type) type {
190190 \\ vpxor %[ts], %[r], %[r]
191191 : [r] "=&x" (-> BlockVec),
192192 [s] "=&x" (s),
193 [ts] "=&x" (ts)
193 [ts] "=&x" (ts),
194194 : [rc] "n" (rc),
195195 [t] "x" (t),
196196 [tx] "x" (tx),
197 [mask] "n" (@as(u8, if (second) 0xaa else 0xff))
197 [mask] "n" (@as(u8, if (second) 0xaa else 0xff)),
198198 );
199199 }
200200
......@@ -235,8 +235,8 @@ fn KeySchedule(comptime Aes: type) type {
235235 inv_round_keys[i] = Block{
236236 .repr = asm (
237237 \\ vaesimc %[rk], %[inv_rk]
238 : [inv_rk] "=x" (-> BlockVec)
239 : [rk] "x" (round_keys[rounds - i].repr)
238 : [inv_rk] "=x" (-> BlockVec),
239 : [rk] "x" (round_keys[rounds - i].repr),
240240 ),
241241 };
242242 }
lib/std/crypto/aes/armcrypto.zig+14-14
......@@ -39,10 +39,10 @@ pub const Block = struct {
3939 \\ aese %[out].16b, %[zero].16b
4040 \\ aesmc %[out].16b, %[out].16b
4141 \\ eor %[out].16b, %[out].16b, %[rk].16b
42 : [out] "=&x" (-> BlockVec)
42 : [out] "=&x" (-> BlockVec),
4343 : [in] "x" (block.repr),
4444 [rk] "x" (round_key.repr),
45 [zero] "x" (zero)
45 [zero] "x" (zero),
4646 ),
4747 };
4848 }
......@@ -54,10 +54,10 @@ pub const Block = struct {
5454 \\ mov %[out].16b, %[in].16b
5555 \\ aese %[out].16b, %[zero].16b
5656 \\ eor %[out].16b, %[out].16b, %[rk].16b
57 : [out] "=&x" (-> BlockVec)
57 : [out] "=&x" (-> BlockVec),
5858 : [in] "x" (block.repr),
5959 [rk] "x" (round_key.repr),
60 [zero] "x" (zero)
60 [zero] "x" (zero),
6161 ),
6262 };
6363 }
......@@ -70,10 +70,10 @@ pub const Block = struct {
7070 \\ aesd %[out].16b, %[zero].16b
7171 \\ aesimc %[out].16b, %[out].16b
7272 \\ eor %[out].16b, %[out].16b, %[rk].16b
73 : [out] "=&x" (-> BlockVec)
73 : [out] "=&x" (-> BlockVec),
7474 : [in] "x" (block.repr),
7575 [rk] "x" (inv_round_key.repr),
76 [zero] "x" (zero)
76 [zero] "x" (zero),
7777 ),
7878 };
7979 }
......@@ -85,10 +85,10 @@ pub const Block = struct {
8585 \\ mov %[out].16b, %[in].16b
8686 \\ aesd %[out].16b, %[zero].16b
8787 \\ eor %[out].16b, %[out].16b, %[rk].16b
88 : [out] "=&x" (-> BlockVec)
88 : [out] "=&x" (-> BlockVec),
8989 : [in] "x" (block.repr),
9090 [rk] "x" (inv_round_key.repr),
91 [zero] "x" (zero)
91 [zero] "x" (zero),
9292 ),
9393 };
9494 }
......@@ -210,11 +210,11 @@ fn KeySchedule(comptime Aes: type) type {
210210 [v1] "=&x" (v1),
211211 [v2] "=&x" (v2),
212212 [v3] "=&x" (v3),
213 [v4] "=&x" (v4)
213 [v4] "=&x" (v4),
214214 : [rc] "N" (rc),
215215 [t] "x" (t),
216216 [zero] "x" (zero),
217 [mask] "x" (mask1)
217 [mask] "x" (mask1),
218218 );
219219 }
220220
......@@ -240,12 +240,12 @@ fn KeySchedule(comptime Aes: type) type {
240240 [v1] "=&x" (v1),
241241 [v2] "=&x" (v2),
242242 [v3] "=&x" (v3),
243 [v4] "=&x" (v4)
243 [v4] "=&x" (v4),
244244 : [rc] "N" (if (second) @as(u8, 0) else rc),
245245 [t] "x" (t),
246246 [tx] "x" (tx),
247247 [zero] "x" (zero),
248 [mask] "x" (if (second) mask2 else mask1)
248 [mask] "x" (if (second) mask2 else mask1),
249249 );
250250 }
251251
......@@ -286,8 +286,8 @@ fn KeySchedule(comptime Aes: type) type {
286286 inv_round_keys[i] = Block{
287287 .repr = asm (
288288 \\ aesimc %[inv_rk].16b, %[rk].16b
289 : [inv_rk] "=x" (-> BlockVec)
290 : [rk] "x" (round_keys[rounds - i].repr)
289 : [inv_rk] "=x" (-> BlockVec),
290 : [rk] "x" (round_keys[rounds - i].repr),
291291 ),
292292 };
293293 }
lib/std/crypto/ghash.zig+4-4
......@@ -94,9 +94,9 @@ pub const Ghash = struct {
9494 const Vector = std.meta.Vector;
9595 const product = asm (
9696 \\ vpclmulqdq $0x00, %[x], %[y], %[out]
97 : [out] "=x" (-> Vector(2, u64))
97 : [out] "=x" (-> Vector(2, u64)),
9898 : [x] "x" (@bitCast(Vector(2, u64), @as(u128, x))),
99 [y] "x" (@bitCast(Vector(2, u64), @as(u128, y)))
99 [y] "x" (@bitCast(Vector(2, u64), @as(u128, y))),
100100 );
101101 return product[0];
102102 }
......@@ -105,9 +105,9 @@ pub const Ghash = struct {
105105 const Vector = std.meta.Vector;
106106 const product = asm (
107107 \\ pmull %[out].1q, %[x].1d, %[y].1d
108 : [out] "=w" (-> Vector(2, u64))
108 : [out] "=w" (-> Vector(2, u64)),
109109 : [x] "w" (@bitCast(Vector(2, u64), @as(u128, x))),
110 [y] "w" (@bitCast(Vector(2, u64), @as(u128, y)))
110 [y] "w" (@bitCast(Vector(2, u64), @as(u128, y))),
111111 );
112112 return product[0];
113113 }
lib/std/debug.zig+1-1
......@@ -1634,7 +1634,7 @@ fn handleSegfaultWindowsExtra(info: *windows.EXCEPTION_POINTERS, comptime msg: u
16341634
16351635pub fn dumpStackPointerAddr(prefix: []const u8) void {
16361636 const sp = asm (""
1637 : [argc] "={rsp}" (-> usize)
1637 : [argc] "={rsp}" (-> usize),
16381638 );
16391639 std.debug.warn("{} sp = 0x{x}\n", .{ prefix, sp });
16401640}
lib/std/fmt.zig+1-2
......@@ -1200,8 +1200,6 @@ pub fn formatFloatDecimal(
12001200 while (i < precision) : (i += 1) {
12011201 try writer.writeAll("0");
12021202 }
1203 } else {
1204 try writer.writeAll(".0");
12051203 }
12061204 }
12071205
......@@ -2198,6 +2196,7 @@ test "float.hexadecimal.precision" {
21982196test "float.decimal" {
21992197 try expectFmt("f64: 152314000000000000000000000000", "f64: {d}", .{@as(f64, 1.52314e+29)});
22002198 try expectFmt("f32: 0", "f32: {d}", .{@as(f32, 0.0)});
2199 try expectFmt("f32: 0", "f32: {d:.0}", .{@as(f32, 0.0)});
22012200 try expectFmt("f32: 1.1", "f32: {d:.1}", .{@as(f32, 1.1234)});
22022201 try expectFmt("f32: 1234.57", "f32: {d:.2}", .{@as(f32, 1234.567)});
22032202 // -11.1234 is converted to f64 -11.12339... internally (errol3() function takes f64).
lib/std/hash_map.zig+48
......@@ -561,6 +561,21 @@ pub fn HashMap(
561561 return self.unmanaged.getPtrAdapted(key, ctx);
562562 }
563563
564 /// Finds the actual key associated with an adapted key in the map
565 pub fn getKey(self: Self, key: K) ?K {
566 return self.unmanaged.getKeyContext(key, self.ctx);
567 }
568 pub fn getKeyAdapted(self: Self, key: anytype, ctx: anytype) ?K {
569 return self.unmanaged.getKeyAdapted(key, ctx);
570 }
571
572 pub fn getKeyPtr(self: Self, key: K) ?*K {
573 return self.unmanaged.getKeyPtrContext(key, self.ctx);
574 }
575 pub fn getKeyPtrAdapted(self: Self, key: anytype, ctx: anytype) ?*K {
576 return self.unmanaged.getKeyPtrAdapted(key, ctx);
577 }
578
564579 /// Finds the key and value associated with a key in the map
565580 pub fn getEntry(self: Self, key: K) ?Entry {
566581 return self.unmanaged.getEntryContext(key, self.ctx);
......@@ -1124,6 +1139,38 @@ pub fn HashMapUnmanaged(
11241139 result.value_ptr.* = value;
11251140 }
11261141
1142 /// Get an optional pointer to the actual key associated with adapted key, if present.
1143 pub fn getKeyPtr(self: Self, key: K) ?*K {
1144 if (@sizeOf(Context) != 0)
1145 @compileError("Cannot infer context " ++ @typeName(Context) ++ ", call getKeyPtrContext instead.");
1146 return self.getKeyPtrContext(key, undefined);
1147 }
1148 pub fn getKeyPtrContext(self: Self, key: K, ctx: Context) ?*K {
1149 return self.getKeyPtrAdapted(key, ctx);
1150 }
1151 pub fn getKeyPtrAdapted(self: Self, key: anytype, ctx: anytype) ?*K {
1152 if (self.getIndex(key, ctx)) |idx| {
1153 return &self.keys()[idx];
1154 }
1155 return null;
1156 }
1157
1158 /// Get a copy of the actual key associated with adapted key, if present.
1159 pub fn getKey(self: Self, key: K) ?K {
1160 if (@sizeOf(Context) != 0)
1161 @compileError("Cannot infer context " ++ @typeName(Context) ++ ", call getKeyContext instead.");
1162 return self.getKeyContext(key, undefined);
1163 }
1164 pub fn getKeyContext(self: Self, key: K, ctx: Context) ?K {
1165 return self.getKeyAdapted(key, ctx);
1166 }
1167 pub fn getKeyAdapted(self: Self, key: anytype, ctx: anytype) ?K {
1168 if (self.getIndex(key, ctx)) |idx| {
1169 return self.keys()[idx];
1170 }
1171 return null;
1172 }
1173
11271174 /// Get an optional pointer to the value associated with key, if present.
11281175 pub fn getPtr(self: Self, key: K) ?*V {
11291176 if (@sizeOf(Context) != 0)
......@@ -1948,6 +1995,7 @@ test "std.hash_map getOrPutAdapted" {
19481995 try testing.expect(result.found_existing);
19491996 try testing.expectEqual(real_keys[i], result.key_ptr.*);
19501997 try testing.expectEqual(@as(u64, i) * 2, result.value_ptr.*);
1998 try testing.expectEqual(real_keys[i], map.getKeyAdapted(key_str, AdaptedContext{}).?);
19511999 }
19522000}
19532001
lib/std/mem.zig+1-1
......@@ -2860,7 +2860,7 @@ pub fn alignForwardGeneric(comptime T: type, addr: T, alignment: T) T {
28602860pub fn doNotOptimizeAway(val: anytype) void {
28612861 asm volatile (""
28622862 :
2863 : [val] "rm" (val)
2863 : [val] "rm" (val),
28642864 : "memory"
28652865 );
28662866}
lib/std/os/linux/arm-eabi.zig+16-16
......@@ -2,63 +2,63 @@ usingnamespace @import("../bits/linux.zig");
22
33pub fn syscall0(number: SYS) usize {
44 return asm volatile ("svc #0"
5 : [ret] "={r0}" (-> usize)
6 : [number] "{r7}" (@enumToInt(number))
5 : [ret] "={r0}" (-> usize),
6 : [number] "{r7}" (@enumToInt(number)),
77 : "memory"
88 );
99}
1010
1111pub fn syscall1(number: SYS, arg1: usize) usize {
1212 return asm volatile ("svc #0"
13 : [ret] "={r0}" (-> usize)
13 : [ret] "={r0}" (-> usize),
1414 : [number] "{r7}" (@enumToInt(number)),
15 [arg1] "{r0}" (arg1)
15 [arg1] "{r0}" (arg1),
1616 : "memory"
1717 );
1818}
1919
2020pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
2121 return asm volatile ("svc #0"
22 : [ret] "={r0}" (-> usize)
22 : [ret] "={r0}" (-> usize),
2323 : [number] "{r7}" (@enumToInt(number)),
2424 [arg1] "{r0}" (arg1),
25 [arg2] "{r1}" (arg2)
25 [arg2] "{r1}" (arg2),
2626 : "memory"
2727 );
2828}
2929
3030pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
3131 return asm volatile ("svc #0"
32 : [ret] "={r0}" (-> usize)
32 : [ret] "={r0}" (-> usize),
3333 : [number] "{r7}" (@enumToInt(number)),
3434 [arg1] "{r0}" (arg1),
3535 [arg2] "{r1}" (arg2),
36 [arg3] "{r2}" (arg3)
36 [arg3] "{r2}" (arg3),
3737 : "memory"
3838 );
3939}
4040
4141pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
4242 return asm volatile ("svc #0"
43 : [ret] "={r0}" (-> usize)
43 : [ret] "={r0}" (-> usize),
4444 : [number] "{r7}" (@enumToInt(number)),
4545 [arg1] "{r0}" (arg1),
4646 [arg2] "{r1}" (arg2),
4747 [arg3] "{r2}" (arg3),
48 [arg4] "{r3}" (arg4)
48 [arg4] "{r3}" (arg4),
4949 : "memory"
5050 );
5151}
5252
5353pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
5454 return asm volatile ("svc #0"
55 : [ret] "={r0}" (-> usize)
55 : [ret] "={r0}" (-> usize),
5656 : [number] "{r7}" (@enumToInt(number)),
5757 [arg1] "{r0}" (arg1),
5858 [arg2] "{r1}" (arg2),
5959 [arg3] "{r2}" (arg3),
6060 [arg4] "{r3}" (arg4),
61 [arg5] "{r4}" (arg5)
61 [arg5] "{r4}" (arg5),
6262 : "memory"
6363 );
6464}
......@@ -73,14 +73,14 @@ pub fn syscall6(
7373 arg6: usize,
7474) usize {
7575 return asm volatile ("svc #0"
76 : [ret] "={r0}" (-> usize)
76 : [ret] "={r0}" (-> usize),
7777 : [number] "{r7}" (@enumToInt(number)),
7878 [arg1] "{r0}" (arg1),
7979 [arg2] "{r1}" (arg2),
8080 [arg3] "{r2}" (arg3),
8181 [arg4] "{r3}" (arg4),
8282 [arg5] "{r4}" (arg5),
83 [arg6] "{r5}" (arg6)
83 [arg6] "{r5}" (arg6),
8484 : "memory"
8585 );
8686}
......@@ -91,7 +91,7 @@ pub extern fn clone(func: fn (arg: usize) callconv(.C) u8, stack: usize, flags:
9191pub fn restore() callconv(.Naked) void {
9292 return asm volatile ("svc #0"
9393 :
94 : [number] "{r7}" (@enumToInt(SYS.sigreturn))
94 : [number] "{r7}" (@enumToInt(SYS.sigreturn)),
9595 : "memory"
9696 );
9797}
......@@ -99,7 +99,7 @@ pub fn restore() callconv(.Naked) void {
9999pub fn restore_rt() callconv(.Naked) void {
100100 return asm volatile ("svc #0"
101101 :
102 : [number] "{r7}" (@enumToInt(SYS.rt_sigreturn))
102 : [number] "{r7}" (@enumToInt(SYS.rt_sigreturn)),
103103 : "memory"
104104 );
105105}
lib/std/os/linux/arm64.zig+15-15
......@@ -2,63 +2,63 @@ usingnamespace @import("../bits/linux.zig");
22
33pub fn syscall0(number: SYS) usize {
44 return asm volatile ("svc #0"
5 : [ret] "={x0}" (-> usize)
6 : [number] "{x8}" (@enumToInt(number))
5 : [ret] "={x0}" (-> usize),
6 : [number] "{x8}" (@enumToInt(number)),
77 : "memory", "cc"
88 );
99}
1010
1111pub fn syscall1(number: SYS, arg1: usize) usize {
1212 return asm volatile ("svc #0"
13 : [ret] "={x0}" (-> usize)
13 : [ret] "={x0}" (-> usize),
1414 : [number] "{x8}" (@enumToInt(number)),
15 [arg1] "{x0}" (arg1)
15 [arg1] "{x0}" (arg1),
1616 : "memory", "cc"
1717 );
1818}
1919
2020pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
2121 return asm volatile ("svc #0"
22 : [ret] "={x0}" (-> usize)
22 : [ret] "={x0}" (-> usize),
2323 : [number] "{x8}" (@enumToInt(number)),
2424 [arg1] "{x0}" (arg1),
25 [arg2] "{x1}" (arg2)
25 [arg2] "{x1}" (arg2),
2626 : "memory", "cc"
2727 );
2828}
2929
3030pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
3131 return asm volatile ("svc #0"
32 : [ret] "={x0}" (-> usize)
32 : [ret] "={x0}" (-> usize),
3333 : [number] "{x8}" (@enumToInt(number)),
3434 [arg1] "{x0}" (arg1),
3535 [arg2] "{x1}" (arg2),
36 [arg3] "{x2}" (arg3)
36 [arg3] "{x2}" (arg3),
3737 : "memory", "cc"
3838 );
3939}
4040
4141pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
4242 return asm volatile ("svc #0"
43 : [ret] "={x0}" (-> usize)
43 : [ret] "={x0}" (-> usize),
4444 : [number] "{x8}" (@enumToInt(number)),
4545 [arg1] "{x0}" (arg1),
4646 [arg2] "{x1}" (arg2),
4747 [arg3] "{x2}" (arg3),
48 [arg4] "{x3}" (arg4)
48 [arg4] "{x3}" (arg4),
4949 : "memory", "cc"
5050 );
5151}
5252
5353pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
5454 return asm volatile ("svc #0"
55 : [ret] "={x0}" (-> usize)
55 : [ret] "={x0}" (-> usize),
5656 : [number] "{x8}" (@enumToInt(number)),
5757 [arg1] "{x0}" (arg1),
5858 [arg2] "{x1}" (arg2),
5959 [arg3] "{x2}" (arg3),
6060 [arg4] "{x3}" (arg4),
61 [arg5] "{x4}" (arg5)
61 [arg5] "{x4}" (arg5),
6262 : "memory", "cc"
6363 );
6464}
......@@ -73,14 +73,14 @@ pub fn syscall6(
7373 arg6: usize,
7474) usize {
7575 return asm volatile ("svc #0"
76 : [ret] "={x0}" (-> usize)
76 : [ret] "={x0}" (-> usize),
7777 : [number] "{x8}" (@enumToInt(number)),
7878 [arg1] "{x0}" (arg1),
7979 [arg2] "{x1}" (arg2),
8080 [arg3] "{x2}" (arg3),
8181 [arg4] "{x3}" (arg4),
8282 [arg5] "{x4}" (arg5),
83 [arg6] "{x5}" (arg6)
83 [arg6] "{x5}" (arg6),
8484 : "memory", "cc"
8585 );
8686}
......@@ -93,7 +93,7 @@ pub const restore = restore_rt;
9393pub fn restore_rt() callconv(.Naked) void {
9494 return asm volatile ("svc #0"
9595 :
96 : [number] "{x8}" (@enumToInt(SYS.rt_sigreturn))
96 : [number] "{x8}" (@enumToInt(SYS.rt_sigreturn)),
9797 : "memory", "cc"
9898 );
9999}
lib/std/os/linux/i386.zig+18-18
......@@ -2,63 +2,63 @@ usingnamespace @import("../bits/linux.zig");
22
33pub fn syscall0(number: SYS) usize {
44 return asm volatile ("int $0x80"
5 : [ret] "={eax}" (-> usize)
6 : [number] "{eax}" (@enumToInt(number))
5 : [ret] "={eax}" (-> usize),
6 : [number] "{eax}" (@enumToInt(number)),
77 : "memory"
88 );
99}
1010
1111pub fn syscall1(number: SYS, arg1: usize) usize {
1212 return asm volatile ("int $0x80"
13 : [ret] "={eax}" (-> usize)
13 : [ret] "={eax}" (-> usize),
1414 : [number] "{eax}" (@enumToInt(number)),
15 [arg1] "{ebx}" (arg1)
15 [arg1] "{ebx}" (arg1),
1616 : "memory"
1717 );
1818}
1919
2020pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
2121 return asm volatile ("int $0x80"
22 : [ret] "={eax}" (-> usize)
22 : [ret] "={eax}" (-> usize),
2323 : [number] "{eax}" (@enumToInt(number)),
2424 [arg1] "{ebx}" (arg1),
25 [arg2] "{ecx}" (arg2)
25 [arg2] "{ecx}" (arg2),
2626 : "memory"
2727 );
2828}
2929
3030pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
3131 return asm volatile ("int $0x80"
32 : [ret] "={eax}" (-> usize)
32 : [ret] "={eax}" (-> usize),
3333 : [number] "{eax}" (@enumToInt(number)),
3434 [arg1] "{ebx}" (arg1),
3535 [arg2] "{ecx}" (arg2),
36 [arg3] "{edx}" (arg3)
36 [arg3] "{edx}" (arg3),
3737 : "memory"
3838 );
3939}
4040
4141pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
4242 return asm volatile ("int $0x80"
43 : [ret] "={eax}" (-> usize)
43 : [ret] "={eax}" (-> usize),
4444 : [number] "{eax}" (@enumToInt(number)),
4545 [arg1] "{ebx}" (arg1),
4646 [arg2] "{ecx}" (arg2),
4747 [arg3] "{edx}" (arg3),
48 [arg4] "{esi}" (arg4)
48 [arg4] "{esi}" (arg4),
4949 : "memory"
5050 );
5151}
5252
5353pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
5454 return asm volatile ("int $0x80"
55 : [ret] "={eax}" (-> usize)
55 : [ret] "={eax}" (-> usize),
5656 : [number] "{eax}" (@enumToInt(number)),
5757 [arg1] "{ebx}" (arg1),
5858 [arg2] "{ecx}" (arg2),
5959 [arg3] "{edx}" (arg3),
6060 [arg4] "{esi}" (arg4),
61 [arg5] "{edi}" (arg5)
61 [arg5] "{edi}" (arg5),
6262 : "memory"
6363 );
6464}
......@@ -83,24 +83,24 @@ pub fn syscall6(
8383 \\ int $0x80
8484 \\ pop %%ebp
8585 \\ add $4, %%esp
86 : [ret] "={eax}" (-> usize)
86 : [ret] "={eax}" (-> usize),
8787 : [number] "{eax}" (@enumToInt(number)),
8888 [arg1] "{ebx}" (arg1),
8989 [arg2] "{ecx}" (arg2),
9090 [arg3] "{edx}" (arg3),
9191 [arg4] "{esi}" (arg4),
9292 [arg5] "{edi}" (arg5),
93 [arg6] "rm" (arg6)
93 [arg6] "rm" (arg6),
9494 : "memory"
9595 );
9696}
9797
9898pub fn socketcall(call: usize, args: [*]usize) usize {
9999 return asm volatile ("int $0x80"
100 : [ret] "={eax}" (-> usize)
100 : [ret] "={eax}" (-> usize),
101101 : [number] "{eax}" (@enumToInt(SYS.socketcall)),
102102 [arg1] "{ebx}" (call),
103 [arg2] "{ecx}" (@ptrToInt(args))
103 [arg2] "{ecx}" (@ptrToInt(args)),
104104 : "memory"
105105 );
106106}
......@@ -111,7 +111,7 @@ pub extern fn clone(func: fn (arg: usize) callconv(.C) u8, stack: usize, flags:
111111pub fn restore() callconv(.Naked) void {
112112 return asm volatile ("int $0x80"
113113 :
114 : [number] "{eax}" (@enumToInt(SYS.sigreturn))
114 : [number] "{eax}" (@enumToInt(SYS.sigreturn)),
115115 : "memory"
116116 );
117117}
......@@ -119,7 +119,7 @@ pub fn restore() callconv(.Naked) void {
119119pub fn restore_rt() callconv(.Naked) void {
120120 return asm volatile ("int $0x80"
121121 :
122 : [number] "{eax}" (@enumToInt(SYS.rt_sigreturn))
122 : [number] "{eax}" (@enumToInt(SYS.rt_sigreturn)),
123123 : "memory"
124124 );
125125}
lib/std/os/linux/mips.zig+20-20
......@@ -6,8 +6,8 @@ pub fn syscall0(number: SYS) usize {
66 \\ blez $7, 1f
77 \\ subu $2, $0, $2
88 \\ 1:
9 : [ret] "={$2}" (-> usize)
10 : [number] "{$2}" (@enumToInt(number))
9 : [ret] "={$2}" (-> usize),
10 : [number] "{$2}" (@enumToInt(number)),
1111 : "memory", "cc", "$7"
1212 );
1313}
......@@ -25,9 +25,9 @@ pub fn syscall_pipe(fd: *[2]i32) usize {
2525 \\ sw $2, 0($4)
2626 \\ sw $3, 4($4)
2727 \\ 2:
28 : [ret] "={$2}" (-> usize)
28 : [ret] "={$2}" (-> usize),
2929 : [number] "{$2}" (@enumToInt(SYS.pipe)),
30 [fd] "{$4}" (fd)
30 [fd] "{$4}" (fd),
3131 : "memory", "cc", "$7"
3232 );
3333}
......@@ -38,9 +38,9 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
3838 \\ blez $7, 1f
3939 \\ subu $2, $0, $2
4040 \\ 1:
41 : [ret] "={$2}" (-> usize)
41 : [ret] "={$2}" (-> usize),
4242 : [number] "{$2}" (@enumToInt(number)),
43 [arg1] "{$4}" (arg1)
43 [arg1] "{$4}" (arg1),
4444 : "memory", "cc", "$7"
4545 );
4646}
......@@ -51,10 +51,10 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
5151 \\ blez $7, 1f
5252 \\ subu $2, $0, $2
5353 \\ 1:
54 : [ret] "={$2}" (-> usize)
54 : [ret] "={$2}" (-> usize),
5555 : [number] "{$2}" (@enumToInt(number)),
5656 [arg1] "{$4}" (arg1),
57 [arg2] "{$5}" (arg2)
57 [arg2] "{$5}" (arg2),
5858 : "memory", "cc", "$7"
5959 );
6060}
......@@ -65,11 +65,11 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
6565 \\ blez $7, 1f
6666 \\ subu $2, $0, $2
6767 \\ 1:
68 : [ret] "={$2}" (-> usize)
68 : [ret] "={$2}" (-> usize),
6969 : [number] "{$2}" (@enumToInt(number)),
7070 [arg1] "{$4}" (arg1),
7171 [arg2] "{$5}" (arg2),
72 [arg3] "{$6}" (arg3)
72 [arg3] "{$6}" (arg3),
7373 : "memory", "cc", "$7"
7474 );
7575}
......@@ -80,12 +80,12 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
8080 \\ blez $7, 1f
8181 \\ subu $2, $0, $2
8282 \\ 1:
83 : [ret] "={$2}" (-> usize)
83 : [ret] "={$2}" (-> usize),
8484 : [number] "{$2}" (@enumToInt(number)),
8585 [arg1] "{$4}" (arg1),
8686 [arg2] "{$5}" (arg2),
8787 [arg3] "{$6}" (arg3),
88 [arg4] "{$7}" (arg4)
88 [arg4] "{$7}" (arg4),
8989 : "memory", "cc", "$7"
9090 );
9191}
......@@ -100,13 +100,13 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
100100 \\ blez $7, 1f
101101 \\ subu $2, $0, $2
102102 \\ 1:
103 : [ret] "={$2}" (-> usize)
103 : [ret] "={$2}" (-> usize),
104104 : [number] "{$2}" (@enumToInt(number)),
105105 [arg1] "{$4}" (arg1),
106106 [arg2] "{$5}" (arg2),
107107 [arg3] "{$6}" (arg3),
108108 [arg4] "{$7}" (arg4),
109 [arg5] "r" (arg5)
109 [arg5] "r" (arg5),
110110 : "memory", "cc", "$7"
111111 );
112112}
......@@ -133,14 +133,14 @@ pub fn syscall6(
133133 \\ blez $7, 1f
134134 \\ subu $2, $0, $2
135135 \\ 1:
136 : [ret] "={$2}" (-> usize)
136 : [ret] "={$2}" (-> usize),
137137 : [number] "{$2}" (@enumToInt(number)),
138138 [arg1] "{$4}" (arg1),
139139 [arg2] "{$5}" (arg2),
140140 [arg3] "{$6}" (arg3),
141141 [arg4] "{$7}" (arg4),
142142 [arg5] "r" (arg5),
143 [arg6] "r" (arg6)
143 [arg6] "r" (arg6),
144144 : "memory", "cc", "$7"
145145 );
146146}
......@@ -166,7 +166,7 @@ pub fn syscall7(
166166 \\ blez $7, 1f
167167 \\ subu $2, $0, $2
168168 \\ 1:
169 : [ret] "={$2}" (-> usize)
169 : [ret] "={$2}" (-> usize),
170170 : [number] "{$2}" (@enumToInt(number)),
171171 [arg1] "{$4}" (arg1),
172172 [arg2] "{$5}" (arg2),
......@@ -174,7 +174,7 @@ pub fn syscall7(
174174 [arg4] "{$7}" (arg4),
175175 [arg5] "r" (arg5),
176176 [arg6] "r" (arg6),
177 [arg7] "r" (arg7)
177 [arg7] "r" (arg7),
178178 : "memory", "cc", "$7"
179179 );
180180}
......@@ -185,7 +185,7 @@ pub extern fn clone(func: fn (arg: usize) callconv(.C) u8, stack: usize, flags:
185185pub fn restore() callconv(.Naked) void {
186186 return asm volatile ("syscall"
187187 :
188 : [number] "{$2}" (@enumToInt(SYS.sigreturn))
188 : [number] "{$2}" (@enumToInt(SYS.sigreturn)),
189189 : "memory", "cc", "$7"
190190 );
191191}
......@@ -193,7 +193,7 @@ pub fn restore() callconv(.Naked) void {
193193pub fn restore_rt() callconv(.Naked) void {
194194 return asm volatile ("syscall"
195195 :
196 : [number] "{$2}" (@enumToInt(SYS.rt_sigreturn))
196 : [number] "{$2}" (@enumToInt(SYS.rt_sigreturn)),
197197 : "memory", "cc", "$7"
198198 );
199199}
lib/std/os/linux/powerpc.zig+15-15
......@@ -6,8 +6,8 @@ pub fn syscall0(number: SYS) usize {
66 \\ bns+ 1f
77 \\ neg 3, 3
88 \\ 1:
9 : [ret] "={r3}" (-> usize)
10 : [number] "{r0}" (@enumToInt(number))
9 : [ret] "={r3}" (-> usize),
10 : [number] "{r0}" (@enumToInt(number)),
1111 : "memory", "cr0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
1212 );
1313}
......@@ -18,9 +18,9 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
1818 \\ bns+ 1f
1919 \\ neg 3, 3
2020 \\ 1:
21 : [ret] "={r3}" (-> usize)
21 : [ret] "={r3}" (-> usize),
2222 : [number] "{r0}" (@enumToInt(number)),
23 [arg1] "{r3}" (arg1)
23 [arg1] "{r3}" (arg1),
2424 : "memory", "cr0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
2525 );
2626}
......@@ -31,10 +31,10 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
3131 \\ bns+ 1f
3232 \\ neg 3, 3
3333 \\ 1:
34 : [ret] "={r3}" (-> usize)
34 : [ret] "={r3}" (-> usize),
3535 : [number] "{r0}" (@enumToInt(number)),
3636 [arg1] "{r3}" (arg1),
37 [arg2] "{r4}" (arg2)
37 [arg2] "{r4}" (arg2),
3838 : "memory", "cr0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
3939 );
4040}
......@@ -45,11 +45,11 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
4545 \\ bns+ 1f
4646 \\ neg 3, 3
4747 \\ 1:
48 : [ret] "={r3}" (-> usize)
48 : [ret] "={r3}" (-> usize),
4949 : [number] "{r0}" (@enumToInt(number)),
5050 [arg1] "{r3}" (arg1),
5151 [arg2] "{r4}" (arg2),
52 [arg3] "{r5}" (arg3)
52 [arg3] "{r5}" (arg3),
5353 : "memory", "cr0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
5454 );
5555}
......@@ -60,12 +60,12 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
6060 \\ bns+ 1f
6161 \\ neg 3, 3
6262 \\ 1:
63 : [ret] "={r3}" (-> usize)
63 : [ret] "={r3}" (-> usize),
6464 : [number] "{r0}" (@enumToInt(number)),
6565 [arg1] "{r3}" (arg1),
6666 [arg2] "{r4}" (arg2),
6767 [arg3] "{r5}" (arg3),
68 [arg4] "{r6}" (arg4)
68 [arg4] "{r6}" (arg4),
6969 : "memory", "cr0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
7070 );
7171}
......@@ -76,13 +76,13 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
7676 \\ bns+ 1f
7777 \\ neg 3, 3
7878 \\ 1:
79 : [ret] "={r3}" (-> usize)
79 : [ret] "={r3}" (-> usize),
8080 : [number] "{r0}" (@enumToInt(number)),
8181 [arg1] "{r3}" (arg1),
8282 [arg2] "{r4}" (arg2),
8383 [arg3] "{r5}" (arg3),
8484 [arg4] "{r6}" (arg4),
85 [arg5] "{r7}" (arg5)
85 [arg5] "{r7}" (arg5),
8686 : "memory", "cr0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
8787 );
8888}
......@@ -101,14 +101,14 @@ pub fn syscall6(
101101 \\ bns+ 1f
102102 \\ neg 3, 3
103103 \\ 1:
104 : [ret] "={r3}" (-> usize)
104 : [ret] "={r3}" (-> usize),
105105 : [number] "{r0}" (@enumToInt(number)),
106106 [arg1] "{r3}" (arg1),
107107 [arg2] "{r4}" (arg2),
108108 [arg3] "{r5}" (arg3),
109109 [arg4] "{r6}" (arg4),
110110 [arg5] "{r7}" (arg5),
111 [arg6] "{r8}" (arg6)
111 [arg6] "{r8}" (arg6),
112112 : "memory", "cr0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
113113 );
114114}
......@@ -121,7 +121,7 @@ pub const restore = restore_rt;
121121pub fn restore_rt() callconv(.Naked) void {
122122 return asm volatile ("sc"
123123 :
124 : [number] "{r0}" (@enumToInt(SYS.rt_sigreturn))
124 : [number] "{r0}" (@enumToInt(SYS.rt_sigreturn)),
125125 : "memory", "cr0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
126126 );
127127}
lib/std/os/linux/powerpc64.zig+15-15
......@@ -6,8 +6,8 @@ pub fn syscall0(number: SYS) usize {
66 \\ bns+ 1f
77 \\ neg 3, 3
88 \\ 1:
9 : [ret] "={r3}" (-> usize)
10 : [number] "{r0}" (@enumToInt(number))
9 : [ret] "={r3}" (-> usize),
10 : [number] "{r0}" (@enumToInt(number)),
1111 : "memory", "cr0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
1212 );
1313}
......@@ -18,9 +18,9 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
1818 \\ bns+ 1f
1919 \\ neg 3, 3
2020 \\ 1:
21 : [ret] "={r3}" (-> usize)
21 : [ret] "={r3}" (-> usize),
2222 : [number] "{r0}" (@enumToInt(number)),
23 [arg1] "{r3}" (arg1)
23 [arg1] "{r3}" (arg1),
2424 : "memory", "cr0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
2525 );
2626}
......@@ -31,10 +31,10 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
3131 \\ bns+ 1f
3232 \\ neg 3, 3
3333 \\ 1:
34 : [ret] "={r3}" (-> usize)
34 : [ret] "={r3}" (-> usize),
3535 : [number] "{r0}" (@enumToInt(number)),
3636 [arg1] "{r3}" (arg1),
37 [arg2] "{r4}" (arg2)
37 [arg2] "{r4}" (arg2),
3838 : "memory", "cr0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
3939 );
4040}
......@@ -45,11 +45,11 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
4545 \\ bns+ 1f
4646 \\ neg 3, 3
4747 \\ 1:
48 : [ret] "={r3}" (-> usize)
48 : [ret] "={r3}" (-> usize),
4949 : [number] "{r0}" (@enumToInt(number)),
5050 [arg1] "{r3}" (arg1),
5151 [arg2] "{r4}" (arg2),
52 [arg3] "{r5}" (arg3)
52 [arg3] "{r5}" (arg3),
5353 : "memory", "cr0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
5454 );
5555}
......@@ -60,12 +60,12 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
6060 \\ bns+ 1f
6161 \\ neg 3, 3
6262 \\ 1:
63 : [ret] "={r3}" (-> usize)
63 : [ret] "={r3}" (-> usize),
6464 : [number] "{r0}" (@enumToInt(number)),
6565 [arg1] "{r3}" (arg1),
6666 [arg2] "{r4}" (arg2),
6767 [arg3] "{r5}" (arg3),
68 [arg4] "{r6}" (arg4)
68 [arg4] "{r6}" (arg4),
6969 : "memory", "cr0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
7070 );
7171}
......@@ -76,13 +76,13 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
7676 \\ bns+ 1f
7777 \\ neg 3, 3
7878 \\ 1:
79 : [ret] "={r3}" (-> usize)
79 : [ret] "={r3}" (-> usize),
8080 : [number] "{r0}" (@enumToInt(number)),
8181 [arg1] "{r3}" (arg1),
8282 [arg2] "{r4}" (arg2),
8383 [arg3] "{r5}" (arg3),
8484 [arg4] "{r6}" (arg4),
85 [arg5] "{r7}" (arg5)
85 [arg5] "{r7}" (arg5),
8686 : "memory", "cr0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
8787 );
8888}
......@@ -101,14 +101,14 @@ pub fn syscall6(
101101 \\ bns+ 1f
102102 \\ neg 3, 3
103103 \\ 1:
104 : [ret] "={r3}" (-> usize)
104 : [ret] "={r3}" (-> usize),
105105 : [number] "{r0}" (@enumToInt(number)),
106106 [arg1] "{r3}" (arg1),
107107 [arg2] "{r4}" (arg2),
108108 [arg3] "{r5}" (arg3),
109109 [arg4] "{r6}" (arg4),
110110 [arg5] "{r7}" (arg5),
111 [arg6] "{r8}" (arg6)
111 [arg6] "{r8}" (arg6),
112112 : "memory", "cr0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
113113 );
114114}
......@@ -121,7 +121,7 @@ pub const restore = restore_rt;
121121pub fn restore_rt() callconv(.Naked) void {
122122 return asm volatile ("sc"
123123 :
124 : [number] "{r0}" (@enumToInt(SYS.rt_sigreturn))
124 : [number] "{r0}" (@enumToInt(SYS.rt_sigreturn)),
125125 : "memory", "cr0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
126126 );
127127}
lib/std/os/linux/riscv64.zig+15-15
......@@ -2,63 +2,63 @@ usingnamespace @import("../bits/linux.zig");
22
33pub fn syscall0(number: SYS) usize {
44 return asm volatile ("ecall"
5 : [ret] "={x10}" (-> usize)
6 : [number] "{x17}" (@enumToInt(number))
5 : [ret] "={x10}" (-> usize),
6 : [number] "{x17}" (@enumToInt(number)),
77 : "memory"
88 );
99}
1010
1111pub fn syscall1(number: SYS, arg1: usize) usize {
1212 return asm volatile ("ecall"
13 : [ret] "={x10}" (-> usize)
13 : [ret] "={x10}" (-> usize),
1414 : [number] "{x17}" (@enumToInt(number)),
15 [arg1] "{x10}" (arg1)
15 [arg1] "{x10}" (arg1),
1616 : "memory"
1717 );
1818}
1919
2020pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
2121 return asm volatile ("ecall"
22 : [ret] "={x10}" (-> usize)
22 : [ret] "={x10}" (-> usize),
2323 : [number] "{x17}" (@enumToInt(number)),
2424 [arg1] "{x10}" (arg1),
25 [arg2] "{x11}" (arg2)
25 [arg2] "{x11}" (arg2),
2626 : "memory"
2727 );
2828}
2929
3030pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
3131 return asm volatile ("ecall"
32 : [ret] "={x10}" (-> usize)
32 : [ret] "={x10}" (-> usize),
3333 : [number] "{x17}" (@enumToInt(number)),
3434 [arg1] "{x10}" (arg1),
3535 [arg2] "{x11}" (arg2),
36 [arg3] "{x12}" (arg3)
36 [arg3] "{x12}" (arg3),
3737 : "memory"
3838 );
3939}
4040
4141pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
4242 return asm volatile ("ecall"
43 : [ret] "={x10}" (-> usize)
43 : [ret] "={x10}" (-> usize),
4444 : [number] "{x17}" (@enumToInt(number)),
4545 [arg1] "{x10}" (arg1),
4646 [arg2] "{x11}" (arg2),
4747 [arg3] "{x12}" (arg3),
48 [arg4] "{x13}" (arg4)
48 [arg4] "{x13}" (arg4),
4949 : "memory"
5050 );
5151}
5252
5353pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
5454 return asm volatile ("ecall"
55 : [ret] "={x10}" (-> usize)
55 : [ret] "={x10}" (-> usize),
5656 : [number] "{x17}" (@enumToInt(number)),
5757 [arg1] "{x10}" (arg1),
5858 [arg2] "{x11}" (arg2),
5959 [arg3] "{x12}" (arg3),
6060 [arg4] "{x13}" (arg4),
61 [arg5] "{x14}" (arg5)
61 [arg5] "{x14}" (arg5),
6262 : "memory"
6363 );
6464}
......@@ -73,14 +73,14 @@ pub fn syscall6(
7373 arg6: usize,
7474) usize {
7575 return asm volatile ("ecall"
76 : [ret] "={x10}" (-> usize)
76 : [ret] "={x10}" (-> usize),
7777 : [number] "{x17}" (@enumToInt(number)),
7878 [arg1] "{x10}" (arg1),
7979 [arg2] "{x11}" (arg2),
8080 [arg3] "{x12}" (arg3),
8181 [arg4] "{x13}" (arg4),
8282 [arg5] "{x14}" (arg5),
83 [arg6] "{x15}" (arg6)
83 [arg6] "{x15}" (arg6),
8484 : "memory"
8585 );
8686}
......@@ -92,7 +92,7 @@ pub const restore = restore_rt;
9292pub fn restore_rt() callconv(.Naked) void {
9393 return asm volatile ("ecall"
9494 :
95 : [number] "{x17}" (@enumToInt(SYS.rt_sigreturn))
95 : [number] "{x17}" (@enumToInt(SYS.rt_sigreturn)),
9696 : "memory"
9797 );
9898}
lib/std/os/linux/sparc64.zig+19-19
......@@ -14,9 +14,9 @@ pub fn syscall_pipe(fd: *[2]i32) usize {
1414 \\ st %%o1, [%%g3+4]
1515 \\ clr %%o0
1616 \\2:
17 : [ret] "={o0}" (-> usize)
17 : [ret] "={o0}" (-> usize),
1818 : [number] "{g1}" (@enumToInt(SYS.pipe)),
19 [arg] "r" (fd)
19 [arg] "r" (fd),
2020 : "memory", "g3"
2121 );
2222}
......@@ -38,8 +38,8 @@ pub fn syscall_fork() usize {
3838 \\ dec %%o1
3939 \\ and %%o1, %%o0, %%o0
4040 \\ 2:
41 : [ret] "={o0}" (-> usize)
42 : [number] "{g1}" (@enumToInt(SYS.fork))
41 : [ret] "={o0}" (-> usize),
42 : [number] "{g1}" (@enumToInt(SYS.fork)),
4343 : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"
4444 );
4545}
......@@ -51,8 +51,8 @@ pub fn syscall0(number: SYS) usize {
5151 \\ nop
5252 \\ neg %%o0
5353 \\ 1:
54 : [ret] "={o0}" (-> usize)
55 : [number] "{g1}" (@enumToInt(number))
54 : [ret] "={o0}" (-> usize),
55 : [number] "{g1}" (@enumToInt(number)),
5656 : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"
5757 );
5858}
......@@ -64,9 +64,9 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
6464 \\ nop
6565 \\ neg %%o0
6666 \\ 1:
67 : [ret] "={o0}" (-> usize)
67 : [ret] "={o0}" (-> usize),
6868 : [number] "{g1}" (@enumToInt(number)),
69 [arg1] "{o0}" (arg1)
69 [arg1] "{o0}" (arg1),
7070 : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"
7171 );
7272}
......@@ -78,10 +78,10 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
7878 \\ nop
7979 \\ neg %%o0
8080 \\ 1:
81 : [ret] "={o0}" (-> usize)
81 : [ret] "={o0}" (-> usize),
8282 : [number] "{g1}" (@enumToInt(number)),
8383 [arg1] "{o0}" (arg1),
84 [arg2] "{o1}" (arg2)
84 [arg2] "{o1}" (arg2),
8585 : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"
8686 );
8787}
......@@ -93,11 +93,11 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
9393 \\ nop
9494 \\ neg %%o0
9595 \\ 1:
96 : [ret] "={o0}" (-> usize)
96 : [ret] "={o0}" (-> usize),
9797 : [number] "{g1}" (@enumToInt(number)),
9898 [arg1] "{o0}" (arg1),
9999 [arg2] "{o1}" (arg2),
100 [arg3] "{o2}" (arg3)
100 [arg3] "{o2}" (arg3),
101101 : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"
102102 );
103103}
......@@ -109,12 +109,12 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
109109 \\ nop
110110 \\ neg %%o0
111111 \\ 1:
112 : [ret] "={o0}" (-> usize)
112 : [ret] "={o0}" (-> usize),
113113 : [number] "{g1}" (@enumToInt(number)),
114114 [arg1] "{o0}" (arg1),
115115 [arg2] "{o1}" (arg2),
116116 [arg3] "{o2}" (arg3),
117 [arg4] "{o3}" (arg4)
117 [arg4] "{o3}" (arg4),
118118 : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"
119119 );
120120}
......@@ -126,13 +126,13 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
126126 \\ nop
127127 \\ neg %%o0
128128 \\ 1:
129 : [ret] "={o0}" (-> usize)
129 : [ret] "={o0}" (-> usize),
130130 : [number] "{g1}" (@enumToInt(number)),
131131 [arg1] "{o0}" (arg1),
132132 [arg2] "{o1}" (arg2),
133133 [arg3] "{o2}" (arg3),
134134 [arg4] "{o3}" (arg4),
135 [arg5] "{o4}" (arg5)
135 [arg5] "{o4}" (arg5),
136136 : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"
137137 );
138138}
......@@ -152,14 +152,14 @@ pub fn syscall6(
152152 \\ nop
153153 \\ neg %%o0
154154 \\ 1:
155 : [ret] "={o0}" (-> usize)
155 : [ret] "={o0}" (-> usize),
156156 : [number] "{g1}" (@enumToInt(number)),
157157 [arg1] "{o0}" (arg1),
158158 [arg2] "{o1}" (arg2),
159159 [arg3] "{o2}" (arg3),
160160 [arg4] "{o3}" (arg4),
161161 [arg5] "{o4}" (arg5),
162 [arg6] "{o5}" (arg6)
162 [arg6] "{o5}" (arg6),
163163 : "memory", "xcc", "o1", "o2", "o3", "o4", "o5", "o7"
164164 );
165165}
......@@ -174,7 +174,7 @@ pub const restore = restore_rt;
174174pub fn restore_rt() callconv(.C) void {
175175 return asm volatile ("t 0x6d"
176176 :
177 : [number] "{g1}" (@enumToInt(SYS.rt_sigreturn))
177 : [number] "{g1}" (@enumToInt(SYS.rt_sigreturn)),
178178 : "memory", "xcc", "o0", "o1", "o2", "o3", "o4", "o5", "o7"
179179 );
180180}
lib/std/os/linux/start_pie.zig+5-5
......@@ -30,13 +30,13 @@ fn getDynamicSymbol() [*]elf.Dyn {
3030 \\ call 1f
3131 \\ 1: pop %[ret]
3232 \\ lea _DYNAMIC-1b(%[ret]), %[ret]
33 : [ret] "=r" (-> [*]elf.Dyn)
33 : [ret] "=r" (-> [*]elf.Dyn),
3434 ),
3535 .x86_64 => asm volatile (
3636 \\ .weak _DYNAMIC
3737 \\ .hidden _DYNAMIC
3838 \\ lea _DYNAMIC(%%rip), %[ret]
39 : [ret] "=r" (-> [*]elf.Dyn)
39 : [ret] "=r" (-> [*]elf.Dyn),
4040 ),
4141 // Work around the limited offset range of `ldr`
4242 .arm => asm volatile (
......@@ -47,7 +47,7 @@ fn getDynamicSymbol() [*]elf.Dyn {
4747 \\ b 2f
4848 \\ 1: .word _DYNAMIC-1b
4949 \\ 2:
50 : [ret] "=r" (-> [*]elf.Dyn)
50 : [ret] "=r" (-> [*]elf.Dyn),
5151 ),
5252 // A simple `adr` is not enough as it has a limited offset range
5353 .aarch64 => asm volatile (
......@@ -55,13 +55,13 @@ fn getDynamicSymbol() [*]elf.Dyn {
5555 \\ .hidden _DYNAMIC
5656 \\ adrp %[ret], _DYNAMIC
5757 \\ add %[ret], %[ret], #:lo12:_DYNAMIC
58 : [ret] "=r" (-> [*]elf.Dyn)
58 : [ret] "=r" (-> [*]elf.Dyn),
5959 ),
6060 .riscv64 => asm volatile (
6161 \\ .weak _DYNAMIC
6262 \\ .hidden _DYNAMIC
6363 \\ lla %[ret], _DYNAMIC
64 : [ret] "=r" (-> [*]elf.Dyn)
64 : [ret] "=r" (-> [*]elf.Dyn),
6565 ),
6666 else => {
6767 @compileError("PIE startup is not yet supported for this target!");
lib/std/os/linux/thumb.zig+16-16
......@@ -15,8 +15,8 @@ pub fn syscall0(number: SYS) usize {
1515 \\ ldr r7, [%[tmp]]
1616 \\ svc #0
1717 \\ ldr r7, [%[tmp], #4]
18 : [ret] "={r0}" (-> usize)
19 : [tmp] "{r1}" (buf)
18 : [ret] "={r0}" (-> usize),
19 : [tmp] "{r1}" (buf),
2020 : "memory"
2121 );
2222}
......@@ -30,9 +30,9 @@ pub fn syscall1(number: SYS, arg1: usize) usize {
3030 \\ ldr r7, [%[tmp]]
3131 \\ svc #0
3232 \\ ldr r7, [%[tmp], #4]
33 : [ret] "={r0}" (-> usize)
33 : [ret] "={r0}" (-> usize),
3434 : [tmp] "{r1}" (buf),
35 [arg1] "{r0}" (arg1)
35 [arg1] "{r0}" (arg1),
3636 : "memory"
3737 );
3838}
......@@ -46,10 +46,10 @@ pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
4646 \\ ldr r7, [%[tmp]]
4747 \\ svc #0
4848 \\ ldr r7, [%[tmp], #4]
49 : [ret] "={r0}" (-> usize)
49 : [ret] "={r0}" (-> usize),
5050 : [tmp] "{r2}" (buf),
5151 [arg1] "{r0}" (arg1),
52 [arg2] "{r1}" (arg2)
52 [arg2] "{r1}" (arg2),
5353 : "memory"
5454 );
5555}
......@@ -63,11 +63,11 @@ pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
6363 \\ ldr r7, [%[tmp]]
6464 \\ svc #0
6565 \\ ldr r7, [%[tmp], #4]
66 : [ret] "={r0}" (-> usize)
66 : [ret] "={r0}" (-> usize),
6767 : [tmp] "{r3}" (buf),
6868 [arg1] "{r0}" (arg1),
6969 [arg2] "{r1}" (arg2),
70 [arg3] "{r2}" (arg3)
70 [arg3] "{r2}" (arg3),
7171 : "memory"
7272 );
7373}
......@@ -81,12 +81,12 @@ pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize)
8181 \\ ldr r7, [%[tmp]]
8282 \\ svc #0
8383 \\ ldr r7, [%[tmp], #4]
84 : [ret] "={r0}" (-> usize)
84 : [ret] "={r0}" (-> usize),
8585 : [tmp] "{r4}" (buf),
8686 [arg1] "{r0}" (arg1),
8787 [arg2] "{r1}" (arg2),
8888 [arg3] "{r2}" (arg3),
89 [arg4] "{r3}" (arg4)
89 [arg4] "{r3}" (arg4),
9090 : "memory"
9191 );
9292}
......@@ -100,13 +100,13 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize,
100100 \\ ldr r7, [%[tmp]]
101101 \\ svc #0
102102 \\ ldr r7, [%[tmp], #4]
103 : [ret] "={r0}" (-> usize)
103 : [ret] "={r0}" (-> usize),
104104 : [tmp] "{r5}" (buf),
105105 [arg1] "{r0}" (arg1),
106106 [arg2] "{r1}" (arg2),
107107 [arg3] "{r2}" (arg3),
108108 [arg4] "{r3}" (arg4),
109 [arg5] "{r4}" (arg5)
109 [arg5] "{r4}" (arg5),
110110 : "memory"
111111 );
112112}
......@@ -128,14 +128,14 @@ pub fn syscall6(
128128 \\ ldr r7, [%[tmp]]
129129 \\ svc #0
130130 \\ ldr r7, [%[tmp], #4]
131 : [ret] "={r0}" (-> usize)
131 : [ret] "={r0}" (-> usize),
132132 : [tmp] "{r6}" (buf),
133133 [arg1] "{r0}" (arg1),
134134 [arg2] "{r1}" (arg2),
135135 [arg3] "{r2}" (arg3),
136136 [arg4] "{r3}" (arg4),
137137 [arg5] "{r4}" (arg5),
138 [arg6] "{r5}" (arg6)
138 [arg6] "{r5}" (arg6),
139139 : "memory"
140140 );
141141}
......@@ -148,7 +148,7 @@ pub fn restore() callconv(.Naked) void {
148148 \\ mov r7, %[number]
149149 \\ svc #0
150150 :
151 : [number] "I" (@enumToInt(SYS.sigreturn))
151 : [number] "I" (@enumToInt(SYS.sigreturn)),
152152 );
153153}
154154
......@@ -157,7 +157,7 @@ pub fn restore_rt() callconv(.Naked) void {
157157 \\ mov r7, %[number]
158158 \\ svc #0
159159 :
160 : [number] "I" (@enumToInt(SYS.rt_sigreturn))
160 : [number] "I" (@enumToInt(SYS.rt_sigreturn)),
161161 : "memory"
162162 );
163163}
lib/std/os/linux/tls.zig+6-6
......@@ -131,7 +131,7 @@ pub fn setThreadPointer(addr: usize) void {
131131 // Update the %gs selector
132132 asm volatile ("movl %[gs_val], %%gs"
133133 :
134 : [gs_val] "r" (gdt_entry_number << 3 | 3)
134 : [gs_val] "r" (gdt_entry_number << 3 | 3),
135135 );
136136 },
137137 .x86_64 => {
......@@ -142,7 +142,7 @@ pub fn setThreadPointer(addr: usize) void {
142142 asm volatile (
143143 \\ msr tpidr_el0, %[addr]
144144 :
145 : [addr] "r" (addr)
145 : [addr] "r" (addr),
146146 );
147147 },
148148 .arm, .thumb => {
......@@ -153,7 +153,7 @@ pub fn setThreadPointer(addr: usize) void {
153153 asm volatile (
154154 \\ mv tp, %[addr]
155155 :
156 : [addr] "r" (addr)
156 : [addr] "r" (addr),
157157 );
158158 },
159159 .mips, .mipsel => {
......@@ -164,21 +164,21 @@ pub fn setThreadPointer(addr: usize) void {
164164 asm volatile (
165165 \\ mr 2, %[addr]
166166 :
167 : [addr] "r" (addr)
167 : [addr] "r" (addr),
168168 );
169169 },
170170 .powerpc64, .powerpc64le => {
171171 asm volatile (
172172 \\ mr 13, %[addr]
173173 :
174 : [addr] "r" (addr)
174 : [addr] "r" (addr),
175175 );
176176 },
177177 .sparcv9 => {
178178 asm volatile (
179179 \\ mov %[addr], %%g7
180180 :
181 : [addr] "r" (addr)
181 : [addr] "r" (addr),
182182 );
183183 },
184184 else => @compileError("Unsupported architecture"),
lib/std/os/linux/x86_64.zig+15-15
......@@ -2,63 +2,63 @@ usingnamespace @import("../bits/linux.zig");
22
33pub fn syscall0(number: SYS) usize {
44 return asm volatile ("syscall"
5 : [ret] "={rax}" (-> usize)
6 : [number] "{rax}" (@enumToInt(number))
5 : [ret] "={rax}" (-> usize),
6 : [number] "{rax}" (@enumToInt(number)),
77 : "rcx", "r11", "memory"
88 );
99}
1010
1111pub fn syscall1(number: SYS, arg1: usize) usize {
1212 return asm volatile ("syscall"
13 : [ret] "={rax}" (-> usize)
13 : [ret] "={rax}" (-> usize),
1414 : [number] "{rax}" (@enumToInt(number)),
15 [arg1] "{rdi}" (arg1)
15 [arg1] "{rdi}" (arg1),
1616 : "rcx", "r11", "memory"
1717 );
1818}
1919
2020pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
2121 return asm volatile ("syscall"
22 : [ret] "={rax}" (-> usize)
22 : [ret] "={rax}" (-> usize),
2323 : [number] "{rax}" (@enumToInt(number)),
2424 [arg1] "{rdi}" (arg1),
25 [arg2] "{rsi}" (arg2)
25 [arg2] "{rsi}" (arg2),
2626 : "rcx", "r11", "memory"
2727 );
2828}
2929
3030pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
3131 return asm volatile ("syscall"
32 : [ret] "={rax}" (-> usize)
32 : [ret] "={rax}" (-> usize),
3333 : [number] "{rax}" (@enumToInt(number)),
3434 [arg1] "{rdi}" (arg1),
3535 [arg2] "{rsi}" (arg2),
36 [arg3] "{rdx}" (arg3)
36 [arg3] "{rdx}" (arg3),
3737 : "rcx", "r11", "memory"
3838 );
3939}
4040
4141pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
4242 return asm volatile ("syscall"
43 : [ret] "={rax}" (-> usize)
43 : [ret] "={rax}" (-> usize),
4444 : [number] "{rax}" (@enumToInt(number)),
4545 [arg1] "{rdi}" (arg1),
4646 [arg2] "{rsi}" (arg2),
4747 [arg3] "{rdx}" (arg3),
48 [arg4] "{r10}" (arg4)
48 [arg4] "{r10}" (arg4),
4949 : "rcx", "r11", "memory"
5050 );
5151}
5252
5353pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
5454 return asm volatile ("syscall"
55 : [ret] "={rax}" (-> usize)
55 : [ret] "={rax}" (-> usize),
5656 : [number] "{rax}" (@enumToInt(number)),
5757 [arg1] "{rdi}" (arg1),
5858 [arg2] "{rsi}" (arg2),
5959 [arg3] "{rdx}" (arg3),
6060 [arg4] "{r10}" (arg4),
61 [arg5] "{r8}" (arg5)
61 [arg5] "{r8}" (arg5),
6262 : "rcx", "r11", "memory"
6363 );
6464}
......@@ -73,14 +73,14 @@ pub fn syscall6(
7373 arg6: usize,
7474) usize {
7575 return asm volatile ("syscall"
76 : [ret] "={rax}" (-> usize)
76 : [ret] "={rax}" (-> usize),
7777 : [number] "{rax}" (@enumToInt(number)),
7878 [arg1] "{rdi}" (arg1),
7979 [arg2] "{rsi}" (arg2),
8080 [arg3] "{rdx}" (arg3),
8181 [arg4] "{r10}" (arg4),
8282 [arg5] "{r8}" (arg5),
83 [arg6] "{r9}" (arg6)
83 [arg6] "{r9}" (arg6),
8484 : "rcx", "r11", "memory"
8585 );
8686}
......@@ -93,7 +93,7 @@ pub const restore = restore_rt;
9393pub fn restore_rt() callconv(.Naked) void {
9494 return asm volatile ("syscall"
9595 :
96 : [number] "{rax}" (@enumToInt(SYS.rt_sigreturn))
96 : [number] "{rax}" (@enumToInt(SYS.rt_sigreturn)),
9797 : "rcx", "r11", "memory"
9898 );
9999}
lib/std/os/windows.zig+3-3
......@@ -1723,15 +1723,15 @@ pub fn teb() *TEB {
17231723 return switch (builtin.target.cpu.arch) {
17241724 .i386 => asm volatile (
17251725 \\ movl %%fs:0x18, %[ptr]
1726 : [ptr] "=r" (-> *TEB)
1726 : [ptr] "=r" (-> *TEB),
17271727 ),
17281728 .x86_64 => asm volatile (
17291729 \\ movq %%gs:0x30, %[ptr]
1730 : [ptr] "=r" (-> *TEB)
1730 : [ptr] "=r" (-> *TEB),
17311731 ),
17321732 .aarch64 => asm volatile (
17331733 \\ mov %[ptr], x18
1734 : [ptr] "=r" (-> *TEB)
1734 : [ptr] "=r" (-> *TEB),
17351735 ),
17361736 else => @compileError("unsupported arch"),
17371737 };
lib/std/special/build_runner.zig+7
......@@ -245,6 +245,13 @@ fn usage(builder: *Builder, already_ran_build: bool, out_stream: anytype) !void
245245 });
246246 defer allocator.free(name);
247247 try out_stream.print("{s:<30} {s}\n", .{ name, option.description });
248 if (option.enum_options) |enum_options| {
249 const padding = " " ** 33;
250 try out_stream.writeAll(padding ++ "Supported Values:\n");
251 for (enum_options) |enum_option| {
252 try out_stream.print(padding ++ " {s}\n", .{enum_option});
253 }
254 }
248255 }
249256 }
250257
lib/std/special/compiler_rt/clear_cache.zig+3-3
......@@ -88,7 +88,7 @@ pub fn clear_cache(start: usize, end: usize) callconv(.C) void {
8888 asm volatile (
8989 \\mrs %[x], ctr_el0
9090 \\
91 : [x] "=r" (ctr_el0)
91 : [x] "=r" (ctr_el0),
9292 );
9393 // The DC and IC instructions must use 64-bit registers so we don't use
9494 // uintptr_t in case this runs in an IPL32 environment.
......@@ -101,7 +101,7 @@ pub fn clear_cache(start: usize, end: usize) callconv(.C) void {
101101 while (addr < end) : (addr += dcache_line_size) {
102102 asm volatile ("dc cvau, %[addr]"
103103 :
104 : [addr] "r" (addr)
104 : [addr] "r" (addr),
105105 );
106106 }
107107 }
......@@ -114,7 +114,7 @@ pub fn clear_cache(start: usize, end: usize) callconv(.C) void {
114114 while (addr < end) : (addr += icache_line_size) {
115115 asm volatile ("ic ivau, %[addr]"
116116 :
117 : [addr] "r" (addr)
117 : [addr] "r" (addr),
118118 );
119119 }
120120 }
lib/std/start.zig+13-13
......@@ -98,7 +98,7 @@ fn exit2(code: usize) noreturn {
9898 asm volatile ("syscall"
9999 :
100100 : [number] "{rax}" (231),
101 [arg1] "{rdi}" (code)
101 [arg1] "{rdi}" (code),
102102 : "rcx", "r11", "memory"
103103 );
104104 },
......@@ -106,7 +106,7 @@ fn exit2(code: usize) noreturn {
106106 asm volatile ("svc #0"
107107 :
108108 : [number] "{r7}" (1),
109 [arg1] "{r0}" (code)
109 [arg1] "{r0}" (code),
110110 : "memory"
111111 );
112112 },
......@@ -114,7 +114,7 @@ fn exit2(code: usize) noreturn {
114114 asm volatile ("svc #0"
115115 :
116116 : [number] "{x8}" (93),
117 [arg1] "{x0}" (code)
117 [arg1] "{x0}" (code),
118118 : "memory", "cc"
119119 );
120120 },
......@@ -128,7 +128,7 @@ fn exit2(code: usize) noreturn {
128128 \\push $0
129129 \\syscall
130130 :
131 : [syscall_number] "{rbp}" (8)
131 : [syscall_number] "{rbp}" (8),
132132 : "rcx", "r11", "memory"
133133 );
134134 },
......@@ -137,7 +137,7 @@ fn exit2(code: usize) noreturn {
137137 .aarch64 => {
138138 asm volatile ("svc #0"
139139 :
140 : [exit] "{x0}" (0x08)
140 : [exit] "{x0}" (0x08),
141141 : "memory", "cc"
142142 );
143143 },
......@@ -208,34 +208,34 @@ fn _start() callconv(.Naked) noreturn {
208208 .x86_64 => {
209209 argc_argv_ptr = asm volatile (
210210 \\ xor %%rbp, %%rbp
211 : [argc] "={rsp}" (-> [*]usize)
211 : [argc] "={rsp}" (-> [*]usize),
212212 );
213213 },
214214 .i386 => {
215215 argc_argv_ptr = asm volatile (
216216 \\ xor %%ebp, %%ebp
217 : [argc] "={esp}" (-> [*]usize)
217 : [argc] "={esp}" (-> [*]usize),
218218 );
219219 },
220220 .aarch64, .aarch64_be, .arm, .armeb, .thumb => {
221221 argc_argv_ptr = asm volatile (
222222 \\ mov fp, #0
223223 \\ mov lr, #0
224 : [argc] "={sp}" (-> [*]usize)
224 : [argc] "={sp}" (-> [*]usize),
225225 );
226226 },
227227 .riscv64 => {
228228 argc_argv_ptr = asm volatile (
229229 \\ li s0, 0
230230 \\ li ra, 0
231 : [argc] "={sp}" (-> [*]usize)
231 : [argc] "={sp}" (-> [*]usize),
232232 );
233233 },
234234 .mips, .mipsel => {
235235 // The lr is already zeroed on entry, as specified by the ABI.
236236 argc_argv_ptr = asm volatile (
237237 \\ move $fp, $0
238 : [argc] "={sp}" (-> [*]usize)
238 : [argc] "={sp}" (-> [*]usize),
239239 );
240240 },
241241 .powerpc => {
......@@ -246,7 +246,7 @@ fn _start() callconv(.Naked) noreturn {
246246 \\ stwu 1,-16(1)
247247 \\ stw 0, 0(1)
248248 \\ mtlr 0
249 : [argc] "={r4}" (-> [*]usize)
249 : [argc] "={r4}" (-> [*]usize),
250250 :
251251 : "r0"
252252 );
......@@ -259,7 +259,7 @@ fn _start() callconv(.Naked) noreturn {
259259 \\ li 0, 0
260260 \\ stdu 0, -32(1)
261261 \\ mtlr 0
262 : [argc] "={r4}" (-> [*]usize)
262 : [argc] "={r4}" (-> [*]usize),
263263 :
264264 : "r0"
265265 );
......@@ -269,7 +269,7 @@ fn _start() callconv(.Naked) noreturn {
269269 argc_argv_ptr = asm (
270270 \\ mov %%g0, %%i6
271271 \\ add %%o6, 2175, %[argc]
272 : [argc] "=r" (-> [*]usize)
272 : [argc] "=r" (-> [*]usize),
273273 );
274274 },
275275 else => @compileError("unsupported arch"),
lib/std/valgrind.zig+4-4
......@@ -13,9 +13,9 @@ pub fn doClientRequest(default: usize, request: usize, a1: usize, a2: usize, a3:
1313 \\ roll $3, %%edi ; roll $13, %%edi
1414 \\ roll $29, %%edi ; roll $19, %%edi
1515 \\ xchgl %%ebx,%%ebx
16 : [_] "={edx}" (-> usize)
16 : [_] "={edx}" (-> usize),
1717 : [_] "{eax}" (&[_]usize{ request, a1, a2, a3, a4, a5 }),
18 [_] "0" (default)
18 [_] "0" (default),
1919 : "cc", "memory"
2020 );
2121 },
......@@ -24,9 +24,9 @@ pub fn doClientRequest(default: usize, request: usize, a1: usize, a2: usize, a3:
2424 \\ rolq $3, %%rdi ; rolq $13, %%rdi
2525 \\ rolq $61, %%rdi ; rolq $51, %%rdi
2626 \\ xchgq %%rbx,%%rbx
27 : [_] "={rdx}" (-> usize)
27 : [_] "={rdx}" (-> usize),
2828 : [_] "{rax}" (&[_]usize{ request, a1, a2, a3, a4, a5 }),
29 [_] "0" (default)
29 [_] "0" (default),
3030 : "cc", "memory"
3131 );
3232 },
lib/std/zig/parser_test.zig+15-29
......@@ -1,5 +1,5 @@
11test "zig fmt: preserves clobbers in inline asm with stray comma" {
2 try testTransform(
2 try testCanonical(
33 \\fn foo() void {
44 \\ asm volatile (""
55 \\ : [_] "" (-> type),
......@@ -13,20 +13,6 @@ test "zig fmt: preserves clobbers in inline asm with stray comma" {
1313 \\ );
1414 \\}
1515 \\
16 ,
17 \\fn foo() void {
18 \\ asm volatile (""
19 \\ : [_] "" (-> type)
20 \\ :
21 \\ : "clobber"
22 \\ );
23 \\ asm volatile (""
24 \\ :
25 \\ : [_] "" (type)
26 \\ : "clobber"
27 \\ );
28 \\}
29 \\
3016 );
3117}
3218
......@@ -508,15 +494,15 @@ test "zig fmt: asm expression with comptime content" {
508494 \\pub fn main() void {
509495 \\ asm volatile ("foo" ++ "bar");
510496 \\ asm volatile ("foo" ++ "bar"
511 \\ : [_] "" (x)
497 \\ : [_] "" (x),
512498 \\ );
513499 \\ asm volatile ("foo" ++ "bar"
514 \\ : [_] "" (x)
515 \\ : [_] "" (y)
500 \\ : [_] "" (x),
501 \\ : [_] "" (y),
516502 \\ );
517503 \\ asm volatile ("foo" ++ "bar"
518 \\ : [_] "" (x)
519 \\ : [_] "" (y)
504 \\ : [_] "" (x),
505 \\ : [_] "" (y),
520506 \\ : "h", "e", "l", "l", "o"
521507 \\ );
522508 \\}
......@@ -2058,11 +2044,11 @@ test "zig fmt: simple asm" {
20582044 \\ );
20592045 \\
20602046 \\ asm ("not real assembly"
2061 \\ : [a] "x" (x)
2047 \\ : [a] "x" (x),
20622048 \\ );
20632049 \\ asm ("not real assembly"
2064 \\ : [a] "x" (-> i32)
2065 \\ : [a] "x" (1)
2050 \\ : [a] "x" (-> i32),
2051 \\ : [a] "x" (1),
20662052 \\ );
20672053 \\ asm ("still not real assembly" ::: "a", "b");
20682054 \\}
......@@ -3712,9 +3698,9 @@ test "zig fmt: inline asm" {
37123698 try testCanonical(
37133699 \\pub fn syscall1(number: usize, arg1: usize) usize {
37143700 \\ return asm volatile ("syscall"
3715 \\ : [ret] "={rax}" (-> usize)
3701 \\ : [ret] "={rax}" (-> usize),
37163702 \\ : [number] "{rax}" (number),
3717 \\ [arg1] "{rdi}" (arg1)
3703 \\ [arg1] "{rdi}" (arg1),
37183704 \\ : "rcx", "r11"
37193705 \\ );
37203706 \\}
......@@ -3817,14 +3803,14 @@ test "zig fmt: inline asm parameter alignment" {
38173803 \\ \\ foo
38183804 \\ \\ bar
38193805 \\ : [_] "" (-> usize),
3820 \\ [_] "" (-> usize)
3806 \\ [_] "" (-> usize),
38213807 \\ );
38223808 \\ asm volatile (
38233809 \\ \\ foo
38243810 \\ \\ bar
38253811 \\ :
38263812 \\ : [_] "" (0),
3827 \\ [_] "" (0)
3813 \\ [_] "" (0),
38283814 \\ );
38293815 \\ asm volatile (
38303816 \\ \\ foo
......@@ -3834,9 +3820,9 @@ test "zig fmt: inline asm parameter alignment" {
38343820 \\ \\ foo
38353821 \\ \\ bar
38363822 \\ : [_] "" (-> usize),
3837 \\ [_] "" (-> usize)
3823 \\ [_] "" (-> usize),
38383824 \\ : [_] "" (0),
3839 \\ [_] "" (0)
3825 \\ [_] "" (0),
38403826 \\ : "", ""
38413827 \\ );
38423828 \\}
lib/std/zig/render.zig+4-4
......@@ -1944,13 +1944,13 @@ fn renderAsm(
19441944 try renderToken(ais, tree, comma, .newline); // ,
19451945 try renderExtraNewlineToken(ais, tree, tree.firstToken(next_asm_output));
19461946 } else if (asm_node.inputs.len == 0 and asm_node.first_clobber == null) {
1947 try renderAsmOutput(gpa, ais, tree, asm_output, .newline);
1947 try renderAsmOutput(gpa, ais, tree, asm_output, .comma);
19481948 ais.popIndent();
19491949 ais.setIndentDelta(indent_delta);
19501950 ais.popIndent();
19511951 return renderToken(ais, tree, asm_node.ast.rparen, space); // rparen
19521952 } else {
1953 try renderAsmOutput(gpa, ais, tree, asm_output, .newline);
1953 try renderAsmOutput(gpa, ais, tree, asm_output, .comma);
19541954 const comma_or_colon = tree.lastToken(asm_output) + 1;
19551955 ais.popIndent();
19561956 break :colon2 switch (token_tags[comma_or_colon]) {
......@@ -1976,13 +1976,13 @@ fn renderAsm(
19761976 try renderToken(ais, tree, first_token - 1, .newline); // ,
19771977 try renderExtraNewlineToken(ais, tree, first_token);
19781978 } else if (asm_node.first_clobber == null) {
1979 try renderAsmInput(gpa, ais, tree, asm_input, .newline);
1979 try renderAsmInput(gpa, ais, tree, asm_input, .comma);
19801980 ais.popIndent();
19811981 ais.setIndentDelta(indent_delta);
19821982 ais.popIndent();
19831983 return renderToken(ais, tree, asm_node.ast.rparen, space); // rparen
19841984 } else {
1985 try renderAsmInput(gpa, ais, tree, asm_input, .newline);
1985 try renderAsmInput(gpa, ais, tree, asm_input, .comma);
19861986 const comma_or_colon = tree.lastToken(asm_input) + 1;
19871987 ais.popIndent();
19881988 break :colon3 switch (token_tags[comma_or_colon]) {
lib/std/zig/system/x86.zig+2-2
......@@ -543,7 +543,7 @@ fn cpuid(leaf_id: u32, subid: u32) CpuidLeaf {
543543 :
544544 : [leaf_id] "{eax}" (leaf_id),
545545 [subid] "{ecx}" (subid),
546 [leaf_ptr] "r" (&cpuid_leaf)
546 [leaf_ptr] "r" (&cpuid_leaf),
547547 : "eax", "ebx", "ecx", "edx"
548548 );
549549
......@@ -555,7 +555,7 @@ fn getXCR0() u32 {
555555 return asm volatile (
556556 \\ xor %%ecx, %%ecx
557557 \\ xgetbv
558 : [ret] "={eax}" (-> u32)
558 : [ret] "={eax}" (-> u32),
559559 :
560560 : "eax", "edx", "ecx"
561561 );
src/AstGen.zig+143-134
......@@ -2883,8 +2883,6 @@ fn fnDecl(
28832883 };
28842884 const fn_name_str_index = try astgen.identAsString(fn_name_token);
28852885
2886 try astgen.declareNewName(scope, fn_name_str_index, decl_node, fn_name_token);
2887
28882886 // We insert this at the beginning so that its instruction index marks the
28892887 // start of the top level declaration.
28902888 const block_inst = try gz.addBlock(.block_inline, fn_proto.ast.proto_node);
......@@ -3153,8 +3151,6 @@ fn globalVarDecl(
31533151 const name_token = var_decl.ast.mut_token + 1;
31543152 const name_str_index = try astgen.identAsString(name_token);
31553153
3156 try astgen.declareNewName(scope, name_str_index, node, name_token);
3157
31583154 var block_scope: GenZir = .{
31593155 .parent = scope,
31603156 .decl_node_index = node,
......@@ -3509,9 +3505,11 @@ fn structDeclInner(
35093505 };
35103506 defer block_scope.instructions.deinit(gpa);
35113507
3512 var namespace: Scope.Namespace = .{ .parent = scope };
3508 var namespace: Scope.Namespace = .{ .parent = scope, .node = node };
35133509 defer namespace.decls.deinit(gpa);
35143510
3511 try astgen.scanDecls(&namespace, container_decl.ast.members);
3512
35153513 var wip_decls: WipDecls = .{};
35163514 defer wip_decls.deinit(gpa);
35173515
......@@ -3671,7 +3669,7 @@ fn structDeclInner(
36713669 const field_type: Zir.Inst.Ref = if (node_tags[member.ast.type_expr] == .@"anytype")
36723670 .none
36733671 else
3674 try typeExpr(&block_scope, &block_scope.base, member.ast.type_expr);
3672 try typeExpr(&block_scope, &namespace.base, member.ast.type_expr);
36753673 fields_data.appendAssumeCapacity(@enumToInt(field_type));
36763674
36773675 known_has_bits = known_has_bits or nodeImpliesRuntimeBits(tree, member.ast.type_expr);
......@@ -3687,13 +3685,13 @@ fn structDeclInner(
36873685 (@as(u32, @boolToInt(unused)) << 31);
36883686
36893687 if (have_align) {
3690 const align_inst = try expr(&block_scope, &block_scope.base, align_rl, member.ast.align_expr);
3688 const align_inst = try expr(&block_scope, &namespace.base, align_rl, member.ast.align_expr);
36913689 fields_data.appendAssumeCapacity(@enumToInt(align_inst));
36923690 }
36933691 if (have_value) {
36943692 const rl: ResultLoc = if (field_type == .none) .none else .{ .ty = field_type };
36953693
3696 const default_inst = try expr(&block_scope, &block_scope.base, rl, member.ast.value_expr);
3694 const default_inst = try expr(&block_scope, &namespace.base, rl, member.ast.value_expr);
36973695 fields_data.appendAssumeCapacity(@enumToInt(default_inst));
36983696 } else if (member.comptime_token) |comptime_token| {
36993697 return astgen.failTok(comptime_token, "comptime field without default initialization value", .{});
......@@ -3756,7 +3754,7 @@ fn unionDeclInner(
37563754 node: ast.Node.Index,
37573755 members: []const ast.Node.Index,
37583756 layout: std.builtin.TypeInfo.ContainerLayout,
3759 arg_inst: Zir.Inst.Ref,
3757 arg_node: ast.Node.Index,
37603758 have_auto_enum: bool,
37613759) InnerError!Zir.Inst.Ref {
37623760 const astgen = gz.astgen;
......@@ -3778,9 +3776,16 @@ fn unionDeclInner(
37783776 };
37793777 defer block_scope.instructions.deinit(gpa);
37803778
3781 var namespace: Scope.Namespace = .{ .parent = scope };
3779 var namespace: Scope.Namespace = .{ .parent = scope, .node = node };
37823780 defer namespace.decls.deinit(gpa);
37833781
3782 try astgen.scanDecls(&namespace, members);
3783
3784 const arg_inst: Zir.Inst.Ref = if (arg_node != 0)
3785 try typeExpr(gz, &namespace.base, arg_node)
3786 else
3787 .none;
3788
37843789 var wip_decls: WipDecls = .{};
37853790 defer wip_decls.deinit(gpa);
37863791
......@@ -3946,7 +3951,7 @@ fn unionDeclInner(
39463951 (@as(u32, @boolToInt(unused)) << 31);
39473952
39483953 if (have_type and node_tags[member.ast.type_expr] != .@"anytype") {
3949 const field_type = try typeExpr(&block_scope, &block_scope.base, member.ast.type_expr);
3954 const field_type = try typeExpr(&block_scope, &namespace.base, member.ast.type_expr);
39503955 fields_data.appendAssumeCapacity(@enumToInt(field_type));
39513956 }
39523957 if (have_align) {
......@@ -4046,11 +4051,6 @@ fn containerDecl(
40464051 // We must not create any types until Sema. Here the goal is only to generate
40474052 // ZIR for all the field types, alignments, and default value expressions.
40484053
4049 const arg_inst: Zir.Inst.Ref = if (container_decl.ast.arg != 0)
4050 try comptimeExpr(gz, scope, .{ .ty = .type_type }, container_decl.ast.arg)
4051 else
4052 .none;
4053
40544054 switch (token_tags[container_decl.ast.main_token]) {
40554055 .keyword_struct => {
40564056 const layout = if (container_decl.layout_token) |t| switch (token_tags[t]) {
......@@ -4059,7 +4059,7 @@ fn containerDecl(
40594059 else => unreachable,
40604060 } else std.builtin.TypeInfo.ContainerLayout.Auto;
40614061
4062 assert(arg_inst == .none);
4062 assert(container_decl.ast.arg == 0);
40634063
40644064 const result = try structDeclInner(gz, scope, node, container_decl, layout);
40654065 return rvalue(gz, rl, result, node);
......@@ -4073,7 +4073,7 @@ fn containerDecl(
40734073
40744074 const have_auto_enum = container_decl.ast.enum_token != null;
40754075
4076 const result = try unionDeclInner(gz, scope, node, container_decl.ast.members, layout, arg_inst, have_auto_enum);
4076 const result = try unionDeclInner(gz, scope, node, container_decl.ast.members, layout, container_decl.ast.arg, have_auto_enum);
40774077 return rvalue(gz, rl, result, node);
40784078 },
40794079 .keyword_enum => {
......@@ -4140,7 +4140,7 @@ fn containerDecl(
41404140 }
41414141 total_fields += 1;
41424142 if (member.ast.value_expr != 0) {
4143 if (arg_inst == .none) {
4143 if (container_decl.ast.arg == 0) {
41444144 return astgen.failNode(member.ast.value_expr, "value assigned to enum tag with inferred tag type", .{});
41454145 }
41464146 values += 1;
......@@ -4159,7 +4159,7 @@ fn containerDecl(
41594159 // must be at least one tag.
41604160 return astgen.failNode(node, "enum declarations must have at least one tag", .{});
41614161 }
4162 if (counts.nonexhaustive_node != 0 and arg_inst == .none) {
4162 if (counts.nonexhaustive_node != 0 and container_decl.ast.arg == 0) {
41634163 return astgen.failNodeNotes(
41644164 node,
41654165 "non-exhaustive enum missing integer tag type",
......@@ -4189,9 +4189,16 @@ fn containerDecl(
41894189 };
41904190 defer block_scope.instructions.deinit(gpa);
41914191
4192 var namespace: Scope.Namespace = .{ .parent = scope };
4192 var namespace: Scope.Namespace = .{ .parent = scope, .node = node };
41934193 defer namespace.decls.deinit(gpa);
41944194
4195 try astgen.scanDecls(&namespace, container_decl.ast.members);
4196
4197 const arg_inst: Zir.Inst.Ref = if (container_decl.ast.arg != 0)
4198 try comptimeExpr(gz, &namespace.base, .{ .ty = .type_type }, container_decl.ast.arg)
4199 else
4200 .none;
4201
41954202 var wip_decls: WipDecls = .{};
41964203 defer wip_decls.deinit(gpa);
41974204
......@@ -4364,7 +4371,7 @@ fn containerDecl(
43644371 },
43654372 );
43664373 }
4367 const tag_value_inst = try expr(&block_scope, &block_scope.base, .{ .ty = arg_inst }, member.ast.value_expr);
4374 const tag_value_inst = try expr(&block_scope, &namespace.base, .{ .ty = arg_inst }, member.ast.value_expr);
43684375 fields_data.appendAssumeCapacity(@enumToInt(tag_value_inst));
43694376 }
43704377
......@@ -4416,9 +4423,13 @@ fn containerDecl(
44164423 return rvalue(gz, rl, indexToRef(decl_inst), node);
44174424 },
44184425 .keyword_opaque => {
4419 var namespace: Scope.Namespace = .{ .parent = scope };
4426 assert(container_decl.ast.arg == 0);
4427
4428 var namespace: Scope.Namespace = .{ .parent = scope, .node = node };
44204429 defer namespace.decls.deinit(gpa);
44214430
4431 try astgen.scanDecls(&namespace, container_decl.ast.members);
4432
44224433 var wip_decls: WipDecls = .{};
44234434 defer wip_decls.deinit(gpa);
44244435
......@@ -6352,73 +6363,63 @@ fn identifier(
63526363
63536364 // Local variables, including function parameters.
63546365 const name_str_index = try astgen.identAsString(ident_token);
6355 {
6356 var s = scope;
6357 var found_already: ?ast.Node.Index = null; // we have found a decl with the same name already
6358 var hit_namespace = false;
6359 while (true) switch (s.tag) {
6360 .local_val => {
6361 const local_val = s.cast(Scope.LocalVal).?;
6362
6363 if (local_val.name == name_str_index) {
6364 local_val.used = true;
6365 // Captures of non-locals need to be emitted as decl_val or decl_ref.
6366 // This *might* be capturable depending on if it is comptime known.
6367 if (!hit_namespace) {
6368 return rvalue(gz, rl, local_val.inst, ident);
6369 }
6366 var s = scope;
6367 var found_already: ?ast.Node.Index = null; // we have found a decl with the same name already
6368 var hit_namespace: ast.Node.Index = 0;
6369 while (true) switch (s.tag) {
6370 .local_val => {
6371 const local_val = s.cast(Scope.LocalVal).?;
6372
6373 if (local_val.name == name_str_index) {
6374 local_val.used = true;
6375 // Locals cannot shadow anything, so we do not need to look for ambiguous
6376 // references in this case.
6377 return rvalue(gz, rl, local_val.inst, ident);
6378 }
6379 s = local_val.parent;
6380 },
6381 .local_ptr => {
6382 const local_ptr = s.cast(Scope.LocalPtr).?;
6383 if (local_ptr.name == name_str_index) {
6384 local_ptr.used = true;
6385 if (hit_namespace != 0 and !local_ptr.maybe_comptime) {
6386 return astgen.failNodeNotes(ident, "mutable '{s}' not accessible from here", .{ident_name}, &.{
6387 try astgen.errNoteTok(local_ptr.token_src, "declared mutable here", .{}),
6388 try astgen.errNoteNode(hit_namespace, "crosses namespace boundary here", .{}),
6389 });
63706390 }
6371 s = local_val.parent;
6372 },
6373 .local_ptr => {
6374 const local_ptr = s.cast(Scope.LocalPtr).?;
6375 if (local_ptr.name == name_str_index) {
6376 local_ptr.used = true;
6377 if (hit_namespace) {
6378 if (local_ptr.maybe_comptime)
6379 break
6380 else
6381 return astgen.failNodeNotes(ident, "'{s}' not accessible from inner function", .{ident_name}, &.{
6382 try astgen.errNoteTok(local_ptr.token_src, "declared here", .{}),
6383 // TODO add crossed function definition here note.
6384 // Maybe add a note to the error about it being because of the var,
6385 // maybe recommend copying it into a const variable. -SpexGuy
6386 });
6387 }
6388 switch (rl) {
6389 .ref, .none_or_ref => return local_ptr.ptr,
6390 else => {
6391 const loaded = try gz.addUnNode(.load, local_ptr.ptr, ident);
6392 return rvalue(gz, rl, loaded, ident);
6393 },
6394 }
6391 switch (rl) {
6392 .ref, .none_or_ref => return local_ptr.ptr,
6393 else => {
6394 const loaded = try gz.addUnNode(.load, local_ptr.ptr, ident);
6395 return rvalue(gz, rl, loaded, ident);
6396 },
63956397 }
6396 s = local_ptr.parent;
6397 },
6398 .gen_zir => s = s.cast(GenZir).?.parent,
6399 .defer_normal, .defer_error => s = s.cast(Scope.Defer).?.parent,
6400 // look for ambiguous references to decls
6401 .namespace => {
6402 const ns = s.cast(Scope.Namespace).?;
6403 if (ns.decls.get(name_str_index)) |i| {
6404 if (found_already) |f|
6405 return astgen.failNodeNotes(ident, "ambiguous reference", .{}, &.{
6406 try astgen.errNoteNode(i, "declared here", .{}),
6407 try astgen.errNoteNode(f, "also declared here", .{}),
6408 })
6409 else
6410 found_already = i;
6398 }
6399 s = local_ptr.parent;
6400 },
6401 .gen_zir => s = s.cast(GenZir).?.parent,
6402 .defer_normal, .defer_error => s = s.cast(Scope.Defer).?.parent,
6403 .namespace => {
6404 const ns = s.cast(Scope.Namespace).?;
6405 if (ns.decls.get(name_str_index)) |i| {
6406 if (found_already) |f| {
6407 return astgen.failNodeNotes(ident, "ambiguous reference", .{}, &.{
6408 try astgen.errNoteNode(f, "declared here", .{}),
6409 try astgen.errNoteNode(i, "also declared here", .{}),
6410 });
64116411 }
6412 hit_namespace = true;
6413 s = ns.parent;
6414 },
6415 .top => break,
6416 };
6417 }
6412 // We found a match but must continue looking for ambiguous references to decls.
6413 found_already = i;
6414 }
6415 hit_namespace = ns.node;
6416 s = ns.parent;
6417 },
6418 .top => break,
6419 };
64186420
6419 // We can't look up Decls until Sema because the same ZIR code is supposed to be
6420 // used for multiple generic instantiations, and this may refer to a different Decl
6421 // depending on the scope, determined by the generic instantiation.
6421 // Decl references happen by name rather than ZIR index so that when unrelated
6422 // decls are modified, ZIR code containing references to them can be unmodified.
64226423 switch (rl) {
64236424 .ref, .none_or_ref => return gz.addStrTok(.decl_ref, name_str_index, ident_token),
64246425 else => {
......@@ -8383,7 +8384,7 @@ fn nodeImpliesRuntimeBits(tree: *const ast.Tree, start_node: ast.Node.Index) boo
83838384 }
83848385}
83858386
8386/// Applies `rl` semantics to `inst`. Expressions which do not do their own handling of
8387/// Applies `rl` semantics to `result`. Expressions which do not do their own handling of
83878388/// result locations must call this function on their result.
83888389/// As an example, if the `ResultLoc` is `ptr`, it will write the result to the pointer.
83898390/// If the `ResultLoc` is `ty`, it will coerce the result to the type.
......@@ -8393,6 +8394,7 @@ fn rvalue(
83938394 result: Zir.Inst.Ref,
83948395 src_node: ast.Node.Index,
83958396) InnerError!Zir.Inst.Ref {
8397 if (gz.endsWithNoReturn()) return result;
83968398 switch (rl) {
83978399 .none, .none_or_ref, .coerced_ty => return result,
83988400 .discard => {
......@@ -8941,6 +8943,7 @@ const Scope = struct {
89418943 /// Maps string table index to the source location of declaration,
89428944 /// for the purposes of reporting name shadowing compile errors.
89438945 decls: std.AutoHashMapUnmanaged(u32, ast.Node.Index) = .{},
8946 node: ast.Node.Index,
89448947 };
89458948
89468949 const Top = struct {
......@@ -10014,53 +10017,6 @@ fn nullTerminatedString(astgen: AstGen, index: usize) [*:0]const u8 {
1001410017 return @ptrCast([*:0]const u8, astgen.string_bytes.items.ptr) + index;
1001510018}
1001610019
10017fn declareNewName(
10018 astgen: *AstGen,
10019 start_scope: *Scope,
10020 name_index: u32,
10021 node: ast.Node.Index,
10022 name_token: ast.TokenIndex,
10023) !void {
10024 const gpa = astgen.gpa;
10025
10026 const token_bytes = astgen.tree.tokenSlice(name_token);
10027 if (token_bytes[0] != '@' and isPrimitive(token_bytes)) {
10028 return astgen.failTokNotes(name_token, "name shadows primitive '{s}'", .{
10029 token_bytes,
10030 }, &[_]u32{
10031 try astgen.errNoteTok(name_token, "consider using @\"{s}\" to disambiguate", .{
10032 token_bytes,
10033 }),
10034 });
10035 }
10036
10037 var scope = start_scope;
10038 while (true) {
10039 switch (scope.tag) {
10040 .gen_zir => scope = scope.cast(GenZir).?.parent,
10041 .local_val => scope = scope.cast(Scope.LocalVal).?.parent,
10042 .local_ptr => scope = scope.cast(Scope.LocalPtr).?.parent,
10043 .defer_normal, .defer_error => scope = scope.cast(Scope.Defer).?.parent,
10044 .namespace => {
10045 const ns = scope.cast(Scope.Namespace).?;
10046 const gop = try ns.decls.getOrPut(gpa, name_index);
10047 if (gop.found_existing) {
10048 const name = try gpa.dupe(u8, mem.span(astgen.nullTerminatedString(name_index)));
10049 defer gpa.free(name);
10050 return astgen.failNodeNotes(node, "redeclaration of '{s}'", .{
10051 name,
10052 }, &[_]u32{
10053 try astgen.errNoteNode(gop.value_ptr.*, "other declaration here", .{}),
10054 });
10055 }
10056 gop.value_ptr.* = node;
10057 break;
10058 },
10059 .top => break,
10060 }
10061 }
10062}
10063
1006410020fn isPrimitive(name: []const u8) bool {
1006510021 if (simple_types.get(name) != null) return true;
1006610022 if (name.len < 2) return false;
......@@ -10183,3 +10139,56 @@ fn refToIndex(inst: Zir.Inst.Ref) ?Zir.Inst.Index {
1018310139 return null;
1018410140 }
1018510141}
10142
10143fn scanDecls(astgen: *AstGen, namespace: *Scope.Namespace, members: []const ast.Node.Index) !void {
10144 const gpa = astgen.gpa;
10145 const tree = astgen.tree;
10146 const node_tags = tree.nodes.items(.tag);
10147 const main_tokens = tree.nodes.items(.main_token);
10148 for (members) |member_node| {
10149 const name_token = switch (node_tags[member_node]) {
10150 .fn_decl,
10151 .fn_proto_simple,
10152 .fn_proto_multi,
10153 .fn_proto_one,
10154 .fn_proto,
10155 .global_var_decl,
10156 .local_var_decl,
10157 .simple_var_decl,
10158 .aligned_var_decl,
10159 => main_tokens[member_node] + 1,
10160
10161 else => continue,
10162 };
10163
10164 const token_bytes = astgen.tree.tokenSlice(name_token);
10165 if (token_bytes[0] != '@' and isPrimitive(token_bytes)) {
10166 switch (astgen.failTokNotes(name_token, "name shadows primitive '{s}'", .{
10167 token_bytes,
10168 }, &[_]u32{
10169 try astgen.errNoteTok(name_token, "consider using @\"{s}\" to disambiguate", .{
10170 token_bytes,
10171 }),
10172 })) {
10173 error.AnalysisFail => continue,
10174 error.OutOfMemory => return error.OutOfMemory,
10175 }
10176 }
10177
10178 const name_str_index = try astgen.identAsString(name_token);
10179 const gop = try namespace.decls.getOrPut(gpa, name_str_index);
10180 if (gop.found_existing) {
10181 const name = try gpa.dupe(u8, mem.span(astgen.nullTerminatedString(name_str_index)));
10182 defer gpa.free(name);
10183 switch (astgen.failNodeNotes(member_node, "redeclaration of '{s}'", .{
10184 name,
10185 }, &[_]u32{
10186 try astgen.errNoteNode(gop.value_ptr.*, "other declaration here", .{}),
10187 })) {
10188 error.AnalysisFail => continue,
10189 error.OutOfMemory => return error.OutOfMemory,
10190 }
10191 }
10192 gop.value_ptr.* = member_node;
10193 }
10194}
src/Module.zig+4-1
......@@ -2648,7 +2648,10 @@ pub fn astGenFile(mod: *Module, file: *Scope.File) !void {
26482648 undefined;
26492649 defer if (data_has_safety_tag) gpa.free(safety_buffer);
26502650 const data_ptr = if (data_has_safety_tag)
2651 @ptrCast([*]const u8, safety_buffer.ptr)
2651 if (file.zir.instructions.len == 0)
2652 @as([*]const u8, undefined)
2653 else
2654 @ptrCast([*]const u8, safety_buffer.ptr)
26522655 else
26532656 @ptrCast([*]const u8, file.zir.instructions.items(.data).ptr);
26542657 if (data_has_safety_tag) {
src/codegen.zig+50-16
......@@ -5210,25 +5210,59 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type {
52105210 return error.CodegenFail;
52115211 }
52125212
5213 usingnamespace switch (arch) {
5214 .i386 => @import("codegen/x86.zig"),
5215 .x86_64 => @import("codegen/x86_64.zig"),
5216 .riscv64 => @import("codegen/riscv64.zig"),
5217 .arm, .armeb => @import("codegen/arm.zig"),
5218 .aarch64, .aarch64_be, .aarch64_32 => @import("codegen/aarch64.zig"),
5219 else => struct {
5220 pub const Register = enum {
5221 dummy,
5222
5223 pub fn allocIndex(self: Register) ?u4 {
5224 _ = self;
5225 return null;
5226 }
5227 };
5228 pub const callee_preserved_regs = [_]Register{};
5213 const Register = switch (arch) {
5214 .i386 => @import("codegen/x86.zig").Register,
5215 .x86_64 => @import("codegen/x86_64.zig").Register,
5216 .riscv64 => @import("codegen/riscv64.zig").Register,
5217 .arm, .armeb => @import("codegen/arm.zig").Register,
5218 .aarch64, .aarch64_be, .aarch64_32 => @import("codegen/aarch64.zig").Register,
5219 else => enum {
5220 dummy,
5221
5222 pub fn allocIndex(self: Register) ?u4 {
5223 _ = self;
5224 return null;
5225 }
52295226 },
52305227 };
52315228
5229 const Instruction = switch (arch) {
5230 .riscv64 => @import("codegen/riscv64.zig").Instruction,
5231 .arm, .armeb => @import("codegen/arm.zig").Instruction,
5232 .aarch64, .aarch64_be, .aarch64_32 => @import("codegen/aarch64.zig").Instruction,
5233 else => void,
5234 };
5235
5236 const Condition = switch (arch) {
5237 .arm, .armeb => @import("codegen/arm.zig").Condition,
5238 else => void,
5239 };
5240
5241 const callee_preserved_regs = switch (arch) {
5242 .i386 => @import("codegen/x86.zig").callee_preserved_regs,
5243 .x86_64 => @import("codegen/x86_64.zig").callee_preserved_regs,
5244 .riscv64 => @import("codegen/riscv64.zig").callee_preserved_regs,
5245 .arm, .armeb => @import("codegen/arm.zig").callee_preserved_regs,
5246 .aarch64, .aarch64_be, .aarch64_32 => @import("codegen/aarch64.zig").callee_preserved_regs,
5247 else => [_]Register{},
5248 };
5249
5250 const c_abi_int_param_regs = switch (arch) {
5251 .i386 => @import("codegen/x86.zig").c_abi_int_param_regs,
5252 .x86_64 => @import("codegen/x86_64.zig").c_abi_int_param_regs,
5253 .arm, .armeb => @import("codegen/arm.zig").c_abi_int_param_regs,
5254 .aarch64, .aarch64_be, .aarch64_32 => @import("codegen/aarch64.zig").c_abi_int_param_regs,
5255 else => [_]Register{},
5256 };
5257
5258 const c_abi_int_return_regs = switch (arch) {
5259 .i386 => @import("codegen/x86.zig").c_abi_int_return_regs,
5260 .x86_64 => @import("codegen/x86_64.zig").c_abi_int_return_regs,
5261 .arm, .armeb => @import("codegen/arm.zig").c_abi_int_return_regs,
5262 .aarch64, .aarch64_be, .aarch64_32 => @import("codegen/aarch64.zig").c_abi_int_return_regs,
5263 else => [_]Register{},
5264 };
5265
52325266 fn parseRegName(name: []const u8) ?Register {
52335267 if (@hasDecl(Register, "parseRegName")) {
52345268 return Register.parseRegName(name);
src/codegen/arm.zig+2-2
......@@ -886,11 +886,11 @@ pub const Instruction = union(enum) {
886886 return dataProcessing(cond, .mov, 1, rd, .r0, op2);
887887 }
888888
889 pub fn bic(cond: Condition, rd: Register, op2: Operand) Instruction {
889 pub fn bic(cond: Condition, rd: Register, rn: Register, op2: Operand) Instruction {
890890 return dataProcessing(cond, .bic, 0, rd, rn, op2);
891891 }
892892
893 pub fn bics(cond: Condition, rd: Register, op2: Operand) Instruction {
893 pub fn bics(cond: Condition, rd: Register, rn: Register, op2: Operand) Instruction {
894894 return dataProcessing(cond, .bic, 1, rd, rn, op2);
895895 }
896896
src/codegen/llvm.zig+142-9
......@@ -169,7 +169,7 @@ pub const Object = struct {
169169 const context = llvm.Context.create();
170170 errdefer context.dispose();
171171
172 initializeLLVMTargets();
172 initializeLLVMTarget(options.target.cpu.arch);
173173
174174 const root_nameZ = try gpa.dupeZ(u8, options.root_name);
175175 defer gpa.free(root_nameZ);
......@@ -258,14 +258,6 @@ pub const Object = struct {
258258 gpa.destroy(self);
259259 }
260260
261 fn initializeLLVMTargets() void {
262 llvm.initializeAllTargets();
263 llvm.initializeAllTargetInfos();
264 llvm.initializeAllTargetMCs();
265 llvm.initializeAllAsmPrinters();
266 llvm.initializeAllAsmParsers();
267 }
268
269261 fn locPath(
270262 arena: *Allocator,
271263 opt_loc: ?Compilation.EmitLoc,
......@@ -1960,3 +1952,144 @@ pub const FuncGen = struct {
19601952 return self.llvmModule().getIntrinsicDeclaration(id, null, 0);
19611953 }
19621954};
1955
1956fn initializeLLVMTarget(arch: std.Target.Cpu.Arch) void {
1957 switch (arch) {
1958 .aarch64, .aarch64_be, .aarch64_32 => {
1959 llvm.LLVMInitializeAArch64Target();
1960 llvm.LLVMInitializeAArch64TargetInfo();
1961 llvm.LLVMInitializeAArch64TargetMC();
1962 llvm.LLVMInitializeAArch64AsmPrinter();
1963 llvm.LLVMInitializeAArch64AsmParser();
1964 },
1965 .amdgcn => {
1966 llvm.LLVMInitializeAMDGPUTarget();
1967 llvm.LLVMInitializeAMDGPUTargetInfo();
1968 llvm.LLVMInitializeAMDGPUTargetMC();
1969 llvm.LLVMInitializeAMDGPUAsmPrinter();
1970 llvm.LLVMInitializeAMDGPUAsmParser();
1971 },
1972 .arm, .armeb => {
1973 llvm.LLVMInitializeARMTarget();
1974 llvm.LLVMInitializeARMTargetInfo();
1975 llvm.LLVMInitializeARMTargetMC();
1976 llvm.LLVMInitializeARMAsmPrinter();
1977 llvm.LLVMInitializeARMAsmParser();
1978 },
1979 .avr => {
1980 llvm.LLVMInitializeAVRTarget();
1981 llvm.LLVMInitializeAVRTargetInfo();
1982 llvm.LLVMInitializeAVRTargetMC();
1983 llvm.LLVMInitializeAVRAsmPrinter();
1984 llvm.LLVMInitializeAVRAsmParser();
1985 },
1986 .bpfel, .bpfeb => {
1987 llvm.LLVMInitializeBPFTarget();
1988 llvm.LLVMInitializeBPFTargetInfo();
1989 llvm.LLVMInitializeBPFTargetMC();
1990 llvm.LLVMInitializeBPFAsmPrinter();
1991 llvm.LLVMInitializeBPFAsmParser();
1992 },
1993 .hexagon => {
1994 llvm.LLVMInitializeHexagonTarget();
1995 llvm.LLVMInitializeHexagonTargetInfo();
1996 llvm.LLVMInitializeHexagonTargetMC();
1997 llvm.LLVMInitializeHexagonAsmPrinter();
1998 llvm.LLVMInitializeHexagonAsmParser();
1999 },
2000 .lanai => {
2001 llvm.LLVMInitializeLanaiTarget();
2002 llvm.LLVMInitializeLanaiTargetInfo();
2003 llvm.LLVMInitializeLanaiTargetMC();
2004 llvm.LLVMInitializeLanaiAsmPrinter();
2005 llvm.LLVMInitializeLanaiAsmParser();
2006 },
2007 .mips, .mipsel, .mips64, .mips64el => {
2008 llvm.LLVMInitializeMipsTarget();
2009 llvm.LLVMInitializeMipsTargetInfo();
2010 llvm.LLVMInitializeMipsTargetMC();
2011 llvm.LLVMInitializeMipsAsmPrinter();
2012 llvm.LLVMInitializeMipsAsmParser();
2013 },
2014 .msp430 => {
2015 llvm.LLVMInitializeMSP430Target();
2016 llvm.LLVMInitializeMSP430TargetInfo();
2017 llvm.LLVMInitializeMSP430TargetMC();
2018 llvm.LLVMInitializeMSP430AsmPrinter();
2019 llvm.LLVMInitializeMSP430AsmParser();
2020 },
2021 .nvptx, .nvptx64 => {
2022 llvm.LLVMInitializeNVPTXTarget();
2023 llvm.LLVMInitializeNVPTXTargetInfo();
2024 llvm.LLVMInitializeNVPTXTargetMC();
2025 llvm.LLVMInitializeNVPTXAsmPrinter();
2026 // There is no LLVMInitializeNVPTXAsmParser function available.
2027 },
2028 .powerpc, .powerpcle, .powerpc64, .powerpc64le => {
2029 llvm.LLVMInitializePowerPCTarget();
2030 llvm.LLVMInitializePowerPCTargetInfo();
2031 llvm.LLVMInitializePowerPCTargetMC();
2032 llvm.LLVMInitializePowerPCAsmPrinter();
2033 llvm.LLVMInitializePowerPCAsmParser();
2034 },
2035 .riscv32, .riscv64 => {
2036 llvm.LLVMInitializeRISCVTarget();
2037 llvm.LLVMInitializeRISCVTargetInfo();
2038 llvm.LLVMInitializeRISCVTargetMC();
2039 llvm.LLVMInitializeRISCVAsmPrinter();
2040 llvm.LLVMInitializeRISCVAsmParser();
2041 },
2042 .sparc, .sparcv9, .sparcel => {
2043 llvm.LLVMInitializeSparcTarget();
2044 llvm.LLVMInitializeSparcTargetInfo();
2045 llvm.LLVMInitializeSparcTargetMC();
2046 llvm.LLVMInitializeSparcAsmPrinter();
2047 llvm.LLVMInitializeSparcAsmParser();
2048 },
2049 .s390x => {
2050 llvm.LLVMInitializeSystemZTarget();
2051 llvm.LLVMInitializeSystemZTargetInfo();
2052 llvm.LLVMInitializeSystemZTargetMC();
2053 llvm.LLVMInitializeSystemZAsmPrinter();
2054 llvm.LLVMInitializeSystemZAsmParser();
2055 },
2056 .wasm32, .wasm64 => {
2057 llvm.LLVMInitializeWebAssemblyTarget();
2058 llvm.LLVMInitializeWebAssemblyTargetInfo();
2059 llvm.LLVMInitializeWebAssemblyTargetMC();
2060 llvm.LLVMInitializeWebAssemblyAsmPrinter();
2061 llvm.LLVMInitializeWebAssemblyAsmParser();
2062 },
2063 .i386, .x86_64 => {
2064 llvm.LLVMInitializeX86Target();
2065 llvm.LLVMInitializeX86TargetInfo();
2066 llvm.LLVMInitializeX86TargetMC();
2067 llvm.LLVMInitializeX86AsmPrinter();
2068 llvm.LLVMInitializeX86AsmParser();
2069 },
2070 .xcore => {
2071 llvm.LLVMInitializeXCoreTarget();
2072 llvm.LLVMInitializeXCoreTargetInfo();
2073 llvm.LLVMInitializeXCoreTargetMC();
2074 llvm.LLVMInitializeXCoreAsmPrinter();
2075 // There is no LLVMInitializeXCoreAsmParser function available.
2076 },
2077 .arc => {},
2078 .csky => {},
2079 .r600 => {},
2080 .tce, .tcele => {},
2081 .thumb, .thumbeb => {},
2082 .le32, .le64 => {},
2083 .amdil, .amdil64 => {},
2084 .hsail, .hsail64 => {},
2085 .spir, .spir64 => {},
2086 .kalimba => {},
2087 .shave => {},
2088 .renderscript32 => {},
2089 .renderscript64 => {},
2090 .ve => {},
2091 .spu_2 => {},
2092 .spirv32 => {},
2093 .spirv64 => {},
2094 }
2095}
src/codegen/llvm/bindings.zig+87-182
......@@ -597,188 +597,93 @@ pub const Target = opaque {
597597 extern fn LLVMGetTargetFromTriple(Triple: [*:0]const u8, T: **const Target, ErrorMessage: *[*:0]const u8) Bool;
598598};
599599
600extern fn LLVMInitializeAArch64TargetInfo() void;
601extern fn LLVMInitializeAMDGPUTargetInfo() void;
602extern fn LLVMInitializeARMTargetInfo() void;
603extern fn LLVMInitializeAVRTargetInfo() void;
604extern fn LLVMInitializeBPFTargetInfo() void;
605extern fn LLVMInitializeHexagonTargetInfo() void;
606extern fn LLVMInitializeLanaiTargetInfo() void;
607extern fn LLVMInitializeMipsTargetInfo() void;
608extern fn LLVMInitializeMSP430TargetInfo() void;
609extern fn LLVMInitializeNVPTXTargetInfo() void;
610extern fn LLVMInitializePowerPCTargetInfo() void;
611extern fn LLVMInitializeRISCVTargetInfo() void;
612extern fn LLVMInitializeSparcTargetInfo() void;
613extern fn LLVMInitializeSystemZTargetInfo() void;
614extern fn LLVMInitializeWebAssemblyTargetInfo() void;
615extern fn LLVMInitializeX86TargetInfo() void;
616extern fn LLVMInitializeXCoreTargetInfo() void;
617extern fn LLVMInitializeAArch64Target() void;
618extern fn LLVMInitializeAMDGPUTarget() void;
619extern fn LLVMInitializeARMTarget() void;
620extern fn LLVMInitializeAVRTarget() void;
621extern fn LLVMInitializeBPFTarget() void;
622extern fn LLVMInitializeHexagonTarget() void;
623extern fn LLVMInitializeLanaiTarget() void;
624extern fn LLVMInitializeMipsTarget() void;
625extern fn LLVMInitializeMSP430Target() void;
626extern fn LLVMInitializeNVPTXTarget() void;
627extern fn LLVMInitializePowerPCTarget() void;
628extern fn LLVMInitializeRISCVTarget() void;
629extern fn LLVMInitializeSparcTarget() void;
630extern fn LLVMInitializeSystemZTarget() void;
631extern fn LLVMInitializeWebAssemblyTarget() void;
632extern fn LLVMInitializeX86Target() void;
633extern fn LLVMInitializeXCoreTarget() void;
634extern fn LLVMInitializeAArch64TargetMC() void;
635extern fn LLVMInitializeAMDGPUTargetMC() void;
636extern fn LLVMInitializeARMTargetMC() void;
637extern fn LLVMInitializeAVRTargetMC() void;
638extern fn LLVMInitializeBPFTargetMC() void;
639extern fn LLVMInitializeHexagonTargetMC() void;
640extern fn LLVMInitializeLanaiTargetMC() void;
641extern fn LLVMInitializeMipsTargetMC() void;
642extern fn LLVMInitializeMSP430TargetMC() void;
643extern fn LLVMInitializeNVPTXTargetMC() void;
644extern fn LLVMInitializePowerPCTargetMC() void;
645extern fn LLVMInitializeRISCVTargetMC() void;
646extern fn LLVMInitializeSparcTargetMC() void;
647extern fn LLVMInitializeSystemZTargetMC() void;
648extern fn LLVMInitializeWebAssemblyTargetMC() void;
649extern fn LLVMInitializeX86TargetMC() void;
650extern fn LLVMInitializeXCoreTargetMC() void;
651extern fn LLVMInitializeAArch64AsmPrinter() void;
652extern fn LLVMInitializeAMDGPUAsmPrinter() void;
653extern fn LLVMInitializeARMAsmPrinter() void;
654extern fn LLVMInitializeAVRAsmPrinter() void;
655extern fn LLVMInitializeBPFAsmPrinter() void;
656extern fn LLVMInitializeHexagonAsmPrinter() void;
657extern fn LLVMInitializeLanaiAsmPrinter() void;
658extern fn LLVMInitializeMipsAsmPrinter() void;
659extern fn LLVMInitializeMSP430AsmPrinter() void;
660extern fn LLVMInitializeNVPTXAsmPrinter() void;
661extern fn LLVMInitializePowerPCAsmPrinter() void;
662extern fn LLVMInitializeRISCVAsmPrinter() void;
663extern fn LLVMInitializeSparcAsmPrinter() void;
664extern fn LLVMInitializeSystemZAsmPrinter() void;
665extern fn LLVMInitializeWebAssemblyAsmPrinter() void;
666extern fn LLVMInitializeX86AsmPrinter() void;
667extern fn LLVMInitializeXCoreAsmPrinter() void;
668extern fn LLVMInitializeAArch64AsmParser() void;
669extern fn LLVMInitializeAMDGPUAsmParser() void;
670extern fn LLVMInitializeARMAsmParser() void;
671extern fn LLVMInitializeAVRAsmParser() void;
672extern fn LLVMInitializeBPFAsmParser() void;
673extern fn LLVMInitializeHexagonAsmParser() void;
674extern fn LLVMInitializeLanaiAsmParser() void;
675extern fn LLVMInitializeMipsAsmParser() void;
676extern fn LLVMInitializeMSP430AsmParser() void;
677extern fn LLVMInitializePowerPCAsmParser() void;
678extern fn LLVMInitializeRISCVAsmParser() void;
679extern fn LLVMInitializeSparcAsmParser() void;
680extern fn LLVMInitializeSystemZAsmParser() void;
681extern fn LLVMInitializeWebAssemblyAsmParser() void;
682extern fn LLVMInitializeX86AsmParser() void;
683
684pub const initializeAllTargetInfos = LLVMInitializeAllTargetInfos;
685fn LLVMInitializeAllTargetInfos() callconv(.C) void {
686 LLVMInitializeAArch64TargetInfo();
687 LLVMInitializeAMDGPUTargetInfo();
688 LLVMInitializeARMTargetInfo();
689 LLVMInitializeAVRTargetInfo();
690 LLVMInitializeBPFTargetInfo();
691 LLVMInitializeHexagonTargetInfo();
692 LLVMInitializeLanaiTargetInfo();
693 LLVMInitializeMipsTargetInfo();
694 LLVMInitializeMSP430TargetInfo();
695 LLVMInitializeNVPTXTargetInfo();
696 LLVMInitializePowerPCTargetInfo();
697 LLVMInitializeRISCVTargetInfo();
698 LLVMInitializeSparcTargetInfo();
699 LLVMInitializeSystemZTargetInfo();
700 LLVMInitializeWebAssemblyTargetInfo();
701 LLVMInitializeX86TargetInfo();
702 LLVMInitializeXCoreTargetInfo();
703}
704pub const initializeAllTargets = LLVMInitializeAllTargets;
705fn LLVMInitializeAllTargets() callconv(.C) void {
706 LLVMInitializeAArch64Target();
707 LLVMInitializeAMDGPUTarget();
708 LLVMInitializeARMTarget();
709 LLVMInitializeAVRTarget();
710 LLVMInitializeBPFTarget();
711 LLVMInitializeHexagonTarget();
712 LLVMInitializeLanaiTarget();
713 LLVMInitializeMipsTarget();
714 LLVMInitializeMSP430Target();
715 LLVMInitializeNVPTXTarget();
716 LLVMInitializePowerPCTarget();
717 LLVMInitializeRISCVTarget();
718 LLVMInitializeSparcTarget();
719 LLVMInitializeSystemZTarget();
720 LLVMInitializeWebAssemblyTarget();
721 LLVMInitializeX86Target();
722 LLVMInitializeXCoreTarget();
723}
724pub const initializeAllTargetMCs = LLVMInitializeAllTargetMCs;
725fn LLVMInitializeAllTargetMCs() callconv(.C) void {
726 LLVMInitializeAArch64TargetMC();
727 LLVMInitializeAMDGPUTargetMC();
728 LLVMInitializeARMTargetMC();
729 LLVMInitializeAVRTargetMC();
730 LLVMInitializeBPFTargetMC();
731 LLVMInitializeHexagonTargetMC();
732 LLVMInitializeLanaiTargetMC();
733 LLVMInitializeMipsTargetMC();
734 LLVMInitializeMSP430TargetMC();
735 LLVMInitializeNVPTXTargetMC();
736 LLVMInitializePowerPCTargetMC();
737 LLVMInitializeRISCVTargetMC();
738 LLVMInitializeSparcTargetMC();
739 LLVMInitializeSystemZTargetMC();
740 LLVMInitializeWebAssemblyTargetMC();
741 LLVMInitializeX86TargetMC();
742 LLVMInitializeXCoreTargetMC();
743}
744pub const initializeAllAsmPrinters = LLVMInitializeAllAsmPrinters;
745fn LLVMInitializeAllAsmPrinters() callconv(.C) void {
746 LLVMInitializeAArch64AsmPrinter();
747 LLVMInitializeAMDGPUAsmPrinter();
748 LLVMInitializeARMAsmPrinter();
749 LLVMInitializeAVRAsmPrinter();
750 LLVMInitializeBPFAsmPrinter();
751 LLVMInitializeHexagonAsmPrinter();
752 LLVMInitializeLanaiAsmPrinter();
753 LLVMInitializeMipsAsmPrinter();
754 LLVMInitializeMSP430AsmPrinter();
755 LLVMInitializeNVPTXAsmPrinter();
756 LLVMInitializePowerPCAsmPrinter();
757 LLVMInitializeRISCVAsmPrinter();
758 LLVMInitializeSparcAsmPrinter();
759 LLVMInitializeSystemZAsmPrinter();
760 LLVMInitializeWebAssemblyAsmPrinter();
761 LLVMInitializeX86AsmPrinter();
762 LLVMInitializeXCoreAsmPrinter();
763}
764pub const initializeAllAsmParsers = LLVMInitializeAllAsmParsers;
765fn LLVMInitializeAllAsmParsers() callconv(.C) void {
766 LLVMInitializeAArch64AsmParser();
767 LLVMInitializeAMDGPUAsmParser();
768 LLVMInitializeARMAsmParser();
769 LLVMInitializeAVRAsmParser();
770 LLVMInitializeBPFAsmParser();
771 LLVMInitializeHexagonAsmParser();
772 LLVMInitializeLanaiAsmParser();
773 LLVMInitializeMipsAsmParser();
774 LLVMInitializeMSP430AsmParser();
775 LLVMInitializePowerPCAsmParser();
776 LLVMInitializeRISCVAsmParser();
777 LLVMInitializeSparcAsmParser();
778 LLVMInitializeSystemZAsmParser();
779 LLVMInitializeWebAssemblyAsmParser();
780 LLVMInitializeX86AsmParser();
781}
600pub extern fn LLVMInitializeAArch64TargetInfo() void;
601pub extern fn LLVMInitializeAMDGPUTargetInfo() void;
602pub extern fn LLVMInitializeARMTargetInfo() void;
603pub extern fn LLVMInitializeAVRTargetInfo() void;
604pub extern fn LLVMInitializeBPFTargetInfo() void;
605pub extern fn LLVMInitializeHexagonTargetInfo() void;
606pub extern fn LLVMInitializeLanaiTargetInfo() void;
607pub extern fn LLVMInitializeMipsTargetInfo() void;
608pub extern fn LLVMInitializeMSP430TargetInfo() void;
609pub extern fn LLVMInitializeNVPTXTargetInfo() void;
610pub extern fn LLVMInitializePowerPCTargetInfo() void;
611pub extern fn LLVMInitializeRISCVTargetInfo() void;
612pub extern fn LLVMInitializeSparcTargetInfo() void;
613pub extern fn LLVMInitializeSystemZTargetInfo() void;
614pub extern fn LLVMInitializeWebAssemblyTargetInfo() void;
615pub extern fn LLVMInitializeX86TargetInfo() void;
616pub extern fn LLVMInitializeXCoreTargetInfo() void;
617
618pub extern fn LLVMInitializeAArch64Target() void;
619pub extern fn LLVMInitializeAMDGPUTarget() void;
620pub extern fn LLVMInitializeARMTarget() void;
621pub extern fn LLVMInitializeAVRTarget() void;
622pub extern fn LLVMInitializeBPFTarget() void;
623pub extern fn LLVMInitializeHexagonTarget() void;
624pub extern fn LLVMInitializeLanaiTarget() void;
625pub extern fn LLVMInitializeMipsTarget() void;
626pub extern fn LLVMInitializeMSP430Target() void;
627pub extern fn LLVMInitializeNVPTXTarget() void;
628pub extern fn LLVMInitializePowerPCTarget() void;
629pub extern fn LLVMInitializeRISCVTarget() void;
630pub extern fn LLVMInitializeSparcTarget() void;
631pub extern fn LLVMInitializeSystemZTarget() void;
632pub extern fn LLVMInitializeWebAssemblyTarget() void;
633pub extern fn LLVMInitializeX86Target() void;
634pub extern fn LLVMInitializeXCoreTarget() void;
635
636pub extern fn LLVMInitializeAArch64TargetMC() void;
637pub extern fn LLVMInitializeAMDGPUTargetMC() void;
638pub extern fn LLVMInitializeARMTargetMC() void;
639pub extern fn LLVMInitializeAVRTargetMC() void;
640pub extern fn LLVMInitializeBPFTargetMC() void;
641pub extern fn LLVMInitializeHexagonTargetMC() void;
642pub extern fn LLVMInitializeLanaiTargetMC() void;
643pub extern fn LLVMInitializeMipsTargetMC() void;
644pub extern fn LLVMInitializeMSP430TargetMC() void;
645pub extern fn LLVMInitializeNVPTXTargetMC() void;
646pub extern fn LLVMInitializePowerPCTargetMC() void;
647pub extern fn LLVMInitializeRISCVTargetMC() void;
648pub extern fn LLVMInitializeSparcTargetMC() void;
649pub extern fn LLVMInitializeSystemZTargetMC() void;
650pub extern fn LLVMInitializeWebAssemblyTargetMC() void;
651pub extern fn LLVMInitializeX86TargetMC() void;
652pub extern fn LLVMInitializeXCoreTargetMC() void;
653
654pub extern fn LLVMInitializeAArch64AsmPrinter() void;
655pub extern fn LLVMInitializeAMDGPUAsmPrinter() void;
656pub extern fn LLVMInitializeARMAsmPrinter() void;
657pub extern fn LLVMInitializeAVRAsmPrinter() void;
658pub extern fn LLVMInitializeBPFAsmPrinter() void;
659pub extern fn LLVMInitializeHexagonAsmPrinter() void;
660pub extern fn LLVMInitializeLanaiAsmPrinter() void;
661pub extern fn LLVMInitializeMipsAsmPrinter() void;
662pub extern fn LLVMInitializeMSP430AsmPrinter() void;
663pub extern fn LLVMInitializeNVPTXAsmPrinter() void;
664pub extern fn LLVMInitializePowerPCAsmPrinter() void;
665pub extern fn LLVMInitializeRISCVAsmPrinter() void;
666pub extern fn LLVMInitializeSparcAsmPrinter() void;
667pub extern fn LLVMInitializeSystemZAsmPrinter() void;
668pub extern fn LLVMInitializeWebAssemblyAsmPrinter() void;
669pub extern fn LLVMInitializeX86AsmPrinter() void;
670pub extern fn LLVMInitializeXCoreAsmPrinter() void;
671
672pub extern fn LLVMInitializeAArch64AsmParser() void;
673pub extern fn LLVMInitializeAMDGPUAsmParser() void;
674pub extern fn LLVMInitializeARMAsmParser() void;
675pub extern fn LLVMInitializeAVRAsmParser() void;
676pub extern fn LLVMInitializeBPFAsmParser() void;
677pub extern fn LLVMInitializeHexagonAsmParser() void;
678pub extern fn LLVMInitializeLanaiAsmParser() void;
679pub extern fn LLVMInitializeMipsAsmParser() void;
680pub extern fn LLVMInitializeMSP430AsmParser() void;
681pub extern fn LLVMInitializePowerPCAsmParser() void;
682pub extern fn LLVMInitializeRISCVAsmParser() void;
683pub extern fn LLVMInitializeSparcAsmParser() void;
684pub extern fn LLVMInitializeSystemZAsmParser() void;
685pub extern fn LLVMInitializeWebAssemblyAsmParser() void;
686pub extern fn LLVMInitializeX86AsmParser() void;
782687
783688extern fn ZigLLDLinkCOFF(argc: c_int, argv: [*:null]const ?[*:0]const u8, can_exit_early: bool) c_int;
784689extern fn ZigLLDLinkELF(argc: c_int, argv: [*:null]const ?[*:0]const u8, can_exit_early: bool) c_int;
src/link/MachO.zig+15-11
......@@ -148,7 +148,7 @@ globals_free_list: std.ArrayListUnmanaged(u32) = .{},
148148stub_helper_stubs_start_off: ?u64 = null,
149149
150150strtab: std.ArrayListUnmanaged(u8) = .{},
151strtab_dir: std.HashMapUnmanaged(u32, u32, StringIndexContext, std.hash_map.default_max_load_percentage) = .{},
151strtab_dir: std.HashMapUnmanaged(u32, void, StringIndexContext, std.hash_map.default_max_load_percentage) = .{},
152152
153153got_entries: std.ArrayListUnmanaged(GotIndirectionKey) = .{},
154154got_entries_map: std.AutoHashMapUnmanaged(GotIndirectionKey, u32) = .{},
......@@ -938,7 +938,7 @@ fn linkWithZld(self: *MachO, comp: *Compilation) !void {
938938
939939 {
940940 // Add dyld_stub_binder as the final GOT entry.
941 const n_strx = self.strtab_dir.getAdapted(@as([]const u8, "dyld_stub_binder"), StringSliceAdapter{
941 const n_strx = self.strtab_dir.getKeyAdapted(@as([]const u8, "dyld_stub_binder"), StringSliceAdapter{
942942 .strtab = &self.strtab,
943943 }) orelse unreachable;
944944 const resolv = self.symbol_resolver.get(n_strx) orelse unreachable;
......@@ -1966,7 +1966,7 @@ fn writeStubHelperCommon(self: *MachO) !void {
19661966 code[9] = 0xff;
19671967 code[10] = 0x25;
19681968 {
1969 const n_strx = self.strtab_dir.getAdapted(@as([]const u8, "dyld_stub_binder"), StringSliceAdapter{
1969 const n_strx = self.strtab_dir.getKeyAdapted(@as([]const u8, "dyld_stub_binder"), StringSliceAdapter{
19701970 .strtab = &self.strtab,
19711971 }) orelse unreachable;
19721972 const resolv = self.symbol_resolver.get(n_strx) orelse unreachable;
......@@ -2017,7 +2017,7 @@ fn writeStubHelperCommon(self: *MachO) !void {
20172017 code[10] = 0xbf;
20182018 code[11] = 0xa9;
20192019 binder_blk_outer: {
2020 const n_strx = self.strtab_dir.getAdapted(@as([]const u8, "dyld_stub_binder"), StringSliceAdapter{
2020 const n_strx = self.strtab_dir.getKeyAdapted(@as([]const u8, "dyld_stub_binder"), StringSliceAdapter{
20212021 .strtab = &self.strtab,
20222022 }) orelse unreachable;
20232023 const resolv = self.symbol_resolver.get(n_strx) orelse unreachable;
......@@ -2435,7 +2435,7 @@ fn resolveSymbols(self: *MachO) !void {
24352435 }
24362436
24372437 // Fourth pass, handle synthetic symbols and flag any undefined references.
2438 if (self.strtab_dir.getAdapted(@as([]const u8, "___dso_handle"), StringSliceAdapter{
2438 if (self.strtab_dir.getKeyAdapted(@as([]const u8, "___dso_handle"), StringSliceAdapter{
24392439 .strtab = &self.strtab,
24402440 })) |n_strx| blk: {
24412441 const resolv = self.symbol_resolver.getPtr(n_strx) orelse break :blk;
......@@ -2985,7 +2985,7 @@ fn setEntryPoint(self: *MachO) !void {
29852985 // TODO we should respect the -entry flag passed in by the user to set a custom
29862986 // entrypoint. For now, assume default of `_main`.
29872987 const seg = self.load_commands.items[self.text_segment_cmd_index.?].Segment;
2988 const n_strx = self.strtab_dir.getAdapted(@as([]const u8, "_main"), StringSliceAdapter{
2988 const n_strx = self.strtab_dir.getKeyAdapted(@as([]const u8, "_main"), StringSliceAdapter{
29892989 .strtab = &self.strtab,
29902990 }) orelse {
29912991 log.err("'_main' export not found", .{});
......@@ -4616,7 +4616,7 @@ pub fn addExternFn(self: *MachO, name: []const u8) !u32 {
46164616 const sym_name = try std.fmt.allocPrint(self.base.allocator, "_{s}", .{name});
46174617 defer self.base.allocator.free(sym_name);
46184618
4619 if (self.strtab_dir.getAdapted(@as([]const u8, sym_name), StringSliceAdapter{
4619 if (self.strtab_dir.getKeyAdapted(@as([]const u8, sym_name), StringSliceAdapter{
46204620 .strtab = &self.strtab,
46214621 })) |n_strx| {
46224622 const resolv = self.symbol_resolver.get(n_strx) orelse unreachable;
......@@ -5858,7 +5858,13 @@ pub fn padToIdeal(actual_size: anytype) @TypeOf(actual_size) {
58585858}
58595859
58605860pub fn makeString(self: *MachO, string: []const u8) !u32 {
5861 if (self.strtab_dir.getAdapted(@as([]const u8, string), StringSliceAdapter{ .strtab = &self.strtab })) |off| {
5861 const gop = try self.strtab_dir.getOrPutContextAdapted(self.base.allocator, @as([]const u8, string), StringSliceAdapter{
5862 .strtab = &self.strtab,
5863 }, StringIndexContext{
5864 .strtab = &self.strtab,
5865 });
5866 if (gop.found_existing) {
5867 const off = gop.key_ptr.*;
58625868 log.debug("reusing string '{s}' at offset 0x{x}", .{ string, off });
58635869 return off;
58645870 }
......@@ -5871,9 +5877,7 @@ pub fn makeString(self: *MachO, string: []const u8) !u32 {
58715877 self.strtab.appendSliceAssumeCapacity(string);
58725878 self.strtab.appendAssumeCapacity(0);
58735879
5874 try self.strtab_dir.putContext(self.base.allocator, new_off, new_off, StringIndexContext{
5875 .strtab = &self.strtab,
5876 });
5880 gop.key_ptr.* = new_off;
58775881
58785882 return new_off;
58795883}
src/link/MachO/TextBlock.zig+2-2
......@@ -656,7 +656,7 @@ fn initRelocFromObject(rel: macho.relocation_info, context: RelocContext) !Reloc
656656 parsed_rel.where = .local;
657657 parsed_rel.where_index = where_index;
658658 } else {
659 const n_strx = context.macho_file.strtab_dir.getAdapted(@as([]const u8, sym_name), MachO.StringSliceAdapter{
659 const n_strx = context.macho_file.strtab_dir.getKeyAdapted(@as([]const u8, sym_name), MachO.StringSliceAdapter{
660660 .strtab = &context.macho_file.strtab,
661661 }) orelse unreachable;
662662 const resolv = context.macho_file.symbol_resolver.get(n_strx) orelse unreachable;
......@@ -717,7 +717,7 @@ pub fn parseRelocs(self: *TextBlock, relocs: []macho.relocation_info, context: R
717717 const where_index = context.object.symbol_mapping.get(rel.r_symbolnum) orelse unreachable;
718718 subtractor = where_index;
719719 } else {
720 const n_strx = context.macho_file.strtab_dir.getAdapted(@as([]const u8, sym_name), MachO.StringSliceAdapter{
720 const n_strx = context.macho_file.strtab_dir.getKeyAdapted(@as([]const u8, sym_name), MachO.StringSliceAdapter{
721721 .strtab = &context.macho_file.strtab,
722722 }) orelse unreachable;
723723 const resolv = context.macho_file.symbol_resolver.get(n_strx) orelse unreachable;
src/translate_c.zig+24-49
......@@ -203,9 +203,7 @@ const Scope = struct {
203203 /// Check if the global scope contains this name, without looking into the "future", e.g.
204204 /// ignore the preprocessed decl and macro names.
205205 fn containsNow(scope: *Root, name: []const u8) bool {
206 return isZigPrimitiveType(name) or
207 scope.sym_table.contains(name) or
208 scope.macro_table.contains(name);
206 return scope.sym_table.contains(name) or scope.macro_table.contains(name);
209207 }
210208
211209 /// Check if the global scope contains the name, includes all decls that haven't been translated yet.
......@@ -495,19 +493,17 @@ fn declVisitorNamesOnly(c: *Context, decl: *const clang.Decl) Error!void {
495493 },
496494 else => return,
497495 } else unreachable;
498 // TODO https://github.com/ziglang/zig/issues/3756
499 // TODO https://github.com/ziglang/zig/issues/1802
500 const name = if (isZigPrimitiveType(decl_name)) try std.fmt.allocPrint(c.arena, "{s}_{d}", .{ decl_name, c.getMangle() }) else decl_name;
496
501497 const result = try c.unnamed_typedefs.getOrPut(c.gpa, addr);
502498 if (result.found_existing) {
503499 // One typedef can declare multiple names.
504500 // Don't put this one in `decl_table` so it's processed later.
505501 return;
506502 }
507 result.value_ptr.* = name;
503 result.value_ptr.* = decl_name;
508504 // Put this typedef in the decl_table to avoid redefinitions.
509 try c.decl_table.putNoClobber(c.gpa, @ptrToInt(typedef_decl.getCanonicalDecl()), name);
510 try c.typedefs.put(c.gpa, name, {});
505 try c.decl_table.putNoClobber(c.gpa, @ptrToInt(typedef_decl.getCanonicalDecl()), decl_name);
506 try c.typedefs.put(c.gpa, decl_name, {});
511507 }
512508 }
513509}
......@@ -752,10 +748,6 @@ fn visitVarDecl(c: *Context, var_decl: *const clang.VarDecl, mangled_name: ?[]co
752748 const is_pub = mangled_name == null;
753749 const is_threadlocal = var_decl.getTLSKind() != .None;
754750 const scope = &c.global_scope.base;
755
756 // TODO https://github.com/ziglang/zig/issues/3756
757 // TODO https://github.com/ziglang/zig/issues/1802
758 const checked_name = if (isZigPrimitiveType(var_name)) try std.fmt.allocPrint(c.arena, "{s}_{d}", .{ var_name, c.getMangle() }) else var_name;
759751 const var_decl_loc = var_decl.getLocation();
760752
761753 const qual_type = var_decl.getTypeSourceInfo_getType();
......@@ -774,7 +766,7 @@ fn visitVarDecl(c: *Context, var_decl: *const clang.VarDecl, mangled_name: ?[]co
774766
775767 const type_node = transQualTypeMaybeInitialized(c, scope, qual_type, decl_init, var_decl_loc) catch |err| switch (err) {
776768 error.UnsupportedTranslation, error.UnsupportedType => {
777 return failDecl(c, var_decl_loc, checked_name, "unable to resolve variable type", .{});
769 return failDecl(c, var_decl_loc, var_name, "unable to resolve variable type", .{});
778770 },
779771 error.OutOfMemory => |e| return e,
780772 };
......@@ -833,11 +825,11 @@ fn visitVarDecl(c: *Context, var_decl: *const clang.VarDecl, mangled_name: ?[]co
833825 .is_threadlocal = is_threadlocal,
834826 .linksection_string = linksection_string,
835827 .alignment = zigAlignment(var_decl.getAlignedAttribute(c.clang_context)),
836 .name = checked_name,
828 .name = var_name,
837829 .type = type_node,
838830 .init = init_node,
839831 });
840 return addTopLevelDecl(c, checked_name, node);
832 return addTopLevelDecl(c, var_name, node);
841833}
842834
843835const builtin_typedef_map = std.ComptimeStringMap([]const u8, .{
......@@ -861,11 +853,7 @@ fn transTypeDef(c: *Context, scope: *Scope, typedef_decl: *const clang.TypedefNa
861853 const toplevel = scope.id == .root;
862854 const bs: *Scope.Block = if (!toplevel) try scope.findBlockScope(c) else undefined;
863855
864 const bare_name = try c.str(@ptrCast(*const clang.NamedDecl, typedef_decl).getName_bytes_begin());
865
866 // TODO https://github.com/ziglang/zig/issues/3756
867 // TODO https://github.com/ziglang/zig/issues/1802
868 var name: []const u8 = if (isZigPrimitiveType(bare_name)) try std.fmt.allocPrint(c.arena, "{s}_{d}", .{ bare_name, c.getMangle() }) else bare_name;
856 var name: []const u8 = try c.str(@ptrCast(*const clang.NamedDecl, typedef_decl).getName_bytes_begin());
869857 try c.typedefs.put(c.gpa, name, {});
870858
871859 if (builtin_typedef_map.get(name)) |builtin| {
......@@ -1535,12 +1523,12 @@ fn transOffsetOfExpr(
15351523/// node -> @bitCast(usize, @intCast(isize, node))
15361524fn usizeCastForWrappingPtrArithmetic(gpa: *mem.Allocator, node: Node) TransError!Node {
15371525 const intcast_node = try Tag.int_cast.create(gpa, .{
1538 .lhs = try Tag.identifier.create(gpa, "isize"),
1526 .lhs = try Tag.type.create(gpa, "isize"),
15391527 .rhs = node,
15401528 });
15411529
15421530 return Tag.bit_cast.create(gpa, .{
1543 .lhs = try Tag.identifier.create(gpa, "usize"),
1531 .lhs = try Tag.type.create(gpa, "usize"),
15441532 .rhs = intcast_node,
15451533 });
15461534}
......@@ -3345,7 +3333,7 @@ fn transSignedArrayAccess(
33453333 const then_value = try Tag.add.create(c.arena, .{
33463334 .lhs = container_node,
33473335 .rhs = try Tag.int_cast.create(c.arena, .{
3348 .lhs = try Tag.identifier.create(c.arena, "usize"),
3336 .lhs = try Tag.type.create(c.arena, "usize"),
33493337 .rhs = tmp_ref,
33503338 }),
33513339 });
......@@ -3357,7 +3345,7 @@ fn transSignedArrayAccess(
33573345
33583346 const minuend = container_node;
33593347 const signed_size = try Tag.int_cast.create(c.arena, .{
3360 .lhs = try Tag.identifier.create(c.arena, "isize"),
3348 .lhs = try Tag.type.create(c.arena, "isize"),
33613349 .rhs = tmp_ref,
33623350 });
33633351 const to_cast = try Tag.add_wrap.create(c.arena, .{
......@@ -3365,7 +3353,7 @@ fn transSignedArrayAccess(
33653353 .rhs = try Tag.negate.create(c.arena, Tag.one_literal.init()),
33663354 });
33673355 const bitcast_node = try Tag.bit_cast.create(c.arena, .{
3368 .lhs = try Tag.identifier.create(c.arena, "usize"),
3356 .lhs = try Tag.type.create(c.arena, "usize"),
33693357 .rhs = to_cast,
33703358 });
33713359 const subtrahend = try Tag.bit_not.create(c.arena, bitcast_node);
......@@ -3421,7 +3409,7 @@ fn transArrayAccess(c: *Context, scope: *Scope, stmt: *const clang.ArraySubscrip
34213409 const container_node = try transExpr(c, scope, unwrapped_base, .used);
34223410 const rhs = if (is_longlong or is_signed) blk: {
34233411 // check if long long first so that signed long long doesn't just become unsigned long long
3424 const typeid_node = if (is_longlong) try Tag.identifier.create(c.arena, "usize") else try transQualTypeIntWidthOf(c, subscr_qt, false);
3412 const typeid_node = if (is_longlong) try Tag.type.create(c.arena, "usize") else try transQualTypeIntWidthOf(c, subscr_qt, false);
34253413 break :blk try Tag.int_cast.create(c.arena, .{ .lhs = typeid_node, .rhs = try transExpr(c, scope, subscr_expr, .used) });
34263414 } else try transExpr(c, scope, subscr_expr, .used);
34273415
......@@ -3953,7 +3941,7 @@ fn transFloatingLiteral(c: *Context, scope: *Scope, expr: *const clang.FloatingL
39533941
39543942fn transBinaryConditionalOperator(c: *Context, scope: *Scope, stmt: *const clang.BinaryConditionalOperator, used: ResultUsed) TransError!Node {
39553943 // GNU extension of the ternary operator where the middle expression is
3956 // omitted, the conditition itself is returned if it evaluates to true
3944 // omitted, the condition itself is returned if it evaluates to true
39573945 const qt = @ptrCast(*const clang.Expr, stmt).getType();
39583946 const res_is_bool = qualTypeIsBoolean(qt);
39593947 const casted_stmt = @ptrCast(*const clang.AbstractConditionalOperator, stmt);
......@@ -4040,7 +4028,7 @@ fn transConditionalOperator(c: *Context, scope: *Scope, stmt: *const clang.Condi
40404028 .then = then_body,
40414029 .@"else" = else_body,
40424030 });
4043 // Clang inserts ImplicitCast(ToVoid)'s to both rhs and lhs so we don't need to supress the result here.
4031 // Clang inserts ImplicitCast(ToVoid)'s to both rhs and lhs so we don't need to suppress the result here.
40444032 return if_node;
40454033}
40464034
......@@ -4671,6 +4659,7 @@ fn transType(c: *Context, scope: *Scope, ty: *const clang.Type, source_loc: clan
46714659 if (@ptrCast(*const clang.Decl, typedef_decl).castToNamedDecl()) |named_decl| {
46724660 const decl_name = try c.str(named_decl.getName_bytes_begin());
46734661 if (c.global_names.get(decl_name)) |_| trans_scope = &c.global_scope.base;
4662 if (builtin_typedef_map.get(decl_name)) |builtin| return Tag.type.create(c.arena, builtin);
46744663 }
46754664 try transTypeDef(c, trans_scope, typedef_decl);
46764665 const name = c.decl_table.get(@ptrToInt(typedef_decl.getCanonicalDecl())).?;
......@@ -4994,19 +4983,6 @@ pub fn freeErrors(errors: []ClangErrMsg) void {
49944983 errors.ptr.delete(errors.len);
49954984}
49964985
4997fn isZigPrimitiveType(name: []const u8) bool {
4998 if (name.len > 1 and (name[0] == 'u' or name[0] == 'i')) {
4999 for (name[1..]) |c| {
5000 switch (c) {
5001 '0'...'9' => {},
5002 else => return false,
5003 }
5004 }
5005 return true;
5006 }
5007 return @import("AstGen.zig").simple_types.has(name);
5008}
5009
50104986const PatternList = struct {
50114987 patterns: []Pattern,
50124988
......@@ -5311,10 +5287,7 @@ fn transPreprocessorEntities(c: *Context, unit: *clang.ASTUnit) Error!void {
53115287 const end_loc = clang.Lexer.getLocForEndOfToken(macro.getSourceRange_getEnd(), c.source_manager, unit);
53125288
53135289 const name = try c.str(raw_name);
5314 // TODO https://github.com/ziglang/zig/issues/3756
5315 // TODO https://github.com/ziglang/zig/issues/1802
5316 const mangled_name = if (isZigPrimitiveType(name)) try std.fmt.allocPrint(c.arena, "{s}_{d}", .{ name, c.getMangle() }) else name;
5317 if (scope.containsNow(mangled_name)) {
5290 if (scope.containsNow(name)) {
53185291 continue;
53195292 }
53205293
......@@ -5328,7 +5301,7 @@ fn transPreprocessorEntities(c: *Context, unit: *clang.ASTUnit) Error!void {
53285301 var macro_ctx = MacroCtx{
53295302 .source = slice,
53305303 .list = tok_list.items,
5331 .name = mangled_name,
5304 .name = name,
53325305 .loc = begin_loc,
53335306 };
53345307 assert(mem.eql(u8, macro_ctx.slice(), name));
......@@ -5766,7 +5739,8 @@ fn parseCPrimaryExprInner(c: *Context, m: *MacroCtx, scope: *Scope) ParseError!N
57665739 try m.fail(c, "TODO implement function '{s}' in std.zig.c_builtins", .{mangled_name});
57675740 return error.ParseError;
57685741 }
5769 const identifier = try Tag.identifier.create(c.arena, builtin_typedef_map.get(mangled_name) orelse mangled_name);
5742 if (builtin_typedef_map.get(mangled_name)) |ty| return Tag.type.create(c.arena, ty);
5743 const identifier = try Tag.identifier.create(c.arena, mangled_name);
57705744 scope.skipVariableDiscard(identifier.castTag(.identifier).?.data);
57715745 return identifier;
57725746 },
......@@ -6055,7 +6029,8 @@ fn parseCSpecifierQualifierList(c: *Context, m: *MacroCtx, scope: *Scope, allow_
60556029 .Identifier => {
60566030 const mangled_name = scope.getAlias(m.slice());
60576031 if (!allow_fail or c.typedefs.contains(mangled_name)) {
6058 return try Tag.identifier.create(c.arena, builtin_typedef_map.get(mangled_name) orelse mangled_name);
6032 if (builtin_typedef_map.get(mangled_name)) |ty| return try Tag.type.create(c.arena, ty);
6033 return try Tag.identifier.create(c.arena, mangled_name);
60596034 }
60606035 },
60616036 .Keyword_void => return try Tag.type.create(c.arena, "c_void"),
src/translate_c/ast.zig+19-4
......@@ -801,11 +801,26 @@ const Context = struct {
801801 }
802802
803803 fn addToken(c: *Context, tag: TokenTag, bytes: []const u8) Allocator.Error!TokenIndex {
804 return addTokenFmt(c, tag, "{s}", .{bytes});
804 return c.addTokenFmt(tag, "{s}", .{bytes});
805 }
806
807 fn isZigPrimitiveType(name: []const u8) bool {
808 if (name.len > 1 and (name[0] == 'u' or name[0] == 'i')) {
809 for (name[1..]) |c| {
810 switch (c) {
811 '0'...'9' => {},
812 else => return false,
813 }
814 }
815 return true;
816 }
817 return @import("../AstGen.zig").simple_types.has(name);
805818 }
806819
807820 fn addIdentifier(c: *Context, bytes: []const u8) Allocator.Error!TokenIndex {
808 return addTokenFmt(c, .identifier, "{s}", .{std.zig.fmtId(bytes)});
821 if (isZigPrimitiveType(bytes))
822 return c.addTokenFmt(.identifier, "@\"{s}\"", .{bytes});
823 return c.addTokenFmt(.identifier, "{s}", .{std.zig.fmtId(bytes)});
809824 }
810825
811826 fn listToSpan(c: *Context, list: []const NodeIndex) Allocator.Error!NodeSubRange {
......@@ -1999,7 +2014,7 @@ fn renderRecord(c: *Context, node: Node) !NodeIndex {
19992014 members[1] = 0;
20002015
20012016 for (payload.fields) |field, i| {
2002 const name_tok = try c.addIdentifier(field.name);
2017 const name_tok = try c.addTokenFmt(.identifier, "{s}", .{std.zig.fmtId(field.name)});
20032018 _ = try c.addToken(.colon, ":");
20042019 const type_expr = try renderNode(c, field.type);
20052020
......@@ -2079,7 +2094,7 @@ fn renderFieldAccess(c: *Context, lhs: NodeIndex, field_name: []const u8) !NodeI
20792094 .main_token = try c.addToken(.period, "."),
20802095 .data = .{
20812096 .lhs = lhs,
2082 .rhs = try c.addIdentifier(field_name),
2097 .rhs = try c.addTokenFmt(.identifier, "{s}", .{std.zig.fmtId(field_name)}),
20832098 },
20842099 });
20852100}
test/behavior.zig+2
......@@ -89,6 +89,8 @@ test {
8989 _ = @import("behavior/byval_arg_var.zig");
9090 _ = @import("behavior/call.zig");
9191 _ = @import("behavior/cast_stage1.zig");
92 // When these tests pass, #9646 can be closed.
93 // _ = @import("behavior/comptime_memory.zig");
9294 _ = @import("behavior/const_slice_child.zig");
9395 _ = @import("behavior/defer.zig");
9496 _ = @import("behavior/enum.zig");
test/behavior/asm.zig+15-15
......@@ -23,12 +23,12 @@ test "output constraint modifiers" {
2323 // This is only testing compilation.
2424 var a: u32 = 3;
2525 asm volatile (""
26 : [_] "=m,r" (a)
26 : [_] "=m,r" (a),
2727 :
2828 : ""
2929 );
3030 asm volatile (""
31 : [_] "=r,m" (a)
31 : [_] "=r,m" (a),
3232 :
3333 : ""
3434 );
......@@ -38,8 +38,8 @@ test "alternative constraints" {
3838 // Make sure we allow commas as a separator for alternative constraints.
3939 var a: u32 = 3;
4040 asm volatile (""
41 : [_] "=r,m" (a)
42 : [_] "r,m" (a)
41 : [_] "=r,m" (a),
42 : [_] "r,m" (a),
4343 : ""
4444 );
4545}
......@@ -47,42 +47,42 @@ test "alternative constraints" {
4747test "sized integer/float in asm input" {
4848 asm volatile (""
4949 :
50 : [_] "m" (@as(usize, 3))
50 : [_] "m" (@as(usize, 3)),
5151 : ""
5252 );
5353 asm volatile (""
5454 :
55 : [_] "m" (@as(i15, -3))
55 : [_] "m" (@as(i15, -3)),
5656 : ""
5757 );
5858 asm volatile (""
5959 :
60 : [_] "m" (@as(u3, 3))
60 : [_] "m" (@as(u3, 3)),
6161 : ""
6262 );
6363 asm volatile (""
6464 :
65 : [_] "m" (@as(i3, 3))
65 : [_] "m" (@as(i3, 3)),
6666 : ""
6767 );
6868 asm volatile (""
6969 :
70 : [_] "m" (@as(u121, 3))
70 : [_] "m" (@as(u121, 3)),
7171 : ""
7272 );
7373 asm volatile (""
7474 :
75 : [_] "m" (@as(i121, 3))
75 : [_] "m" (@as(i121, 3)),
7676 : ""
7777 );
7878 asm volatile (""
7979 :
80 : [_] "m" (@as(f32, 3.17))
80 : [_] "m" (@as(f32, 3.17)),
8181 : ""
8282 );
8383 asm volatile (""
8484 :
85 : [_] "m" (@as(f64, 3.17))
85 : [_] "m" (@as(f64, 3.17)),
8686 : ""
8787 );
8888}
......@@ -90,15 +90,15 @@ test "sized integer/float in asm input" {
9090test "struct/array/union types as input values" {
9191 asm volatile (""
9292 :
93 : [_] "m" (@as([1]u32, undefined))
93 : [_] "m" (@as([1]u32, undefined)),
9494 ); // fails
9595 asm volatile (""
9696 :
97 : [_] "m" (@as(struct { x: u32, y: u8 }, undefined))
97 : [_] "m" (@as(struct { x: u32, y: u8 }, undefined)),
9898 ); // fails
9999 asm volatile (""
100100 :
101 : [_] "m" (@as(union { x: u32, y: u8 }, undefined))
101 : [_] "m" (@as(union { x: u32, y: u8 }, undefined)),
102102 ); // fails
103103}
104104
test/behavior/comptime_memory.zig created+317
......@@ -0,0 +1,317 @@
1const endian = @import("builtin").cpu.arch.endian();
2const testing = @import("std").testing;
3const ptr_size = @sizeOf(usize);
4
5test "type pun signed and unsigned as single pointer" {
6 comptime {
7 var x: u32 = 0;
8 const y = @ptrCast(*i32, &x);
9 y.* = -1;
10 try testing.expectEqual(@as(u32, 0xFFFFFFFF), x);
11 }
12}
13
14test "type pun signed and unsigned as many pointer" {
15 comptime {
16 var x: u32 = 0;
17 const y = @ptrCast([*]i32, &x);
18 y[0] = -1;
19 try testing.expectEqual(@as(u32, 0xFFFFFFFF), x);
20 }
21}
22
23test "type pun signed and unsigned as array pointer" {
24 comptime {
25 var x: u32 = 0;
26 const y = @ptrCast(*[1]i32, &x);
27 y[0] = -1;
28 try testing.expectEqual(@as(u32, 0xFFFFFFFF), x);
29 }
30}
31
32test "type pun signed and unsigned as offset many pointer" {
33 comptime {
34 var x: u32 = 0;
35 var y = @ptrCast([*]i32, &x);
36 y -= 10;
37 y[10] = -1;
38 try testing.expectEqual(@as(u32, 0xFFFFFFFF), x);
39 }
40}
41
42test "type pun signed and unsigned as array pointer" {
43 comptime {
44 var x: u32 = 0;
45 const y = @ptrCast([*]i32, &x) - 10;
46 const z: *[15]i32 = y[0..15];
47 z[10] = -1;
48 try testing.expectEqual(@as(u32, 0xFFFFFFFF), x);
49 }
50}
51
52test "type pun value and struct" {
53 comptime {
54 const StructOfU32 = extern struct { x: u32 };
55 var inst: StructOfU32 = .{ .x = 0 };
56 @ptrCast(*i32, &inst.x).* = -1;
57 try testing.expectEqual(@as(u32, 0xFFFFFFFF), inst.x);
58 @ptrCast(*i32, &inst).* = -2;
59 try testing.expectEqual(@as(u32, 0xFFFFFFFE), inst.x);
60 }
61}
62
63fn bigToNativeEndian(comptime T: type, v: T) T {
64 return if (endian == .Big) v else @byteSwap(T, v);
65}
66test "type pun endianness" {
67 comptime {
68 const StructOfBytes = extern struct { x: [4]u8 };
69 var inst: StructOfBytes = .{ .x = [4]u8{ 0, 0, 0, 0 } };
70 const structPtr = @ptrCast(*align(1) u32, &inst);
71 const arrayPtr = @ptrCast(*align(1) u32, &inst.x);
72 inst.x[0] = 0xFE;
73 inst.x[2] = 0xBE;
74 try testing.expectEqual(bigToNativeEndian(u32, 0xFE00BE00), structPtr.*);
75 try testing.expectEqual(bigToNativeEndian(u32, 0xFE00BE00), arrayPtr.*);
76 structPtr.* = bigToNativeEndian(u32, 0xDEADF00D);
77 try testing.expectEqual(bigToNativeEndian(u32, 0xDEADF00D), structPtr.*);
78 try testing.expectEqual(bigToNativeEndian(u32, 0xDEADF00D), arrayPtr.*);
79 try testing.expectEqual(@as(u8, 0xDE), inst.x[0]);
80 try testing.expectEqual(@as(u8, 0xAD), inst.x[1]);
81 try testing.expectEqual(@as(u8, 0xF0), inst.x[2]);
82 try testing.expectEqual(@as(u8, 0x0D), inst.x[3]);
83 }
84}
85
86const Bits = packed struct {
87 // Note: This struct has only single byte words so it
88 // doesn't need to be byte swapped.
89 p0: u1,
90 p1: u4,
91 p2: u3,
92 p3: u2,
93 p4: u6,
94 p5: u8,
95 p6: u7,
96 p7: u1,
97};
98const ShuffledBits = packed struct {
99 p1: u4,
100 p3: u2,
101 p7: u1,
102 p0: u1,
103 p5: u8,
104 p2: u3,
105 p6: u7,
106 p4: u6,
107};
108fn shuffle(ptr: usize, comptime From: type, comptime To: type) usize {
109 if (@sizeOf(From) != @sizeOf(To))
110 @compileError("Mismatched sizes! " ++ @typeName(From) ++ " and " ++ @typeName(To) ++ " must have the same size!");
111 const array_len = @divExact(ptr_size, @sizeOf(From));
112 var result: usize = 0;
113 const pSource = @ptrCast(*align(1) const [array_len]From, &ptr);
114 const pResult = @ptrCast(*align(1) [array_len]To, &result);
115 var i: usize = 0;
116 while (i < array_len) : (i += 1) {
117 inline for (@typeInfo(To).Struct.fields) |f| {
118 @field(pResult[i], f.name) = @field(pSource[i], f.name);
119 }
120 }
121 return result;
122}
123
124fn doTypePunBitsTest(as_bits: *Bits) !void {
125 const as_u32 = @ptrCast(*align(1) u32, as_bits);
126 const as_bytes = @ptrCast(*[4]u8, as_bits);
127 as_u32.* = bigToNativeEndian(u32, 0xB0A7DEED);
128 try testing.expectEqual(@as(u1, 0x00), as_bits.p0);
129 try testing.expectEqual(@as(u4, 0x08), as_bits.p1);
130 try testing.expectEqual(@as(u3, 0x05), as_bits.p2);
131 try testing.expectEqual(@as(u2, 0x03), as_bits.p3);
132 try testing.expectEqual(@as(u6, 0x29), as_bits.p4);
133 try testing.expectEqual(@as(u8, 0xDE), as_bits.p5);
134 try testing.expectEqual(@as(u7, 0x6D), as_bits.p6);
135 try testing.expectEqual(@as(u1, 0x01), as_bits.p7);
136
137 as_bits.p6 = 0x2D;
138 as_bits.p1 = 0x0F;
139 try testing.expectEqual(bigToNativeEndian(u32, 0xBEA7DEAD), as_u32.*);
140
141 // clobbering one bit doesn't clobber the word
142 as_bits.p7 = undefined;
143 try testing.expectEqual(@as(u7, 0x2D), as_bits.p6);
144 // even when read as a whole
145 const u = as_u32.*;
146 _ = u; // u is undefined
147 try testing.expectEqual(@as(u7, 0x2D), as_bits.p6);
148 // or if a field which shares the byte is modified
149 as_bits.p6 = 0x6D;
150 try testing.expectEqual(@as(u7, 0x6D), as_bits.p6);
151
152 // but overwriting the undefined will clear it
153 as_bytes[3] = 0xAF;
154 try testing.expectEqual(bigToNativeEndian(u32, 0xBEA7DEAF), as_u32.*);
155}
156
157test "type pun bits" {
158 comptime {
159 var v: u32 = undefined;
160 try doTypePunBitsTest(@ptrCast(*Bits, &v));
161 }
162}
163
164const imports = struct {
165 var global_u32: u32 = 0;
166};
167
168// Make sure lazy values work on their own, before getting into more complex tests
169test "basic pointer preservation" {
170 comptime {
171 const lazy_address = @ptrToInt(&imports.global_u32);
172 try testing.expectEqual(@ptrToInt(&imports.global_u32), lazy_address);
173 try testing.expectEqual(&imports.global_u32, @intToPtr(*u32, lazy_address));
174 }
175}
176
177test "byte copy preserves linker value" {
178 const ct_value = comptime blk: {
179 const lazy = &imports.global_u32;
180 var result: *u32 = undefined;
181 const pSource = @ptrCast(*const [ptr_size]u8, &lazy);
182 const pResult = @ptrCast(*[ptr_size]u8, &result);
183 var i: usize = 0;
184 while (i < ptr_size) : (i += 1) {
185 pResult[i] = pSource[i];
186 try testing.expectEqual(pSource[i], pResult[i]);
187 }
188 try testing.expectEqual(&imports.global_u32, result);
189 break :blk result;
190 };
191
192 try testing.expectEqual(&imports.global_u32, ct_value);
193}
194
195test "unordered byte copy preserves linker value" {
196 const ct_value = comptime blk: {
197 const lazy = &imports.global_u32;
198 var result: *u32 = undefined;
199 const pSource = @ptrCast(*const [ptr_size]u8, &lazy);
200 const pResult = @ptrCast(*[ptr_size]u8, &result);
201 if (ptr_size > 8) @compileError("This array needs to be expanded for platform with very big pointers");
202 const shuffled_indices = [_]usize{ 4, 5, 2, 6, 1, 3, 0, 7 };
203 for (shuffled_indices) |i| {
204 pResult[i] = pSource[i];
205 try testing.expectEqual(pSource[i], pResult[i]);
206 }
207 try testing.expectEqual(&imports.global_u32, result);
208 break :blk result;
209 };
210
211 try testing.expectEqual(&imports.global_u32, ct_value);
212}
213
214test "shuffle chunks of linker value" {
215 const lazy_address = @ptrToInt(&imports.global_u32);
216 const shuffled1_rt = shuffle(lazy_address, Bits, ShuffledBits);
217 const unshuffled1_rt = shuffle(shuffled1_rt, ShuffledBits, Bits);
218 try testing.expectEqual(lazy_address, unshuffled1_rt);
219 const shuffled1_ct = comptime shuffle(lazy_address, Bits, ShuffledBits);
220 const shuffled1_ct_2 = comptime shuffle(lazy_address, Bits, ShuffledBits);
221 comptime try testing.expectEqual(shuffled1_ct, shuffled1_ct_2);
222 const unshuffled1_ct = comptime shuffle(shuffled1_ct, ShuffledBits, Bits);
223 comptime try testing.expectEqual(lazy_address, unshuffled1_ct);
224 try testing.expectEqual(shuffled1_ct, shuffled1_rt);
225}
226
227test "dance on linker values" {
228 comptime {
229 var arr: [2]usize = undefined;
230 arr[0] = @ptrToInt(&imports.global_u32);
231 arr[1] = @ptrToInt(&imports.global_u32);
232
233 const weird_ptr = @ptrCast([*]Bits, @ptrCast([*]u8, &arr) + @sizeOf(usize) - 3);
234 try doTypePunBitsTest(&weird_ptr[0]);
235 if (ptr_size > @sizeOf(Bits))
236 try doTypePunBitsTest(&weird_ptr[1]);
237
238 var arr_bytes = @ptrCast(*[2][ptr_size]u8, &arr);
239
240 var rebuilt_bytes: [ptr_size]u8 = undefined;
241 var i: usize = 0;
242 while (i < ptr_size - 3) : (i += 1) {
243 rebuilt_bytes[i] = arr_bytes[0][i];
244 }
245 while (i < ptr_size) : (i += 1) {
246 rebuilt_bytes[i] = arr_bytes[1][i];
247 }
248
249 try testing.expectEqual(&imports.global_u32, @intToPtr(*u32, @bitCast(usize, rebuilt_bytes)));
250 }
251}
252
253test "offset array ptr by element size" {
254 comptime {
255 const VirtualStruct = struct { x: u32 };
256 var arr: [4]VirtualStruct = .{
257 .{ .x = bigToNativeEndian(u32, 0x0004080c) },
258 .{ .x = bigToNativeEndian(u32, 0x0105090d) },
259 .{ .x = bigToNativeEndian(u32, 0x02060a0e) },
260 .{ .x = bigToNativeEndian(u32, 0x03070b0f) },
261 };
262
263 const address = @ptrToInt(&arr);
264 try testing.expectEqual(@ptrToInt(&arr[0]), address);
265 try testing.expectEqual(@ptrToInt(&arr[0]) + 10, address + 10);
266 try testing.expectEqual(@ptrToInt(&arr[1]), address + @sizeOf(VirtualStruct));
267 try testing.expectEqual(@ptrToInt(&arr[2]), address + 2 * @sizeOf(VirtualStruct));
268 try testing.expectEqual(@ptrToInt(&arr[3]), address + @sizeOf(VirtualStruct) * 3);
269
270 const secondElement = @intToPtr(*VirtualStruct, @ptrToInt(&arr[0]) + 2 * @sizeOf(VirtualStruct));
271 try testing.expectEqual(bigToNativeEndian(u32, 0x02060a0e), secondElement.x);
272 }
273}
274
275test "offset instance by field size" {
276 comptime {
277 const VirtualStruct = struct { x: u32, y: u32, z: u32, w: u32 };
278 var inst = VirtualStruct{ .x = 0, .y = 1, .z = 2, .w = 3 };
279
280 var ptr = @ptrToInt(&inst);
281 ptr -= 4;
282 ptr += @offsetOf(VirtualStruct, "x");
283 try testing.expectEqual(@as(u32, 0), @intToPtr([*]u32, ptr)[1]);
284 ptr -= @offsetOf(VirtualStruct, "x");
285 ptr += @offsetOf(VirtualStruct, "y");
286 try testing.expectEqual(@as(u32, 1), @intToPtr([*]u32, ptr)[1]);
287 ptr = ptr - @offsetOf(VirtualStruct, "y") + @offsetOf(VirtualStruct, "z");
288 try testing.expectEqual(@as(u32, 2), @intToPtr([*]u32, ptr)[1]);
289 ptr = @ptrToInt(&inst.z) - 4 - @offsetOf(VirtualStruct, "z");
290 ptr += @offsetOf(VirtualStruct, "w");
291 try testing.expectEqual(@as(u32, 3), @intToPtr(*u32, ptr + 4).*);
292 }
293}
294
295test "offset field ptr by enclosing array element size" {
296 comptime {
297 const VirtualStruct = struct { x: u32 };
298 var arr: [4]VirtualStruct = .{
299 .{ .x = bigToNativeEndian(u32, 0x0004080c) },
300 .{ .x = bigToNativeEndian(u32, 0x0105090d) },
301 .{ .x = bigToNativeEndian(u32, 0x02060a0e) },
302 .{ .x = bigToNativeEndian(u32, 0x03070b0f) },
303 };
304
305 var i: usize = 0;
306 while (i < 4) : (i += 1) {
307 var ptr: [*]u8 = @ptrCast([*]u8, &arr[0]);
308 ptr += i;
309 ptr += @offsetOf(VirtualStruct, "x");
310 var j: usize = 0;
311 while (j < 4) : (j += 1) {
312 const base = ptr + j * @sizeOf(VirtualStruct);
313 try testing.expectEqual(@intCast(u8, i * 4 + j), base[0]);
314 }
315 }
316 }
317}
test/behavior/generics.zig+2-1
......@@ -91,7 +91,8 @@ test "type constructed by comptime function call" {
9191}
9292
9393fn SimpleList(comptime L: usize) type {
94 var T = u8;
94 var mutable_T = u8;
95 const T = mutable_T;
9596 return struct {
9697 array: [L]T,
9798 };
test/behavior/misc.zig+2-2
......@@ -506,7 +506,7 @@ test "lazy typeInfo value as generic parameter" {
506506 S.foo(@typeInfo(@TypeOf(.{})));
507507}
508508
509fn A() type {
509fn ZA() type {
510510 return struct {
511511 b: B(),
512512
......@@ -520,7 +520,7 @@ fn A() type {
520520 };
521521}
522522test "non-ambiguous reference of shadowed decls" {
523 try expect(A().B().Self != A().Self);
523 try expect(ZA().B().Self != ZA().Self);
524524}
525525
526526test "use of declaration with same name as primitive" {
test/cases.zig+5-4
......@@ -984,8 +984,8 @@ pub fn addCases(ctx: *TestContext) !void {
984984 \\};
985985 , &.{
986986 ":4:17: error: ambiguous reference",
987 ":1:1: note: declared here",
988 ":2:5: note: also declared here",
987 ":2:5: note: declared here",
988 ":1:1: note: also declared here",
989989 });
990990
991991 ctx.compileError("inner func accessing outer var", linux_x64,
......@@ -999,8 +999,9 @@ pub fn addCases(ctx: *TestContext) !void {
999999 \\ _ = S;
10001000 \\}
10011001 , &.{
1002 ":5:20: error: 'bar' not accessible from inner function",
1003 ":2:9: note: declared here",
1002 ":5:20: error: mutable 'bar' not accessible from here",
1003 ":2:9: note: declared mutable here",
1004 ":3:15: note: crosses namespace boundary here",
10041005 });
10051006
10061007 ctx.compileError("global variable redeclaration", linux_x64,
test/compile_errors.zig+24
......@@ -5342,6 +5342,17 @@ pub fn addCases(ctx: *TestContext) !void {
53425342 "tmp.zig:2:1: note: declared here",
53435343 });
53445344
5345 ctx.objErrStage1("local shadows global that occurs later",
5346 \\pub fn main() void {
5347 \\ var foo = true;
5348 \\ _ = foo;
5349 \\}
5350 \\fn foo() void {}
5351 , &[_][]const u8{
5352 "tmp.zig:2:9: error: local shadows declaration of 'foo'",
5353 "tmp.zig:5:1: note: declared here",
5354 });
5355
53455356 ctx.objErrStage1("switch expression - missing enumeration prong",
53465357 \\const Number = enum {
53475358 \\ One,
......@@ -8814,4 +8825,17 @@ pub fn addCases(ctx: *TestContext) !void {
88148825 , &[_][]const u8{
88158826 "error: Unsupported OS",
88168827 });
8828
8829 ctx.objErrStage1("attempt to close over comptime variable from outer scope",
8830 \\fn SimpleList(comptime L: usize) type {
8831 \\ var T = u8;
8832 \\ return struct {
8833 \\ array: [L]T,
8834 \\ };
8835 \\}
8836 , &[_][]const u8{
8837 "tmp.zig:4:19: error: mutable 'T' not accessible from here",
8838 "tmp.zig:2:9: note: declared mutable here",
8839 "tmp.zig:3:12: note: crosses namespace boundary here",
8840 });
88178841}
test/tests.zig+30-34
......@@ -160,24 +160,22 @@ const test_targets = blk: {
160160 // .link_libc = true,
161161 //},
162162
163 // https://github.com/ziglang/zig/issues/8155
164 //TestTarget{
165 // .target = .{
166 // .cpu_arch = .mips,
167 // .os_tag = .linux,
168 // .abi = .none,
169 // },
170 //},
163 TestTarget{
164 .target = .{
165 .cpu_arch = .mips,
166 .os_tag = .linux,
167 .abi = .none,
168 },
169 },
171170
172 // https://github.com/ziglang/zig/issues/8155
173 //TestTarget{
174 // .target = .{
175 // .cpu_arch = .mips,
176 // .os_tag = .linux,
177 // .abi = .musl,
178 // },
179 // .link_libc = true,
180 //},
171 TestTarget{
172 .target = .{
173 .cpu_arch = .mips,
174 .os_tag = .linux,
175 .abi = .musl,
176 },
177 .link_libc = true,
178 },
181179
182180 // https://github.com/ziglang/zig/issues/4927
183181 //TestTarget{
......@@ -189,24 +187,22 @@ const test_targets = blk: {
189187 // .link_libc = true,
190188 //},
191189
192 // https://github.com/ziglang/zig/issues/8155
193 //TestTarget{
194 // .target = .{
195 // .cpu_arch = .mipsel,
196 // .os_tag = .linux,
197 // .abi = .none,
198 // },
199 //},
190 TestTarget{
191 .target = .{
192 .cpu_arch = .mipsel,
193 .os_tag = .linux,
194 .abi = .none,
195 },
196 },
200197
201 // https://github.com/ziglang/zig/issues/8155
202 //TestTarget{
203 // .target = .{
204 // .cpu_arch = .mipsel,
205 // .os_tag = .linux,
206 // .abi = .musl,
207 // },
208 // .link_libc = true,
209 //},
198 TestTarget{
199 .target = .{
200 .cpu_arch = .mipsel,
201 .os_tag = .linux,
202 .abi = .musl,
203 },
204 .link_libc = true,
205 },
210206
211207 // https://github.com/ziglang/zig/issues/4927
212208 //TestTarget{
test/translate_c.zig+12-4
......@@ -318,8 +318,8 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
318318 \\};
319319 \\pub const Color = struct_Color;
320320 ,
321 \\pub inline fn CLITERAL(type_1: anytype) @TypeOf(type_1) {
322 \\ return type_1;
321 \\pub inline fn CLITERAL(@"type": anytype) @TypeOf(@"type") {
322 \\ return @"type";
323323 \\}
324324 ,
325325 \\pub const LIGHTGRAY = @import("std").mem.zeroInit(CLITERAL(Color), .{ @as(c_int, 200), @as(c_int, 200), @as(c_int, 200), @as(c_int, 255) });
......@@ -2031,10 +2031,18 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
20312031 cases.add("shadowing primitive types",
20322032 \\unsigned anyerror = 2;
20332033 \\#define noreturn _Noreturn
2034 \\typedef enum {
2035 \\ f32,
2036 \\ u32,
2037 \\} BadEnum;
20342038 , &[_][]const u8{
2035 \\pub export var anyerror_1: c_uint = 2;
2039 \\pub export var @"anyerror": c_uint = 2;
2040 ,
2041 \\pub const @"noreturn" = @compileError("unable to translate C expr: unexpected token .Keyword_noreturn");
20362042 ,
2037 \\pub const noreturn_2 = @compileError("unable to translate C expr: unexpected token .Keyword_noreturn");
2043 \\pub const @"f32": c_int = 0;
2044 \\pub const @"u32": c_int = 1;
2045 \\pub const BadEnum = c_uint;
20382046 });
20392047
20402048 cases.add("floats",