authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-08-30 03:43:51-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-08-30 03:43:51-04:00
log849f65332d52aa315093318a1851d8207f2a290e
tree0dfe4bb6a1d6881f55dfa7cf233e6e07f49abacc
parente9280c86a1fc79aec5936bb21c9469657555a7ed

set alignment on all loads and globals

See #37

1 files changed, 40 insertions(+), 29 deletions(-)

src/codegen.cpp+40-29
......@@ -603,16 +603,30 @@ static LLVMValueRef get_floor_ceil_fn(CodeGen *g, TypeTableEntry *type_entry, Zi
603603 return fn_val;
604604}
605605
606static LLVMValueRef gen_load_untyped(CodeGen *g, LLVMValueRef ptr, uint32_t alignment, bool is_volatile,
607 const char *name)
608{
609 LLVMValueRef result = LLVMBuildLoad(g->builder, ptr, name);
610 if (is_volatile) LLVMSetVolatile(result, true);
611 if (alignment == 0) {
612 LLVMSetAlignment(result, LLVMABIAlignmentOfType(g->target_data_ref, LLVMGetElementType(LLVMTypeOf(ptr))));
613 } else {
614 LLVMSetAlignment(result, alignment);
615 }
616 return result;
617}
618
619static LLVMValueRef gen_load(CodeGen *g, LLVMValueRef ptr, TypeTableEntry *ptr_type, const char *name) {
620 return gen_load_untyped(g, ptr, ptr_type->data.pointer.alignment, ptr_type->data.pointer.is_volatile, name);
621}
622
606623static LLVMValueRef get_handle_value(CodeGen *g, LLVMValueRef ptr, TypeTableEntry *type, TypeTableEntry *ptr_type) {
607624 if (type_has_bits(type)) {
608625 if (handle_is_ptr(type)) {
609626 return ptr;
610627 } else {
611628 assert(ptr_type->id == TypeTableEntryIdPointer);
612 LLVMValueRef result = LLVMBuildLoad(g->builder, ptr, "");
613 LLVMSetVolatile(result, ptr_type->data.pointer.is_volatile);
614 LLVMSetAlignment(result, ptr_type->data.pointer.alignment);
615 return result;
629 return gen_load(g, ptr, ptr_type, "");
616630 }
617631 } else {
618632 return nullptr;
......@@ -727,8 +741,8 @@ static void gen_panic(CodeGen *g, LLVMValueRef msg_arg) {
727741 LLVMValueRef ptr_ptr = LLVMBuildStructGEP(g->builder, msg_arg, (unsigned)ptr_index, "");
728742 LLVMValueRef len_ptr = LLVMBuildStructGEP(g->builder, msg_arg, (unsigned)len_index, "");
729743
730 LLVMValueRef msg_ptr = LLVMBuildLoad(g->builder, ptr_ptr, "");
731 LLVMValueRef msg_len = LLVMBuildLoad(g->builder, len_ptr, "");
744 LLVMValueRef msg_ptr = gen_load_untyped(g, ptr_ptr, 0, false, "");
745 LLVMValueRef msg_len = gen_load_untyped(g, len_ptr, 0, false, "");
732746 gen_panic_raw(g, msg_ptr, msg_len);
733747}
734748
......@@ -828,10 +842,10 @@ static LLVMValueRef get_safety_crash_err_fn(CodeGen *g) {
828842 LLVMValueRef err_name_val = LLVMBuildInBoundsGEP(g->builder, g->err_name_table, err_table_indices, 2, "");
829843
830844 LLVMValueRef ptr_field_ptr = LLVMBuildStructGEP(g->builder, err_name_val, slice_ptr_index, "");
831 LLVMValueRef err_name_ptr = LLVMBuildLoad(g->builder, ptr_field_ptr, "");
845 LLVMValueRef err_name_ptr = gen_load_untyped(g, ptr_field_ptr, 0, false, "");
832846
833847 LLVMValueRef len_field_ptr = LLVMBuildStructGEP(g->builder, err_name_val, slice_len_index, "");
834 LLVMValueRef err_name_len = LLVMBuildLoad(g->builder, len_field_ptr, "");
848 LLVMValueRef err_name_len = gen_load_untyped(g, len_field_ptr, 0, false, "");
835849
836850 LLVMValueRef params[] = {
837851 offset_buf_ptr, // dest pointer
......@@ -1081,7 +1095,7 @@ static LLVMValueRef gen_assign_raw(CodeGen *g, LLVMValueRef ptr, TypeTableEntry
10811095 return nullptr;
10821096 }
10831097
1084 LLVMValueRef containing_int = LLVMBuildLoad(g->builder, ptr, "");
1098 LLVMValueRef containing_int = gen_load(g, ptr, ptr_type, "");
10851099
10861100 uint32_t bit_offset = ptr_type->data.pointer.bit_offset;
10871101 uint32_t host_bit_count = LLVMGetIntTypeWidth(LLVMTypeOf(containing_int));
......@@ -1144,7 +1158,7 @@ static LLVMValueRef ir_render_return(CodeGen *g, IrExecutable *executable, IrIns
11441158 gen_assign_raw(g, g->cur_ret_ptr, get_pointer_to_type(g, return_type, false), value);
11451159 LLVMBuildRetVoid(g->builder);
11461160 } else {
1147 LLVMValueRef by_val_value = LLVMBuildLoad(g->builder, value, "");
1161 LLVMValueRef by_val_value = gen_load_untyped(g, value, 0, false, "");
11481162 LLVMBuildRet(g->builder, by_val_value);
11491163 }
11501164 } else {
......@@ -1654,7 +1668,7 @@ static LLVMValueRef ir_render_cast(CodeGen *g, IrExecutable *executable,
16541668 size_t wanted_len_index = wanted_type->data.structure.fields[slice_len_index].gen_index;
16551669
16561670 LLVMValueRef src_ptr_ptr = LLVMBuildStructGEP(g->builder, expr_val, (unsigned)actual_ptr_index, "");
1657 LLVMValueRef src_ptr = LLVMBuildLoad(g->builder, src_ptr_ptr, "");
1671 LLVMValueRef src_ptr = gen_load_untyped(g, src_ptr_ptr, 0, false, "");
16581672 LLVMValueRef src_ptr_casted = LLVMBuildBitCast(g->builder, src_ptr,
16591673 wanted_type->data.structure.fields[0].type_entry->type_ref, "");
16601674 LLVMValueRef dest_ptr_ptr = LLVMBuildStructGEP(g->builder, cast_instruction->tmp_ptr,
......@@ -1662,7 +1676,7 @@ static LLVMValueRef ir_render_cast(CodeGen *g, IrExecutable *executable,
16621676 LLVMBuildStore(g->builder, src_ptr_casted, dest_ptr_ptr);
16631677
16641678 LLVMValueRef src_len_ptr = LLVMBuildStructGEP(g->builder, expr_val, (unsigned)actual_len_index, "");
1665 LLVMValueRef src_len = LLVMBuildLoad(g->builder, src_len_ptr, "");
1679 LLVMValueRef src_len = gen_load_untyped(g, src_len_ptr, 0, false, "");
16661680 uint64_t src_size = type_size(g, actual_child_type);
16671681 uint64_t dest_size = type_size(g, wanted_child_type);
16681682
......@@ -2036,8 +2050,7 @@ static LLVMValueRef ir_render_load_ptr(CodeGen *g, IrExecutable *executable, IrI
20362050 return get_handle_value(g, ptr, child_type, ptr_type);
20372051
20382052 assert(!handle_is_ptr(child_type));
2039 LLVMValueRef containing_int = LLVMBuildLoad(g->builder, ptr, "");
2040 LLVMSetVolatile(containing_int, ptr_type->data.pointer.is_volatile);
2053 LLVMValueRef containing_int = gen_load(g, ptr, ptr_type, "");
20412054
20422055 uint32_t bit_offset = ptr_type->data.pointer.bit_offset;
20432056 uint32_t host_bit_count = LLVMGetIntTypeWidth(LLVMTypeOf(containing_int));
......@@ -2133,14 +2146,14 @@ static LLVMValueRef ir_render_elem_ptr(CodeGen *g, IrExecutable *executable, IrI
21332146 size_t len_index = array_type->data.structure.fields[1].gen_index;
21342147 assert(len_index != SIZE_MAX);
21352148 LLVMValueRef len_ptr = LLVMBuildStructGEP(g->builder, array_ptr, (unsigned)len_index, "");
2136 LLVMValueRef len = LLVMBuildLoad(g->builder, len_ptr, "");
2149 LLVMValueRef len = gen_load_untyped(g, len_ptr, 0, false, "");
21372150 add_bounds_check(g, subscript_value, LLVMIntEQ, nullptr, LLVMIntULT, len);
21382151 }
21392152
21402153 size_t ptr_index = array_type->data.structure.fields[0].gen_index;
21412154 assert(ptr_index != SIZE_MAX);
21422155 LLVMValueRef ptr_ptr = LLVMBuildStructGEP(g->builder, array_ptr, (unsigned)ptr_index, "");
2143 LLVMValueRef ptr = LLVMBuildLoad(g->builder, ptr_ptr, "");
2156 LLVMValueRef ptr = gen_load_untyped(g, ptr_ptr, 0, false, "");
21442157 return LLVMBuildInBoundsGEP(g->builder, ptr, &subscript_value, 1, "");
21452158 } else {
21462159 zig_unreachable();
......@@ -2388,7 +2401,7 @@ static LLVMValueRef gen_non_null_bit(CodeGen *g, TypeTableEntry *maybe_type, LLV
23882401 return LLVMBuildICmp(g->builder, LLVMIntNE, maybe_handle, LLVMConstNull(maybe_type->type_ref), "");
23892402 } else {
23902403 LLVMValueRef maybe_field_ptr = LLVMBuildStructGEP(g->builder, maybe_handle, maybe_null_index, "");
2391 return LLVMBuildLoad(g->builder, maybe_field_ptr, "");
2404 return gen_load_untyped(g, maybe_field_ptr, 0, false, "");
23922405 }
23932406 }
23942407}
......@@ -2607,12 +2620,6 @@ static LLVMValueRef ir_render_field_parent_ptr(CodeGen *g, IrExecutable *executa
26072620 }
26082621}
26092622
2610static LLVMValueRef get_default_aligned_load(CodeGen *g, LLVMValueRef ptr) {
2611 LLVMValueRef result = LLVMBuildLoad(g->builder, ptr, "");
2612 LLVMSetAlignment(result, LLVMABIAlignmentOfType(g->target_data_ref, LLVMGetElementType(LLVMTypeOf(ptr))));
2613 return result;
2614}
2615
26162623static LLVMValueRef ir_render_align_cast(CodeGen *g, IrExecutable *executable, IrInstructionAlignCast *instruction) {
26172624 LLVMValueRef target_val = ir_llvm_value(g, instruction->target);
26182625 assert(target_val);
......@@ -2648,7 +2655,7 @@ static LLVMValueRef ir_render_align_cast(CodeGen *g, IrExecutable *executable, I
26482655
26492656 size_t ptr_index = target_type->data.structure.fields[slice_ptr_index].gen_index;
26502657 LLVMValueRef ptr_val_ptr = LLVMBuildStructGEP(g->builder, target_val, (unsigned)ptr_index, "");
2651 ptr_val = get_default_aligned_load(g, ptr_val_ptr);
2658 ptr_val = gen_load_untyped(g, ptr_val_ptr, 0, false, "");
26522659 } else {
26532660 zig_unreachable();
26542661 }
......@@ -2858,7 +2865,7 @@ static LLVMValueRef ir_render_slice(CodeGen *g, IrExecutable *executable, IrInst
28582865 LLVMValueRef prev_end = nullptr;
28592866 if (!instruction->end || want_debug_safety) {
28602867 LLVMValueRef src_len_ptr = LLVMBuildStructGEP(g->builder, array_ptr, (unsigned)len_index, "");
2861 prev_end = LLVMBuildLoad(g->builder, src_len_ptr, "");
2868 prev_end = gen_load_untyped(g, src_len_ptr, 0, false, "");
28622869 }
28632870
28642871 LLVMValueRef start_val = ir_llvm_value(g, instruction->start);
......@@ -2878,7 +2885,7 @@ static LLVMValueRef ir_render_slice(CodeGen *g, IrExecutable *executable, IrInst
28782885 }
28792886
28802887 LLVMValueRef src_ptr_ptr = LLVMBuildStructGEP(g->builder, array_ptr, (unsigned)ptr_index, "");
2881 LLVMValueRef src_ptr = LLVMBuildLoad(g->builder, src_ptr_ptr, "");
2888 LLVMValueRef src_ptr = gen_load_untyped(g, src_ptr_ptr, 0, false, "");
28822889 LLVMValueRef ptr_field_ptr = LLVMBuildStructGEP(g->builder, tmp_struct_ptr, (unsigned)ptr_index, "");
28832890 LLVMValueRef slice_start_ptr = LLVMBuildInBoundsGEP(g->builder, src_ptr, &start_val, (unsigned)len_index, "");
28842891 LLVMBuildStore(g->builder, slice_start_ptr, ptr_field_ptr);
......@@ -3023,7 +3030,7 @@ static LLVMValueRef ir_render_test_err(CodeGen *g, IrExecutable *executable, IrI
30233030 LLVMValueRef err_val;
30243031 if (type_has_bits(child_type)) {
30253032 LLVMValueRef err_val_ptr = LLVMBuildStructGEP(g->builder, err_union_handle, err_union_err_index, "");
3026 err_val = LLVMBuildLoad(g->builder, err_val_ptr, "");
3033 err_val = gen_load_untyped(g, err_val_ptr, 0, false, "");
30273034 } else {
30283035 err_val = err_union_handle;
30293036 }
......@@ -3042,7 +3049,7 @@ static LLVMValueRef ir_render_unwrap_err_code(CodeGen *g, IrExecutable *executab
30423049
30433050 if (type_has_bits(child_type)) {
30443051 LLVMValueRef err_val_ptr = LLVMBuildStructGEP(g->builder, err_union_handle, err_union_err_index, "");
3045 return LLVMBuildLoad(g->builder, err_val_ptr, "");
3052 return gen_load_untyped(g, err_val_ptr, 0, false, "");
30463053 } else {
30473054 return err_union_handle;
30483055 }
......@@ -3060,7 +3067,7 @@ static LLVMValueRef ir_render_unwrap_err_payload(CodeGen *g, IrExecutable *execu
30603067 LLVMValueRef err_val;
30613068 if (type_has_bits(child_type)) {
30623069 LLVMValueRef err_val_ptr = LLVMBuildStructGEP(g->builder, err_union_handle, err_union_err_index, "");
3063 err_val = LLVMBuildLoad(g->builder, err_val_ptr, "");
3070 err_val = gen_load_untyped(g, err_val_ptr, 0, false, "");
30643071 } else {
30653072 err_val = err_union_handle;
30663073 }
......@@ -3922,6 +3929,7 @@ static void generate_error_name_table(CodeGen *g) {
39223929 LLVMSetLinkage(str_global, LLVMPrivateLinkage);
39233930 LLVMSetGlobalConstant(str_global, true);
39243931 LLVMSetUnnamedAddr(str_global, true);
3932 LLVMSetAlignment(str_global, LLVMABIAlignmentOfType(g->target_data_ref, LLVMTypeOf(str_init)));
39253933
39263934 LLVMValueRef fields[] = {
39273935 LLVMConstBitCast(str_global, u8_ptr_type->type_ref),
......@@ -3938,6 +3946,7 @@ static void generate_error_name_table(CodeGen *g) {
39383946 LLVMSetLinkage(g->err_name_table, LLVMPrivateLinkage);
39393947 LLVMSetGlobalConstant(g->err_name_table, true);
39403948 LLVMSetUnnamedAddr(g->err_name_table, true);
3949 LLVMSetAlignment(g->err_name_table, LLVMABIAlignmentOfType(g->target_data_ref, LLVMTypeOf(err_name_table_init)));
39413950}
39423951
39433952static void generate_enum_name_tables(CodeGen *g) {
......@@ -3960,6 +3969,7 @@ static void generate_enum_name_tables(CodeGen *g) {
39603969 LLVMSetLinkage(str_global, LLVMPrivateLinkage);
39613970 LLVMSetGlobalConstant(str_global, true);
39623971 LLVMSetUnnamedAddr(str_global, true);
3972 LLVMSetAlignment(str_global, LLVMABIAlignmentOfType(g->target_data_ref, LLVMTypeOf(str_init)));
39633973
39643974 LLVMValueRef fields[] = {
39653975 LLVMConstBitCast(str_global, u8_ptr_type->type_ref),
......@@ -3976,6 +3986,7 @@ static void generate_enum_name_tables(CodeGen *g) {
39763986 LLVMSetLinkage(name_table, LLVMPrivateLinkage);
39773987 LLVMSetGlobalConstant(name_table, true);
39783988 LLVMSetUnnamedAddr(name_table, true);
3989 LLVMSetAlignment(name_table, LLVMABIAlignmentOfType(g->target_data_ref, LLVMTypeOf(name_table_init)));
39793990 enum_tag_type->data.enum_tag.name_table = name_table;
39803991 }
39813992}