authorgravatar for kappaloris@gmail.comLoris Cro <kappaloris@gmail.com> 2022-08-23 23:43:16+02:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-08-24 16:33:01-04:00
logeb3f7d2f37cab1d3df7c4493b8239e802b83e521
tree75765ba947f0b4a1dbf7636c7b7b9b72627fac10
parent7a881435ed54b0cf59f48679c3912600b3bd0d58

compilation: avoid pointless caching

When the entire purpose of this compilation is to perform a single zig cc operation we could "tail call" clang by doing an execve, and any use of the caching system would actually be problematic since the user is presumably doing their own caching by using dep file flags. Fixes #12317

1 files changed, 46 insertions(+), 6 deletions(-)

src/Compilation.zig+46-6
...@@ -3753,22 +3753,64 @@ fn updateCObject(comp: *Compilation, c_object: *CObject, c_obj_prog_node: *std.P...@@ -3753,22 +3753,64 @@ fn updateCObject(comp: *Compilation, c_object: *CObject, c_obj_prog_node: *std.P
3753 };3753 };
3754 const o_basename = try std.fmt.allocPrint(arena, "{s}{s}", .{ o_basename_noext, out_ext });3754 const o_basename = try std.fmt.allocPrint(arena, "{s}{s}", .{ o_basename_noext, out_ext });
37553755
3756 try argv.appendSlice(&[_][]const u8{
3757 self_exe_path,
3758 "clang",
3759 c_object.src.src_path,
3760 });
3761 try argv.appendSlice(c_object.src.extra_flags);
3762
3763 const ext = classifyFileExt(c_object.src.src_path);
3764
3765 // When all these flags are true, it means that the entire purpose of
3766 // this compilation is to perform a single zig cc operation. This means
3767 // that we could "tail call" clang by doing an execve, and any use of
3768 // the caching system would actually be problematic since the user is
3769 // presumably doing their own caching by using dep file flags.
3770 if (comp.disable_c_depfile and comp.clang_passthrough_mode and std.process.can_execv and direct_o) {
3771 try comp.addCCArgs(arena, &argv, ext, null);
3772
3773 const out_obj_path = if (comp.bin_file.options.emit) |emit|
3774 try emit.directory.join(arena, &.{emit.sub_path})
3775 else
3776 "/dev/null";
3777
3778 try argv.ensureUnusedCapacity(5);
3779 switch (comp.clang_preprocessor_mode) {
3780 .no => argv.appendSliceAssumeCapacity(&[_][]const u8{ "-c", "-o", out_obj_path }),
3781 .yes => argv.appendSliceAssumeCapacity(&[_][]const u8{ "-E", "-o", out_obj_path }),
3782 .stdout => argv.appendAssumeCapacity("-E"),
3783 }
3784
3785 if (comp.emit_asm != null) {
3786 argv.appendAssumeCapacity("-S");
3787 } else if (comp.emit_llvm_ir != null) {
3788 argv.appendSliceAssumeCapacity(&[_][]const u8{ "-emit-llvm", "-S" });
3789 } else if (comp.emit_llvm_bc != null) {
3790 argv.appendAssumeCapacity("-emit-llvm");
3791 }
3792
3793 if (comp.verbose_cc) {
3794 dump_argv(argv.items);
3795 }
3796
3797 const err = std.process.execv(arena, argv.items);
3798 fatal("unable to execv clang: {s}", .{@errorName(err)});
3799 }
3800
3756 // We can't know the digest until we do the C compiler invocation,3801 // We can't know the digest until we do the C compiler invocation,
3757 // so we need a temporary filename.3802 // so we need a temporary filename.
3758 const out_obj_path = try comp.tmpFilePath(arena, o_basename);3803 const out_obj_path = try comp.tmpFilePath(arena, o_basename);
3759 var zig_cache_tmp_dir = try comp.local_cache_directory.handle.makeOpenPath("tmp", .{});3804 var zig_cache_tmp_dir = try comp.local_cache_directory.handle.makeOpenPath("tmp", .{});
3760 defer zig_cache_tmp_dir.close();3805 defer zig_cache_tmp_dir.close();
37613806
3762 try argv.appendSlice(&[_][]const u8{ self_exe_path, "clang" });
3763
3764 const ext = classifyFileExt(c_object.src.src_path);
3765 const out_dep_path: ?[]const u8 = if (comp.disable_c_depfile or !ext.clangSupportsDepFile())3807 const out_dep_path: ?[]const u8 = if (comp.disable_c_depfile or !ext.clangSupportsDepFile())
3766 null3808 null
3767 else3809 else
3768 try std.fmt.allocPrint(arena, "{s}.d", .{out_obj_path});3810 try std.fmt.allocPrint(arena, "{s}.d", .{out_obj_path});
3769 try comp.addCCArgs(arena, &argv, ext, out_dep_path);3811 try comp.addCCArgs(arena, &argv, ext, out_dep_path);
37703812
3771 try argv.ensureUnusedCapacity(6 + c_object.src.extra_flags.len);3813 try argv.ensureUnusedCapacity(5);
3772 switch (comp.clang_preprocessor_mode) {3814 switch (comp.clang_preprocessor_mode) {
3773 .no => argv.appendSliceAssumeCapacity(&[_][]const u8{ "-c", "-o", out_obj_path }),3815 .no => argv.appendSliceAssumeCapacity(&[_][]const u8{ "-c", "-o", out_obj_path }),
3774 .yes => argv.appendSliceAssumeCapacity(&[_][]const u8{ "-E", "-o", out_obj_path }),3816 .yes => argv.appendSliceAssumeCapacity(&[_][]const u8{ "-E", "-o", out_obj_path }),
...@@ -3783,8 +3825,6 @@ fn updateCObject(comp: *Compilation, c_object: *CObject, c_obj_prog_node: *std.P...@@ -3783,8 +3825,6 @@ fn updateCObject(comp: *Compilation, c_object: *CObject, c_obj_prog_node: *std.P
3783 argv.appendAssumeCapacity("-emit-llvm");3825 argv.appendAssumeCapacity("-emit-llvm");
3784 }3826 }
3785 }3827 }
3786 argv.appendAssumeCapacity(c_object.src.src_path);
3787 argv.appendSliceAssumeCapacity(c_object.src.extra_flags);
37883828
3789 if (comp.verbose_cc) {3829 if (comp.verbose_cc) {
3790 dump_argv(argv.items);3830 dump_argv(argv.items);