ThreadPlanTracer.cpp revision b9e8f6e7a374d9313f89193e90ae41ef91712e5b
1745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham//===-- ThreadPlan.cpp ------------------------------------------*- C++ -*-===//
2745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham//
3745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham//                     The LLVM Compiler Infrastructure
4745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham//
5745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham// This file is distributed under the University of Illinois Open Source
6745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham// License. See LICENSE.TXT for details.
7745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham//
8745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham//===----------------------------------------------------------------------===//
9745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham
10745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham#include "lldb/Target/ThreadPlan.h"
11745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham
12745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham// C Includes
135b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan#include <string.h>
14745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham// C++ Includes
15745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham// Other libraries and framework includes
16745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham// Project includes
175b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan#include "lldb/Core/ArchSpec.h"
185b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan#include "lldb/Core/DataBufferHeap.h"
19745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham#include "lldb/Core/Debugger.h"
205b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan#include "lldb/Core/Disassembler.h"
21745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham#include "lldb/Core/Log.h"
22745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham#include "lldb/Core/State.h"
235b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan#include "lldb/Core/Value.h"
245b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan#include "lldb/Symbol/TypeList.h"
25745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham#include "lldb/Target/RegisterContext.h"
26745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham#include "lldb/Target/Thread.h"
27745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham#include "lldb/Target/Process.h"
28745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham#include "lldb/Target/Target.h"
29745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham
30745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Inghamusing namespace lldb;
31745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Inghamusing namespace lldb_private;
32745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham
335b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan#pragma mark ThreadPlanTracer
345b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
35745ac7a5826fe7c392007941a4046bfb1a8dff81Jim InghamThreadPlanTracer::ThreadPlanTracer (Thread &thread, lldb::StreamSP &stream_sp) :
36dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_thread (thread),
37745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    m_single_step(true),
38745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    m_enabled (false),
39745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    m_stream_sp (stream_sp)
40745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham{
41745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham}
42745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham
43745ac7a5826fe7c392007941a4046bfb1a8dff81Jim InghamThreadPlanTracer::ThreadPlanTracer (Thread &thread) :
44dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_thread (thread),
45745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    m_single_step(true),
46745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    m_enabled (false),
47745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    m_stream_sp ()
48745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham{
49745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham}
50745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham
51745ac7a5826fe7c392007941a4046bfb1a8dff81Jim InghamStream *
52745ac7a5826fe7c392007941a4046bfb1a8dff81Jim InghamThreadPlanTracer::GetLogStream ()
53745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham{
54745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham
55745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    if (m_stream_sp.get())
56745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham        return m_stream_sp.get();
57745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    else
58745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham        return &(m_thread.GetProcess().GetTarget().GetDebugger().GetOutputStream());
59745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham}
60745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham
61745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Inghamvoid
62745ac7a5826fe7c392007941a4046bfb1a8dff81Jim InghamThreadPlanTracer::Log()
63745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham{
64745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    SymbolContext sc;
65745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    bool show_frame_index = false;
66745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    bool show_fullpaths = false;
67745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham
68745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    m_thread.GetStackFrameAtIndex(0)->Dump (GetLogStream(), show_frame_index, show_fullpaths);
69745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    GetLogStream()->Printf("\n");
70745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham}
71745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham
72745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Inghambool
73745ac7a5826fe7c392007941a4046bfb1a8dff81Jim InghamThreadPlanTracer::TracerExplainsStop ()
74745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham{
75745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    if (m_enabled && m_single_step)
76745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    {
77745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham        lldb::StopInfoSP stop_info = m_thread.GetStopInfo();
78745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham        if (stop_info->GetStopReason() == eStopReasonTrace)
79745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham            return true;
80745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham        else
81745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham            return false;
82745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    }
83745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    else
84745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham        return false;
85745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham}
865b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
875b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan#pragma mark ThreadPlanAssemblyTracer
885b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
895b0228a06dedf7d450308a443c255f2d28c247f3Sean CallananThreadPlanAssemblyTracer::ThreadPlanAssemblyTracer (Thread &thread, lldb::StreamSP &stream_sp) :
905b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    ThreadPlanTracer (thread, stream_sp),
915b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    m_process(thread.GetProcess()),
925b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    m_target(thread.GetProcess().GetTarget())
935b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan{
94ae7862a7fa70080e7450174b05544e7673fefb9dJim Ingham    InitializeTracer ();
95ae7862a7fa70080e7450174b05544e7673fefb9dJim Ingham}
96ae7862a7fa70080e7450174b05544e7673fefb9dJim Ingham
97ae7862a7fa70080e7450174b05544e7673fefb9dJim InghamThreadPlanAssemblyTracer::ThreadPlanAssemblyTracer (Thread &thread) :
98ae7862a7fa70080e7450174b05544e7673fefb9dJim Ingham    ThreadPlanTracer (thread),
99ae7862a7fa70080e7450174b05544e7673fefb9dJim Ingham    m_process(thread.GetProcess()),
100ae7862a7fa70080e7450174b05544e7673fefb9dJim Ingham    m_target(thread.GetProcess().GetTarget())
101ae7862a7fa70080e7450174b05544e7673fefb9dJim Ingham{
102ae7862a7fa70080e7450174b05544e7673fefb9dJim Ingham    InitializeTracer ();
103ae7862a7fa70080e7450174b05544e7673fefb9dJim Ingham}
104ae7862a7fa70080e7450174b05544e7673fefb9dJim Ingham
105ae7862a7fa70080e7450174b05544e7673fefb9dJim Inghamvoid
106ae7862a7fa70080e7450174b05544e7673fefb9dJim InghamThreadPlanAssemblyTracer::InitializeTracer()
107ae7862a7fa70080e7450174b05544e7673fefb9dJim Ingham{
108ae7862a7fa70080e7450174b05544e7673fefb9dJim Ingham    Process &process = m_thread.GetProcess();
1095b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    Target &target = process.GetTarget();
1105b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
1115b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    ArchSpec arch(target.GetArchitecture());
1125b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
113149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton    m_disassembler = Disassembler::FindPlugin(arch, NULL);
1145b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
11575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    m_abi = process.GetABI().get();
1165b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
117b01000fd063629facd45044f137446fb748ee179Greg Clayton    ModuleSP exe_module_sp (target.GetExecutableModule());
1185b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
119b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (exe_module_sp)
1205b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    {
121b01000fd063629facd45044f137446fb748ee179Greg Clayton        m_intptr_type = TypeFromUser(exe_module_sp->GetClangASTContext().GetBuiltinTypeForEncodingAndBitSize(eEncodingUint, arch.GetAddressByteSize() * 8),
122b01000fd063629facd45044f137446fb748ee179Greg Clayton                                     exe_module_sp->GetClangASTContext().getASTContext());
1235b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    }
1245b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
1255b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    const unsigned int buf_size = 32;
1265b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
1275b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    m_buffer_sp.reset(new DataBufferHeap(buf_size, 0));
1285b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan}
1295b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
1305b0228a06dedf7d450308a443c255f2d28c247f3Sean CallananThreadPlanAssemblyTracer::~ThreadPlanAssemblyTracer()
1315b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan{
1325b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan}
1335b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
13408d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Claytonvoid
13508d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg ClaytonThreadPlanAssemblyTracer::TracingStarted ()
1365b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan{
13708d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton    RegisterContext *reg_ctx = m_thread.GetRegisterContext().get();
1385b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
1395b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    if (m_register_values.size() == 0)
140b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton        m_register_values.resize (reg_ctx->GetRegisterCount());
1415b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan}
1425b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
14308d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Claytonvoid
14408d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg ClaytonThreadPlanAssemblyTracer::TracingEnded ()
1455b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan{
146b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton    m_register_values.clear();
1475b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan}
1485b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
14908d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Claytonstatic void
15008d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg ClaytonPadOutTo (StreamString &stream, int target)
1515b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan{
1525b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    stream.Flush();
1535b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
1545b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    int length = stream.GetString().length();
1555b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
1565b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    if (length + 1 < target)
15708d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton        stream.Printf("%*s", target - (length + 1) + 1, "");
1585b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan}
1595b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
16008d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Claytonvoid
16108d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg ClaytonThreadPlanAssemblyTracer::Log ()
1625b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan{
1635b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    Stream *stream = GetLogStream ();
1645b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
1655b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    if (!stream)
1665b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        return;
1675b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
16808d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton    RegisterContext *reg_ctx = m_thread.GetRegisterContext().get();
1695b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
1705b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    lldb::addr_t pc = reg_ctx->GetPC();
1715b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    Address pc_addr;
1725b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    bool addr_valid = false;
173b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton
1745b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    addr_valid = m_process.GetTarget().GetSectionLoadList().ResolveLoadAddress (pc, pc_addr);
1755b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
176b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton    pc_addr.Dump(stream, &m_thread, Address::DumpStyleResolvedDescription, Address::DumpStyleModuleWithFileAddress);
1775b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
1785b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    if (m_disassembler)
1795b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    {
180ddff7cca4b3d2507706ed9011e6f0a503b984195Greg Clayton        ::memset(m_buffer_sp->GetBytes(), 0, m_buffer_sp->GetByteSize());
1815b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
1825b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        Error err;
1835b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        m_process.ReadMemory(pc, m_buffer_sp->GetBytes(), m_buffer_sp->GetByteSize(), err);
1845b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
1855b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        if (err.Success())
1865b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        {
1875b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan            DataExtractor extractor(m_buffer_sp,
1885b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan                                    m_process.GetByteOrder(),
1895b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan                                    m_process.GetAddressByteSize());
1905b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
1915b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan            if (addr_valid)
192aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham                m_disassembler->DecodeInstructions (pc_addr, extractor, 0, 1, false);
1935b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan            else
194aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham                m_disassembler->DecodeInstructions (Address (NULL, pc), extractor, 0, 1, false);
1955b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
1965b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan            InstructionList &instruction_list = m_disassembler->GetInstructionList();
197889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton            const uint32_t max_opcode_byte_size = instruction_list.GetMaxOpcocdeByteSize();
198889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton
1995b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan            if (instruction_list.GetSize())
2005b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan            {
201b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                const bool show_bytes = true;
202b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                const bool show_address = true;
2035b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan                Instruction *instruction = instruction_list.GetInstructionAtIndex(0).get();
204b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                instruction->Dump (stream,
205889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton                                   max_opcode_byte_size,
206b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                                   show_address,
207b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                                   show_bytes,
2085b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan                                   NULL,
2095b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan                                   true);
2105b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan            }
2115b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        }
2125b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    }
2135b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
2145b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    if (m_abi && m_intptr_type.GetOpaqueQualType())
2155b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    {
2165b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        ValueList value_list;
2175b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        const int num_args = 1;
2185b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
2195b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        for (int arg_index = 0; arg_index < num_args; ++arg_index)
2205b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        {
2215b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan            Value value;
2225b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan            value.SetValueType (Value::eValueTypeScalar);
2236916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton            value.SetContext (Value::eContextTypeClangType, m_intptr_type.GetOpaqueQualType());
2245b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan            value_list.PushValue (value);
2255b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        }
2265b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
2275b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        if (m_abi->GetArgumentValues (m_thread, value_list))
2285b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        {
2295b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan            for (int arg_index = 0; arg_index < num_args; ++arg_index)
2305b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan            {
231b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                stream->Printf("\n\targ[%d]=%llx", arg_index, value_list.GetValueAtIndex(arg_index)->GetScalar().ULongLong());
2325b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
2335b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan                if (arg_index + 1 < num_args)
234b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                    stream->PutCString (", ");
2355b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan            }
2365b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        }
2375b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    }
2385b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
2395b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
240b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton    RegisterValue reg_value;
241b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton    for (uint32_t reg_num = 0, num_registers = reg_ctx->GetRegisterCount();
242b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton         reg_num < num_registers;
243b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton         ++reg_num)
2445b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    {
245b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton        const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex(reg_num);
246b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton        if (reg_ctx->ReadRegister (reg_info, reg_value))
2475b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        {
248b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton            assert (reg_num < m_register_values.size());
249b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton            if (m_register_values[reg_num].GetType() == RegisterValue::eTypeInvalid ||
250b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                reg_value != m_register_values[reg_num])
251b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton            {
252b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                if (reg_value.GetType() != RegisterValue::eTypeInvalid)
253b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                {
254b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                    stream->PutCString ("\n\t");
255b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                    reg_value.Dump(stream, reg_info, true, false, eFormatDefault);
256b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                }
257b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton            }
258b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton            m_register_values[reg_num] = reg_value;
2595b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        }
2605b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    }
261b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton    stream->EOL();
2625b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan}
263