File: Contracts\GCInfo\PlatformTraits\WasmGCInfoTraits.cs
Web Access
Project: Microsoft.Diagnostics.DataContractReader.Contracts.csproj (Microsoft.Diagnostics.DataContractReader.Contracts)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.Diagnostics;

namespace Microsoft.Diagnostics.DataContractReader.Contracts.GCInfoHelpers;

// Mirrors Wasm32GcInfoEncoding in src/coreclr/inc/gcinfotypes.h.
internal sealed class WasmGCInfoTraits : IGCInfoTraits
{
    public static uint DenormalizeStackBaseRegister(uint reg) => reg;
    public static uint DenormalizeCodeLength(uint len) => len;
    public static uint NormalizeCodeLength(uint len) => len;
    public static uint DenormalizeCodeOffset(uint offset) => offset;
    public static uint NormalizeCodeOffset(uint offset) => offset;
    public static int DenormalizeStackSlot(int value) => value;
    public static uint DenormalizeSizeOfStackArea(uint size) => size;

    public static int GENERICS_INST_CONTEXT_STACK_SLOT_ENCBASE => 6;
    public static int GS_COOKIE_STACK_SLOT_ENCBASE => 6;
    public static int CODE_LENGTH_ENCBASE => 6;
    public static int STACK_BASE_REGISTER_ENCBASE => 3;
    public static int SIZE_OF_STACK_AREA_ENCBASE => 6;
    public static int SIZE_OF_EDIT_AND_CONTINUE_PRESERVED_AREA_ENCBASE => 3;
    public static int SIZE_OF_EDIT_AND_CONTINUE_FIXED_STACK_FRAME_ENCBASE => 0;
    public static int REVERSE_PINVOKE_FRAME_ENCBASE => 6;
    public static int NUM_REGISTERS_ENCBASE => 3;
    public static int NUM_STACK_SLOTS_ENCBASE => 5;
    public static int NUM_UNTRACKED_SLOTS_ENCBASE => 5;
    public static int NORM_PROLOG_SIZE_ENCBASE => 4;
    public static int NORM_EPILOG_SIZE_ENCBASE => 3;
    public static int INTERRUPTIBLE_RANGE_DELTA1_ENCBASE => 5;
    public static int INTERRUPTIBLE_RANGE_DELTA2_ENCBASE => 5;
    public static int REGISTER_ENCBASE => 3;
    public static int REGISTER_DELTA_ENCBASE => 3;
    public static int STACK_SLOT_ENCBASE => 6;
    public static int STACK_SLOT_DELTA_ENCBASE => 4;
    public static int NUM_SAFE_POINTS_ENCBASE => 4;
    public static int NUM_INTERRUPTIBLE_RANGES_ENCBASE => 1;
    public static bool HAS_FIXED_STACK_PARAMETER_SCRATCH_AREA => false;
    public static bool HAS_INTERRUPTIBLE_RANGES => false;

    // Valid Wasm GC info has no register slots; RyuJIT never emits one. Mirror the
    // native fallback (gcinfodecoder.cpp PORTABILITY_ASSERT): flag the unexpected
    // call in debug builds and otherwise return false, like other unimplemented platforms.
    public static bool IsScratchRegister(uint regNum)
    {
        Debug.Fail("Wasm GC info must not contain register slots.");
        return false;
    }
}