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