aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2020-04-06 12:17:54 +0100
committergingerBill <bill@gingerbill.org>2020-04-06 12:17:54 +0100
commitd0b913dad1325bde1bdb3df32c20cca273cb1c0a (patch)
tree430ee19673b9d99162daaf08a62923b99795b462 /src
parentd659e679fd934bd8e6e8b87aff30274ac52ceddf (diff)
Add extra internal memory analysis
Diffstat (limited to 'src')
-rw-r--r--src/main.cpp31
-rw-r--r--src/parser.cpp7
-rw-r--r--src/parser.hpp10
3 files changed, 47 insertions, 1 deletions
diff --git a/src/main.cpp b/src/main.cpp
index 3548bd9a1..c81470ade 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -13,7 +13,7 @@ gb_global Timings global_timings = {0};
#if defined(LLVM_BACKEND_SUPPORT)
#include "llvm-c/Types.h"
#endif
-
+#include "psapi.h"
#include "parser.hpp"
#include "checker.hpp"
@@ -1614,6 +1614,35 @@ int main(int arg_count, char const **arg_ptr) {
remove_temp_files(gen.output_base);
+ if (false) {
+ PROCESS_MEMORY_COUNTERS_EX pmc;
+ GetProcessMemoryInfo(GetCurrentProcess(), (PROCESS_MEMORY_COUNTERS*)&pmc, sizeof(pmc));
+ SIZE_T virtualMemUsedByMe = pmc.PrivateUsage;
+ gb_printf_err("virtual_memory_used: %tu B\n", virtualMemUsedByMe);
+
+ gb_printf_err("total_allocated_node_memory: %lld B\n", total_allocated_node_memory);
+ gb_printf_err("total_subtype_node_memory_test: %lld B\n", total_subtype_node_memory_test);
+ gb_printf_err("fraction: %.6f\n", (f64)total_subtype_node_memory_test/(f64)total_allocated_node_memory);
+ Parser *p = checker.parser;
+ isize lines = p->total_line_count;
+ isize tokens = p->total_token_count;
+ isize files = 0;
+ isize packages = p->packages.count;
+ isize total_file_size = 0;
+ for_array(i, p->packages) {
+ files += p->packages[i]->files.count;
+ for_array(j, p->packages[i]->files) {
+ AstFile *file = p->packages[i]->files[j];
+ total_file_size += file->tokenizer.end - file->tokenizer.start;
+ }
+ }
+ gb_printf_err("total_file_size: %lld B\n", total_file_size);
+ gb_printf_err("lines: %lld\n", lines);
+ gb_printf_err("files: %lld\n", files);
+ gb_printf_err("tokens: %lld\n", tokens);
+ gb_printf_err("packages: %lld\n", packages);
+ }
+
if (run_output) {
#if defined(GB_SYSTEM_WINDOWS)
return system_exec_command_line_app("odin run", "%.*s.exe %.*s", LIT(gen.output_base), LIT(run_args_string));
diff --git a/src/parser.cpp b/src/parser.cpp
index 83ae9743f..937e84279 100644
--- a/src/parser.cpp
+++ b/src/parser.cpp
@@ -442,9 +442,16 @@ bool ast_node_expect(Ast *node, AstKind kind) {
}
+gb_global isize volatile total_allocated_node_memory = 0;
+gb_global isize volatile total_subtype_node_memory_test = 0;
+
// NOTE(bill): And this below is why is I/we need a new language! Discriminated unions are a pain in C/C++
Ast *alloc_ast_node(AstFile *f, AstKind kind) {
gbAllocator a = ast_allocator();
+
+ _InterlockedExchangeAdd64(&total_allocated_node_memory, gb_size_of(Ast));
+ _InterlockedExchangeAdd64(&total_subtype_node_memory_test, gb_size_of(AstCommonStuff) + ast_variant_sizes[kind]);
+
Ast *node = gb_alloc_item(a, Ast);
node->kind = kind;
node->file = f;
diff --git a/src/parser.hpp b/src/parser.hpp
index 129f1d41b..9c55bf2f7 100644
--- a/src/parser.hpp
+++ b/src/parser.hpp
@@ -576,6 +576,16 @@ isize const ast_variant_sizes[] = {
#undef AST_KIND
};
+struct AstCommonStuff {
+ AstKind kind;
+ u32 state_flags;
+ u32 viral_state_flags;
+ bool been_handled;
+ AstFile * file;
+ Scope * scope;
+ TypeAndValue tav;
+};
+
struct Ast {
AstKind kind;
u32 state_flags;