authorgravatar for joachim.schmidt557@outlook.comJoachim Schmidt <joachim.schmidt557@outlook.com> 2021-12-26 16:40:51+01:00
committergravatar for joachim.schmidt557@outlook.comJoachim Schmidt <joachim.schmidt557@outlook.com> 2021-12-26 16:40:51+01:00
log15f0f9240d1183e5c6c60006b5ff4e02d3d98ce7
tree4ddd16f7e7690f18b4fef2d35a6067bf54d3d8db
parent6b8e33d14c92229b1632c481906d7d698c584000
signaturelock-open Commit is signed but in an unrecognized format.

stage2 codegen: Implement generateSymbol for undefined values


1 files changed, 39 insertions(+), 0 deletions(-)

src/codegen.zig+39
......@@ -150,6 +150,13 @@ pub fn generateSymbol(
150150 const tracy = trace(@src());
151151 defer tracy.end();
152152
153 if (typed_value.val.isUndefDeep()) {
154 const target = bin_file.options.target;
155 const abi_size = try math.cast(usize, typed_value.ty.abiSize(target));
156 try code.appendNTimes(0xaa, abi_size);
157 return Result{ .appended = {} };
158 }
159
153160 switch (typed_value.ty.zigTypeTag()) {
154161 .Fn => {
155162 return Result{
......@@ -193,6 +200,38 @@ pub fn generateSymbol(
193200 },
194201 .Pointer => switch (typed_value.ty.ptrSize()) {
195202 .Slice => {
203 // TODO populate .debug_info for the slice
204
205 // generate ptr
206 var buf: Type.SlicePtrFieldTypeBuffer = undefined;
207 const slice_ptr_field_type = typed_value.ty.slicePtrFieldType(&buf);
208 switch (try generateSymbol(bin_file, src_loc, .{
209 .ty = slice_ptr_field_type,
210 .val = typed_value.val.slicePtr(),
211 }, code, debug_output)) {
212 .appended => {},
213 .externally_managed => |slice| {
214 code.appendSliceAssumeCapacity(slice);
215 },
216 .fail => |em| return Result{ .fail = em },
217 }
218
219 // generate length
220 var int_buffer: Value.Payload.U64 = .{
221 .base = .{ .tag = .int_u64 },
222 .data = typed_value.val.sliceLen(),
223 };
224 switch (try generateSymbol(bin_file, src_loc, .{
225 .ty = Type.initTag(.usize),
226 .val = Value.initPayload(&int_buffer.base),
227 }, code, debug_output)) {
228 .appended => {},
229 .externally_managed => |slice| {
230 code.appendSliceAssumeCapacity(slice);
231 },
232 .fail => |em| return Result{ .fail = em },
233 }
234
196235 return Result{
197236 .fail = try ErrorMsg.create(
198237 bin_file.allocator,