authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-09-02 21:22:35-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-09-02 21:31:26-04:00
logd74b8567cf6a81550831a9ea02f2cebcb4db9846
treea6c8a7552c19d479cb6141d50550997a2f1a44b3
parent00d82e34df92c181d20064c0c2f80feaba9dab03
signaturelock-open Commit is signed but in an unrecognized format.

omit prefix data for async functions sometimes

When `@frameSize` is never called, and `@asyncCall` on a runtime-known pointer is never used, no prefix data for async functions is needed. Related: #3160

3 files changed, 8 insertions(+), 1 deletions(-)

src/all_types.hpp+1
......@@ -1989,6 +1989,7 @@ struct CodeGen {
19891989 bool system_linker_hack;
19901990 bool reported_bad_link_libc_error;
19911991 bool is_dynamic; // shared library rather than static library. dynamic musl rather than static musl.
1992 bool need_frame_size_prefix_data;
19921993
19931994 //////////////////////////// Participates in Input Parameter Cache Hash
19941995 /////// Note: there is a separate cache hash for builtin.zig, when adding fields,
src/codegen.cpp+4-1
......@@ -3775,6 +3775,7 @@ static void render_async_var_decls(CodeGen *g, Scope *scope) {
37753775}
37763776
37773777static LLVMValueRef gen_frame_size(CodeGen *g, LLVMValueRef fn_val) {
3778 assert(g->need_frame_size_prefix_data);
37783779 LLVMTypeRef usize_llvm_type = g->builtin_types.entry_usize->llvm_type;
37793780 LLVMTypeRef ptr_usize_llvm_type = LLVMPointerType(usize_llvm_type, 0);
37803781 LLVMValueRef casted_fn_val = LLVMBuildBitCast(g->builder, fn_val, ptr_usize_llvm_type, "");
......@@ -7208,7 +7209,9 @@ static void do_code_gen(CodeGen *g) {
72087209
72097210 LLVMTypeRef usize_type_ref = g->builtin_types.entry_usize->llvm_type;
72107211 LLVMValueRef size_val = LLVMConstInt(usize_type_ref, fn_table_entry->frame_type->abi_size, false);
7211 ZigLLVMFunctionSetPrefixData(fn_table_entry->llvm_value, size_val);
7212 if (g->need_frame_size_prefix_data) {
7213 ZigLLVMFunctionSetPrefixData(fn_table_entry->llvm_value, size_val);
7214 }
72127215
72137216 if (!g->strip_debug_symbols) {
72147217 AstNode *source_node = fn_table_entry->proto_node;
src/ir.cpp+3
......@@ -15671,6 +15671,7 @@ static IrInstruction *analyze_casted_new_stack(IrAnalyze *ira, IrInstructionCall
1567115671 ZigType *u8_ptr = get_pointer_to_type_extra(ira->codegen, ira->codegen->builtin_types.entry_u8,
1567215672 false, false, PtrLenUnknown, target_fn_align(ira->codegen->zig_target), 0, 0, false);
1567315673 ZigType *u8_slice = get_slice_type(ira->codegen, u8_ptr);
15674 ira->codegen->need_frame_size_prefix_data = true;
1567415675 return ir_implicit_cast(ira, new_stack, u8_slice);
1567515676 }
1567615677}
......@@ -22533,6 +22534,8 @@ static IrInstruction *ir_analyze_instruction_frame_size(IrAnalyze *ira, IrInstru
2253322534 return ira->codegen->invalid_instruction;
2253422535 }
2253522536
22537 ira->codegen->need_frame_size_prefix_data = true;
22538
2253622539 IrInstruction *result = ir_build_frame_size_gen(&ira->new_irb, instruction->base.scope,
2253722540 instruction->base.source_node, fn);
2253822541 result->value.type = ira->codegen->builtin_types.entry_usize;