From 9422fd311fca75e86cd4ea949a63bddc4353d9c7 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 9 Nov 2021 15:54:00 +0100 Subject: [timings-export] Add `-export-timings:format` + `-export-timings-file:filename`. --- src/main.cpp | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) (limited to 'src/main.cpp') diff --git a/src/main.cpp b/src/main.cpp index c8af38211..0c0822702 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -592,6 +592,8 @@ enum BuildFlagKind { BuildFlag_ShowUnused, BuildFlag_ShowUnusedWithLocation, BuildFlag_ShowMoreTimings, + BuildFlag_ExportTimings, + BuildFlag_ExportTimingsFile, BuildFlag_ShowSystemCalls, BuildFlag_ThreadCount, BuildFlag_KeepTempFiles, @@ -740,6 +742,8 @@ bool parse_build_flags(Array args) { add_flag(&build_flags, BuildFlag_OptimizationMode, str_lit("O"), BuildFlagParam_String, Command__does_build); add_flag(&build_flags, BuildFlag_ShowTimings, str_lit("show-timings"), BuildFlagParam_None, Command__does_check); add_flag(&build_flags, BuildFlag_ShowMoreTimings, str_lit("show-more-timings"), BuildFlagParam_None, Command__does_check); + add_flag(&build_flags, BuildFlag_ExportTimings, str_lit("export-timings"), BuildFlagParam_String, Command__does_check); + add_flag(&build_flags, BuildFlag_ExportTimingsFile, str_lit("export-timings-file"), BuildFlagParam_String, Command__does_check); add_flag(&build_flags, BuildFlag_ShowUnused, str_lit("show-unused"), BuildFlagParam_None, Command_check); add_flag(&build_flags, BuildFlag_ShowUnusedWithLocation, str_lit("show-unused-with-location"), BuildFlagParam_None, Command_check); add_flag(&build_flags, BuildFlag_ShowSystemCalls, str_lit("show-system-calls"), BuildFlagParam_None, Command_all); @@ -994,6 +998,36 @@ bool parse_build_flags(Array args) { GB_ASSERT(value.kind == ExactValue_Invalid); build_context.show_timings = true; build_context.show_more_timings = true; + break; + case BuildFlag_ExportTimings: + GB_ASSERT(value.kind == ExactValue_String); + /* + NOTE(Jeroen): `build_context.export_timings_format == 0` means the option wasn't used. + */ + if (value.value_string == "json") { + build_context.export_timings_format = TimingsExportJson; + } else if (value.value_string == "csv") { + build_context.export_timings_format = TimingsExportCSV; + } else { + gb_printf_err("Invalid export format for -export-timings:, got %.*s\n", LIT(value.value_string)); + gb_printf_err("Valid export formats:\n"); + gb_printf_err("\tjson\n"); + gb_printf_err("\tcsv\n"); + bad_flags = true; + } + + break; + case BuildFlag_ExportTimingsFile: + GB_ASSERT(value.kind == ExactValue_String); + + String export_path = string_trim_whitespace(value.value_string); + if (is_build_flag_path_valid(export_path)) { + build_context.export_timings_file = path_to_full_path(heap_allocator(), export_path); + } else { + gb_printf_err("Invalid -export-timings-file path, got %.*s\n", LIT(export_path)); + bad_flags = true; + } + break; case BuildFlag_ShowSystemCalls: GB_ASSERT(value.kind == ExactValue_Invalid); @@ -1496,6 +1530,19 @@ bool parse_build_flags(Array args) { } } + if (build_context.export_timings_format && !(build_context.show_timings || build_context.show_more_timings)) { + gb_printf_err("`-export-timings:format` requires `-show-timings` or `-show-more-timings` to be present\n"); + bad_flags = true; + } + + if (!build_context.export_timings_format == TimingsExportUnspecified && build_context.export_timings_file.len == 0) { + gb_printf_err("`-export-timings:format` requires `-export-timings-file:filename` to be specified as well\n"); + bad_flags = true; + } else if (build_context.export_timings_format == TimingsExportUnspecified && build_context.export_timings_file.len > 0) { + gb_printf_err("`-export-timings-file:filename` requires `-export-timings:format` to be specified as well\n"); + bad_flags = true; + } + if (build_context.query_data_set_settings.ok) { if (build_context.query_data_set_settings.kind == QueryDataSet_Invalid) { gb_printf_err("'odin query' requires a flag determining the kind of query data set to be returned\n"); @@ -1739,6 +1786,15 @@ void print_show_help(String const arg0, String const &command) { print_usage_line(2, "Shows an advanced overview of the timings of different stages within the compiler in milliseconds"); print_usage_line(0, ""); + print_usage_line(1, "-export-timings"); + print_usage_line(2, "Export timings to one of a few formats. Requires `-show-timings` or `-show-more-timings`"); + print_usage_line(2, "Accepted values: json, csv"); + print_usage_line(0, ""); + + print_usage_line(1, "-export-timings-file:filename"); + print_usage_line(2, "Specify the filename for `-export-timings`."); + print_usage_line(0, ""); + print_usage_line(1, "-thread-count:"); print_usage_line(2, "Override the number of threads the compiler will use to compile with"); print_usage_line(2, "Example: -thread-count:2"); -- cgit v1.2.3 From 05a86d5296895ead7a8e352a961815b079455a8d Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 9 Nov 2021 19:50:23 +0100 Subject: [timings-export] Implement JSON + CSV timngs export. --- src/main.cpp | 116 +++++++++++++++++++++++++++++++++++++++++++++++++++++--- src/timings.cpp | 15 +++++--- 2 files changed, 121 insertions(+), 10 deletions(-) (limited to 'src/main.cpp') diff --git a/src/main.cpp b/src/main.cpp index 0c0822702..ef25adf94 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1530,11 +1530,6 @@ bool parse_build_flags(Array args) { } } - if (build_context.export_timings_format && !(build_context.show_timings || build_context.show_more_timings)) { - gb_printf_err("`-export-timings:format` requires `-show-timings` or `-show-more-timings` to be present\n"); - bad_flags = true; - } - if (!build_context.export_timings_format == TimingsExportUnspecified && build_context.export_timings_file.len == 0) { gb_printf_err("`-export-timings:format` requires `-export-timings-file:filename` to be specified as well\n"); bad_flags = true; @@ -1543,6 +1538,11 @@ bool parse_build_flags(Array args) { bad_flags = true; } + if (build_context.export_timings_format && !(build_context.show_timings || build_context.show_more_timings)) { + gb_printf_err("`-export-timings:format` requires `-show-timings` or `-show-more-timings` to be present\n"); + bad_flags = true; + } + if (build_context.query_data_set_settings.ok) { if (build_context.query_data_set_settings.kind == QueryDataSet_Invalid) { gb_printf_err("'odin query' requires a flag determining the kind of query data set to be returned\n"); @@ -1555,6 +1555,107 @@ bool parse_build_flags(Array args) { return !bad_flags; } +void timings_export_all(Timings *t, Checker *c, bool timings_are_finalized = false) { + GB_ASSERT(!build_context.export_timings_format == TimingsExportUnspecified && build_context.export_timings_file.len > 0); + + /* + NOTE(Jeroen): Whether we call `timings_print_all()`, then `timings_export_all()`, the other way around, + or just one of them, we only need to stop the clock once. + */ + if (!timings_are_finalized) { + timings__stop_current_section(t); + t->total.finish = time_stamp_time_now(); + } + + TimingUnit unit = TimingUnit_Millisecond; + + /* + Prepare file for export. + */ + gbFile f = {}; + char * fileName = (char *)build_context.export_timings_file.text; + gbFileError err = gb_file_open_mode(&f, gbFileMode_Write, fileName); + if (err != gbFileError_None) { + gb_printf_err("Failed to export timings to: %s\n", fileName); + gb_exit(1); + return; + } else { + gb_printf("\nExporting timings to '%s'... ", fileName); + } + defer (gb_file_close(&f)); + + /* + JSON export + */ + if (build_context.export_timings_format == TimingsExportJson) { + Parser *p = c->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_fprintf(&f, "{\n"); + gb_fprintf(&f, "\t\"totals\": [\n"); + + gb_fprintf(&f, "\t\t{\"name\": \"total_packages\", \"count\": %d},\n", packages); + gb_fprintf(&f, "\t\t{\"name\": \"total_files\", \"count\": %d},\n", files); + gb_fprintf(&f, "\t\t{\"name\": \"total_lines\", \"count\": %d},\n", lines); + gb_fprintf(&f, "\t\t{\"name\": \"total_tokens\", \"count\": %d},\n", tokens); + gb_fprintf(&f, "\t\t{\"name\": \"total_file_size\", \"count\": %d},\n", total_file_size); + + gb_fprintf(&f, "\t],\n"); + + gb_fprintf(&f, "\t\"timings\": [\n"); + + t->total_time_seconds = time_stamp_as_s(t->total, t->freq); + f64 total_time = time_stamp(t->total, t->freq, unit); + + gb_fprintf(&f, "\t\t{\"name\": \"%.*s\", \"millis\": %.3f},\n", + LIT(t->total.label), total_time); + + for_array(i, t->sections) { + TimeStamp ts = t->sections[i]; + f64 section_time = time_stamp(ts, t->freq, unit); + gb_fprintf(&f, "\t\t{\"name\": \"%.*s\", \"millis\": %.3f},\n", + LIT(ts.label), section_time); + } + + gb_fprintf(&f, "\t],\n"); + + gb_fprintf(&f, "}\n"); + } + + /* + CSV export + */ + else if (build_context.export_timings_format == TimingsExportCSV) { + + t->total_time_seconds = time_stamp_as_s(t->total, t->freq); + f64 total_time = time_stamp(t->total, t->freq, unit); + + /* + CSV doesn't really like floating point values. Cast to `int`. + */ + gb_fprintf(&f, "\"%.*s\", %d\n", LIT(t->total.label), int(total_time)); + + for_array(i, t->sections) { + TimeStamp ts = t->sections[i]; + f64 section_time = time_stamp(ts, t->freq, unit); + gb_fprintf(&f, "\"%.*s\", %d\n", LIT(ts.label), int(section_time)); + } + } + + gb_printf("Done.\n"); +} + void show_timings(Checker *c, Timings *t) { Parser *p = c->parser; isize lines = p->total_line_count; @@ -1575,6 +1676,11 @@ void show_timings(Checker *c, Timings *t) { } timings_print_all(t); + + if (!build_context.export_timings_format == TimingsExportUnspecified) { + timings_export_all(t, c, true); + } + if (build_context.show_debug_messages && build_context.show_more_timings) { { gb_printf("\n"); diff --git a/src/timings.cpp b/src/timings.cpp index b07bc6a8d..72abe7ea1 100644 --- a/src/timings.cpp +++ b/src/timings.cpp @@ -169,14 +169,19 @@ f64 time_stamp(TimeStamp const &ts, u64 freq, TimingUnit unit) { } } -void timings_print_all(Timings *t, TimingUnit unit = TimingUnit_Millisecond) { +void timings_print_all(Timings *t, TimingUnit unit = TimingUnit_Millisecond, bool timings_are_finalized = false) { isize const SPACES_LEN = 256; char SPACES[SPACES_LEN+1] = {0}; gb_memset(SPACES, ' ', SPACES_LEN); - - timings__stop_current_section(t); - t->total.finish = time_stamp_time_now(); + /* + NOTE(Jeroen): Whether we call `timings_print_all()`, then `timings_export_all()`, the other way around, + or just one of them, we only need to stop the clock once. + */ + if (!timings_are_finalized) { + timings__stop_current_section(t); + t->total.finish = time_stamp_time_now(); + } isize max_len = gb_min(36, t->total.label.len); for_array(i, t->sections) { @@ -207,4 +212,4 @@ void timings_print_all(Timings *t, TimingUnit unit = TimingUnit_Millisecond) { timing_unit_strings[unit], 100.0*section_time/total_time); } -} +} \ No newline at end of file -- cgit v1.2.3 From 6c306f7633b5337f747adf5d865dbe48efc63967 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 9 Nov 2021 20:31:22 +0100 Subject: Fix Linux warnings. --- src/main.cpp | 64 +++++++++++++++++++++++++++++++++--------------------------- 1 file changed, 35 insertions(+), 29 deletions(-) (limited to 'src/main.cpp') diff --git a/src/main.cpp b/src/main.cpp index ef25adf94..617be5b02 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -859,9 +859,9 @@ bool parse_build_flags(Array args) { } else { ok = true; switch (bf.param_kind) { - default: + default: { ok = false; - break; + } break; case BuildFlagParam_Boolean: { if (str_eq_ignore_case(param, str_lit("t")) || str_eq_ignore_case(param, str_lit("true")) || @@ -875,12 +875,12 @@ bool parse_build_flags(Array args) { gb_printf_err("Invalid flag parameter for '%.*s' : '%.*s'\n", LIT(name), LIT(param)); } } break; - case BuildFlagParam_Integer: + case BuildFlagParam_Integer: { value = exact_value_integer_from_string(param); - break; - case BuildFlagParam_Float: + } break; + case BuildFlagParam_Float: { value = exact_value_float_from_string(param); - break; + } break; case BuildFlagParam_String: { value = exact_value_string(param); if (value.kind == ExactValue_String) { @@ -933,10 +933,10 @@ bool parse_build_flags(Array args) { } if (ok) switch (bf.kind) { - case BuildFlag_Help: + case BuildFlag_Help: { build_context.show_help = true; break; - + } case BuildFlag_OutFile: { GB_ASSERT(value.kind == ExactValue_String); String path = value.value_string; @@ -949,7 +949,7 @@ bool parse_build_flags(Array args) { } break; } - case BuildFlag_OptimizationLevel: + case BuildFlag_OptimizationLevel: { GB_ASSERT(value.kind == ExactValue_Integer); if (set_flags[BuildFlag_OptimizationMode]) { gb_printf_err("Mixture of -opt and -o is not allowed\n"); @@ -958,7 +958,8 @@ bool parse_build_flags(Array args) { } build_context.optimization_level = cast(i32)big_int_to_i64(&value.value_integer); break; - case BuildFlag_OptimizationMode: + } + case BuildFlag_OptimizationMode: { GB_ASSERT(value.kind == ExactValue_String); if (set_flags[BuildFlag_OptimizationLevel]) { gb_printf_err("Mixture of -opt and -o is not allowed\n"); @@ -981,25 +982,29 @@ bool parse_build_flags(Array args) { bad_flags = true; } break; - case BuildFlag_ShowTimings: + } + case BuildFlag_ShowTimings: { GB_ASSERT(value.kind == ExactValue_Invalid); build_context.show_timings = true; break; - case BuildFlag_ShowUnused: + } + case BuildFlag_ShowUnused: { GB_ASSERT(value.kind == ExactValue_Invalid); build_context.show_unused = true; break; - case BuildFlag_ShowUnusedWithLocation: + } + case BuildFlag_ShowUnusedWithLocation: { GB_ASSERT(value.kind == ExactValue_Invalid); build_context.show_unused = true; build_context.show_unused_with_location = true; break; + } case BuildFlag_ShowMoreTimings: GB_ASSERT(value.kind == ExactValue_Invalid); build_context.show_timings = true; build_context.show_more_timings = true; break; - case BuildFlag_ExportTimings: + case BuildFlag_ExportTimings: { GB_ASSERT(value.kind == ExactValue_String); /* NOTE(Jeroen): `build_context.export_timings_format == 0` means the option wasn't used. @@ -1017,7 +1022,8 @@ bool parse_build_flags(Array args) { } break; - case BuildFlag_ExportTimingsFile: + } + case BuildFlag_ExportTimingsFile: { GB_ASSERT(value.kind == ExactValue_String); String export_path = string_trim_whitespace(value.value_string); @@ -1029,10 +1035,12 @@ bool parse_build_flags(Array args) { } break; - case BuildFlag_ShowSystemCalls: + } + case BuildFlag_ShowSystemCalls: { GB_ASSERT(value.kind == ExactValue_Invalid); build_context.show_system_calls = true; break; + } case BuildFlag_ThreadCount: { GB_ASSERT(value.kind == ExactValue_Integer); isize count = cast(isize)big_int_to_i64(&value.value_integer); @@ -1044,11 +1052,11 @@ bool parse_build_flags(Array args) { } break; } - case BuildFlag_KeepTempFiles: + case BuildFlag_KeepTempFiles: { GB_ASSERT(value.kind == ExactValue_Invalid); build_context.keep_temp_files = true; break; - + } case BuildFlag_Collection: { GB_ASSERT(value.kind == ExactValue_String); String str = value.value_string; @@ -1112,8 +1120,6 @@ bool parse_build_flags(Array args) { // NOTE(bill): Allow for multiple library collections continue; } - - case BuildFlag_Define: { GB_ASSERT(value.kind == ExactValue_String); String str = value.value_string; @@ -1530,10 +1536,10 @@ bool parse_build_flags(Array args) { } } - if (!build_context.export_timings_format == TimingsExportUnspecified && build_context.export_timings_file.len == 0) { + if ((!(build_context.export_timings_format == TimingsExportUnspecified)) && (build_context.export_timings_file.len == 0)) { gb_printf_err("`-export-timings:format` requires `-export-timings-file:filename` to be specified as well\n"); bad_flags = true; - } else if (build_context.export_timings_format == TimingsExportUnspecified && build_context.export_timings_file.len > 0) { + } else if ((build_context.export_timings_format == TimingsExportUnspecified) && (build_context.export_timings_file.len > 0)) { gb_printf_err("`-export-timings-file:filename` requires `-export-timings:format` to be specified as well\n"); bad_flags = true; } @@ -1556,7 +1562,7 @@ bool parse_build_flags(Array args) { } void timings_export_all(Timings *t, Checker *c, bool timings_are_finalized = false) { - GB_ASSERT(!build_context.export_timings_format == TimingsExportUnspecified && build_context.export_timings_file.len > 0); + GB_ASSERT((!(build_context.export_timings_format == TimingsExportUnspecified) && build_context.export_timings_file.len > 0)); /* NOTE(Jeroen): Whether we call `timings_print_all()`, then `timings_export_all()`, the other way around, @@ -1605,11 +1611,11 @@ void timings_export_all(Timings *t, Checker *c, bool timings_are_finalized = fal gb_fprintf(&f, "{\n"); gb_fprintf(&f, "\t\"totals\": [\n"); - gb_fprintf(&f, "\t\t{\"name\": \"total_packages\", \"count\": %d},\n", packages); - gb_fprintf(&f, "\t\t{\"name\": \"total_files\", \"count\": %d},\n", files); - gb_fprintf(&f, "\t\t{\"name\": \"total_lines\", \"count\": %d},\n", lines); - gb_fprintf(&f, "\t\t{\"name\": \"total_tokens\", \"count\": %d},\n", tokens); - gb_fprintf(&f, "\t\t{\"name\": \"total_file_size\", \"count\": %d},\n", total_file_size); + gb_fprintf(&f, "\t\t{\"name\": \"total_packages\", \"count\": %td},\n", packages); + gb_fprintf(&f, "\t\t{\"name\": \"total_files\", \"count\": %td},\n", files); + gb_fprintf(&f, "\t\t{\"name\": \"total_lines\", \"count\": %td},\n", lines); + gb_fprintf(&f, "\t\t{\"name\": \"total_tokens\", \"count\": %td},\n", tokens); + gb_fprintf(&f, "\t\t{\"name\": \"total_file_size\", \"count\": %td},\n", total_file_size); gb_fprintf(&f, "\t],\n"); @@ -1677,7 +1683,7 @@ void show_timings(Checker *c, Timings *t) { timings_print_all(t); - if (!build_context.export_timings_format == TimingsExportUnspecified) { + if (!(build_context.export_timings_format == TimingsExportUnspecified)) { timings_export_all(t, c, true); } -- cgit v1.2.3 From 9dc8753a1485d9481cbcc12f662ed4de3496bd3d Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 9 Nov 2021 22:52:26 +0100 Subject: [timings-export] Improve help messages Also make `clang` happy as concerns the build settings switch/case. --- src/main.cpp | 147 +++++++++++++++++++++++++++++++---------------------------- 1 file changed, 78 insertions(+), 69 deletions(-) (limited to 'src/main.cpp') diff --git a/src/main.cpp b/src/main.cpp index 617be5b02..64077e300 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1256,87 +1256,88 @@ bool parse_build_flags(Array args) { break; } - case BuildFlag_Debug: + case BuildFlag_Debug: { build_context.ODIN_DEBUG = true; break; - - case BuildFlag_DisableAssert: + } + case BuildFlag_DisableAssert: { build_context.ODIN_DISABLE_ASSERT = true; break; - - case BuildFlag_NoBoundsCheck: + } + case BuildFlag_NoBoundsCheck: { build_context.no_bounds_check = true; break; - - case BuildFlag_NoDynamicLiterals: + } + case BuildFlag_NoDynamicLiterals: { build_context.no_dynamic_literals = true; break; - - case BuildFlag_NoCRT: + } + case BuildFlag_NoCRT: { build_context.no_crt = true; break; - - case BuildFlag_NoEntryPoint: + } + case BuildFlag_NoEntryPoint: { build_context.no_entry_point = true; break; - - case BuildFlag_UseLLD: + } + case BuildFlag_UseLLD: { build_context.use_lld = true; break; - - case BuildFlag_UseSeparateModules: + } + case BuildFlag_UseSeparateModules: { build_context.use_separate_modules = true; break; - - case BuildFlag_ThreadedChecker: + } + case BuildFlag_ThreadedChecker: { #if defined(DEFAULT_TO_THREADED_CHECKER) gb_printf_err("-threaded-checker is the default on this platform\n"); bad_flags = true; #endif build_context.threaded_checker = true; break; - - case BuildFlag_NoThreadedChecker: + } + case BuildFlag_NoThreadedChecker: { #if !defined(DEFAULT_TO_THREADED_CHECKER) gb_printf_err("-no-threaded-checker is the default on this platform\n"); bad_flags = true; #endif build_context.threaded_checker = false; break; - - case BuildFlag_ShowDebugMessages: + } + case BuildFlag_ShowDebugMessages: { build_context.show_debug_messages = true; break; - - case BuildFlag_Vet: + } + case BuildFlag_Vet: { build_context.vet = true; break; - case BuildFlag_VetExtra: + } + case BuildFlag_VetExtra: { build_context.vet = true; build_context.vet_extra = true; break; - - case BuildFlag_UseLLVMApi: + } + case BuildFlag_UseLLVMApi: { gb_printf_err("-llvm-api flag is not required any more\n"); bad_flags = true; break; - - case BuildFlag_IgnoreUnknownAttributes: + } + case BuildFlag_IgnoreUnknownAttributes: { build_context.ignore_unknown_attributes = true; break; - - case BuildFlag_ExtraLinkerFlags: + } + case BuildFlag_ExtraLinkerFlags: { GB_ASSERT(value.kind == ExactValue_String); build_context.extra_linker_flags = value.value_string; break; - - case BuildFlag_Microarch: + } + case BuildFlag_Microarch: { GB_ASSERT(value.kind == ExactValue_String); build_context.microarch = value.value_string; string_to_lower(&build_context.microarch); break; - - case BuildFlag_TestName: + } + case BuildFlag_TestName: { GB_ASSERT(value.kind == ExactValue_String); { String name = value.value_string; @@ -1350,35 +1351,35 @@ bool parse_build_flags(Array args) { // NOTE(bill): Allow for multiple -test-name continue; } - - case BuildFlag_DisallowDo: + } + case BuildFlag_DisallowDo: { build_context.disallow_do = true; break; - - case BuildFlag_DefaultToNilAllocator: + } + case BuildFlag_DefaultToNilAllocator: { build_context.ODIN_DEFAULT_TO_NIL_ALLOCATOR = true; break; - - case BuildFlag_InsertSemicolon: + } + case BuildFlag_InsertSemicolon: { gb_printf_err("-insert-semicolon flag is not required any more\n"); bad_flags = true; break; - - case BuildFlag_StrictStyle: + } + case BuildFlag_StrictStyle: { if (build_context.strict_style_init_only) { gb_printf_err("-strict-style and -strict-style-init-only cannot be used together\n"); } build_context.strict_style = true; break; - case BuildFlag_StrictStyleInitOnly: + } + case BuildFlag_StrictStyleInitOnly: { if (build_context.strict_style) { gb_printf_err("-strict-style and -strict-style-init-only cannot be used together\n"); } build_context.strict_style_init_only = true; break; - - - case BuildFlag_Compact: + } + case BuildFlag_Compact: { if (!build_context.query_data_set_settings.ok) { gb_printf_err("Invalid use of -compact flag, only allowed with 'odin query'\n"); bad_flags = true; @@ -1386,8 +1387,8 @@ bool parse_build_flags(Array args) { build_context.query_data_set_settings.compact = true; } break; - - case BuildFlag_GlobalDefinitions: + } + case BuildFlag_GlobalDefinitions: { if (!build_context.query_data_set_settings.ok) { gb_printf_err("Invalid use of -global-definitions flag, only allowed with 'odin query'\n"); bad_flags = true; @@ -1398,7 +1399,8 @@ bool parse_build_flags(Array args) { build_context.query_data_set_settings.kind = QueryDataSet_GlobalDefinitions; } break; - case BuildFlag_GoToDefinitions: + } + case BuildFlag_GoToDefinitions: { if (!build_context.query_data_set_settings.ok) { gb_printf_err("Invalid use of -go-to-definitions flag, only allowed with 'odin query'\n"); bad_flags = true; @@ -1409,17 +1411,20 @@ bool parse_build_flags(Array args) { build_context.query_data_set_settings.kind = QueryDataSet_GoToDefinitions; } break; - - case BuildFlag_Short: + } + case BuildFlag_Short: { build_context.cmd_doc_flags |= CmdDocFlag_Short; break; - case BuildFlag_AllPackages: + } + case BuildFlag_AllPackages: { build_context.cmd_doc_flags |= CmdDocFlag_AllPackages; break; - case BuildFlag_DocFormat: + } + case BuildFlag_DocFormat: { build_context.cmd_doc_flags |= CmdDocFlag_DocFormat; break; - case BuildFlag_IgnoreWarnings: + } + case BuildFlag_IgnoreWarnings: { if (build_context.warnings_as_errors) { gb_printf_err("-ignore-warnings cannot be used with -warnings-as-errors\n"); bad_flags = true; @@ -1427,7 +1432,8 @@ bool parse_build_flags(Array args) { build_context.ignore_warnings = true; } break; - case BuildFlag_WarningsAsErrors: + } + case BuildFlag_WarningsAsErrors: { if (build_context.ignore_warnings) { gb_printf_err("-warnings-as-errors cannot be used with -ignore-warnings\n"); bad_flags = true; @@ -1435,21 +1441,21 @@ bool parse_build_flags(Array args) { build_context.warnings_as_errors = true; } break; - - case BuildFlag_VerboseErrors: + } + case BuildFlag_VerboseErrors: { build_context.show_error_line = true; break; - - case BuildFlag_InternalIgnoreLazy: + } + case BuildFlag_InternalIgnoreLazy: { build_context.ignore_lazy = true; break; - + } #if defined(GB_SYSTEM_WINDOWS) - case BuildFlag_IgnoreVsSearch: + case BuildFlag_IgnoreVsSearch: { GB_ASSERT(value.kind == ExactValue_Invalid); build_context.ignore_microsoft_magic = true; break; - + } case BuildFlag_ResourceFile: { GB_ASSERT(value.kind == ExactValue_String); String path = value.value_string; @@ -1537,15 +1543,15 @@ bool parse_build_flags(Array args) { } if ((!(build_context.export_timings_format == TimingsExportUnspecified)) && (build_context.export_timings_file.len == 0)) { - gb_printf_err("`-export-timings:format` requires `-export-timings-file:filename` to be specified as well\n"); + gb_printf_err("`-export-timings:` requires `-export-timings-file:` to be specified as well\n"); bad_flags = true; } else if ((build_context.export_timings_format == TimingsExportUnspecified) && (build_context.export_timings_file.len > 0)) { - gb_printf_err("`-export-timings-file:filename` requires `-export-timings:format` to be specified as well\n"); + gb_printf_err("`-export-timings-file:` requires `-export-timings:` to be specified as well\n"); bad_flags = true; } if (build_context.export_timings_format && !(build_context.show_timings || build_context.show_more_timings)) { - gb_printf_err("`-export-timings:format` requires `-show-timings` or `-show-more-timings` to be present\n"); + gb_printf_err("`-export-timings:` requires `-show-timings` or `-show-more-timings` to be present\n"); bad_flags = true; } @@ -1898,13 +1904,16 @@ void print_show_help(String const arg0, String const &command) { print_usage_line(2, "Shows an advanced overview of the timings of different stages within the compiler in milliseconds"); print_usage_line(0, ""); - print_usage_line(1, "-export-timings"); + print_usage_line(1, "-export-timings:"); print_usage_line(2, "Export timings to one of a few formats. Requires `-show-timings` or `-show-more-timings`"); - print_usage_line(2, "Accepted values: json, csv"); + print_usage_line(2, "Available options:"); + print_usage_line(3, "-export-timings:json Export compile time stats to JSON"); + print_usage_line(3, "-export-timings:csv Export compile time stats to CSV"); print_usage_line(0, ""); - print_usage_line(1, "-export-timings-file:filename"); - print_usage_line(2, "Specify the filename for `-export-timings`."); + print_usage_line(1, "-export-timings-file:"); + print_usage_line(2, "Specify the filename for `-export-timings`"); + print_usage_line(2, "Example: -export-timings-file:timings.json"); print_usage_line(0, ""); print_usage_line(1, "-thread-count:"); -- cgit v1.2.3 From 8c5c45a04c2a525e048538d764cc35f44239230b Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Wed, 10 Nov 2021 12:23:46 +0100 Subject: [timings-export] Style fixes. --- src/main.cpp | 74 +++++++++++++++++++++--------------------------------------- 1 file changed, 26 insertions(+), 48 deletions(-) (limited to 'src/main.cpp') diff --git a/src/main.cpp b/src/main.cpp index 64077e300..61288f3c4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -933,10 +933,9 @@ bool parse_build_flags(Array args) { } if (ok) switch (bf.kind) { - case BuildFlag_Help: { + case BuildFlag_Help: build_context.show_help = true; break; - } case BuildFlag_OutFile: { GB_ASSERT(value.kind == ExactValue_String); String path = value.value_string; @@ -1256,38 +1255,30 @@ bool parse_build_flags(Array args) { break; } - case BuildFlag_Debug: { + case BuildFlag_Debug: build_context.ODIN_DEBUG = true; break; - } - case BuildFlag_DisableAssert: { + case BuildFlag_DisableAssert: build_context.ODIN_DISABLE_ASSERT = true; break; - } - case BuildFlag_NoBoundsCheck: { + case BuildFlag_NoBoundsCheck: build_context.no_bounds_check = true; break; - } - case BuildFlag_NoDynamicLiterals: { + case BuildFlag_NoDynamicLiterals: build_context.no_dynamic_literals = true; break; - } - case BuildFlag_NoCRT: { + case BuildFlag_NoCRT: build_context.no_crt = true; break; - } - case BuildFlag_NoEntryPoint: { + case BuildFlag_NoEntryPoint: build_context.no_entry_point = true; break; - } - case BuildFlag_UseLLD: { + case BuildFlag_UseLLD: build_context.use_lld = true; break; - } - case BuildFlag_UseSeparateModules: { + case BuildFlag_UseSeparateModules: build_context.use_separate_modules = true; break; - } case BuildFlag_ThreadedChecker: { #if defined(DEFAULT_TO_THREADED_CHECKER) gb_printf_err("-threaded-checker is the default on this platform\n"); @@ -1304,14 +1295,12 @@ bool parse_build_flags(Array args) { build_context.threaded_checker = false; break; } - case BuildFlag_ShowDebugMessages: { + case BuildFlag_ShowDebugMessages: build_context.show_debug_messages = true; break; - } - case BuildFlag_Vet: { + case BuildFlag_Vet: build_context.vet = true; break; - } case BuildFlag_VetExtra: { build_context.vet = true; build_context.vet_extra = true; @@ -1322,10 +1311,9 @@ bool parse_build_flags(Array args) { bad_flags = true; break; } - case BuildFlag_IgnoreUnknownAttributes: { + case BuildFlag_IgnoreUnknownAttributes: build_context.ignore_unknown_attributes = true; break; - } case BuildFlag_ExtraLinkerFlags: { GB_ASSERT(value.kind == ExactValue_String); build_context.extra_linker_flags = value.value_string; @@ -1352,14 +1340,12 @@ bool parse_build_flags(Array args) { continue; } } - case BuildFlag_DisallowDo: { + case BuildFlag_DisallowDo: build_context.disallow_do = true; break; - } - case BuildFlag_DefaultToNilAllocator: { + case BuildFlag_DefaultToNilAllocator: build_context.ODIN_DEFAULT_TO_NIL_ALLOCATOR = true; break; - } case BuildFlag_InsertSemicolon: { gb_printf_err("-insert-semicolon flag is not required any more\n"); bad_flags = true; @@ -1412,18 +1398,15 @@ bool parse_build_flags(Array args) { } break; } - case BuildFlag_Short: { + case BuildFlag_Short: build_context.cmd_doc_flags |= CmdDocFlag_Short; break; - } - case BuildFlag_AllPackages: { + case BuildFlag_AllPackages: build_context.cmd_doc_flags |= CmdDocFlag_AllPackages; break; - } - case BuildFlag_DocFormat: { + case BuildFlag_DocFormat: build_context.cmd_doc_flags |= CmdDocFlag_DocFormat; break; - } case BuildFlag_IgnoreWarnings: { if (build_context.warnings_as_errors) { gb_printf_err("-ignore-warnings cannot be used with -warnings-as-errors\n"); @@ -1442,14 +1425,12 @@ bool parse_build_flags(Array args) { } break; } - case BuildFlag_VerboseErrors: { + case BuildFlag_VerboseErrors: build_context.show_error_line = true; break; - } - case BuildFlag_InternalIgnoreLazy: { + case BuildFlag_InternalIgnoreLazy: build_context.ignore_lazy = true; break; - } #if defined(GB_SYSTEM_WINDOWS) case BuildFlag_IgnoreVsSearch: { GB_ASSERT(value.kind == ExactValue_Invalid); @@ -1596,10 +1577,10 @@ void timings_export_all(Timings *t, Checker *c, bool timings_are_finalized = fal } defer (gb_file_close(&f)); - /* - JSON export - */ if (build_context.export_timings_format == TimingsExportJson) { + /* + JSON export + */ Parser *p = c->parser; isize lines = p->total_line_count; isize tokens = p->total_token_count; @@ -1643,13 +1624,10 @@ void timings_export_all(Timings *t, Checker *c, bool timings_are_finalized = fal gb_fprintf(&f, "\t],\n"); gb_fprintf(&f, "}\n"); - } - - /* - CSV export - */ - else if (build_context.export_timings_format == TimingsExportCSV) { - + } else if (build_context.export_timings_format == TimingsExportCSV) { + /* + CSV export + */ t->total_time_seconds = time_stamp_as_s(t->total, t->freq); f64 total_time = time_stamp(t->total, t->freq, unit); -- cgit v1.2.3