Skip to content

Commit 71bdb2d

Browse files
committed
Use length field as passed in stage2 libc_installation instead of relying on zero termination
1 parent 91d9898 commit 71bdb2d

File tree

6 files changed

+69
-53
lines changed

6 files changed

+69
-53
lines changed

src-self-hosted/libc_installation.zig

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@ usingnamespace @import("windows_sdk.zig");
1414

1515
/// See the render function implementation for documentation of the fields.
1616
pub const LibCInstallation = struct {
17-
include_dir: ?[:0]const u8 = null,
18-
sys_include_dir: ?[:0]const u8 = null,
19-
crt_dir: ?[:0]const u8 = null,
20-
msvc_lib_dir: ?[:0]const u8 = null,
21-
kernel32_lib_dir: ?[:0]const u8 = null,
17+
include_dir: ?[]const u8 = null,
18+
sys_include_dir: ?[]const u8 = null,
19+
crt_dir: ?[]const u8 = null,
20+
msvc_lib_dir: ?[]const u8 = null,
21+
kernel32_lib_dir: ?[]const u8 = null,
2222

2323
pub const FindError = error{
2424
OutOfMemory,
@@ -327,15 +327,14 @@ pub const LibCInstallation = struct {
327327
var search_buf: [2]Search = undefined;
328328
const searches = fillSearch(&search_buf, sdk);
329329

330-
var result_buf = try std.Buffer.initSize(allocator, 0);
331-
defer result_buf.deinit();
332-
333330
for (searches) |search| {
334-
result_buf.shrink(0);
331+
var result_buf = std.ArrayList(u8).init(allocator);
332+
defer result_buf.deinit();
335333
const stream = result_buf.outStream();
334+
336335
try stream.print("{}\\Include\\{}\\ucrt", .{ search.path, search.version });
337336

338-
var dir = fs.cwd().openDir(result_buf.toSliceConst(), .{}) catch |err| switch (err) {
337+
var dir = fs.cwd().openDir(result_buf.span(), .{}) catch |err| switch (err) {
339338
error.FileNotFound,
340339
error.NotDir,
341340
error.NoDevice,
@@ -367,9 +366,6 @@ pub const LibCInstallation = struct {
367366
var search_buf: [2]Search = undefined;
368367
const searches = fillSearch(&search_buf, sdk);
369368

370-
var result_buf = try std.Buffer.initSize(allocator, 0);
371-
defer result_buf.deinit();
372-
373369
const arch_sub_dir = switch (builtin.arch) {
374370
.i386 => "x86",
375371
.x86_64 => "x64",
@@ -378,11 +374,13 @@ pub const LibCInstallation = struct {
378374
};
379375

380376
for (searches) |search| {
381-
result_buf.shrink(0);
377+
var result_buf = std.ArrayList(u8).init(allocator);
378+
defer result_buf.deinit();
379+
382380
const stream = result_buf.outStream();
383381
try stream.print("{}\\Lib\\{}\\ucrt\\{}", .{ search.path, search.version, arch_sub_dir });
384382

385-
var dir = fs.cwd().openDir(result_buf.toSliceConst(), .{}) catch |err| switch (err) {
383+
var dir = fs.cwd().openDir(result_buf.span(), .{}) catch |err| switch (err) {
386384
error.FileNotFound,
387385
error.NotDir,
388386
error.NoDevice,
@@ -421,10 +419,6 @@ pub const LibCInstallation = struct {
421419

422420
var search_buf: [2]Search = undefined;
423421
const searches = fillSearch(&search_buf, sdk);
424-
425-
var result_buf = try std.Buffer.initSize(allocator, 0);
426-
defer result_buf.deinit();
427-
428422
const arch_sub_dir = switch (builtin.arch) {
429423
.i386 => "x86",
430424
.x86_64 => "x64",
@@ -433,11 +427,13 @@ pub const LibCInstallation = struct {
433427
};
434428

435429
for (searches) |search| {
436-
result_buf.shrink(0);
430+
var result_buf = std.ArrayList(u8).init(allocator);
431+
defer result_buf.deinit();
432+
437433
const stream = result_buf.outStream();
438434
try stream.print("{}\\Lib\\{}\\um\\{}", .{ search.path, search.version, arch_sub_dir });
439435

440-
var dir = fs.cwd().openDir(result_buf.toSliceConst(), .{}) catch |err| switch (err) {
436+
var dir = fs.cwd().openDir(result_buf.span(), .{}) catch |err| switch (err) {
441437
error.FileNotFound,
442438
error.NotDir,
443439
error.NoDevice,
@@ -470,12 +466,16 @@ pub const LibCInstallation = struct {
470466
const up1 = fs.path.dirname(msvc_lib_dir) orelse return error.LibCStdLibHeaderNotFound;
471467
const up2 = fs.path.dirname(up1) orelse return error.LibCStdLibHeaderNotFound;
472468

473-
var result_buf = try std.Buffer.init(allocator, up2);
474-
defer result_buf.deinit();
475-
476-
try result_buf.append("\\include");
469+
const sys_include_dir = try fs.path.join(
470+
allocator,
471+
&[_][]const u8{
472+
up2,
473+
"\\include",
474+
},
475+
);
476+
errdefer allocator.free(sys_include_dir);
477477

478-
var dir = fs.cwd().openDir(result_buf.toSliceConst(), .{}) catch |err| switch (err) {
478+
var dir = fs.cwd().openDir(sys_include_dir, .{}) catch |err| switch (err) {
479479
error.FileNotFound,
480480
error.NotDir,
481481
error.NoDevice,
@@ -490,7 +490,7 @@ pub const LibCInstallation = struct {
490490
else => return error.FileSystem,
491491
};
492492

493-
self.sys_include_dir = result_buf.toOwnedSlice();
493+
self.sys_include_dir = sys_include_dir;
494494
}
495495

496496
fn findNativeMsvcLibDir(

src-self-hosted/stage2.zig

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -741,15 +741,15 @@ fn stage2TargetParse(
741741

742742
// ABI warning
743743
const Stage2LibCInstallation = extern struct {
744-
include_dir: [*:0]const u8,
744+
include_dir: [*]const u8,
745745
include_dir_len: usize,
746-
sys_include_dir: [*:0]const u8,
746+
sys_include_dir: [*]const u8,
747747
sys_include_dir_len: usize,
748-
crt_dir: [*:0]const u8,
748+
crt_dir: [*]const u8,
749749
crt_dir_len: usize,
750-
msvc_lib_dir: [*:0]const u8,
750+
msvc_lib_dir: [*]const u8,
751751
msvc_lib_dir_len: usize,
752-
kernel32_lib_dir: [*:0]const u8,
752+
kernel32_lib_dir: [*]const u8,
753753
kernel32_lib_dir_len: usize,
754754

755755
fn initFromStage2(self: *Stage2LibCInstallation, libc: LibCInstallation) void {
@@ -793,19 +793,19 @@ const Stage2LibCInstallation = extern struct {
793793
fn toStage2(self: Stage2LibCInstallation) LibCInstallation {
794794
var libc: LibCInstallation = .{};
795795
if (self.include_dir_len != 0) {
796-
libc.include_dir = self.include_dir[0..self.include_dir_len :0];
796+
libc.include_dir = self.include_dir[0..self.include_dir_len];
797797
}
798798
if (self.sys_include_dir_len != 0) {
799-
libc.sys_include_dir = self.sys_include_dir[0..self.sys_include_dir_len :0];
799+
libc.sys_include_dir = self.sys_include_dir[0..self.sys_include_dir_len];
800800
}
801801
if (self.crt_dir_len != 0) {
802-
libc.crt_dir = self.crt_dir[0..self.crt_dir_len :0];
802+
libc.crt_dir = self.crt_dir[0..self.crt_dir_len];
803803
}
804804
if (self.msvc_lib_dir_len != 0) {
805-
libc.msvc_lib_dir = self.msvc_lib_dir[0..self.msvc_lib_dir_len :0];
805+
libc.msvc_lib_dir = self.msvc_lib_dir[0..self.msvc_lib_dir_len];
806806
}
807807
if (self.kernel32_lib_dir_len != 0) {
808-
libc.kernel32_lib_dir = self.kernel32_lib_dir[0..self.kernel32_lib_dir_len :0];
808+
libc.kernel32_lib_dir = self.kernel32_lib_dir[0..self.kernel32_lib_dir_len];
809809
}
810810
return libc;
811811
}

src/cache_hash.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,15 @@ void cache_init(CacheHash *ch, Buf *manifest_dir) {
2727
void cache_mem(CacheHash *ch, const char *ptr, size_t len) {
2828
assert(ch->manifest_file_path == nullptr);
2929
assert(ptr != nullptr);
30-
// + 1 to include the null byte
3130
blake2b_update(&ch->blake, ptr, len);
3231
}
3332

33+
void cache_slice(CacheHash *ch, Slice<const char> slice) {
34+
cache_mem(ch, slice.ptr, slice.len);
35+
}
36+
3437
void cache_str(CacheHash *ch, const char *ptr) {
38+
// + 1 to include the null byte
3539
cache_mem(ch, ptr, strlen(ptr) + 1);
3640
}
3741

src/cache_hash.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ void cache_init(CacheHash *ch, Buf *manifest_dir);
3636

3737
// Next, use the hash population functions to add the initial parameters.
3838
void cache_mem(CacheHash *ch, const char *ptr, size_t len);
39+
void cache_slice(CacheHash *ch, Slice<const char> slice);
3940
void cache_str(CacheHash *ch, const char *ptr);
4041
void cache_int(CacheHash *ch, int x);
4142
void cache_bool(CacheHash *ch, bool x);

src/codegen.cpp

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9125,21 +9125,26 @@ static void detect_libc(CodeGen *g) {
91259125
g->libc_include_dir_len = 0;
91269126
g->libc_include_dir_list = heap::c_allocator.allocate<const char *>(dir_count);
91279127

9128-
g->libc_include_dir_list[g->libc_include_dir_len] = g->libc->include_dir;
9128+
g->libc_include_dir_list[g->libc_include_dir_len] = buf_ptr(buf_create_from_mem(g->libc->include_dir, g->libc->include_dir_len));
91299129
g->libc_include_dir_len += 1;
91309130

91319131
if (want_sys_dir) {
9132-
g->libc_include_dir_list[g->libc_include_dir_len] = g->libc->sys_include_dir;
9132+
g->libc_include_dir_list[g->libc_include_dir_len] = buf_ptr(buf_create_from_mem(g->libc->sys_include_dir, g->libc->sys_include_dir_len));
91339133
g->libc_include_dir_len += 1;
91349134
}
91359135

91369136
if (want_um_and_shared_dirs != 0) {
9137-
g->libc_include_dir_list[g->libc_include_dir_len] = buf_ptr(buf_sprintf(
9138-
"%s" OS_SEP ".." OS_SEP "um", g->libc->include_dir));
9137+
Buf *include_dir_parent = buf_alloc();
9138+
os_path_join(buf_create_from_mem(g->libc->include_dir, g->libc->include_dir_len), buf_create_from_str(".."), include_dir_parent);
9139+
9140+
Buf *buff1 = buf_alloc();
9141+
os_path_join(include_dir_parent, buf_create_from_str("um"), buff1);
9142+
g->libc_include_dir_list[g->libc_include_dir_len] = buf_ptr(buff1);
91399143
g->libc_include_dir_len += 1;
91409144

9141-
g->libc_include_dir_list[g->libc_include_dir_len] = buf_ptr(buf_sprintf(
9142-
"%s" OS_SEP ".." OS_SEP "shared", g->libc->include_dir));
9145+
Buf *buff2 = buf_alloc();
9146+
os_path_join(include_dir_parent, buf_create_from_str("shared"), buff2);
9147+
g->libc_include_dir_list[g->libc_include_dir_len] = buf_ptr(buff2);
91439148
g->libc_include_dir_len += 1;
91449149
}
91459150
assert(g->libc_include_dir_len == dir_count);
@@ -10560,11 +10565,11 @@ static Error check_cache(CodeGen *g, Buf *manifest_dir, Buf *digest) {
1056010565
cache_list_of_str(ch, g->lib_dirs.items, g->lib_dirs.length);
1056110566
cache_list_of_str(ch, g->framework_dirs.items, g->framework_dirs.length);
1056210567
if (g->libc) {
10563-
cache_str(ch, g->libc->include_dir);
10564-
cache_str(ch, g->libc->sys_include_dir);
10565-
cache_str(ch, g->libc->crt_dir);
10566-
cache_str(ch, g->libc->msvc_lib_dir);
10567-
cache_str(ch, g->libc->kernel32_lib_dir);
10568+
cache_slice(ch, Slice<const char>{g->libc->include_dir, g->libc->include_dir_len});
10569+
cache_slice(ch, Slice<const char>{g->libc->sys_include_dir, g->libc->sys_include_dir_len});
10570+
cache_slice(ch, Slice<const char>{g->libc->crt_dir, g->libc->crt_dir_len});
10571+
cache_slice(ch, Slice<const char>{g->libc->msvc_lib_dir, g->libc->msvc_lib_dir_len});
10572+
cache_slice(ch, Slice<const char>{g->libc->kernel32_lib_dir, g->libc->kernel32_lib_dir_len});
1056810573
}
1056910574
cache_buf_opt(ch, g->version_script_path);
1057010575
cache_buf_opt(ch, g->override_soname);

src/link.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2387,11 +2387,17 @@ static void construct_linker_job_coff(LinkJob *lj) {
23872387
lj->args.append(buf_ptr(buf_sprintf("-LIBPATH:%s", g->libc->crt_dir)));
23882388

23892389
if (target_abi_is_gnu(g->zig_target->abi)) {
2390-
lj->args.append(buf_ptr(buf_sprintf("-LIBPATH:%s", g->libc->sys_include_dir)));
2391-
lj->args.append(buf_ptr(buf_sprintf("-LIBPATH:%s", g->libc->include_dir)));
2390+
Buf *buff = buf_create_from_str("-LIBPATH:");
2391+
buf_append_mem(buff, g->libc->sys_include_dir, g->libc->sys_include_dir_len);
2392+
lj->args.append(buf_ptr(buff));
23922393
} else {
2393-
lj->args.append(buf_ptr(buf_sprintf("-LIBPATH:%s", g->libc->msvc_lib_dir)));
2394-
lj->args.append(buf_ptr(buf_sprintf("-LIBPATH:%s", g->libc->kernel32_lib_dir)));
2394+
Buf *buff1 = buf_create_from_str("-LIBPATH:");
2395+
buf_append_mem(buff1, g->libc->msvc_lib_dir, g->libc->msvc_lib_dir_len);
2396+
lj->args.append(buf_ptr(buff1));
2397+
2398+
Buf *buff2 = buf_create_from_str("-LIBPATH:");
2399+
buf_append_mem(buff2, g->libc->kernel32_lib_dir, g->libc->kernel32_lib_dir_len);
2400+
lj->args.append(buf_ptr(buff2));
23952401
}
23962402
}
23972403

0 commit comments

Comments
 (0)