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> #include <vector>
// Other libraries and framework includes // Other libraries and framework includes
#include "lldb/lldb-forward-rtti.h" #include "lldb/lldb-forward.h"
namespace lldb_private { namespace lldb_private {
class DataExtractor; class DataExtractor;

View File

@ -307,7 +307,7 @@ DynamicLoaderPOSIXDYLD::GetStepThroughTrampolinePlan(Thread &thread, bool stop)
return thread_plan_sp; return thread_plan_sp;
SymbolContextList target_symbols; SymbolContextList target_symbols;
Target &target = thread.GetProcess().GetTarget(); Target &target = thread.GetProcess()->GetTarget();
ModuleList &images = target.GetImages(); ModuleList &images = target.GetImages();
images.FindSymbolsWithNameAndType(sym_name, eSymbolTypeCode, target_symbols); 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, error = m_remote_platform_sp->ResolveExecutable (exe_file,
exe_arch, exe_arch,
exe_module_sp); exe_module_sp,
NULL);
} }
else else
{ {
@ -152,6 +153,7 @@ PlatformLinux::ResolveExecutable (const FileSpec &exe_file,
0, 0,
exe_module_sp, exe_module_sp,
NULL, NULL,
NULL,
NULL); NULL);
if (exe_module_sp->GetObjectFile() == NULL) if (exe_module_sp->GetObjectFile() == NULL)
@ -180,6 +182,7 @@ PlatformLinux::ResolveExecutable (const FileSpec &exe_file,
0, 0,
exe_module_sp, exe_module_sp,
NULL, NULL,
NULL,
NULL); NULL);
// Did we find an executable using one of the // Did we find an executable using one of the
if (error.Success()) if (error.Success())
@ -367,7 +370,9 @@ PlatformLinux::Attach(ProcessAttachInfo &attach_info,
{ {
debugger.GetTargetList().SetSelectedTarget(target); debugger.GetTargetList().SetSelectedTarget(target);
process_sp = target->CreateProcess (listener, attach_info.GetProcessPluginName()); process_sp = target->CreateProcess (listener,
attach_info.GetProcessPluginName(),
NULL);
if (process_sp) if (process_sp)
error = process_sp->Attach (attach_info); error = process_sp->Attach (attach_info);

View File

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

View File

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

View File

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

View File

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

View File

@ -29,7 +29,7 @@ class POSIXThread
: public lldb_private::Thread : public lldb_private::Thread
{ {
public: public:
POSIXThread(lldb_private::Process &process, lldb::tid_t tid); POSIXThread(lldb::ProcessSP &process, lldb::tid_t tid);
virtual ~POSIXThread(); 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. // FIXME: We should be using tid, not pid.
assert(m_monitor); assert(m_monitor);
ThreadSP thread_sp (old_thread_list.FindThreadByID (GetID(), false)); ThreadSP thread_sp (old_thread_list.FindThreadByID (GetID(), false));
if (!thread_sp) if (!thread_sp) {
thread_sp.reset(new POSIXThread(*this, GetID())); ProcessSP me = this->shared_from_this();
thread_sp.reset(new POSIXThread(me, GetID()));
}
if (log && log->GetMask().Test(POSIX_LOG_VERBOSE)) if (log && log->GetMask().Test(POSIX_LOG_VERBOSE))
log->Printf ("ProcessPOSIX::%s() updated pid = %i", __FUNCTION__, GetID()); log->Printf ("ProcessPOSIX::%s() updated pid = %i", __FUNCTION__, GetID());

View File

@ -44,44 +44,38 @@ ProcessPOSIXLog::GetLogIfAllCategoriesSet (uint32_t mask)
} }
void void
ProcessPOSIXLog::DisableLog (Args &args, Stream *feedback_strm) ProcessPOSIXLog::DisableLog (const char **args, Stream *feedback_strm)
{ {
LogSP log (GetLog ()); LogSP log (GetLog ());
if (log) if (log)
{ {
uint32_t flag_bits = 0; uint32_t flag_bits = 0;
const size_t argc = args.GetArgumentCount (); flag_bits = log->GetMask().Get();
if (argc > 0) for (; args[0]; args++)
{ {
flag_bits = log->GetMask().Get(); const char *arg = args[0];
for (size_t i = 0; i < argc; ++i)
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
{ {
const char *arg = args.GetArgumentAtIndex (i); 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 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. // 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. // 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 // Now make a new log with this stream if one was provided
if (log_stream_sp) if (log_stream_sp)
{ {
log = make_shared<Log>(log_stream_sp); log = LogSP(new Log(log_stream_sp));
GetLog () = log; GetLog () = log;
} }
if (log) if (log)
{ {
bool got_unknown_category = false; bool got_unknown_category = false;
const size_t argc = args.GetArgumentCount(); for (; args[0]; args++)
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; if (::strcasecmp (arg, "all") == 0 ) flag_bits |= POSIX_LOG_ALL;
else if (::strcasecmp (arg, "async") == 0 ) flag_bits |= POSIX_LOG_ASYNC; else if (::strcasecmp (arg, "async") == 0 ) flag_bits |= POSIX_LOG_ASYNC;

View File

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

View File

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

View File

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

View File

@ -34,7 +34,7 @@ StopInfoMachException::GetDescription ()
{ {
ExecutionContext exe_ctx (m_thread.shared_from_this()); ExecutionContext exe_ctx (m_thread.shared_from_this());
Target *target = exe_ctx.GetTargetPtr(); 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 *exc_desc = NULL;
const char *code_label = "code"; const char *code_label = "code";
@ -257,7 +257,7 @@ StopInfoMachException::CreateStopReasonWithMachException
{ {
ExecutionContext exe_ctx (thread.shared_from_this()); ExecutionContext exe_ctx (thread.shared_from_this());
Target *target = exe_ctx.GetTargetPtr(); 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) switch (exc_type)
{ {