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