Skip to content

Commit cc381d5

Browse files
authored
Merge pull request ziglang#23654 from alichraghi/continue
Compilation: don't build compiler_rt or ubsan_rt for amdgcn and ptx
2 parents 8e79fc6 + 9bd8f8e commit cc381d5

File tree

4 files changed

+61
-36
lines changed

4 files changed

+61
-36
lines changed

src/Compilation.zig

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1352,8 +1352,8 @@ pub fn create(gpa: Allocator, arena: Allocator, options: CreateOptions) !*Compil
13521352
// approach, since the ubsan runtime uses quite a lot of the standard library
13531353
// and this reduces unnecessary bloat.
13541354
const ubsan_rt_strat: RtStrat = s: {
1355-
const is_spirv = options.root_mod.resolved_target.result.cpu.arch.isSpirV();
1356-
const want_ubsan_rt = options.want_ubsan_rt orelse (!is_spirv and any_sanitize_c == .full and is_exe_or_dyn_lib);
1355+
const can_build_ubsan_rt = target_util.canBuildLibUbsanRt(options.root_mod.resolved_target.result);
1356+
const want_ubsan_rt = options.want_ubsan_rt orelse (can_build_ubsan_rt and any_sanitize_c == .full and is_exe_or_dyn_lib);
13571357
if (!want_ubsan_rt) break :s .none;
13581358
if (options.skip_linker_dependencies) break :s .none;
13591359
if (have_zcu) break :s .zcu;
@@ -1768,8 +1768,7 @@ pub fn create(gpa: Allocator, arena: Allocator, options: CreateOptions) !*Compil
17681768
errdefer comp.destroy();
17691769

17701770
const target = comp.root_mod.resolved_target.result;
1771-
1772-
const capable_of_building_compiler_rt = canBuildLibCompilerRt(target, comp.config.use_llvm);
1771+
const can_build_compiler_rt = target_util.canBuildLibCompilerRt(target, comp.config.use_llvm, build_options.have_llvm);
17731772

17741773
// Add a `CObject` for each `c_source_files`.
17751774
try comp.c_object_table.ensureTotalCapacity(gpa, options.c_source_files.len);
@@ -1939,7 +1938,7 @@ pub fn create(gpa: Allocator, arena: Allocator, options: CreateOptions) !*Compil
19391938
comp.remaining_prelink_tasks += 1;
19401939
}
19411940

1942-
if (capable_of_building_compiler_rt) {
1941+
if (can_build_compiler_rt) {
19431942
if (comp.compiler_rt_strat == .lib) {
19441943
log.debug("queuing a job to build compiler_rt_lib", .{});
19451944
comp.queued_jobs.compiler_rt_lib = true;
@@ -6558,22 +6557,6 @@ pub fn dump_argv(argv: []const []const u8) void {
65586557
nosuspend stderr.print("{s}\n", .{argv[argv.len - 1]}) catch {};
65596558
}
65606559

6561-
fn canBuildLibCompilerRt(target: std.Target, use_llvm: bool) bool {
6562-
switch (target.os.tag) {
6563-
.plan9 => return false,
6564-
else => {},
6565-
}
6566-
switch (target.cpu.arch) {
6567-
.spirv, .spirv32, .spirv64 => return false,
6568-
else => {},
6569-
}
6570-
return switch (target_util.zigBackend(target, use_llvm)) {
6571-
.stage2_llvm => true,
6572-
.stage2_x86_64 => if (target.ofmt == .elf or target.ofmt == .macho) true else build_options.have_llvm,
6573-
else => build_options.have_llvm,
6574-
};
6575-
}
6576-
65776560
pub fn getZigBackend(comp: Compilation) std.builtin.CompilerBackend {
65786561
const target = comp.root_mod.resolved_target.result;
65796562
return target_util.zigBackend(target, comp.config.use_llvm);

src/codegen/spirv.zig

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1065,6 +1065,7 @@ const NavGen = struct {
10651065

10661066
fn derivePtr(self: *NavGen, derivation: Value.PointerDeriveStep) Error!IdRef {
10671067
const pt = self.pt;
1068+
const zcu = pt.zcu;
10681069
switch (derivation) {
10691070
.comptime_alloc_ptr, .comptime_field_ptr => unreachable,
10701071
.int => |int| {
@@ -1104,23 +1105,36 @@ const NavGen = struct {
11041105
.offset_and_cast => |oac| {
11051106
const parent_ptr_id = try self.derivePtr(oac.parent.*);
11061107
const parent_ptr_ty = try oac.parent.ptrType(pt);
1107-
disallow: {
1108-
if (oac.byte_offset != 0) break :disallow;
1109-
// Allow changing the pointer type child only to restructure arrays.
1110-
// e.g. [3][2]T to T is fine, as is [2]T -> [2][1]T.
1111-
const result_ty_id = try self.resolveType(oac.new_ptr_ty, .direct);
1112-
const result_ptr_id = self.spv.allocId();
1113-
try self.func.body.emit(self.spv.gpa, .OpBitcast, .{
1114-
.id_result_type = result_ty_id,
1115-
.id_result = result_ptr_id,
1116-
.operand = parent_ptr_id,
1117-
});
1118-
return result_ptr_id;
1108+
const result_ty_id = try self.resolveType(oac.new_ptr_ty, .direct);
1109+
1110+
if (oac.byte_offset != 0) {
1111+
const child_size = oac.new_ptr_ty.childType(zcu).abiSize(zcu);
1112+
if (oac.byte_offset % child_size != 0) {
1113+
return self.fail("cannot perform pointer cast: '{}' to '{}'", .{
1114+
parent_ptr_ty.fmt(pt),
1115+
oac.new_ptr_ty.fmt(pt),
1116+
});
1117+
}
1118+
1119+
// Vector element ptr accesses are derived as offset_and_cast.
1120+
// We can just use OpAccessChain.
1121+
assert(parent_ptr_ty.childType(zcu).zigTypeTag(zcu) == .vector);
1122+
return self.accessChain(
1123+
result_ty_id,
1124+
parent_ptr_id,
1125+
&.{@intCast(@divExact(oac.byte_offset, child_size))},
1126+
);
11191127
}
1120-
return self.fail("cannot perform pointer cast: '{}' to '{}'", .{
1121-
parent_ptr_ty.fmt(pt),
1122-
oac.new_ptr_ty.fmt(pt),
1128+
1129+
// Allow changing the pointer type child only to restructure arrays.
1130+
// e.g. [3][2]T to T is fine, as is [2]T -> [2][1]T.
1131+
const result_ptr_id = self.spv.allocId();
1132+
try self.func.body.emit(self.spv.gpa, .OpBitcast, .{
1133+
.id_result_type = result_ty_id,
1134+
.id_result = result_ptr_id,
1135+
.operand = parent_ptr_id,
11231136
});
1137+
return result_ptr_id;
11241138
},
11251139
}
11261140
}

src/target.zig

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,33 @@ pub fn defaultCompilerRtOptimizeMode(target: std.Target) std.builtin.OptimizeMod
313313
}
314314
}
315315

316+
pub fn canBuildLibCompilerRt(target: std.Target, use_llvm: bool, have_llvm: bool) bool {
317+
switch (target.os.tag) {
318+
.plan9 => return false,
319+
else => {},
320+
}
321+
switch (target.cpu.arch) {
322+
.spirv, .spirv32, .spirv64 => return false,
323+
// Remove this once https://github.com/ziglang/zig/issues/23714 is fixed
324+
.amdgcn => return false,
325+
else => {},
326+
}
327+
return switch (zigBackend(target, use_llvm)) {
328+
.stage2_llvm => true,
329+
.stage2_x86_64 => if (target.ofmt == .elf or target.ofmt == .macho) true else have_llvm,
330+
else => have_llvm,
331+
};
332+
}
333+
334+
pub fn canBuildLibUbsanRt(target: std.Target) bool {
335+
switch (target.cpu.arch) {
336+
.spirv, .spirv32, .spirv64 => return false,
337+
// Remove this once https://github.com/ziglang/zig/issues/23715 is fixed
338+
.nvptx, .nvptx64 => return false,
339+
else => return true,
340+
}
341+
}
342+
316343
pub fn hasRedZone(target: std.Target) bool {
317344
return switch (target.cpu.arch) {
318345
.aarch64,

test/behavior/struct.zig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1524,6 +1524,7 @@ test "optional generic function label struct field" {
15241524
}
15251525

15261526
test "struct fields get automatically reordered" {
1527+
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
15271528
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
15281529

15291530
const S1 = struct {

0 commit comments

Comments
 (0)