Zig 0.17.0-dev (Split by item)

This is an example of documentation generated by ZigDoc, an alternative to Zig's built-in Auto Doc feature. See also examples in other modes/formats. The project being documented here (as the example) is the Zig library itself.

dump

objdump.dump
fn dump(d: *const DumpContext) !void

File

lib/compiler/objdump.zig:205

Code

fn dump(d: *const DumpContext) !void {
    const r = &d.fr.interface;
    try r.fill(4);
    elf: {
        if (!mem.eql(u8, r.buffered()[0..4], std.elf.MAGIC)) break :elf;
        return elf.dump(r, d.w);
    }
    macho: {
        if (mem.readInt(u32, r.buffered()[0..4], .little) != std.macho.MH_MAGIC_64) break :macho;
        return macho.dump(r, d.w);
    }
    wasm: {
        comptime assert(std.wasm.magic.len == 4);
        if (!mem.eql(u8, r.buffered()[0..4], &std.wasm.magic)) break :wasm;
        return wasm.dump(r, d.w);
    }
    coff: {
        const ext = std.fs.path.extension(d.opts.input_path);
        const basename = std.fs.path.basename(d.opts.input_path);
        if (std.mem.eql(u8, ext, ".exe") or std.mem.eql(u8, ext, ".dll")) {
            if (!mem.eql(u8, r.buffered()[0..2], "MZ")) break :coff;
            try r.discardAll(std.coff.pe_pointer_offset);
            const sig_offset = try r.takeInt(u32, .little);
            try d.fr.seekTo(sig_offset);
            const sig = try r.take(4);

            if (!std.mem.eql(u8, sig, std.coff.pe_signature)) {
                try d.w.print("invalid PE signature: {x}", .{sig});
                return error.ParseFailure;
            }

            if (d.element(.@"file-type")) {
                try d.w.print("{s}: PE/COFF image\n\n", .{basename});
                if (d.element(.newlines)) try d.w.writeByte('\n');
            }

            return coff.dumpObject(d, true, basename);
        } else if (std.mem.eql(u8, ext, ".lib")) {
            r.fill(std.coff.archive_signature.len) catch break :coff;
            if (!mem.eql(u8, r.buffered()[0..std.coff.archive_signature.len], std.coff.archive_signature)) break :coff;
            if (d.element(.@"file-type")) {
                try d.w.print("{s}: COFF archive\n", .{basename});
                if (d.element(.newlines)) try d.w.writeByte('\n');
            }

            return coff.dumpArchive(d);
        } else if (std.mem.eql(u8, ext, ".obj")) {
            if (d.element(.@"file-type")) {
                try d.w.print("{s}: COFF object\n", .{basename});
                if (d.element(.newlines)) try d.w.writeByte('\n');
            }

            return coff.dumpObject(d, false, basename);
        }
    }
    return error.UnknownFile;
}