authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-10-22 17:52:12-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-10-22 17:52:12-04:00
logf65b1d46804bce716f16465b60c6daa2921e4519
treef22e5fac294a4f5f638f2005948c05fb1846e5b8
parentdc080573d160a444e2e7c1fb88fac27c8060269f
signaturelock-open Commit is signed but in an unrecognized format.

integrate stage1 progress display with semantic analysis


9 files changed, 76 insertions(+), 31 deletions(-)

src-self-hosted/stage1.zig+8
...@@ -517,3 +517,11 @@ export fn stage2_progress_end(node: *std.Progress.Node) void {...@@ -517,3 +517,11 @@ export fn stage2_progress_end(node: *std.Progress.Node) void {
517export fn stage2_progress_complete_one(node: *std.Progress.Node) void {517export fn stage2_progress_complete_one(node: *std.Progress.Node) void {
518 node.completeOne();518 node.completeOne();
519}519}
520
521// ABI warning
522export fn stage2_progress_update_node(node: *std.Progress.Node, done_count: usize, total_count: usize) void {
523 node.completed_items = done_count;
524 node.estimated_total_items = total_count;
525 node.activate();
526 node.context.maybeRefresh();
527}
src/all_types.hpp+2-1
...@@ -2008,7 +2008,8 @@ struct CodeGen {...@@ -2008,7 +2008,8 @@ struct CodeGen {
20082008
2009 ZigFn *largest_frame_fn;2009 ZigFn *largest_frame_fn;
20102010
2011 Stage2ProgressNode *progress_node;2011 Stage2ProgressNode *main_progress_node;
2012 Stage2ProgressNode *sub_progress_node;
20122013
2013 WantPIC want_pic;2014 WantPIC want_pic;
2014 WantStackCheck want_stack_check;2015 WantStackCheck want_stack_check;
src/analyze.cpp+8
...@@ -120,6 +120,12 @@ static ScopeExpr *find_expr_scope(Scope *scope) {...@@ -120,6 +120,12 @@ static ScopeExpr *find_expr_scope(Scope *scope) {
120 }120 }
121}121}
122122
123static void update_progress_display(CodeGen *g) {
124 stage2_progress_update_node(g->sub_progress_node,
125 g->resolve_queue_index + g->fn_defs_index,
126 g->resolve_queue.length + g->fn_defs.length);
127}
128
123ScopeDecls *get_container_scope(ZigType *type_entry) {129ScopeDecls *get_container_scope(ZigType *type_entry) {
124 return *get_container_scope_ptr(type_entry);130 return *get_container_scope_ptr(type_entry);
125}131}
...@@ -3939,6 +3945,7 @@ void resolve_top_level_decl(CodeGen *g, Tld *tld, AstNode *source_node, bool all...@@ -3939,6 +3945,7 @@ void resolve_top_level_decl(CodeGen *g, Tld *tld, AstNode *source_node, bool all
3939 return;3945 return;
39403946
3941 tld->resolution = TldResolutionResolving;3947 tld->resolution = TldResolutionResolving;
3948 update_progress_display(g);
39423949
3943 switch (tld->id) {3950 switch (tld->id) {
3944 case TldIdVar: {3951 case TldIdVar: {
...@@ -4592,6 +4599,7 @@ static void analyze_fn_body(CodeGen *g, ZigFn *fn_table_entry) {...@@ -4592,6 +4599,7 @@ static void analyze_fn_body(CodeGen *g, ZigFn *fn_table_entry) {
4592 return;4599 return;
45934600
4594 fn_table_entry->anal_state = FnAnalStateProbing;4601 fn_table_entry->anal_state = FnAnalStateProbing;
4602 update_progress_display(g);
45954603
4596 AstNode *return_type_node = (fn_table_entry->proto_node != nullptr) ?4604 AstNode *return_type_node = (fn_table_entry->proto_node != nullptr) ?
4597 fn_table_entry->proto_node->data.fn_proto.return_type : fn_table_entry->fndef_scope->base.source_node;4605 fn_table_entry->proto_node->data.fn_proto.return_type : fn_table_entry->fndef_scope->base.source_node;
src/codegen.cpp+37-24
...@@ -7303,8 +7303,12 @@ static void do_code_gen(CodeGen *g) {...@@ -7303,8 +7303,12 @@ static void do_code_gen(CodeGen *g) {
7303 }7303 }
73047304
7305 // Generate function definitions.7305 // Generate function definitions.
7306 stage2_progress_update_node(g->sub_progress_node, 0, g->fn_defs.length);
7306 for (size_t fn_i = 0; fn_i < g->fn_defs.length; fn_i += 1) {7307 for (size_t fn_i = 0; fn_i < g->fn_defs.length; fn_i += 1) {
7307 ZigFn *fn_table_entry = g->fn_defs.at(fn_i);7308 ZigFn *fn_table_entry = g->fn_defs.at(fn_i);
7309 Stage2ProgressNode *fn_prog_node = stage2_progress_start(g->sub_progress_node,
7310 buf_ptr(&fn_table_entry->symbol_name), buf_len(&fn_table_entry->symbol_name), 0);
7311
7308 FnTypeId *fn_type_id = &fn_table_entry->type_entry->data.fn.fn_type_id;7312 FnTypeId *fn_type_id = &fn_table_entry->type_entry->data.fn.fn_type_id;
7309 CallingConvention cc = fn_type_id->cc;7313 CallingConvention cc = fn_type_id->cc;
7310 bool is_c_abi = cc == CallingConventionC;7314 bool is_c_abi = cc == CallingConventionC;
...@@ -7568,6 +7572,7 @@ static void do_code_gen(CodeGen *g) {...@@ -7568,6 +7572,7 @@ static void do_code_gen(CodeGen *g) {
75687572
7569 ir_render(g, fn_table_entry);7573 ir_render(g, fn_table_entry);
75707574
7575 stage2_progress_end(fn_prog_node);
7571 }7576 }
75727577
7573 assert(!g->errors.length);7578 assert(!g->errors.length);
...@@ -7615,7 +7620,7 @@ static void zig_llvm_emit_output(CodeGen *g) {...@@ -7615,7 +7620,7 @@ static void zig_llvm_emit_output(CodeGen *g) {
7615 if (g->bundle_compiler_rt && (g->out_type == OutTypeObj ||7620 if (g->bundle_compiler_rt && (g->out_type == OutTypeObj ||
7616 (g->out_type == OutTypeLib && !g->is_dynamic)))7621 (g->out_type == OutTypeLib && !g->is_dynamic)))
7617 {7622 {
7618 zig_link_add_compiler_rt(g, g->progress_node);7623 zig_link_add_compiler_rt(g, g->sub_progress_node);
7619 }7624 }
7620 break;7625 break;
76217626
...@@ -9458,7 +9463,7 @@ Error create_c_object_cache(CodeGen *g, CacheHash **out_cache_hash, bool verbose...@@ -9458,7 +9463,7 @@ Error create_c_object_cache(CodeGen *g, CacheHash **out_cache_hash, bool verbose
9458}9463}
94599464
9460// returns true if it was a cache miss9465// returns true if it was a cache miss
9461static void gen_c_object(CodeGen *g, Buf *self_exe_path, CFile *c_file, Stage2ProgressNode *parent_prog_node) {9466static void gen_c_object(CodeGen *g, Buf *self_exe_path, CFile *c_file) {
9462 Error err;9467 Error err;
94639468
9464 Buf *artifact_dir;9469 Buf *artifact_dir;
...@@ -9470,7 +9475,7 @@ static void gen_c_object(CodeGen *g, Buf *self_exe_path, CFile *c_file, Stage2Pr...@@ -9470,7 +9475,7 @@ static void gen_c_object(CodeGen *g, Buf *self_exe_path, CFile *c_file, Stage2Pr
9470 Buf *c_source_basename = buf_alloc();9475 Buf *c_source_basename = buf_alloc();
9471 os_path_split(c_source_file, nullptr, c_source_basename);9476 os_path_split(c_source_file, nullptr, c_source_basename);
94729477
9473 Stage2ProgressNode *child_prog_node = stage2_progress_start(parent_prog_node, buf_ptr(c_source_basename),9478 Stage2ProgressNode *child_prog_node = stage2_progress_start(g->sub_progress_node, buf_ptr(c_source_basename),
9474 buf_len(c_source_basename), 0);9479 buf_len(c_source_basename), 0);
94759480
9476 Buf *final_o_basename = buf_alloc();9481 Buf *final_o_basename = buf_alloc();
...@@ -9606,17 +9611,15 @@ static void gen_c_objects(CodeGen *g) {...@@ -9606,17 +9611,15 @@ static void gen_c_objects(CodeGen *g) {
9606 exit(1);9611 exit(1);
9607 }9612 }
96089613
9609 codegen_add_time_event(g, "Compile C Code");9614 codegen_add_time_event(g, "Compile C Objects");
9610 const char *c_prog_name = "compiling C objects";9615 const char *c_prog_name = "Compile C Objects";
9611 Stage2ProgressNode *c_prog_node = stage2_progress_start(g->progress_node, c_prog_name, strlen(c_prog_name),9616 codegen_switch_sub_prog_node(g, stage2_progress_start(g->main_progress_node, c_prog_name, strlen(c_prog_name),
9612 g->c_source_files.length);9617 g->c_source_files.length));
96139618
9614 for (size_t c_file_i = 0; c_file_i < g->c_source_files.length; c_file_i += 1) {9619 for (size_t c_file_i = 0; c_file_i < g->c_source_files.length; c_file_i += 1) {
9615 CFile *c_file = g->c_source_files.at(c_file_i);9620 CFile *c_file = g->c_source_files.at(c_file_i);
9616 gen_c_object(g, self_exe_path, c_file, c_prog_node);9621 gen_c_object(g, self_exe_path, c_file);
9617 }9622 }
9618
9619 stage2_progress_end(c_prog_node);
9620}9623}
96219624
9622void codegen_add_object(CodeGen *g, Buf *object_path) {9625void codegen_add_object(CodeGen *g, Buf *object_path) {
...@@ -10337,9 +10340,8 @@ void codegen_build_and_link(CodeGen *g) {...@@ -10337,9 +10340,8 @@ void codegen_build_and_link(CodeGen *g) {
1033710340
10338 codegen_add_time_event(g, "Semantic Analysis");10341 codegen_add_time_event(g, "Semantic Analysis");
10339 const char *progress_name = "Semantic Analysis";10342 const char *progress_name = "Semantic Analysis";
10340 Stage2ProgressNode *child_progress_node = stage2_progress_start(g->progress_node,10343 codegen_switch_sub_prog_node(g, stage2_progress_start(g->main_progress_node,
10341 progress_name, strlen(progress_name), 0);10344 progress_name, strlen(progress_name), 0));
10342 (void)child_progress_node;
1034310345
10344 gen_root_source(g);10346 gen_root_source(g);
1034510347
...@@ -10365,18 +10367,16 @@ void codegen_build_and_link(CodeGen *g) {...@@ -10365,18 +10367,16 @@ void codegen_build_and_link(CodeGen *g) {
10365 codegen_add_time_event(g, "Code Generation");10367 codegen_add_time_event(g, "Code Generation");
10366 {10368 {
10367 const char *progress_name = "Code Generation";10369 const char *progress_name = "Code Generation";
10368 Stage2ProgressNode *child_progress_node = stage2_progress_start(g->progress_node,10370 codegen_switch_sub_prog_node(g, stage2_progress_start(g->main_progress_node,
10369 progress_name, strlen(progress_name), 0);10371 progress_name, strlen(progress_name), 0));
10370 (void)child_progress_node;
10371 }10372 }
1037210373
10373 do_code_gen(g);10374 do_code_gen(g);
10374 codegen_add_time_event(g, "LLVM Emit Output");10375 codegen_add_time_event(g, "LLVM Emit Output");
10375 {10376 {
10376 const char *progress_name = "LLVM Emit Output";10377 const char *progress_name = "LLVM Emit Output";
10377 Stage2ProgressNode *child_progress_node = stage2_progress_start(g->progress_node,10378 codegen_switch_sub_prog_node(g, stage2_progress_start(g->main_progress_node,
10378 progress_name, strlen(progress_name), 0);10379 progress_name, strlen(progress_name), 0));
10379 (void)child_progress_node;
10380 }10380 }
10381 zig_llvm_emit_output(g);10381 zig_llvm_emit_output(g);
1038210382
...@@ -10384,9 +10384,8 @@ void codegen_build_and_link(CodeGen *g) {...@@ -10384,9 +10384,8 @@ void codegen_build_and_link(CodeGen *g) {
10384 codegen_add_time_event(g, "Generate .h");10384 codegen_add_time_event(g, "Generate .h");
10385 {10385 {
10386 const char *progress_name = "Generate .h";10386 const char *progress_name = "Generate .h";
10387 Stage2ProgressNode *child_progress_node = stage2_progress_start(g->progress_node,10387 codegen_switch_sub_prog_node(g, stage2_progress_start(g->main_progress_node,
10388 progress_name, strlen(progress_name), 0);10388 progress_name, strlen(progress_name), 0));
10389 (void)child_progress_node;
10390 }10389 }
10391 gen_h_file(g);10390 gen_h_file(g);
10392 }10391 }
...@@ -10458,6 +10457,7 @@ void codegen_build_and_link(CodeGen *g) {...@@ -10458,6 +10457,7 @@ void codegen_build_and_link(CodeGen *g) {
1045810457
10459 codegen_release_caches(g);10458 codegen_release_caches(g);
10460 codegen_add_time_event(g, "Done");10459 codegen_add_time_event(g, "Done");
10460 codegen_switch_sub_prog_node(g, nullptr);
10461}10461}
1046210462
10463void codegen_release_caches(CodeGen *g) {10463void codegen_release_caches(CodeGen *g) {
...@@ -10487,7 +10487,7 @@ CodeGen *create_child_codegen(CodeGen *parent_gen, Buf *root_src_path, OutType o...@@ -10487,7 +10487,7 @@ CodeGen *create_child_codegen(CodeGen *parent_gen, Buf *root_src_path, OutType o
10487 ZigLibCInstallation *libc, const char *name, Stage2ProgressNode *parent_progress_node)10487 ZigLibCInstallation *libc, const char *name, Stage2ProgressNode *parent_progress_node)
10488{10488{
10489 Stage2ProgressNode *child_progress_node = stage2_progress_start(10489 Stage2ProgressNode *child_progress_node = stage2_progress_start(
10490 parent_progress_node ? parent_progress_node : parent_gen->progress_node,10490 parent_progress_node ? parent_progress_node : parent_gen->sub_progress_node,
10491 name, strlen(name), 0);10491 name, strlen(name), 0);
1049210492
10493 CodeGen *child_gen = codegen_create(nullptr, root_src_path, parent_gen->zig_target, out_type,10493 CodeGen *child_gen = codegen_create(nullptr, root_src_path, parent_gen->zig_target, out_type,
...@@ -10524,9 +10524,14 @@ CodeGen *codegen_create(Buf *main_pkg_path, Buf *root_src_path, const ZigTarget...@@ -10524,9 +10524,14 @@ CodeGen *codegen_create(Buf *main_pkg_path, Buf *root_src_path, const ZigTarget
10524 ZigLibCInstallation *libc, Buf *cache_dir, bool is_test_build, Stage2ProgressNode *progress_node)10524 ZigLibCInstallation *libc, Buf *cache_dir, bool is_test_build, Stage2ProgressNode *progress_node)
10525{10525{
10526 CodeGen *g = allocate<CodeGen>(1);10526 CodeGen *g = allocate<CodeGen>(1);
10527 g->progress_node = progress_node;10527 g->main_progress_node = progress_node;
1052810528
10529 codegen_add_time_event(g, "Initialize");10529 codegen_add_time_event(g, "Initialize");
10530 {
10531 const char *progress_name = "Initialize";
10532 codegen_switch_sub_prog_node(g, stage2_progress_start(g->main_progress_node,
10533 progress_name, strlen(progress_name), 0));
10534 }
1053010535
10531 g->subsystem = TargetSubsystemAuto;10536 g->subsystem = TargetSubsystemAuto;
10532 g->libc = libc;10537 g->libc = libc;
...@@ -10651,3 +10656,11 @@ bool codegen_fn_has_err_ret_tracing_stack(CodeGen *g, ZigFn *fn, bool is_async)...@@ -10651,3 +10656,11 @@ bool codegen_fn_has_err_ret_tracing_stack(CodeGen *g, ZigFn *fn, bool is_async)
10651 !codegen_fn_has_err_ret_tracing_arg(g, fn->type_entry->data.fn.fn_type_id.return_type);10656 !codegen_fn_has_err_ret_tracing_arg(g, fn->type_entry->data.fn.fn_type_id.return_type);
10652 }10657 }
10653}10658}
10659
10660void codegen_switch_sub_prog_node(CodeGen *g, Stage2ProgressNode *node) {
10661 if (g->sub_progress_node != nullptr) {
10662 stage2_progress_end(g->sub_progress_node);
10663 }
10664 g->sub_progress_node = node;
10665}
10666
src/codegen.hpp+2
...@@ -67,4 +67,6 @@ bool codegen_fn_has_err_ret_tracing_stack(CodeGen *g, ZigFn *fn, bool is_async);...@@ -67,4 +67,6 @@ bool codegen_fn_has_err_ret_tracing_stack(CodeGen *g, ZigFn *fn, bool is_async);
67ATTRIBUTE_NORETURN67ATTRIBUTE_NORETURN
68void codegen_report_errors_and_exit(CodeGen *g);68void codegen_report_errors_and_exit(CodeGen *g);
6969
70void codegen_switch_sub_prog_node(CodeGen *g, Stage2ProgressNode *node);
71
70#endif72#endif
src/link.cpp+11-6
...@@ -2630,8 +2630,9 @@ void codegen_link(CodeGen *g) {...@@ -2630,8 +2630,9 @@ void codegen_link(CodeGen *g) {
26302630
2631 {2631 {
2632 const char *progress_name = "Build Dependencies";2632 const char *progress_name = "Build Dependencies";
2633 lj.build_dep_prog_node = stage2_progress_start(g->progress_node,2633 codegen_switch_sub_prog_node(g, stage2_progress_start(g->main_progress_node,
2634 progress_name, strlen(progress_name), 0);2634 progress_name, strlen(progress_name), 0));
2635 lj.build_dep_prog_node = g->sub_progress_node;
2635 }2636 }
26362637
26372638
...@@ -2661,10 +2662,9 @@ void codegen_link(CodeGen *g) {...@@ -2661,10 +2662,9 @@ void codegen_link(CodeGen *g) {
2661 ZigLLVM_OSType os_type = get_llvm_os_type(g->zig_target->os);2662 ZigLLVM_OSType os_type = get_llvm_os_type(g->zig_target->os);
2662 codegen_add_time_event(g, "LLVM Link");2663 codegen_add_time_event(g, "LLVM Link");
2663 {2664 {
2664 const char *progress_name = "linking";2665 const char *progress_name = "Link";
2665 Stage2ProgressNode *child_progress_node = stage2_progress_start(g->progress_node,2666 codegen_switch_sub_prog_node(g, stage2_progress_start(g->main_progress_node,
2666 progress_name, strlen(progress_name), 0);2667 progress_name, strlen(progress_name), 0));
2667 (void)child_progress_node;
2668 }2668 }
2669 if (g->verbose_link) {2669 if (g->verbose_link) {
2670 fprintf(stderr, "ar rcs %s", buf_ptr(&g->output_file_path));2670 fprintf(stderr, "ar rcs %s", buf_ptr(&g->output_file_path));
...@@ -2696,6 +2696,11 @@ void codegen_link(CodeGen *g) {...@@ -2696,6 +2696,11 @@ void codegen_link(CodeGen *g) {
2696 Buf diag = BUF_INIT;2696 Buf diag = BUF_INIT;
26972697
2698 codegen_add_time_event(g, "LLVM Link");2698 codegen_add_time_event(g, "LLVM Link");
2699 {
2700 const char *progress_name = "Link";
2701 codegen_switch_sub_prog_node(g, stage2_progress_start(g->main_progress_node,
2702 progress_name, strlen(progress_name), 0));
2703 }
2699 if (g->system_linker_hack && g->zig_target->os == OsMacOSX) {2704 if (g->system_linker_hack && g->zig_target->os == OsMacOSX) {
2700 Termination term;2705 Termination term;
2701 ZigList<const char *> args = {};2706 ZigList<const char *> args = {};
src/main.cpp+4
...@@ -1333,6 +1333,10 @@ int main(int argc, char **argv) {...@@ -1333,6 +1333,10 @@ int main(int argc, char **argv) {
13331333
1334 g->enable_cache = get_cache_opt(enable_cache, output_dir == nullptr);1334 g->enable_cache = get_cache_opt(enable_cache, output_dir == nullptr);
1335 codegen_build_and_link(g);1335 codegen_build_and_link(g);
1336 if (root_progress_node != nullptr) {
1337 stage2_progress_end(root_progress_node);
1338 root_progress_node = nullptr;
1339 }
13361340
1337 if (timing_info) {1341 if (timing_info) {
1338 codegen_print_timing_report(g, stdout);1342 codegen_print_timing_report(g, stdout);
src/userland.cpp+1
...@@ -88,3 +88,4 @@ Stage2ProgressNode *stage2_progress_start(Stage2ProgressNode *node,...@@ -88,3 +88,4 @@ Stage2ProgressNode *stage2_progress_start(Stage2ProgressNode *node,
88void stage2_progress_end(Stage2ProgressNode *node) {}88void stage2_progress_end(Stage2ProgressNode *node) {}
89void stage2_progress_complete_one(Stage2ProgressNode *node) {}89void stage2_progress_complete_one(Stage2ProgressNode *node) {}
90void stage2_progress_disable_tty(Stage2Progress *progress) {}90void stage2_progress_disable_tty(Stage2Progress *progress) {}
91void stage2_progress_update_node(Stage2ProgressNode *node, size_t completed_count, size_t estimated_total_items){}
src/userland.h+3
...@@ -176,5 +176,8 @@ ZIG_EXTERN_C Stage2ProgressNode *stage2_progress_start(Stage2ProgressNode *node,...@@ -176,5 +176,8 @@ ZIG_EXTERN_C Stage2ProgressNode *stage2_progress_start(Stage2ProgressNode *node,
176ZIG_EXTERN_C void stage2_progress_end(Stage2ProgressNode *node);176ZIG_EXTERN_C void stage2_progress_end(Stage2ProgressNode *node);
177// ABI warning177// ABI warning
178ZIG_EXTERN_C void stage2_progress_complete_one(Stage2ProgressNode *node);178ZIG_EXTERN_C void stage2_progress_complete_one(Stage2ProgressNode *node);
179// ABI warning
180ZIG_EXTERN_C void stage2_progress_update_node(Stage2ProgressNode *node,
181 size_t completed_count, size_t estimated_total_items);
179182
180#endif183#endif