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