| ... | ... | @@ -150,6 +150,13 @@ pub fn generateSymbol( |
| 150 | 150 | const tracy = trace(@src()); |
| 151 | 151 | defer tracy.end(); |
| 152 | 152 | |
| 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 | |
| 153 | 160 | switch (typed_value.ty.zigTypeTag()) { |
| 154 | 161 | .Fn => { |
| 155 | 162 | return Result{ |
| ... | ... | @@ -193,6 +200,38 @@ pub fn generateSymbol( |
| 193 | 200 | }, |
| 194 | 201 | .Pointer => switch (typed_value.ty.ptrSize()) { |
| 195 | 202 | .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 | |
| 196 | 235 | return Result{ |
| 197 | 236 | .fail = try ErrorMsg.create( |
| 198 | 237 | bin_file.allocator, |