124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Disassembler.cpp ----------------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h" 11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Disassembler.h" 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Error.h" 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/DataBufferHeap.h" 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/DataExtractor.h" 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Debugger.h" 23080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice#include "lldb/Core/EmulateInstruction.h" 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h" 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/PluginManager.h" 26dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice#include "lldb/Core/RegularExpression.h" 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h" 2873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#include "lldb/Interpreter/OptionValue.h" 2973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#include "lldb/Interpreter/OptionValueArray.h" 3073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#include "lldb/Interpreter/OptionValueDictionary.h" 3173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#include "lldb/Interpreter/OptionValueString.h" 3273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#include "lldb/Interpreter/OptionValueUInt64.h" 333e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean Callanan#include "lldb/Symbol/ClangNamespaceDecl.h" 3449ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/Function.h" 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h" 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ExecutionContext.h" 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h" 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/StackFrame.h" 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Target.h" 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define DEFAULT_DISASM_BYTE_SIZE 32 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 474f28c31e4b652a842ce6138b70ded44ffb3e8c48Sean CallananDisassemblerSP 487d4083837c5a258375fdc185d464b4ed15759a4bJim InghamDisassembler::FindPlugin (const ArchSpec &arch, const char *flavor, const char *plugin_name) 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer (__PRETTY_FUNCTION__, 51149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton "Disassembler::FindPlugin (arch = %s, plugin_name = %s)", 52149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton arch.GetArchitectureName(), 53149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton plugin_name); 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 55149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton DisassemblerCreateInstance create_callback = NULL; 56149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton 57149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton if (plugin_name) 58149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton { 590e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton ConstString const_plugin_name (plugin_name); 600e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton create_callback = PluginManager::GetDisassemblerCreateCallbackForPluginName (const_plugin_name); 61149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton if (create_callback) 62149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton { 637d4083837c5a258375fdc185d464b4ed15759a4bJim Ingham DisassemblerSP disassembler_sp(create_callback(arch, flavor)); 64149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton 654f28c31e4b652a842ce6138b70ded44ffb3e8c48Sean Callanan if (disassembler_sp.get()) 664f28c31e4b652a842ce6138b70ded44ffb3e8c48Sean Callanan return disassembler_sp; 67149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton } 68149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton } 69149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton else 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 71149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton for (uint32_t idx = 0; (create_callback = PluginManager::GetDisassemblerCreateCallbackAtIndex(idx)) != NULL; ++idx) 72149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton { 737d4083837c5a258375fdc185d464b4ed15759a4bJim Ingham DisassemblerSP disassembler_sp(create_callback(arch, flavor)); 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 754f28c31e4b652a842ce6138b70ded44ffb3e8c48Sean Callanan if (disassembler_sp.get()) 764f28c31e4b652a842ce6138b70ded44ffb3e8c48Sean Callanan return disassembler_sp; 77149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton } 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 794f28c31e4b652a842ce6138b70ded44ffb3e8c48Sean Callanan return DisassemblerSP(); 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 827d4083837c5a258375fdc185d464b4ed15759a4bJim InghamDisassemblerSP 837d4083837c5a258375fdc185d464b4ed15759a4bJim InghamDisassembler::FindPluginForTarget(const TargetSP target_sp, const ArchSpec &arch, const char *flavor, const char *plugin_name) 847d4083837c5a258375fdc185d464b4ed15759a4bJim Ingham{ 857d4083837c5a258375fdc185d464b4ed15759a4bJim Ingham if (target_sp && flavor == NULL) 867d4083837c5a258375fdc185d464b4ed15759a4bJim Ingham { 877d4083837c5a258375fdc185d464b4ed15759a4bJim Ingham // FIXME - we don't have the mechanism in place to do per-architecture settings. But since we know that for now 887d4083837c5a258375fdc185d464b4ed15759a4bJim Ingham // we only support flavors on x86 & x86_64, 897d4083837c5a258375fdc185d464b4ed15759a4bJim Ingham if (arch.GetTriple().getArch() == llvm::Triple::x86 907d4083837c5a258375fdc185d464b4ed15759a4bJim Ingham || arch.GetTriple().getArch() == llvm::Triple::x86_64) 917d4083837c5a258375fdc185d464b4ed15759a4bJim Ingham flavor = target_sp->GetDisassemblyFlavor(); 927d4083837c5a258375fdc185d464b4ed15759a4bJim Ingham } 937d4083837c5a258375fdc185d464b4ed15759a4bJim Ingham return FindPlugin(arch, flavor, plugin_name); 947d4083837c5a258375fdc185d464b4ed15759a4bJim Ingham} 957d4083837c5a258375fdc185d464b4ed15759a4bJim Ingham 96704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton 97889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Claytonstatic void 98889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg ClaytonResolveAddress (const ExecutionContext &exe_ctx, 99889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton const Address &addr, 100889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton Address &resolved_addr) 101889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton{ 102889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton if (!addr.IsSectionOffset()) 103889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { 104889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton // If we weren't passed in a section offset address range, 105889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton // try and resolve it to something 106567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 107567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target) 108889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { 109567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target->GetSectionLoadList().IsEmpty()) 110889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { 111567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton target->GetImages().ResolveFileAddress (addr.GetOffset(), resolved_addr); 112889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton } 113889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton else 114889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { 115567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton target->GetSectionLoadList().ResolveLoadAddress (addr.GetOffset(), resolved_addr); 116889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton } 117889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton // We weren't able to resolve the address, just treat it as a 118889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton // raw address 119889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton if (resolved_addr.IsValid()) 120889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton return; 121889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton } 122889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton } 123889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton resolved_addr = addr; 124889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton} 125704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton 126704363531ee4877ccc6d35d0702876096f54c67bGreg Claytonsize_t 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDisassembler::Disassemble 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 12963094e0bb161580564954dee512955c1c79d3476Greg Clayton Debugger &debugger, 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ArchSpec &arch, 131149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton const char *plugin_name, 1327d4083837c5a258375fdc185d464b4ed15759a4bJim Ingham const char *flavor, 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ExecutionContext &exe_ctx, 134704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton SymbolContextList &sc_list, 135aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham uint32_t num_instructions, 136704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton uint32_t num_mixed_context_lines, 1374bb0f19c87ee5d3d3ee3cfa6402564587f72dd37Greg Clayton uint32_t options, 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Stream &strm 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 141704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton size_t success_count = 0; 142704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton const size_t count = sc_list.GetSize(); 143704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton SymbolContext sc; 144704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton AddressRange range; 145ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton const uint32_t scope = eSymbolContextBlock | eSymbolContextFunction | eSymbolContextSymbol; 146ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton const bool use_inline_block_range = true; 147704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton for (size_t i=0; i<count; ++i) 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 149704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton if (sc_list.GetContextAtIndex(i, sc) == false) 150704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton break; 151ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton for (uint32_t range_idx = 0; sc.GetAddressRange(scope, range_idx, use_inline_block_range, range); ++range_idx) 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 153149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton if (Disassemble (debugger, 154149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton arch, 155149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton plugin_name, 1567d4083837c5a258375fdc185d464b4ed15759a4bJim Ingham flavor, 157149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton exe_ctx, 158149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton range, 159149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton num_instructions, 160149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton num_mixed_context_lines, 1614bb0f19c87ee5d3d3ee3cfa6402564587f72dd37Greg Clayton options, 162149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton strm)) 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 164704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton ++success_count; 165704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton strm.EOL(); 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 167704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton } 168704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton } 169704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton return success_count; 170704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton} 171704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton 172704363531ee4877ccc6d35d0702876096f54c67bGreg Claytonbool 173704363531ee4877ccc6d35d0702876096f54c67bGreg ClaytonDisassembler::Disassemble 174704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton( 175704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton Debugger &debugger, 176704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton const ArchSpec &arch, 177149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton const char *plugin_name, 1787d4083837c5a258375fdc185d464b4ed15759a4bJim Ingham const char *flavor, 179704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton const ExecutionContext &exe_ctx, 180704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton const ConstString &name, 181704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton Module *module, 182aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham uint32_t num_instructions, 183704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton uint32_t num_mixed_context_lines, 1844bb0f19c87ee5d3d3ee3cfa6402564587f72dd37Greg Clayton uint32_t options, 185704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton Stream &strm 186704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton) 187704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton{ 188704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton SymbolContextList sc_list; 18928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (name) 190704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton { 19128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton const bool include_symbols = true; 192302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan const bool include_inlines = true; 19328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (module) 19428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 1953e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean Callanan module->FindFunctions (name, 1963e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean Callanan NULL, 19783d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton eFunctionNameTypeAuto, 19828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton include_symbols, 199302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan include_inlines, 20028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton true, 20128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton sc_list); 20228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 203567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (exe_ctx.GetTargetPtr()) 20428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 205567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx.GetTargetPtr()->GetImages().FindFunctions (name, 20683d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton eFunctionNameTypeAuto, 207302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan include_symbols, 208302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan include_inlines, 209567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton false, 210567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton sc_list); 211704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton } 212704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton } 21328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton 21428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton if (sc_list.GetSize ()) 21528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton { 21628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton return Disassemble (debugger, 21728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton arch, 218149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton plugin_name, 2197d4083837c5a258375fdc185d464b4ed15759a4bJim Ingham flavor, 22028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton exe_ctx, 221aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham sc_list, 222aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham num_instructions, 22328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton num_mixed_context_lines, 2244bb0f19c87ee5d3d3ee3cfa6402564587f72dd37Greg Clayton options, 22528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton strm); 22628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton } 227704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton return false; 228704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton} 229704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton 2305c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton 2315c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Claytonlldb::DisassemblerSP 2325c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg ClaytonDisassembler::DisassembleRange 2335c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton( 2345c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton const ArchSpec &arch, 235149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton const char *plugin_name, 2367d4083837c5a258375fdc185d464b4ed15759a4bJim Ingham const char *flavor, 2375c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton const ExecutionContext &exe_ctx, 2385c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton const AddressRange &range 2395c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton) 2405c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton{ 2415c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton lldb::DisassemblerSP disasm_sp; 2425c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton if (range.GetByteSize() > 0 && range.GetBaseAddress().IsValid()) 2435c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton { 2447d4083837c5a258375fdc185d464b4ed15759a4bJim Ingham disasm_sp = Disassembler::FindPluginForTarget(exe_ctx.GetTargetSP(), arch, flavor, plugin_name); 2455c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton 2465c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton if (disasm_sp) 2475c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton { 248d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton const bool prefer_file_cache = false; 249d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton size_t bytes_disassembled = disasm_sp->ParseInstructions (&exe_ctx, range, NULL, prefer_file_cache); 2505c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton if (bytes_disassembled == 0) 2515c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton disasm_sp.reset(); 2525c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton } 2535c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton } 2545c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton return disasm_sp; 2555c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton} 2565c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton 257ef1f690aa23e81a14654d4a6fe9df7810f4eda06Sean Callananlldb::DisassemblerSP 258d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg ClaytonDisassembler::DisassembleBytes (const ArchSpec &arch, 259d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton const char *plugin_name, 260d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton const char *flavor, 261d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton const Address &start, 262d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton const void *src, 263d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton size_t src_len, 264d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton uint32_t num_instructions, 265d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton bool data_from_file) 266ef1f690aa23e81a14654d4a6fe9df7810f4eda06Sean Callanan{ 267ef1f690aa23e81a14654d4a6fe9df7810f4eda06Sean Callanan lldb::DisassemblerSP disasm_sp; 268ef1f690aa23e81a14654d4a6fe9df7810f4eda06Sean Callanan 269d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton if (src) 270ef1f690aa23e81a14654d4a6fe9df7810f4eda06Sean Callanan { 2717d4083837c5a258375fdc185d464b4ed15759a4bJim Ingham disasm_sp = Disassembler::FindPlugin(arch, flavor, plugin_name); 272ef1f690aa23e81a14654d4a6fe9df7810f4eda06Sean Callanan 273ef1f690aa23e81a14654d4a6fe9df7810f4eda06Sean Callanan if (disasm_sp) 274ef1f690aa23e81a14654d4a6fe9df7810f4eda06Sean Callanan { 275d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton DataExtractor data(src, src_len, arch.GetByteOrder(), arch.GetAddressByteSize()); 276ef1f690aa23e81a14654d4a6fe9df7810f4eda06Sean Callanan 277ef1f690aa23e81a14654d4a6fe9df7810f4eda06Sean Callanan (void)disasm_sp->DecodeInstructions (start, 278ef1f690aa23e81a14654d4a6fe9df7810f4eda06Sean Callanan data, 279ef1f690aa23e81a14654d4a6fe9df7810f4eda06Sean Callanan 0, 280a989307c1ec2ef9cd52ec65fb2c877bb2df3aa3aGreg Clayton num_instructions, 281d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton false, 282d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton data_from_file); 283ef1f690aa23e81a14654d4a6fe9df7810f4eda06Sean Callanan } 284ef1f690aa23e81a14654d4a6fe9df7810f4eda06Sean Callanan } 285ef1f690aa23e81a14654d4a6fe9df7810f4eda06Sean Callanan 286ef1f690aa23e81a14654d4a6fe9df7810f4eda06Sean Callanan return disasm_sp; 287ef1f690aa23e81a14654d4a6fe9df7810f4eda06Sean Callanan} 288ef1f690aa23e81a14654d4a6fe9df7810f4eda06Sean Callanan 2895c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton 290704363531ee4877ccc6d35d0702876096f54c67bGreg Claytonbool 291704363531ee4877ccc6d35d0702876096f54c67bGreg ClaytonDisassembler::Disassemble 292704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton( 293704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton Debugger &debugger, 294704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton const ArchSpec &arch, 295149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton const char *plugin_name, 2967d4083837c5a258375fdc185d464b4ed15759a4bJim Ingham const char *flavor, 297704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton const ExecutionContext &exe_ctx, 298704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton const AddressRange &disasm_range, 299aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham uint32_t num_instructions, 300704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton uint32_t num_mixed_context_lines, 3014bb0f19c87ee5d3d3ee3cfa6402564587f72dd37Greg Clayton uint32_t options, 302704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton Stream &strm 303704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton) 304704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton{ 305704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton if (disasm_range.GetByteSize()) 306704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton { 3077d4083837c5a258375fdc185d464b4ed15759a4bJim Ingham lldb::DisassemblerSP disasm_sp (Disassembler::FindPluginForTarget(exe_ctx.GetTargetSP(), arch, flavor, plugin_name)); 308704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton 3094f28c31e4b652a842ce6138b70ded44ffb3e8c48Sean Callanan if (disasm_sp.get()) 310704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton { 311889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton AddressRange range; 312889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton ResolveAddress (exe_ctx, disasm_range.GetBaseAddress(), range.GetBaseAddress()); 313889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton range.SetByteSize (disasm_range.GetByteSize()); 314d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton const bool prefer_file_cache = false; 315d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton size_t bytes_disassembled = disasm_sp->ParseInstructions (&exe_ctx, range, &strm, prefer_file_cache); 31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bytes_disassembled == 0) 31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 318149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton 319bc16b9273326b81dc4aae022389a9f8c3bdca66dJim Ingham bool result = PrintInstructions (disasm_sp.get(), 320bc16b9273326b81dc4aae022389a9f8c3bdca66dJim Ingham debugger, 321bc16b9273326b81dc4aae022389a9f8c3bdca66dJim Ingham arch, 322bc16b9273326b81dc4aae022389a9f8c3bdca66dJim Ingham exe_ctx, 323bc16b9273326b81dc4aae022389a9f8c3bdca66dJim Ingham num_instructions, 324bc16b9273326b81dc4aae022389a9f8c3bdca66dJim Ingham num_mixed_context_lines, 325bc16b9273326b81dc4aae022389a9f8c3bdca66dJim Ingham options, 326bc16b9273326b81dc4aae022389a9f8c3bdca66dJim Ingham strm); 327bc16b9273326b81dc4aae022389a9f8c3bdca66dJim Ingham 328bc16b9273326b81dc4aae022389a9f8c3bdca66dJim Ingham // FIXME: The DisassemblerLLVMC has a reference cycle and won't go away if it has any active instructions. 329bc16b9273326b81dc4aae022389a9f8c3bdca66dJim Ingham // I'll fix that but for now, just clear the list and it will go away nicely. 330bc16b9273326b81dc4aae022389a9f8c3bdca66dJim Ingham disasm_sp->GetInstructionList().Clear(); 331bc16b9273326b81dc4aae022389a9f8c3bdca66dJim Ingham return result; 332aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham } 333aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham } 334aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham return false; 335aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham} 336aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham 337aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Inghambool 338aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim InghamDisassembler::Disassemble 339aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham( 340aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham Debugger &debugger, 341aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham const ArchSpec &arch, 342149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton const char *plugin_name, 3437d4083837c5a258375fdc185d464b4ed15759a4bJim Ingham const char *flavor, 344aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham const ExecutionContext &exe_ctx, 345aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham const Address &start_address, 346aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham uint32_t num_instructions, 347aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham uint32_t num_mixed_context_lines, 3484bb0f19c87ee5d3d3ee3cfa6402564587f72dd37Greg Clayton uint32_t options, 349aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham Stream &strm 350aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham) 351aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham{ 352aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham if (num_instructions > 0) 353aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham { 354d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton lldb::DisassemblerSP disasm_sp (Disassembler::FindPluginForTarget(exe_ctx.GetTargetSP(), 355d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton arch, 356d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton flavor, 357d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton plugin_name)); 3584f28c31e4b652a842ce6138b70ded44ffb3e8c48Sean Callanan if (disasm_sp.get()) 359aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham { 360889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton Address addr; 361889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton ResolveAddress (exe_ctx, start_address, addr); 362d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton const bool prefer_file_cache = false; 363d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton size_t bytes_disassembled = disasm_sp->ParseInstructions (&exe_ctx, 364d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton addr, 365d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton num_instructions, 366d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton prefer_file_cache); 367aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham if (bytes_disassembled == 0) 368aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham return false; 369bc16b9273326b81dc4aae022389a9f8c3bdca66dJim Ingham bool result = PrintInstructions (disasm_sp.get(), 370bc16b9273326b81dc4aae022389a9f8c3bdca66dJim Ingham debugger, 371bc16b9273326b81dc4aae022389a9f8c3bdca66dJim Ingham arch, 372bc16b9273326b81dc4aae022389a9f8c3bdca66dJim Ingham exe_ctx, 373bc16b9273326b81dc4aae022389a9f8c3bdca66dJim Ingham num_instructions, 374bc16b9273326b81dc4aae022389a9f8c3bdca66dJim Ingham num_mixed_context_lines, 375bc16b9273326b81dc4aae022389a9f8c3bdca66dJim Ingham options, 376bc16b9273326b81dc4aae022389a9f8c3bdca66dJim Ingham strm); 377bc16b9273326b81dc4aae022389a9f8c3bdca66dJim Ingham 378bc16b9273326b81dc4aae022389a9f8c3bdca66dJim Ingham // FIXME: The DisassemblerLLVMC has a reference cycle and won't go away if it has any active instructions. 379bc16b9273326b81dc4aae022389a9f8c3bdca66dJim Ingham // I'll fix that but for now, just clear the list and it will go away nicely. 380bc16b9273326b81dc4aae022389a9f8c3bdca66dJim Ingham disasm_sp->GetInstructionList().Clear(); 381bc16b9273326b81dc4aae022389a9f8c3bdca66dJim Ingham return result; 382aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham } 383aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham } 384aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham return false; 385aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham} 386aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham 387aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Inghambool 388aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim InghamDisassembler::PrintInstructions 389aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham( 390aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham Disassembler *disasm_ptr, 391aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham Debugger &debugger, 392aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham const ArchSpec &arch, 393aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham const ExecutionContext &exe_ctx, 394aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham uint32_t num_instructions, 395aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham uint32_t num_mixed_context_lines, 3964bb0f19c87ee5d3d3ee3cfa6402564587f72dd37Greg Clayton uint32_t options, 397aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham Stream &strm 398aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham) 399aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham{ 400aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham // We got some things disassembled... 401aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham size_t num_instructions_found = disasm_ptr->GetInstructionList().GetSize(); 402704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton 403aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham if (num_instructions > 0 && num_instructions < num_instructions_found) 404aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham num_instructions_found = num_instructions; 405aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham 406889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton const uint32_t max_opcode_byte_size = disasm_ptr->GetInstructionList().GetMaxOpcocdeByteSize (); 407aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham uint32_t offset = 0; 408aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham SymbolContext sc; 409aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham SymbolContext prev_sc; 410aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham AddressRange sc_range; 411107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton const Address *pc_addr_ptr = NULL; 412ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton ExecutionContextScope *exe_scope = exe_ctx.GetBestExecutionContextScope(); 413567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 414567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 41528dafe0e9a1d05e68fd5d30d86968dd7c465a890Michael Sartain TargetSP target_sp (exe_ctx.GetTargetSP()); 41628dafe0e9a1d05e68fd5d30d86968dd7c465a890Michael Sartain SourceManager &source_manager = target_sp ? target_sp->GetSourceManager() : debugger.GetSourceManager(); 41728dafe0e9a1d05e68fd5d30d86968dd7c465a890Michael Sartain 418567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (frame) 419567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton pc_addr_ptr = &frame->GetFrameCodeAddress(); 420ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton const uint32_t scope = eSymbolContextLineEntry | eSymbolContextFunction | eSymbolContextSymbol; 421ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton const bool use_inline_block_range = false; 422aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham for (size_t i=0; i<num_instructions_found; ++i) 423aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham { 424aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham Instruction *inst = disasm_ptr->GetInstructionList().GetInstructionAtIndex (i).get(); 425aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham if (inst) 426aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham { 42724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton const Address &addr = inst->GetAddress(); 42824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton const bool inst_is_at_pc = pc_addr_ptr && addr == *pc_addr_ptr; 429aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham 430aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham prev_sc = sc; 431aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham 4323508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton ModuleSP module_sp (addr.GetModule()); 4333508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton if (module_sp) 434aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham { 4353508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton uint32_t resolved_mask = module_sp->ResolveSymbolContextForAddress(addr, eSymbolContextEverything, sc); 436aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham if (resolved_mask) 43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 43824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (num_mixed_context_lines) 43924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 44024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (!sc_range.ContainsFileAddress (addr)) 44124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 442ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton sc.GetAddressRange (scope, 0, use_inline_block_range, sc_range); 44324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 44424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (sc != prev_sc) 44524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 44624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (offset != 0) 44724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton strm.EOL(); 44824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 449567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton sc.DumpStopContext(&strm, exe_ctx.GetProcessPtr(), addr, false, true, false); 45024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton strm.EOL(); 45124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 45224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (sc.comp_unit && sc.line_entry.IsValid()) 45324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 45428dafe0e9a1d05e68fd5d30d86968dd7c465a890Michael Sartain source_manager.DisplaySourceLinesWithLineNumbers (sc.line_entry.file, 45528dafe0e9a1d05e68fd5d30d86968dd7c465a890Michael Sartain sc.line_entry.line, 45628dafe0e9a1d05e68fd5d30d86968dd7c465a890Michael Sartain num_mixed_context_lines, 45728dafe0e9a1d05e68fd5d30d86968dd7c465a890Michael Sartain num_mixed_context_lines, 45828dafe0e9a1d05e68fd5d30d86968dd7c465a890Michael Sartain ((inst_is_at_pc && (options & eOptionMarkPCSourceLine)) ? "->" : ""), 45928dafe0e9a1d05e68fd5d30d86968dd7c465a890Michael Sartain &strm); 46024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 46124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 46224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 46324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 464e957039b969ca482a95882952e107a85cf4b6c00Greg Clayton else if ((sc.function || sc.symbol) && (sc.function != prev_sc.function || sc.symbol != prev_sc.symbol)) 46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 466aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham if (prev_sc.function || prev_sc.symbol) 467aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham strm.EOL(); 468704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton 469ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton bool show_fullpaths = false; 470ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton bool show_module = true; 471ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton bool show_inlined_frames = true; 472ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton sc.DumpStopContext (&strm, 473ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton exe_scope, 474ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton addr, 475ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton show_fullpaths, 476ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton show_module, 477ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton show_inlined_frames); 478aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham 479aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham strm << ":\n"; 480aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham } 48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 482aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham else 483aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham { 484a7e864cb0a450c7ef65b6f9f6c9bae839c405906Greg Clayton sc.Clear(true); 485aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham } 48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 487aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham 4886377f5c7a1c7ac62488abc597e12a38861fcd716Greg Clayton if ((options & eOptionMarkPCAddress) && pc_addr_ptr) 48924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 4906377f5c7a1c7ac62488abc597e12a38861fcd716Greg Clayton strm.PutCString(inst_is_at_pc ? "-> " : " "); 49124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 4924bb0f19c87ee5d3d3ee3cfa6402564587f72dd37Greg Clayton const bool show_bytes = (options & eOptionShowBytes) != 0; 4930fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton inst->Dump(&strm, max_opcode_byte_size, true, show_bytes, &exe_ctx); 49424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton strm.EOL(); 495aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham } 496aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham else 497aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham { 498aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham break; 49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 501aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham 502aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham return true; 50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 505704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton 506704363531ee4877ccc6d35d0702876096f54c67bGreg Claytonbool 507704363531ee4877ccc6d35d0702876096f54c67bGreg ClaytonDisassembler::Disassemble 508704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton( 509704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton Debugger &debugger, 510704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton const ArchSpec &arch, 511149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton const char *plugin_name, 5127d4083837c5a258375fdc185d464b4ed15759a4bJim Ingham const char *flavor, 513704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton const ExecutionContext &exe_ctx, 514aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham uint32_t num_instructions, 515704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton uint32_t num_mixed_context_lines, 5164bb0f19c87ee5d3d3ee3cfa6402564587f72dd37Greg Clayton uint32_t options, 517704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton Stream &strm 518704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton) 519704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton{ 520704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton AddressRange range; 521567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 522567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (frame) 523704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton { 524567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextSymbol)); 525704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton if (sc.function) 526704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton { 527704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton range = sc.function->GetAddressRange(); 528704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton } 5290c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton else if (sc.symbol && sc.symbol->ValueIsAddress()) 530704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton { 5310c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton range.GetBaseAddress() = sc.symbol->GetAddress(); 5320c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton range.SetByteSize (sc.symbol->GetByteSize()); 533704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton } 534704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton else 535704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton { 536567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton range.GetBaseAddress() = frame->GetFrameCodeAddress(); 537704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton } 538704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton 539704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton if (range.GetBaseAddress().IsValid() && range.GetByteSize() == 0) 540704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton range.SetByteSize (DEFAULT_DISASM_BYTE_SIZE); 541704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton } 542704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton 543149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton return Disassemble (debugger, 544149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton arch, 545149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton plugin_name, 5467d4083837c5a258375fdc185d464b4ed15759a4bJim Ingham flavor, 547149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton exe_ctx, 548149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton range, 549149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton num_instructions, 550149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton num_mixed_context_lines, 5514bb0f19c87ee5d3d3ee3cfa6402564587f72dd37Greg Clayton options, 552149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton strm); 553704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton} 554704363531ee4877ccc6d35d0702876096f54c67bGreg Clayton 555889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg ClaytonInstruction::Instruction(const Address &address, AddressClass addr_class) : 556149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton m_address (address), 557889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton m_address_class (addr_class), 5588da54895e662fd7c83d620c00dd1407c994d7dc7Sean Callanan m_opcode(), 5598da54895e662fd7c83d620c00dd1407c994d7dc7Sean Callanan m_calculated_strings(false) 5607bc390873f7c1c798c36c8003c4b82597f67c703Greg Clayton{ 56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5635c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg ClaytonInstruction::~Instruction() 56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 567889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg ClaytonAddressClass 568889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg ClaytonInstruction::GetAddressClass () 569889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton{ 570889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton if (m_address_class == eAddressClassInvalid) 571889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton m_address_class = m_address.GetAddressClass(); 572889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton return m_address_class; 573889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton} 57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5750fef968c843be422d6facc2e8d54d8471eee88edGreg Claytonvoid 5760fef968c843be422d6facc2e8d54d8471eee88edGreg ClaytonInstruction::Dump (lldb_private::Stream *s, 5770fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton uint32_t max_opcode_byte_size, 5780fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton bool show_address, 5790fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton bool show_bytes, 5800fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton const ExecutionContext* exe_ctx) 5810fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton{ 582a4b8b86adb8dcffefb7806671e09935f904b877eJason Molenda size_t opcode_column_width = 7; 5830fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton const size_t operand_column_width = 25; 5840fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton 5850fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton CalculateMnemonicOperandsAndCommentIfNeeded (exe_ctx); 5860fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton 5870fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton StreamString ss; 5880fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton 5890fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton if (show_address) 5900fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton { 5910fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton m_address.Dump(&ss, 5920fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL, 5930fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton Address::DumpStyleLoadAddress, 5940fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton Address::DumpStyleModuleWithFileAddress, 5950fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton 0); 5960fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton 5970fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton ss.PutCString(": "); 5980fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton } 5990fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton 6000fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton if (show_bytes) 6010fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton { 6020fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton if (m_opcode.GetType() == Opcode::eTypeBytes) 6030fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton { 6040fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton // x86_64 and i386 are the only ones that use bytes right now so 6050fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton // pad out the byte dump to be able to always show 15 bytes (3 chars each) 6060fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton // plus a space 6070fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton if (max_opcode_byte_size > 0) 6080fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton m_opcode.Dump (&ss, max_opcode_byte_size * 3 + 1); 6090fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton else 6100fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton m_opcode.Dump (&ss, 15 * 3 + 1); 6110fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton } 6120fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton else 6130fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton { 6140fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton // Else, we have ARM which can show up to a uint32_t 0x00000000 (10 spaces) 6150fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton // plus two for padding... 6160fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton if (max_opcode_byte_size > 0) 6170fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton m_opcode.Dump (&ss, max_opcode_byte_size * 3 + 1); 6180fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton else 6190fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton m_opcode.Dump (&ss, 12); 6200fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton } 6210fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton } 6220fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton 6230fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton const size_t opcode_pos = ss.GetSize(); 6240fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton 625a4b8b86adb8dcffefb7806671e09935f904b877eJason Molenda // The default opcode size of 7 characters is plenty for most architectures 626a4b8b86adb8dcffefb7806671e09935f904b877eJason Molenda // but some like arm can pull out the occasional vqrshrun.s16. We won't get 627a4b8b86adb8dcffefb7806671e09935f904b877eJason Molenda // consistent column spacing in these cases, unfortunately. 628a4b8b86adb8dcffefb7806671e09935f904b877eJason Molenda if (m_opcode_name.length() >= opcode_column_width) 629a4b8b86adb8dcffefb7806671e09935f904b877eJason Molenda { 630a4b8b86adb8dcffefb7806671e09935f904b877eJason Molenda opcode_column_width = m_opcode_name.length() + 1; 631a4b8b86adb8dcffefb7806671e09935f904b877eJason Molenda } 632a4b8b86adb8dcffefb7806671e09935f904b877eJason Molenda 6330fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton ss.PutCString (m_opcode_name.c_str()); 6340fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton ss.FillLastLineToColumn (opcode_pos + opcode_column_width, ' '); 6357d4083837c5a258375fdc185d464b4ed15759a4bJim Ingham ss.PutCString (m_mnemonics.c_str()); 6360fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton 6370fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton if (!m_comment.empty()) 6380fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton { 6390fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton ss.FillLastLineToColumn (opcode_pos + opcode_column_width + operand_column_width, ' '); 6400fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton ss.PutCString (" ; "); 6410fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton ss.PutCString (m_comment.c_str()); 6420fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton } 6430fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton s->Write (ss.GetData(), ss.GetSize()); 6440fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton} 6450fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton 646af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Ticebool 647af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline TiceInstruction::DumpEmulation (const ArchSpec &arch) 648af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice{ 649102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton std::unique_ptr<EmulateInstruction> insn_emulator_ap (EmulateInstruction::FindPlugin (arch, eInstructionTypeAny, NULL)); 650af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice if (insn_emulator_ap.get()) 651af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice { 652888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton insn_emulator_ap->SetInstruction (GetOpcode(), GetAddress(), NULL); 653888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton return insn_emulator_ap->EvaluateInstruction (0); 654af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice } 655af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice 656af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice return false; 657af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice} 658af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice 659dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline TiceOptionValueSP 660dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline TiceInstruction::ReadArray (FILE *in_file, Stream *out_stream, OptionValue::Type data_type) 661dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice{ 662dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice bool done = false; 663dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice char buffer[1024]; 664dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice 665dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice OptionValueSP option_value_sp (new OptionValueArray (1u << data_type)); 666dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice 667dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice int idx = 0; 668dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice while (!done) 669dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice { 670dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice if (!fgets (buffer, 1023, in_file)) 671dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice { 672e40b6424d9e49306392bec4b44060da36414c382Greg Clayton out_stream->Printf ("Instruction::ReadArray: Error reading file (fgets).\n"); 673dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice option_value_sp.reset (); 674dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice return option_value_sp; 675dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice } 676dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice 677dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice std::string line (buffer); 678dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice 67936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t len = line.size(); 680dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice if (line[len-1] == '\n') 681dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice { 682dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice line[len-1] = '\0'; 683dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice line.resize (len-1); 684dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice } 685dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice 686dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice if ((line.size() == 1) && line[0] == ']') 687dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice { 688dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice done = true; 689dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice line.clear(); 690dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice } 691dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice 692dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice if (line.size() > 0) 693dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice { 694dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice std::string value; 69500af72e395d138f459192b7f5450fa4c7854f135Greg Clayton static RegularExpression g_reg_exp ("^[ \t]*([^ \t]+)[ \t]*$"); 69600af72e395d138f459192b7f5450fa4c7854f135Greg Clayton RegularExpression::Match regex_match(1); 69700af72e395d138f459192b7f5450fa4c7854f135Greg Clayton bool reg_exp_success = g_reg_exp.Execute (line.c_str(), ®ex_match); 698dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice if (reg_exp_success) 69900af72e395d138f459192b7f5450fa4c7854f135Greg Clayton regex_match.GetMatchAtIndex (line.c_str(), 1, value); 700dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice else 701dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice value = line; 702dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice 703dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice OptionValueSP data_value_sp; 704dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice switch (data_type) 705dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice { 706dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice case OptionValue::eTypeUInt64: 707dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice data_value_sp.reset (new OptionValueUInt64 (0, 0)); 708dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice data_value_sp->SetValueFromCString (value.c_str()); 709dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice break; 710dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice // Other types can be added later as needed. 711dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice default: 712dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice data_value_sp.reset (new OptionValueString (value.c_str(), "")); 713dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice break; 714dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice } 715dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice 71657b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton option_value_sp->GetAsArray()->InsertValue (idx, data_value_sp); 717dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice ++idx; 718dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice } 719dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice } 720dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice 721dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice return option_value_sp; 722dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice} 723dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice 724dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline TiceOptionValueSP 725dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline TiceInstruction::ReadDictionary (FILE *in_file, Stream *out_stream) 726dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice{ 727dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice bool done = false; 728dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice char buffer[1024]; 729dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice 730dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice OptionValueSP option_value_sp (new OptionValueDictionary()); 731dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice static ConstString encoding_key ("data_encoding"); 732dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice OptionValue::Type data_type = OptionValue::eTypeInvalid; 733dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice 734dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice 735dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice while (!done) 736dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice { 737dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice // Read the next line in the file 738dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice if (!fgets (buffer, 1023, in_file)) 739dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice { 740dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice out_stream->Printf ("Instruction::ReadDictionary: Error reading file (fgets).\n"); 741dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice option_value_sp.reset (); 742dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice return option_value_sp; 743dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice } 744dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice 745dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice // Check to see if the line contains the end-of-dictionary marker ("}") 746dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice std::string line (buffer); 747dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice 74836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t len = line.size(); 749dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice if (line[len-1] == '\n') 750dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice { 751dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice line[len-1] = '\0'; 752dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice line.resize (len-1); 753dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice } 754dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice 755dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice if ((line.size() == 1) && (line[0] == '}')) 756dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice { 757dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice done = true; 758dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice line.clear(); 759dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice } 760dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice 761dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice // Try to find a key-value pair in the current line and add it to the dictionary. 762dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice if (line.size() > 0) 763dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice { 76400af72e395d138f459192b7f5450fa4c7854f135Greg Clayton static RegularExpression g_reg_exp ("^[ \t]*([a-zA-Z_][a-zA-Z0-9_]*)[ \t]*=[ \t]*(.*)[ \t]*$"); 76500af72e395d138f459192b7f5450fa4c7854f135Greg Clayton RegularExpression::Match regex_match(2); 76600af72e395d138f459192b7f5450fa4c7854f135Greg Clayton 76700af72e395d138f459192b7f5450fa4c7854f135Greg Clayton bool reg_exp_success = g_reg_exp.Execute (line.c_str(), ®ex_match); 768dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice std::string key; 769dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice std::string value; 770dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice if (reg_exp_success) 771dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice { 77200af72e395d138f459192b7f5450fa4c7854f135Greg Clayton regex_match.GetMatchAtIndex (line.c_str(), 1, key); 77300af72e395d138f459192b7f5450fa4c7854f135Greg Clayton regex_match.GetMatchAtIndex (line.c_str(), 2, value); 774dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice } 775dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice else 776dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice { 777dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice out_stream->Printf ("Instruction::ReadDictionary: Failure executing regular expression.\n"); 778dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice option_value_sp.reset(); 779dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice return option_value_sp; 780dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice } 781dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice 782dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice ConstString const_key (key.c_str()); 783dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice // Check value to see if it's the start of an array or dictionary. 784dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice 785dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice lldb::OptionValueSP value_sp; 786dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice assert (value.empty() == false); 787dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice assert (key.empty() == false); 788dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice 789dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice if (value[0] == '{') 790dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice { 791dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice assert (value.size() == 1); 792dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice // value is a dictionary 793dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice value_sp = ReadDictionary (in_file, out_stream); 794dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice if (value_sp.get() == NULL) 795dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice { 796dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice option_value_sp.reset (); 797dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice return option_value_sp; 798dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice } 799dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice } 800dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice else if (value[0] == '[') 801dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice { 802dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice assert (value.size() == 1); 803dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice // value is an array 804dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice value_sp = ReadArray (in_file, out_stream, data_type); 805dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice if (value_sp.get() == NULL) 806dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice { 807dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice option_value_sp.reset (); 808dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice return option_value_sp; 809dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice } 810dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice // We've used the data_type to read an array; re-set the type to Invalid 811dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice data_type = OptionValue::eTypeInvalid; 812dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice } 813dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice else if ((value[0] == '0') && (value[1] == 'x')) 814dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice { 815dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice value_sp.reset (new OptionValueUInt64 (0, 0)); 816dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice value_sp->SetValueFromCString (value.c_str()); 817dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice } 818dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice else 819dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice { 82036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t len = value.size(); 821dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice if ((value[0] == '"') && (value[len-1] == '"')) 822dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice value = value.substr (1, len-2); 823dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice value_sp.reset (new OptionValueString (value.c_str(), "")); 824dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice } 825dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice 826dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice 827dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice 828dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice if (const_key == encoding_key) 829dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice { 830dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice // A 'data_encoding=..." is NOT a normal key-value pair; it is meta-data indicating the 831dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice // data type of an upcoming array (usually the next bit of data to be read in). 832dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice if (strcmp (value.c_str(), "uint32_t") == 0) 833dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice data_type = OptionValue::eTypeUInt64; 834dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice } 835dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice else 83657b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton option_value_sp->GetAsDictionary()->SetValueForKey (const_key, value_sp, false); 837dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice } 838dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice } 839dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice 840dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice return option_value_sp; 841dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice} 842dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice 843af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Ticebool 8446b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline TiceInstruction::TestEmulation (Stream *out_stream, const char *file_name) 8456b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice{ 8466b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice if (!out_stream) 8476b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice return false; 8486b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice 8496b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice if (!file_name) 8506b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice { 85109008d035b798ccae9fc5208567aaf4a01a28b23Johnny Chen out_stream->Printf ("Instruction::TestEmulation: Missing file_name."); 8526b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice return false; 8536b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice } 8546b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice 8556b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice FILE *test_file = fopen (file_name, "r"); 8566b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice if (!test_file) 8576b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice { 85809008d035b798ccae9fc5208567aaf4a01a28b23Johnny Chen out_stream->Printf ("Instruction::TestEmulation: Attempt to open test file failed."); 8596b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice return false; 8606b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice } 8616b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice 8626b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice char buffer[256]; 863dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice if (!fgets (buffer, 255, test_file)) 8646b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice { 865dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice out_stream->Printf ("Instruction::TestEmulation: Error reading first line of test file.\n"); 8666b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice fclose (test_file); 8676b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice return false; 8686b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice } 869dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice 870dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice if (strncmp (buffer, "InstructionEmulationState={", 27) != 0) 871dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice { 872dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice out_stream->Printf ("Instructin::TestEmulation: Test file does not contain emulation state dictionary\n"); 873dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice fclose (test_file); 874dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice return false; 875dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice } 876dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice 877dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice // Read all the test information from the test file into an OptionValueDictionary. 878dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice 879dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice OptionValueSP data_dictionary_sp (ReadDictionary (test_file, out_stream)); 880dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice if (data_dictionary_sp.get() == NULL) 8816b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice { 882dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice out_stream->Printf ("Instruction::TestEmulation: Error reading Dictionary Object.\n"); 8836b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice fclose (test_file); 8846b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice return false; 8856b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice } 886dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice 887dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice fclose (test_file); 888dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice 88957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton OptionValueDictionary *data_dictionary = data_dictionary_sp->GetAsDictionary(); 890dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice static ConstString description_key ("assembly_string"); 891dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice static ConstString triple_key ("triple"); 892dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice 893dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice OptionValueSP value_sp = data_dictionary->GetValueForKey (description_key); 894dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice 895dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice if (value_sp.get() == NULL) 896dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice { 897dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice out_stream->Printf ("Instruction::TestEmulation: Test file does not contain description string.\n"); 898dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice return false; 899dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice } 900dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice 901dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice SetDescription (value_sp->GetStringValue()); 902dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice 903dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice 904dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice value_sp = data_dictionary->GetValueForKey (triple_key); 905dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice if (value_sp.get() == NULL) 906dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice { 907dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice out_stream->Printf ("Instruction::TestEmulation: Test file does not contain triple.\n"); 908dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice return false; 909dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice } 9106b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice 911dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice ArchSpec arch; 912dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice arch.SetTriple (llvm::Triple (value_sp->GetStringValue())); 9136b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice 9146b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice bool success = false; 915102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton std::unique_ptr<EmulateInstruction> insn_emulator_ap (EmulateInstruction::FindPlugin (arch, eInstructionTypeAny, NULL)); 9166b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice if (insn_emulator_ap.get()) 917dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice success = insn_emulator_ap->TestEmulation (out_stream, arch, data_dictionary); 9186b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice 9196b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice if (success) 92009008d035b798ccae9fc5208567aaf4a01a28b23Johnny Chen out_stream->Printf ("Emulation test succeeded."); 9216b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice else 92209008d035b798ccae9fc5208567aaf4a01a28b23Johnny Chen out_stream->Printf ("Emulation test failed."); 9236b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice 9246b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice return success; 9256b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice} 9266b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice 9276b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Ticebool 928af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline TiceInstruction::Emulate (const ArchSpec &arch, 929888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton uint32_t evaluate_options, 930af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice void *baton, 931061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton EmulateInstruction::ReadMemoryCallback read_mem_callback, 932061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton EmulateInstruction::WriteMemoryCallback write_mem_callback, 933061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton EmulateInstruction::ReadRegisterCallback read_reg_callback, 934061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton EmulateInstruction::WriteRegisterCallback write_reg_callback) 935af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice{ 936102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton std::unique_ptr<EmulateInstruction> insn_emulator_ap (EmulateInstruction::FindPlugin (arch, eInstructionTypeAny, NULL)); 937af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice if (insn_emulator_ap.get()) 938af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice { 939af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice insn_emulator_ap->SetBaton (baton); 940af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice insn_emulator_ap->SetCallbacks (read_mem_callback, write_mem_callback, read_reg_callback, write_reg_callback); 941888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton insn_emulator_ap->SetInstruction (GetOpcode(), GetAddress(), NULL); 942888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton return insn_emulator_ap->EvaluateInstruction (evaluate_options); 943af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice } 944af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice 945af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice return false; 946af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice} 947af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice 9480fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton 9490fef968c843be422d6facc2e8d54d8471eee88edGreg Claytonuint32_t 9500fef968c843be422d6facc2e8d54d8471eee88edGreg ClaytonInstruction::GetData (DataExtractor &data) 9510fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton{ 952b42f1c8bc38f7af2d687dc1cf5392cf51d6890b4Sean Callanan return m_opcode.GetData(data); 9530fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton} 9540fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton 9555c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg ClaytonInstructionList::InstructionList() : 95624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_instructions() 95724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 95824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 95924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9605c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg ClaytonInstructionList::~InstructionList() 96124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 96224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 96324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 96424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 9655c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg ClaytonInstructionList::GetSize() const 96624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 96724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_instructions.size(); 96824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 96924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 970889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Claytonuint32_t 971889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg ClaytonInstructionList::GetMaxOpcocdeByteSize () const 972889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton{ 973889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton uint32_t max_inst_size = 0; 974889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton collection::const_iterator pos, end; 975889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton for (pos = m_instructions.begin(), end = m_instructions.end(); 976889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton pos != end; 977889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton ++pos) 978889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { 979889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton uint32_t inst_size = (*pos)->GetOpcode().GetByteSize(); 980889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton if (max_inst_size < inst_size) 981889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton max_inst_size = inst_size; 982889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton } 983889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton return max_inst_size; 984889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton} 985889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton 986889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton 98724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9885c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg ClaytonInstructionSP 98936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonInstructionList::GetInstructionAtIndex (size_t idx) const 99024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 9915c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton InstructionSP inst_sp; 99224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx < m_instructions.size()) 9935c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton inst_sp = m_instructions[idx]; 9945c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton return inst_sp; 99524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 99624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 99724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 99824a6bd9835ed1655984397b0cdf35127e47681e9Greg ClaytonInstructionList::Dump (Stream *s, 99924a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton bool show_address, 100024a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton bool show_bytes, 100124a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton const ExecutionContext* exe_ctx) 100224a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton{ 100324a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton const uint32_t max_opcode_byte_size = GetMaxOpcocdeByteSize(); 100424a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton collection::const_iterator pos, begin, end; 100524a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton for (begin = m_instructions.begin(), end = m_instructions.end(), pos = begin; 100624a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton pos != end; 100724a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton ++pos) 100824a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton { 100924a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton if (pos != begin) 101024a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton s->EOL(); 10110fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton (*pos)->Dump(s, max_opcode_byte_size, show_address, show_bytes, exe_ctx); 101224a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton } 101324a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton} 101424a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton 101524a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton 101624a6bd9835ed1655984397b0cdf35127e47681e9Greg Claytonvoid 10175c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg ClaytonInstructionList::Clear() 101824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 101924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_instructions.clear(); 102024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 102124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 102224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 10235c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg ClaytonInstructionList::Append (lldb::InstructionSP &inst_sp) 102424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 102524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (inst_sp) 102624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_instructions.push_back(inst_sp); 102724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 102824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1029b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Inghamuint32_t 1030b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim InghamInstructionList::GetIndexOfNextBranchInstruction(uint32_t start) const 1031b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham{ 1032b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham size_t num_instructions = m_instructions.size(); 1033b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham 1034b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham uint32_t next_branch = UINT32_MAX; 1035b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham for (size_t i = start; i < num_instructions; i++) 1036b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham { 1037b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham if (m_instructions[i]->DoesBranch()) 1038b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham { 1039b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham next_branch = i; 1040b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham break; 1041b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham } 1042b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham } 1043b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham return next_branch; 1044b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham} 1045b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham 1046b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Inghamuint32_t 1047b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim InghamInstructionList::GetIndexOfInstructionAtLoadAddress (lldb::addr_t load_addr, Target &target) 1048b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham{ 1049b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham Address address; 1050b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham address.SetLoadAddress(load_addr, &target); 105136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t num_instructions = m_instructions.size(); 1052b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham uint32_t index = UINT32_MAX; 105336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t i = 0; i < num_instructions; i++) 1054b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham { 1055b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham if (m_instructions[i]->GetAddress() == address) 1056b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham { 1057b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham index = i; 1058b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham break; 1059b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham } 1060b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham } 1061b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham return index; 1062b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham} 106324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 106424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 1065d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg ClaytonDisassembler::ParseInstructions (const ExecutionContext *exe_ctx, 1066d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton const AddressRange &range, 1067d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton Stream *error_strm_ptr, 1068d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton bool prefer_file_cache) 106924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1070567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx) 107124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1072567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx->GetTargetPtr(); 1073567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton const addr_t byte_size = range.GetByteSize(); 1074567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target == NULL || byte_size == 0 || !range.GetBaseAddress().IsValid()) 1075567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return 0; 1076567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 1077567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton DataBufferHeap *heap_buffer = new DataBufferHeap (byte_size, '\0'); 1078567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton DataBufferSP data_sp(heap_buffer); 1079567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 1080567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Error error; 1081d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton lldb::addr_t load_addr = LLDB_INVALID_ADDRESS; 1082d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton const size_t bytes_read = target->ReadMemory (range.GetBaseAddress(), 1083567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton prefer_file_cache, 1084567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton heap_buffer->GetBytes(), 1085567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton heap_buffer->GetByteSize(), 1086d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton error, 1087d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton &load_addr); 1088567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 1089567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (bytes_read > 0) 1090567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1091567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (bytes_read != heap_buffer->GetByteSize()) 1092567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton heap_buffer->SetByteSize (bytes_read); 1093567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton DataExtractor data (data_sp, 1094567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_arch.GetByteOrder(), 1095567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_arch.GetAddressByteSize()); 1096d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton const bool data_from_file = load_addr == LLDB_INVALID_ADDRESS; 1097d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton return DecodeInstructions (range.GetBaseAddress(), data, 0, UINT32_MAX, false, data_from_file); 1098567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 109904e6ada409d714592c7ab18b5b5472a5229d63d2Greg Clayton else if (error_strm_ptr) 110004e6ada409d714592c7ab18b5b5472a5229d63d2Greg Clayton { 110104e6ada409d714592c7ab18b5b5472a5229d63d2Greg Clayton const char *error_cstr = error.AsCString(); 110204e6ada409d714592c7ab18b5b5472a5229d63d2Greg Clayton if (error_cstr) 110304e6ada409d714592c7ab18b5b5472a5229d63d2Greg Clayton { 110404e6ada409d714592c7ab18b5b5472a5229d63d2Greg Clayton error_strm_ptr->Printf("error: %s\n", error_cstr); 110504e6ada409d714592c7ab18b5b5472a5229d63d2Greg Clayton } 110604e6ada409d714592c7ab18b5b5472a5229d63d2Greg Clayton } 110704e6ada409d714592c7ab18b5b5472a5229d63d2Greg Clayton } 110804e6ada409d714592c7ab18b5b5472a5229d63d2Greg Clayton else if (error_strm_ptr) 110904e6ada409d714592c7ab18b5b5472a5229d63d2Greg Clayton { 111004e6ada409d714592c7ab18b5b5472a5229d63d2Greg Clayton error_strm_ptr->PutCString("error: invalid execution context\n"); 111124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 111224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 111324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 111424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1115aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Inghamsize_t 1116d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg ClaytonDisassembler::ParseInstructions (const ExecutionContext *exe_ctx, 1117d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton const Address &start, 1118d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton uint32_t num_instructions, 1119d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton bool prefer_file_cache) 1120aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham{ 1121889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton m_instruction_list.Clear(); 1122889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton 1123567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx == NULL || num_instructions == 0 || !start.IsValid()) 1124aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham return 0; 1125aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham 1126567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx->GetTargetPtr(); 1127889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton // Calculate the max buffer size we will need in order to disassemble 1128889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton const addr_t byte_size = num_instructions * m_arch.GetMaximumOpcodeByteSize(); 1129aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham 1130889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton if (target == NULL || byte_size == 0) 1131aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham return 0; 1132aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham 1133aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham DataBufferHeap *heap_buffer = new DataBufferHeap (byte_size, '\0'); 1134889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton DataBufferSP data_sp (heap_buffer); 1135aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham 1136aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham Error error; 1137d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton lldb::addr_t load_addr = LLDB_INVALID_ADDRESS; 1138d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton const size_t bytes_read = target->ReadMemory (start, 1139889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton prefer_file_cache, 1140889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton heap_buffer->GetBytes(), 1141889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton byte_size, 1142d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton error, 1143d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton &load_addr); 1144d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton 1145d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton const bool data_from_file = load_addr == LLDB_INVALID_ADDRESS; 1146889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton 1147889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton if (bytes_read == 0) 1148889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton return 0; 1149889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton DataExtractor data (data_sp, 1150889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton m_arch.GetByteOrder(), 1151889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton m_arch.GetAddressByteSize()); 1152889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton 1153889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton const bool append_instructions = true; 1154889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton DecodeInstructions (start, 1155889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton data, 1156889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton 0, 1157889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton num_instructions, 1158d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton append_instructions, 1159d4f95f3c9462a977f8c15c5062d30bf62cd49110Greg Clayton data_from_file); 1160889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton 1161aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham return m_instruction_list.GetSize(); 1162aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham} 1163aa3e3e1f0f3be95c79f902c5331e11878f66b365Jim Ingham 116424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 116524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Disassembler copy constructor 116624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 11677d4083837c5a258375fdc185d464b4ed15759a4bJim InghamDisassembler::Disassembler(const ArchSpec& arch, const char *flavor) : 116824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_arch (arch), 116924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_instruction_list(), 11707d4083837c5a258375fdc185d464b4ed15759a4bJim Ingham m_base_addr(LLDB_INVALID_ADDRESS), 11717d4083837c5a258375fdc185d464b4ed15759a4bJim Ingham m_flavor () 117224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 11737d4083837c5a258375fdc185d464b4ed15759a4bJim Ingham if (flavor == NULL) 11747d4083837c5a258375fdc185d464b4ed15759a4bJim Ingham m_flavor.assign("default"); 11757d4083837c5a258375fdc185d464b4ed15759a4bJim Ingham else 11767d4083837c5a258375fdc185d464b4ed15759a4bJim Ingham m_flavor.assign(flavor); 117724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 117824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 117924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 118024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor 118124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 118224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDisassembler::~Disassembler() 118324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 118424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 118524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11865c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg ClaytonInstructionList & 118724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDisassembler::GetInstructionList () 118824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 118924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_instruction_list; 119024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 119124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11925c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Claytonconst InstructionList & 119324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDisassembler::GetInstructionList () const 119424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 119524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_instruction_list; 119624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 11976b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice 11986b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice//---------------------------------------------------------------------- 11996b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice// Class PseudoInstruction 12006b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice//---------------------------------------------------------------------- 12016b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline TicePseudoInstruction::PseudoInstruction () : 12026b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice Instruction (Address(), eAddressClassUnknown), 12036b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice m_description () 12046b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice{ 12056b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice} 12066b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice 12076b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline TicePseudoInstruction::~PseudoInstruction () 12086b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice{ 12096b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice} 12106b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice 12116b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Ticebool 12128741df3f8a430fb5670a4f3c1f468b7a7635721bJim InghamPseudoInstruction::DoesBranch () 12136b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice{ 12146b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice // This is NOT a valid question for a pseudo instruction. 12156b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice return false; 12166b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice} 12176b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice 12186b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Ticesize_t 12196b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline TicePseudoInstruction::Decode (const lldb_private::Disassembler &disassembler, 12206b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice const lldb_private::DataExtractor &data, 122136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t data_offset) 12226b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice{ 12236b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice return m_opcode.GetByteSize(); 12246b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice} 12256b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice 12266b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice 12276b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Ticevoid 12286b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline TicePseudoInstruction::SetOpcode (size_t opcode_size, void *opcode_data) 12296b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice{ 12306b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice if (!opcode_data) 12316b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice return; 12326b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice 12336b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice switch (opcode_size) 12346b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice { 12356b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice case 8: 12366b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice { 12376b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice uint8_t value8 = *((uint8_t *) opcode_data); 12386b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice m_opcode.SetOpcode8 (value8); 12396b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice break; 12406b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice } 12416b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice case 16: 12426b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice { 12436b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice uint16_t value16 = *((uint16_t *) opcode_data); 12446b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice m_opcode.SetOpcode16 (value16); 12456b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice break; 12466b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice } 12476b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice case 32: 12486b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice { 12496b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice uint32_t value32 = *((uint32_t *) opcode_data); 12506b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice m_opcode.SetOpcode32 (value32); 12516b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice break; 12526b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice } 12536b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice case 64: 12546b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice { 12556b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice uint64_t value64 = *((uint64_t *) opcode_data); 12566b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice m_opcode.SetOpcode64 (value64); 12576b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice break; 12586b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice } 12596b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice default: 12606b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice break; 12616b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice } 12626b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice} 12636b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice 12646b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Ticevoid 12656b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline TicePseudoInstruction::SetDescription (const char *description) 12666b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice{ 12676b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice if (description && strlen (description) > 0) 12686b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice m_description = description; 12696b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice} 1270