From 5c44934e20fedb29b88616f51de70c92e5d4ba42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Mon, 24 Feb 2025 12:35:40 +0100 Subject: [PATCH] Move the compiler's LLVM bitcode builder to std.zig.llvm. --- CMakeLists.txt | 9 ++++---- lib/std/zig.zig | 1 + lib/std/zig/llvm.zig | 3 +++ .../std/zig}/llvm/BitcodeReader.zig | 2 +- {src/codegen => lib/std/zig}/llvm/Builder.zig | 23 +++++++++++-------- .../std/zig}/llvm/bitcode_writer.zig | 2 +- {src/codegen => lib/std/zig}/llvm/ir.zig | 2 +- src/Compilation.zig | 3 +-- src/InternPool.zig | 2 +- src/codegen/llvm.zig | 7 ++++-- 10 files changed, 33 insertions(+), 21 deletions(-) create mode 100644 lib/std/zig/llvm.zig rename {src/codegen => lib/std/zig}/llvm/BitcodeReader.zig (99%) rename {src/codegen => lib/std/zig}/llvm/Builder.zig (99%) rename {src/codegen => lib/std/zig}/llvm/bitcode_writer.zig (99%) rename {src/codegen => lib/std/zig}/llvm/ir.zig (99%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0601c269d9..700b724b00 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -500,6 +500,11 @@ set(ZIG_STAGE2_SOURCES lib/std/zig/system/NativePaths.zig lib/std/zig/system/x86.zig lib/std/zig/tokenizer.zig + lib/std/zig/llvm.zig + lib/std/zig/llvm/BitcodeReader.zig + lib/std/zig/llvm/Builder.zig + lib/std/zig/llvm/bitcode_writer.zig + lib/std/zig/llvm/ir.zig src/Air.zig src/Builtin.zig src/Compilation.zig @@ -567,11 +572,7 @@ set(ZIG_STAGE2_SOURCES src/codegen/c.zig src/codegen/c/Type.zig src/codegen/llvm.zig - src/codegen/llvm/BitcodeReader.zig - src/codegen/llvm/Builder.zig src/codegen/llvm/bindings.zig - src/codegen/llvm/bitcode_writer.zig - src/codegen/llvm/ir.zig src/codegen/spirv.zig src/codegen/spirv/Assembler.zig src/codegen/spirv/Module.zig diff --git a/lib/std/zig.zig b/lib/std/zig.zig index 25e0c37597..2300155474 100644 --- a/lib/std/zig.zig +++ b/lib/std/zig.zig @@ -24,6 +24,7 @@ pub const LibCInstallation = @import("zig/LibCInstallation.zig"); pub const WindowsSdk = @import("zig/WindowsSdk.zig"); pub const LibCDirs = @import("zig/LibCDirs.zig"); pub const target = @import("zig/target.zig"); +pub const llvm = @import("zig/llvm.zig"); // Character literal parsing pub const ParsedCharLiteral = string_literal.ParsedCharLiteral; diff --git a/lib/std/zig/llvm.zig b/lib/std/zig/llvm.zig new file mode 100644 index 0000000000..c2e1ed9c56 --- /dev/null +++ b/lib/std/zig/llvm.zig @@ -0,0 +1,3 @@ +pub const BitcodeReader = @import("llvm/BitcodeReader.zig"); +pub const bitcode_writer = @import("llvm/bitcode_writer.zig"); +pub const Builder = @import("llvm/Builder.zig"); diff --git a/src/codegen/llvm/BitcodeReader.zig b/lib/std/zig/llvm/BitcodeReader.zig similarity index 99% rename from src/codegen/llvm/BitcodeReader.zig rename to lib/std/zig/llvm/BitcodeReader.zig index 8a9af15629..ea18b7978e 100644 --- a/src/codegen/llvm/BitcodeReader.zig +++ b/lib/std/zig/llvm/BitcodeReader.zig @@ -510,6 +510,6 @@ const Abbrev = struct { }; const assert = std.debug.assert; -const std = @import("std"); +const std = @import("../../std.zig"); const BitcodeReader = @This(); diff --git a/src/codegen/llvm/Builder.zig b/lib/std/zig/llvm/Builder.zig similarity index 99% rename from src/codegen/llvm/Builder.zig rename to lib/std/zig/llvm/Builder.zig index 7461854510..6d16a33602 100644 --- a/src/codegen/llvm/Builder.zig +++ b/lib/std/zig/llvm/Builder.zig @@ -13168,7 +13168,12 @@ fn metadataConstantAssumeCapacity(self: *Builder, constant: Constant) Metadata { return @enumFromInt(gop.index); } -pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]const u32 { +pub const Producer = struct { + name: []const u8, + version: std.SemanticVersion, +}; + +pub fn toBitcode(self: *Builder, allocator: Allocator, producer: Producer) bitcode_writer.Error![]const u32 { const BitcodeWriter = bitcode_writer.BitcodeWriter(&.{ Type, FunctionAttributes }); var bitcode = BitcodeWriter.init(allocator, .{ std.math.log2_int_ceil(usize, self.type_items.items.len), @@ -13187,14 +13192,15 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co const Identification = ir.Identification; var identification_block = try bitcode.enterTopBlock(Identification); - const producer = try std.fmt.allocPrint(self.gpa, "zig {d}.{d}.{d}", .{ - build_options.semver.major, - build_options.semver.minor, - build_options.semver.patch, + const producer_str = try std.fmt.allocPrint(self.gpa, "{s} {d}.{d}.{d}", .{ + producer.name, + producer.version.major, + producer.version.minor, + producer.version.patch, }); - defer self.gpa.free(producer); + defer self.gpa.free(producer_str); - try identification_block.writeAbbrev(Identification.Version{ .string = producer }); + try identification_block.writeAbbrev(Identification.Version{ .string = producer_str }); try identification_block.writeAbbrev(Identification.Epoch{ .epoch = 0 }); try identification_block.end(); @@ -15216,10 +15222,9 @@ pub fn toBitcode(self: *Builder, allocator: Allocator) bitcode_writer.Error![]co const Allocator = std.mem.Allocator; const assert = std.debug.assert; const bitcode_writer = @import("bitcode_writer.zig"); -const build_options = @import("build_options"); const Builder = @This(); const builtin = @import("builtin"); const DW = std.dwarf; const ir = @import("ir.zig"); const log = std.log.scoped(.llvm); -const std = @import("std"); +const std = @import("../../std.zig"); diff --git a/src/codegen/llvm/bitcode_writer.zig b/lib/std/zig/llvm/bitcode_writer.zig similarity index 99% rename from src/codegen/llvm/bitcode_writer.zig rename to lib/std/zig/llvm/bitcode_writer.zig index 049a15fe17..73d4f1aed9 100644 --- a/src/codegen/llvm/bitcode_writer.zig +++ b/lib/std/zig/llvm/bitcode_writer.zig @@ -1,4 +1,4 @@ -const std = @import("std"); +const std = @import("../../std.zig"); pub const AbbrevOp = union(enum) { literal: u32, // 0 diff --git a/src/codegen/llvm/ir.zig b/lib/std/zig/llvm/ir.zig similarity index 99% rename from src/codegen/llvm/ir.zig rename to lib/std/zig/llvm/ir.zig index 271e87c995..b83f0ddf68 100644 --- a/src/codegen/llvm/ir.zig +++ b/lib/std/zig/llvm/ir.zig @@ -1,4 +1,4 @@ -const std = @import("std"); +const std = @import("../../std.zig"); const Builder = @import("Builder.zig"); const bitcode_writer = @import("bitcode_writer.zig"); diff --git a/src/Compilation.zig b/src/Compilation.zig index 7331bf2097..2e0f998a2f 100644 --- a/src/Compilation.zig +++ b/src/Compilation.zig @@ -551,7 +551,6 @@ pub const CObject = struct { } pub fn parse(gpa: Allocator, path: []const u8) !*Bundle { - const BitcodeReader = @import("codegen/llvm/BitcodeReader.zig"); const BlockId = enum(u32) { Meta = 8, Diag, @@ -588,7 +587,7 @@ pub const CObject = struct { defer file.close(); var br = std.io.bufferedReader(file.reader()); const reader = br.reader(); - var bc = BitcodeReader.init(gpa, .{ .reader = reader.any() }); + var bc = std.zig.llvm.BitcodeReader.init(gpa, .{ .reader = reader.any() }); defer bc.deinit(); var file_names: std.AutoArrayHashMapUnmanaged(u32, []const u8) = .empty; diff --git a/src/InternPool.zig b/src/InternPool.zig index 7f02b548b4..ab264d0e86 100644 --- a/src/InternPool.zig +++ b/src/InternPool.zig @@ -6261,7 +6261,7 @@ pub const Alignment = enum(u6) { return n + 1; } - const LlvmBuilderAlignment = @import("codegen/llvm/Builder.zig").Alignment; + const LlvmBuilderAlignment = std.zig.llvm.Builder.Alignment; pub fn toLlvm(this: @This()) LlvmBuilderAlignment { return @enumFromInt(@intFromEnum(this)); diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index 2f58dc7897..e82d75311e 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -6,7 +6,7 @@ const log = std.log.scoped(.codegen); const math = std.math; const DW = std.dwarf; -const Builder = @import("llvm/Builder.zig"); +const Builder = std.zig.llvm.Builder; const llvm = if (build_options.have_llvm) @import("llvm/bindings.zig") else @@ -1216,7 +1216,10 @@ pub const Object = struct { } } - const bitcode = try o.builder.toBitcode(o.gpa); + const bitcode = try o.builder.toBitcode(o.gpa, .{ + .name = "zig", + .version = build_options.semver, + }); defer o.gpa.free(bitcode); o.builder.clearAndFree();