SBInstruction.cpp revision 50561699a9a14c716d1099ae1d38be2f31534b67
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===-- SBInstruction.cpp ---------------------------------------*- C++ -*-===//
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This file is distributed under the University of Illinois Open Source
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details.
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//===----------------------------------------------------------------------===//
97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
109ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "lldb/API/SBInstruction.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "lldb/API/SBAddress.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "lldb/API/SBFrame.h"
14d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "lldb/API/SBInstruction.h"
155e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "lldb/API/SBStream.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "lldb/API/SBTarget.h"
17d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "lldb/Core/ArchSpec.h"
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "lldb/Core/DataBufferHeap.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "lldb/Core/Disassembler.h"
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "lldb/Core/EmulateInstruction.h"
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "lldb/Core/StreamFile.h"
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "lldb/Target/ExecutionContext.h"
24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "lldb/Target/StackFrame.h"
25a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "lldb/Target/Target.h"
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using namespace lldb;
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using namespace lldb_private;
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)SBInstruction::SBInstruction ()
31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles){
32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)SBInstruction::SBInstruction (const lldb::InstructionSP& inst_sp) :
35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    m_opaque_sp (inst_sp)
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles){
37a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch}
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)SBInstruction::SBInstruction(const SBInstruction &rhs) :
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    m_opaque_sp (rhs.m_opaque_sp)
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles){
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const SBInstruction &
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SBInstruction::operator = (const SBInstruction &rhs)
46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles){
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (this != &rhs)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        m_opaque_sp = rhs.m_opaque_sp;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return *this;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SBInstruction::~SBInstruction ()
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SBInstruction::IsValid()
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles){
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (m_opaque_sp.get() != NULL);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SBAddress
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SBInstruction::GetAddress()
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles){
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SBAddress sb_addr;
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (m_opaque_sp && m_opaque_sp->GetAddress().IsValid())
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        sb_addr.SetAddress(&m_opaque_sp->GetAddress());
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return sb_addr;
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char *
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SBInstruction::GetMnemonic(SBTarget target)
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles){
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (m_opaque_sp)
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    {
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        Mutex::Locker api_locker;
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ExecutionContext exe_ctx;
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        TargetSP target_sp (target.GetSP());
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (target_sp)
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        {
81a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch            api_locker.Lock (target_sp->GetAPIMutex().GetMutex());
82d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            target_sp->CalculateExecutionContext (exe_ctx);
83d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            exe_ctx.SetProcessSP(target_sp->GetProcessSP());
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        }
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return m_opaque_sp->GetMnemonic(exe_ctx.GetBestExecutionContextScope());
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char *
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SBInstruction::GetOperands(SBTarget target)
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles){
93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (m_opaque_sp)
94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    {
95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        Mutex::Locker api_locker;
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ExecutionContext exe_ctx;
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        TargetSP target_sp (target.GetSP());
98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        if (target_sp)
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        {
100a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch            api_locker.Lock (target_sp->GetAPIMutex().GetMutex());
1013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            target_sp->CalculateExecutionContext (exe_ctx);
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            exe_ctx.SetProcessSP(target_sp->GetProcessSP());
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        }
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return m_opaque_sp->GetOperands(exe_ctx.GetBestExecutionContextScope());
1053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return NULL;
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char *
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SBInstruction::GetComment(SBTarget target)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (m_opaque_sp)
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    {
1147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        Mutex::Locker api_locker;
1157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ExecutionContext exe_ctx;
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        TargetSP target_sp (target.GetSP());
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (target_sp)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        {
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            api_locker.Lock (target_sp->GetAPIMutex().GetMutex());
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            target_sp->CalculateExecutionContext (exe_ctx);
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            exe_ctx.SetProcessSP(target_sp->GetProcessSP());
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        }
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return m_opaque_sp->GetComment(exe_ctx.GetBestExecutionContextScope());
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return NULL;
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)size_t
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SBInstruction::GetByteSize ()
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles){
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (m_opaque_sp)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return m_opaque_sp->GetOpcode().GetByteSize();
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return 0;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SBData
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SBInstruction::GetData (SBTarget target)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    lldb::SBData sb_data;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (m_opaque_sp)
141a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    {
142a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        DataExtractorSP data_extractor_sp (new DataExtractor());
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (m_opaque_sp->GetOpcode().GetData (*data_extractor_sp))
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            sb_data.SetOpaque (data_extractor_sp);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
147a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    }
148a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    return sb_data;
149a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch}
150a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SBInstruction::DoesBranch ()
155d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles){
156d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    if (m_opaque_sp)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return m_opaque_sp->DoesBranch ();
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
160d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void
16258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)SBInstruction::SetOpaque (const lldb::InstructionSP &inst_sp)
163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles){
164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    m_opaque_sp = inst_sp;
165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SBInstruction::GetDescription (lldb::SBStream &s)
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (m_opaque_sp)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Use the "ref()" instead of the "get()" accessor in case the SBStream
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // didn't have a stream already created, one will get created...
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        m_opaque_sp->Dump (&s.ref(), 0, true, false, NULL, false);
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return true;
176a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
177a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return false;
178a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
179a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
180a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void
181a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)SBInstruction::Print (FILE *out)
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles){
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (out == NULL)
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return;
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (m_opaque_sp)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        StreamFile out_stream (out, false);
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        m_opaque_sp->Dump (&out_stream, 0, true, false, NULL, false);
190d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    }
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SBInstruction::EmulateWithFrame (lldb::SBFrame &frame, uint32_t evaluate_options)
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles){
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (m_opaque_sp)
197d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    {
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        lldb::StackFrameSP frame_sp (frame.GetFrameSP());
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        if (frame_sp)
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        {
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            lldb_private::ExecutionContext exe_ctx;
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            frame_sp->CalculateExecutionContext (exe_ctx);
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            lldb_private::Target *target = exe_ctx.GetTargetPtr();
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            lldb_private::ArchSpec arch = target->GetArchitecture();
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            return m_opaque_sp->Emulate (arch,
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                         evaluate_options,
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                         (void *) frame_sp.get(),
210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                         &lldb_private::EmulateInstruction::ReadMemoryFrame,
211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                         &lldb_private::EmulateInstruction::WriteMemoryFrame,
212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                         &lldb_private::EmulateInstruction::ReadRegisterFrame,
213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                         &lldb_private::EmulateInstruction::WriteRegisterFrame);
214a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        }
215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return false;
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
218f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool
220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)SBInstruction::DumpEmulation (const char *triple)
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles){
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (m_opaque_sp && triple)
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    {
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        lldb_private::ArchSpec arch (triple, NULL);
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return m_opaque_sp->DumpEmulation (arch);
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return false;
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SBInstruction::TestEmulation (lldb::SBStream &output_stream,  const char *test_file)
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles){
235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!m_opaque_sp.get())
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        m_opaque_sp.reset (new PseudoInstruction());
237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
238f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return m_opaque_sp->TestEmulation (output_stream.get(), test_file);
239f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
240f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)