authorgravatar for luuk@degram.devLuuk de Gram <luuk@degram.dev> 2022-11-30 17:52:37+01:00
committergravatar for luuk@degram.devLuuk de Gram <luuk@degram.dev> 2022-11-30 17:56:02+01:00
log3933a4bac5179c30cb6a08d6f1e42f9b44ce9599
tree6110e0a8cfad3c12e23e00d234244f14a14879a7
parentdf7ddb475e4c96bf44cc7e802c2c36efb8f38e89
signaturelock-open Commit is signed but in an unrecognized format.

codegen: support generating packed structs


3 files changed, 43 insertions(+), 10 deletions(-)

src/arch/wasm/CodeGen.zig+4
......@@ -2146,6 +2146,10 @@ fn airStore(func: *CodeGen, inst: Air.Inst.Index) InnerError!void {
21462146 };
21472147 const int_elem_ty = Type.initPayload(&int_ty_payload.base);
21482148
2149 if (isByRef(int_elem_ty, func.target)) {
2150 return func.fail("TODO: airStore for pointers to bitfields with backing type larger than 64bits", .{});
2151 }
2152
21492153 var mask = @intCast(u64, (@as(u65, 1) << @intCast(u7, ty.bitSize(func.target))) - 1);
21502154 mask <<= @intCast(u6, ptr_info.bit_offset);
21512155 mask ^= ~@as(u64, 0);
src/codegen.zig+36-8
......@@ -556,14 +556,42 @@ pub fn generateSymbol(
556556 },
557557 .Struct => {
558558 if (typed_value.ty.containerLayout() == .Packed) {
559 return Result{
560 .fail = try ErrorMsg.create(
561 bin_file.allocator,
562 src_loc,
563 "TODO implement generateSymbol for packed struct",
564 .{},
565 ),
566 };
559 const struct_obj = typed_value.ty.castTag(.@"struct").?.data;
560 const fields = struct_obj.fields.values();
561 const field_vals = typed_value.val.castTag(.aggregate).?.data;
562 const abi_size = math.cast(usize, typed_value.ty.abiSize(target)) orelse return error.Overflow;
563 const current_pos = code.items.len;
564 const mod = bin_file.options.module.?;
565 try code.resize(current_pos + abi_size);
566 var bits: u16 = 0;
567
568 for (field_vals) |field_val, index| {
569 const field_ty = fields[index].ty;
570 // pointer may point to a decl which must be marked used
571 // but can also result in a relocation. Therefore we handle those seperately.
572 if (field_ty.zigTypeTag() == .Pointer) {
573 std.debug.print("Hit!\n", .{});
574 var tmp_list = try std.ArrayList(u8).initCapacity(code.allocator, field_ty.abiSize(target));
575 defer tmp_list.deinit();
576 switch (try generateSymbol(bin_file, src_loc, .{
577 .ty = field_ty,
578 .val = field_val,
579 }, &tmp_list, debug_output, reloc_info)) {
580 .appended => {
581 mem.copy(u8, code.items[current_pos..], tmp_list.items);
582 },
583 .externally_managed => |external_slice| {
584 mem.copy(u8, code.items[current_pos..], external_slice);
585 },
586 .fail => |em| return Result{ .fail = em },
587 }
588 } else {
589 field_val.writeToPackedMemory(field_ty, mod, code.items[current_pos..], bits);
590 }
591 bits += @intCast(u16, field_ty.bitSize(target));
592 }
593
594 return Result{ .appended = {} };
567595 }
568596
569597 const struct_begin = code.items.len;
src/link/Wasm.zig+3-2
......@@ -1841,8 +1841,9 @@ fn setupStart(wasm: *Wasm) !void {
18411841/// Sets up the memory section of the wasm module, as well as the stack.
18421842fn setupMemory(wasm: *Wasm) !void {
18431843 log.debug("Setting up memory layout", .{});
1844 const page_size = 64 * 1024;
1845 const stack_size = wasm.base.options.stack_size_override orelse page_size * 1;
1844 const page_size = std.wasm.page_size; // 65kb
1845 // Use the user-provided stack size or else we use 1MB by default
1846 const stack_size = wasm.base.options.stack_size_override orelse page_size * 16;
18461847 const stack_alignment = 16; // wasm's stack alignment as specified by tool-convention
18471848 // Always place the stack at the start by default
18481849 // unless the user specified the global-base flag