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