Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions src/coreclr/debug/daccess/dacdbiimpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7392,6 +7392,42 @@ HRESULT STDMETHODCALLTYPE DacDbiInterfaceImpl::GetGenericArgTokenIndex(VMPTR_Met
return S_OK;
}

HRESULT STDMETHODCALLTYPE DacDbiInterfaceImpl::GetTargetInfo(OUT TargetInfo * pTargetInfo)
{
DD_ENTER_MAY_THROW;

if (pTargetInfo == NULL)
return E_INVALIDARG;

#if defined(TARGET_X86)
pTargetInfo->arch = kArchX86;
#elif defined(TARGET_AMD64)
pTargetInfo->arch = kArchAMD64;
#elif defined(TARGET_ARM)
pTargetInfo->arch = kArchArm;
#elif defined(TARGET_ARM64)
pTargetInfo->arch = kArchArm64;
#elif defined(TARGET_LOONGARCH64)
pTargetInfo->arch = kArchLoongArch64;
#elif defined(TARGET_RISCV64)
pTargetInfo->arch = kArchRiscV64;
#elif defined(TARGET_WASM)
pTargetInfo->arch = kArchWasm;
#else
Comment on lines +7414 to +7416
pTargetInfo->arch = kArchUnknown;
#endif

#if defined(TARGET_UNIX)
pTargetInfo->os = kOSUnix;
#elif defined(TARGET_WINDOWS)
pTargetInfo->os = kOSWindows;
#else
pTargetInfo->os = kOSUnknown;
#endif

return S_OK;
}

DacRefWalker::DacRefWalker(ClrDataAccess *dac, BOOL walkStacks, UINT32 handleMask, BOOL resolvePointers)
: mDac(dac), mWalkStacks(walkStacks), mHandleMask(handleMask), mStackWalker(NULL),
mResolvePointers(resolvePointers), mHandleWalker(NULL)
Expand Down
2 changes: 2 additions & 0 deletions src/coreclr/debug/daccess/dacdbiimpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,8 @@ class DacDbiInterfaceImpl :
HRESULT STDMETHODCALLTYPE EnumerateAsyncLocals(VMPTR_MethodDesc vmMethod, CORDB_ADDRESS codeAddr, UINT32 state, FP_ASYNC_LOCAL_CALLBACK fpCallback, CALLBACK_DATA pUserData);
HRESULT STDMETHODCALLTYPE GetGenericArgTokenIndex(VMPTR_MethodDesc vmMethod, OUT UINT32* pIndex);

HRESULT STDMETHODCALLTYPE GetTargetInfo(OUT TargetInfo * pTargetInfo);

private:
void TypeHandleToExpandedTypeInfoImpl(AreValueTypesBoxed boxed,
TypeHandle typeHandle,
Expand Down
28 changes: 28 additions & 0 deletions src/coreclr/debug/inc/dacdbiinterface.h
Original file line number Diff line number Diff line change
Expand Up @@ -2203,6 +2203,34 @@ IDacDbiInterface : public IUnknown
VMPTR_MethodDesc vmMethod,
OUT UINT32* pTokenIndex) = 0;

typedef enum
{
kArchUnknown = 0,
kArchX86,
kArchAMD64,
kArchArm,
kArchArm64,
kArchLoongArch64,
kArchRiscV64,
kArchWasm,
} TargetArchitecture;
Comment on lines +2215 to +2216

typedef enum
{
kOSUnknown = 0,
kOSWindows,
kOSUnix,
} TargetOperatingSystem;

struct TargetInfo
{
TargetArchitecture arch;
TargetOperatingSystem os;
};

// Returns the target's processor architecture and OS family.
virtual HRESULT STDMETHODCALLTYPE GetTargetInfo(OUT TargetInfo * pTargetInfo) = 0;

// The following tag tells the DD-marshalling tool to stop scanning.
// END_MARSHAL

Expand Down
4 changes: 4 additions & 0 deletions src/coreclr/inc/dacdbi.idl
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ typedef struct { void *pList; int nEntries; } DacDbiArrayList_CORDB_ADDRESS;
typedef struct { void *pList; int nEntries; } DacDbiArrayList_GUID;
typedef struct { void *pList; int nEntries; } DacDbiArrayList_COR_SEGMENT;
typedef struct { void *pList; int nEntries; } DacDbiArrayList_COR_MEMORY_RANGE;
typedef struct { int arch; int os; } TargetInfo;

cpp_quote("#endif")

Expand Down Expand Up @@ -436,4 +437,7 @@ interface IDacDbiInterface : IUnknown

// Generic Arg Token
HRESULT GetGenericArgTokenIndex([in] VMPTR_MethodDesc vmMethod, [out] UINT32 * pTokenIndex);

// Returns the target's processor architecture and OS family.
HRESULT GetTargetInfo([out] struct TargetInfo * pTargetInfo);
};
Original file line number Diff line number Diff line change
Expand Up @@ -5611,6 +5611,56 @@ public int GetGenericArgTokenIndex(ulong vmMethod, uint* pIndex)
return hr;
}

public int GetTargetInfo(TargetInfo* pTargetInfo)
{
int hr = HResults.S_OK;
Comment on lines +5614 to +5616
try
{
if (pTargetInfo is null)
throw new ArgumentNullException(nameof(pTargetInfo));

Contracts.IRuntimeInfo runtimeInfo = _target.Contracts.RuntimeInfo;

Comment on lines +5621 to +5623
pTargetInfo->Arch = runtimeInfo.GetTargetArchitecture() switch
{
Contracts.RuntimeInfoArchitecture.X86 => TargetArchitecture.X86,
Contracts.RuntimeInfoArchitecture.X64 => TargetArchitecture.AMD64,
Contracts.RuntimeInfoArchitecture.Arm => TargetArchitecture.Arm,
Contracts.RuntimeInfoArchitecture.Arm64 => TargetArchitecture.Arm64,
Contracts.RuntimeInfoArchitecture.LoongArch64 => TargetArchitecture.LoongArch64,
Contracts.RuntimeInfoArchitecture.RiscV64 => TargetArchitecture.RiscV64,
Contracts.RuntimeInfoArchitecture.Wasm => TargetArchitecture.Wasm,
_ => TargetArchitecture.Unknown,
};

pTargetInfo->OS = runtimeInfo.GetTargetOperatingSystem() switch
{
Contracts.RuntimeInfoOperatingSystem.Windows => TargetOperatingSystem.Windows,
Contracts.RuntimeInfoOperatingSystem.Unix => TargetOperatingSystem.Unix,
Contracts.RuntimeInfoOperatingSystem.Apple => TargetOperatingSystem.Unix,
_ => TargetOperatingSystem.Unknown,
};
}
catch (System.Exception ex)
{
hr = ex.HResult;
}
#if DEBUG
if (_legacy is not null)
{
TargetInfo targetInfoLocal;
int hrLocal = _legacy.GetTargetInfo(&targetInfoLocal);
Debug.ValidateHResult(hr, hrLocal);
if (hr == HResults.S_OK)
{
Debug.Assert(pTargetInfo->Arch == targetInfoLocal.Arch, $"cDAC: {pTargetInfo->Arch}, DAC: {targetInfoLocal.Arch}");
Debug.Assert(pTargetInfo->OS == targetInfoLocal.OS, $"cDAC: {pTargetInfo->OS}, DAC: {targetInfoLocal.OS}");
}
}
#endif
return hr;
}

// Fills a DebuggerIPCE_ExpandedTypeData entry for a single type parameter, falling back to System.__Canon on failure.
private void FillExpandedTypeDataWithCanonFallback(IRuntimeTypeSystem rts, TypeHandle typeHandle, TypeHandle thCanon, DebuggerIPCE_ExpandedTypeData* pTypeInfo)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -799,4 +799,32 @@ int EnumerateAsyncLocals(ulong vmMethod, ulong codeAddr, uint state,

[PreserveSig]
int GetGenericArgTokenIndex(ulong vmMethod, uint* pIndex);

[PreserveSig]
int GetTargetInfo(TargetInfo* pTargetInfo);
}

public enum TargetArchitecture
{
Unknown = 0,
X86,
AMD64,
Arm,
Arm64,
LoongArch64,
RiscV64,
Wasm,
}
Comment on lines +816 to +817

public enum TargetOperatingSystem
{
Unknown = 0,
Windows,
Unix,
}

public struct TargetInfo
{
public TargetArchitecture Arch;
public TargetOperatingSystem OS;
}
Loading