aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2017-04-25 12:29:25 -0400
committerAndrew Kelley <superjoe30@gmail.com>2017-04-25 12:29:25 -0400
commite0050af293146a38e2122413196e66f73d90f2e0 (patch)
tree3da86e1e696d8452e3af47e0cad2e218b5d094c6 /src/codegen.cpp
parent4cc2ea14214434297d01c1c89e9308c5c332b0fb (diff)
downloadzig-e0050af293146a38e2122413196e66f73d90f2e0.tar.gz
zig-e0050af293146a38e2122413196e66f73d90f2e0.zip
add some timing diagnostics
pass --enable-timing-info to print a nice table like this: ``` Name Start End Duration Percent Initialize 0.0000 0.0000 0.0000 0.0001 Semantic Analysis 0.0000 0.0421 0.0420 0.2109 Code Generation 0.0421 0.0620 0.0200 0.1003 LLVM Emit Object 0.0620 0.1852 0.1231 0.6180 Build Dependencies 0.1852 0.1974 0.0122 0.0615 LLVM Link 0.1974 0.1993 0.0018 0.0093 Generate .h 0.1993 0.1993 0.0000 0.0000 Total 0.0000 0.1993 0.1993 1.0000 ```
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});
+}