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 b2da9da332..7e3c75bc78 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 e1a7e1a2bf..99617c6d0e 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 66226e8dd1..42a33383b7 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 f94598c30c..f1ae3457a5 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 9cc2c3aa5c..d60b323216 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 51bf8a64ae..2d215ea0dc 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);