| ... | ... | @@ -232,9 +232,6 @@ const Job = union(enum) { |
| 232 | 232 | /// one of WASI libc static objects |
| 233 | 233 | wasi_libc_crt_file: wasi_libc.CRTFile, |
| 234 | 234 | |
| 235 | | /// Use stage1 C++ code to compile zig code into an object file. |
| 236 | | stage1_module: void, |
| 237 | | |
| 238 | 235 | /// The value is the index into `link.File.Options.system_libs`. |
| 239 | 236 | windows_import_lib: usize, |
| 240 | 237 | }; |
| ... | ... | @@ -1831,10 +1828,6 @@ pub fn create(gpa: Allocator, options: InitOptions) !*Compilation { |
| 1831 | 1828 | } |
| 1832 | 1829 | } |
| 1833 | 1830 | |
| 1834 | | if (comp.bin_file.options.use_stage1 and comp.bin_file.options.module != null) { |
| 1835 | | try comp.work_queue.writeItem(.{ .stage1_module = {} }); |
| 1836 | | } |
| 1837 | | |
| 1838 | 1831 | return comp; |
| 1839 | 1832 | } |
| 1840 | 1833 | |
| ... | ... | @@ -2597,13 +2590,13 @@ pub fn getCompileLogOutput(self: *Compilation) []const u8 { |
| 2597 | 2590 | return module.compile_log_text.items; |
| 2598 | 2591 | } |
| 2599 | 2592 | |
| 2600 | | pub fn performAllTheWork(self: *Compilation) error{ TimerUnsupported, OutOfMemory }!void { |
| 2593 | pub fn performAllTheWork(comp: *Compilation) error{ TimerUnsupported, OutOfMemory }!void { |
| 2601 | 2594 | // If the terminal is dumb, we dont want to show the user all the |
| 2602 | 2595 | // output. |
| 2603 | 2596 | var progress: std.Progress = .{ .dont_print_on_dumb = true }; |
| 2604 | 2597 | var main_progress_node = progress.start("", 0); |
| 2605 | 2598 | defer main_progress_node.end(); |
| 2606 | | if (self.color == .off) progress.terminal = null; |
| 2599 | if (comp.color == .off) progress.terminal = null; |
| 2607 | 2600 | |
| 2608 | 2601 | // Here we queue up all the AstGen tasks first, followed by C object compilation. |
| 2609 | 2602 | // We wait until the AstGen tasks are all completed before proceeding to the |
| ... | ... | @@ -2613,93 +2606,105 @@ pub fn performAllTheWork(self: *Compilation) error{ TimerUnsupported, OutOfMemor |
| 2613 | 2606 | var zir_prog_node = main_progress_node.start("AST Lowering", 0); |
| 2614 | 2607 | defer zir_prog_node.end(); |
| 2615 | 2608 | |
| 2616 | | var c_obj_prog_node = main_progress_node.start("Compile C Objects", self.c_source_files.len); |
| 2609 | var c_obj_prog_node = main_progress_node.start("Compile C Objects", comp.c_source_files.len); |
| 2617 | 2610 | defer c_obj_prog_node.end(); |
| 2618 | 2611 | |
| 2619 | | var embed_file_prog_node = main_progress_node.start("Detect @embedFile updates", self.embed_file_work_queue.count); |
| 2612 | var embed_file_prog_node = main_progress_node.start("Detect @embedFile updates", comp.embed_file_work_queue.count); |
| 2620 | 2613 | defer embed_file_prog_node.end(); |
| 2621 | 2614 | |
| 2622 | | self.work_queue_wait_group.reset(); |
| 2623 | | defer self.work_queue_wait_group.wait(); |
| 2615 | comp.work_queue_wait_group.reset(); |
| 2616 | defer comp.work_queue_wait_group.wait(); |
| 2624 | 2617 | |
| 2625 | 2618 | { |
| 2626 | 2619 | const astgen_frame = tracy.namedFrame("astgen"); |
| 2627 | 2620 | defer astgen_frame.end(); |
| 2628 | 2621 | |
| 2629 | | self.astgen_wait_group.reset(); |
| 2630 | | defer self.astgen_wait_group.wait(); |
| 2622 | comp.astgen_wait_group.reset(); |
| 2623 | defer comp.astgen_wait_group.wait(); |
| 2631 | 2624 | |
| 2632 | 2625 | // builtin.zig is handled specially for two reasons: |
| 2633 | 2626 | // 1. to avoid race condition of zig processes truncating each other's builtin.zig files |
| 2634 | 2627 | // 2. optimization; in the hot path it only incurs a stat() syscall, which happens |
| 2635 | 2628 | // in the `astgen_wait_group`. |
| 2636 | | if (self.bin_file.options.module) |mod| { |
| 2629 | if (comp.bin_file.options.module) |mod| { |
| 2637 | 2630 | if (mod.job_queued_update_builtin_zig) { |
| 2638 | 2631 | mod.job_queued_update_builtin_zig = false; |
| 2639 | 2632 | |
| 2640 | | self.astgen_wait_group.start(); |
| 2641 | | try self.thread_pool.spawn(workerUpdateBuiltinZigFile, .{ |
| 2642 | | self, mod, &self.astgen_wait_group, |
| 2633 | comp.astgen_wait_group.start(); |
| 2634 | try comp.thread_pool.spawn(workerUpdateBuiltinZigFile, .{ |
| 2635 | comp, mod, &comp.astgen_wait_group, |
| 2643 | 2636 | }); |
| 2644 | 2637 | } |
| 2645 | 2638 | } |
| 2646 | 2639 | |
| 2647 | | while (self.astgen_work_queue.readItem()) |file| { |
| 2648 | | self.astgen_wait_group.start(); |
| 2649 | | try self.thread_pool.spawn(workerAstGenFile, .{ |
| 2650 | | self, file, &zir_prog_node, &self.astgen_wait_group, .root, |
| 2640 | while (comp.astgen_work_queue.readItem()) |file| { |
| 2641 | comp.astgen_wait_group.start(); |
| 2642 | try comp.thread_pool.spawn(workerAstGenFile, .{ |
| 2643 | comp, file, &zir_prog_node, &comp.astgen_wait_group, .root, |
| 2651 | 2644 | }); |
| 2652 | 2645 | } |
| 2653 | 2646 | |
| 2654 | | while (self.embed_file_work_queue.readItem()) |embed_file| { |
| 2655 | | self.astgen_wait_group.start(); |
| 2656 | | try self.thread_pool.spawn(workerCheckEmbedFile, .{ |
| 2657 | | self, embed_file, &embed_file_prog_node, &self.astgen_wait_group, |
| 2647 | while (comp.embed_file_work_queue.readItem()) |embed_file| { |
| 2648 | comp.astgen_wait_group.start(); |
| 2649 | try comp.thread_pool.spawn(workerCheckEmbedFile, .{ |
| 2650 | comp, embed_file, &embed_file_prog_node, &comp.astgen_wait_group, |
| 2658 | 2651 | }); |
| 2659 | 2652 | } |
| 2660 | 2653 | |
| 2661 | | while (self.c_object_work_queue.readItem()) |c_object| { |
| 2662 | | self.work_queue_wait_group.start(); |
| 2663 | | try self.thread_pool.spawn(workerUpdateCObject, .{ |
| 2664 | | self, c_object, &c_obj_prog_node, &self.work_queue_wait_group, |
| 2654 | while (comp.c_object_work_queue.readItem()) |c_object| { |
| 2655 | comp.work_queue_wait_group.start(); |
| 2656 | try comp.thread_pool.spawn(workerUpdateCObject, .{ |
| 2657 | comp, c_object, &c_obj_prog_node, &comp.work_queue_wait_group, |
| 2665 | 2658 | }); |
| 2666 | 2659 | } |
| 2667 | 2660 | } |
| 2668 | 2661 | |
| 2669 | | const use_stage1 = build_options.is_stage1 and self.bin_file.options.use_stage1; |
| 2662 | const use_stage1 = build_options.is_stage1 and comp.bin_file.options.use_stage1; |
| 2670 | 2663 | if (!use_stage1) { |
| 2671 | 2664 | const outdated_and_deleted_decls_frame = tracy.namedFrame("outdated_and_deleted_decls"); |
| 2672 | 2665 | defer outdated_and_deleted_decls_frame.end(); |
| 2673 | 2666 | |
| 2674 | 2667 | // Iterate over all the files and look for outdated and deleted declarations. |
| 2675 | | if (self.bin_file.options.module) |mod| { |
| 2668 | if (comp.bin_file.options.module) |mod| { |
| 2676 | 2669 | try mod.processOutdatedAndDeletedDecls(); |
| 2677 | 2670 | } |
| 2678 | | } else if (self.bin_file.options.module) |mod| { |
| 2671 | } else if (comp.bin_file.options.module) |mod| { |
| 2679 | 2672 | // If there are any AstGen compile errors, report them now to avoid |
| 2680 | 2673 | // hitting stage1 bugs. |
| 2681 | 2674 | if (mod.failed_files.count() != 0) { |
| 2682 | 2675 | return; |
| 2683 | 2676 | } |
| 2677 | comp.updateStage1Module(main_progress_node) catch |err| { |
| 2678 | fatal("unable to build stage1 zig object: {s}", .{@errorName(err)}); |
| 2679 | }; |
| 2680 | } |
| 2681 | |
| 2682 | if (comp.bin_file.options.module) |mod| { |
| 2683 | mod.sema_prog_node = main_progress_node.start("Semantic Analysis", 0); |
| 2684 | mod.sema_prog_node.activate(); |
| 2684 | 2685 | } |
| 2686 | defer if (comp.bin_file.options.module) |mod| { |
| 2687 | mod.sema_prog_node.end(); |
| 2688 | mod.sema_prog_node = undefined; |
| 2689 | }; |
| 2685 | 2690 | |
| 2686 | 2691 | // In this main loop we give priority to non-anonymous Decls in the work queue, so |
| 2687 | 2692 | // that they can establish references to anonymous Decls, setting alive=true in the |
| 2688 | 2693 | // backend, preventing anonymous Decls from being prematurely destroyed. |
| 2689 | 2694 | while (true) { |
| 2690 | | if (self.work_queue.readItem()) |work_item| { |
| 2691 | | try processOneJob(self, work_item, main_progress_node); |
| 2695 | if (comp.work_queue.readItem()) |work_item| { |
| 2696 | try processOneJob(comp, work_item); |
| 2692 | 2697 | continue; |
| 2693 | 2698 | } |
| 2694 | | if (self.anon_work_queue.readItem()) |work_item| { |
| 2695 | | try processOneJob(self, work_item, main_progress_node); |
| 2699 | if (comp.anon_work_queue.readItem()) |work_item| { |
| 2700 | try processOneJob(comp, work_item); |
| 2696 | 2701 | continue; |
| 2697 | 2702 | } |
| 2698 | 2703 | break; |
| 2699 | 2704 | } |
| 2700 | 2705 | } |
| 2701 | 2706 | |
| 2702 | | fn processOneJob(comp: *Compilation, job: Job, main_progress_node: *std.Progress.Node) !void { |
| 2707 | fn processOneJob(comp: *Compilation, job: Job) !void { |
| 2703 | 2708 | switch (job) { |
| 2704 | 2709 | .codegen_decl => |decl| switch (decl.analysis) { |
| 2705 | 2710 | .unreferenced => unreachable, |
| ... | ... | @@ -2807,9 +2812,6 @@ fn processOneJob(comp: *Compilation, job: Job, main_progress_node: *std.Progress |
| 2807 | 2812 | if (build_options.omit_stage2) |
| 2808 | 2813 | @panic("sadly stage2 is omitted from this build to save memory on the CI server"); |
| 2809 | 2814 | |
| 2810 | | const named_frame = tracy.namedFrame("analyze_decl"); |
| 2811 | | defer named_frame.end(); |
| 2812 | | |
| 2813 | 2815 | const module = comp.bin_file.options.module.?; |
| 2814 | 2816 | module.ensureDeclAnalyzed(decl) catch |err| switch (err) { |
| 2815 | 2817 | error.OutOfMemory => return error.OutOfMemory, |
| ... | ... | @@ -3074,17 +3076,6 @@ fn processOneJob(comp: *Compilation, job: Job, main_progress_node: *std.Progress |
| 3074 | 3076 | ), |
| 3075 | 3077 | }; |
| 3076 | 3078 | }, |
| 3077 | | .stage1_module => { |
| 3078 | | const named_frame = tracy.namedFrame("stage1_module"); |
| 3079 | | defer named_frame.end(); |
| 3080 | | |
| 3081 | | if (!build_options.is_stage1) |
| 3082 | | unreachable; |
| 3083 | | |
| 3084 | | comp.updateStage1Module(main_progress_node) catch |err| { |
| 3085 | | fatal("unable to build stage1 zig object: {s}", .{@errorName(err)}); |
| 3086 | | }; |
| 3087 | | }, |
| 3088 | 3079 | } |
| 3089 | 3080 | } |
| 3090 | 3081 | |