diff --git a/src/build_settings.cpp b/src/build_settings.cpp index ef582b4ed..f6ebd5755 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -598,6 +598,7 @@ struct BuildContext { bool internal_weak_monomorphization; bool internal_ignore_llvm_verification; bool internal_llvm_no_sroa; + bool internal_global_entity_graph; bool enable_rvo; diff --git a/src/check_decl.cpp b/src/check_decl.cpp index 63bf99b48..6280fc63b 100644 --- a/src/check_decl.cpp +++ b/src/check_decl.cpp @@ -2137,6 +2137,7 @@ gb_internal void check_entity_decl(CheckerContext *ctx, Entity *e, DeclInfo *d, if (e->state == EntityState_Resolved) { return; } + GlobalEntityTimingFrame timing_frame = global_entity_timing_begin(e); if (e->flags & EntityFlag_Lazy) { mutex_lock(&ctx->info->lazy_mutex); } @@ -2222,6 +2223,7 @@ gb_internal void check_entity_decl(CheckerContext *ctx, Entity *e, DeclInfo *d, } end:; + global_entity_timing_end(timing_frame, e); // NOTE(bill): Add it to the list of checked entities if (e->flags & EntityFlag_Lazy) { array_add(&ctx->info->entities, e); diff --git a/src/check_expr.cpp b/src/check_expr.cpp index a12b184eb..5f7523134 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -13112,6 +13112,8 @@ gb_internal ExprKind check_expr_base(CheckerContext *c, Operand *o, Ast *node, T Type *elem_type = core_broadcastable_elem_type(type_hint); if (is_type_untyped(o->type)) { if (is_type_union(elem_type)) { + // NOTE: record it first so convert_to_typed's final update keeps a constant that becomes a value (e.g. broadcast to an array variant) + add_untyped(c, node, o->mode, o->type, o->value); convert_to_typed(c, o, elem_type); } } diff --git a/src/checker.cpp b/src/checker.cpp index 6273a8f7e..3cb10f95b 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -4599,6 +4599,7 @@ gb_internal DECL_ATTRIBUTE_PROC(asm_decl_attribute) { return false; } +#include "checker_global_graph.cpp" #include "check_expr.cpp" #include "check_builtin.cpp" #include "check_type.cpp" @@ -5384,6 +5385,7 @@ gb_internal void check_all_global_entities(Checker *c) { continue; } DeclInfo *d = e->decl_info; + GlobalEntityTimingFrame timing_frame = global_entity_timing_begin(e); check_single_global_entity(c, e, d); if (e->type != nullptr && is_type_typed(e->type)) { for (Type *t = nullptr; mpsc_dequeue(&c->soa_types_to_complete, &t); /**/) { @@ -5393,6 +5395,7 @@ gb_internal void check_all_global_entities(Checker *c) { (void)type_size_of(e->type); (void)type_align_of(e->type); } + global_entity_timing_end(timing_frame, e); } in_single_threaded_checker_stage.store(false, std::memory_order_relaxed); @@ -6279,6 +6282,7 @@ gb_internal void check_import_entities(Checker *c) { defer (map_destroy(&untyped)); isize min_pkg_index = 0; + u64 stage_start = global_import_stage_begin(); for (isize pkg_index = 0; pkg_index < package_order.count; pkg_index++) { ImportGraphNode *node = package_order[pkg_index]; AstPackage *pkg = node->pkg; @@ -6309,6 +6313,7 @@ gb_internal void check_import_entities(Checker *c) { } min_pkg_index = pkg_index; } + global_import_stage_end(GlobalImportStage_CollectFileDecls, stage_start); TIME_SECTION("check_import_entities - check delayed entities"); for (isize pkg_index = 0; pkg_index < package_order.count; pkg_index++) { @@ -6316,6 +6321,7 @@ gb_internal void check_import_entities(Checker *c) { GB_ASSERT(node->scope->flags&ScopeFlag_Pkg); AstPackage *pkg = node->scope->pkg; + stage_start = global_import_stage_begin(); for_array(i, pkg->files) { AstFile *f = pkg->files[i]; reset_checker_context(&ctx, f, &untyped); @@ -6326,13 +6332,17 @@ gb_internal void check_import_entities(Checker *c) { array_clear(&f->delayed_decls_queues[AstDelayQueue_Import]); add_untyped_expressions(ctx.info, &untyped); } + global_import_stage_end(GlobalImportStage_Imports, stage_start); + stage_start = global_import_stage_begin(); for_array(i, pkg->files) { AstFile *f = pkg->files[i]; reset_checker_context(&ctx, f, &untyped); correct_type_aliases_in_scope(&ctx, pkg->scope); } + global_import_stage_end(GlobalImportStage_TypeAliases, stage_start); + stage_start = global_import_stage_begin(); for_array(i, pkg->files) { AstFile *f = pkg->files[i]; reset_checker_context(&ctx, f, &untyped); @@ -6354,7 +6364,9 @@ gb_internal void check_import_entities(Checker *c) { array_clear(&f->delayed_decls_queues[AstDelayQueue_ForeignBlock]); } + global_import_stage_end(GlobalImportStage_ForeignBlocks, stage_start); + stage_start = global_import_stage_begin(); for_array(i, pkg->files) { AstFile *f = pkg->files[i]; reset_checker_context(&ctx, f, &untyped); @@ -6367,6 +6379,7 @@ gb_internal void check_import_entities(Checker *c) { add_untyped_expressions(ctx.info, &untyped); } + global_import_stage_end(GlobalImportStage_DelayedExprs, stage_start); } } @@ -7767,6 +7780,11 @@ gb_internal void check_parsed_files(Checker *c) { TIME_SECTION("check all global entities"); check_all_global_entities(c); + if (build_context.internal_global_entity_graph) { + TIME_SECTION("print global entity graph"); + print_global_entity_graph(c); + } + TIME_SECTION("init preload"); init_preload(c); diff --git a/src/main.cpp b/src/main.cpp index 9560bb384..ca56c40f8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -532,6 +532,7 @@ enum BuildFlagKind { BuildFlag_InternalLLVMVerification, BuildFlag_InternalLLVMNoSROA, BuildFlag_InternalEnableRVO, + BuildFlag_InternalGlobalEntityGraph, BuildFlag_Sanitize, BuildFlag_LTO, @@ -793,6 +794,7 @@ gb_internal bool parse_build_flags(Array args) { add_flag(&build_flags, BuildFlag_InternalLLVMVerification, str_lit("internal-ignore-llvm-verification"), BuildFlagParam_None, Command_all); add_flag(&build_flags, BuildFlag_InternalLLVMNoSROA, str_lit("internal-llvm-no-sroa"), BuildFlagParam_None, Command_all); add_flag(&build_flags, BuildFlag_InternalEnableRVO, str_lit("internal-enable-rvo"), BuildFlagParam_None, Command_all); + add_flag(&build_flags, BuildFlag_InternalGlobalEntityGraph, str_lit("internal-global-entity-graph"), BuildFlagParam_None, Command__does_check); add_flag(&build_flags, BuildFlag_Sanitize, str_lit("sanitize"), BuildFlagParam_String, Command__does_build, true); @@ -1841,6 +1843,9 @@ gb_internal bool parse_build_flags(Array args) { case BuildFlag_InternalEnableRVO: build_context.enable_rvo = true; break; + case BuildFlag_InternalGlobalEntityGraph: + build_context.internal_global_entity_graph = true; + break; case BuildFlag_Sanitize: