| ... | ... | @@ -556,14 +556,42 @@ pub fn generateSymbol( |
| 556 | 556 | }, |
| 557 | 557 | .Struct => { |
| 558 | 558 | 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 = {} }; |
| 567 | 595 | } |
| 568 | 596 | |
| 569 | 597 | const struct_begin = code.items.len; |