SBInstruction.cpp revision 0fe5a535b87841a5c422f4a79d55c21bf07b50ca
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"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Disassembler.h"
20af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice#include "lldb/Core/EmulateInstruction.h"
215c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton#include "lldb/Core/StreamFile.h"
22af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice#include "lldb/Target/ExecutionContext.h"
23af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice#include "lldb/Target/StackFrame.h"
24af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice#include "lldb/Target/Target.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBInstruction::SBInstruction ()
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
335c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg ClaytonSBInstruction::SBInstruction (const lldb::InstructionSP& inst_sp) :
345c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    m_opaque_sp (inst_sp)
355c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton{
365c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton}
375c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton
38538eb82a89a68dbc57251915080bd5152b333978Greg ClaytonSBInstruction::SBInstruction(const SBInstruction &rhs) :
39538eb82a89a68dbc57251915080bd5152b333978Greg Clayton    m_opaque_sp (rhs.m_opaque_sp)
40538eb82a89a68dbc57251915080bd5152b333978Greg Clayton{
41538eb82a89a68dbc57251915080bd5152b333978Greg Clayton}
42538eb82a89a68dbc57251915080bd5152b333978Greg Clayton
43538eb82a89a68dbc57251915080bd5152b333978Greg Claytonconst SBInstruction &
44538eb82a89a68dbc57251915080bd5152b333978Greg ClaytonSBInstruction::operator = (const SBInstruction &rhs)
45538eb82a89a68dbc57251915080bd5152b333978Greg Clayton{
46538eb82a89a68dbc57251915080bd5152b333978Greg Clayton    if (this != &rhs)
47538eb82a89a68dbc57251915080bd5152b333978Greg Clayton        m_opaque_sp = rhs.m_opaque_sp;
48538eb82a89a68dbc57251915080bd5152b333978Greg Clayton    return *this;
49538eb82a89a68dbc57251915080bd5152b333978Greg Clayton}
50538eb82a89a68dbc57251915080bd5152b333978Greg Clayton
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBInstruction::~SBInstruction ()
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
555c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Claytonbool
565c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg ClaytonSBInstruction::IsValid()
575c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton{
585c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    return (m_opaque_sp.get() != NULL);
595c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton}
605c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton
615c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg ClaytonSBAddress
625c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg ClaytonSBInstruction::GetAddress()
635c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton{
645c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    SBAddress sb_addr;
655c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    if (m_opaque_sp && m_opaque_sp->GetAddress().IsValid())
665c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton        sb_addr.SetAddress(&m_opaque_sp->GetAddress());
675c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    return sb_addr;
685c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton}
695c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton
705c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Claytonsize_t
715c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg ClaytonSBInstruction::GetByteSize ()
725c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton{
735c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    if (m_opaque_sp)
74149731c0b267e5b6cd7192cbfac0c7f457ae5cfcGreg Clayton        return m_opaque_sp->GetOpcode().GetByteSize();
755c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    return 0;
765c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton}
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
785c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Claytonbool
795c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg ClaytonSBInstruction::DoesBranch ()
805c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton{
815c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    if (m_opaque_sp)
825c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton        return m_opaque_sp->DoesBranch ();
835c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    return false;
845c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton}
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
865c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Claytonvoid
875c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg ClaytonSBInstruction::SetOpaque (const lldb::InstructionSP &inst_sp)
885c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton{
895c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    m_opaque_sp = inst_sp;
905c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton}
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
925c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Claytonbool
935c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg ClaytonSBInstruction::GetDescription (lldb::SBStream &s)
945c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton{
955c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    if (m_opaque_sp)
965c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    {
975c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton        // Use the "ref()" instead of the "get()" accessor in case the SBStream
985c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton        // didn't have a stream already created, one will get created...
99889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton        m_opaque_sp->Dump (&s.ref(), 0, true, false, NULL, false);
1005c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton        return true;
1015c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    }
1025c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    return false;
1035c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton}
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBInstruction::Print (FILE *out)
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (out == NULL)
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return;
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1115c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    if (m_opaque_sp)
1125c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    {
1135892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        StreamFile out_stream (out, false);
114889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton        m_opaque_sp->Dump (&out_stream, 0, true, false, NULL, false);
1155c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton    }
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
117af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice
118af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Ticebool
1190fe5a535b87841a5c422f4a79d55c21bf07b50caCaroline TiceSBInstruction::EmulateWithFrame (lldb::SBFrame &frame, bool auto_advance_pc)
120af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice{
121af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice    if (m_opaque_sp && frame.get())
122af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice    {
123af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice        lldb_private::ExecutionContext exe_ctx;
124af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice        frame->CalculateExecutionContext (exe_ctx);
125af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice        lldb_private::Target *target = exe_ctx.target;
126af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice        lldb_private::ArchSpec arch = target->GetArchitecture();
127af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice
128af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice        return m_opaque_sp->Emulate (arch,
1290fe5a535b87841a5c422f4a79d55c21bf07b50caCaroline Tice                                     auto_advance_pc,
130af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice                                     (void *) frame.get(),
131af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice                                     &lldb_private::EmulateInstruction::ReadMemoryFrame,
132af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice                                     &lldb_private::EmulateInstruction::WriteMemoryFrame,
133af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice                                     &lldb_private::EmulateInstruction::ReadRegisterFrame,
134af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice                                     &lldb_private::EmulateInstruction::WriteRegisterFrame);
135af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice    }
136af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice    return false;
137af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice}
138af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice
139af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Ticebool
140af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline TiceSBInstruction::DumpEmulation (const char *triple)
141af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice{
142af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice    if (m_opaque_sp && triple)
143af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice    {
144f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton        lldb_private::ArchSpec arch (triple, NULL);
145af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice
1460fe5a535b87841a5c422f4a79d55c21bf07b50caCaroline Tice        return m_opaque_sp->DumpEmulation (arch);
1470fe5a535b87841a5c422f4a79d55c21bf07b50caCaroline Tice
148af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice    }
149af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice    return false;
150af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice}
151af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice
152