summaryrefslogtreecommitdiffstats
path: root/lldb/source/Core/Disassembler.cpp
diff options
context:
space:
mode:
authorSean Callanan <scallanan@apple.com>2012-08-01 18:50:59 +0000
committerSean Callanan <scallanan@apple.com>2012-08-01 18:50:59 +0000
commit7e6d4e5a11074535916669f83f5894ac0af495c8 (patch)
tree20b1891196c4bf276af620f43cfce844187f1e06 /lldb/source/Core/Disassembler.cpp
parent24c19d20c0351903e3b72362b94941628b821f92 (diff)
downloadbcm5719-llvm-7e6d4e5a11074535916669f83f5894ac0af495c8.tar.gz
bcm5719-llvm-7e6d4e5a11074535916669f83f5894ac0af495c8.zip
Instructions generated by a disassembler can now
keep a shared pointer to their disassembler. This is important for the LLVM-C disassembler because it needs to lock its parent in order to disassemble itself. This means that every interface that returned a Disassembler* needs to return a DisassemblerSP, so that the instructions and any external owners share the same reference count on the object. I changed all clients to use this shared pointer, which also plugged a few leaks. <rdar://problem/12002822> llvm-svn: 161123
Diffstat (limited to 'lldb/source/Core/Disassembler.cpp')
-rw-r--r--lldb/source/Core/Disassembler.cpp37
1 files changed, 18 insertions, 19 deletions
diff --git a/lldb/source/Core/Disassembler.cpp b/lldb/source/Core/Disassembler.cpp
index cb5b14fca9c..448ad29dfb0 100644
--- a/lldb/source/Core/Disassembler.cpp
+++ b/lldb/source/Core/Disassembler.cpp
@@ -37,7 +37,7 @@ using namespace lldb;
using namespace lldb_private;
-Disassembler*
+DisassemblerSP
Disassembler::FindPlugin (const ArchSpec &arch, const char *plugin_name)
{
Timer scoped_timer (__PRETTY_FUNCTION__,
@@ -45,7 +45,6 @@ Disassembler::FindPlugin (const ArchSpec &arch, const char *plugin_name)
arch.GetArchitectureName(),
plugin_name);
- std::auto_ptr<Disassembler> disassembler_ap;
DisassemblerCreateInstance create_callback = NULL;
if (plugin_name)
@@ -53,23 +52,23 @@ Disassembler::FindPlugin (const ArchSpec &arch, const char *plugin_name)
create_callback = PluginManager::GetDisassemblerCreateCallbackForPluginName (plugin_name);
if (create_callback)
{
- disassembler_ap.reset (create_callback(arch));
+ DisassemblerSP disassembler_sp(create_callback(arch));
- if (disassembler_ap.get())
- return disassembler_ap.release();
+ if (disassembler_sp.get())
+ return disassembler_sp;
}
}
else
{
for (uint32_t idx = 0; (create_callback = PluginManager::GetDisassemblerCreateCallbackAtIndex(idx)) != NULL; ++idx)
{
- disassembler_ap.reset (create_callback(arch));
+ DisassemblerSP disassembler_sp(create_callback(arch));
- if (disassembler_ap.get())
- return disassembler_ap.release();
+ if (disassembler_sp.get())
+ return disassembler_sp;
}
}
- return NULL;
+ return DisassemblerSP();
}
@@ -221,7 +220,7 @@ Disassembler::DisassembleRange
lldb::DisassemblerSP disasm_sp;
if (range.GetByteSize() > 0 && range.GetBaseAddress().IsValid())
{
- disasm_sp.reset (Disassembler::FindPlugin(arch, plugin_name));
+ disasm_sp = Disassembler::FindPlugin(arch, plugin_name);
if (disasm_sp)
{
@@ -248,7 +247,7 @@ Disassembler::DisassembleBytes
if (bytes)
{
- disasm_sp.reset(Disassembler::FindPlugin(arch, plugin_name));
+ disasm_sp = Disassembler::FindPlugin(arch, plugin_name);
if (disasm_sp)
{
@@ -282,19 +281,19 @@ Disassembler::Disassemble
{
if (disasm_range.GetByteSize())
{
- std::auto_ptr<Disassembler> disasm_ap (Disassembler::FindPlugin(arch, plugin_name));
+ lldb::DisassemblerSP disasm_sp (Disassembler::FindPlugin(arch, plugin_name));
- if (disasm_ap.get())
+ if (disasm_sp.get())
{
AddressRange range;
ResolveAddress (exe_ctx, disasm_range.GetBaseAddress(), range.GetBaseAddress());
range.SetByteSize (disasm_range.GetByteSize());
- size_t bytes_disassembled = disasm_ap->ParseInstructions (&exe_ctx, range, &strm);
+ size_t bytes_disassembled = disasm_sp->ParseInstructions (&exe_ctx, range, &strm);
if (bytes_disassembled == 0)
return false;
- return PrintInstructions (disasm_ap.get(),
+ return PrintInstructions (disasm_sp.get(),
debugger,
arch,
exe_ctx,
@@ -323,16 +322,16 @@ Disassembler::Disassemble
{
if (num_instructions > 0)
{
- std::auto_ptr<Disassembler> disasm_ap (Disassembler::FindPlugin(arch, plugin_name));
- if (disasm_ap.get())
+ lldb::DisassemblerSP disasm_sp (Disassembler::FindPlugin(arch, plugin_name));
+ if (disasm_sp.get())
{
Address addr;
ResolveAddress (exe_ctx, start_address, addr);
- size_t bytes_disassembled = disasm_ap->ParseInstructions (&exe_ctx, addr, num_instructions);
+ size_t bytes_disassembled = disasm_sp->ParseInstructions (&exe_ctx, addr, num_instructions);
if (bytes_disassembled == 0)
return false;
- return PrintInstructions (disasm_ap.get(),
+ return PrintInstructions (disasm_sp.get(),
debugger,
arch,
exe_ctx,
OpenPOWER on IntegriCloud