Move the compiler's LLVM bitcode builder to std.zig.llvm.

This commit is contained in:
Alex Rønne Petersen 2025-02-24 12:35:40 +01:00 committed by Andrew Kelley
parent dea72d15da
commit 5c44934e20
10 changed files with 33 additions and 21 deletions

View File

@ -500,6 +500,11 @@ set(ZIG_STAGE2_SOURCES
lib/std/zig/system/NativePaths.zig lib/std/zig/system/NativePaths.zig
lib/std/zig/system/x86.zig lib/std/zig/system/x86.zig
lib/std/zig/tokenizer.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/Air.zig
src/Builtin.zig src/Builtin.zig
src/Compilation.zig src/Compilation.zig
@ -567,11 +572,7 @@ set(ZIG_STAGE2_SOURCES
src/codegen/c.zig src/codegen/c.zig
src/codegen/c/Type.zig src/codegen/c/Type.zig
src/codegen/llvm.zig src/codegen/llvm.zig
src/codegen/llvm/BitcodeReader.zig
src/codegen/llvm/Builder.zig
src/codegen/llvm/bindings.zig src/codegen/llvm/bindings.zig
src/codegen/llvm/bitcode_writer.zig
src/codegen/llvm/ir.zig
src/codegen/spirv.zig src/codegen/spirv.zig
src/codegen/spirv/Assembler.zig src/codegen/spirv/Assembler.zig
src/codegen/spirv/Module.zig src/codegen/spirv/Module.zig

View File

@ -24,6 +24,7 @@ pub const LibCInstallation = @import("zig/LibCInstallation.zig");
pub const WindowsSdk = @import("zig/WindowsSdk.zig"); pub const WindowsSdk = @import("zig/WindowsSdk.zig");
pub const LibCDirs = @import("zig/LibCDirs.zig"); pub const LibCDirs = @import("zig/LibCDirs.zig");
pub const target = @import("zig/target.zig"); pub const target = @import("zig/target.zig");
pub const llvm = @import("zig/llvm.zig");
// Character literal parsing // Character literal parsing
pub const ParsedCharLiteral = string_literal.ParsedCharLiteral; pub const ParsedCharLiteral = string_literal.ParsedCharLiteral;

3
lib/std/zig/llvm.zig Normal file
View File

@ -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");

View File

@ -510,6 +510,6 @@ const Abbrev = struct {
}; };
const assert = std.debug.assert; const assert = std.debug.assert;
const std = @import("std"); const std = @import("../../std.zig");
const BitcodeReader = @This(); const BitcodeReader = @This();

View File

@ -13168,7 +13168,12 @@ fn metadataConstantAssumeCapacity(self: *Builder, constant: Constant) Metadata {
return @enumFromInt(gop.index); 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 }); const BitcodeWriter = bitcode_writer.BitcodeWriter(&.{ Type, FunctionAttributes });
var bitcode = BitcodeWriter.init(allocator, .{ var bitcode = BitcodeWriter.init(allocator, .{
std.math.log2_int_ceil(usize, self.type_items.items.len), 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; const Identification = ir.Identification;
var identification_block = try bitcode.enterTopBlock(Identification); var identification_block = try bitcode.enterTopBlock(Identification);
const producer = try std.fmt.allocPrint(self.gpa, "zig {d}.{d}.{d}", .{ const producer_str = try std.fmt.allocPrint(self.gpa, "{s} {d}.{d}.{d}", .{
build_options.semver.major, producer.name,
build_options.semver.minor, producer.version.major,
build_options.semver.patch, 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.writeAbbrev(Identification.Epoch{ .epoch = 0 });
try identification_block.end(); 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 Allocator = std.mem.Allocator;
const assert = std.debug.assert; const assert = std.debug.assert;
const bitcode_writer = @import("bitcode_writer.zig"); const bitcode_writer = @import("bitcode_writer.zig");
const build_options = @import("build_options");
const Builder = @This(); const Builder = @This();
const builtin = @import("builtin"); const builtin = @import("builtin");
const DW = std.dwarf; const DW = std.dwarf;
const ir = @import("ir.zig"); const ir = @import("ir.zig");
const log = std.log.scoped(.llvm); const log = std.log.scoped(.llvm);
const std = @import("std"); const std = @import("../../std.zig");

View File

@ -1,4 +1,4 @@
const std = @import("std"); const std = @import("../../std.zig");
pub const AbbrevOp = union(enum) { pub const AbbrevOp = union(enum) {
literal: u32, // 0 literal: u32, // 0

View File

@ -1,4 +1,4 @@
const std = @import("std"); const std = @import("../../std.zig");
const Builder = @import("Builder.zig"); const Builder = @import("Builder.zig");
const bitcode_writer = @import("bitcode_writer.zig"); const bitcode_writer = @import("bitcode_writer.zig");

View File

@ -551,7 +551,6 @@ pub const CObject = struct {
} }
pub fn parse(gpa: Allocator, path: []const u8) !*Bundle { pub fn parse(gpa: Allocator, path: []const u8) !*Bundle {
const BitcodeReader = @import("codegen/llvm/BitcodeReader.zig");
const BlockId = enum(u32) { const BlockId = enum(u32) {
Meta = 8, Meta = 8,
Diag, Diag,
@ -588,7 +587,7 @@ pub const CObject = struct {
defer file.close(); defer file.close();
var br = std.io.bufferedReader(file.reader()); var br = std.io.bufferedReader(file.reader());
const reader = br.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(); defer bc.deinit();
var file_names: std.AutoArrayHashMapUnmanaged(u32, []const u8) = .empty; var file_names: std.AutoArrayHashMapUnmanaged(u32, []const u8) = .empty;

View File

@ -6261,7 +6261,7 @@ pub const Alignment = enum(u6) {
return n + 1; return n + 1;
} }
const LlvmBuilderAlignment = @import("codegen/llvm/Builder.zig").Alignment; const LlvmBuilderAlignment = std.zig.llvm.Builder.Alignment;
pub fn toLlvm(this: @This()) LlvmBuilderAlignment { pub fn toLlvm(this: @This()) LlvmBuilderAlignment {
return @enumFromInt(@intFromEnum(this)); return @enumFromInt(@intFromEnum(this));

View File

@ -6,7 +6,7 @@ const log = std.log.scoped(.codegen);
const math = std.math; const math = std.math;
const DW = std.dwarf; const DW = std.dwarf;
const Builder = @import("llvm/Builder.zig"); const Builder = std.zig.llvm.Builder;
const llvm = if (build_options.have_llvm) const llvm = if (build_options.have_llvm)
@import("llvm/bindings.zig") @import("llvm/bindings.zig")
else 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); defer o.gpa.free(bitcode);
o.builder.clearAndFree(); o.builder.clearAndFree();