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 0601c269d9c6f454dcafa3ac74b22f3ee4e6e613..700b724b0018797b6d3c43805ceb235f5bc44203 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 25e0c37597ae82a231816dd415f264d9744583f1..23001554744df403883aba81d69b04954b5c40ee 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 0000000000000000000000000000000000000000..c2e1ed9c56bfd5a93b8aaaded80023e635dbe568 --- /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 8a9af1562921baee3c7d03294c3cfb394dda7c40..ea18b7978eb6aeff00bc45a7e82758ea4df16e7a 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 74618545106be1f0c2dffceca1ceb431da781ee9..6d16a3360200f4fefe45c29aa6040498275e6282 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 049a15fe179c22054b00ee98b94097a51fdb6886..73d4f1aed9f83367e2ad7144368f805b89ec407d 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 271e87c9959c3b84487eaeda5c5190adfe611535..b83f0ddf685a4e0d70d8f827c89c86e0d3755b65 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 7331bf209710112414fbef4383ef24df1eadd737..2e0f998a2fc534e77c1cd19b38f254474b2186e8 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 7f02b548b461f714cadabd27b5b6d04b78edfef5..ab264d0e8641f0a17460585bcfec7a1fc748feba 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 2f58dc78970bba653f2641b6229502beb8c5ec10..e82d75311ed4490ef4ea2751c974138083809a4f 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(); -- 2.54.0