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