aboutsummaryrefslogtreecommitdiff
path: root/src/link
diff options
context:
space:
mode:
authorJacob Young <jacobly0@users.noreply.github.com>2023-08-09 00:24:17 -0400
committerJacob Young <jacobly0@users.noreply.github.com>2023-08-09 05:47:13 -0400
commitc4848694d20c19b78657ee46f18028737290c829 (patch)
treeaca82d4ff8c67dd985dead2c09be2ba9a9f956cb /src/link
parent151c06cce40f33649fa96937d53926a7769491b9 (diff)
downloadzig-c4848694d20c19b78657ee46f18028737290c829.tar.gz
zig-c4848694d20c19b78657ee46f18028737290c829.zip
llvm: enable even without libllvm linked
Diffstat (limited to 'src/link')
-rw-r--r--src/link/Coff.zig41
-rw-r--r--src/link/Elf.zig36
-rw-r--r--src/link/MachO.zig39
-rw-r--r--src/link/NvPtx.zig8
-rw-r--r--src/link/Wasm.zig39
5 files changed, 49 insertions, 114 deletions
diff --git a/src/link/Coff.zig b/src/link/Coff.zig
index f1b914c368..f86269fd52 100644
--- a/src/link/Coff.zig
+++ b/src/link/Coff.zig
@@ -225,7 +225,7 @@ pub const min_text_capacity = padToIdeal(minimum_text_block_size);
pub fn openPath(allocator: Allocator, sub_path: []const u8, options: link.Options) !*Coff {
assert(options.target.ofmt == .coff);
- if (build_options.have_llvm and options.use_llvm) {
+ if (options.use_llvm) {
return createEmpty(allocator, options);
}
@@ -267,8 +267,7 @@ pub fn createEmpty(gpa: Allocator, options: link.Options) !*Coff {
.data_directories = comptime mem.zeroes([coff.IMAGE_NUMBEROF_DIRECTORY_ENTRIES]coff.ImageDataDirectory),
};
- const use_llvm = build_options.have_llvm and options.use_llvm;
- if (use_llvm) {
+ if (options.use_llvm) {
self.llvm_object = try LlvmObject.create(gpa, options);
}
return self;
@@ -277,9 +276,7 @@ pub fn createEmpty(gpa: Allocator, options: link.Options) !*Coff {
pub fn deinit(self: *Coff) void {
const gpa = self.base.allocator;
- if (build_options.have_llvm) {
- if (self.llvm_object) |llvm_object| llvm_object.destroy(gpa);
- }
+ if (self.llvm_object) |llvm_object| llvm_object.destroy(gpa);
for (self.objects.items) |*object| {
object.deinit(gpa);
@@ -1036,10 +1033,8 @@ pub fn updateFunc(self: *Coff, mod: *Module, func_index: InternPool.Index, air:
if (build_options.skip_non_native and builtin.object_format != .coff) {
@panic("Attempted to compile for object format that was disabled by build configuration");
}
- if (build_options.have_llvm) {
- if (self.llvm_object) |llvm_object| {
- return llvm_object.updateFunc(mod, func_index, air, liveness);
- }
+ if (self.llvm_object) |llvm_object| {
+ return llvm_object.updateFunc(mod, func_index, air, liveness);
}
const tracy = trace(@src());
defer tracy.end();
@@ -1147,9 +1142,7 @@ pub fn updateDecl(
if (build_options.skip_non_native and builtin.object_format != .coff) {
@panic("Attempted to compile for object format that was disabled by build configuration");
}
- if (build_options.have_llvm) {
- if (self.llvm_object) |llvm_object| return llvm_object.updateDecl(mod, decl_index);
- }
+ if (self.llvm_object) |llvm_object| return llvm_object.updateDecl(mod, decl_index);
const tracy = trace(@src());
defer tracy.end();
@@ -1390,9 +1383,7 @@ fn freeUnnamedConsts(self: *Coff, decl_index: Module.Decl.Index) void {
}
pub fn freeDecl(self: *Coff, decl_index: Module.Decl.Index) void {
- if (build_options.have_llvm) {
- if (self.llvm_object) |llvm_object| return llvm_object.freeDecl(decl_index);
- }
+ if (self.llvm_object) |llvm_object| return llvm_object.freeDecl(decl_index);
const mod = self.base.options.module.?;
const decl = mod.declPtr(decl_index);
@@ -1419,7 +1410,7 @@ pub fn updateDeclExports(
const ip = &mod.intern_pool;
- if (build_options.have_llvm) {
+ if (self.base.options.use_llvm) {
// Even in the case of LLVM, we need to notice certain exported symbols in order to
// detect the default subsystem.
for (exports) |exp| {
@@ -1448,10 +1439,10 @@ pub fn updateDeclExports(
}
}
}
-
- if (self.llvm_object) |llvm_object| return llvm_object.updateDeclExports(mod, decl_index, exports);
}
+ if (self.llvm_object) |llvm_object| return llvm_object.updateDeclExports(mod, decl_index, exports);
+
if (self.base.options.emit == null) return;
const gpa = self.base.allocator;
@@ -1583,10 +1574,8 @@ fn resolveGlobalSymbol(self: *Coff, current: SymbolWithLoc) !void {
pub fn flush(self: *Coff, comp: *Compilation, prog_node: *std.Progress.Node) link.File.FlushError!void {
if (self.base.options.emit == null) {
- if (build_options.have_llvm) {
- if (self.llvm_object) |llvm_object| {
- return try llvm_object.flushModule(comp, prog_node);
- }
+ if (self.llvm_object) |llvm_object| {
+ return try llvm_object.flushModule(comp, prog_node);
}
return;
}
@@ -1604,10 +1593,8 @@ pub fn flushModule(self: *Coff, comp: *Compilation, prog_node: *std.Progress.Nod
const tracy = trace(@src());
defer tracy.end();
- if (build_options.have_llvm) {
- if (self.llvm_object) |llvm_object| {
- return try llvm_object.flushModule(comp, prog_node);
- }
+ if (self.llvm_object) |llvm_object| {
+ return try llvm_object.flushModule(comp, prog_node);
}
var sub_prog_node = prog_node.start("COFF Flush", 0);
diff --git a/src/link/Elf.zig b/src/link/Elf.zig
index dd88d47fab..9d71885e61 100644
--- a/src/link/Elf.zig
+++ b/src/link/Elf.zig
@@ -225,7 +225,7 @@ pub const PtrWidth = enum { p32, p64 };
pub fn openPath(allocator: Allocator, sub_path: []const u8, options: link.Options) !*Elf {
assert(options.target.ofmt == .elf);
- if (build_options.have_llvm and options.use_llvm) {
+ if (options.use_llvm) {
return createEmpty(allocator, options);
}
@@ -304,7 +304,7 @@ pub fn createEmpty(gpa: Allocator, options: link.Options) !*Elf {
.ptr_width = ptr_width,
.page_size = page_size,
};
- const use_llvm = build_options.have_llvm and options.use_llvm;
+ const use_llvm = options.use_llvm;
if (use_llvm) {
self.llvm_object = try LlvmObject.create(gpa, options);
}
@@ -314,9 +314,7 @@ pub fn createEmpty(gpa: Allocator, options: link.Options) !*Elf {
pub fn deinit(self: *Elf) void {
const gpa = self.base.allocator;
- if (build_options.have_llvm) {
- if (self.llvm_object) |llvm_object| llvm_object.destroy(gpa);
- }
+ if (self.llvm_object) |llvm_object| llvm_object.destroy(gpa);
for (self.sections.items(.free_list)) |*free_list| {
free_list.deinit(gpa);
@@ -1005,10 +1003,8 @@ pub fn markDirty(self: *Elf, shdr_index: u16, phdr_index: ?u16) void {
pub fn flush(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node) link.File.FlushError!void {
if (self.base.options.emit == null) {
- if (build_options.have_llvm) {
- if (self.llvm_object) |llvm_object| {
- return try llvm_object.flushModule(comp, prog_node);
- }
+ if (self.llvm_object) |llvm_object| {
+ return try llvm_object.flushModule(comp, prog_node);
}
return;
}
@@ -1026,10 +1022,8 @@ pub fn flushModule(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node
const tracy = trace(@src());
defer tracy.end();
- if (build_options.have_llvm) {
- if (self.llvm_object) |llvm_object| {
- return try llvm_object.flushModule(comp, prog_node);
- }
+ if (self.llvm_object) |llvm_object| {
+ return try llvm_object.flushModule(comp, prog_node);
}
const gpa = self.base.allocator;
@@ -2392,9 +2386,7 @@ fn freeUnnamedConsts(self: *Elf, decl_index: Module.Decl.Index) void {
}
pub fn freeDecl(self: *Elf, decl_index: Module.Decl.Index) void {
- if (build_options.have_llvm) {
- if (self.llvm_object) |llvm_object| return llvm_object.freeDecl(decl_index);
- }
+ if (self.llvm_object) |llvm_object| return llvm_object.freeDecl(decl_index);
const mod = self.base.options.module.?;
const decl = mod.declPtr(decl_index);
@@ -2577,9 +2569,7 @@ pub fn updateFunc(self: *Elf, mod: *Module, func_index: InternPool.Index, air: A
if (build_options.skip_non_native and builtin.object_format != .elf) {
@panic("Attempted to compile for object format that was disabled by build configuration");
}
- if (build_options.have_llvm) {
- if (self.llvm_object) |llvm_object| return llvm_object.updateFunc(mod, func_index, air, liveness);
- }
+ if (self.llvm_object) |llvm_object| return llvm_object.updateFunc(mod, func_index, air, liveness);
const tracy = trace(@src());
defer tracy.end();
@@ -2637,9 +2627,7 @@ pub fn updateDecl(
if (build_options.skip_non_native and builtin.object_format != .elf) {
@panic("Attempted to compile for object format that was disabled by build configuration");
}
- if (build_options.have_llvm) {
- if (self.llvm_object) |llvm_object| return llvm_object.updateDecl(mod, decl_index);
- }
+ if (self.llvm_object) |llvm_object| return llvm_object.updateDecl(mod, decl_index);
const tracy = trace(@src());
defer tracy.end();
@@ -2859,9 +2847,7 @@ pub fn updateDeclExports(
if (build_options.skip_non_native and builtin.object_format != .elf) {
@panic("Attempted to compile for object format that was disabled by build configuration");
}
- if (build_options.have_llvm) {
- if (self.llvm_object) |llvm_object| return llvm_object.updateDeclExports(mod, decl_index, exports);
- }
+ if (self.llvm_object) |llvm_object| return llvm_object.updateDeclExports(mod, decl_index, exports);
if (self.base.options.emit == null) return;
diff --git a/src/link/MachO.zig b/src/link/MachO.zig
index 1f2dd4f8b0..4369e3b18a 100644
--- a/src/link/MachO.zig
+++ b/src/link/MachO.zig
@@ -422,7 +422,6 @@ pub fn openPath(allocator: Allocator, options: link.Options) !*MachO {
pub fn createEmpty(gpa: Allocator, options: link.Options) !*MachO {
const cpu_arch = options.target.cpu.arch;
const page_size: u16 = if (cpu_arch == .aarch64) 0x4000 else 0x1000;
- const use_llvm = build_options.have_llvm and options.use_llvm;
const self = try gpa.create(MachO);
errdefer gpa.destroy(self);
@@ -435,13 +434,13 @@ pub fn createEmpty(gpa: Allocator, options: link.Options) !*MachO {
.file = null,
},
.page_size = page_size,
- .mode = if (use_llvm or options.module == null or options.cache_mode == .whole)
+ .mode = if (options.use_llvm or options.module == null or options.cache_mode == .whole)
.zld
else
.incremental,
};
- if (use_llvm) {
+ if (options.use_llvm) {
self.llvm_object = try LlvmObject.create(gpa, options);
}
@@ -452,10 +451,8 @@ pub fn createEmpty(gpa: Allocator, options: link.Options) !*MachO {
pub fn flush(self: *MachO, comp: *Compilation, prog_node: *std.Progress.Node) link.File.FlushError!void {
if (self.base.options.emit == null) {
- if (build_options.have_llvm) {
- if (self.llvm_object) |llvm_object| {
- try llvm_object.flushModule(comp, prog_node);
- }
+ if (self.llvm_object) |llvm_object| {
+ try llvm_object.flushModule(comp, prog_node);
}
return;
}
@@ -479,10 +476,8 @@ pub fn flushModule(self: *MachO, comp: *Compilation, prog_node: *std.Progress.No
const tracy = trace(@src());
defer tracy.end();
- if (build_options.have_llvm) {
- if (self.llvm_object) |llvm_object| {
- return try llvm_object.flushModule(comp, prog_node);
- }
+ if (self.llvm_object) |llvm_object| {
+ return try llvm_object.flushModule(comp, prog_node);
}
var arena_allocator = std.heap.ArenaAllocator.init(self.base.allocator);
@@ -1622,9 +1617,7 @@ fn resolveSymbolsInDylibs(self: *MachO, actions: *std.ArrayList(ResolveAction))
pub fn deinit(self: *MachO) void {
const gpa = self.base.allocator;
- if (build_options.have_llvm) {
- if (self.llvm_object) |llvm_object| llvm_object.destroy(gpa);
- }
+ if (self.llvm_object) |llvm_object| llvm_object.destroy(gpa);
if (self.d_sym) |*d_sym| {
d_sym.deinit();
@@ -1855,9 +1848,7 @@ pub fn updateFunc(self: *MachO, mod: *Module, func_index: InternPool.Index, air:
if (build_options.skip_non_native and builtin.object_format != .macho) {
@panic("Attempted to compile for object format that was disabled by build configuration");
}
- if (build_options.have_llvm) {
- if (self.llvm_object) |llvm_object| return llvm_object.updateFunc(mod, func_index, air, liveness);
- }
+ if (self.llvm_object) |llvm_object| return llvm_object.updateFunc(mod, func_index, air, liveness);
const tracy = trace(@src());
defer tracy.end();
@@ -1979,9 +1970,7 @@ pub fn updateDecl(self: *MachO, mod: *Module, decl_index: Module.Decl.Index) !vo
if (build_options.skip_non_native and builtin.object_format != .macho) {
@panic("Attempted to compile for object format that was disabled by build configuration");
}
- if (build_options.have_llvm) {
- if (self.llvm_object) |llvm_object| return llvm_object.updateDecl(mod, decl_index);
- }
+ if (self.llvm_object) |llvm_object| return llvm_object.updateDecl(mod, decl_index);
const tracy = trace(@src());
defer tracy.end();
@@ -2387,10 +2376,8 @@ pub fn updateDeclExports(
if (build_options.skip_non_native and builtin.object_format != .macho) {
@panic("Attempted to compile for object format that was disabled by build configuration");
}
- if (build_options.have_llvm) {
- if (self.llvm_object) |llvm_object|
- return llvm_object.updateDeclExports(mod, decl_index, exports);
- }
+ if (self.llvm_object) |llvm_object|
+ return llvm_object.updateDeclExports(mod, decl_index, exports);
if (self.base.options.emit == null) return;
@@ -2542,9 +2529,7 @@ fn freeUnnamedConsts(self: *MachO, decl_index: Module.Decl.Index) void {
}
pub fn freeDecl(self: *MachO, decl_index: Module.Decl.Index) void {
- if (build_options.have_llvm) {
- if (self.llvm_object) |llvm_object| return llvm_object.freeDecl(decl_index);
- }
+ if (self.llvm_object) |llvm_object| return llvm_object.freeDecl(decl_index);
const mod = self.base.options.module.?;
const decl = mod.declPtr(decl_index);
diff --git a/src/link/NvPtx.zig b/src/link/NvPtx.zig
index fd1504a3d3..2ccfd8a3a7 100644
--- a/src/link/NvPtx.zig
+++ b/src/link/NvPtx.zig
@@ -27,7 +27,6 @@ llvm_object: *LlvmObject,
ptx_file_name: []const u8,
pub fn createEmpty(gpa: Allocator, options: link.Options) !*NvPtx {
- if (!build_options.have_llvm) return error.PtxArchNotSupported;
if (!options.use_llvm) return error.PtxArchNotSupported;
if (!options.target.cpu.arch.isNvptx()) return error.PtxArchNotSupported;
@@ -55,7 +54,6 @@ pub fn createEmpty(gpa: Allocator, options: link.Options) !*NvPtx {
}
pub fn openPath(allocator: Allocator, sub_path: []const u8, options: link.Options) !*NvPtx {
- if (!build_options.have_llvm) @panic("nvptx target requires a zig compiler with llvm enabled.");
if (!options.use_llvm) return error.PtxArchNotSupported;
assert(options.target.ofmt == .nvptx);
@@ -64,18 +62,15 @@ pub fn openPath(allocator: Allocator, sub_path: []const u8, options: link.Option
}
pub fn deinit(self: *NvPtx) void {
- if (!build_options.have_llvm) return;
self.llvm_object.destroy(self.base.allocator);
self.base.allocator.free(self.ptx_file_name);
}
pub fn updateFunc(self: *NvPtx, module: *Module, func_index: InternPool.Index, air: Air, liveness: Liveness) !void {
- if (!build_options.have_llvm) return;
try self.llvm_object.updateFunc(module, func_index, air, liveness);
}
pub fn updateDecl(self: *NvPtx, module: *Module, decl_index: Module.Decl.Index) !void {
- if (!build_options.have_llvm) return;
return self.llvm_object.updateDecl(module, decl_index);
}
@@ -85,7 +80,6 @@ pub fn updateDeclExports(
decl_index: Module.Decl.Index,
exports: []const *Module.Export,
) !void {
- if (!build_options.have_llvm) return;
if (build_options.skip_non_native and builtin.object_format != .nvptx) {
@panic("Attempted to compile for object format that was disabled by build configuration");
}
@@ -93,7 +87,6 @@ pub fn updateDeclExports(
}
pub fn freeDecl(self: *NvPtx, decl_index: Module.Decl.Index) void {
- if (!build_options.have_llvm) return;
return self.llvm_object.freeDecl(decl_index);
}
@@ -102,7 +95,6 @@ pub fn flush(self: *NvPtx, comp: *Compilation, prog_node: *std.Progress.Node) li
}
pub fn flushModule(self: *NvPtx, comp: *Compilation, prog_node: *std.Progress.Node) link.File.FlushError!void {
- if (!build_options.have_llvm) return;
if (build_options.skip_non_native) {
@panic("Attempted to compile for architecture that was disabled by build configuration");
}
diff --git a/src/link/Wasm.zig b/src/link/Wasm.zig
index 11294daa84..f705c18b69 100644
--- a/src/link/Wasm.zig
+++ b/src/link/Wasm.zig
@@ -360,7 +360,7 @@ pub const StringTable = struct {
pub fn openPath(allocator: Allocator, sub_path: []const u8, options: link.Options) !*Wasm {
assert(options.target.ofmt == .wasm);
- if (build_options.have_llvm and options.use_llvm and options.use_lld) {
+ if (options.use_llvm and options.use_lld) {
return createEmpty(allocator, options);
}
@@ -522,8 +522,7 @@ pub fn createEmpty(gpa: Allocator, options: link.Options) !*Wasm {
.name = undefined,
};
- const use_llvm = build_options.have_llvm and options.use_llvm;
- if (use_llvm) {
+ if (options.use_llvm) {
wasm.llvm_object = try LlvmObject.create(gpa, options);
}
return wasm;
@@ -1273,9 +1272,7 @@ fn checkUndefinedSymbols(wasm: *const Wasm) !void {
pub fn deinit(wasm: *Wasm) void {
const gpa = wasm.base.allocator;
- if (build_options.have_llvm) {
- if (wasm.llvm_object) |llvm_object| llvm_object.destroy(gpa);
- }
+ if (wasm.llvm_object) |llvm_object| llvm_object.destroy(gpa);
for (wasm.func_types.items) |*func_type| {
func_type.deinit(gpa);
@@ -1354,9 +1351,7 @@ pub fn updateFunc(wasm: *Wasm, mod: *Module, func_index: InternPool.Index, air:
if (build_options.skip_non_native and builtin.object_format != .wasm) {
@panic("Attempted to compile for object format that was disabled by build configuration");
}
- if (build_options.have_llvm) {
- if (wasm.llvm_object) |llvm_object| return llvm_object.updateFunc(mod, func_index, air, liveness);
- }
+ if (wasm.llvm_object) |llvm_object| return llvm_object.updateFunc(mod, func_index, air, liveness);
const tracy = trace(@src());
defer tracy.end();
@@ -1422,9 +1417,7 @@ pub fn updateDecl(wasm: *Wasm, mod: *Module, decl_index: Module.Decl.Index) !voi
if (build_options.skip_non_native and builtin.object_format != .wasm) {
@panic("Attempted to compile for object format that was disabled by build configuration");
}
- if (build_options.have_llvm) {
- if (wasm.llvm_object) |llvm_object| return llvm_object.updateDecl(mod, decl_index);
- }
+ if (wasm.llvm_object) |llvm_object| return llvm_object.updateDecl(mod, decl_index);
const tracy = trace(@src());
defer tracy.end();
@@ -1708,9 +1701,7 @@ pub fn updateDeclExports(
if (build_options.skip_non_native and builtin.object_format != .wasm) {
@panic("Attempted to compile for object format that was disabled by build configuration");
}
- if (build_options.have_llvm) {
- if (wasm.llvm_object) |llvm_object| return llvm_object.updateDeclExports(mod, decl_index, exports);
- }
+ if (wasm.llvm_object) |llvm_object| return llvm_object.updateDeclExports(mod, decl_index, exports);
if (wasm.base.options.emit == null) return;
@@ -1811,9 +1802,7 @@ pub fn updateDeclExports(
}
pub fn freeDecl(wasm: *Wasm, decl_index: Module.Decl.Index) void {
- if (build_options.have_llvm) {
- if (wasm.llvm_object) |llvm_object| return llvm_object.freeDecl(decl_index);
- }
+ if (wasm.llvm_object) |llvm_object| return llvm_object.freeDecl(decl_index);
const mod = wasm.base.options.module.?;
const decl = mod.declPtr(decl_index);
const atom_index = wasm.decls.get(decl_index).?;
@@ -3137,17 +3126,15 @@ fn resetState(wasm: *Wasm) void {
pub fn flush(wasm: *Wasm, comp: *Compilation, prog_node: *std.Progress.Node) link.File.FlushError!void {
if (wasm.base.options.emit == null) {
- if (build_options.have_llvm) {
- if (wasm.llvm_object) |llvm_object| {
- return try llvm_object.flushModule(comp, prog_node);
- }
+ if (wasm.llvm_object) |llvm_object| {
+ return try llvm_object.flushModule(comp, prog_node);
}
return;
}
if (build_options.have_llvm and wasm.base.options.use_lld) {
return wasm.linkWithLLD(comp, prog_node);
- } else if (build_options.have_llvm and wasm.base.options.use_llvm and !wasm.base.options.use_lld) {
+ } else if (wasm.base.options.use_llvm and !wasm.base.options.use_lld) {
return wasm.linkWithZld(comp, prog_node);
} else {
return wasm.flushModule(comp, prog_node);
@@ -3365,10 +3352,8 @@ pub fn flushModule(wasm: *Wasm, comp: *Compilation, prog_node: *std.Progress.Nod
const tracy = trace(@src());
defer tracy.end();
- if (build_options.have_llvm) {
- if (wasm.llvm_object) |llvm_object| {
- return try llvm_object.flushModule(comp, prog_node);
- }
+ if (wasm.llvm_object) |llvm_object| {
+ return try llvm_object.flushModule(comp, prog_node);
}
var sub_prog_node = prog_node.start("Wasm Flush", 0);