Linux fix patch from Dmitry Vyukov.

llvm-svn: 151072
This commit is contained in:
Greg Clayton 2012-02-21 18:40:07 +00:00
parent ff461fcf07
commit 0c90ef479a
14 changed files with 71 additions and 61 deletions

View File

@ -15,7 +15,7 @@
#include <vector>
// Other libraries and framework includes
#include "lldb/lldb-forward-rtti.h"
#include "lldb/lldb-forward.h"
namespace lldb_private {
class DataExtractor;

View File

@ -307,7 +307,7 @@ DynamicLoaderPOSIXDYLD::GetStepThroughTrampolinePlan(Thread &thread, bool stop)
return thread_plan_sp;
SymbolContextList target_symbols;
Target &target = thread.GetProcess().GetTarget();
Target &target = thread.GetProcess()->GetTarget();
ModuleList &images = target.GetImages();
images.FindSymbolsWithNameAndType(sym_name, eSymbolTypeCode, target_symbols);

View File

@ -128,7 +128,8 @@ PlatformLinux::ResolveExecutable (const FileSpec &exe_file,
{
error = m_remote_platform_sp->ResolveExecutable (exe_file,
exe_arch,
exe_module_sp);
exe_module_sp,
NULL);
}
else
{
@ -152,6 +153,7 @@ PlatformLinux::ResolveExecutable (const FileSpec &exe_file,
0,
exe_module_sp,
NULL,
NULL,
NULL);
if (exe_module_sp->GetObjectFile() == NULL)
@ -180,6 +182,7 @@ PlatformLinux::ResolveExecutable (const FileSpec &exe_file,
0,
exe_module_sp,
NULL,
NULL,
NULL);
// Did we find an executable using one of the
if (error.Success())
@ -367,7 +370,9 @@ PlatformLinux::Attach(ProcessAttachInfo &attach_info,
{
debugger.GetTargetList().SetSelectedTarget(target);
process_sp = target->CreateProcess (listener, attach_info.GetProcessPluginName());
process_sp = target->CreateProcess (listener,
attach_info.GetProcessPluginName(),
NULL);
if (process_sp)
error = process_sp->Attach (attach_info);

View File

@ -31,10 +31,10 @@ using namespace lldb_private;
//------------------------------------------------------------------------------
// Static functions.
Process*
ProcessLinux::CreateInstance(Target& target, Listener &listener)
ProcessSP
ProcessLinux::CreateInstance(Target &target, Listener &listener, const FileSpec *)
{
return new ProcessLinux(target, listener);
return ProcessSP(new ProcessLinux(target, listener));
}
void
@ -105,8 +105,10 @@ ProcessLinux::UpdateThreadList(ThreadList &old_thread_list, ThreadList &new_thre
// FIXME: We should be using tid, not pid.
assert(m_monitor);
ThreadSP thread_sp (old_thread_list.FindThreadByID (GetID(), false));
if (!thread_sp)
thread_sp.reset(new POSIXThread(*this, GetID()));
if (!thread_sp) {
ProcessSP me = this->shared_from_this();
thread_sp.reset(new POSIXThread(me, GetID()));
}
if (log && log->GetMask().Test(POSIX_LOG_VERBOSE))
log->Printf ("ProcessLinux::%s() updated pid = %i", __FUNCTION__, GetID());

View File

@ -30,9 +30,10 @@ public:
//------------------------------------------------------------------
// Static functions.
//------------------------------------------------------------------
static Process*
static lldb::ProcessSP
CreateInstance(lldb_private::Target& target,
lldb_private::Listener &listener);
lldb_private::Listener &listener,
const lldb_private::FileSpec *);
static void
Initialize();

View File

@ -966,6 +966,7 @@ ProcessMonitor::Launch(LaunchArgs *args)
{
ProcessMonitor *monitor = args->m_monitor;
ProcessLinux &process = monitor->GetProcess();
lldb::ProcessSP processSP = process.shared_from_this();
const char **argv = args->m_argv;
const char **envp = args->m_envp;
const char *stdin_path = args->m_stdin_path;
@ -1104,7 +1105,7 @@ ProcessMonitor::Launch(LaunchArgs *args)
// Update the process thread list with this new thread.
// FIXME: should we be letting UpdateThreadList handle this?
// FIXME: by using pids instead of tids, we can only support one thread.
inferior.reset(new POSIXThread(process, pid));
inferior.reset(new POSIXThread(processSP, pid));
if (log)
log->Printf ("ProcessMonitor::%s() adding pid = %i", __FUNCTION__, pid);
process.GetThreadList().AddThread(inferior);
@ -1166,6 +1167,7 @@ ProcessMonitor::Attach(AttachArgs *args)
ProcessMonitor *monitor = args->m_monitor;
ProcessLinux &process = monitor->GetProcess();
lldb::ProcessSP processSP = process.shared_from_this();
lldb::ThreadSP inferior;
LogSP log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_PROCESS));
@ -1191,7 +1193,7 @@ ProcessMonitor::Attach(AttachArgs *args)
}
// Update the process thread list with the attached thread.
inferior.reset(new POSIXThread(process, pid));
inferior.reset(new POSIXThread(processSP, pid));
if (log)
log->Printf ("ProcessMonitor::%s() adding tid = %i", __FUNCTION__, pid);
process.GetThreadList().AddThread(inferior);

View File

@ -29,10 +29,11 @@
#include "UnwindLLDB.h"
using namespace lldb;
using namespace lldb_private;
POSIXThread::POSIXThread(Process &process, lldb::tid_t tid)
POSIXThread::POSIXThread(ProcessSP &process, lldb::tid_t tid)
: Thread(process, tid),
m_frame_ap(0)
{
@ -49,7 +50,8 @@ POSIXThread::~POSIXThread()
ProcessMonitor &
POSIXThread::GetMonitor()
{
ProcessPOSIX &process = static_cast<ProcessPOSIX&>(GetProcess());
ProcessSP base = GetProcess();
ProcessPOSIX &process = static_cast<ProcessPOSIX&>(*base);
return process.GetMonitor();
}
@ -62,7 +64,8 @@ POSIXThread::RefreshStateAfterStop()
// Let all threads recover from stopping and do any clean up based
// on the previous thread state (if any).
ProcessPOSIX &process = static_cast<ProcessPOSIX&>(GetProcess());
ProcessSP base = GetProcess();
ProcessPOSIX &process = static_cast<ProcessPOSIX&>(*base);
process.GetThreadList().RefreshStateAfterStop();
}
@ -237,7 +240,7 @@ POSIXThread::BreakNotify(const ProcessMessage &message)
lldb::addr_t pc = GetRegisterContext()->GetPC();
if (log)
log->Printf ("POSIXThread::%s () PC=0x%8.8llx", __FUNCTION__, pc);
lldb::BreakpointSiteSP bp_site(GetProcess().GetBreakpointSiteList().FindByAddress(pc));
lldb::BreakpointSiteSP bp_site(GetProcess()->GetBreakpointSiteList().FindByAddress(pc));
assert(bp_site);
lldb::break_id_t bp_id = bp_site->GetID();
assert(bp_site && bp_site->ValidForThisThread(this));

View File

@ -29,7 +29,7 @@ class POSIXThread
: public lldb_private::Thread
{
public:
POSIXThread(lldb_private::Process &process, lldb::tid_t tid);
POSIXThread(lldb::ProcessSP &process, lldb::tid_t tid);
virtual ~POSIXThread();

View File

@ -500,8 +500,10 @@ ProcessPOSIX::UpdateThreadList(ThreadList &old_thread_list, ThreadList &new_thre
// FIXME: We should be using tid, not pid.
assert(m_monitor);
ThreadSP thread_sp (old_thread_list.FindThreadByID (GetID(), false));
if (!thread_sp)
thread_sp.reset(new POSIXThread(*this, GetID()));
if (!thread_sp) {
ProcessSP me = this->shared_from_this();
thread_sp.reset(new POSIXThread(me, GetID()));
}
if (log && log->GetMask().Test(POSIX_LOG_VERBOSE))
log->Printf ("ProcessPOSIX::%s() updated pid = %i", __FUNCTION__, GetID());

View File

@ -44,44 +44,38 @@ ProcessPOSIXLog::GetLogIfAllCategoriesSet (uint32_t mask)
}
void
ProcessPOSIXLog::DisableLog (Args &args, Stream *feedback_strm)
ProcessPOSIXLog::DisableLog (const char **args, Stream *feedback_strm)
{
LogSP log (GetLog ());
if (log)
{
uint32_t flag_bits = 0;
const size_t argc = args.GetArgumentCount ();
if (argc > 0)
flag_bits = log->GetMask().Get();
for (; args[0]; args++)
{
flag_bits = log->GetMask().Get();
for (size_t i = 0; i < argc; ++i)
{
const char *arg = args.GetArgumentAtIndex (i);
const char *arg = args[0];
if (::strcasecmp (arg, "all") == 0 ) flag_bits &= ~POSIX_LOG_ALL;
else if (::strcasecmp (arg, "async") == 0 ) flag_bits &= ~POSIX_LOG_ASYNC;
else if (::strncasecmp (arg, "break", 5) == 0 ) flag_bits &= ~POSIX_LOG_BREAKPOINTS;
else if (::strncasecmp (arg, "comm", 4) == 0 ) flag_bits &= ~POSIX_LOG_COMM;
else if (::strcasecmp (arg, "default") == 0 ) flag_bits &= ~POSIX_LOG_DEFAULT;
else if (::strcasecmp (arg, "packets") == 0 ) flag_bits &= ~POSIX_LOG_PACKETS;
else if (::strcasecmp (arg, "memory") == 0 ) flag_bits &= ~POSIX_LOG_MEMORY;
else if (::strcasecmp (arg, "data-short") == 0 ) flag_bits &= ~POSIX_LOG_MEMORY_DATA_SHORT;
else if (::strcasecmp (arg, "data-long") == 0 ) flag_bits &= ~POSIX_LOG_MEMORY_DATA_LONG;
else if (::strcasecmp (arg, "process") == 0 ) flag_bits &= ~POSIX_LOG_PROCESS;
else if (::strcasecmp (arg, "ptrace") == 0 ) flag_bits &= ~POSIX_LOG_PTRACE;
else if (::strcasecmp (arg, "registers") == 0 ) flag_bits &= ~POSIX_LOG_REGISTERS;
else if (::strcasecmp (arg, "step") == 0 ) flag_bits &= ~POSIX_LOG_STEP;
else if (::strcasecmp (arg, "thread") == 0 ) flag_bits &= ~POSIX_LOG_THREAD;
else if (::strcasecmp (arg, "verbose") == 0 ) flag_bits &= ~POSIX_LOG_VERBOSE;
else if (::strncasecmp (arg, "watch", 5) == 0 ) flag_bits &= ~POSIX_LOG_WATCHPOINTS;
else
{
feedback_strm->Printf("error: unrecognized log category '%s'\n", arg);
ListLogCategories (feedback_strm);
}
if (::strcasecmp (arg, "all") == 0 ) flag_bits &= ~POSIX_LOG_ALL;
else if (::strcasecmp (arg, "async") == 0 ) flag_bits &= ~POSIX_LOG_ASYNC;
else if (::strncasecmp (arg, "break", 5) == 0 ) flag_bits &= ~POSIX_LOG_BREAKPOINTS;
else if (::strncasecmp (arg, "comm", 4) == 0 ) flag_bits &= ~POSIX_LOG_COMM;
else if (::strcasecmp (arg, "default") == 0 ) flag_bits &= ~POSIX_LOG_DEFAULT;
else if (::strcasecmp (arg, "packets") == 0 ) flag_bits &= ~POSIX_LOG_PACKETS;
else if (::strcasecmp (arg, "memory") == 0 ) flag_bits &= ~POSIX_LOG_MEMORY;
else if (::strcasecmp (arg, "data-short") == 0 ) flag_bits &= ~POSIX_LOG_MEMORY_DATA_SHORT;
else if (::strcasecmp (arg, "data-long") == 0 ) flag_bits &= ~POSIX_LOG_MEMORY_DATA_LONG;
else if (::strcasecmp (arg, "process") == 0 ) flag_bits &= ~POSIX_LOG_PROCESS;
else if (::strcasecmp (arg, "ptrace") == 0 ) flag_bits &= ~POSIX_LOG_PTRACE;
else if (::strcasecmp (arg, "registers") == 0 ) flag_bits &= ~POSIX_LOG_REGISTERS;
else if (::strcasecmp (arg, "step") == 0 ) flag_bits &= ~POSIX_LOG_STEP;
else if (::strcasecmp (arg, "thread") == 0 ) flag_bits &= ~POSIX_LOG_THREAD;
else if (::strcasecmp (arg, "verbose") == 0 ) flag_bits &= ~POSIX_LOG_VERBOSE;
else if (::strncasecmp (arg, "watch", 5) == 0 ) flag_bits &= ~POSIX_LOG_WATCHPOINTS;
else
{
feedback_strm->Printf("error: unrecognized log category '%s'\n", arg);
ListLogCategories (feedback_strm);
}
}
@ -95,7 +89,7 @@ ProcessPOSIXLog::DisableLog (Args &args, Stream *feedback_strm)
}
LogSP
ProcessPOSIXLog::EnableLog (StreamSP &log_stream_sp, uint32_t log_options, Args &args, Stream *feedback_strm)
ProcessPOSIXLog::EnableLog (StreamSP &log_stream_sp, uint32_t log_options, const char **args, Stream *feedback_strm)
{
// Try see if there already is a log - that way we can reuse its settings.
// We could reuse the log in toto, but we don't know that the stream is the same.
@ -107,17 +101,16 @@ ProcessPOSIXLog::EnableLog (StreamSP &log_stream_sp, uint32_t log_options, Args
// Now make a new log with this stream if one was provided
if (log_stream_sp)
{
log = make_shared<Log>(log_stream_sp);
log = LogSP(new Log(log_stream_sp));
GetLog () = log;
}
if (log)
{
bool got_unknown_category = false;
const size_t argc = args.GetArgumentCount();
for (size_t i=0; i<argc; ++i)
for (; args[0]; args++)
{
const char *arg = args.GetArgumentAtIndex(i);
const char *arg = args[0];
if (::strcasecmp (arg, "all") == 0 ) flag_bits |= POSIX_LOG_ALL;
else if (::strcasecmp (arg, "async") == 0 ) flag_bits |= POSIX_LOG_ASYNC;

View File

@ -54,11 +54,11 @@ public:
GetLogIfAllCategoriesSet(uint32_t mask = 0);
static void
DisableLog (lldb_private::Args &args, lldb_private::Stream *feedback_strm);
DisableLog (const char **args, lldb_private::Stream *feedback_strm);
static lldb::LogSP
EnableLog (lldb::StreamSP &log_stream_sp, uint32_t log_options,
lldb_private::Args &args, lldb_private::Stream *feedback_strm);
const char **args, lldb_private::Stream *feedback_strm);
static void
ListLogCategories (lldb_private::Stream *strm);

View File

@ -364,7 +364,8 @@ RegisterContext_i386::~RegisterContext_i386()
ProcessMonitor &
RegisterContext_i386::GetMonitor()
{
ProcessPOSIX *process = static_cast<ProcessPOSIX*>(CalculateProcess());
ProcessSP base = CalculateProcess();
ProcessPOSIX *process = static_cast<ProcessPOSIX*>(base.get());
return process->GetMonitor();
}

View File

@ -434,7 +434,8 @@ RegisterContext_x86_64::~RegisterContext_x86_64()
ProcessMonitor &
RegisterContext_x86_64::GetMonitor()
{
ProcessPOSIX *process = static_cast<ProcessPOSIX*>(CalculateProcess());
ProcessSP base = CalculateProcess();
ProcessPOSIX *process = static_cast<ProcessPOSIX*>(base.get());
return process->GetMonitor();
}

View File

@ -34,7 +34,7 @@ StopInfoMachException::GetDescription ()
{
ExecutionContext exe_ctx (m_thread.shared_from_this());
Target *target = exe_ctx.GetTargetPtr();
const llvm::Triple::ArchType cpu = target ? target->GetArchitecture().GetMachine() : llvm::Triple::InvalidArch;
const llvm::Triple::ArchType cpu = target ? target->GetArchitecture().GetMachine() : llvm::Triple::UnknownArch;
const char *exc_desc = NULL;
const char *code_label = "code";
@ -257,7 +257,7 @@ StopInfoMachException::CreateStopReasonWithMachException
{
ExecutionContext exe_ctx (thread.shared_from_this());
Target *target = exe_ctx.GetTargetPtr();
const llvm::Triple::ArchType cpu = target ? target->GetArchitecture().GetMachine() : llvm::Triple::InvalidArch;
const llvm::Triple::ArchType cpu = target ? target->GetArchitecture().GetMachine() : llvm::Triple::UnknownArch;
switch (exc_type)
{