natvis support in build system + some natvis

This commit is contained in:
Patedam committed 2026-09-18 18:23:49 -04:00
1 parent 2fd675cf11
commit 1367146503
5 files changed
+137 -6

No files matched your search

+3
View File
@@ -3,4 +3,7 @@
<LLVMInstallDir>C:\Program Files\LLVM</LLVMInstallDir>
<LLVMToolsVersion>19.1.0</LLVMToolsVersion>
</PropertyGroup>
<ItemGroup>
<Natvis Include="$(MSBuildThisFileDirectory)Natvis\*.natvis" />
</ItemGroup>
</Project>
+43
View File
@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
<Type Name="NonNullPtr&lt;void&gt;">
<DisplayString>{(void*)InternalPtr}</DisplayString>
<Expand>
<Item Name="[ptr]">InternalPtr</Item>
</Expand>
</Type>
<Type Name="NonNullPtr&lt;*&gt;">
<DisplayString Condition="InternalPtr == 0">&lt;null&gt;</DisplayString>
<DisplayString>{InternalPtr}</DisplayString>
<Expand>
<ExpandedItem>InternalPtr</ExpandedItem>
</Expand>
</Type>
<Type Name="VectorArena&lt;*,*&gt;">
<DisplayString>{{ size={Count} capacity={Capacity} }}</DisplayString>
<Expand>
<Item Name="[size]">Count</Item>
<Item Name="[capacity]">Capacity</Item>
<ArrayItems>
<Size>Count</Size>
<ValuePointer>Data</ValuePointer>
</ArrayItems>
</Expand>
</Type>
<Type Name="Arena">
<DisplayString Condition="Name != 0">{Name,s} (used={Position} / reserved={ReserveSize})</DisplayString>
<DisplayString Condition="Name == 0">Arena (used={Position} / reserved={ReserveSize})</DisplayString>
<Expand>
<Item Name="[name]" Condition="Name != 0">Name,s</Item>
<Item Name="[used]">Position</Item>
<Item Name="[committed]">Committed</Item>
<Item Name="[reserved]">ReserveSize</Item>
<Item Name="[alignment]">Alignment</Item>
<Item Name="Current">Current</Item>
<Item Name="Previous">Previous</Item>
</Expand>
</Type>
</AutoVisualizer>
+42
View File
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
<Type Name="String8">
<DisplayString Condition="Str == 0 || Size == 0">&lt;empty&gt;</DisplayString>
<DisplayString>{Str,[Size]s8}</DisplayString>
<StringView>Str,[Size]s8</StringView>
<Expand>
<Item Name="[size]">Size</Item>
<ArrayItems>
<Size>Size</Size>
<ValuePointer>Str</ValuePointer>
</ArrayItems>
</Expand>
</Type>
<Type Name="String16">
<DisplayString Condition="Str == 0 || Size == 0">&lt;empty&gt;</DisplayString>
<DisplayString>{Str,[Size]su}</DisplayString>
<StringView>Str,[Size]su</StringView>
<Expand>
<Item Name="[size]">Size</Item>
<ArrayItems>
<Size>Size</Size>
<ValuePointer>Str</ValuePointer>
</ArrayItems>
</Expand>
</Type>
<Type Name="StringBuffer">
<DisplayString Condition="Str == 0 || Size == 0">&lt;empty&gt; (capacity={Capacity})</DisplayString>
<DisplayString>{Str,[Size]s8} (capacity={Capacity})</DisplayString>
<StringView>Str,[Size]s8</StringView>
<Expand>
<Item Name="[size]">Size</Item>
<Item Name="[capacity]">Capacity</Item>
<ArrayItems>
<Size>Size</Size>
<ValuePointer>Str</ValuePointer>
</ArrayItems>
</Expand>
</Type>
</AutoVisualizer>
+14 -6
View File
@@ -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
+35
View File
@@ -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, " </ItemGroup>\n");
if (natvisFiles->Count > 0) {
offset += sprintf_s(buf + offset, (4 * 1024 * 1024) - offset, " <ItemGroup>\n");
for (int i = 0; i < natvisFiles->Count; i++) {
offset += sprintf_s(buf + offset, (4 * 1024 * 1024) - offset, " <Natvis Include=\"..\\%s\" />\n", natvisFiles->Paths[i]);
}
offset += sprintf_s(buf + offset, (4 * 1024 * 1024) - offset, " </ItemGroup>\n");
}
offset += sprintf_s(buf + offset, (4 * 1024 * 1024) - offset,
" <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n"
" <ImportGroup Label=\"ExtensionTargets\">\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,
" <Natvis Include=\"..\\%s\">\n"
" <Filter>Natvis</Filter>\n"
" </Natvis>\n", natvisFiles->Paths[i]);
}
}
filterOffset += sprintf_s(filterBuf + filterOffset, (4 * 1024 * 1024) - filterOffset,
" </ItemGroup>\n</Project>\n");