| ... | ... | @@ -2556,6 +2556,10 @@ pub fn flushModule(wasm: *Wasm, comp: *Compilation, prog_node: *std.Progress.Nod |
| 2556 | 2556 | try wasm.emitDataRelocations(&binary_bytes, data_index, symbol_table); |
| 2557 | 2557 | } |
| 2558 | 2558 | } else if (!wasm.base.options.strip) { |
| 2559 | try wasm.emitNameSection(&binary_bytes, arena); |
| 2560 | } |
| 2561 | |
| 2562 | if (!wasm.base.options.strip) { |
| 2559 | 2563 | if (wasm.dwarf) |*dwarf| { |
| 2560 | 2564 | const mod = wasm.base.options.module.?; |
| 2561 | 2565 | try dwarf.writeDbgAbbrev(&wasm.base); |
| ... | ... | @@ -2597,7 +2601,8 @@ pub fn flushModule(wasm: *Wasm, comp: *Compilation, prog_node: *std.Progress.Nod |
| 2597 | 2601 | debug_bytes.clearRetainingCapacity(); |
| 2598 | 2602 | } |
| 2599 | 2603 | } |
| 2600 | | try wasm.emitNameSection(&binary_bytes, arena); |
| 2604 | |
| 2605 | try emitProducerSection(&binary_bytes); |
| 2601 | 2606 | } |
| 2602 | 2607 | |
| 2603 | 2608 | // Only when writing all sections executed properly we write the magic |
| ... | ... | @@ -2631,6 +2636,65 @@ fn emitDebugSection(binary_bytes: *std.ArrayList(u8), data: []const u8, name: [] |
| 2631 | 2636 | ); |
| 2632 | 2637 | } |
| 2633 | 2638 | |
| 2639 | fn emitProducerSection(binary_bytes: *std.ArrayList(u8)) !void { |
| 2640 | const header_offset = try reserveCustomSectionHeader(binary_bytes); |
| 2641 | |
| 2642 | const writer = binary_bytes.writer(); |
| 2643 | const producers = "producers"; |
| 2644 | try leb.writeULEB128(writer, @intCast(u32, producers.len)); |
| 2645 | try writer.writeAll(producers); |
| 2646 | |
| 2647 | try leb.writeULEB128(writer, @as(u32, 2)); // 2 fields: Language + processed-by |
| 2648 | |
| 2649 | // used for the Zig version |
| 2650 | var version_buf: [100]u8 = undefined; |
| 2651 | const version = try std.fmt.bufPrint(&version_buf, "{}", .{build_options.semver}); |
| 2652 | |
| 2653 | // language field |
| 2654 | { |
| 2655 | const language = "language"; |
| 2656 | try leb.writeULEB128(writer, @intCast(u32, language.len)); |
| 2657 | try writer.writeAll(language); |
| 2658 | |
| 2659 | // field_value_count (TODO: Parse object files for producer sections to detect their language) |
| 2660 | try leb.writeULEB128(writer, @as(u32, 1)); |
| 2661 | |
| 2662 | // versioned name |
| 2663 | { |
| 2664 | try leb.writeULEB128(writer, @as(u32, 3)); // len of "Zig" |
| 2665 | try writer.writeAll("Zig"); |
| 2666 | |
| 2667 | try leb.writeULEB128(writer, @intCast(u32, version.len)); |
| 2668 | try writer.writeAll(version); |
| 2669 | } |
| 2670 | } |
| 2671 | |
| 2672 | // processed-by field |
| 2673 | { |
| 2674 | const processed_by = "processed_by"; |
| 2675 | try leb.writeULEB128(writer, @intCast(u32, processed_by.len)); |
| 2676 | try writer.writeAll(processed_by); |
| 2677 | |
| 2678 | // field_value_count (TODO: Parse object files for producer sections to detect other used tools) |
| 2679 | try leb.writeULEB128(writer, @as(u32, 1)); |
| 2680 | |
| 2681 | // versioned name |
| 2682 | { |
| 2683 | try leb.writeULEB128(writer, @as(u32, 3)); // len of "Zig" |
| 2684 | try writer.writeAll("Zig"); |
| 2685 | |
| 2686 | try leb.writeULEB128(writer, @intCast(u32, version.len)); |
| 2687 | try writer.writeAll(version); |
| 2688 | } |
| 2689 | } |
| 2690 | |
| 2691 | try writeCustomSectionHeader( |
| 2692 | binary_bytes.items, |
| 2693 | header_offset, |
| 2694 | @intCast(u32, binary_bytes.items.len - header_offset - 6), |
| 2695 | ); |
| 2696 | } |
| 2697 | |
| 2634 | 2698 | fn emitNameSection(wasm: *Wasm, binary_bytes: *std.ArrayList(u8), arena: std.mem.Allocator) !void { |
| 2635 | 2699 | const Name = struct { |
| 2636 | 2700 | index: u32, |