diff --git a/build.bat b/build.bat index f61f2f2..0381614 100644 --- a/build.bat +++ b/build.bat @@ -13,7 +13,7 @@ set BINDIR_LINUX=./%BINDIR_RAW% echo. echo clang: -clang -std=c++17 %SRC% -o %BINDIR_WIN%\clang_%EXE_WIN% +clang -g -std=c++17 %SRC% -o %BINDIR_WIN%\clang_%EXE_WIN% %BINDIR_WIN%\clang_%EXE_WIN% echo. @@ -21,14 +21,14 @@ echo g++: g++ -std=c++17 %SRC% -o %BINDIR_WIN%\g++_%EXE_WIN% %BINDIR_WIN%\g++_%EXE_WIN% -echo. -echo cl: -cl %SRC% /std:c++latest /nologo /Zi /Fd: %BINDIR_WIN%\cl_%EXE_WIN%.pdb /Fo: %BINDIR_WIN%\ /Fe: %BINDIR_WIN%\cl_%EXE_WIN% /wd4090 -%BINDIR_WIN%\cl_%EXE_WIN% +REM echo. +REM echo cl: +REM cl %SRC% /std:c++latest /nologo /Zi /Fd: %BINDIR_WIN%\cl_%EXE_WIN%.pdb /Fo: %BINDIR_WIN%\ /Fe: %BINDIR_WIN%\cl_%EXE_WIN% /wd4090 +REM %BINDIR_WIN%\cl_%EXE_WIN% -echo. -echo bash_clang: -bash -c "clang -std=c++17 %SRC% -o %BINDIR_LINUX%/bash_clang_%EXE_LINUX% && %BINDIR_LINUX%/bash_clang_%EXE_LINUX%" +REM echo. +REM echo bash_clang: +REM bash -c "clang -std=c++17 %SRC% -o %BINDIR_LINUX%/bash_clang_%EXE_LINUX% && %BINDIR_LINUX%/bash_clang_%EXE_LINUX%" echo. echo bash_g++: diff --git a/print.hpp b/print.hpp index 6ea1aa5..14247ab 100644 --- a/print.hpp +++ b/print.hpp @@ -303,9 +303,9 @@ int print_va_args_to_file(FILE* file, static_string format, va_list* arg_list) { int move = maybe_special_print(file, format, &pos, arg_list); if (move == 0) { move = maybe_fprintf(file, format, &pos, arg_list); - if (move == 0) { - putchar('%'); - putchar(c); + if (move == -1) { + fputc('%', file); + fputc(c, file); move = 1; } } diff --git a/profiler.hpp b/profiler.hpp index 4ffcee3..216c1fa 100644 --- a/profiler.hpp +++ b/profiler.hpp @@ -1,12 +1,13 @@ #pragma once -#ifdef _PROFILING +#ifdef PROFILING # include # include # include # include +# include "./platform.hpp" -#ifdef _MSC_VER +#ifdef FTB_WINDOWS # include #else # include @@ -47,14 +48,14 @@ bool QueryPerformanceCounter(int64_t *performance_count) struct Profiler { -#ifdef _MSC_VER +#ifdef FTB_WINDOWS LARGE_INTEGER tmp_time; #else int64_t tmp_time; #endif // same for all threads - inline static char file_template[40] = "\0"; + inline static char file_template[100] = "\0"; // thread local inline thread_local static bool is_initialized = false; @@ -73,8 +74,13 @@ struct Profiler { tm* tm_i = localtime(&t); // create folder -#ifdef _MSC_VER - _mkdir("./profiler_reports/"); +#ifdef FTB_WINDOWS + SECURITY_ATTRIBUTES sa; + sa.nLength = sizeof(sa); + sa.lpSecurityDescriptor = NULL; + sa.bInheritHandle = FALSE; + CreateDirectoryA("profiler_reports", &sa); + // _mkdir("./profiler_reports/"); #else mkdir("./profiler_reports/", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); #endif @@ -97,7 +103,7 @@ struct Profiler { // initially write the performance frequency QueryPerformanceFrequency(&tmp_time); -#ifdef _MSC_VER +#ifdef FTB_WINDOWS fprintf(out_file, "%lld,,,,\n", tmp_time.QuadPart); #else fprintf(out_file, "%ld,,,,\n", tmp_time); @@ -106,7 +112,7 @@ struct Profiler { } QueryPerformanceCounter(&tmp_time); -#ifdef _MSC_VER +#ifdef FTB_WINDOWS fprintf(out_file, "->,%lld,%s,%s,%d,%s,%s\n", tmp_time.QuadPart, name, file, line, comment1, comment2); @@ -120,7 +126,7 @@ struct Profiler { ~Profiler() { call_depth -= 1; QueryPerformanceCounter(&tmp_time); -#ifdef _MSC_VER +#ifdef FTB_WINDOWS fprintf(out_file, "<-,%lld,,,,,\n", tmp_time.QuadPart); #else fprintf(out_file, "<-,%ld,,,,,\n", tmp_time); diff --git a/report2tracing.py b/report2tracing.py new file mode 100644 index 0000000..22d301f --- /dev/null +++ b/report2tracing.py @@ -0,0 +1,75 @@ +#!/usr/bin/python + +import json +import csv +import sys +import os + +class FancyFloat(float): + def __repr__(self): + return format(Decimal(self), "f") + +class JsonRpcEncoder(json.JSONEncoder): + def decimalize(self, val): + if isinstance(val, dict): + return {k:self.decimalize(v) for k,v in val.items()} + + if isinstance(val, (list, tuple)): + return type(val)(self.decimalize(v) for v in val) + + if isinstance(val, float): + return FancyFloat(val) + + return val + + def encode(self, val): + return super().encode(self.decimalize(val)) + +if len(sys.argv) == 1: + sys.exit(1) + +trace_events = [] +call_stack = [] +l = [p for p in os.listdir(sys.argv[1]) if p.endswith(".report")] +if len(l) == 0: + print("No reports are in this folder") + sys.exit(1) + +file_name = l[0] +with open(file_name, "r") as in_file: + csv_reader = csv.reader(in_file, delimiter=',') + pf = 1 + first_line = True + last_ts = -1; + for line in csv_reader: + if first_line: + pf = float(line[0]) / 1000 + first_line = False + continue + if line[0] == "->": + call_stack.append(line) + elif line[0] == "<-": + call = call_stack.pop() + ts = float(call[1]) + dur = (float(line[1])-ts) + dict = { + "pid": 1, + "tid": 1, + "ts" : ts, + "dur": dur, + "ph" : "X", + "name": call[2], + "args": { + "file": f"({call[3]}:{call[4]})", + } + } + if call[5]: + dict["args"]["info1"] = call[5] + if call[6]: + dict["args"]["info2"] = call[6] + trace_events.append(dict) + else: + print("invalid syntax") + break +with open(f"{file_name}.json", "w") as out_file: + out_file.write(json.dumps({"traceEvents": trace_events}, indent=4)) diff --git a/test.cpp b/test.cpp index a887c98..b5949f6 100644 --- a/test.cpp +++ b/test.cpp @@ -75,6 +75,13 @@ auto test_printer() -> void { print(" - %{s32,3}\n", -1,200,-300); print(" - %{->} <> %{->,2}\n", &u1, &arr, nullptr); + print("%{->char}%{->char}%{->char}", + true ? "general " : "", + false ? "validation " : "", + false ? "performance " : ""); + + // print("%{->char}%{->char}\n\n", "hallo",""); + } auto test_hm() -> void { @@ -120,7 +127,7 @@ auto test_hm() -> void { s32 main(s32 argc, char* argv[]) { init_printer(); - test_hm(); + test_printer(); print("done.");