124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- SBInstructionList.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/SBInstructionList.h" 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/API/SBInstruction.h" 125c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton#include "lldb/API/SBStream.h" 135c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton#include "lldb/Core/Disassembler.h" 145c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton#include "lldb/Core/Stream.h" 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 175c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Claytonusing namespace lldb_private; 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 205c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg ClaytonSBInstructionList::SBInstructionList () : 215c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton m_opaque_sp() 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25538eb82a89a68dbc57251915080bd5152b333978Greg ClaytonSBInstructionList::SBInstructionList(const SBInstructionList &rhs) : 26538eb82a89a68dbc57251915080bd5152b333978Greg Clayton m_opaque_sp (rhs.m_opaque_sp) 27538eb82a89a68dbc57251915080bd5152b333978Greg Clayton{ 28538eb82a89a68dbc57251915080bd5152b333978Greg Clayton} 29538eb82a89a68dbc57251915080bd5152b333978Greg Clayton 30538eb82a89a68dbc57251915080bd5152b333978Greg Claytonconst SBInstructionList & 31538eb82a89a68dbc57251915080bd5152b333978Greg ClaytonSBInstructionList::operator = (const SBInstructionList &rhs) 32538eb82a89a68dbc57251915080bd5152b333978Greg Clayton{ 33538eb82a89a68dbc57251915080bd5152b333978Greg Clayton if (this != &rhs) 34538eb82a89a68dbc57251915080bd5152b333978Greg Clayton m_opaque_sp = rhs.m_opaque_sp; 35538eb82a89a68dbc57251915080bd5152b333978Greg Clayton return *this; 36538eb82a89a68dbc57251915080bd5152b333978Greg Clayton} 37538eb82a89a68dbc57251915080bd5152b333978Greg Clayton 38538eb82a89a68dbc57251915080bd5152b333978Greg Clayton 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBInstructionList::~SBInstructionList () 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 43d2554b5b7d4531b44bfbbea00cccc5fd274ef76bJohnny Chenbool 44d2554b5b7d4531b44bfbbea00cccc5fd274ef76bJohnny ChenSBInstructionList::IsValid () const 45d2554b5b7d4531b44bfbbea00cccc5fd274ef76bJohnny Chen{ 46d2554b5b7d4531b44bfbbea00cccc5fd274ef76bJohnny Chen return m_opaque_sp.get() != NULL; 47d2554b5b7d4531b44bfbbea00cccc5fd274ef76bJohnny Chen} 48d2554b5b7d4531b44bfbbea00cccc5fd274ef76bJohnny Chen 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBInstructionList::GetSize () 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 525c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton if (m_opaque_sp) 535c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton return m_opaque_sp->GetInstructionList().GetSize(); 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBInstruction 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBInstructionList::GetInstructionAtIndex (uint32_t idx) 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SBInstruction inst; 615c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton if (m_opaque_sp && idx < m_opaque_sp->GetInstructionList().GetSize()) 625c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton inst.SetOpaque (m_opaque_sp->GetInstructionList().GetInstructionAtIndex (idx)); 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return inst; 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBInstructionList::Clear () 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 695c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton m_opaque_sp.reset(); 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBInstructionList::AppendInstruction (SBInstruction insn) 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 785c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg ClaytonSBInstructionList::SetDisassembler (const lldb::DisassemblerSP &opaque_sp) 795c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton{ 805c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton m_opaque_sp = opaque_sp; 815c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton} 825c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton 835c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Claytonvoid 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBInstructionList::Print (FILE *out) 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (out == NULL) 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 905c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton 915c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Claytonbool 925c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg ClaytonSBInstructionList::GetDescription (lldb::SBStream &description) 935c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton{ 945c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton if (m_opaque_sp) 955c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton { 965c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton size_t num_instructions = GetSize (); 975c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton if (num_instructions) 985c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton { 995c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton // Call the ref() to make sure a stream is created if one deesn't 1005c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton // exist already inside description... 1015c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton Stream &sref = description.ref(); 102889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton const uint32_t max_opcode_byte_size = m_opaque_sp->GetInstructionList().GetMaxOpcocdeByteSize(); 1035c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton for (size_t i=0; i<num_instructions; ++i) 1045c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton { 1055c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton Instruction *inst = m_opaque_sp->GetInstructionList().GetInstructionAtIndex (i).get(); 1065c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton if (inst == NULL) 1075c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton break; 1080fef968c843be422d6facc2e8d54d8471eee88edGreg Clayton inst->Dump (&sref, max_opcode_byte_size, true, false, NULL); 1095c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton sref.EOL(); 1105c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton } 1115c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton return true; 1125c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton } 1135c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton } 1145c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton return false; 1155c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton} 1165c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton 1175c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton 118af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Ticebool 119af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline TiceSBInstructionList::DumpEmulationForAllInstructions (const char *triple) 120af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice{ 121af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice if (m_opaque_sp) 122af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice { 123af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice size_t len = GetSize(); 124af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice for (size_t i = 0; i < len; ++i) 125af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice { 126af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice if (!GetInstructionAtIndex((uint32_t) i).DumpEmulation (triple)) 127af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice return false; 128af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice } 129af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice } 130af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice return true; 131af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice} 132af59180d46b42665dba3ea581fc501bb9fcb1fb7Caroline Tice 133