@@ -5422,8 +5422,22 @@ static LLVMValueRef ir_render_slice(CodeGen *g, IrExecutableGen *executable, IrI
5422
5422
5423
5423
bool want_runtime_safety = instruction->safety_check_on && ir_want_runtime_safety(g, &instruction->base);
5424
5424
5425
- ZigType *res_slice_ptr_type = instruction->base.value->type->data.structure.fields[slice_ptr_index]->type_entry;
5426
- ZigValue *sentinel = res_slice_ptr_type->data.pointer.sentinel;
5425
+ ZigType *result_type = instruction->base.value->type;
5426
+ if (!type_has_bits(g, result_type)) {
5427
+ return nullptr;
5428
+ }
5429
+
5430
+ ZigValue *sentinel = nullptr;
5431
+ if (result_type->id == ZigTypeIdPointer) {
5432
+ ZigType *result_array_type = result_type->data.pointer.child_type;
5433
+ ir_assert(result_array_type->id == ZigTypeIdArray, &instruction->base);
5434
+ sentinel = result_array_type->data.array.sentinel;
5435
+ } else if (result_type->id == ZigTypeIdStruct) {
5436
+ ZigType *res_slice_ptr_type = result_type->data.structure.fields[slice_ptr_index]->type_entry;
5437
+ sentinel = res_slice_ptr_type->data.pointer.sentinel;
5438
+ } else {
5439
+ zig_unreachable();
5440
+ }
5427
5441
5428
5442
if (array_type->id == ZigTypeIdArray ||
5429
5443
(array_type->id == ZigTypeIdPointer && array_type->data.pointer.ptr_len == PtrLenSingle))
@@ -5466,18 +5480,24 @@ static LLVMValueRef ir_render_slice(CodeGen *g, IrExecutableGen *executable, IrI
5466
5480
return tmp_struct_ptr;
5467
5481
}
5468
5482
5469
-
5470
- LLVMValueRef ptr_field_ptr = LLVMBuildStructGEP(g->builder, tmp_struct_ptr, slice_ptr_index, "");
5471
5483
LLVMValueRef indices[] = {
5472
5484
LLVMConstNull(g->builtin_types.entry_usize->llvm_type),
5473
5485
start_val,
5474
5486
};
5475
5487
LLVMValueRef slice_start_ptr = LLVMBuildInBoundsGEP(g->builder, array_ptr, indices, 2, "");
5476
- gen_store_untyped(g, slice_start_ptr, ptr_field_ptr, 0, false);
5488
+ if (result_type->id == ZigTypeIdPointer) {
5489
+ LLVMTypeRef result_ptr_type = get_llvm_type(g, result_type);
5490
+ LLVMValueRef bitcasted = LLVMBuildBitCast(g->builder, slice_start_ptr, result_ptr_type, "");
5491
+ gen_store_untyped(g, bitcasted, tmp_struct_ptr, 0, false);
5492
+ return slice_start_ptr;
5493
+ } else {
5494
+ LLVMValueRef ptr_field_ptr = LLVMBuildStructGEP(g->builder, tmp_struct_ptr, slice_ptr_index, "");
5495
+ gen_store_untyped(g, slice_start_ptr, ptr_field_ptr, 0, false);
5477
5496
5478
- LLVMValueRef len_field_ptr = LLVMBuildStructGEP(g->builder, tmp_struct_ptr, slice_len_index, "");
5479
- LLVMValueRef len_value = LLVMBuildNSWSub(g->builder, end_val, start_val, "");
5480
- gen_store_untyped(g, len_value, len_field_ptr, 0, false);
5497
+ LLVMValueRef len_field_ptr = LLVMBuildStructGEP(g->builder, tmp_struct_ptr, slice_len_index, "");
5498
+ LLVMValueRef len_value = LLVMBuildNSWSub(g->builder, end_val, start_val, "");
5499
+ gen_store_untyped(g, len_value, len_field_ptr, 0, false);
5500
+ }
5481
5501
5482
5502
return tmp_struct_ptr;
5483
5503
} else if (array_type->id == ZigTypeIdPointer) {
@@ -5493,14 +5513,21 @@ static LLVMValueRef ir_render_slice(CodeGen *g, IrExecutableGen *executable, IrI
5493
5513
}
5494
5514
}
5495
5515
5516
+ LLVMValueRef slice_start_ptr = LLVMBuildInBoundsGEP(g->builder, array_ptr, &start_val, 1, "");
5517
+ if (result_type->id == ZigTypeIdPointer) {
5518
+ LLVMTypeRef result_ptr_type = get_llvm_type(g, result_type);
5519
+ LLVMValueRef bitcasted = LLVMBuildBitCast(g->builder, slice_start_ptr, result_ptr_type, "");
5520
+ gen_store_untyped(g, bitcasted, tmp_struct_ptr, 0, false);
5521
+ return bitcasted;
5522
+ }
5523
+
5496
5524
if (type_has_bits(g, array_type)) {
5497
- size_t gen_ptr_index = instruction->base.value->type ->data.structure.fields[slice_ptr_index]->gen_index;
5525
+ size_t gen_ptr_index = result_type ->data.structure.fields[slice_ptr_index]->gen_index;
5498
5526
LLVMValueRef ptr_field_ptr = LLVMBuildStructGEP(g->builder, tmp_struct_ptr, gen_ptr_index, "");
5499
- LLVMValueRef slice_start_ptr = LLVMBuildInBoundsGEP(g->builder, array_ptr, &start_val, 1, "");
5500
5527
gen_store_untyped(g, slice_start_ptr, ptr_field_ptr, 0, false);
5501
5528
}
5502
5529
5503
- size_t gen_len_index = instruction->base.value->type ->data.structure.fields[slice_len_index]->gen_index;
5530
+ size_t gen_len_index = result_type ->data.structure.fields[slice_len_index]->gen_index;
5504
5531
LLVMValueRef len_field_ptr = LLVMBuildStructGEP(g->builder, tmp_struct_ptr, gen_len_index, "");
5505
5532
LLVMValueRef len_value = LLVMBuildNSWSub(g->builder, end_val, start_val, "");
5506
5533
gen_store_untyped(g, len_value, len_field_ptr, 0, false);
@@ -5510,7 +5537,9 @@ static LLVMValueRef ir_render_slice(CodeGen *g, IrExecutableGen *executable, IrI
5510
5537
assert(array_type->data.structure.special == StructSpecialSlice);
5511
5538
assert(LLVMGetTypeKind(LLVMTypeOf(array_ptr)) == LLVMPointerTypeKind);
5512
5539
assert(LLVMGetTypeKind(LLVMGetElementType(LLVMTypeOf(array_ptr))) == LLVMStructTypeKind);
5513
- assert(LLVMGetTypeKind(LLVMGetElementType(LLVMTypeOf(tmp_struct_ptr))) == LLVMStructTypeKind);
5540
+ if (result_type->id != ZigTypeIdPointer) {
5541
+ assert(LLVMGetTypeKind(LLVMGetElementType(LLVMTypeOf(tmp_struct_ptr))) == LLVMStructTypeKind);
5542
+ }
5514
5543
5515
5544
size_t ptr_index = array_type->data.structure.fields[slice_ptr_index]->gen_index;
5516
5545
assert(ptr_index != SIZE_MAX);
@@ -5547,15 +5576,22 @@ static LLVMValueRef ir_render_slice(CodeGen *g, IrExecutableGen *executable, IrI
5547
5576
}
5548
5577
}
5549
5578
5550
- LLVMValueRef ptr_field_ptr = LLVMBuildStructGEP(g->builder, tmp_struct_ptr, (unsigned)ptr_index, "");
5551
5579
LLVMValueRef slice_start_ptr = LLVMBuildInBoundsGEP(g->builder, src_ptr, &start_val, 1, "");
5552
- gen_store_untyped(g, slice_start_ptr, ptr_field_ptr, 0, false);
5580
+ if (result_type->id == ZigTypeIdPointer) {
5581
+ LLVMTypeRef result_ptr_type = get_llvm_type(g, result_type);
5582
+ LLVMValueRef bitcasted = LLVMBuildBitCast(g->builder, slice_start_ptr, result_ptr_type, "");
5583
+ gen_store_untyped(g, bitcasted, tmp_struct_ptr, 0, false);
5584
+ return bitcasted;
5585
+ } else {
5586
+ LLVMValueRef ptr_field_ptr = LLVMBuildStructGEP(g->builder, tmp_struct_ptr, (unsigned)ptr_index, "");
5587
+ gen_store_untyped(g, slice_start_ptr, ptr_field_ptr, 0, false);
5553
5588
5554
- LLVMValueRef len_field_ptr = LLVMBuildStructGEP(g->builder, tmp_struct_ptr, (unsigned)len_index, "");
5555
- LLVMValueRef len_value = LLVMBuildNSWSub(g->builder, end_val, start_val, "");
5556
- gen_store_untyped(g, len_value, len_field_ptr, 0, false);
5589
+ LLVMValueRef len_field_ptr = LLVMBuildStructGEP(g->builder, tmp_struct_ptr, (unsigned)len_index, "");
5590
+ LLVMValueRef len_value = LLVMBuildNSWSub(g->builder, end_val, start_val, "");
5591
+ gen_store_untyped(g, len_value, len_field_ptr, 0, false);
5557
5592
5558
- return tmp_struct_ptr;
5593
+ return tmp_struct_ptr;
5594
+ }
5559
5595
} else {
5560
5596
zig_unreachable();
5561
5597
}
0 commit comments