SBInstruction.cpp revision 334d33a19fd28cf41cba74cc61cf149e7101a603
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- SBInstruction.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
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/API/SBInstruction.h"
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
125c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton#include "lldb/API/SBAddress.h"
13af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice#include "lldb/API/SBFrame.h"
145c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton#include "lldb/API/SBInstruction.h"
155c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton#include "lldb/API/SBStream.h"
16af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice#include "lldb/API/SBTarget.h"
175c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton
18af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice#include "lldb/Core/ArchSpec.h"
1923b8abbe214c252028f6e09f79169529c846409dGreg Clayton#include "lldb/Core/DataBufferHeap.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Disassembler.h"
21af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice#include "lldb/Core/EmulateInstruction.h"
225c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton#include "lldb/Core/StreamFile.h"
23af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice#include "lldb/Target/ExecutionContext.h"
24af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice#include "lldb/Target/StackFrame.h"
25af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice#include "lldb/Target/Target.h"
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBInstruction::SBInstruction ()
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
345c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg ClaytonSBInstruction::SBInstruction (const lldb::InstructionSP& inst_sp) :
355c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    m_opaque_sp (inst_sp)
365c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton{
375c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton}
385c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton
39538eb82a89a68dbc57251915080bd5152b333978Greg ClaytonSBInstruction::SBInstruction(const SBInstruction &rhs) :
40538eb82a89a68dbc57251915080bd5152b333978Greg Clayton    m_opaque_sp (rhs.m_opaque_sp)
41538eb82a89a68dbc57251915080bd5152b333978Greg Clayton{
42538eb82a89a68dbc57251915080bd5152b333978Greg Clayton}
43538eb82a89a68dbc57251915080bd5152b333978Greg Clayton
44538eb82a89a68dbc57251915080bd5152b333978Greg Claytonconst SBInstruction &
45538eb82a89a68dbc57251915080bd5152b333978Greg ClaytonSBInstruction::operator = (const SBInstruction &rhs)
46538eb82a89a68dbc57251915080bd5152b333978Greg Clayton{
47538eb82a89a68dbc57251915080bd5152b333978Greg Clayton    if (this != &rhs)
48538eb82a89a68dbc57251915080bd5152b333978Greg Clayton        m_opaque_sp = rhs.m_opaque_sp;
49538eb82a89a68dbc57251915080bd5152b333978Greg Clayton    return *this;
50538eb82a89a68dbc57251915080bd5152b333978Greg Clayton}
51538eb82a89a68dbc57251915080bd5152b333978Greg Clayton
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBInstruction::~SBInstruction ()
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
565c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Claytonbool
575c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg ClaytonSBInstruction::IsValid()
585c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton{
595c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    return (m_opaque_sp.get() != NULL);
605c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton}
615c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton
625c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg ClaytonSBAddress
635c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg ClaytonSBInstruction::GetAddress()
645c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton{
655c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    SBAddress sb_addr;
665c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    if (m_opaque_sp && m_opaque_sp->GetAddress().IsValid())
675c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton        sb_addr.SetAddress(&m_opaque_sp->GetAddress());
685c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    return sb_addr;
695c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton}
705c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton
7123b8abbe214c252028f6e09f79169529c846409dGreg Claytonconst char *
72d9b4425303fd48210ab104ca6573c869083a8480Greg ClaytonSBInstruction::GetMnemonic(SBTarget target)
7323b8abbe214c252028f6e09f79169529c846409dGreg Clayton{
7423b8abbe214c252028f6e09f79169529c846409dGreg Clayton    if (m_opaque_sp)
7523b8abbe214c252028f6e09f79169529c846409dGreg Clayton    {
7623b8abbe214c252028f6e09f79169529c846409dGreg Clayton        Mutex::Locker api_locker;
7723b8abbe214c252028f6e09f79169529c846409dGreg Clayton        ExecutionContext exe_ctx;
78334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton        TargetSP target_sp (target.GetSP());
79334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton        if (target_sp)
8023b8abbe214c252028f6e09f79169529c846409dGreg Clayton        {
81334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton            api_locker.Reset (target_sp->GetAPIMutex().GetMutex());
82334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton            target_sp->CalculateExecutionContext (exe_ctx);
83334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton            exe_ctx.SetProcessSP(target_sp->GetProcessSP());
8423b8abbe214c252028f6e09f79169529c846409dGreg Clayton        }
85d9b4425303fd48210ab104ca6573c869083a8480Greg Clayton        return m_opaque_sp->GetMnemonic(exe_ctx.GetBestExecutionContextScope());
8623b8abbe214c252028f6e09f79169529c846409dGreg Clayton    }
8723b8abbe214c252028f6e09f79169529c846409dGreg Clayton    return NULL;
8823b8abbe214c252028f6e09f79169529c846409dGreg Clayton}
8923b8abbe214c252028f6e09f79169529c846409dGreg Clayton
9023b8abbe214c252028f6e09f79169529c846409dGreg Claytonconst char *
91d9b4425303fd48210ab104ca6573c869083a8480Greg ClaytonSBInstruction::GetOperands(SBTarget target)
9223b8abbe214c252028f6e09f79169529c846409dGreg Clayton{
9323b8abbe214c252028f6e09f79169529c846409dGreg Clayton    if (m_opaque_sp)
9423b8abbe214c252028f6e09f79169529c846409dGreg Clayton    {
9523b8abbe214c252028f6e09f79169529c846409dGreg Clayton        Mutex::Locker api_locker;
9623b8abbe214c252028f6e09f79169529c846409dGreg Clayton        ExecutionContext exe_ctx;
97334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton        TargetSP target_sp (target.GetSP());
98334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton        if (target_sp)
9923b8abbe214c252028f6e09f79169529c846409dGreg Clayton        {
100334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton            api_locker.Reset (target_sp->GetAPIMutex().GetMutex());
101334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton            target_sp->CalculateExecutionContext (exe_ctx);
102334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton            exe_ctx.SetProcessSP(target_sp->GetProcessSP());
10323b8abbe214c252028f6e09f79169529c846409dGreg Clayton        }
104d9b4425303fd48210ab104ca6573c869083a8480Greg Clayton        return m_opaque_sp->GetOperands(exe_ctx.GetBestExecutionContextScope());
10523b8abbe214c252028f6e09f79169529c846409dGreg Clayton    }
10623b8abbe214c252028f6e09f79169529c846409dGreg Clayton    return NULL;
10723b8abbe214c252028f6e09f79169529c846409dGreg Clayton}
10823b8abbe214c252028f6e09f79169529c846409dGreg Clayton
10923b8abbe214c252028f6e09f79169529c846409dGreg Claytonconst char *
11023b8abbe214c252028f6e09f79169529c846409dGreg ClaytonSBInstruction::GetComment(SBTarget target)
11123b8abbe214c252028f6e09f79169529c846409dGreg Clayton{
11223b8abbe214c252028f6e09f79169529c846409dGreg Clayton    if (m_opaque_sp)
11323b8abbe214c252028f6e09f79169529c846409dGreg Clayton    {
11423b8abbe214c252028f6e09f79169529c846409dGreg Clayton        Mutex::Locker api_locker;
11523b8abbe214c252028f6e09f79169529c846409dGreg Clayton        ExecutionContext exe_ctx;
116334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton        TargetSP target_sp (target.GetSP());
117334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton        if (target_sp)
11823b8abbe214c252028f6e09f79169529c846409dGreg Clayton        {
119334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton            api_locker.Reset (target_sp->GetAPIMutex().GetMutex());
120334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton            target_sp->CalculateExecutionContext (exe_ctx);
121334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton            exe_ctx.SetProcessSP(target_sp->GetProcessSP());
12223b8abbe214c252028f6e09f79169529c846409dGreg Clayton        }
12323b8abbe214c252028f6e09f79169529c846409dGreg Clayton        return m_opaque_sp->GetComment(exe_ctx.GetBestExecutionContextScope());
12423b8abbe214c252028f6e09f79169529c846409dGreg Clayton    }
12523b8abbe214c252028f6e09f79169529c846409dGreg Clayton    return NULL;
12623b8abbe214c252028f6e09f79169529c846409dGreg Clayton}
12723b8abbe214c252028f6e09f79169529c846409dGreg Clayton
1285c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Claytonsize_t
1295c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg ClaytonSBInstruction::GetByteSize ()
1305c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton{
1315c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    if (m_opaque_sp)
132149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton        return m_opaque_sp->GetOpcode().GetByteSize();
1335c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    return 0;
1345c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton}
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13623b8abbe214c252028f6e09f79169529c846409dGreg ClaytonSBData
13723b8abbe214c252028f6e09f79169529c846409dGreg ClaytonSBInstruction::GetData (SBTarget target)
13823b8abbe214c252028f6e09f79169529c846409dGreg Clayton{
13923b8abbe214c252028f6e09f79169529c846409dGreg Clayton    lldb::SBData sb_data;
14023b8abbe214c252028f6e09f79169529c846409dGreg Clayton    if (m_opaque_sp)
14123b8abbe214c252028f6e09f79169529c846409dGreg Clayton    {
14223b8abbe214c252028f6e09f79169529c846409dGreg Clayton        const Opcode &opcode = m_opaque_sp->GetOpcode();
14323b8abbe214c252028f6e09f79169529c846409dGreg Clayton        const void *opcode_data = opcode.GetOpcodeBytes();
14423b8abbe214c252028f6e09f79169529c846409dGreg Clayton        const uint32_t opcode_data_size = opcode.GetByteSize();
14523b8abbe214c252028f6e09f79169529c846409dGreg Clayton        if (opcode_data && opcode_data_size > 0)
14623b8abbe214c252028f6e09f79169529c846409dGreg Clayton        {
14723b8abbe214c252028f6e09f79169529c846409dGreg Clayton            ByteOrder data_byte_order = opcode.GetDataByteOrder();
148334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton            TargetSP target_sp (target.GetSP());
149334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton            if (data_byte_order == eByteOrderInvalid && target_sp)
150334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton                data_byte_order = target_sp->GetArchitecture().GetByteOrder();
15123b8abbe214c252028f6e09f79169529c846409dGreg Clayton            DataBufferSP data_buffer_sp (new DataBufferHeap (opcode_data, opcode_data_size));
15223b8abbe214c252028f6e09f79169529c846409dGreg Clayton            DataExtractorSP data_extractor_sp (new DataExtractor (data_buffer_sp,
15323b8abbe214c252028f6e09f79169529c846409dGreg Clayton                                                                  data_byte_order,
154334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton                                                                  target_sp ? target_sp->GetArchitecture().GetAddressByteSize() : sizeof(void*)));
15523b8abbe214c252028f6e09f79169529c846409dGreg Clayton            sb_data.SetOpaque (data_extractor_sp);
15623b8abbe214c252028f6e09f79169529c846409dGreg Clayton        }
15723b8abbe214c252028f6e09f79169529c846409dGreg Clayton    }
15823b8abbe214c252028f6e09f79169529c846409dGreg Clayton    return sb_data;
15923b8abbe214c252028f6e09f79169529c846409dGreg Clayton}
16023b8abbe214c252028f6e09f79169529c846409dGreg Clayton
16123b8abbe214c252028f6e09f79169529c846409dGreg Clayton
16223b8abbe214c252028f6e09f79169529c846409dGreg Clayton
1635c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Claytonbool
1645c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg ClaytonSBInstruction::DoesBranch ()
1655c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton{
1665c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    if (m_opaque_sp)
1675c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton        return m_opaque_sp->DoesBranch ();
1685c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    return false;
1695c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton}
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1715c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Claytonvoid
1725c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg ClaytonSBInstruction::SetOpaque (const lldb::InstructionSP &inst_sp)
1735c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton{
1745c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    m_opaque_sp = inst_sp;
1755c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton}
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1775c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Claytonbool
1785c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg ClaytonSBInstruction::GetDescription (lldb::SBStream &s)
1795c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton{
1805c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    if (m_opaque_sp)
1815c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    {
1825c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton        // Use the "ref()" instead of the "get()" accessor in case the SBStream
1835c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton        // didn't have a stream already created, one will get created...
184889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton        m_opaque_sp->Dump (&s.ref(), 0, true, false, NULL, false);
1855c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton        return true;
1865c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    }
1875c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    return false;
1885c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton}
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBInstruction::Print (FILE *out)
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (out == NULL)
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return;
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1965c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    if (m_opaque_sp)
1975c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    {
1985892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        StreamFile out_stream (out, false);
199889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton        m_opaque_sp->Dump (&out_stream, 0, true, false, NULL, false);
2005c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    }
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
202af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice
203af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Ticebool
204888a7334344778d1a4edbd58b5852ae4d53ffed9Greg ClaytonSBInstruction::EmulateWithFrame (lldb::SBFrame &frame, uint32_t evaluate_options)
205af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice{
206334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton    if (m_opaque_sp)
207af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice    {
208334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton        lldb::StackFrameSP frame_sp (frame.GetFrameSP());
209334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton
210334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton        if (frame_sp)
211334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton        {
212334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton            lldb_private::ExecutionContext exe_ctx;
213334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton            frame_sp->CalculateExecutionContext (exe_ctx);
214334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton            lldb_private::Target *target = exe_ctx.GetTargetPtr();
215334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton            lldb_private::ArchSpec arch = target->GetArchitecture();
216334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton
217334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton            return m_opaque_sp->Emulate (arch,
218334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton                                         evaluate_options,
219334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton                                         (void *) frame_sp.get(),
220334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton                                         &lldb_private::EmulateInstruction::ReadMemoryFrame,
221334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton                                         &lldb_private::EmulateInstruction::WriteMemoryFrame,
222334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton                                         &lldb_private::EmulateInstruction::ReadRegisterFrame,
223334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton                                         &lldb_private::EmulateInstruction::WriteRegisterFrame);
224334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton        }
225af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice    }
226af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice    return false;
227af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice}
228af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice
229af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Ticebool
230af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline TiceSBInstruction::DumpEmulation (const char *triple)
231af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice{
232af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice    if (m_opaque_sp && triple)
233af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice    {
234f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton        lldb_private::ArchSpec arch (triple, NULL);
235af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice
2360fe5a535b87841a5c422f4a79d55c21bf07b50caCaroline Tice        return m_opaque_sp->DumpEmulation (arch);
2370fe5a535b87841a5c422f4a79d55c21bf07b50caCaroline Tice
238af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice    }
239af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice    return false;
240af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice}
241af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice
2426b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Ticebool
2436b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline TiceSBInstruction::TestEmulation (lldb::SBStream &output_stream,  const char *test_file)
2446b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice{
2456b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice    if (!m_opaque_sp.get())
2466b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice        m_opaque_sp.reset (new PseudoInstruction());
2476b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice
24809008d035b798ccae9fc5208567aaf4a01a28b23Johnny Chen    return m_opaque_sp->TestEmulation (output_stream.get(), test_file);
24909008d035b798ccae9fc5208567aaf4a01a28b23Johnny Chen}
250