aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/codegen.cpp')
-rw-r--r--src/codegen.cpp30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/codegen.cpp b/src/codegen.cpp
index 01b763d5b0..12cff60a17 100644
--- a/src/codegen.cpp
+++ b/src/codegen.cpp
@@ -57,6 +57,9 @@ PackageTableEntry *new_package(const char *root_src_dir, const char *root_src_pa
CodeGen *codegen_create(Buf *root_source_dir, const ZigTarget *target) {
CodeGen *g = allocate<CodeGen>(1);
+
+ codegen_add_time_event(g, "Initialize");
+
g->import_table.init(32);
g->builtin_fn_table.init(32);
g->primitive_type_table.init(32);
@@ -3654,6 +3657,8 @@ static LLVMValueRef build_alloca(CodeGen *g, TypeTableEntry *type_entry, const c
static void do_code_gen(CodeGen *g) {
assert(!g->errors.length);
+ codegen_add_time_event(g, "Code Generation");
+
delete_unused_builtin_fns(g);
generate_error_name_table(g);
generate_enum_name_tables(g);
@@ -3977,6 +3982,8 @@ static void do_code_gen(CodeGen *g) {
LLVMVerifyModule(g->module, LLVMAbortProcessAction, &error);
#endif
+ codegen_add_time_event(g, "LLVM Emit Object");
+
char *err_msg = nullptr;
Buf *out_file_o = buf_create_from_buf(g->root_out_name);
const char *o_ext = target_o_file_ext(&g->zig_target);
@@ -4730,6 +4737,8 @@ static PackageTableEntry *create_zigrt_pkg(CodeGen *g) {
}
void codegen_add_root_code(CodeGen *g, Buf *src_dir, Buf *src_basename, Buf *source_code) {
+ codegen_add_time_event(g, "Semantic Analysis");
+
Buf source_path = BUF_INIT;
os_path_join(src_dir, src_basename, &source_path);
@@ -5020,3 +5029,24 @@ void codegen_generate_h_file(CodeGen *g) {
if (fclose(out_h))
zig_panic("unable to close h file: %s", strerror(errno));
}
+
+void codegen_print_timing_report(CodeGen *g, FILE *f) {
+ double start_time = g->timing_events.at(0).time;
+ double end_time = g->timing_events.last().time;
+ double total = end_time - start_time;
+ fprintf(f, "%20s%12s%12s%12s%12s\n", "Name", "Start", "End", "Duration", "Percent");
+ for (size_t i = 0; i < g->timing_events.length - 1; i += 1) {
+ TimeEvent *te = &g->timing_events.at(i);
+ TimeEvent *next_te = &g->timing_events.at(i + 1);
+ fprintf(f, "%20s%12.4f%12.4f%12.4f%12.4f\n", te->name,
+ te->time - start_time,
+ next_te->time - start_time,
+ next_te->time - te->time,
+ (next_te->time - te->time) / total);
+ }
+ fprintf(f, "%20s%12.4f%12.4f%12.4f%12.4f\n", "Total", 0.0, total, total, 1.0);
+}
+
+void codegen_add_time_event(CodeGen *g, const char *name) {
+ g->timing_events.append({os_get_time(), name});
+}