From 13671465037a7e652a819974c41dea29d8334ee2 Mon Sep 17 00:00:00 2001 From: Patedam Date: Fri, 18 Sep 2026 18:23:49 -0400 Subject: [PATCH] natvis support in build system + some natvis --- Directory.build.props | 3 +++ Natvis/Juliet.natvis | 43 +++++++++++++++++++++++++++++++++++++++++++ Natvis/String.natvis | 42 ++++++++++++++++++++++++++++++++++++++++++ misc/build.bat | 20 ++++++++++++++------ tools/build_system.c | 35 +++++++++++++++++++++++++++++++++++ 5 files changed, 137 insertions(+), 6 deletions(-) create mode 100644 Natvis/Juliet.natvis create mode 100644 Natvis/String.natvis diff --git a/Directory.build.props b/Directory.build.props index 97b8ab4..6b4fbd7 100644 --- a/Directory.build.props +++ b/Directory.build.props @@ -3,4 +3,7 @@ C:\Program Files\LLVM 19.1.0 + + + diff --git a/Natvis/Juliet.natvis b/Natvis/Juliet.natvis new file mode 100644 index 0000000..e465336 --- /dev/null +++ b/Natvis/Juliet.natvis @@ -0,0 +1,43 @@ + + + + {(void*)InternalPtr} + + InternalPtr + + + + + <null> + {InternalPtr} + + InternalPtr + + + + + {{ size={Count} capacity={Capacity} }} + + Count + Capacity + + Count + Data + + + + + + {Name,s} (used={Position} / reserved={ReserveSize}) + Arena (used={Position} / reserved={ReserveSize}) + + Name,s + Position + Committed + ReserveSize + Alignment + Current + Previous + + + diff --git a/Natvis/String.natvis b/Natvis/String.natvis new file mode 100644 index 0000000..a4dbd86 --- /dev/null +++ b/Natvis/String.natvis @@ -0,0 +1,42 @@ + + + + <empty> + {Str,[Size]s8} + Str,[Size]s8 + + Size + + Size + Str + + + + + + <empty> + {Str,[Size]su} + Str,[Size]su + + Size + + Size + Str + + + + + + <empty> (capacity={Capacity}) + {Str,[Size]s8} (capacity={Capacity}) + Str,[Size]s8 + + Size + Capacity + + Size + Str + + + + \ No newline at end of file diff --git a/misc/build.bat b/misc/build.bat index 71ffe50..5d965e2 100644 --- a/misc/build.bat +++ b/misc/build.bat @@ -9,7 +9,7 @@ cd /d "%~dp0\.." set BUILD_TOOL=misc\build_system.exe set BUILD_SRC=tools\build_system.c -set BUILD_TOOL_VER=1.6 +set BUILD_TOOL_VER=1.7 set COMMAND_GEN_VS=0 @@ -177,6 +177,14 @@ if /i "!CFG!"=="Debug" ( set COMMON_LIBS=kernel32.lib user32.lib Advapi32.lib gdi32.lib dxguid.lib Ws2_32.lib dxgi.lib imm32.lib dwmapi.lib d3dcompiler.lib dxcompiler.lib shell32.lib winhttp.lib delayimp.lib +set NATVIS_LINK_FLAGS= +for %%F in (Natvis\*.natvis) do ( + set "NATVIS_LINK_FLAGS=!NATVIS_LINK_FLAGS! /NATVIS:%%F" +) +if exist External\imgui\misc\debuggers\imgui.natvis ( + set "NATVIS_LINK_FLAGS=!NATVIS_LINK_FLAGS! /NATVIS:External\imgui\misc\debuggers\imgui.natvis" +) + if defined IMGUI_UNITY_SRCS ( echo STEP Compiling ImGui Shared Objs [!CFG!]>>"!PLAN_FILE!" echo OUTPUT Intermediate\x64-!CFG!\ImGui_Unity1.obj>>"!PLAN_FILE!" @@ -206,7 +214,7 @@ set "JULIET_LINK_CMD=!LINK_FLAGS!" echo STEP Building Juliet.dll [!CFG!]>>"!PLAN_FILE!" echo OUTPUT bin\x64-!CFG!\Juliet.dll>>"!PLAN_FILE!" echo DEPENDS Juliet^|External\imgui^|Intermediate\x64-!CFG!\Juliet_PCH.obj>>"!PLAN_FILE!" -echo COMMAND %COMPILER% !JULIET_LINK_CMD! /DIMGUI_API=__declspec^(dllexport^) /DJULIET_EXPORT /LD /Fe"bin\x64-!CFG!\Juliet.dll" !JULIET_INPUTS! Intermediate\x64-!CFG!\Juliet_PCH.obj %IMGUI_OBJS% /link %COMMON_LIBS% /INCREMENTAL /ILK:Intermediate\x64-!CFG!\Juliet.ilk /PDB:Intermediate\x64-!CFG!\Juliet.pdb>>"!PLAN_FILE!" +echo COMMAND %COMPILER% !JULIET_LINK_CMD! /DIMGUI_API=__declspec^(dllexport^) /DJULIET_EXPORT /LD /Fe"bin\x64-!CFG!\Juliet.dll" !JULIET_INPUTS! Intermediate\x64-!CFG!\Juliet_PCH.obj %IMGUI_OBJS% /link %COMMON_LIBS% !NATVIS_LINK_FLAGS! /INCREMENTAL /ILK:Intermediate\x64-!CFG!\Juliet.ilk /PDB:Intermediate\x64-!CFG!\Juliet.pdb>>"!PLAN_FILE!" :: --- Game.dll --- if !BUILD_GAME_DLL! equ 1 ( @@ -231,7 +239,7 @@ if !BUILD_GAME_DLL! equ 1 ( echo STEP Building !GAME_DLL_NAME!.dll [!CFG!]>>"!PLAN_FILE!" echo OUTPUT bin\x64-!CFG!\!GAME_DLL_NAME!.dll>>"!PLAN_FILE!" echo DEPENDS Game^|Juliet^|External\imgui^|Intermediate\x64-!CFG!\Game_PCH.obj>>"!PLAN_FILE!" - echo COMMAND %COMPILER% !GAME_LINK_CMD! /DIMGUI_API=__declspec^(dllimport^) /DJULIET_EXPORT /LD /Fe"bin\x64-!CFG!\!GAME_DLL_NAME!.dll" !GAME_INPUTS! Intermediate\x64-!CFG!\Game_PCH.obj /link %COMMON_LIBS% bin\x64-!CFG!\Juliet.lib /INCREMENTAL /ILK:Intermediate\x64-!CFG!\!GAME_DLL_NAME!.ilk /PDB:Intermediate\x64-!CFG!\!GAME_DLL_NAME!.pdb>>"!PLAN_FILE!" + echo COMMAND %COMPILER% !GAME_LINK_CMD! /DIMGUI_API=__declspec^(dllimport^) /DJULIET_EXPORT /LD /Fe"bin\x64-!CFG!\!GAME_DLL_NAME!.dll" !GAME_INPUTS! Intermediate\x64-!CFG!\Game_PCH.obj /link %COMMON_LIBS% bin\x64-!CFG!\Juliet.lib !NATVIS_LINK_FLAGS! /INCREMENTAL /ILK:Intermediate\x64-!CFG!\!GAME_DLL_NAME!.ilk /PDB:Intermediate\x64-!CFG!\!GAME_DLL_NAME!.pdb>>"!PLAN_FILE!" ) :: --- JulietApp.exe --- @@ -254,7 +262,7 @@ if !TARGET_JULIET! equ 1 ( echo STEP Building JulietApp.exe [!CFG!]>>"!PLAN_FILE!" echo OUTPUT bin\x64-!CFG!\JulietApp.exe>>"!PLAN_FILE!" echo DEPENDS JulietApp^|Game^|Juliet^|External\imgui^|Intermediate\x64-!CFG!\JulietApp_PCH.obj>>"!PLAN_FILE!" - echo COMMAND %COMPILER% !APP_LINK_CMD! /DIMGUI_API=__declspec^(dllimport^) /Fe"bin\x64-!CFG!\JulietApp.exe" !APP_INPUTS! Intermediate\x64-!CFG!\JulietApp_PCH.obj /link %COMMON_LIBS% bin\x64-!CFG!\Juliet.lib /SUBSYSTEM:CONSOLE /INCREMENTAL /ILK:Intermediate\x64-!CFG!\JulietApp.ilk /PDB:Intermediate\x64-!CFG!\JulietApp.pdb>>"!PLAN_FILE!" + echo COMMAND %COMPILER% !APP_LINK_CMD! /DIMGUI_API=__declspec^(dllimport^) /Fe"bin\x64-!CFG!\JulietApp.exe" !APP_INPUTS! Intermediate\x64-!CFG!\JulietApp_PCH.obj /link %COMMON_LIBS% bin\x64-!CFG!\Juliet.lib !NATVIS_LINK_FLAGS! /SUBSYSTEM:CONSOLE /INCREMENTAL /ILK:Intermediate\x64-!CFG!\JulietApp.ilk /PDB:Intermediate\x64-!CFG!\JulietApp.pdb>>"!PLAN_FILE!" ) :: --- Romeo.exe --- @@ -277,7 +285,7 @@ if !TARGET_ROMEO! equ 1 ( echo STEP Building Romeo.exe [!CFG!]>>"!PLAN_FILE!" echo OUTPUT bin\x64-!CFG!\Romeo.exe>>"!PLAN_FILE!" echo DEPENDS Romeo^|Juliet^|External\imgui^|Intermediate\x64-!CFG!\Romeo_PCH.obj>>"!PLAN_FILE!" - echo COMMAND %COMPILER% !ROMEO_LINK_CMD! /DIMGUI_API=__declspec^(dllimport^) /Fe"bin\x64-!CFG!\Romeo.exe" !ROMEO_INPUTS! Intermediate\x64-!CFG!\Romeo_PCH.obj /link %COMMON_LIBS% bin\x64-!CFG!\Juliet.lib /SUBSYSTEM:WINDOWS /INCREMENTAL /ILK:Intermediate\x64-!CFG!\Romeo.ilk /PDB:Intermediate\x64-!CFG!\Romeo.pdb>>"!PLAN_FILE!" + echo COMMAND %COMPILER% !ROMEO_LINK_CMD! /DIMGUI_API=__declspec^(dllimport^) /Fe"bin\x64-!CFG!\Romeo.exe" !ROMEO_INPUTS! Intermediate\x64-!CFG!\Romeo_PCH.obj /link %COMMON_LIBS% bin\x64-!CFG!\Juliet.lib !NATVIS_LINK_FLAGS! /SUBSYSTEM:WINDOWS /INCREMENTAL /ILK:Intermediate\x64-!CFG!\Romeo.ilk /PDB:Intermediate\x64-!CFG!\Romeo.pdb>>"!PLAN_FILE!" ) :: --- JulietShaderCompiler.exe --- @@ -300,7 +308,7 @@ if !TARGET_SHADER! equ 1 ( echo STEP Building JulietShaderCompiler.exe [!CFG!]>>"!PLAN_FILE!" echo OUTPUT bin\x64-!CFG!\JulietShaderCompiler.exe>>"!PLAN_FILE!" echo DEPENDS JulietShaderCompiler^|Juliet^|Intermediate\x64-!CFG!\JulietShaderCompiler_PCH.obj>>"!PLAN_FILE!" - echo COMMAND %COMPILER% !SHADER_LINK_CMD! /DIMGUI_API=__declspec^(dllimport^) /Fe"bin\x64-!CFG!\JulietShaderCompiler.exe" !SHADER_INPUTS! Intermediate\x64-!CFG!\JulietShaderCompiler_PCH.obj /link %COMMON_LIBS% bin\x64-!CFG!\Juliet.lib /SUBSYSTEM:CONSOLE /INCREMENTAL /ILK:Intermediate\x64-!CFG!\JulietShaderCompiler.ilk /PDB:Intermediate\x64-!CFG!\JulietShaderCompiler.pdb>>"!PLAN_FILE!" + echo COMMAND %COMPILER% !SHADER_LINK_CMD! /DIMGUI_API=__declspec^(dllimport^) /Fe"bin\x64-!CFG!\JulietShaderCompiler.exe" !SHADER_INPUTS! Intermediate\x64-!CFG!\JulietShaderCompiler_PCH.obj /link %COMMON_LIBS% bin\x64-!CFG!\Juliet.lib !NATVIS_LINK_FLAGS! /SUBSYSTEM:CONSOLE /INCREMENTAL /ILK:Intermediate\x64-!CFG!\JulietShaderCompiler.ilk /PDB:Intermediate\x64-!CFG!\JulietShaderCompiler.pdb>>"!PLAN_FILE!" ) exit /b 0 diff --git a/tools/build_system.c b/tools/build_system.c index 183d6b0..fdb2b11 100644 --- a/tools/build_system.c +++ b/tools/build_system.c @@ -1221,6 +1221,14 @@ static void GenerateProject(const char* projectName, const char* projectDir, con CollectFiles(projectDir, NULL, ".inl", srcFiles); } + FilePathList* natvisFiles = CreateFilePathList(); + if (DirectoryExists("Natvis")) { + CollectFiles("Natvis", NULL, ".natvis", natvisFiles); + } + if (FileExists("External\\imgui\\misc\\debuggers\\imgui.natvis")) { + FilePathListAdd(natvisFiles, "External\\imgui\\misc\\debuggers\\imgui.natvis"); + } + char* buf = (char*)ArenaPush(4 * 1024 * 1024); int offset = 0; @@ -1315,6 +1323,14 @@ static void GenerateProject(const char* projectName, const char* projectDir, con } offset += sprintf_s(buf + offset, (4 * 1024 * 1024) - offset, " \n"); + if (natvisFiles->Count > 0) { + offset += sprintf_s(buf + offset, (4 * 1024 * 1024) - offset, " \n"); + for (int i = 0; i < natvisFiles->Count; i++) { + offset += sprintf_s(buf + offset, (4 * 1024 * 1024) - offset, " \n", natvisFiles->Paths[i]); + } + offset += sprintf_s(buf + offset, (4 * 1024 * 1024) - offset, " \n"); + } + offset += sprintf_s(buf + offset, (4 * 1024 * 1024) - offset, " \n" " \n" @@ -1373,6 +1389,16 @@ static void GenerateProject(const char* projectName, const char* projectDir, con } } + if (natvisFiles->Count > 0) { + bool found = false; + for (int f = 0; f < filterCount; f++) { + if (_stricmp(filters[f], "Natvis") == 0) { found = true; break; } + } + if (!found && filterCount < 512) { + strcpy_s(filters[filterCount++], 256, "Natvis"); + } + } + char* filterBuf = (char*)ArenaPush(4 * 1024 * 1024); int filterOffset = 0; filterOffset += sprintf_s(filterBuf + filterOffset, (4 * 1024 * 1024) - filterOffset, @@ -1416,6 +1442,15 @@ static void GenerateProject(const char* projectName, const char* projectDir, con " <%s Include=\"..\\%s\" />\n", type, path); } } + + if (natvisFiles->Count > 0) { + for (int i = 0; i < natvisFiles->Count; i++) { + filterOffset += sprintf_s(filterBuf + filterOffset, (4 * 1024 * 1024) - filterOffset, + " \n" + " Natvis\n" + " \n", natvisFiles->Paths[i]); + } + } filterOffset += sprintf_s(filterBuf + filterOffset, (4 * 1024 * 1024) - filterOffset, " \n\n");