Skip to content

Commit 5d9317a

Browse files
author
Max Charlamb
committed
crossplatform LazyMachState fixes
1 parent 22a3c9a commit 5d9317a

File tree

4 files changed

+23
-12
lines changed

4 files changed

+23
-12
lines changed

src/coreclr/debug/runtimeinfo/datadescriptor.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -602,16 +602,14 @@ DEFINE_FRAME_TYPE(HelperMethodFrame_3OBJ)
602602
DEFINE_FRAME_TYPE(HelperMethodFrame_PROTECTOBJ)
603603
#undef DEFINE_FRAME_TYPE
604604

605+
#ifdef TARGET_AMD64
605606
CDAC_TYPE_BEGIN(LazyMachState)
606607
CDAC_TYPE_SIZE(sizeof(LazyMachState))
607608
CDAC_TYPE_FIELD(LazyMachState, /*pointer*/, InstructionPointer, cdac_data<LazyMachState>::InstructionPointer)
608609
CDAC_TYPE_FIELD(LazyMachState, /*pointer*/, StackPointer, cdac_data<LazyMachState>::StackPointer)
609610
CDAC_TYPE_FIELD(LazyMachState, /*pointer*/, ReturnAddress, cdac_data<LazyMachState>::ReturnAddress)
610-
CDAC_TYPE_FIELD(LazyMachState, /*pointer*/, CapturedInstructionPointer, offsetof(LazyMachState, m_CaptureRip))
611-
CDAC_TYPE_FIELD(LazyMachState, /*pointer*/, CapturedStackPointer, offsetof(LazyMachState, m_CaptureRsp))
612-
CDAC_TYPE_FIELD(LazyMachState, /*CalleeSavedRegisters*/, CalleeSavedRegisters, cdac_data<LazyMachState>::CalleeSavedRegisters)
613-
CDAC_TYPE_FIELD(LazyMachState, /*CalleeSavedRegistersPointers*/, CalleeSavedRegistersPointers, cdac_data<LazyMachState>::CalleeSavedRegistersPointers)
614611
CDAC_TYPE_END(LazyMachState)
612+
#endif // TARGET_AMD64
615613

616614
CDAC_TYPES_END()
617615

src/coreclr/vm/amd64/gmscpu.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,6 @@ struct cdac_data<LazyMachState>
125125
static constexpr size_t InstructionPointer = offsetof(LazyMachState, m_Rip);
126126
static constexpr size_t StackPointer = offsetof(LazyMachState, m_Rsp);
127127
static constexpr size_t ReturnAddress = offsetof(LazyMachState, _pRetAddr);
128-
static constexpr size_t CalleeSavedRegisters = offsetof(LazyMachState, m_Capture);
129-
static constexpr size_t CalleeSavedRegistersPointers = offsetof(LazyMachState, m_Ptrs);
130128
};
131129

132130
inline void LazyMachState::setLazyStateFromUnwind(MachState* copy)

src/native/managed/cdacreader/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/FrameIterator.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,12 @@ public static bool TryGetContext(Target target, Data.Frame frame, [NotNullWhen(t
3939
case DataType.HelperMethodFrame_3OBJ:
4040
case DataType.HelperMethodFrame_PROTECTOBJ:
4141
Data.HelperMethodFrame helperMethodFrame = target.ProcessedData.GetOrAdd<Data.HelperMethodFrame>(frame.Address);
42+
if (helperMethodFrame.LazyMachState.StackPointer is null || helperMethodFrame.LazyMachState.InstructionPointer is null)
43+
{
44+
IP = null;
45+
SP = null;
46+
return false;
47+
}
4248
IP = helperMethodFrame.LazyMachState.InstructionPointer;
4349
SP = helperMethodFrame.LazyMachState.StackPointer;
4450
return true;

src/native/managed/cdacreader/Microsoft.Diagnostics.DataContractReader.Contracts/Data/Frames/LazyMachState.cs

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,21 @@ static LazyMachState IData<LazyMachState>.Create(Target target, TargetPointer ad
1414
public LazyMachState(Target target, TargetPointer address)
1515
{
1616
Target.TypeInfo type = target.GetTypeInfo(DataType.LazyMachState);
17-
InstructionPointer = target.ReadPointer(address + (ulong)type.Fields[nameof(InstructionPointer)].Offset);
18-
StackPointer = target.ReadPointer(address + (ulong)type.Fields[nameof(StackPointer)].Offset);
19-
ReturnAddress = target.ReadPointer(address + (ulong)type.Fields[nameof(ReturnAddress)].Offset);
17+
if (type.Fields.ContainsKey(nameof(InstructionPointer)))
18+
{
19+
InstructionPointer = target.ReadPointer(address + (ulong)type.Fields[nameof(InstructionPointer)].Offset);
20+
}
21+
if (type.Fields.ContainsKey(nameof(StackPointer)))
22+
{
23+
StackPointer = target.ReadPointer(address + (ulong)type.Fields[nameof(StackPointer)].Offset);
24+
}
25+
if (type.Fields.ContainsKey(nameof(ReturnAddress)))
26+
{
27+
ReturnAddress = target.ReadPointer(address + (ulong)type.Fields[nameof(ReturnAddress)].Offset);
28+
}
2029
}
2130

22-
public TargetPointer InstructionPointer { get; }
23-
public TargetPointer StackPointer { get; }
24-
public TargetPointer ReturnAddress { get; }
31+
public TargetPointer? InstructionPointer { get; }
32+
public TargetPointer? StackPointer { get; }
33+
public TargetPointer? ReturnAddress { get; }
2534
}

0 commit comments

Comments
 (0)