From b3d6e2e61aaec32b94aae4cd5a66f682af94707b Mon Sep 17 00:00:00 2001 From: rcj1 Date: Mon, 20 Jul 2026 14:07:55 -0700 Subject: [PATCH 1/2] Add ICorDebugDataTarget5 with GetTargetInfo and implement it in ShimDataTarget Introduce a new ICorDebugDataTarget5 interface exposing GetTargetInfo, which reports the target's processor architecture and operating system. Implement GetTargetInfo once in the shared ShimDataTarget base class Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- src/coreclr/debug/di/shimdatatarget.cpp | 45 +++++++ src/coreclr/debug/di/shimdatatarget.h | 10 +- .../dlls/mscordac/mscordac_unixexports.src | 1 + src/coreclr/inc/cordebug.idl | 54 ++++++++ src/coreclr/pal/prebuilt/idl/cordebug_i.cpp | 3 + src/coreclr/pal/prebuilt/inc/cordebug.h | 117 ++++++++++++++++++ 6 files changed, 229 insertions(+), 1 deletion(-) diff --git a/src/coreclr/debug/di/shimdatatarget.cpp b/src/coreclr/debug/di/shimdatatarget.cpp index a7eca2dacc404c..722e9b10688804 100644 --- a/src/coreclr/debug/di/shimdatatarget.cpp +++ b/src/coreclr/debug/di/shimdatatarget.cpp @@ -38,6 +38,10 @@ HRESULT STDMETHODCALLTYPE ShimDataTarget::QueryInterface( { *pInterface = static_cast(this); } + else if (InterfaceId == IID_ICorDebugDataTarget5) + { + *pInterface = static_cast(this); + } else { *pInterface = NULL; @@ -89,3 +93,44 @@ void ShimDataTarget::HookContinueStatusChanged(FPContinueStatusChanged fpContinu m_fpContinueStatusChanged = fpContinueStatusChanged; m_pContinueStatusChangedUserData = pUserData; } + +//--------------------------------------------------------------------------------------- +// ICorDebugDataTarget5::GetTargetInfo +// +// Reports the processor architecture and operating system of the target process. +// +HRESULT STDMETHODCALLTYPE ShimDataTarget::GetTargetInfo(CorDebugTargetInfo * pTargetInfo) +{ + if (pTargetInfo == NULL) + { + return E_INVALIDARG; + } + +#if defined(_M_IX86) || defined(__i386__) + pTargetInfo->arch = CORDB_ARCH_X86; +#elif defined(_M_X64) || defined(__x86_64__) + pTargetInfo->arch = CORDB_ARCH_AMD64; +#elif defined(_M_ARM) || defined(__arm__) + pTargetInfo->arch = CORDB_ARCH_ARM; +#elif defined(_M_ARM64) || defined(__aarch64__) + pTargetInfo->arch = CORDB_ARCH_ARM64; +#elif defined(__loongarch64) + pTargetInfo->arch = CORDB_ARCH_LOONGARCH64; +#elif defined(__riscv) && (__riscv_xlen == 64) + pTargetInfo->arch = CORDB_ARCH_RISCV64; +#else + pTargetInfo->arch = CORDB_ARCH_UNKNOWN; +#endif + +#if defined(__APPLE__) + pTargetInfo->os = CORDB_OS_MACOS; +#elif defined(__linux__) + pTargetInfo->os = CORDB_OS_LINUX; +#elif defined(_WIN32) + pTargetInfo->os = CORDB_OS_WINDOWS; +#else + pTargetInfo->os = CORDB_OS_UNKNOWN; +#endif + + return S_OK; +} diff --git a/src/coreclr/debug/di/shimdatatarget.h b/src/coreclr/debug/di/shimdatatarget.h index c2e92c217dd6c1..89e0849d9ce054 100644 --- a/src/coreclr/debug/di/shimdatatarget.h +++ b/src/coreclr/debug/di/shimdatatarget.h @@ -19,7 +19,7 @@ typedef HRESULT (*FPContinueStatusChanged)(void * pUserData, DWORD dwThreadId, C //--------------------------------------------------------------------------------------- // Data target for a live process. This is used by Shim. // -class ShimDataTarget : public ICorDebugMutableDataTarget, ICorDebugDataTarget4 +class ShimDataTarget : public ICorDebugMutableDataTarget, ICorDebugDataTarget4, ICorDebugDataTarget5 { public: virtual ~ShimDataTarget() {} @@ -91,6 +91,14 @@ class ShimDataTarget : public ICorDebugMutableDataTarget, ICorDebugDataTarget4 virtual HRESULT STDMETHODCALLTYPE VirtualUnwind( DWORD threadId, ULONG32 contextSize, PBYTE context) = 0; + // + // ICorDebugDataTarget5 + // + + // Get the processor architecture and operating system of the target. + virtual HRESULT STDMETHODCALLTYPE GetTargetInfo( + CorDebugTargetInfo * pTargetInfo); + protected: // Pid of the target process. DWORD m_processId; diff --git a/src/coreclr/dlls/mscordac/mscordac_unixexports.src b/src/coreclr/dlls/mscordac/mscordac_unixexports.src index 479c850b781f4b..7fa6da5b0d9357 100644 --- a/src/coreclr/dlls/mscordac/mscordac_unixexports.src +++ b/src/coreclr/dlls/mscordac/mscordac_unixexports.src @@ -16,6 +16,7 @@ IID_ISequentialStream IID_IStream IID_ICLRDataTarget IID_ICorDebugDataTarget4 +IID_ICorDebugDataTarget5 IID_ICLRDataEnumMemoryRegionsCallback nativeStringResourceTable_mscorrc diff --git a/src/coreclr/inc/cordebug.idl b/src/coreclr/inc/cordebug.idl index 5dfcb037abc5a1..ec83b243cf66a2 100644 --- a/src/coreclr/inc/cordebug.idl +++ b/src/coreclr/inc/cordebug.idl @@ -834,6 +834,60 @@ interface ICorDebugDataTarget4 : IUnknown [in, out, size_is(contextSize)] BYTE *context); }; +/* + * Describes the processor architecture of the target process. + */ +typedef enum CorDebugTargetArchitecture +{ + CORDB_ARCH_UNKNOWN, + CORDB_ARCH_X86, + CORDB_ARCH_AMD64, + CORDB_ARCH_ARM, + CORDB_ARCH_ARM64, + CORDB_ARCH_LOONGARCH64, + CORDB_ARCH_RISCV64, + CORDB_ARCH_WASM +} CorDebugTargetArchitecture; + +/* + * Describes the operating system of the target process. + */ +typedef enum CorDebugTargetOperatingSystem +{ + CORDB_OS_UNKNOWN, + CORDB_OS_WINDOWS, + CORDB_OS_MACOS, + CORDB_OS_LINUX +} CorDebugTargetOperatingSystem; + +/* + * Describes the processor architecture and operating system of the target process. + */ +typedef struct CorDebugTargetInfo +{ + CorDebugTargetArchitecture arch; + CorDebugTargetOperatingSystem os; +} CorDebugTargetInfo; + +/* + * Data target that can report the processor architecture and operating system + * of the target process. + */ +[ + object, + uuid(A5634045-7D7E-4497-A608-44D6BFE4FC28), + local, + pointer_default(unique) +] +interface ICorDebugDataTarget5 : IUnknown +{ + /* + * GetTargetInfo returns the processor architecture and operating system + * of the target process. + */ + HRESULT GetTargetInfo([out] CorDebugTargetInfo * pTargetInfo); +}; + /* * Mutable extension to the data target. This version of ICorDebugDataTarget * can be implemented by targets that wish to support modification of the target diff --git a/src/coreclr/pal/prebuilt/idl/cordebug_i.cpp b/src/coreclr/pal/prebuilt/idl/cordebug_i.cpp index 4748b60c5f1875..1ea4518bc2abc0 100644 --- a/src/coreclr/pal/prebuilt/idl/cordebug_i.cpp +++ b/src/coreclr/pal/prebuilt/idl/cordebug_i.cpp @@ -106,6 +106,9 @@ MIDL_DEFINE_GUID(IID, IID_ICorDebugDataTarget3,0xD05E60C3,0x848C,0x4E7D,0x89,0x4 MIDL_DEFINE_GUID(IID, IID_ICorDebugDataTarget4,0xE799DC06,0xE099,0x4713,0xBD,0xD9,0x90,0x6D,0x3C,0xC0,0x2C,0xF2); +MIDL_DEFINE_GUID(IID, IID_ICorDebugDataTarget5,0xA5634045,0x7D7E,0x4497,0xA6,0x08,0x44,0xD6,0xBF,0xE4,0xFC,0x28); + + MIDL_DEFINE_GUID(IID, IID_ICorDebugMutableDataTarget,0xA1B8A756,0x3CB6,0x4CCB,0x97,0x9F,0x3D,0xF9,0x99,0x67,0x3A,0x59); diff --git a/src/coreclr/pal/prebuilt/inc/cordebug.h b/src/coreclr/pal/prebuilt/inc/cordebug.h index 70b1884fb7eac2..53f0c3768f317a 100644 --- a/src/coreclr/pal/prebuilt/inc/cordebug.h +++ b/src/coreclr/pal/prebuilt/inc/cordebug.h @@ -3124,6 +3124,123 @@ EXTERN_C const IID IID_ICorDebugDataTarget4; #endif /* __ICorDebugDataTarget4_INTERFACE_DEFINED__ */ +/* interface __MIDL_itf_cordebug_ICorDebugDataTarget5 */ +/* [local] */ + +typedef +enum CorDebugTargetArchitecture + { + CORDB_ARCH_UNKNOWN = 0, + CORDB_ARCH_X86 = ( CORDB_ARCH_UNKNOWN + 1 ) , + CORDB_ARCH_AMD64 = ( CORDB_ARCH_X86 + 1 ) , + CORDB_ARCH_ARM = ( CORDB_ARCH_AMD64 + 1 ) , + CORDB_ARCH_ARM64 = ( CORDB_ARCH_ARM + 1 ) , + CORDB_ARCH_LOONGARCH64 = ( CORDB_ARCH_ARM64 + 1 ) , + CORDB_ARCH_RISCV64 = ( CORDB_ARCH_LOONGARCH64 + 1 ) , + CORDB_ARCH_WASM = ( CORDB_ARCH_RISCV64 + 1 ) + } CorDebugTargetArchitecture; + +typedef +enum CorDebugTargetOperatingSystem + { + CORDB_OS_UNKNOWN = 0, + CORDB_OS_WINDOWS = ( CORDB_OS_UNKNOWN + 1 ) , + CORDB_OS_MACOS = ( CORDB_OS_WINDOWS + 1 ) , + CORDB_OS_LINUX = ( CORDB_OS_MACOS + 1 ) + } CorDebugTargetOperatingSystem; + +typedef struct CorDebugTargetInfo + { + CorDebugTargetArchitecture arch; + CorDebugTargetOperatingSystem os; + } CorDebugTargetInfo; + + + +#ifndef __ICorDebugDataTarget5_INTERFACE_DEFINED__ +#define __ICorDebugDataTarget5_INTERFACE_DEFINED__ + +/* interface ICorDebugDataTarget5 */ +/* [unique][local][uuid][object] */ + + +EXTERN_C const IID IID_ICorDebugDataTarget5; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("A5634045-7D7E-4497-A608-44D6BFE4FC28") + ICorDebugDataTarget5 : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE GetTargetInfo( + /* [out] */ CorDebugTargetInfo *pTargetInfo) = 0; + + }; + + +#else /* C style interface */ + + typedef struct ICorDebugDataTarget5Vtbl + { + BEGIN_INTERFACE + + DECLSPEC_XFGVIRT(IUnknown, QueryInterface) + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + ICorDebugDataTarget5 * This, + /* [in] */ REFIID riid, + /* [annotation][iid_is][out] */ + _COM_Outptr_ void **ppvObject); + + DECLSPEC_XFGVIRT(IUnknown, AddRef) + ULONG ( STDMETHODCALLTYPE *AddRef )( + ICorDebugDataTarget5 * This); + + DECLSPEC_XFGVIRT(IUnknown, Release) + ULONG ( STDMETHODCALLTYPE *Release )( + ICorDebugDataTarget5 * This); + + DECLSPEC_XFGVIRT(ICorDebugDataTarget5, GetTargetInfo) + HRESULT ( STDMETHODCALLTYPE *GetTargetInfo )( + ICorDebugDataTarget5 * This, + /* [out] */ CorDebugTargetInfo *pTargetInfo); + + END_INTERFACE + } ICorDebugDataTarget5Vtbl; + + interface ICorDebugDataTarget5 + { + CONST_VTBL struct ICorDebugDataTarget5Vtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define ICorDebugDataTarget5_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define ICorDebugDataTarget5_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define ICorDebugDataTarget5_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define ICorDebugDataTarget5_GetTargetInfo(This,pTargetInfo) \ + ( (This)->lpVtbl -> GetTargetInfo(This,pTargetInfo) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __ICorDebugDataTarget5_INTERFACE_DEFINED__ */ + + #ifndef __ICorDebugMutableDataTarget_INTERFACE_DEFINED__ #define __ICorDebugMutableDataTarget_INTERFACE_DEFINED__ From 7420d8e9b445c1170f1de42e76b48ae0a7d42c5a Mon Sep 17 00:00:00 2001 From: rcj1 Date: Mon, 20 Jul 2026 14:45:42 -0700 Subject: [PATCH 2/2] update --- src/coreclr/debug/di/shimdatatarget.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/coreclr/debug/di/shimdatatarget.cpp b/src/coreclr/debug/di/shimdatatarget.cpp index 722e9b10688804..692a59f4d7cafd 100644 --- a/src/coreclr/debug/di/shimdatatarget.cpp +++ b/src/coreclr/debug/di/shimdatatarget.cpp @@ -106,27 +106,28 @@ HRESULT STDMETHODCALLTYPE ShimDataTarget::GetTargetInfo(CorDebugTargetInfo * pTa return E_INVALIDARG; } -#if defined(_M_IX86) || defined(__i386__) + // host and target are the same for live debugging as of now +#if defined(HOST_X86) pTargetInfo->arch = CORDB_ARCH_X86; -#elif defined(_M_X64) || defined(__x86_64__) +#elif defined(HOST_AMD64) pTargetInfo->arch = CORDB_ARCH_AMD64; -#elif defined(_M_ARM) || defined(__arm__) +#elif defined(HOST_ARM) pTargetInfo->arch = CORDB_ARCH_ARM; -#elif defined(_M_ARM64) || defined(__aarch64__) +#elif defined(HOST_ARM64) pTargetInfo->arch = CORDB_ARCH_ARM64; -#elif defined(__loongarch64) +#elif defined(HOST_LOONGARCH64) pTargetInfo->arch = CORDB_ARCH_LOONGARCH64; -#elif defined(__riscv) && (__riscv_xlen == 64) +#elif defined(HOST_RISCV64) pTargetInfo->arch = CORDB_ARCH_RISCV64; #else pTargetInfo->arch = CORDB_ARCH_UNKNOWN; #endif -#if defined(__APPLE__) +#if defined(HOST_APPLE) pTargetInfo->os = CORDB_OS_MACOS; -#elif defined(__linux__) +#elif defined(HOST_UNIX) pTargetInfo->os = CORDB_OS_LINUX; -#elif defined(_WIN32) +#elif defined(HOST_WINDOWS) pTargetInfo->os = CORDB_OS_WINDOWS; #else pTargetInfo->os = CORDB_OS_UNKNOWN;