5
5
using namespace llvm ;
6
6
using namespace lldb ;
7
7
8
- lldb_private::ThreadTask::ThreadTask (tid_t tid, addr_t async_ctx,
9
- ExecutionContext &exe_ctx)
8
+ namespace lldb_private {
9
+
10
+ ThreadTask::ThreadTask (tid_t tid, addr_t async_ctx, ExecutionContext &exe_ctx)
10
11
: Thread(exe_ctx.GetProcessRef(), tid, true ),
11
- m_concrete_reg_ctx_sp (exe_ctx.GetFrameSP()->GetRegisterContext()) {
12
+ m_reg_info_sp (exe_ctx.GetFrameSP()->GetRegisterContext()) {
12
13
m_async_ctx = async_ctx;
13
- auto ptr_size = exe_ctx.GetTargetRef ().GetArchitecture ().GetAddressByteSize ();
14
+ uint32_t ptr_size =
15
+ exe_ctx.GetTargetRef ().GetArchitecture ().GetAddressByteSize ();
14
16
// A simplified description of AsyncContext. See swift/Task/ABI.h
15
17
// struct AsyncContext {
16
18
// AsyncContext *Parent; // offset 0
17
19
// TaskContinuationFunction *ResumeParent; // offset 8
18
20
// };
19
- auto resume_offset = ptr_size; // offsetof(AsyncContext, ResumeParent)
20
- auto resume_ptr = async_ctx + resume_offset;
21
+ uint32_t resume_offset = ptr_size; // offsetof(AsyncContext, ResumeParent)
22
+ uint32_t resume_ptr = async_ctx + resume_offset;
21
23
Status status;
22
- m_pc = exe_ctx.GetProcessRef ().ReadPointerFromMemory (resume_ptr, status);
24
+ m_resume_fn =
25
+ exe_ctx.GetProcessRef ().ReadPointerFromMemory (resume_ptr, status);
23
26
}
24
27
25
28
RegisterContextSP lldb_private::ThreadTask::GetRegisterContext () {
26
29
if (!m_async_reg_ctx_sp)
27
30
m_async_reg_ctx_sp = std::make_shared<RegisterContextTask>(
28
- *this , m_concrete_reg_ctx_sp, m_pc , m_async_ctx);
31
+ *this , m_reg_info_sp, m_resume_fn , m_async_ctx);
29
32
return m_async_reg_ctx_sp;
30
33
}
31
34
32
- lldb_private::RegisterContextTask::RegisterContextTask (
33
- Thread &thread, RegisterContextSP reg_info_sp, addr_t pc, addr_t async_ctx)
35
+ RegisterContextTask::RegisterContextTask (Thread &thread,
36
+ RegisterContextSP reg_info_sp,
37
+ addr_t resume_fn, addr_t async_ctx)
34
38
: RegisterContext(thread, 0 ), m_reg_info_sp(reg_info_sp),
35
- m_async_ctx(async_ctx), m_pc(pc ) {
39
+ m_async_ctx(async_ctx), m_resume_fn(resume_fn ) {
36
40
auto &target = thread.GetProcess ()->GetTarget ();
37
41
auto triple = target.GetArchitecture ().GetTriple ();
38
42
if (auto regnums = GetAsyncUnwindRegisterNumbers (triple.getArch ()))
39
43
m_async_ctx_regnum = regnums->async_ctx_regnum ;
40
44
}
41
45
42
- bool lldb_private::RegisterContextTask::ReadRegister (
43
- const RegisterInfo *reg_info, RegisterValue ®_value) {
46
+ bool RegisterContextTask::ReadRegister (const RegisterInfo *reg_info,
47
+ RegisterValue ®_value) {
48
+ if (!reg_info)
49
+ return false ;
50
+
44
51
if (reg_info->kinds [eRegisterKindGeneric] == LLDB_REGNUM_GENERIC_PC) {
45
- reg_value = m_pc ;
52
+ reg_value = m_resume_fn ;
46
53
return true ;
47
54
}
48
55
if (reg_info->kinds [eRegisterKindLLDB] == m_async_ctx_regnum) {
@@ -51,3 +58,5 @@ bool lldb_private::RegisterContextTask::ReadRegister(
51
58
}
52
59
return false ;
53
60
}
61
+
62
+ } // namespace lldb_private
0 commit comments