authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-10-15 01:16:18-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-10-15 01:22:17-04:00
log9c44dd7db3cfbbdaa082c14ed7fbe1273339a2c6
treef3ebb0cb85dce63bb07c867236f04eeee29733b6
parentba405ed59b18871b41aa2fd5288849f725d39531

disable byval parameters on windows to work around llvm bug

See #536

1 files changed, 7 insertions(+), 2 deletions(-)

src/codegen.cpp+7-2
...@@ -2272,7 +2272,9 @@ static LLVMValueRef ir_render_call(CodeGen *g, IrExecutable *executable, IrInstr...@@ -2272,7 +2272,9 @@ static LLVMValueRef ir_render_call(CodeGen *g, IrExecutable *executable, IrInstr
22722272
2273 for (size_t param_i = 0; param_i < fn_type_id->param_count; param_i += 1) {2273 for (size_t param_i = 0; param_i < fn_type_id->param_count; param_i += 1) {
2274 FnGenParamInfo *gen_info = &fn_type->data.fn.gen_param_info[param_i];2274 FnGenParamInfo *gen_info = &fn_type->data.fn.gen_param_info[param_i];
2275 if (gen_info->is_byval) {2275 // Note: byval is disabled on windows due to an LLVM bug:
2276 // https://github.com/zig-lang/zig/issues/536
2277 if (gen_info->is_byval && g->zig_target.os != ZigLLVM_Win32) {
2276 addLLVMCallsiteAttr(result, (unsigned)gen_info->gen_index, "byval");2278 addLLVMCallsiteAttr(result, (unsigned)gen_info->gen_index, "byval");
2277 }2279 }
2278 }2280 }
...@@ -4023,6 +4025,7 @@ static void generate_enum_name_tables(CodeGen *g) {...@@ -4023,6 +4025,7 @@ static void generate_enum_name_tables(CodeGen *g) {
4023 TypeTableEntry *u8_ptr_type = get_pointer_to_type(g, g->builtin_types.entry_u8, true);4025 TypeTableEntry *u8_ptr_type = get_pointer_to_type(g, g->builtin_types.entry_u8, true);
4024 TypeTableEntry *str_type = get_slice_type(g, u8_ptr_type);4026 TypeTableEntry *str_type = get_slice_type(g, u8_ptr_type);
40254027
4028
4026 for (size_t enum_i = 0; enum_i < g->name_table_enums.length; enum_i += 1) {4029 for (size_t enum_i = 0; enum_i < g->name_table_enums.length; enum_i += 1) {
4027 TypeTableEntry *enum_tag_type = g->name_table_enums.at(enum_i);4030 TypeTableEntry *enum_tag_type = g->name_table_enums.at(enum_i);
4028 assert(enum_tag_type->id == TypeTableEntryIdEnumTag);4031 assert(enum_tag_type->id == TypeTableEntryIdEnumTag);
...@@ -4257,7 +4260,9 @@ static void do_code_gen(CodeGen *g) {...@@ -4257,7 +4260,9 @@ static void do_code_gen(CodeGen *g) {
4257 if (param_type->id == TypeTableEntryIdPointer) {4260 if (param_type->id == TypeTableEntryIdPointer) {
4258 addLLVMArgAttr(fn_val, (unsigned)gen_index, "nonnull");4261 addLLVMArgAttr(fn_val, (unsigned)gen_index, "nonnull");
4259 }4262 }
4260 if (is_byval) {4263 // Note: byval is disabled on windows due to an LLVM bug:
4264 // https://github.com/zig-lang/zig/issues/536
4265 if (is_byval && g->zig_target.os != ZigLLVM_Win32) {
4261 addLLVMArgAttr(fn_val, (unsigned)gen_index, "byval");4266 addLLVMArgAttr(fn_val, (unsigned)gen_index, "byval");
4262 }4267 }
4263 }4268 }