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