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(), &regex_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(), &regex_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