aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend_utility.cpp
diff options
context:
space:
mode:
authorgingerBill <gingerBill@users.noreply.github.com>2025-09-29 16:14:55 +0100
committergingerBill <gingerBill@users.noreply.github.com>2025-09-29 16:14:55 +0100
commit11712627cbb95e3ae15d6a8e2c5863e192caa68a (patch)
tree77ad6db0af84c5a715f7c03296f6bd680414db33 /src/llvm_backend_utility.cpp
parent9b4c0ea4920ea70b3e9206979aa7fd36608c4837 (diff)
Add module stuff to `-para-poly-diagnostics`
Diffstat (limited to 'src/llvm_backend_utility.cpp')
-rw-r--r--src/llvm_backend_utility.cpp112
1 files changed, 100 insertions, 12 deletions
diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp
index 7fe6b1458..244ad6d73 100644
--- a/src/llvm_backend_utility.cpp
+++ b/src/llvm_backend_utility.cpp
@@ -2790,7 +2790,7 @@ gb_internal LLVMAtomicOrdering llvm_atomic_ordering_from_odin(Ast *expr) {
-struct lbParaPolyEntry {
+struct lbDiagParaPolyEntry {
Entity *entity;
String canonical_name;
isize count;
@@ -2812,7 +2812,7 @@ gb_internal isize lb_total_code_size(lbProcedure *p) {
}
gb_internal void lb_do_para_poly_diagnostics(lbGenerator *gen) {
- PtrMap<Entity * /* Parent */, lbParaPolyEntry> procs = {};
+ PtrMap<Entity * /* Parent */, lbDiagParaPolyEntry> procs = {};
map_init(&procs);
defer (map_destroy(&procs));
@@ -2833,9 +2833,9 @@ gb_internal void lb_do_para_poly_diagnostics(lbGenerator *gen) {
continue;
}
- lbParaPolyEntry *entry = map_get(&procs, para_poly_parent);
+ lbDiagParaPolyEntry *entry = map_get(&procs, para_poly_parent);
if (entry == nullptr) {
- lbParaPolyEntry entry = {};
+ lbDiagParaPolyEntry entry = {};
entry.entity = para_poly_parent;
entry.count = 0;
@@ -2863,7 +2863,7 @@ gb_internal void lb_do_para_poly_diagnostics(lbGenerator *gen) {
}
- auto entries = array_make<lbParaPolyEntry>(heap_allocator(), 0, procs.count);
+ auto entries = array_make<lbDiagParaPolyEntry>(heap_allocator(), 0, procs.count);
defer (array_free(&entries));
for (auto &entry : procs) {
@@ -2871,8 +2871,8 @@ gb_internal void lb_do_para_poly_diagnostics(lbGenerator *gen) {
}
array_sort(entries, [](void const *a, void const *b) -> int {
- lbParaPolyEntry *x = cast(lbParaPolyEntry *)a;
- lbParaPolyEntry *y = cast(lbParaPolyEntry *)b;
+ lbDiagParaPolyEntry *x = cast(lbDiagParaPolyEntry *)a;
+ lbDiagParaPolyEntry *y = cast(lbDiagParaPolyEntry *)b;
if (x->total_code_size > y->total_code_size) {
return -1;
}
@@ -2906,8 +2906,8 @@ gb_internal void lb_do_para_poly_diagnostics(lbGenerator *gen) {
gb_printf("------------------------------------------------------------------------------------------\n");
array_sort(entries, [](void const *a, void const *b) -> int {
- lbParaPolyEntry *x = cast(lbParaPolyEntry *)a;
- lbParaPolyEntry *y = cast(lbParaPolyEntry *)b;
+ lbDiagParaPolyEntry *x = cast(lbDiagParaPolyEntry *)a;
+ lbDiagParaPolyEntry *y = cast(lbDiagParaPolyEntry *)b;
if (x->count > y->count) {
return -1;
}
@@ -2940,8 +2940,8 @@ gb_internal void lb_do_para_poly_diagnostics(lbGenerator *gen) {
array_sort(entries, [](void const *a, void const *b) -> int {
- lbParaPolyEntry *x = cast(lbParaPolyEntry *)a;
- lbParaPolyEntry *y = cast(lbParaPolyEntry *)b;
+ lbDiagParaPolyEntry *x = cast(lbDiagParaPolyEntry *)a;
+ lbDiagParaPolyEntry *y = cast(lbDiagParaPolyEntry *)b;
if (x->count < y->count) {
return -1;
}
@@ -2972,5 +2972,93 @@ gb_internal void lb_do_para_poly_diagnostics(lbGenerator *gen) {
gb_printf("%17td | %.*s\n", code_size, LIT(name));
}
- gb_printf("------------------------------------------------------------------------------------------\n");
}
+
+struct lbDiagModuleEntry {
+ lbModule *m;
+ String name;
+ isize global_internal_count;
+ isize global_external_count;
+ isize proc_internal_count;
+ isize proc_external_count;
+ isize total_instruction_count;
+};
+
+gb_internal void lb_do_module_diagnostics(lbGenerator *gen) {
+ Array<lbDiagModuleEntry> modules = {};
+ array_init(&modules, heap_allocator());
+ defer (array_free(&modules));
+
+ for (auto &entry : gen->modules) {
+ lbModule *m = entry.value;
+
+ {
+ lbDiagModuleEntry entry = {};
+ entry.m = m;
+ entry.name = make_string_c(m->module_name);
+ array_add(&modules, entry);
+ }
+ lbDiagModuleEntry &entry = modules[modules.count-1];
+
+ for (LLVMValueRef p = LLVMGetFirstFunction(m->mod); p != nullptr; p = LLVMGetNextFunction(p)) {
+ LLVMBasicBlockRef block = LLVMGetFirstBasicBlock(p);
+ if (block == nullptr) {
+ entry.proc_external_count += 1;
+ } else {
+ entry.proc_internal_count += 1;
+
+ for (; block != nullptr; block = LLVMGetNextBasicBlock(block)) {
+ for (LLVMValueRef i = LLVMGetFirstInstruction(block); i != nullptr; i = LLVMGetNextInstruction(i)) {
+ entry.total_instruction_count += 1;
+ }
+ }
+ }
+ }
+
+ for (LLVMValueRef g = LLVMGetFirstGlobal(m->mod); g != nullptr; g = LLVMGetNextGlobal(g)) {
+ LLVMLinkage linkage = LLVMGetLinkage(g);
+ if (linkage == LLVMExternalLinkage) {
+ entry.global_external_count += 1;
+ } else {
+ entry.global_internal_count += 1;
+ }
+ }
+ }
+
+ array_sort(modules, [](void const *a, void const *b) -> int {
+ lbDiagModuleEntry *x = cast(lbDiagModuleEntry *)a;
+ lbDiagModuleEntry *y = cast(lbDiagModuleEntry *)b;
+
+ if (x->total_instruction_count > y->total_instruction_count) {
+ return -1;
+ }
+ if (x->total_instruction_count < y->total_instruction_count) {
+ return +1;
+ }
+
+ return string_compare(x->name, y->name);
+ });
+
+ gb_printf("Module Diagnostics\n\n");
+ gb_printf("Total Instructions | Global Internals | Global Externals | Proc Internals | Proc Externals | Module Name\n");
+ for (auto &entry : modules) {
+ gb_printf("%18td | %16td | %16td | %14td | %14d | %s \n",
+ entry.total_instruction_count,
+ entry.global_internal_count,
+ entry.global_external_count,
+ entry.proc_internal_count,
+ entry.proc_external_count,
+ entry.m->module_name);
+ }
+
+
+}
+
+gb_internal void lb_do_code_gen_diagnostics(lbGenerator *gen) {
+ lb_do_para_poly_diagnostics(gen);
+ gb_printf("------------------------------------------------------------------------------------------\n");
+ gb_printf("------------------------------------------------------------------------------------------\n\n");
+ lb_do_module_diagnostics(gen);
+ gb_printf("------------------------------------------------------------------------------------------\n");
+ gb_printf("------------------------------------------------------------------------------------------\n\n");
+} \ No newline at end of file