authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-05-29 14:25:00-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-05-29 14:25:00-04:00
log1ae2002b415614935746946c511e8093a1de2902
tree057dbef0709d65c9b6bfc7c1cbf50e19a54b9e25
parent8ae4ffa49357a4939985884285fef39e86f5f705

fix crash when writing to const hardcoded ptr

closes #381

2 files changed, 19 insertions(+), 2 deletions(-)

src/ir.cpp+11-2
...@@ -9913,8 +9913,8 @@ static TypeTableEntry *ir_analyze_instruction_elem_ptr(IrAnalyze *ira, IrInstruc...@@ -9913,8 +9913,8 @@ static TypeTableEntry *ir_analyze_instruction_elem_ptr(IrAnalyze *ira, IrInstruc
9913 (array_type->id != TypeTableEntryIdPointer ||9913 (array_type->id != TypeTableEntryIdPointer ||
9914 array_ptr_val->data.x_ptr.special != ConstPtrSpecialHardCodedAddr))9914 array_ptr_val->data.x_ptr.special != ConstPtrSpecialHardCodedAddr))
9915 {9915 {
9916 ConstExprValue *out_val = ir_build_const_from(ira, &elem_ptr_instruction->base);
9917 if (array_type->id == TypeTableEntryIdPointer) {9916 if (array_type->id == TypeTableEntryIdPointer) {
9917 ConstExprValue *out_val = ir_build_const_from(ira, &elem_ptr_instruction->base);
9918 out_val->data.x_ptr.mut = array_ptr_val->data.x_ptr.mut;9918 out_val->data.x_ptr.mut = array_ptr_val->data.x_ptr.mut;
9919 size_t new_index;9919 size_t new_index;
9920 size_t mem_size;9920 size_t mem_size;
...@@ -9959,9 +9959,16 @@ static TypeTableEntry *ir_analyze_instruction_elem_ptr(IrAnalyze *ira, IrInstruc...@@ -9959,9 +9959,16 @@ static TypeTableEntry *ir_analyze_instruction_elem_ptr(IrAnalyze *ira, IrInstruc
9959 buf_sprintf("index %" ZIG_PRI_u64 " outside pointer of size %" ZIG_PRI_usize "", index, old_size));9959 buf_sprintf("index %" ZIG_PRI_u64 " outside pointer of size %" ZIG_PRI_usize "", index, old_size));
9960 return ira->codegen->builtin_types.entry_invalid;9960 return ira->codegen->builtin_types.entry_invalid;
9961 }9961 }
9962 return return_type;
9962 } else if (is_slice(array_type)) {9963 } else if (is_slice(array_type)) {
9963 ConstExprValue *ptr_field = &array_ptr_val->data.x_struct.fields[slice_ptr_index];9964 ConstExprValue *ptr_field = &array_ptr_val->data.x_struct.fields[slice_ptr_index];
9965 if (ptr_field->data.x_ptr.special == ConstPtrSpecialHardCodedAddr) {
9966 ir_build_elem_ptr_from(&ira->new_irb, &elem_ptr_instruction->base, array_ptr,
9967 casted_elem_index, false);
9968 return return_type;
9969 }
9964 ConstExprValue *len_field = &array_ptr_val->data.x_struct.fields[slice_len_index];9970 ConstExprValue *len_field = &array_ptr_val->data.x_struct.fields[slice_len_index];
9971 ConstExprValue *out_val = ir_build_const_from(ira, &elem_ptr_instruction->base);
9965 uint64_t slice_len = len_field->data.x_bignum.data.x_uint;9972 uint64_t slice_len = len_field->data.x_bignum.data.x_uint;
9966 if (index >= slice_len) {9973 if (index >= slice_len) {
9967 ir_add_error_node(ira, elem_ptr_instruction->base.source_node,9974 ir_add_error_node(ira, elem_ptr_instruction->base.source_node,
...@@ -9996,15 +10003,17 @@ static TypeTableEntry *ir_analyze_instruction_elem_ptr(IrAnalyze *ira, IrInstruc...@@ -9996,15 +10003,17 @@ static TypeTableEntry *ir_analyze_instruction_elem_ptr(IrAnalyze *ira, IrInstruc
9996 case ConstPtrSpecialHardCodedAddr:10003 case ConstPtrSpecialHardCodedAddr:
9997 zig_unreachable();10004 zig_unreachable();
9998 }10005 }
10006 return return_type;
9999 } else if (array_type->id == TypeTableEntryIdArray) {10007 } else if (array_type->id == TypeTableEntryIdArray) {
10008 ConstExprValue *out_val = ir_build_const_from(ira, &elem_ptr_instruction->base);
10000 out_val->data.x_ptr.special = ConstPtrSpecialBaseArray;10009 out_val->data.x_ptr.special = ConstPtrSpecialBaseArray;
10001 out_val->data.x_ptr.mut = array_ptr->value.data.x_ptr.mut;10010 out_val->data.x_ptr.mut = array_ptr->value.data.x_ptr.mut;
10002 out_val->data.x_ptr.data.base_array.array_val = array_ptr_val;10011 out_val->data.x_ptr.data.base_array.array_val = array_ptr_val;
10003 out_val->data.x_ptr.data.base_array.elem_index = index;10012 out_val->data.x_ptr.data.base_array.elem_index = index;
10013 return return_type;
10004 } else {10014 } else {
10005 zig_unreachable();10015 zig_unreachable();
10006 }10016 }
10007 return return_type;
10008 }10017 }
1000910018
10010 }10019 }
test/cases/misc.zig+8
...@@ -526,3 +526,11 @@ var gdt = []GDTEntry {...@@ -526,3 +526,11 @@ var gdt = []GDTEntry {
526 GDTEntry {.field = 2},526 GDTEntry {.field = 2},
527};527};
528var global_ptr = &gdt[0];528var global_ptr = &gdt[0];
529
530
531// can't really run this test but we can make sure it has no compile error
532// and generates code
533const vram = @intToPtr(&volatile u8, 0x20000000)[0..0x8000];
534export fn writeToVRam() {
535 vram[0] = 'X';
536}