ThreadPlanTracer.cpp revision b586767bf7ec45778ef478661fd24ea117ebc321
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
5841ae8125cb49ec90b2a249f4f8d903d24cacea1cJim 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
682b5e4e6bc442fb77e7fe96c459f9ca38d4970ed0Caroline Tice    Stream *stream = GetLogStream();
692b5e4e6bc442fb77e7fe96c459f9ca38d4970ed0Caroline Tice    m_thread.GetStackFrameAtIndex(0)->Dump (stream, show_frame_index, show_fullpaths);
702b5e4e6bc442fb77e7fe96c459f9ca38d4970ed0Caroline Tice    stream->Printf("\n");
712b5e4e6bc442fb77e7fe96c459f9ca38d4970ed0Caroline Tice    stream->Flush();
722b5e4e6bc442fb77e7fe96c459f9ca38d4970ed0Caroline Tice
73745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham}
74745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham
75745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Inghambool
76745ac7a5826fe7c392007941a4046bfb1a8dff81Jim InghamThreadPlanTracer::TracerExplainsStop ()
77745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham{
78745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    if (m_enabled && m_single_step)
79745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    {
80745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham        lldb::StopInfoSP stop_info = m_thread.GetStopInfo();
81745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham        if (stop_info->GetStopReason() == eStopReasonTrace)
82745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham            return true;
83745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham        else
84745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham            return false;
85745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    }
86745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    else
87745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham        return false;
88745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham}
895b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
905b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan#pragma mark ThreadPlanAssemblyTracer
915b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
925b0228a06dedf7d450308a443c255f2d28c247f3Sean CallananThreadPlanAssemblyTracer::ThreadPlanAssemblyTracer (Thread &thread, lldb::StreamSP &stream_sp) :
935b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    ThreadPlanTracer (thread, stream_sp),
945b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    m_process(thread.GetProcess()),
955b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    m_target(thread.GetProcess().GetTarget())
965b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan{
97ae7862a7fa70080e7450174b05544e7673fefb9dJim Ingham    InitializeTracer ();
98ae7862a7fa70080e7450174b05544e7673fefb9dJim Ingham}
99ae7862a7fa70080e7450174b05544e7673fefb9dJim Ingham
100ae7862a7fa70080e7450174b05544e7673fefb9dJim InghamThreadPlanAssemblyTracer::ThreadPlanAssemblyTracer (Thread &thread) :
101ae7862a7fa70080e7450174b05544e7673fefb9dJim Ingham    ThreadPlanTracer (thread),
102ae7862a7fa70080e7450174b05544e7673fefb9dJim Ingham    m_process(thread.GetProcess()),
103ae7862a7fa70080e7450174b05544e7673fefb9dJim Ingham    m_target(thread.GetProcess().GetTarget())
104ae7862a7fa70080e7450174b05544e7673fefb9dJim Ingham{
105ae7862a7fa70080e7450174b05544e7673fefb9dJim Ingham    InitializeTracer ();
106ae7862a7fa70080e7450174b05544e7673fefb9dJim Ingham}
107ae7862a7fa70080e7450174b05544e7673fefb9dJim Ingham
108ae7862a7fa70080e7450174b05544e7673fefb9dJim Inghamvoid
109ae7862a7fa70080e7450174b05544e7673fefb9dJim InghamThreadPlanAssemblyTracer::InitializeTracer()
110ae7862a7fa70080e7450174b05544e7673fefb9dJim Ingham{
111ae7862a7fa70080e7450174b05544e7673fefb9dJim Ingham    Process &process = m_thread.GetProcess();
1125b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    Target &target = process.GetTarget();
1135b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
1145b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    ArchSpec arch(target.GetArchitecture());
1155b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
116149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton    m_disassembler = Disassembler::FindPlugin(arch, NULL);
1175b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
11875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    m_abi = process.GetABI().get();
1195b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
120b01000fd063629facd45044f137446fb748ee179Greg Clayton    ModuleSP exe_module_sp (target.GetExecutableModule());
1215b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
122b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (exe_module_sp)
1235b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    {
124b01000fd063629facd45044f137446fb748ee179Greg Clayton        m_intptr_type = TypeFromUser(exe_module_sp->GetClangASTContext().GetBuiltinTypeForEncodingAndBitSize(eEncodingUint, arch.GetAddressByteSize() * 8),
125b01000fd063629facd45044f137446fb748ee179Greg Clayton                                     exe_module_sp->GetClangASTContext().getASTContext());
1265b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    }
1275b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
1285b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    const unsigned int buf_size = 32;
1295b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
1305b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    m_buffer_sp.reset(new DataBufferHeap(buf_size, 0));
1315b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan}
1325b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
1335b0228a06dedf7d450308a443c255f2d28c247f3Sean CallananThreadPlanAssemblyTracer::~ThreadPlanAssemblyTracer()
1345b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan{
1355b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan}
1365b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
13708d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Claytonvoid
13808d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg ClaytonThreadPlanAssemblyTracer::TracingStarted ()
1395b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan{
14008d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton    RegisterContext *reg_ctx = m_thread.GetRegisterContext().get();
1415b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
1425b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    if (m_register_values.size() == 0)
143b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton        m_register_values.resize (reg_ctx->GetRegisterCount());
1445b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan}
1455b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
14608d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Claytonvoid
14708d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg ClaytonThreadPlanAssemblyTracer::TracingEnded ()
1485b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan{
149b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton    m_register_values.clear();
1505b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan}
1515b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
15208d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Claytonstatic void
15308d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg ClaytonPadOutTo (StreamString &stream, int target)
1545b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan{
1555b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    stream.Flush();
1565b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
1575b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    int length = stream.GetString().length();
1585b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
1595b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    if (length + 1 < target)
16008d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton        stream.Printf("%*s", target - (length + 1) + 1, "");
1615b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan}
1625b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
16308d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Claytonvoid
16408d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg ClaytonThreadPlanAssemblyTracer::Log ()
1655b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan{
1665b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    Stream *stream = GetLogStream ();
1675b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
1685b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    if (!stream)
1695b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        return;
1705b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
17108d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton    RegisterContext *reg_ctx = m_thread.GetRegisterContext().get();
1725b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
1735b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    lldb::addr_t pc = reg_ctx->GetPC();
1745b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    Address pc_addr;
1755b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    bool addr_valid = false;
176b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton
1775b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    addr_valid = m_process.GetTarget().GetSectionLoadList().ResolveLoadAddress (pc, pc_addr);
1785b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
179b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton    pc_addr.Dump(stream, &m_thread, Address::DumpStyleResolvedDescription, Address::DumpStyleModuleWithFileAddress);
180b586767bf7ec45778ef478661fd24ea117ebc321Jim Ingham    stream->PutCString (" ");
1815b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
1825b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    if (m_disassembler)
1835b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    {
184ddff7cca4b3d2507706ed9011e6f0a503b984195Greg Clayton        ::memset(m_buffer_sp->GetBytes(), 0, m_buffer_sp->GetByteSize());
1855b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
1865b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        Error err;
1875b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        m_process.ReadMemory(pc, m_buffer_sp->GetBytes(), m_buffer_sp->GetByteSize(), err);
1885b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
1895b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        if (err.Success())
1905b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        {
1915b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan            DataExtractor extractor(m_buffer_sp,
1925b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan                                    m_process.GetByteOrder(),
1935b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan                                    m_process.GetAddressByteSize());
1945b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
1955b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan            if (addr_valid)
196aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham                m_disassembler->DecodeInstructions (pc_addr, extractor, 0, 1, false);
1975b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan            else
198aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham                m_disassembler->DecodeInstructions (Address (NULL, pc), extractor, 0, 1, false);
1995b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
2005b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan            InstructionList &instruction_list = m_disassembler->GetInstructionList();
201889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton            const uint32_t max_opcode_byte_size = instruction_list.GetMaxOpcocdeByteSize();
202889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton
2035b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan            if (instruction_list.GetSize())
2045b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan            {
205b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                const bool show_bytes = true;
206b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                const bool show_address = true;
2075b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan                Instruction *instruction = instruction_list.GetInstructionAtIndex(0).get();
208b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                instruction->Dump (stream,
209889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton                                   max_opcode_byte_size,
210b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                                   show_address,
211b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                                   show_bytes,
2125b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan                                   NULL,
2135b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan                                   true);
2145b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan            }
2155b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        }
2165b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    }
2175b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
2185b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    if (m_abi && m_intptr_type.GetOpaqueQualType())
2195b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    {
2205b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        ValueList value_list;
2215b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        const int num_args = 1;
2225b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
2235b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        for (int arg_index = 0; arg_index < num_args; ++arg_index)
2245b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        {
2255b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan            Value value;
2265b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan            value.SetValueType (Value::eValueTypeScalar);
2276916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton            value.SetContext (Value::eContextTypeClangType, m_intptr_type.GetOpaqueQualType());
2285b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan            value_list.PushValue (value);
2295b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        }
2305b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
2315b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        if (m_abi->GetArgumentValues (m_thread, value_list))
2325b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        {
2335b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan            for (int arg_index = 0; arg_index < num_args; ++arg_index)
2345b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan            {
235b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                stream->Printf("\n\targ[%d]=%llx", arg_index, value_list.GetValueAtIndex(arg_index)->GetScalar().ULongLong());
2365b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
2375b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan                if (arg_index + 1 < num_args)
238b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                    stream->PutCString (", ");
2395b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan            }
2405b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        }
2415b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    }
2425b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
2435b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
244b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton    RegisterValue reg_value;
245b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton    for (uint32_t reg_num = 0, num_registers = reg_ctx->GetRegisterCount();
246b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton         reg_num < num_registers;
247b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton         ++reg_num)
2485b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    {
249b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton        const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex(reg_num);
250b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton        if (reg_ctx->ReadRegister (reg_info, reg_value))
2515b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        {
252b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton            assert (reg_num < m_register_values.size());
253b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton            if (m_register_values[reg_num].GetType() == RegisterValue::eTypeInvalid ||
254b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                reg_value != m_register_values[reg_num])
255b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton            {
256b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                if (reg_value.GetType() != RegisterValue::eTypeInvalid)
257b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                {
258b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                    stream->PutCString ("\n\t");
259b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                    reg_value.Dump(stream, reg_info, true, false, eFormatDefault);
260b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                }
261b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton            }
262b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton            m_register_values[reg_num] = reg_value;
2635b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        }
2645b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    }
265b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton    stream->EOL();
2662b5e4e6bc442fb77e7fe96c459f9ca38d4970ed0Caroline Tice    stream->Flush();
2675b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan}
268