diff options
author | Sean Callanan <scallanan@apple.com> | 2012-08-01 18:50:59 +0000 |
---|---|---|
committer | Sean Callanan <scallanan@apple.com> | 2012-08-01 18:50:59 +0000 |
commit | 7e6d4e5a11074535916669f83f5894ac0af495c8 (patch) | |
tree | 20b1891196c4bf276af620f43cfce844187f1e06 /lldb/source/Core/Disassembler.cpp | |
parent | 24c19d20c0351903e3b72362b94941628b821f92 (diff) | |
download | bcm5719-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.cpp | 37 |
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, |