SBInstruction.cpp revision d9b4425303fd48210ab104ca6573c869083a8480
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;
7823b8abbe214c252028f6e09f79169529c846409dGreg Clayton        if (target.IsValid())
7923b8abbe214c252028f6e09f79169529c846409dGreg Clayton        {
8023b8abbe214c252028f6e09f79169529c846409dGreg Clayton            api_locker.Reset (target->GetAPIMutex().GetMutex());
8123b8abbe214c252028f6e09f79169529c846409dGreg Clayton            target->CalculateExecutionContext (exe_ctx);
8223b8abbe214c252028f6e09f79169529c846409dGreg Clayton            exe_ctx.SetProcessSP(target->GetProcessSP());
8323b8abbe214c252028f6e09f79169529c846409dGreg Clayton        }
84d9b4425303fd48210ab104ca6573c869083a8480Greg Clayton        return m_opaque_sp->GetMnemonic(exe_ctx.GetBestExecutionContextScope());
8523b8abbe214c252028f6e09f79169529c846409dGreg Clayton    }
8623b8abbe214c252028f6e09f79169529c846409dGreg Clayton    return NULL;
8723b8abbe214c252028f6e09f79169529c846409dGreg Clayton}
8823b8abbe214c252028f6e09f79169529c846409dGreg Clayton
8923b8abbe214c252028f6e09f79169529c846409dGreg Claytonconst char *
90d9b4425303fd48210ab104ca6573c869083a8480Greg ClaytonSBInstruction::GetOperands(SBTarget target)
9123b8abbe214c252028f6e09f79169529c846409dGreg Clayton{
9223b8abbe214c252028f6e09f79169529c846409dGreg Clayton    if (m_opaque_sp)
9323b8abbe214c252028f6e09f79169529c846409dGreg Clayton    {
9423b8abbe214c252028f6e09f79169529c846409dGreg Clayton        Mutex::Locker api_locker;
9523b8abbe214c252028f6e09f79169529c846409dGreg Clayton        ExecutionContext exe_ctx;
9623b8abbe214c252028f6e09f79169529c846409dGreg Clayton        if (target.IsValid())
9723b8abbe214c252028f6e09f79169529c846409dGreg Clayton        {
9823b8abbe214c252028f6e09f79169529c846409dGreg Clayton            api_locker.Reset (target->GetAPIMutex().GetMutex());
9923b8abbe214c252028f6e09f79169529c846409dGreg Clayton            target->CalculateExecutionContext (exe_ctx);
10023b8abbe214c252028f6e09f79169529c846409dGreg Clayton            exe_ctx.SetProcessSP(target->GetProcessSP());
10123b8abbe214c252028f6e09f79169529c846409dGreg Clayton        }
102d9b4425303fd48210ab104ca6573c869083a8480Greg Clayton        return m_opaque_sp->GetOperands(exe_ctx.GetBestExecutionContextScope());
10323b8abbe214c252028f6e09f79169529c846409dGreg Clayton    }
10423b8abbe214c252028f6e09f79169529c846409dGreg Clayton    return NULL;
10523b8abbe214c252028f6e09f79169529c846409dGreg Clayton}
10623b8abbe214c252028f6e09f79169529c846409dGreg Clayton
10723b8abbe214c252028f6e09f79169529c846409dGreg Claytonconst char *
10823b8abbe214c252028f6e09f79169529c846409dGreg ClaytonSBInstruction::GetComment(SBTarget target)
10923b8abbe214c252028f6e09f79169529c846409dGreg Clayton{
11023b8abbe214c252028f6e09f79169529c846409dGreg Clayton    if (m_opaque_sp)
11123b8abbe214c252028f6e09f79169529c846409dGreg Clayton    {
11223b8abbe214c252028f6e09f79169529c846409dGreg Clayton        Mutex::Locker api_locker;
11323b8abbe214c252028f6e09f79169529c846409dGreg Clayton        ExecutionContext exe_ctx;
11423b8abbe214c252028f6e09f79169529c846409dGreg Clayton        if (target.IsValid())
11523b8abbe214c252028f6e09f79169529c846409dGreg Clayton        {
11623b8abbe214c252028f6e09f79169529c846409dGreg Clayton            api_locker.Reset (target->GetAPIMutex().GetMutex());
11723b8abbe214c252028f6e09f79169529c846409dGreg Clayton            target->CalculateExecutionContext (exe_ctx);
11823b8abbe214c252028f6e09f79169529c846409dGreg Clayton            exe_ctx.SetProcessSP(target->GetProcessSP());
11923b8abbe214c252028f6e09f79169529c846409dGreg Clayton        }
12023b8abbe214c252028f6e09f79169529c846409dGreg Clayton        return m_opaque_sp->GetComment(exe_ctx.GetBestExecutionContextScope());
12123b8abbe214c252028f6e09f79169529c846409dGreg Clayton    }
12223b8abbe214c252028f6e09f79169529c846409dGreg Clayton    return NULL;
12323b8abbe214c252028f6e09f79169529c846409dGreg Clayton}
12423b8abbe214c252028f6e09f79169529c846409dGreg Clayton
1255c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Claytonsize_t
1265c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg ClaytonSBInstruction::GetByteSize ()
1275c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton{
1285c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    if (m_opaque_sp)
129149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton        return m_opaque_sp->GetOpcode().GetByteSize();
1305c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    return 0;
1315c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton}
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13323b8abbe214c252028f6e09f79169529c846409dGreg ClaytonSBData
13423b8abbe214c252028f6e09f79169529c846409dGreg ClaytonSBInstruction::GetData (SBTarget target)
13523b8abbe214c252028f6e09f79169529c846409dGreg Clayton{
13623b8abbe214c252028f6e09f79169529c846409dGreg Clayton    lldb::SBData sb_data;
13723b8abbe214c252028f6e09f79169529c846409dGreg Clayton    if (m_opaque_sp)
13823b8abbe214c252028f6e09f79169529c846409dGreg Clayton    {
13923b8abbe214c252028f6e09f79169529c846409dGreg Clayton        const Opcode &opcode = m_opaque_sp->GetOpcode();
14023b8abbe214c252028f6e09f79169529c846409dGreg Clayton        const void *opcode_data = opcode.GetOpcodeBytes();
14123b8abbe214c252028f6e09f79169529c846409dGreg Clayton        const uint32_t opcode_data_size = opcode.GetByteSize();
14223b8abbe214c252028f6e09f79169529c846409dGreg Clayton        if (opcode_data && opcode_data_size > 0)
14323b8abbe214c252028f6e09f79169529c846409dGreg Clayton        {
14423b8abbe214c252028f6e09f79169529c846409dGreg Clayton            ByteOrder data_byte_order = opcode.GetDataByteOrder();
14523b8abbe214c252028f6e09f79169529c846409dGreg Clayton            if (data_byte_order == eByteOrderInvalid)
14623b8abbe214c252028f6e09f79169529c846409dGreg Clayton                data_byte_order = target->GetArchitecture().GetByteOrder();
14723b8abbe214c252028f6e09f79169529c846409dGreg Clayton            DataBufferSP data_buffer_sp (new DataBufferHeap (opcode_data, opcode_data_size));
14823b8abbe214c252028f6e09f79169529c846409dGreg Clayton            DataExtractorSP data_extractor_sp (new DataExtractor (data_buffer_sp,
14923b8abbe214c252028f6e09f79169529c846409dGreg Clayton                                                                  data_byte_order,
15023b8abbe214c252028f6e09f79169529c846409dGreg Clayton                                                                  target.IsValid() ? target->GetArchitecture().GetAddressByteSize() : sizeof(void*)));
15123b8abbe214c252028f6e09f79169529c846409dGreg Clayton            sb_data.SetOpaque (data_extractor_sp);
15223b8abbe214c252028f6e09f79169529c846409dGreg Clayton        }
15323b8abbe214c252028f6e09f79169529c846409dGreg Clayton    }
15423b8abbe214c252028f6e09f79169529c846409dGreg Clayton    return sb_data;
15523b8abbe214c252028f6e09f79169529c846409dGreg Clayton}
15623b8abbe214c252028f6e09f79169529c846409dGreg Clayton
15723b8abbe214c252028f6e09f79169529c846409dGreg Clayton
15823b8abbe214c252028f6e09f79169529c846409dGreg Clayton
1595c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Claytonbool
1605c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg ClaytonSBInstruction::DoesBranch ()
1615c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton{
1625c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    if (m_opaque_sp)
1635c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton        return m_opaque_sp->DoesBranch ();
1645c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    return false;
1655c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton}
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1675c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Claytonvoid
1685c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg ClaytonSBInstruction::SetOpaque (const lldb::InstructionSP &inst_sp)
1695c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton{
1705c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    m_opaque_sp = inst_sp;
1715c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton}
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1735c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Claytonbool
1745c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg ClaytonSBInstruction::GetDescription (lldb::SBStream &s)
1755c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton{
1765c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    if (m_opaque_sp)
1775c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    {
1785c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton        // Use the "ref()" instead of the "get()" accessor in case the SBStream
1795c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton        // didn't have a stream already created, one will get created...
180889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton        m_opaque_sp->Dump (&s.ref(), 0, true, false, NULL, false);
1815c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton        return true;
1825c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    }
1835c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    return false;
1845c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton}
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBInstruction::Print (FILE *out)
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (out == NULL)
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return;
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1925c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    if (m_opaque_sp)
1935c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    {
1945892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        StreamFile out_stream (out, false);
195889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton        m_opaque_sp->Dump (&out_stream, 0, true, false, NULL, false);
1965c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    }
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
198af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice
199af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Ticebool
200888a7334344778d1a4edbd58b5852ae4d53ffed9Greg ClaytonSBInstruction::EmulateWithFrame (lldb::SBFrame &frame, uint32_t evaluate_options)
201af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice{
202af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice    if (m_opaque_sp && frame.get())
203af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice    {
204af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice        lldb_private::ExecutionContext exe_ctx;
205af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice        frame->CalculateExecutionContext (exe_ctx);
206567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        lldb_private::Target *target = exe_ctx.GetTargetPtr();
207af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice        lldb_private::ArchSpec arch = target->GetArchitecture();
208af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice
209af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice        return m_opaque_sp->Emulate (arch,
210888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                     evaluate_options,
211af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice                                     (void *) frame.get(),
212af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice                                     &lldb_private::EmulateInstruction::ReadMemoryFrame,
213af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice                                     &lldb_private::EmulateInstruction::WriteMemoryFrame,
214af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice                                     &lldb_private::EmulateInstruction::ReadRegisterFrame,
215af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice                                     &lldb_private::EmulateInstruction::WriteRegisterFrame);
216af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice    }
217af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice    return false;
218af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice}
219af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice
220af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Ticebool
221af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline TiceSBInstruction::DumpEmulation (const char *triple)
222af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice{
223af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice    if (m_opaque_sp && triple)
224af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice    {
225f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton        lldb_private::ArchSpec arch (triple, NULL);
226af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice
2270fe5a535b87841a5c422f4a79d55c21bf07b50caCaroline Tice        return m_opaque_sp->DumpEmulation (arch);
2280fe5a535b87841a5c422f4a79d55c21bf07b50caCaroline Tice
229af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice    }
230af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice    return false;
231af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice}
232af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice
2336b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Ticebool
2346b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline TiceSBInstruction::TestEmulation (lldb::SBStream &output_stream,  const char *test_file)
2356b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice{
2366b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice    if (!m_opaque_sp.get())
2376b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice        m_opaque_sp.reset (new PseudoInstruction());
2386b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice
23909008d035b798ccae9fc5208567aaf4a01a28b23Johnny Chen    return m_opaque_sp->TestEmulation (output_stream.get(), test_file);
24009008d035b798ccae9fc5208567aaf4a01a28b23Johnny Chen}
241