From f69650a4788c57ec20348e9c002884ba39339d1c Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Tue, 29 Sep 2020 16:59:35 -0700 Subject: [PATCH] update wasm to use ".o.wasm" extension for objects This is convenient for debugging purposes, as well as simplifying the caching system since executable basenames will not conflict with their corresponding object files. --- lib/std/build.zig | 1 + lib/std/target.zig | 19 +++++++++++-------- lib/std/zig.zig | 20 +++++++++----------- lib/std/zig/cross_target.zig | 2 +- src/Compilation.zig | 2 +- src/link.zig | 2 +- 6 files changed, 24 insertions(+), 22 deletions(-) diff --git a/lib/std/build.zig b/lib/std/build.zig index b2da9da3325f5a5ddd8494ac9fcfda0b9a6b6b8b..7e3c75bc78a8d725ba618f17279388f99b1583f0 100644 --- a/lib/std/build.zig +++ b/lib/std/build.zig @@ -1384,6 +1384,7 @@ pub const LibExeObjStep = struct { } fn computeOutFileNames(self: *LibExeObjStep) void { + // TODO make this call std.zig.binNameAlloc switch (self.kind) { .Obj => { self.out_filename = self.builder.fmt("{}{}", .{ self.name, self.target.oFileExt() }); diff --git a/lib/std/target.zig b/lib/std/target.zig index e1a7e1a2bfded86960bec4cceb28649141d6e843..99617c6d0eba57bcacae1c951cbb526c0767fe17 100644 --- a/lib/std/target.zig +++ b/lib/std/target.zig @@ -483,13 +483,6 @@ pub const Target = struct { else => false, }; } - - pub fn oFileExt(abi: Abi) [:0]const u8 { - return switch (abi) { - .msvc => ".obj", - else => ".o", - }; - } }; pub const ObjectFormat = enum { @@ -1142,8 +1135,18 @@ pub const Target = struct { return linuxTripleSimple(allocator, self.cpu.arch, self.os.tag, self.abi); } + pub fn oFileExt_cpu_arch_abi(cpu_arch: Cpu.Arch, abi: Abi) [:0]const u8 { + if (cpu_arch.isWasm()) { + return ".o.wasm"; + } + switch (abi) { + .msvc => return ".obj", + else => return ".o", + } + } + pub fn oFileExt(self: Target) [:0]const u8 { - return self.abi.oFileExt(); + return oFileExt_cpu_arch_abi(self.cpu.arch, self.abi); } pub fn exeFileExtSimple(cpu_arch: Cpu.Arch, os_tag: Os.Tag) [:0]const u8 { diff --git a/lib/std/zig.zig b/lib/std/zig.zig index 66226e8dd1d5e97d6b296d8a22a757c2ba527421..42a33383b747ee0f8b591c901a9bacc69500722f 100644 --- a/lib/std/zig.zig +++ b/lib/std/zig.zig @@ -79,13 +79,7 @@ pub fn binNameAlloc(allocator: *std.mem.Allocator, options: BinNameOptions) erro const target = options.target; switch (options.object_format orelse target.getObjectFormat()) { .coff, .pe => switch (options.output_mode) { - .Exe => { - const suffix = switch (target.os.tag) { - .uefi => ".efi", - else => ".exe", - }; - return std.fmt.allocPrint(allocator, "{s}{s}", .{ root_name, suffix }); - }, + .Exe => return std.fmt.allocPrint(allocator, "{s}{s}", .{ root_name, target.exeFileExt() }), .Lib => { const suffix = switch (options.link_mode orelse .Static) { .Static => ".lib", @@ -93,7 +87,7 @@ pub fn binNameAlloc(allocator: *std.mem.Allocator, options: BinNameOptions) erro }; return std.fmt.allocPrint(allocator, "{s}{s}", .{ root_name, suffix }); }, - .Obj => return std.fmt.allocPrint(allocator, "{s}{s}", .{ root_name, target.abi.oFileExt() }), + .Obj => return std.fmt.allocPrint(allocator, "{s}{s}", .{ root_name, target.oFileExt() }), }, .elf => switch (options.output_mode) { .Exe => return allocator.dupe(u8, root_name), @@ -113,7 +107,7 @@ pub fn binNameAlloc(allocator: *std.mem.Allocator, options: BinNameOptions) erro }, } }, - .Obj => return std.fmt.allocPrint(allocator, "{s}.o", .{root_name}), + .Obj => return std.fmt.allocPrint(allocator, "{s}{s}", .{ root_name, target.oFileExt() }), }, .macho => switch (options.output_mode) { .Exe => return allocator.dupe(u8, root_name), @@ -124,9 +118,13 @@ pub fn binNameAlloc(allocator: *std.mem.Allocator, options: BinNameOptions) erro }; return std.fmt.allocPrint(allocator, "{s}{s}{s}", .{ target.libPrefix(), root_name, suffix }); }, - .Obj => return std.fmt.allocPrint(allocator, "{s}.o", .{root_name}), + .Obj => return std.fmt.allocPrint(allocator, "{s}{s}", .{ root_name, target.oFileExt() }), + }, + .wasm => switch (options.output_mode) { + .Exe => return std.fmt.allocPrint(allocator, "{s}{s}", .{ root_name, target.exeFileExt() }), + .Obj => return std.fmt.allocPrint(allocator, "{s}{s}", .{ root_name, target.oFileExt() }), + .Lib => return std.fmt.allocPrint(allocator, "{s}.wasm", .{root_name}), }, - .wasm => return std.fmt.allocPrint(allocator, "{s}.wasm", .{root_name}), .c => return std.fmt.allocPrint(allocator, "{s}.c", .{root_name}), .hex => return std.fmt.allocPrint(allocator, "{s}.ihex", .{root_name}), .raw => return std.fmt.allocPrint(allocator, "{s}.bin", .{root_name}), diff --git a/lib/std/zig/cross_target.zig b/lib/std/zig/cross_target.zig index f94598c30cfb715a72504b3da0be3a4df6d06f93..f1ae3457a564b9886b9b15cffa3925b893168fd3 100644 --- a/lib/std/zig/cross_target.zig +++ b/lib/std/zig/cross_target.zig @@ -466,7 +466,7 @@ pub const CrossTarget = struct { } pub fn oFileExt(self: CrossTarget) [:0]const u8 { - return self.getAbi().oFileExt(); + return Target.oFileExt_cpu_arch_abi(self.getCpuArch(), self.getAbi()); } pub fn exeFileExt(self: CrossTarget) [:0]const u8 { diff --git a/src/Compilation.zig b/src/Compilation.zig index 9cc2c3aa5c455796391357e4cd492caf060a8468..d60b32321685a3d421413c3b2558338b6b2d3fe5 100644 --- a/src/Compilation.zig +++ b/src/Compilation.zig @@ -1520,7 +1520,7 @@ fn updateCObject(comp: *Compilation, c_object: *CObject) !void { comp.bin_file.options.root_name else mem.split(c_source_basename, ".").next().?; - const o_basename = try std.fmt.allocPrint(arena, "{}{}", .{ o_basename_noext, comp.getTarget().oFileExt() }); + const o_basename = try std.fmt.allocPrint(arena, "{s}{s}", .{ o_basename_noext, comp.getTarget().oFileExt() }); const digest = if (!comp.disable_c_depfile and try man.hit()) man.final() else blk: { var argv = std.ArrayList([]const u8).init(comp.gpa); diff --git a/src/link.zig b/src/link.zig index 51bf8a64ae28e039aec44cd2f87ea26c1cc14982..2d215ea0dc8b3db4557ceaf4c7203728e883af4e 100644 --- a/src/link.zig +++ b/src/link.zig @@ -176,7 +176,7 @@ pub const File = struct { }; } // Open a temporary object file, not the final output file because we want to link with LLD. - break :blk try std.fmt.allocPrint(allocator, "{}{}", .{ emit.sub_path, options.target.oFileExt() }); + break :blk try std.fmt.allocPrint(allocator, "{s}{s}", .{ emit.sub_path, options.target.oFileExt() }); } else emit.sub_path; errdefer if (use_lld) allocator.free(sub_path); -- 2.54.0