aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Compilation.zig20
-rw-r--r--src/link.zig18
-rw-r--r--src/link/Coff/lld.zig2
-rw-r--r--src/link/Elf.zig2
-rw-r--r--src/link/MachO/zld.zig23
-rw-r--r--src/link/Wasm.zig4
-rw-r--r--src/main.zig19
7 files changed, 33 insertions, 55 deletions
diff --git a/src/Compilation.zig b/src/Compilation.zig
index 80231c91d0..069cc8a2c7 100644
--- a/src/Compilation.zig
+++ b/src/Compilation.zig
@@ -507,8 +507,7 @@ pub const InitOptions = struct {
c_source_files: []const CSourceFile = &[0]CSourceFile{},
link_objects: []LinkObject = &[0]LinkObject{},
framework_dirs: []const []const u8 = &[0][]const u8{},
- framework_names: []const []const u8 = &.{},
- framework_infos: []const Framework = &.{},
+ frameworks: []const Framework = &.{},
system_lib_names: []const []const u8 = &.{},
system_lib_infos: []const SystemLib = &.{},
/// These correspond to the WASI libc emulated subcomponents including:
@@ -831,7 +830,7 @@ pub fn create(gpa: Allocator, options: InitOptions) !*Compilation {
// Our linker can't handle objects or most advanced options yet.
if (options.link_objects.len != 0 or
options.c_source_files.len != 0 or
- options.framework_names.len != 0 or
+ options.frameworks.len != 0 or
options.system_lib_names.len != 0 or
options.link_libc or options.link_libcpp or
link_eh_frame_hdr or
@@ -1447,13 +1446,6 @@ pub fn create(gpa: Allocator, options: InitOptions) !*Compilation {
system_libs.putAssumeCapacity(lib_name, options.system_lib_infos[i]);
}
- var frameworks: std.StringArrayHashMapUnmanaged(Framework) = .{};
- errdefer frameworks.deinit(gpa);
- try frameworks.ensureTotalCapacity(gpa, options.framework_names.len);
- for (options.framework_names, options.framework_infos) |framework_name, info| {
- frameworks.putAssumeCapacity(framework_name, info);
- }
-
const bin_file = try link.File.openPath(gpa, .{
.emit = bin_file_emit,
.implib_emit = implib_emit,
@@ -1473,7 +1465,7 @@ pub fn create(gpa: Allocator, options: InitOptions) !*Compilation {
.link_libcpp = link_libcpp,
.link_libunwind = link_libunwind,
.objects = options.link_objects,
- .frameworks = frameworks,
+ .frameworks = options.frameworks,
.framework_dirs = options.framework_dirs,
.system_libs = system_libs,
.wasi_emulated_libs = options.wasi_emulated_libs,
@@ -2275,7 +2267,7 @@ fn prepareWholeEmitSubPath(arena: Allocator, opt_emit: ?EmitLoc) error{OutOfMemo
/// to remind the programmer to update multiple related pieces of code that
/// are in different locations. Bump this number when adding or deleting
/// anything from the link cache manifest.
-pub const link_hash_implementation_version = 9;
+pub const link_hash_implementation_version = 10;
fn addNonIncrementalStuffToCacheManifest(comp: *Compilation, man: *Cache.Manifest) !void {
const gpa = comp.gpa;
@@ -2285,7 +2277,7 @@ fn addNonIncrementalStuffToCacheManifest(comp: *Compilation, man: *Cache.Manifes
defer arena_allocator.deinit();
const arena = arena_allocator.allocator();
- comptime assert(link_hash_implementation_version == 9);
+ comptime assert(link_hash_implementation_version == 10);
if (comp.bin_file.options.module) |mod| {
const main_zig_file = try mod.main_pkg.root_src_directory.join(arena, &[_][]const u8{
@@ -2394,7 +2386,7 @@ fn addNonIncrementalStuffToCacheManifest(comp: *Compilation, man: *Cache.Manifes
// Mach-O specific stuff
man.hash.addListOfBytes(comp.bin_file.options.framework_dirs);
- link.hashAddFrameworks(&man.hash, comp.bin_file.options.frameworks);
+ try link.hashAddFrameworks(man, comp.bin_file.options.frameworks);
try man.addOptionalFile(comp.bin_file.options.entitlements);
man.hash.addOptional(comp.bin_file.options.pagezero_size);
man.hash.addOptional(comp.bin_file.options.headerpad_size);
diff --git a/src/link.zig b/src/link.zig
index 90a09f8e11..48ad78364c 100644
--- a/src/link.zig
+++ b/src/link.zig
@@ -57,15 +57,11 @@ pub fn hashAddSystemLibs(
}
}
-pub fn hashAddFrameworks(
- hh: *Cache.HashHelper,
- hm: std.StringArrayHashMapUnmanaged(Framework),
-) void {
- const keys = hm.keys();
- hh.addListOfBytes(keys);
- for (hm.values()) |value| {
- hh.add(value.needed);
- hh.add(value.weak);
+pub fn hashAddFrameworks(man: *Cache.Manifest, hm: []const Framework) !void {
+ for (hm) |value| {
+ man.hash.add(value.needed);
+ man.hash.add(value.weak);
+ _ = try man.addFile(value.path, null);
}
}
@@ -209,7 +205,7 @@ pub const Options = struct {
objects: []Compilation.LinkObject,
framework_dirs: []const []const u8,
- frameworks: std.StringArrayHashMapUnmanaged(Framework),
+ frameworks: []const Framework,
/// These are *always* dynamically linked. Static libraries will be
/// provided as positional arguments.
system_libs: std.StringArrayHashMapUnmanaged(SystemLib),
@@ -277,7 +273,6 @@ pub const Options = struct {
pub fn move(self: *Options) Options {
const copied_state = self.*;
- self.frameworks = .{};
self.system_libs = .{};
self.force_undefined_symbols = .{};
return copied_state;
@@ -643,7 +638,6 @@ pub const File = struct {
base.releaseLock();
if (base.file) |f| f.close();
if (base.intermediary_basename) |sub_path| base.allocator.free(sub_path);
- base.options.frameworks.deinit(base.allocator);
base.options.system_libs.deinit(base.allocator);
base.options.force_undefined_symbols.deinit(base.allocator);
switch (base.tag) {
diff --git a/src/link/Coff/lld.zig b/src/link/Coff/lld.zig
index bd82254e6a..c0f88704e5 100644
--- a/src/link/Coff/lld.zig
+++ b/src/link/Coff/lld.zig
@@ -63,7 +63,7 @@ pub fn linkWithLLD(self: *Coff, comp: *Compilation, prog_node: *std.Progress.Nod
man = comp.cache_parent.obtain();
self.base.releaseLock();
- comptime assert(Compilation.link_hash_implementation_version == 9);
+ comptime assert(Compilation.link_hash_implementation_version == 10);
for (self.base.options.objects) |obj| {
_ = try man.addFile(obj.path, null);
diff --git a/src/link/Elf.zig b/src/link/Elf.zig
index 9d71885e61..c1cc4355c6 100644
--- a/src/link/Elf.zig
+++ b/src/link/Elf.zig
@@ -1367,7 +1367,7 @@ fn linkWithLLD(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node) !v
// We are about to obtain this lock, so here we give other processes a chance first.
self.base.releaseLock();
- comptime assert(Compilation.link_hash_implementation_version == 9);
+ comptime assert(Compilation.link_hash_implementation_version == 10);
try man.addOptionalFile(self.base.options.linker_script);
try man.addOptionalFile(self.base.options.version_script);
diff --git a/src/link/MachO/zld.zig b/src/link/MachO/zld.zig
index 7987bb4f1d..e4dde33453 100644
--- a/src/link/MachO/zld.zig
+++ b/src/link/MachO/zld.zig
@@ -3396,7 +3396,7 @@ pub fn linkWithZld(macho_file: *MachO, comp: *Compilation, prog_node: *std.Progr
// We are about to obtain this lock, so here we give other processes a chance first.
macho_file.base.releaseLock();
- comptime assert(Compilation.link_hash_implementation_version == 9);
+ comptime assert(Compilation.link_hash_implementation_version == 10);
for (options.objects) |obj| {
_ = try man.addFile(obj.path, null);
@@ -3417,7 +3417,7 @@ pub fn linkWithZld(macho_file: *MachO, comp: *Compilation, prog_node: *std.Progr
man.hash.add(options.strip);
man.hash.addListOfBytes(options.lib_dirs);
man.hash.addListOfBytes(options.framework_dirs);
- link.hashAddFrameworks(&man.hash, options.frameworks);
+ try link.hashAddFrameworks(&man, options.frameworks);
man.hash.addListOfBytes(options.rpath_list);
if (is_dyn_lib) {
man.hash.addOptionalBytes(options.install_name);
@@ -3555,9 +3555,8 @@ pub fn linkWithZld(macho_file: *MachO, comp: *Compilation, prog_node: *std.Progr
}
{
- const vals = options.frameworks.values();
- try libs.ensureUnusedCapacity(vals.len);
- for (vals) |v| libs.putAssumeCapacity(v.path, .{
+ try libs.ensureUnusedCapacity(options.frameworks.len);
+ for (options.frameworks) |v| libs.putAssumeCapacity(v.path, .{
.needed = v.needed,
.weak = v.weak,
.path = v.path,
@@ -3664,14 +3663,14 @@ pub fn linkWithZld(macho_file: *MachO, comp: *Compilation, prog_node: *std.Progr
try argv.append(try std.fmt.allocPrint(arena, "-L{s}", .{lib_dir}));
}
- for (options.frameworks.keys()) |framework| {
- const info = options.frameworks.get(framework).?;
- const arg = if (info.needed)
- try std.fmt.allocPrint(arena, "-needed_framework {s}", .{framework})
- else if (info.weak)
- try std.fmt.allocPrint(arena, "-weak_framework {s}", .{framework})
+ for (options.frameworks) |framework| {
+ const name = std.fs.path.stem(framework.path);
+ const arg = if (framework.needed)
+ try std.fmt.allocPrint(arena, "-needed_framework {s}", .{name})
+ else if (framework.weak)
+ try std.fmt.allocPrint(arena, "-weak_framework {s}", .{name})
else
- try std.fmt.allocPrint(arena, "-framework {s}", .{framework});
+ try std.fmt.allocPrint(arena, "-framework {s}", .{name});
try argv.append(arg);
}
diff --git a/src/link/Wasm.zig b/src/link/Wasm.zig
index f705c18b69..89c552a3fb 100644
--- a/src/link/Wasm.zig
+++ b/src/link/Wasm.zig
@@ -3193,7 +3193,7 @@ fn linkWithZld(wasm: *Wasm, comp: *Compilation, prog_node: *std.Progress.Node) l
// We are about to obtain this lock, so here we give other processes a chance first.
wasm.base.releaseLock();
- comptime assert(Compilation.link_hash_implementation_version == 9);
+ comptime assert(Compilation.link_hash_implementation_version == 10);
for (options.objects) |obj| {
_ = try man.addFile(obj.path, null);
@@ -4254,7 +4254,7 @@ fn linkWithLLD(wasm: *Wasm, comp: *Compilation, prog_node: *std.Progress.Node) !
// We are about to obtain this lock, so here we give other processes a chance first.
wasm.base.releaseLock();
- comptime assert(Compilation.link_hash_implementation_version == 9);
+ comptime assert(Compilation.link_hash_implementation_version == 10);
for (wasm.base.options.objects) |obj| {
_ = try man.addFile(obj.path, null);
diff --git a/src/main.zig b/src/main.zig
index 3d59308ac1..5848961052 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -2876,10 +2876,7 @@ fn buildOutputType(
// After this point, resolved_system_libs is used instead of external_system_libs.
// We now repeat part of the process for frameworks.
- var resolved_frameworks: std.MultiArrayList(struct {
- name: []const u8,
- framework: Compilation.Framework,
- }) = .{};
+ var resolved_frameworks = std.ArrayList(Compilation.Framework).init(arena);
if (frameworks.keys().len > 0) {
var test_path = std.ArrayList(u8).init(gpa);
@@ -2904,13 +2901,10 @@ fn buildOutputType(
framework_name,
)) {
const path = try arena.dupe(u8, test_path.items);
- try resolved_frameworks.append(arena, .{
- .name = framework_name,
- .framework = .{
- .needed = info.needed,
- .weak = info.weak,
- .path = path,
- },
+ try resolved_frameworks.append(.{
+ .needed = info.needed,
+ .weak = info.weak,
+ .path = path,
});
continue :framework;
}
@@ -3327,8 +3321,7 @@ fn buildOutputType(
.c_source_files = c_source_files.items,
.link_objects = link_objects.items,
.framework_dirs = framework_dirs.items,
- .framework_names = resolved_frameworks.items(.name),
- .framework_infos = resolved_frameworks.items(.framework),
+ .frameworks = resolved_frameworks.items,
.system_lib_names = resolved_system_libs.items(.name),
.system_lib_infos = resolved_system_libs.items(.lib),
.wasi_emulated_libs = wasi_emulated_libs.items,