diff options
| author | Jacob Young <jacobly0@users.noreply.github.com> | 2024-07-19 01:04:59 -0400 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2024-07-19 22:35:33 -0700 |
| commit | 4f742c4cfc3c3134a0d6ebfdfc354286ae97b2c1 (patch) | |
| tree | c20b44dbe98cb8cb7484b19aca727ad2957e42a2 /src/codegen.zig | |
| parent | b7e48c6bcd99457f84f0043a3f4590a6ac1f4933 (diff) | |
| download | zig-4f742c4cfc3c3134a0d6ebfdfc354286ae97b2c1.tar.gz zig-4f742c4cfc3c3134a0d6ebfdfc354286ae97b2c1.zip | |
dev: introduce dev environments that enable compiler feature sets
Diffstat (limited to 'src/codegen.zig')
| -rw-r--r-- | src/codegen.zig | 50 |
1 files changed, 34 insertions, 16 deletions
diff --git a/src/codegen.zig b/src/codegen.zig index 3dc3d415be..2967f41dc2 100644 --- a/src/codegen.zig +++ b/src/codegen.zig @@ -22,6 +22,7 @@ const Type = @import("Type.zig"); const Value = @import("Value.zig"); const Zir = std.zig.Zir; const Alignment = InternPool.Alignment; +const dev = @import("dev.zig"); pub const Result = union(enum) { /// The `code` parameter passed to `generateSymbol` has the value ok. @@ -43,6 +44,23 @@ pub const DebugInfoOutput = union(enum) { none, }; +fn devFeatureForBackend(comptime backend: std.builtin.CompilerBackend) dev.Feature { + comptime assert(mem.startsWith(u8, @tagName(backend), "stage2_")); + return @field(dev.Feature, @tagName(backend)["stage2_".len..] ++ "_backend"); +} + +fn importBackend(comptime backend: std.builtin.CompilerBackend) type { + return switch (backend) { + .stage2_aarch64 => @import("arch/aarch64/CodeGen.zig"), + .stage2_arm => @import("arch/arm/CodeGen.zig"), + .stage2_riscv64 => @import("arch/riscv64/CodeGen.zig"), + .stage2_sparc64 => @import("arch/sparc64/CodeGen.zig"), + .stage2_wasm => @import("arch/wasm/CodeGen.zig"), + .stage2_x86_64 => @import("arch/x86_64/CodeGen.zig"), + else => unreachable, + }; +} + pub fn generateFunction( lf: *link.File, pt: Zcu.PerThread, @@ -58,21 +76,18 @@ pub fn generateFunction( const decl = zcu.declPtr(func.owner_decl); const namespace = zcu.namespacePtr(decl.src_namespace); const target = namespace.fileScope(zcu).mod.resolved_target.result; - switch (target.cpu.arch) { - .arm, - .armeb, - => return @import("arch/arm/CodeGen.zig").generate(lf, pt, src_loc, func_index, air, liveness, code, debug_output), - .aarch64, - .aarch64_be, - .aarch64_32, - => return @import("arch/aarch64/CodeGen.zig").generate(lf, pt, src_loc, func_index, air, liveness, code, debug_output), - .riscv64 => return @import("arch/riscv64/CodeGen.zig").generate(lf, pt, src_loc, func_index, air, liveness, code, debug_output), - .sparc64 => return @import("arch/sparc64/CodeGen.zig").generate(lf, pt, src_loc, func_index, air, liveness, code, debug_output), - .x86_64 => return @import("arch/x86_64/CodeGen.zig").generate(lf, pt, src_loc, func_index, air, liveness, code, debug_output), - .wasm32, - .wasm64, - => return @import("arch/wasm/CodeGen.zig").generate(lf, pt, src_loc, func_index, air, liveness, code, debug_output), + switch (target_util.zigBackend(target, false)) { else => unreachable, + inline .stage2_aarch64, + .stage2_arm, + .stage2_riscv64, + .stage2_sparc64, + .stage2_wasm, + .stage2_x86_64, + => |backend| { + dev.check(devFeatureForBackend(backend)); + return importBackend(backend).generate(lf, pt, src_loc, func_index, air, liveness, code, debug_output); + }, } } @@ -89,9 +104,12 @@ pub fn generateLazyFunction( const decl = zcu.declPtr(decl_index); const namespace = zcu.namespacePtr(decl.src_namespace); const target = namespace.fileScope(zcu).mod.resolved_target.result; - switch (target.cpu.arch) { - .x86_64 => return @import("arch/x86_64/CodeGen.zig").generateLazy(lf, pt, src_loc, lazy_sym, code, debug_output), + switch (target_util.zigBackend(target, false)) { else => unreachable, + inline .stage2_x86_64 => |backend| { + dev.check(devFeatureForBackend(backend)); + return importBackend(backend).generateLazy(lf, pt, src_loc, lazy_sym, code, debug_output); + }, } } |
