authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-03-17 14:55:22-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-03-17 14:55:22-07:00
log5c4bbd0657d52b1b579036b9ee32418e8d706966
treedebda5e9a9dd98a8e1ad3339c2a19730e604b0d7
parentaea45bdf252c5040b1883e83014f31e2122427de
parentf56f3c5824af17516bcf3a0559b98cdad20bd416

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


21 files changed, 212 insertions(+), 61 deletions(-)

lib/build_runner.zig+9-4
...@@ -204,7 +204,11 @@ pub fn main() !void {...@@ -204,7 +204,11 @@ pub fn main() !void {
204 } else if (mem.eql(u8, arg, "--verbose-air")) {204 } else if (mem.eql(u8, arg, "--verbose-air")) {
205 builder.verbose_air = true;205 builder.verbose_air = true;
206 } else if (mem.eql(u8, arg, "--verbose-llvm-ir")) {206 } else if (mem.eql(u8, arg, "--verbose-llvm-ir")) {
207 builder.verbose_llvm_ir = true;207 builder.verbose_llvm_ir = "-";
208 } else if (mem.startsWith(u8, arg, "--verbose-llvm-ir=")) {
209 builder.verbose_llvm_ir = arg["--verbose-llvm-ir=".len..];
210 } else if (mem.eql(u8, arg, "--verbose-llvm-bc=")) {
211 builder.verbose_llvm_bc = arg["--verbose-llvm-bc=".len..];
208 } else if (mem.eql(u8, arg, "--verbose-cimport")) {212 } else if (mem.eql(u8, arg, "--verbose-cimport")) {
209 builder.verbose_cimport = true;213 builder.verbose_cimport = true;
210 } else if (mem.eql(u8, arg, "--verbose-cc")) {214 } else if (mem.eql(u8, arg, "--verbose-cc")) {
...@@ -990,7 +994,8 @@ fn usage(builder: *std.Build, already_ran_build: bool, out_stream: anytype) !voi...@@ -990,7 +994,8 @@ fn usage(builder: *std.Build, already_ran_build: bool, out_stream: anytype) !voi
990 \\ --debug-pkg-config Fail if unknown pkg-config flags encountered994 \\ --debug-pkg-config Fail if unknown pkg-config flags encountered
991 \\ --verbose-link Enable compiler debug output for linking995 \\ --verbose-link Enable compiler debug output for linking
992 \\ --verbose-air Enable compiler debug output for Zig AIR996 \\ --verbose-air Enable compiler debug output for Zig AIR
993 \\ --verbose-llvm-ir Enable compiler debug output for LLVM IR997 \\ --verbose-llvm-ir[=file] Enable compiler debug output for LLVM IR
998 \\ --verbose-llvm-bc=[file] Enable compiler debug output for LLVM BC
994 \\ --verbose-cimport Enable compiler debug output for C imports999 \\ --verbose-cimport Enable compiler debug output for C imports
995 \\ --verbose-cc Enable compiler debug output for C compilation1000 \\ --verbose-cc Enable compiler debug output for C compilation
996 \\ --verbose-llvm-cpu-features Enable compiler debug output for LLVM CPU features1001 \\ --verbose-llvm-cpu-features Enable compiler debug output for LLVM CPU features
...@@ -1003,13 +1008,13 @@ fn usageAndErr(builder: *std.Build, already_ran_build: bool, out_stream: anytype...@@ -1003,13 +1008,13 @@ fn usageAndErr(builder: *std.Build, already_ran_build: bool, out_stream: anytype
1003 process.exit(1);1008 process.exit(1);
1004}1009}
10051010
1006fn nextArg(args: [][]const u8, idx: *usize) ?[]const u8 {1011fn nextArg(args: [][:0]const u8, idx: *usize) ?[:0]const u8 {
1007 if (idx.* >= args.len) return null;1012 if (idx.* >= args.len) return null;
1008 defer idx.* += 1;1013 defer idx.* += 1;
1009 return args[idx.*];1014 return args[idx.*];
1010}1015}
10111016
1012fn argsRest(args: [][]const u8, idx: usize) ?[][]const u8 {1017fn argsRest(args: [][:0]const u8, idx: usize) ?[][:0]const u8 {
1013 if (idx >= args.len) return null;1018 if (idx >= args.len) return null;
1014 return args[idx..];1019 return args[idx..];
1015}1020}
lib/std/Build.zig+7-4
...@@ -54,12 +54,13 @@ verbose: bool,...@@ -54,12 +54,13 @@ verbose: bool,
54verbose_link: bool,54verbose_link: bool,
55verbose_cc: bool,55verbose_cc: bool,
56verbose_air: bool,56verbose_air: bool,
57verbose_llvm_ir: bool,57verbose_llvm_ir: ?[]const u8,
58verbose_llvm_bc: ?[]const u8,
58verbose_cimport: bool,59verbose_cimport: bool,
59verbose_llvm_cpu_features: bool,60verbose_llvm_cpu_features: bool,
60reference_trace: ?u32 = null,61reference_trace: ?u32 = null,
61invalid_user_input: bool,62invalid_user_input: bool,
62zig_exe: []const u8,63zig_exe: [:0]const u8,
63default_step: *Step,64default_step: *Step,
64env_map: *EnvMap,65env_map: *EnvMap,
65top_level_steps: std.StringArrayHashMapUnmanaged(*TopLevelStep),66top_level_steps: std.StringArrayHashMapUnmanaged(*TopLevelStep),
...@@ -183,7 +184,7 @@ pub const DirList = struct {...@@ -183,7 +184,7 @@ pub const DirList = struct {
183184
184pub fn create(185pub fn create(
185 allocator: Allocator,186 allocator: Allocator,
186 zig_exe: []const u8,187 zig_exe: [:0]const u8,
187 build_root: Cache.Directory,188 build_root: Cache.Directory,
188 cache_root: Cache.Directory,189 cache_root: Cache.Directory,
189 global_cache_root: Cache.Directory,190 global_cache_root: Cache.Directory,
...@@ -204,7 +205,8 @@ pub fn create(...@@ -204,7 +205,8 @@ pub fn create(
204 .verbose_link = false,205 .verbose_link = false,
205 .verbose_cc = false,206 .verbose_cc = false,
206 .verbose_air = false,207 .verbose_air = false,
207 .verbose_llvm_ir = false,208 .verbose_llvm_ir = null,
209 .verbose_llvm_bc = null,
208 .verbose_cimport = false,210 .verbose_cimport = false,
209 .verbose_llvm_cpu_features = false,211 .verbose_llvm_cpu_features = false,
210 .invalid_user_input = false,212 .invalid_user_input = false,
...@@ -292,6 +294,7 @@ fn createChildOnly(parent: *Build, dep_name: []const u8, build_root: Cache.Direc...@@ -292,6 +294,7 @@ fn createChildOnly(parent: *Build, dep_name: []const u8, build_root: Cache.Direc
292 .verbose_cc = parent.verbose_cc,294 .verbose_cc = parent.verbose_cc,
293 .verbose_air = parent.verbose_air,295 .verbose_air = parent.verbose_air,
294 .verbose_llvm_ir = parent.verbose_llvm_ir,296 .verbose_llvm_ir = parent.verbose_llvm_ir,
297 .verbose_llvm_bc = parent.verbose_llvm_bc,
295 .verbose_cimport = parent.verbose_cimport,298 .verbose_cimport = parent.verbose_cimport,
296 .verbose_llvm_cpu_features = parent.verbose_llvm_cpu_features,299 .verbose_llvm_cpu_features = parent.verbose_llvm_cpu_features,
297 .reference_trace = parent.reference_trace,300 .reference_trace = parent.reference_trace,
lib/std/Build/CompileStep.zig+2-1
...@@ -1438,7 +1438,8 @@ fn make(step: *Step, prog_node: *std.Progress.Node) !void {...@@ -1438,7 +1438,8 @@ fn make(step: *Step, prog_node: *std.Progress.Node) !void {
14381438
1439 if (b.verbose_cimport) try zig_args.append("--verbose-cimport");1439 if (b.verbose_cimport) try zig_args.append("--verbose-cimport");
1440 if (b.verbose_air) try zig_args.append("--verbose-air");1440 if (b.verbose_air) try zig_args.append("--verbose-air");
1441 if (b.verbose_llvm_ir) try zig_args.append("--verbose-llvm-ir");1441 if (b.verbose_llvm_ir) |path| try zig_args.append(b.fmt("--verbose-llvm-ir={s}", .{path}));
1442 if (b.verbose_llvm_bc) |path| try zig_args.append(b.fmt("--verbose-llvm-bc={s}", .{path}));
1442 if (b.verbose_link or self.verbose_link) try zig_args.append("--verbose-link");1443 if (b.verbose_link or self.verbose_link) try zig_args.append("--verbose-link");
1443 if (b.verbose_cc or self.verbose_cc) try zig_args.append("--verbose-cc");1444 if (b.verbose_cc or self.verbose_cc) try zig_args.append("--verbose-cc");
1444 if (b.verbose_llvm_cpu_features) try zig_args.append("--verbose-llvm-cpu-features");1445 if (b.verbose_llvm_cpu_features) try zig_args.append("--verbose-llvm-cpu-features");
lib/std/bounded_array.zig+39-6
...@@ -16,9 +16,30 @@ const testing = std.testing;...@@ -16,9 +16,30 @@ const testing = std.testing;
16/// var a_clone = a; // creates a copy - the structure doesn't use any internal pointers16/// var a_clone = a; // creates a copy - the structure doesn't use any internal pointers
17/// ```17/// ```
18pub fn BoundedArray(comptime T: type, comptime buffer_capacity: usize) type {18pub fn BoundedArray(comptime T: type, comptime buffer_capacity: usize) type {
19 return BoundedArrayAligned(T, @alignOf(T), buffer_capacity);
20}
21
22/// A structure with an array, length and alignment, that can be used as a
23/// slice.
24///
25/// Useful to pass around small explicitly-aligned arrays whose exact size is
26/// only known at runtime, but whose maximum size is known at comptime, without
27/// requiring an `Allocator`.
28/// ```zig
29// var a = try BoundedArrayAligned(u8, 16, 2).init(0);
30// try a.append(255);
31// try a.append(255);
32// const b = @ptrCast(*const [1]u16, a.constSlice().ptr);
33// try testing.expectEqual(@as(u16, 65535), b[0]);
34/// ```
35pub fn BoundedArrayAligned(
36 comptime T: type,
37 comptime alignment: u29,
38 comptime buffer_capacity: usize,
39) type {
19 return struct {40 return struct {
20 const Self = @This();41 const Self = @This();
21 buffer: [buffer_capacity]T = undefined,42 buffer: [buffer_capacity]T align(alignment) = undefined,
22 len: usize = 0,43 len: usize = 0,
2344
24 /// Set the actual length of the slice.45 /// Set the actual length of the slice.
...@@ -30,15 +51,15 @@ pub fn BoundedArray(comptime T: type, comptime buffer_capacity: usize) type {...@@ -30,15 +51,15 @@ pub fn BoundedArray(comptime T: type, comptime buffer_capacity: usize) type {
3051
31 /// View the internal array as a slice whose size was previously set.52 /// View the internal array as a slice whose size was previously set.
32 pub fn slice(self: anytype) switch (@TypeOf(&self.buffer)) {53 pub fn slice(self: anytype) switch (@TypeOf(&self.buffer)) {
33 *[buffer_capacity]T => []T,54 *align(alignment) [buffer_capacity]T => []align(alignment) T,
34 *const [buffer_capacity]T => []const T,55 *align(alignment) const [buffer_capacity]T => []align(alignment) const T,
35 else => unreachable,56 else => unreachable,
36 } {57 } {
37 return self.buffer[0..self.len];58 return self.buffer[0..self.len];
38 }59 }
3960
40 /// View the internal array as a constant slice whose size was previously set.61 /// View the internal array as a constant slice whose size was previously set.
41 pub fn constSlice(self: *const Self) []const T {62 pub fn constSlice(self: *const Self) []align(alignment) const T {
42 return self.slice();63 return self.slice();
43 }64 }
4465
...@@ -94,7 +115,7 @@ pub fn BoundedArray(comptime T: type, comptime buffer_capacity: usize) type {...@@ -94,7 +115,7 @@ pub fn BoundedArray(comptime T: type, comptime buffer_capacity: usize) type {
94115
95 /// Resize the slice, adding `n` new elements, which have `undefined` values.116 /// Resize the slice, adding `n` new elements, which have `undefined` values.
96 /// The return value is a slice pointing to the uninitialized elements.117 /// The return value is a slice pointing to the uninitialized elements.
97 pub fn addManyAsArray(self: *Self, comptime n: usize) error{Overflow}!*[n]T {118 pub fn addManyAsArray(self: *Self, comptime n: usize) error{Overflow}!*align(alignment) [n]T {
98 const prev_len = self.len;119 const prev_len = self.len;
99 try self.resize(self.len + n);120 try self.resize(self.len + n);
100 return self.slice()[prev_len..][0..n];121 return self.slice()[prev_len..][0..n];
...@@ -118,7 +139,7 @@ pub fn BoundedArray(comptime T: type, comptime buffer_capacity: usize) type {...@@ -118,7 +139,7 @@ pub fn BoundedArray(comptime T: type, comptime buffer_capacity: usize) type {
118 /// This can be useful for writing directly into it.139 /// This can be useful for writing directly into it.
119 /// Note that such an operation must be followed up with a140 /// Note that such an operation must be followed up with a
120 /// call to `resize()`141 /// call to `resize()`
121 pub fn unusedCapacitySlice(self: *Self) []T {142 pub fn unusedCapacitySlice(self: *Self) []align(alignment) T {
122 return self.buffer[self.len..];143 return self.buffer[self.len..];
123 }144 }
124145
...@@ -365,3 +386,15 @@ test "BoundedArray" {...@@ -365,3 +386,15 @@ test "BoundedArray" {
365 try w.writeAll(s);386 try w.writeAll(s);
366 try testing.expectEqualStrings(s, a.constSlice());387 try testing.expectEqualStrings(s, a.constSlice());
367}388}
389
390test "BoundedArrayAligned" {
391 var a = try BoundedArrayAligned(u8, 16, 4).init(0);
392 try a.append(0);
393 try a.append(0);
394 try a.append(255);
395 try a.append(255);
396
397 const b = @ptrCast(*const [2]u16, a.constSlice().ptr);
398 try testing.expectEqual(@as(u16, 0), b[0]);
399 try testing.expectEqual(@as(u16, 65535), b[1]);
400}
lib/std/crypto/tls.zig+4
...@@ -215,6 +215,10 @@ pub const NamedGroup = enum(u16) {...@@ -215,6 +215,10 @@ pub const NamedGroup = enum(u16) {
215 ffdhe6144 = 0x0103,215 ffdhe6144 = 0x0103,
216 ffdhe8192 = 0x0104,216 ffdhe8192 = 0x0104,
217217
218 // Hybrid post-quantum key agreements
219 x25519_kyber512d00 = 0xFE30,
220 x25519_kyber768d00 = 0xFE31,
221
218 _,222 _,
219};223};
220224
lib/std/crypto/tls/Client.zig+27-8
...@@ -158,6 +158,7 @@ pub fn init(stream: anytype, ca_bundle: Certificate.Bundle, host: []const u8) In...@@ -158,6 +158,7 @@ pub fn init(stream: anytype, ca_bundle: Certificate.Bundle, host: []const u8) In
158 // Only possible to happen if the private key is all zeroes.158 // Only possible to happen if the private key is all zeroes.
159 error.IdentityElement => return error.InsufficientEntropy,159 error.IdentityElement => return error.InsufficientEntropy,
160 };160 };
161 const kyber768_kp = crypto.kem.kyber_d00.Kyber768.KeyPair.create(null) catch {};
161162
162 const extensions_payload =163 const extensions_payload =
163 tls.extension(.supported_versions, [_]u8{164 tls.extension(.supported_versions, [_]u8{
...@@ -175,6 +176,7 @@ pub fn init(stream: anytype, ca_bundle: Certificate.Bundle, host: []const u8) In...@@ -175,6 +176,7 @@ pub fn init(stream: anytype, ca_bundle: Certificate.Bundle, host: []const u8) In
175 .rsa_pkcs1_sha512,176 .rsa_pkcs1_sha512,
176 .ed25519,177 .ed25519,
177 })) ++ tls.extension(.supported_groups, enum_array(tls.NamedGroup, &.{178 })) ++ tls.extension(.supported_groups, enum_array(tls.NamedGroup, &.{
179 .x25519_kyber768d00,
178 .secp256r1,180 .secp256r1,
179 .x25519,181 .x25519,
180 })) ++ tls.extension(182 })) ++ tls.extension(
...@@ -182,7 +184,9 @@ pub fn init(stream: anytype, ca_bundle: Certificate.Bundle, host: []const u8) In...@@ -182,7 +184,9 @@ pub fn init(stream: anytype, ca_bundle: Certificate.Bundle, host: []const u8) In
182 array(1, int2(@enumToInt(tls.NamedGroup.x25519)) ++184 array(1, int2(@enumToInt(tls.NamedGroup.x25519)) ++
183 array(1, x25519_kp.public_key) ++185 array(1, x25519_kp.public_key) ++
184 int2(@enumToInt(tls.NamedGroup.secp256r1)) ++186 int2(@enumToInt(tls.NamedGroup.secp256r1)) ++
185 array(1, secp256r1_kp.public_key.toUncompressedSec1())),187 array(1, secp256r1_kp.public_key.toUncompressedSec1()) ++
188 int2(@enumToInt(tls.NamedGroup.x25519_kyber768d00)) ++
189 array(1, x25519_kp.public_key ++ kyber768_kp.public_key.toBytes())),
186 ) ++190 ) ++
187 int2(@enumToInt(tls.ExtensionType.server_name)) ++191 int2(@enumToInt(tls.ExtensionType.server_name)) ++
188 int2(host_len + 5) ++ // byte length of this extension payload192 int2(host_len + 5) ++ // byte length of this extension payload
...@@ -274,7 +278,7 @@ pub fn init(stream: anytype, ca_bundle: Certificate.Bundle, host: []const u8) In...@@ -274,7 +278,7 @@ pub fn init(stream: anytype, ca_bundle: Certificate.Bundle, host: []const u8) In
274 const extensions_size = hsd.decode(u16);278 const extensions_size = hsd.decode(u16);
275 var all_extd = try hsd.sub(extensions_size);279 var all_extd = try hsd.sub(extensions_size);
276 var supported_version: u16 = 0;280 var supported_version: u16 = 0;
277 var shared_key: [32]u8 = undefined;281 var shared_key: []const u8 = undefined;
278 var have_shared_key = false;282 var have_shared_key = false;
279 while (!all_extd.eof()) {283 while (!all_extd.eof()) {
280 try all_extd.ensure(2 + 2);284 try all_extd.ensure(2 + 2);
...@@ -295,14 +299,29 @@ pub fn init(stream: anytype, ca_bundle: Certificate.Bundle, host: []const u8) In...@@ -295,14 +299,29 @@ pub fn init(stream: anytype, ca_bundle: Certificate.Bundle, host: []const u8) In
295 const key_size = extd.decode(u16);299 const key_size = extd.decode(u16);
296 try extd.ensure(key_size);300 try extd.ensure(key_size);
297 switch (named_group) {301 switch (named_group) {
302 .x25519_kyber768d00 => {
303 const xksl = crypto.dh.X25519.public_length;
304 const hksl = xksl + crypto.kem.kyber_d00.Kyber768.ciphertext_length;
305 if (key_size != hksl)
306 return error.TlsIllegalParameter;
307 const server_ks = extd.array(hksl);
308
309 shared_key = &((crypto.dh.X25519.scalarmult(
310 x25519_kp.secret_key,
311 server_ks[0..xksl].*,
312 ) catch return error.TlsDecryptFailure) ++ (kyber768_kp.secret_key.decaps(
313 server_ks[xksl..hksl],
314 ) catch return error.TlsDecryptFailure));
315 },
298 .x25519 => {316 .x25519 => {
299 if (key_size != 32) return error.TlsIllegalParameter;317 const ksl = crypto.dh.X25519.public_length;
300 const server_pub_key = extd.array(32);318 if (key_size != ksl) return error.TlsIllegalParameter;
319 const server_pub_key = extd.array(ksl);
301320
302 shared_key = crypto.dh.X25519.scalarmult(321 shared_key = &(crypto.dh.X25519.scalarmult(
303 x25519_kp.secret_key,322 x25519_kp.secret_key,
304 server_pub_key.*,323 server_pub_key.*,
305 ) catch return error.TlsDecryptFailure;324 ) catch return error.TlsDecryptFailure);
306 },325 },
307 .secp256r1 => {326 .secp256r1 => {
308 const server_pub_key = extd.slice(key_size);327 const server_pub_key = extd.slice(key_size);
...@@ -314,7 +333,7 @@ pub fn init(stream: anytype, ca_bundle: Certificate.Bundle, host: []const u8) In...@@ -314,7 +333,7 @@ pub fn init(stream: anytype, ca_bundle: Certificate.Bundle, host: []const u8) In
314 const mul = pk.p.mulPublic(secp256r1_kp.secret_key.bytes, .Big) catch {333 const mul = pk.p.mulPublic(secp256r1_kp.secret_key.bytes, .Big) catch {
315 return error.TlsDecryptFailure;334 return error.TlsDecryptFailure;
316 };335 };
317 shared_key = mul.affineCoordinates().x.toBytes(.Big);336 shared_key = &mul.affineCoordinates().x.toBytes(.Big);
318 },337 },
319 else => {338 else => {
320 return error.TlsIllegalParameter;339 return error.TlsIllegalParameter;
...@@ -358,7 +377,7 @@ pub fn init(stream: anytype, ca_bundle: Certificate.Bundle, host: []const u8) In...@@ -358,7 +377,7 @@ pub fn init(stream: anytype, ca_bundle: Certificate.Bundle, host: []const u8) In
358 const early_secret = P.Hkdf.extract(&[1]u8{0}, &zeroes);377 const early_secret = P.Hkdf.extract(&[1]u8{0}, &zeroes);
359 const empty_hash = tls.emptyHash(P.Hash);378 const empty_hash = tls.emptyHash(P.Hash);
360 const hs_derived_secret = hkdfExpandLabel(P.Hkdf, early_secret, "derived", &empty_hash, P.Hash.digest_length);379 const hs_derived_secret = hkdfExpandLabel(P.Hkdf, early_secret, "derived", &empty_hash, P.Hash.digest_length);
361 p.handshake_secret = P.Hkdf.extract(&hs_derived_secret, &shared_key);380 p.handshake_secret = P.Hkdf.extract(&hs_derived_secret, shared_key);
362 const ap_derived_secret = hkdfExpandLabel(P.Hkdf, p.handshake_secret, "derived", &empty_hash, P.Hash.digest_length);381 const ap_derived_secret = hkdfExpandLabel(P.Hkdf, p.handshake_secret, "derived", &empty_hash, P.Hash.digest_length);
363 p.master_secret = P.Hkdf.extract(&ap_derived_secret, &zeroes);382 p.master_secret = P.Hkdf.extract(&ap_derived_secret, &zeroes);
364 const client_secret = hkdfExpandLabel(P.Hkdf, p.handshake_secret, "c hs traffic", &hello_hash, P.Hash.digest_length);383 const client_secret = hkdfExpandLabel(P.Hkdf, p.handshake_secret, "c hs traffic", &hello_hash, P.Hash.digest_length);
lib/std/net.zig+24-21
...@@ -741,7 +741,7 @@ pub fn tcpConnectToAddress(address: Address) TcpConnectToAddressError!Stream {...@@ -741,7 +741,7 @@ pub fn tcpConnectToAddress(address: Address) TcpConnectToAddressError!Stream {
741 return Stream{ .handle = sockfd };741 return Stream{ .handle = sockfd };
742}742}
743743
744const GetAddressListError = std.mem.Allocator.Error || std.fs.File.OpenError || std.fs.File.ReadError || std.os.SocketError || std.os.BindError || error{744const GetAddressListError = std.mem.Allocator.Error || std.fs.File.OpenError || std.fs.File.ReadError || std.os.SocketError || std.os.BindError || std.os.SetSockOptError || error{
745 // TODO: break this up into error sets from the various underlying functions745 // TODO: break this up into error sets from the various underlying functions
746746
747 TemporaryNameServerFailure,747 TemporaryNameServerFailure,
...@@ -1534,15 +1534,10 @@ fn resMSendRc(...@@ -1534,15 +1534,10 @@ fn resMSendRc(
1534 ns[i] = iplit.addr;1534 ns[i] = iplit.addr;
1535 assert(ns[i].getPort() == 53);1535 assert(ns[i].getPort() == 53);
1536 if (iplit.addr.any.family != os.AF.INET) {1536 if (iplit.addr.any.family != os.AF.INET) {
1537 sl = @sizeOf(os.sockaddr.in6);
1538 family = os.AF.INET6;1537 family = os.AF.INET6;
1539 }1538 }
1540 }1539 }
15411540
1542 // Get local address and open/bind a socket
1543 var sa: Address = undefined;
1544 @memset(@ptrCast([*]u8, &sa), 0, @sizeOf(Address));
1545 sa.any.family = family;
1546 const flags = os.SOCK.DGRAM | os.SOCK.CLOEXEC | os.SOCK.NONBLOCK;1541 const flags = os.SOCK.DGRAM | os.SOCK.CLOEXEC | os.SOCK.NONBLOCK;
1547 const fd = os.socket(family, flags, 0) catch |err| switch (err) {1542 const fd = os.socket(family, flags, 0) catch |err| switch (err) {
1548 error.AddressFamilyNotSupported => blk: {1543 error.AddressFamilyNotSupported => blk: {
...@@ -1556,27 +1551,35 @@ fn resMSendRc(...@@ -1556,27 +1551,35 @@ fn resMSendRc(
1556 else => |e| return e,1551 else => |e| return e,
1557 };1552 };
1558 defer os.closeSocket(fd);1553 defer os.closeSocket(fd);
1559 try os.bind(fd, &sa.any, sl);
15601554
1561 // Past this point, there are no errors. Each individual query will1555 // Past this point, there are no errors. Each individual query will
1562 // yield either no reply (indicated by zero length) or an answer1556 // yield either no reply (indicated by zero length) or an answer
1563 // packet which is up to the caller to interpret.1557 // packet which is up to the caller to interpret.
15641558
1565 // Convert any IPv4 addresses in a mixed environment to v4-mapped1559 // Convert any IPv4 addresses in a mixed environment to v4-mapped
1566 // TODO1560 if (family == os.AF.INET6) {
1567 //if (family == AF.INET6) {1561 try os.setsockopt(
1568 // setsockopt(fd, IPPROTO.IPV6, IPV6_V6ONLY, &(int){0}, sizeof 0);1562 fd,
1569 // for (i=0; i<nns; i++) {1563 os.SOL.IPV6,
1570 // if (ns[i].sin.sin_family != AF.INET) continue;1564 os.linux.IPV6.V6ONLY,
1571 // memcpy(ns[i].sin6.sin6_addr.s6_addr+12,1565 &mem.toBytes(@as(c_int, 0)),
1572 // &ns[i].sin.sin_addr, 4);1566 );
1573 // memcpy(ns[i].sin6.sin6_addr.s6_addr,1567 for (0..ns.len) |i| {
1574 // "\0\0\0\0\0\0\0\0\0\0\xff\xff", 12);1568 if (ns[i].any.family != os.AF.INET) continue;
1575 // ns[i].sin6.sin6_family = AF.INET6;1569 mem.writeIntNative(u32, ns[i].in6.sa.addr[12..], ns[i].in.sa.addr);
1576 // ns[i].sin6.sin6_flowinfo = 0;1570 mem.copy(u8, ns[i].in6.sa.addr[0..12], "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff");
1577 // ns[i].sin6.sin6_scope_id = 0;1571 ns[i].any.family = os.AF.INET6;
1578 // }1572 ns[i].in6.sa.flowinfo = 0;
1579 //}1573 ns[i].in6.sa.scope_id = 0;
1574 }
1575 sl = @sizeOf(os.sockaddr.in6);
1576 }
1577
1578 // Get local address and open/bind a socket
1579 var sa: Address = undefined;
1580 @memset(@ptrCast([*]u8, &sa), 0, @sizeOf(Address));
1581 sa.any.family = family;
1582 try os.bind(fd, &sa.any, sl);
15801583
1581 var pfd = [1]os.pollfd{os.pollfd{1584 var pfd = [1]os.pollfd{os.pollfd{
1582 .fd = fd,1585 .fd = fd,
lib/std/std.zig+1
...@@ -9,6 +9,7 @@ pub const AutoArrayHashMapUnmanaged = array_hash_map.AutoArrayHashMapUnmanaged;...@@ -9,6 +9,7 @@ pub const AutoArrayHashMapUnmanaged = array_hash_map.AutoArrayHashMapUnmanaged;
9pub const AutoHashMap = hash_map.AutoHashMap;9pub const AutoHashMap = hash_map.AutoHashMap;
10pub const AutoHashMapUnmanaged = hash_map.AutoHashMapUnmanaged;10pub const AutoHashMapUnmanaged = hash_map.AutoHashMapUnmanaged;
11pub const BoundedArray = @import("bounded_array.zig").BoundedArray;11pub const BoundedArray = @import("bounded_array.zig").BoundedArray;
12pub const BoundedArrayAligned = @import("bounded_array.zig").BoundedArrayAligned;
12pub const Build = @import("Build.zig");13pub const Build = @import("Build.zig");
13pub const BufMap = @import("buf_map.zig").BufMap;14pub const BufMap = @import("buf_map.zig").BufMap;
14pub const BufSet = @import("buf_set.zig").BufSet;15pub const BufSet = @import("buf_set.zig").BufSet;
src/Compilation.zig+7-2
...@@ -86,7 +86,8 @@ clang_preprocessor_mode: ClangPreprocessorMode,...@@ -86,7 +86,8 @@ clang_preprocessor_mode: ClangPreprocessorMode,
86/// Whether to print clang argvs to stdout.86/// Whether to print clang argvs to stdout.
87verbose_cc: bool,87verbose_cc: bool,
88verbose_air: bool,88verbose_air: bool,
89verbose_llvm_ir: bool,89verbose_llvm_ir: ?[]const u8,
90verbose_llvm_bc: ?[]const u8,
90verbose_cimport: bool,91verbose_cimport: bool,
91verbose_llvm_cpu_features: bool,92verbose_llvm_cpu_features: bool,
92disable_c_depfile: bool,93disable_c_depfile: bool,
...@@ -585,7 +586,8 @@ pub const InitOptions = struct {...@@ -585,7 +586,8 @@ pub const InitOptions = struct {
585 verbose_cc: bool = false,586 verbose_cc: bool = false,
586 verbose_link: bool = false,587 verbose_link: bool = false,
587 verbose_air: bool = false,588 verbose_air: bool = false,
588 verbose_llvm_ir: bool = false,589 verbose_llvm_ir: ?[]const u8 = null,
590 verbose_llvm_bc: ?[]const u8 = null,
589 verbose_cimport: bool = false,591 verbose_cimport: bool = false,
590 verbose_llvm_cpu_features: bool = false,592 verbose_llvm_cpu_features: bool = false,
591 is_test: bool = false,593 is_test: bool = false,
...@@ -1559,6 +1561,7 @@ pub fn create(gpa: Allocator, options: InitOptions) !*Compilation {...@@ -1559,6 +1561,7 @@ pub fn create(gpa: Allocator, options: InitOptions) !*Compilation {
1559 .verbose_cc = options.verbose_cc,1561 .verbose_cc = options.verbose_cc,
1560 .verbose_air = options.verbose_air,1562 .verbose_air = options.verbose_air,
1561 .verbose_llvm_ir = options.verbose_llvm_ir,1563 .verbose_llvm_ir = options.verbose_llvm_ir,
1564 .verbose_llvm_bc = options.verbose_llvm_bc,
1562 .verbose_cimport = options.verbose_cimport,1565 .verbose_cimport = options.verbose_cimport,
1563 .verbose_llvm_cpu_features = options.verbose_llvm_cpu_features,1566 .verbose_llvm_cpu_features = options.verbose_llvm_cpu_features,
1564 .disable_c_depfile = options.disable_c_depfile,1567 .disable_c_depfile = options.disable_c_depfile,
...@@ -5349,6 +5352,7 @@ fn buildOutputFromZig(...@@ -5349,6 +5352,7 @@ fn buildOutputFromZig(
5349 .verbose_link = comp.bin_file.options.verbose_link,5352 .verbose_link = comp.bin_file.options.verbose_link,
5350 .verbose_air = comp.verbose_air,5353 .verbose_air = comp.verbose_air,
5351 .verbose_llvm_ir = comp.verbose_llvm_ir,5354 .verbose_llvm_ir = comp.verbose_llvm_ir,
5355 .verbose_llvm_bc = comp.verbose_llvm_bc,
5352 .verbose_cimport = comp.verbose_cimport,5356 .verbose_cimport = comp.verbose_cimport,
5353 .verbose_llvm_cpu_features = comp.verbose_llvm_cpu_features,5357 .verbose_llvm_cpu_features = comp.verbose_llvm_cpu_features,
5354 .clang_passthrough_mode = comp.clang_passthrough_mode,5358 .clang_passthrough_mode = comp.clang_passthrough_mode,
...@@ -5426,6 +5430,7 @@ pub fn build_crt_file(...@@ -5426,6 +5430,7 @@ pub fn build_crt_file(
5426 .verbose_link = comp.bin_file.options.verbose_link,5430 .verbose_link = comp.bin_file.options.verbose_link,
5427 .verbose_air = comp.verbose_air,5431 .verbose_air = comp.verbose_air,
5428 .verbose_llvm_ir = comp.verbose_llvm_ir,5432 .verbose_llvm_ir = comp.verbose_llvm_ir,
5433 .verbose_llvm_bc = comp.verbose_llvm_bc,
5429 .verbose_cimport = comp.verbose_cimport,5434 .verbose_cimport = comp.verbose_cimport,
5430 .verbose_llvm_cpu_features = comp.verbose_llvm_cpu_features,5435 .verbose_llvm_cpu_features = comp.verbose_llvm_cpu_features,
5431 .clang_passthrough_mode = comp.clang_passthrough_mode,5436 .clang_passthrough_mode = comp.clang_passthrough_mode,
src/Module.zig+2-2
...@@ -4263,7 +4263,7 @@ pub fn ensureFuncBodyAnalyzed(mod: *Module, func: *Fn) SemaError!void {...@@ -4263,7 +4263,7 @@ pub fn ensureFuncBodyAnalyzed(mod: *Module, func: *Fn) SemaError!void {
4263 comp.emit_llvm_bc == null);4263 comp.emit_llvm_bc == null);
42644264
4265 const dump_air = builtin.mode == .Debug and comp.verbose_air;4265 const dump_air = builtin.mode == .Debug and comp.verbose_air;
4266 const dump_llvm_ir = builtin.mode == .Debug and comp.verbose_llvm_ir;4266 const dump_llvm_ir = builtin.mode == .Debug and (comp.verbose_llvm_ir != null or comp.verbose_llvm_bc != null);
42674267
4268 if (no_bin_file and !dump_air and !dump_llvm_ir) return;4268 if (no_bin_file and !dump_air and !dump_llvm_ir) return;
42694269
...@@ -6395,7 +6395,7 @@ pub fn linkerUpdateDecl(mod: *Module, decl_index: Decl.Index) !void {...@@ -6395,7 +6395,7 @@ pub fn linkerUpdateDecl(mod: *Module, decl_index: Decl.Index) !void {
6395 comp.emit_llvm_ir == null and6395 comp.emit_llvm_ir == null and
6396 comp.emit_llvm_bc == null);6396 comp.emit_llvm_bc == null);
63976397
6398 const dump_llvm_ir = builtin.mode == .Debug and comp.verbose_llvm_ir;6398 const dump_llvm_ir = builtin.mode == .Debug and (comp.verbose_llvm_ir != null or comp.verbose_llvm_bc != null);
63996399
6400 if (no_bin_file and !dump_llvm_ir) return;6400 if (no_bin_file and !dump_llvm_ir) return;
64016401
src/Sema.zig+12-3
...@@ -4712,6 +4712,11 @@ fn zirValidateDeref(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileErr...@@ -4712,6 +4712,11 @@ fn zirValidateDeref(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileErr
4712 .Slice => return sema.fail(block, src, "index syntax required for slice type '{}'", .{operand_ty.fmt(sema.mod)}),4712 .Slice => return sema.fail(block, src, "index syntax required for slice type '{}'", .{operand_ty.fmt(sema.mod)}),
4713 }4713 }
47144714
4715 if ((try sema.typeHasOnePossibleValue(operand_ty.childType())) != null) {
4716 // No need to validate the actual pointer value, we don't need it!
4717 return;
4718 }
4719
4715 const elem_ty = operand_ty.elemType2();4720 const elem_ty = operand_ty.elemType2();
4716 if (try sema.resolveMaybeUndefVal(operand)) |val| {4721 if (try sema.resolveMaybeUndefVal(operand)) |val| {
4717 if (val.isUndef()) {4722 if (val.isUndef()) {
...@@ -15449,9 +15454,13 @@ fn zirRetAddr(...@@ -15449,9 +15454,13 @@ fn zirRetAddr(
15449 block: *Block,15454 block: *Block,
15450 extended: Zir.Inst.Extended.InstData,15455 extended: Zir.Inst.Extended.InstData,
15451) CompileError!Air.Inst.Ref {15456) CompileError!Air.Inst.Ref {
15452 const src = LazySrcLoc.nodeOffset(@bitCast(i32, extended.operand));15457 _ = extended;
15453 try sema.requireRuntimeBlock(block, src, null);15458 if (block.is_comptime) {
15454 return try block.addNoOp(.ret_addr);15459 // TODO: we could give a meaningful lazy value here. #14938
15460 return sema.addIntUnsigned(Type.usize, 0);
15461 } else {
15462 return block.addNoOp(.ret_addr);
15463 }
15455}15464}
1545615465
15457fn zirFrameAddress(15466fn zirFrameAddress(
src/codegen/llvm.zig+29-2
...@@ -756,8 +756,35 @@ pub const Object = struct {...@@ -756,8 +756,35 @@ pub const Object = struct {
756 dib.finalize();756 dib.finalize();
757 }757 }
758758
759 if (comp.verbose_llvm_ir) {759 if (comp.verbose_llvm_ir) |path| {
760 self.llvm_module.dump();760 if (std.mem.eql(u8, path, "-")) {
761 self.llvm_module.dump();
762 } else {
763 const path_z = try comp.gpa.dupeZ(u8, path);
764 defer comp.gpa.free(path_z);
765
766 var error_message: [*:0]const u8 = undefined;
767
768 if (self.llvm_module.printModuleToFile(path_z, &error_message).toBool()) {
769 defer llvm.disposeMessage(error_message);
770
771 log.err("dump LLVM module failed ir={s}: {s}", .{
772 path, error_message,
773 });
774 }
775 }
776 }
777
778 if (comp.verbose_llvm_bc) |path| {
779 const path_z = try comp.gpa.dupeZ(u8, path);
780 defer comp.gpa.free(path_z);
781
782 const error_code = self.llvm_module.writeBitcodeToFile(path_z);
783 if (error_code != 0) {
784 log.err("dump LLVM module failed bc={s}: {d}", .{
785 path, error_code,
786 });
787 }
761 }788 }
762789
763 var arena_allocator = std.heap.ArenaAllocator.init(comp.gpa);790 var arena_allocator = std.heap.ArenaAllocator.init(comp.gpa);
src/codegen/llvm/bindings.zig+3
...@@ -422,6 +422,9 @@ pub const Module = opaque {...@@ -422,6 +422,9 @@ pub const Module = opaque {
422422
423 pub const printModuleToFile = LLVMPrintModuleToFile;423 pub const printModuleToFile = LLVMPrintModuleToFile;
424 extern fn LLVMPrintModuleToFile(M: *Module, Filename: [*:0]const u8, ErrorMessage: *[*:0]const u8) Bool;424 extern fn LLVMPrintModuleToFile(M: *Module, Filename: [*:0]const u8, ErrorMessage: *[*:0]const u8) Bool;
425
426 pub const writeBitcodeToFile = LLVMWriteBitcodeToFile;
427 extern fn LLVMWriteBitcodeToFile(M: *Module, Path: [*:0]const u8) c_int;
425};428};
426429
427pub const lookupIntrinsicID = LLVMLookupIntrinsicID;430pub const lookupIntrinsicID = LLVMLookupIntrinsicID;
src/glibc.zig+1
...@@ -1097,6 +1097,7 @@ fn buildSharedLib(...@@ -1097,6 +1097,7 @@ fn buildSharedLib(
1097 .verbose_link = comp.bin_file.options.verbose_link,1097 .verbose_link = comp.bin_file.options.verbose_link,
1098 .verbose_air = comp.verbose_air,1098 .verbose_air = comp.verbose_air,
1099 .verbose_llvm_ir = comp.verbose_llvm_ir,1099 .verbose_llvm_ir = comp.verbose_llvm_ir,
1100 .verbose_llvm_bc = comp.verbose_llvm_bc,
1100 .verbose_cimport = comp.verbose_cimport,1101 .verbose_cimport = comp.verbose_cimport,
1101 .verbose_llvm_cpu_features = comp.verbose_llvm_cpu_features,1102 .verbose_llvm_cpu_features = comp.verbose_llvm_cpu_features,
1102 .clang_passthrough_mode = comp.clang_passthrough_mode,1103 .clang_passthrough_mode = comp.clang_passthrough_mode,
src/libcxx.zig+2
...@@ -250,6 +250,7 @@ pub fn buildLibCXX(comp: *Compilation, prog_node: *std.Progress.Node) !void {...@@ -250,6 +250,7 @@ pub fn buildLibCXX(comp: *Compilation, prog_node: *std.Progress.Node) !void {
250 .verbose_link = comp.bin_file.options.verbose_link,250 .verbose_link = comp.bin_file.options.verbose_link,
251 .verbose_air = comp.verbose_air,251 .verbose_air = comp.verbose_air,
252 .verbose_llvm_ir = comp.verbose_llvm_ir,252 .verbose_llvm_ir = comp.verbose_llvm_ir,
253 .verbose_llvm_bc = comp.verbose_llvm_bc,
253 .verbose_cimport = comp.verbose_cimport,254 .verbose_cimport = comp.verbose_cimport,
254 .verbose_llvm_cpu_features = comp.verbose_llvm_cpu_features,255 .verbose_llvm_cpu_features = comp.verbose_llvm_cpu_features,
255 .clang_passthrough_mode = comp.clang_passthrough_mode,256 .clang_passthrough_mode = comp.clang_passthrough_mode,
...@@ -410,6 +411,7 @@ pub fn buildLibCXXABI(comp: *Compilation, prog_node: *std.Progress.Node) !void {...@@ -410,6 +411,7 @@ pub fn buildLibCXXABI(comp: *Compilation, prog_node: *std.Progress.Node) !void {
410 .verbose_link = comp.bin_file.options.verbose_link,411 .verbose_link = comp.bin_file.options.verbose_link,
411 .verbose_air = comp.verbose_air,412 .verbose_air = comp.verbose_air,
412 .verbose_llvm_ir = comp.verbose_llvm_ir,413 .verbose_llvm_ir = comp.verbose_llvm_ir,
414 .verbose_llvm_bc = comp.verbose_llvm_bc,
413 .verbose_cimport = comp.verbose_cimport,415 .verbose_cimport = comp.verbose_cimport,
414 .verbose_llvm_cpu_features = comp.verbose_llvm_cpu_features,416 .verbose_llvm_cpu_features = comp.verbose_llvm_cpu_features,
415 .clang_passthrough_mode = comp.clang_passthrough_mode,417 .clang_passthrough_mode = comp.clang_passthrough_mode,
src/libtsan.zig+1
...@@ -226,6 +226,7 @@ pub fn buildTsan(comp: *Compilation, prog_node: *std.Progress.Node) !void {...@@ -226,6 +226,7 @@ pub fn buildTsan(comp: *Compilation, prog_node: *std.Progress.Node) !void {
226 .verbose_link = comp.bin_file.options.verbose_link,226 .verbose_link = comp.bin_file.options.verbose_link,
227 .verbose_air = comp.verbose_air,227 .verbose_air = comp.verbose_air,
228 .verbose_llvm_ir = comp.verbose_llvm_ir,228 .verbose_llvm_ir = comp.verbose_llvm_ir,
229 .verbose_llvm_bc = comp.verbose_llvm_bc,
229 .verbose_cimport = comp.verbose_cimport,230 .verbose_cimport = comp.verbose_cimport,
230 .verbose_llvm_cpu_features = comp.verbose_llvm_cpu_features,231 .verbose_llvm_cpu_features = comp.verbose_llvm_cpu_features,
231 .clang_passthrough_mode = comp.clang_passthrough_mode,232 .clang_passthrough_mode = comp.clang_passthrough_mode,
src/libunwind.zig+1
...@@ -122,6 +122,7 @@ pub fn buildStaticLib(comp: *Compilation, prog_node: *std.Progress.Node) !void {...@@ -122,6 +122,7 @@ pub fn buildStaticLib(comp: *Compilation, prog_node: *std.Progress.Node) !void {
122 .verbose_link = comp.bin_file.options.verbose_link,122 .verbose_link = comp.bin_file.options.verbose_link,
123 .verbose_air = comp.verbose_air,123 .verbose_air = comp.verbose_air,
124 .verbose_llvm_ir = comp.verbose_llvm_ir,124 .verbose_llvm_ir = comp.verbose_llvm_ir,
125 .verbose_llvm_bc = comp.verbose_llvm_bc,
125 .verbose_cimport = comp.verbose_cimport,126 .verbose_cimport = comp.verbose_cimport,
126 .verbose_llvm_cpu_features = comp.verbose_llvm_cpu_features,127 .verbose_llvm_cpu_features = comp.verbose_llvm_cpu_features,
127 .clang_passthrough_mode = comp.clang_passthrough_mode,128 .clang_passthrough_mode = comp.clang_passthrough_mode,
src/main.zig+15-8
...@@ -370,10 +370,10 @@ const usage_build_generic =...@@ -370,10 +370,10 @@ const usage_build_generic =
370 \\ -fno-emit-bin Do not output machine code370 \\ -fno-emit-bin Do not output machine code
371 \\ -femit-asm[=path] Output .s (assembly code)371 \\ -femit-asm[=path] Output .s (assembly code)
372 \\ -fno-emit-asm (default) Do not output .s (assembly code)372 \\ -fno-emit-asm (default) Do not output .s (assembly code)
373 \\ -femit-llvm-ir[=path] Produce a .ll file with LLVM IR (requires LLVM extensions)373 \\ -femit-llvm-ir[=path] Produce a .ll file with optimized LLVM IR (requires LLVM extensions)
374 \\ -fno-emit-llvm-ir (default) Do not produce a .ll file with LLVM IR374 \\ -fno-emit-llvm-ir (default) Do not produce a .ll file with optimized LLVM IR
375 \\ -femit-llvm-bc[=path] Produce a LLVM module as a .bc file (requires LLVM extensions)375 \\ -femit-llvm-bc[=path] Produce an optimized LLVM module as a .bc file (requires LLVM extensions)
376 \\ -fno-emit-llvm-bc (default) Do not produce a LLVM module as a .bc file376 \\ -fno-emit-llvm-bc (default) Do not produce an optimized LLVM module as a .bc file
377 \\ -femit-h[=path] Generate a C header file (.h)377 \\ -femit-h[=path] Generate a C header file (.h)
378 \\ -fno-emit-h (default) Do not generate a C header file (.h)378 \\ -fno-emit-h (default) Do not generate a C header file (.h)
379 \\ -femit-docs[=path] Create a docs/ dir with html documentation379 \\ -femit-docs[=path] Create a docs/ dir with html documentation
...@@ -555,13 +555,14 @@ const usage_build_generic =...@@ -555,13 +555,14 @@ const usage_build_generic =
555 \\ --test-runner [path] Specify a custom test runner555 \\ --test-runner [path] Specify a custom test runner
556 \\556 \\
557 \\Debug Options (Zig Compiler Development):557 \\Debug Options (Zig Compiler Development):
558 \\ -fopt-bisect-limit [limit] Only run [limit] first LLVM optimization passes558 \\ -fopt-bisect-limit=[limit] Only run [limit] first LLVM optimization passes
559 \\ -ftime-report Print timing diagnostics559 \\ -ftime-report Print timing diagnostics
560 \\ -fstack-report Print stack size diagnostics560 \\ -fstack-report Print stack size diagnostics
561 \\ --verbose-link Display linker invocations561 \\ --verbose-link Display linker invocations
562 \\ --verbose-cc Display C compiler invocations562 \\ --verbose-cc Display C compiler invocations
563 \\ --verbose-air Enable compiler debug output for Zig AIR563 \\ --verbose-air Enable compiler debug output for Zig AIR
564 \\ --verbose-llvm-ir Enable compiler debug output for LLVM IR564 \\ --verbose-llvm-ir[=path] Enable compiler debug output for unoptimized LLVM IR
565 \\ --verbose-llvm-bc=[path] Enable compiler debug output for unoptimized LLVM BC
565 \\ --verbose-cimport Enable compiler debug output for C imports566 \\ --verbose-cimport Enable compiler debug output for C imports
566 \\ --verbose-llvm-cpu-features Enable compiler debug output for LLVM CPU features567 \\ --verbose-llvm-cpu-features Enable compiler debug output for LLVM CPU features
567 \\ --debug-log [scope] Enable printing debug/info log messages for scope568 \\ --debug-log [scope] Enable printing debug/info log messages for scope
...@@ -704,7 +705,8 @@ fn buildOutputType(...@@ -704,7 +705,8 @@ fn buildOutputType(
704 var verbose_link = (builtin.os.tag != .wasi or builtin.link_libc) and std.process.hasEnvVarConstant("ZIG_VERBOSE_LINK");705 var verbose_link = (builtin.os.tag != .wasi or builtin.link_libc) and std.process.hasEnvVarConstant("ZIG_VERBOSE_LINK");
705 var verbose_cc = (builtin.os.tag != .wasi or builtin.link_libc) and std.process.hasEnvVarConstant("ZIG_VERBOSE_CC");706 var verbose_cc = (builtin.os.tag != .wasi or builtin.link_libc) and std.process.hasEnvVarConstant("ZIG_VERBOSE_CC");
706 var verbose_air = false;707 var verbose_air = false;
707 var verbose_llvm_ir = false;708 var verbose_llvm_ir: ?[]const u8 = null;
709 var verbose_llvm_bc: ?[]const u8 = null;
708 var verbose_cimport = false;710 var verbose_cimport = false;
709 var verbose_llvm_cpu_features = false;711 var verbose_llvm_cpu_features = false;
710 var time_report = false;712 var time_report = false;
...@@ -1441,7 +1443,11 @@ fn buildOutputType(...@@ -1441,7 +1443,11 @@ fn buildOutputType(
1441 } else if (mem.eql(u8, arg, "--verbose-air")) {1443 } else if (mem.eql(u8, arg, "--verbose-air")) {
1442 verbose_air = true;1444 verbose_air = true;
1443 } else if (mem.eql(u8, arg, "--verbose-llvm-ir")) {1445 } else if (mem.eql(u8, arg, "--verbose-llvm-ir")) {
1444 verbose_llvm_ir = true;1446 verbose_llvm_ir = "-";
1447 } else if (mem.startsWith(u8, arg, "--verbose-llvm-ir=")) {
1448 verbose_llvm_ir = arg["--verbose-llvm-ir=".len..];
1449 } else if (mem.startsWith(u8, arg, "--verbose-llvm-bc=")) {
1450 verbose_llvm_bc = arg["--verbose-llvm-bc=".len..];
1445 } else if (mem.eql(u8, arg, "--verbose-cimport")) {1451 } else if (mem.eql(u8, arg, "--verbose-cimport")) {
1446 verbose_cimport = true;1452 verbose_cimport = true;
1447 } else if (mem.eql(u8, arg, "--verbose-llvm-cpu-features")) {1453 } else if (mem.eql(u8, arg, "--verbose-llvm-cpu-features")) {
...@@ -3226,6 +3232,7 @@ fn buildOutputType(...@@ -3226,6 +3232,7 @@ fn buildOutputType(
3226 .verbose_link = verbose_link,3232 .verbose_link = verbose_link,
3227 .verbose_air = verbose_air,3233 .verbose_air = verbose_air,
3228 .verbose_llvm_ir = verbose_llvm_ir,3234 .verbose_llvm_ir = verbose_llvm_ir,
3235 .verbose_llvm_bc = verbose_llvm_bc,
3229 .verbose_cimport = verbose_cimport,3236 .verbose_cimport = verbose_cimport,
3230 .verbose_llvm_cpu_features = verbose_llvm_cpu_features,3237 .verbose_llvm_cpu_features = verbose_llvm_cpu_features,
3231 .machine_code_model = machine_code_model,3238 .machine_code_model = machine_code_model,
test/behavior.zig+1
...@@ -191,6 +191,7 @@ test {...@@ -191,6 +191,7 @@ test {
191 _ = @import("behavior/pub_enum.zig");191 _ = @import("behavior/pub_enum.zig");
192 _ = @import("behavior/ref_var_in_if_after_if_2nd_switch_prong.zig");192 _ = @import("behavior/ref_var_in_if_after_if_2nd_switch_prong.zig");
193 _ = @import("behavior/reflection.zig");193 _ = @import("behavior/reflection.zig");
194 _ = @import("behavior/return_address.zig");
194 _ = @import("behavior/saturating_arithmetic.zig");195 _ = @import("behavior/saturating_arithmetic.zig");
195 _ = @import("behavior/select.zig");196 _ = @import("behavior/select.zig");
196 _ = @import("behavior/shuffle.zig");197 _ = @import("behavior/shuffle.zig");
test/behavior/comptime_memory.zig+8
...@@ -420,3 +420,11 @@ test "mutate entire slice at comptime" {...@@ -420,3 +420,11 @@ test "mutate entire slice at comptime" {
420 buf[1..3].* = x;420 buf[1..3].* = x;
421 }421 }
422}422}
423
424test "dereference undefined pointer to zero-bit type" {
425 const p0: *void = undefined;
426 try testing.expectEqual({}, p0.*);
427
428 const p1: *[0]u32 = undefined;
429 try testing.expect(p1.*.len == 0);
430}
test/behavior/return_address.zig created+17
...@@ -0,0 +1,17 @@
1const builtin = @import("builtin");
2const testing = @import("std").testing;
3
4fn retAddr() usize {
5 return @returnAddress();
6}
7
8test "return address" {
9 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
10 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
11 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
12 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
13 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
14 _ = retAddr();
15 // TODO: #14938
16 try testing.expectEqual(0, comptime retAddr());
17}