| author | |
| committer | |
| log | 3933a4bac5179c30cb6a08d6f1e42f9b44ce9599 |
| tree | 6110e0a8cfad3c12e23e00d234244f14a14879a7 |
| parent | df7ddb475e4c96bf44cc7e802c2c36efb8f38e89 |
| signature |
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 { | ... | @@ -2146,6 +2146,10 @@ fn airStore(func: *CodeGen, inst: Air.Inst.Index) InnerError!void { |
| 2146 | }; | 2146 | }; |
| 2147 | const int_elem_ty = Type.initPayload(&int_ty_payload.base); | 2147 | const int_elem_ty = Type.initPayload(&int_ty_payload.base); |
| 2148 | 2148 | ||
| 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 | |||
| 2149 | var mask = @intCast(u64, (@as(u65, 1) << @intCast(u7, ty.bitSize(func.target))) - 1); | 2153 | var mask = @intCast(u64, (@as(u65, 1) << @intCast(u7, ty.bitSize(func.target))) - 1); |
| 2150 | mask <<= @intCast(u6, ptr_info.bit_offset); | 2154 | mask <<= @intCast(u6, ptr_info.bit_offset); |
| 2151 | mask ^= ~@as(u64, 0); | 2155 | mask ^= ~@as(u64, 0); |
src/codegen.zig+36-8| ... | @@ -556,14 +556,42 @@ pub fn generateSymbol( | ... | @@ -556,14 +556,42 @@ pub fn generateSymbol( |
| 556 | }, | 556 | }, |
| 557 | .Struct => { | 557 | .Struct => { |
| 558 | if (typed_value.ty.containerLayout() == .Packed) { | 558 | if (typed_value.ty.containerLayout() == .Packed) { |
| 559 | return Result{ | 559 | const struct_obj = typed_value.ty.castTag(.@"struct").?.data; |
| 560 | .fail = try ErrorMsg.create( | 560 | const fields = struct_obj.fields.values(); |
| 561 | bin_file.allocator, | 561 | const field_vals = typed_value.val.castTag(.aggregate).?.data; |
| 562 | src_loc, | 562 | const abi_size = math.cast(usize, typed_value.ty.abiSize(target)) orelse return error.Overflow; |
| 563 | "TODO implement generateSymbol for packed struct", | 563 | const current_pos = code.items.len; |
| 564 | .{}, | 564 | const mod = bin_file.options.module.?; |
| 565 | ), | 565 | try code.resize(current_pos + abi_size); |
| 566 | }; | 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 = {} }; | ||
| 567 | } | 595 | } |
| 568 | 596 | ||
| 569 | const struct_begin = code.items.len; | 597 | const struct_begin = code.items.len; |
src/link/Wasm.zig+3-2| ... | @@ -1841,8 +1841,9 @@ fn setupStart(wasm: *Wasm) !void { | ... | @@ -1841,8 +1841,9 @@ fn setupStart(wasm: *Wasm) !void { |
| 1841 | /// Sets up the memory section of the wasm module, as well as the stack. | 1841 | /// Sets up the memory section of the wasm module, as well as the stack. |
| 1842 | fn setupMemory(wasm: *Wasm) !void { | 1842 | fn setupMemory(wasm: *Wasm) !void { |
| 1843 | log.debug("Setting up memory layout", .{}); | 1843 | log.debug("Setting up memory layout", .{}); |
| 1844 | const page_size = 64 * 1024; | 1844 | const page_size = std.wasm.page_size; // 65kb |
| 1845 | const stack_size = wasm.base.options.stack_size_override orelse page_size * 1; | 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; | ||
| 1846 | const stack_alignment = 16; // wasm's stack alignment as specified by tool-convention | 1847 | const stack_alignment = 16; // wasm's stack alignment as specified by tool-convention |
| 1847 | // Always place the stack at the start by default | 1848 | // Always place the stack at the start by default |
| 1848 | // unless the user specified the global-base flag | 1849 | // unless the user specified the global-base flag |