aboutsummaryrefslogtreecommitdiff
path: root/src/checker.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2017-11-28 22:12:33 +0000
committergingerBill <bill@gingerbill.org>2017-11-28 22:12:33 +0000
commitcfabc0e61f2c3dc00fd367e3f9bf1a89461971ef (patch)
tree2ab0837c107e9d7f20bba979bf08865d26b59407 /src/checker.cpp
parent91b534d128be65ee672fd21f8100a15244597604 (diff)
Remove `using` in arrays; Remove `_` non-exported struct fields
Start determining slow parts of the compiler
Diffstat (limited to 'src/checker.cpp')
-rw-r--r--src/checker.cpp37
1 files changed, 34 insertions, 3 deletions
diff --git a/src/checker.cpp b/src/checker.cpp
index 88ad773c0..da8ed4e7d 100644
--- a/src/checker.cpp
+++ b/src/checker.cpp
@@ -1551,18 +1551,18 @@ Array<EntityGraphNode *> generate_entity_dependency_graph(CheckerInfo *info) {
}
Array<EntityGraphNode *> G = {};
- array_init(&G, a);
+ array_init(&G, a, 2*M.entries.count);
for_array(i, M.entries) {
auto *entry = &M.entries[i];
- Entity * e = cast(Entity *)entry->key.ptr;
+ auto *e = cast(Entity *)entry->key.ptr;
EntityGraphNode *n = entry->value;
if (e->kind == Entity_Procedure) {
// Connect each pred 'p' of 'n' with each succ 's' and from
// the procedure node
for_array(j, n->pred.entries) {
- EntityGraphNode *p = cast(EntityGraphNode *)n->pred.entries[j].ptr;
+ EntityGraphNode *p = n->pred.entries[j].ptr;
// Ignore self-cycles
if (p != n) {
@@ -1594,6 +1594,7 @@ Array<EntityGraphNode *> generate_entity_dependency_graph(CheckerInfo *info) {
GB_ASSERT(n->dep_count >= 0);
}
+
return G;
}
@@ -3335,6 +3336,20 @@ void calculate_global_init_order(Checker *c) {
void check_parsed_files(Checker *c) {
+#if 0
+ Timings timings = {};
+ timings_init(&timings, str_lit("check_parsed_files"), 16);
+ defer ({
+ timings_print_all(&timings);
+ timings_destroy(&timings);
+ });
+#define TIME_SECTION(str) timings_start_section(&timings, str_lit(str))
+#else
+#define TIME_SECTION(str)
+#endif
+
+ TIME_SECTION("map full filepaths to scope");
+
add_type_info_type(c, t_invalid);
// Map full filepaths to Scopes
@@ -3351,6 +3366,7 @@ void check_parsed_files(Checker *c) {
}
}
+ TIME_SECTION("collect entities");
// Collect Entities
for_array(i, c->parser->files) {
AstFile *f = c->parser->files[i];
@@ -3360,10 +3376,16 @@ void check_parsed_files(Checker *c) {
c->context = prev_context;
}
+ TIME_SECTION("import entities");
check_import_entities(c);
+
+ TIME_SECTION("check all global entities");
check_all_global_entities(c);
+
+ TIME_SECTION("init preload");
init_preload(c); // NOTE(bill): This could be setup previously through the use of 'type_info_of'
+ TIME_SECTION("check procedure bodies");
// Check procedure bodies
// NOTE(bill): Nested procedures bodies will be added to this "queue"
for_array(i, c->procs.entries) {
@@ -3397,12 +3419,16 @@ void check_parsed_files(Checker *c) {
check_proc_body(c, pi->token, pi->decl, pi->type, pi->body);
}
+ TIME_SECTION("generate minimum dependency set");
c->info.minimum_dependency_set = generate_minimum_dependency_set(&c->info, c->info.entry_point);
+ TIME_SECTION("calculate global init order");
// Calculate initialization order of global variables
calculate_global_init_order(c);
+
+ TIME_SECTION("add untyped expression values");
// Add untyped expression values
for_array(i, c->info.untyped.entries) {
auto *entry = &c->info.untyped.entries[i];
@@ -3420,6 +3446,8 @@ void check_parsed_files(Checker *c) {
// TODO(bill): Check for unused imports (and remove) or even warn/err
// TODO(bill): Any other checks?
+
+ TIME_SECTION("add type information");
// Add "Basic" type information
for (isize i = 0; i < gb_count_of(basic_types)-1; i++) {
Type *t = &basic_types[i];
@@ -3440,6 +3468,7 @@ void check_parsed_files(Checker *c) {
}
}
+ TIME_SECTION("check entry poiny");
if (!build_context.is_dll) {
Scope *s = c->info.init_scope;
GB_ASSERT(s != nullptr);
@@ -3458,4 +3487,6 @@ void check_parsed_files(Checker *c) {
error(token, "Undefined entry point procedure 'main'");
}
}
+
+#undef TIME_SECTION
}