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
10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h"
11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea
12745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham#include "lldb/Target/ThreadPlan.h"
13745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham
14745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham// C Includes
155b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan#include <string.h>
16745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham// C++ Includes
17745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham// Other libraries and framework includes
18745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham// Project includes
195b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan#include "lldb/Core/ArchSpec.h"
205b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan#include "lldb/Core/DataBufferHeap.h"
21745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham#include "lldb/Core/Debugger.h"
225b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan#include "lldb/Core/Disassembler.h"
23745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham#include "lldb/Core/Log.h"
2449ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/Module.h"
25745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham#include "lldb/Core/State.h"
265b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan#include "lldb/Core/Value.h"
275b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan#include "lldb/Symbol/TypeList.h"
28745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham#include "lldb/Target/RegisterContext.h"
29745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham#include "lldb/Target/Thread.h"
30745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham#include "lldb/Target/Process.h"
31745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham#include "lldb/Target/Target.h"
32745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham
33745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Inghamusing namespace lldb;
34745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Inghamusing namespace lldb_private;
35745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham
365b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan#pragma mark ThreadPlanTracer
375b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
38745ac7a5826fe7c392007941a4046bfb1a8dff81Jim InghamThreadPlanTracer::ThreadPlanTracer (Thread &thread, lldb::StreamSP &stream_sp) :
39dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_thread (thread),
40745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    m_single_step(true),
41745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    m_enabled (false),
42745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    m_stream_sp (stream_sp)
43745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham{
44745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham}
45745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham
46745ac7a5826fe7c392007941a4046bfb1a8dff81Jim InghamThreadPlanTracer::ThreadPlanTracer (Thread &thread) :
47dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_thread (thread),
48745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    m_single_step(true),
49745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    m_enabled (false),
50745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    m_stream_sp ()
51745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham{
52745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham}
53745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham
54745ac7a5826fe7c392007941a4046bfb1a8dff81Jim InghamStream *
55745ac7a5826fe7c392007941a4046bfb1a8dff81Jim InghamThreadPlanTracer::GetLogStream ()
56745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham{
57745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham
58745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    if (m_stream_sp.get())
59745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham        return m_stream_sp.get();
60745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    else
61f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    {
62f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        TargetSP target_sp (m_thread.CalculateTarget());
63f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        if (target_sp)
64f4124deeb9532044a38c0774ced872f2709347daGreg Clayton            return &target_sp->GetDebugger().GetOutputStream();
65f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    }
66f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    return NULL;
67745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham}
68745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham
69745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Inghamvoid
70745ac7a5826fe7c392007941a4046bfb1a8dff81Jim InghamThreadPlanTracer::Log()
71745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham{
72745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    SymbolContext sc;
73745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    bool show_frame_index = false;
74745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    bool show_fullpaths = false;
75745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham
762b5e4e6bc442fb77e7fe96c459f9ca38d4970ed0Caroline Tice    Stream *stream = GetLogStream();
776f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham    if (stream)
786f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham    {
796f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham        m_thread.GetStackFrameAtIndex(0)->Dump (stream, show_frame_index, show_fullpaths);
806f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham        stream->Printf("\n");
816f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham        stream->Flush();
826f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham    }
832b5e4e6bc442fb77e7fe96c459f9ca38d4970ed0Caroline Tice
84745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham}
85745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham
86745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Inghambool
87745ac7a5826fe7c392007941a4046bfb1a8dff81Jim InghamThreadPlanTracer::TracerExplainsStop ()
88745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham{
89745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    if (m_enabled && m_single_step)
90745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    {
91745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham        lldb::StopInfoSP stop_info = m_thread.GetStopInfo();
92745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham        if (stop_info->GetStopReason() == eStopReasonTrace)
93745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham            return true;
94745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham        else
95745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham            return false;
96745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    }
97745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    else
98745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham        return false;
99745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham}
1005b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
1015b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan#pragma mark ThreadPlanAssemblyTracer
1025b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
1035b0228a06dedf7d450308a443c255f2d28c247f3Sean CallananThreadPlanAssemblyTracer::ThreadPlanAssemblyTracer (Thread &thread, lldb::StreamSP &stream_sp) :
1045b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    ThreadPlanTracer (thread, stream_sp),
1054f28c31e4b652a842ce6138b70ded44ffb3e8c48Sean Callanan    m_disassembler_sp (),
106c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    m_intptr_type (),
107c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    m_register_values ()
1085b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan{
109ae7862a7fa70080e7450174b05544e7673fefb9dJim Ingham}
110ae7862a7fa70080e7450174b05544e7673fefb9dJim Ingham
111ae7862a7fa70080e7450174b05544e7673fefb9dJim InghamThreadPlanAssemblyTracer::ThreadPlanAssemblyTracer (Thread &thread) :
112ae7862a7fa70080e7450174b05544e7673fefb9dJim Ingham    ThreadPlanTracer (thread),
1134f28c31e4b652a842ce6138b70ded44ffb3e8c48Sean Callanan    m_disassembler_sp (),
114c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    m_intptr_type (),
115c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    m_register_values ()
116ae7862a7fa70080e7450174b05544e7673fefb9dJim Ingham{
117ae7862a7fa70080e7450174b05544e7673fefb9dJim Ingham}
118ae7862a7fa70080e7450174b05544e7673fefb9dJim Ingham
119c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonDisassembler *
120c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonThreadPlanAssemblyTracer::GetDisassembler ()
121ae7862a7fa70080e7450174b05544e7673fefb9dJim Ingham{
1224f28c31e4b652a842ce6138b70ded44ffb3e8c48Sean Callanan    if (m_disassembler_sp.get() == NULL)
1237d4083837c5a258375fdc185d464b4ed15759a4bJim Ingham        m_disassembler_sp = Disassembler::FindPlugin(m_thread.GetProcess()->GetTarget().GetArchitecture(), NULL, NULL);
1244f28c31e4b652a842ce6138b70ded44ffb3e8c48Sean Callanan    return m_disassembler_sp.get();
125c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton}
126c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton
127c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonTypeFromUser
128c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonThreadPlanAssemblyTracer::GetIntPointerType()
129c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{
130c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    if (!m_intptr_type.IsValid ())
1315b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    {
132f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        TargetSP target_sp (m_thread.CalculateTarget());
133f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        if (target_sp)
134c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton        {
135f4124deeb9532044a38c0774ced872f2709347daGreg Clayton            Module *exe_module = target_sp->GetExecutableModulePointer();
136f4124deeb9532044a38c0774ced872f2709347daGreg Clayton
137f4124deeb9532044a38c0774ced872f2709347daGreg Clayton            if (exe_module)
138f4124deeb9532044a38c0774ced872f2709347daGreg Clayton            {
13952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                m_intptr_type = TypeFromUser(exe_module->GetClangASTContext().GetBuiltinTypeForEncodingAndBitSize(eEncodingUint, target_sp->GetArchitecture().GetAddressByteSize() * 8));
140f4124deeb9532044a38c0774ced872f2709347daGreg Clayton            }
141c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton        }
1425b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    }
143c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    return m_intptr_type;
1445b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan}
1455b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
146c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton
147c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton
1485b0228a06dedf7d450308a443c255f2d28c247f3Sean CallananThreadPlanAssemblyTracer::~ThreadPlanAssemblyTracer()
1495b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan{
1505b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan}
1515b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
15208d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Claytonvoid
15308d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg ClaytonThreadPlanAssemblyTracer::TracingStarted ()
1545b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan{
15508d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton    RegisterContext *reg_ctx = m_thread.GetRegisterContext().get();
1565b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
1575b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    if (m_register_values.size() == 0)
158b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton        m_register_values.resize (reg_ctx->GetRegisterCount());
1595b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan}
1605b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
16108d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Claytonvoid
16208d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg ClaytonThreadPlanAssemblyTracer::TracingEnded ()
1635b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan{
164b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton    m_register_values.clear();
1655b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan}
1665b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
16708d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Claytonstatic void
16808d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg ClaytonPadOutTo (StreamString &stream, int target)
1695b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan{
1705b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    stream.Flush();
1715b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
1725b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    int length = stream.GetString().length();
1735b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
1745b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    if (length + 1 < target)
17508d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton        stream.Printf("%*s", target - (length + 1) + 1, "");
1765b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan}
1775b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
17808d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Claytonvoid
17908d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg ClaytonThreadPlanAssemblyTracer::Log ()
1805b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan{
1815b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    Stream *stream = GetLogStream ();
1825b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
1835b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    if (!stream)
1845b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        return;
1855b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
18608d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton    RegisterContext *reg_ctx = m_thread.GetRegisterContext().get();
1875b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
1885b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    lldb::addr_t pc = reg_ctx->GetPC();
189f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    ProcessSP process_sp (m_thread.GetProcess());
1905b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    Address pc_addr;
1915b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    bool addr_valid = false;
192c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    uint8_t buffer[16] = {0}; // Must be big enough for any single instruction
193f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    addr_valid = process_sp->GetTarget().GetSectionLoadList().ResolveLoadAddress (pc, pc_addr);
1945b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
195b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton    pc_addr.Dump(stream, &m_thread, Address::DumpStyleResolvedDescription, Address::DumpStyleModuleWithFileAddress);
196b586767bf7ec45778ef478661fd24ea117ebc321Jim Ingham    stream->PutCString (" ");
1975b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
198c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    Disassembler *disassembler = GetDisassembler();
199c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    if (disassembler)
2005b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    {
2015b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        Error err;
202f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        process_sp->ReadMemory(pc, buffer, sizeof(buffer), err);
2035b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
2045b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        if (err.Success())
2055b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        {
206c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton            DataExtractor extractor(buffer, sizeof(buffer),
207f4124deeb9532044a38c0774ced872f2709347daGreg Clayton                                    process_sp->GetByteOrder(),
208f4124deeb9532044a38c0774ced872f2709347daGreg Clayton                                    process_sp->GetAddressByteSize());
2095b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
210d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton			bool data_from_file = false;
2115b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan            if (addr_valid)
212d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton                disassembler->DecodeInstructions (pc_addr, extractor, 0, 1, false, data_from_file);
2135b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan            else
214d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton                disassembler->DecodeInstructions (Address (pc), extractor, 0, 1, false, data_from_file);
2155b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
216c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton            InstructionList &instruction_list = disassembler->GetInstructionList();
217889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton            const uint32_t max_opcode_byte_size = instruction_list.GetMaxOpcocdeByteSize();
218889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton
2195b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan            if (instruction_list.GetSize())
2205b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan            {
221b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                const bool show_bytes = true;
222b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                const bool show_address = true;
2235b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan                Instruction *instruction = instruction_list.GetInstructionAtIndex(0).get();
224b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                instruction->Dump (stream,
225889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton                                   max_opcode_byte_size,
226b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                                   show_address,
227b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                                   show_bytes,
2280fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton                                   NULL);
2295b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan            }
2305b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        }
2315b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    }
2325b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
233f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    const ABI *abi = process_sp->GetABI().get();
234c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    TypeFromUser intptr_type = GetIntPointerType();
235c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton
236c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    if (abi && intptr_type.IsValid())
2375b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    {
2385b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        ValueList value_list;
2395b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        const int num_args = 1;
2405b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
2415b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        for (int arg_index = 0; arg_index < num_args; ++arg_index)
2425b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        {
2435b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan            Value value;
2445b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan            value.SetValueType (Value::eValueTypeScalar);
24552f792329be5db8e38961350589e97e8f2823acdGreg Clayton//            value.SetContext (Value::eContextTypeClangType, intptr_type.GetOpaqueQualType());
24652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            value.SetClangType (intptr_type);
2475b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan            value_list.PushValue (value);
2485b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        }
2495b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
250c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton        if (abi->GetArgumentValues (m_thread, value_list))
2515b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        {
2525b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan            for (int arg_index = 0; arg_index < num_args; ++arg_index)
2535b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan            {
254b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                stream->Printf("\n\targ[%d]=%llx", arg_index, value_list.GetValueAtIndex(arg_index)->GetScalar().ULongLong());
2555b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
2565b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan                if (arg_index + 1 < num_args)
257b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                    stream->PutCString (", ");
2585b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan            }
2595b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        }
2605b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    }
2615b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
2625b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan
263b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton    RegisterValue reg_value;
264b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton    for (uint32_t reg_num = 0, num_registers = reg_ctx->GetRegisterCount();
265b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton         reg_num < num_registers;
266b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton         ++reg_num)
2675b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    {
268b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton        const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex(reg_num);
269b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton        if (reg_ctx->ReadRegister (reg_info, reg_value))
2705b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        {
271b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton            assert (reg_num < m_register_values.size());
272b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton            if (m_register_values[reg_num].GetType() == RegisterValue::eTypeInvalid ||
273b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                reg_value != m_register_values[reg_num])
274b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton            {
275b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                if (reg_value.GetType() != RegisterValue::eTypeInvalid)
276b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                {
277b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                    stream->PutCString ("\n\t");
278b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                    reg_value.Dump(stream, reg_info, true, false, eFormatDefault);
279b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton                }
280b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton            }
281b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton            m_register_values[reg_num] = reg_value;
2825b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan        }
2835b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan    }
284b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton    stream->EOL();
2852b5e4e6bc442fb77e7fe96c459f9ca38d4970ed0Caroline Tice    stream->Flush();
2865b0228a06dedf7d450308a443c255f2d28c247f3Sean Callanan}
287