authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-06-16 19:14:14-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-06-16 19:37:00-04:00
log472b7ef7e6db4bdd4717ff5b44b63e233853bb06
tree998af068ac387e7457b294786146f8098f80c841
parente311cd562b47529bdcd2423658915539ddb6bc36

disable byval


3 files changed, 28 insertions(+), 21 deletions(-)

src/codegen.cpp-21
......@@ -326,13 +326,6 @@ static void addLLVMArgAttr(LLVMValueRef arg_val, unsigned param_index, const cha
326326 return addLLVMAttr(arg_val, param_index + 1, attr_name);
327327}
328328
329static void addLLVMCallsiteAttr(LLVMValueRef call_instr, unsigned param_index, const char *attr_name) {
330 unsigned kind_id = LLVMGetEnumAttributeKindForName(attr_name, strlen(attr_name));
331 assert(kind_id != 0);
332 LLVMAttributeRef llvm_attr = LLVMCreateEnumAttribute(LLVMGetGlobalContext(), kind_id, 0);
333 LLVMAddCallSiteAttribute(call_instr, param_index + 1, llvm_attr);
334}
335
336329static bool is_symbol_available(CodeGen *g, Buf *name) {
337330 return g->exported_symbol_names.maybe_get(name) == nullptr && g->external_prototypes.maybe_get(name) == nullptr;
338331}
......@@ -581,11 +574,6 @@ static LLVMValueRef fn_llvm_value(CodeGen *g, FnTableEntry *fn_table_entry) {
581574 if (param_type->id == TypeTableEntryIdPointer) {
582575 addLLVMArgAttr(fn_table_entry->llvm_value, (unsigned)gen_index, "nonnull");
583576 }
584 // Note: byval is disabled on windows due to an LLVM bug:
585 // https://github.com/ziglang/zig/issues/536
586 if (is_byval && g->zig_target.os != OsWindows) {
587 addLLVMArgAttr(fn_table_entry->llvm_value, (unsigned)gen_index, "byval");
588 }
589577 }
590578
591579 uint32_t err_ret_trace_arg_index = get_err_ret_trace_arg_index(g, fn_table_entry);
......@@ -3114,15 +3102,6 @@ static LLVMValueRef ir_render_call(CodeGen *g, IrExecutable *executable, IrInstr
31143102 }
31153103
31163104
3117 for (size_t param_i = 0; param_i < fn_type_id->param_count; param_i += 1) {
3118 FnGenParamInfo *gen_info = &fn_type->data.fn.gen_param_info[param_i];
3119 // Note: byval is disabled on windows due to an LLVM bug:
3120 // https://github.com/ziglang/zig/issues/536
3121 if (gen_info->is_byval && g->zig_target.os != OsWindows) {
3122 addLLVMCallsiteAttr(result, (unsigned)gen_info->gen_index, "byval");
3123 }
3124 }
3125
31263105 if (instruction->is_async) {
31273106 LLVMValueRef payload_ptr = LLVMBuildStructGEP(g->builder, instruction->tmp_ptr, err_union_payload_index, "");
31283107 LLVMBuildStore(g->builder, result, payload_ptr);
test/behavior.zig+1
......@@ -13,6 +13,7 @@ comptime {
1313 _ = @import("cases/bugs/656.zig");
1414 _ = @import("cases/bugs/828.zig");
1515 _ = @import("cases/bugs/920.zig");
16 _ = @import("cases/byval_arg_var.zig");
1617 _ = @import("cases/cast.zig");
1718 _ = @import("cases/const_slice_child.zig");
1819 _ = @import("cases/coroutines.zig");
test/cases/byval_arg_var.zig created+27
......@@ -0,0 +1,27 @@
1const std = @import("std");
2
3var result: []const u8 = "wrong";
4
5test "aoeu" {
6 start();
7 blowUpStack(10);
8
9 std.debug.assert(std.mem.eql(u8, result, "string literal"));
10}
11
12fn start() void {
13 foo("string literal");
14}
15
16fn foo(x: var) void {
17 bar(x);
18}
19
20fn bar(x: var) void {
21 result = x;
22}
23
24fn blowUpStack(x: u32) void {
25 if (x == 0) return;
26 blowUpStack(x - 1);
27}