
plugin by name on the command line for when there is more than one disassembler plugin. Taught the Opcode class to dump itself so that "disassembler -b" will dump the bytes correctly for each opcode type. Modified all places that were passing the opcode bytes buffer in so that the bytes could be displayed to just pass in a bool that indicates if we should dump the opcode bytes since the opcode now lives inside llvm_private::Instruction. llvm-svn: 128290
111 lines
2.4 KiB
C++
111 lines
2.4 KiB
C++
//===-- SBInstructionList.cpp -----------------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "lldb/API/SBInstructionList.h"
|
|
#include "lldb/API/SBInstruction.h"
|
|
#include "lldb/API/SBStream.h"
|
|
#include "lldb/Core/Disassembler.h"
|
|
#include "lldb/Core/Stream.h"
|
|
|
|
using namespace lldb;
|
|
using namespace lldb_private;
|
|
|
|
|
|
SBInstructionList::SBInstructionList () :
|
|
m_opaque_sp()
|
|
{
|
|
}
|
|
|
|
SBInstructionList::SBInstructionList(const SBInstructionList &rhs) :
|
|
m_opaque_sp (rhs.m_opaque_sp)
|
|
{
|
|
}
|
|
|
|
const SBInstructionList &
|
|
SBInstructionList::operator = (const SBInstructionList &rhs)
|
|
{
|
|
if (this != &rhs)
|
|
m_opaque_sp = rhs.m_opaque_sp;
|
|
return *this;
|
|
}
|
|
|
|
|
|
SBInstructionList::~SBInstructionList ()
|
|
{
|
|
}
|
|
|
|
size_t
|
|
SBInstructionList::GetSize ()
|
|
{
|
|
if (m_opaque_sp)
|
|
return m_opaque_sp->GetInstructionList().GetSize();
|
|
return 0;
|
|
}
|
|
|
|
SBInstruction
|
|
SBInstructionList::GetInstructionAtIndex (uint32_t idx)
|
|
{
|
|
SBInstruction inst;
|
|
if (m_opaque_sp && idx < m_opaque_sp->GetInstructionList().GetSize())
|
|
inst.SetOpaque (m_opaque_sp->GetInstructionList().GetInstructionAtIndex (idx));
|
|
return inst;
|
|
}
|
|
|
|
void
|
|
SBInstructionList::Clear ()
|
|
{
|
|
m_opaque_sp.reset();
|
|
}
|
|
|
|
void
|
|
SBInstructionList::AppendInstruction (SBInstruction insn)
|
|
{
|
|
}
|
|
|
|
void
|
|
SBInstructionList::SetDisassembler (const lldb::DisassemblerSP &opaque_sp)
|
|
{
|
|
m_opaque_sp = opaque_sp;
|
|
}
|
|
|
|
void
|
|
SBInstructionList::Print (FILE *out)
|
|
{
|
|
if (out == NULL)
|
|
return;
|
|
}
|
|
|
|
|
|
bool
|
|
SBInstructionList::GetDescription (lldb::SBStream &description)
|
|
{
|
|
if (m_opaque_sp)
|
|
{
|
|
size_t num_instructions = GetSize ();
|
|
if (num_instructions)
|
|
{
|
|
// Call the ref() to make sure a stream is created if one deesn't
|
|
// exist already inside description...
|
|
Stream &sref = description.ref();
|
|
for (size_t i=0; i<num_instructions; ++i)
|
|
{
|
|
Instruction *inst = m_opaque_sp->GetInstructionList().GetInstructionAtIndex (i).get();
|
|
if (inst == NULL)
|
|
break;
|
|
inst->Dump (&sref, true, false, NULL, false);
|
|
sref.EOL();
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
|