diff --git a/eng/native/functions.cmake b/eng/native/functions.cmake
index f5b4a44619130e..1ca230c3e534d7 100644
--- a/eng/native/functions.cmake
+++ b/eng/native/functions.cmake
@@ -467,7 +467,38 @@ if (CMAKE_VERSION VERSION_LESS "3.16")
endfunction()
endif()
-function(add_executable_clr)
+# add_linker_flag(Flag [Config1 Config2 ...])
+function(add_linker_flag Flag)
+ if (ARGN STREQUAL "")
+ set("CMAKE_EXE_LINKER_FLAGS" "${CMAKE_EXE_LINKER_FLAGS} ${Flag}" PARENT_SCOPE)
+ set("CMAKE_SHARED_LINKER_FLAGS" "${CMAKE_SHARED_LINKER_FLAGS} ${Flag}" PARENT_SCOPE)
+ else()
+ foreach(Config ${ARGN})
+ set("CMAKE_EXE_LINKER_FLAGS_${Config}" "${CMAKE_EXE_LINKER_FLAGS_${Config}} ${Flag}" PARENT_SCOPE)
+ set("CMAKE_SHARED_LINKER_FLAGS_${Config}" "${CMAKE_SHARED_LINKER_FLAGS_${Config}} ${Flag}" PARENT_SCOPE)
+ endforeach()
+ endif()
+endfunction()
+
+function(link_natvis_sources_for_target targetName linkKind)
+ if (NOT CLR_CMAKE_HOST_WIN32)
+ return()
+ endif()
+ foreach(source ${ARGN})
+ if (NOT IS_ABSOLUTE "${source}")
+ convert_to_absolute_path(source ${source})
+ endif()
+ get_filename_component(extension "${source}" EXT)
+ if ("${extension}" STREQUAL ".natvis")
+ message("Embedding natvis ${source}")
+ # Since natvis embedding is only supported on Windows
+ # we can use target_link_options since our minimum version is high enough
+ target_link_options(${targetName} "${linkKind}" "-NATVIS:${source}")
+ endif()
+ endforeach()
+endfunction()
+
+function(add_executable_clr targetName)
if(NOT WIN32)
add_executable(${ARGV} ${VERSION_FILE_PATH})
disable_pax_mprotect(${ARGV})
@@ -479,26 +510,13 @@ function(add_executable_clr)
endif()
endfunction()
-function(add_library_clr)
- if(NOT WIN32 AND "${ARGV1}" STREQUAL "SHARED")
+function(add_library_clr targetName kind)
+ if(NOT WIN32 AND "${kind}" STREQUAL "SHARED")
add_library(${ARGV} ${VERSION_FILE_PATH})
else()
add_library(${ARGV})
- endif(NOT WIN32 AND "${ARGV1}" STREQUAL "SHARED")
- if("${ARGV1}" STREQUAL "SHARED" AND NOT CLR_CMAKE_KEEP_NATIVE_SYMBOLS)
+ endif()
+ if("${kind}" STREQUAL "SHARED" AND NOT CLR_CMAKE_KEEP_NATIVE_SYMBOLS)
strip_symbols(${ARGV0} symbolFile)
endif()
endfunction()
-
-# add_linker_flag(Flag [Config1 Config2 ...])
-function(add_linker_flag Flag)
- if (ARGN STREQUAL "")
- set("CMAKE_EXE_LINKER_FLAGS" "${CMAKE_EXE_LINKER_FLAGS} ${Flag}" PARENT_SCOPE)
- set("CMAKE_SHARED_LINKER_FLAGS" "${CMAKE_SHARED_LINKER_FLAGS} ${Flag}" PARENT_SCOPE)
- else()
- foreach(Config ${ARGN})
- set("CMAKE_EXE_LINKER_FLAGS_${Config}" "${CMAKE_EXE_LINKER_FLAGS_${Config}} ${Flag}" PARENT_SCOPE)
- set("CMAKE_SHARED_LINKER_FLAGS_${Config}" "${CMAKE_SHARED_LINKER_FLAGS_${Config}} ${Flag}" PARENT_SCOPE)
- endforeach()
- endif()
-endfunction()
diff --git a/src/coreclr/jit/CMakeLists.txt b/src/coreclr/jit/CMakeLists.txt
index 1d8e8645f50462..680ed8b0f18f20 100644
--- a/src/coreclr/jit/CMakeLists.txt
+++ b/src/coreclr/jit/CMakeLists.txt
@@ -366,15 +366,6 @@ convert_to_absolute_path(JIT_ARM_SOURCES ${JIT_ARM_SOURCES})
convert_to_absolute_path(JIT_I386_SOURCES ${JIT_I386_SOURCES})
convert_to_absolute_path(JIT_ARM64_SOURCES ${JIT_ARM64_SOURCES})
-# Include natvis file for Windows
-if (CLR_CMAKE_HOST_WIN32)
- set(JIT_NATVIS_SOURCE
- clrjit.natvis
- )
- convert_to_absolute_path(JIT_NATVIS_SOURCE ${JIT_NATVIS_SOURCE})
- add_linker_flag("/NATVIS:${JIT_NATVIS_SOURCE}")
-endif(CLR_CMAKE_HOST_WIN32)
-
set(JIT_DLL_MAIN_FILE ${CMAKE_CURRENT_LIST_DIR}/dllmain.cpp)
if(CLR_CMAKE_TARGET_WIN32)
@@ -465,6 +456,10 @@ function(add_jit jitName)
${JIT_ARCH_LINK_LIBRARIES}
)
+ if (CLR_CMAKE_HOST_WIN32)
+ link_natvis_sources_for_target(${jitName} PRIVATE clrjit.natvis)
+ endif()
+
# add the install targets
install_clr(TARGETS ${jitName} ${ARGN} COMPONENT alljits)
endfunction()
diff --git a/src/coreclr/utilcode/CMakeLists.txt b/src/coreclr/utilcode/CMakeLists.txt
index af1187a59b2aad..fec22cf9dce38a 100644
--- a/src/coreclr/utilcode/CMakeLists.txt
+++ b/src/coreclr/utilcode/CMakeLists.txt
@@ -112,6 +112,11 @@ endif(CLR_CMAKE_HOST_UNIX)
if(CLR_CMAKE_HOST_WIN32)
target_compile_definitions(utilcodestaticnohost PRIVATE _CRTIMP=) # use static version of crt
+
+ link_natvis_sources_for_target(utilcodestaticnohost INTERFACE utilcode.natvis)
+ link_natvis_sources_for_target(utilcode_crossgen INTERFACE utilcode.natvis)
+ link_natvis_sources_for_target(utilcode_dac INTERFACE utilcode.natvis)
+ link_natvis_sources_for_target(utilcode INTERFACE utilcode.natvis)
endif(CLR_CMAKE_HOST_WIN32)
set_target_properties(utilcode_dac PROPERTIES DAC_COMPONENT TRUE)
diff --git a/src/coreclr/utilcode/utilcode.natvis b/src/coreclr/utilcode/utilcode.natvis
new file mode 100644
index 00000000000000..7756270b164cdc
--- /dev/null
+++ b/src/coreclr/utilcode/utilcode.natvis
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+ [Empty]
+ [Unicode] {m_buffer,su}
+ [ASCII] {m_buffer,s}
+ [UTF8] {m_buffer,s8}
+ [ANSI] {m_buffer,s}
+ m_buffer,su
+ m_buffer,s
+ m_buffer,s8
+ m_buffer,s
+
+
diff --git a/src/coreclr/vm/vm.natvis b/src/coreclr/vm/vm.natvis
new file mode 100644
index 00000000000000..f7bdbb1c30ca00
--- /dev/null
+++ b/src/coreclr/vm/vm.natvis
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+ {m_value}
+
+ m_value
+
+
+
diff --git a/src/coreclr/vm/wks/CMakeLists.txt b/src/coreclr/vm/wks/CMakeLists.txt
index 626037f0b34f39..cb7ba8ca2cc997 100644
--- a/src/coreclr/vm/wks/CMakeLists.txt
+++ b/src/coreclr/vm/wks/CMakeLists.txt
@@ -76,3 +76,8 @@ add_library(cee_wks INTERFACE)
target_sources(cee_wks INTERFACE $ $ ${VM_WKS_ARCH_ASM_OBJECTS})
add_library(cee_wks_mergeable INTERFACE)
target_sources(cee_wks_mergeable INTERFACE $ $ ${VM_WKS_ARCH_ASM_OBJECTS})
+
+if (CLR_CMAKE_HOST_WIN32)
+ link_natvis_sources_for_target(cee_wks INTERFACE ../vm.natvis)
+ link_natvis_sources_for_target(cee_wks_mergeable INTERFACE ../vm.natvis)
+endif()