From 0c90ef479a8870ed8adb598cd7e70518960f0353 Mon Sep 17 00:00:00 2001 From: Greg Clayton Date: Tue, 21 Feb 2012 18:40:07 +0000 Subject: [PATCH] Linux fix patch from Dmitry Vyukov. llvm-svn: 151072 --- .../DynamicLoader/POSIX-DYLD/AuxVector.h | 2 +- .../POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp | 2 +- .../Plugins/Platform/Linux/PlatformLinux.cpp | 9 ++- .../Plugins/Process/Linux/ProcessLinux.cpp | 12 ++-- .../Plugins/Process/Linux/ProcessLinux.h | 5 +- .../Plugins/Process/Linux/ProcessMonitor.cpp | 6 +- .../Plugins/Process/POSIX/POSIXThread.cpp | 11 ++-- .../Plugins/Process/POSIX/POSIXThread.h | 2 +- .../Plugins/Process/POSIX/ProcessPOSIX.cpp | 6 +- .../Plugins/Process/POSIX/ProcessPOSIXLog.cpp | 63 +++++++++---------- .../Plugins/Process/POSIX/ProcessPOSIXLog.h | 4 +- .../Process/POSIX/RegisterContext_i386.cpp | 3 +- .../Process/POSIX/RegisterContext_x86_64.cpp | 3 +- .../Process/Utility/StopInfoMachException.cpp | 4 +- 14 files changed, 71 insertions(+), 61 deletions(-) diff --git a/lldb/source/Plugins/DynamicLoader/POSIX-DYLD/AuxVector.h b/lldb/source/Plugins/DynamicLoader/POSIX-DYLD/AuxVector.h index 7a5b3700fcea..8b93fd656e04 100644 --- a/lldb/source/Plugins/DynamicLoader/POSIX-DYLD/AuxVector.h +++ b/lldb/source/Plugins/DynamicLoader/POSIX-DYLD/AuxVector.h @@ -15,7 +15,7 @@ #include // Other libraries and framework includes -#include "lldb/lldb-forward-rtti.h" +#include "lldb/lldb-forward.h" namespace lldb_private { class DataExtractor; diff --git a/lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp b/lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp index 05100cbdb246..a9987c0096d0 100644 --- a/lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp +++ b/lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp @@ -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); diff --git a/lldb/source/Plugins/Platform/Linux/PlatformLinux.cpp b/lldb/source/Plugins/Platform/Linux/PlatformLinux.cpp index 2eb333b88e44..d93ad011a857 100644 --- a/lldb/source/Plugins/Platform/Linux/PlatformLinux.cpp +++ b/lldb/source/Plugins/Platform/Linux/PlatformLinux.cpp @@ -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); diff --git a/lldb/source/Plugins/Process/Linux/ProcessLinux.cpp b/lldb/source/Plugins/Process/Linux/ProcessLinux.cpp index a8c33bc701d3..69d54ccf6390 100644 --- a/lldb/source/Plugins/Process/Linux/ProcessLinux.cpp +++ b/lldb/source/Plugins/Process/Linux/ProcessLinux.cpp @@ -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()); diff --git a/lldb/source/Plugins/Process/Linux/ProcessLinux.h b/lldb/source/Plugins/Process/Linux/ProcessLinux.h index cef8a662171f..49fdb45151cd 100644 --- a/lldb/source/Plugins/Process/Linux/ProcessLinux.h +++ b/lldb/source/Plugins/Process/Linux/ProcessLinux.h @@ -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(); diff --git a/lldb/source/Plugins/Process/Linux/ProcessMonitor.cpp b/lldb/source/Plugins/Process/Linux/ProcessMonitor.cpp index ed69b970f20b..6c35b7ef1c8a 100644 --- a/lldb/source/Plugins/Process/Linux/ProcessMonitor.cpp +++ b/lldb/source/Plugins/Process/Linux/ProcessMonitor.cpp @@ -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); diff --git a/lldb/source/Plugins/Process/POSIX/POSIXThread.cpp b/lldb/source/Plugins/Process/POSIX/POSIXThread.cpp index 3f5e022ee309..9de6c859b833 100644 --- a/lldb/source/Plugins/Process/POSIX/POSIXThread.cpp +++ b/lldb/source/Plugins/Process/POSIX/POSIXThread.cpp @@ -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(GetProcess()); + ProcessSP base = GetProcess(); + ProcessPOSIX &process = static_cast(*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(GetProcess()); + ProcessSP base = GetProcess(); + ProcessPOSIX &process = static_cast(*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)); diff --git a/lldb/source/Plugins/Process/POSIX/POSIXThread.h b/lldb/source/Plugins/Process/POSIX/POSIXThread.h index 95280d46bc54..7343884fe99a 100644 --- a/lldb/source/Plugins/Process/POSIX/POSIXThread.h +++ b/lldb/source/Plugins/Process/POSIX/POSIXThread.h @@ -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(); diff --git a/lldb/source/Plugins/Process/POSIX/ProcessPOSIX.cpp b/lldb/source/Plugins/Process/POSIX/ProcessPOSIX.cpp index 67cf8a9311b1..68ffc2f70c80 100644 --- a/lldb/source/Plugins/Process/POSIX/ProcessPOSIX.cpp +++ b/lldb/source/Plugins/Process/POSIX/ProcessPOSIX.cpp @@ -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()); diff --git a/lldb/source/Plugins/Process/POSIX/ProcessPOSIXLog.cpp b/lldb/source/Plugins/Process/POSIX/ProcessPOSIXLog.cpp index 6e7ae1464b49..017035d483ee 100644 --- a/lldb/source/Plugins/Process/POSIX/ProcessPOSIXLog.cpp +++ b/lldb/source/Plugins/Process/POSIX/ProcessPOSIXLog.cpp @@ -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_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(CalculateProcess()); + ProcessSP base = CalculateProcess(); + ProcessPOSIX *process = static_cast(base.get()); return process->GetMonitor(); } diff --git a/lldb/source/Plugins/Process/POSIX/RegisterContext_x86_64.cpp b/lldb/source/Plugins/Process/POSIX/RegisterContext_x86_64.cpp index 8ecb4d14cb8b..fc9dfbe8284a 100644 --- a/lldb/source/Plugins/Process/POSIX/RegisterContext_x86_64.cpp +++ b/lldb/source/Plugins/Process/POSIX/RegisterContext_x86_64.cpp @@ -434,7 +434,8 @@ RegisterContext_x86_64::~RegisterContext_x86_64() ProcessMonitor & RegisterContext_x86_64::GetMonitor() { - ProcessPOSIX *process = static_cast(CalculateProcess()); + ProcessSP base = CalculateProcess(); + ProcessPOSIX *process = static_cast(base.get()); return process->GetMonitor(); } diff --git a/lldb/source/Plugins/Process/Utility/StopInfoMachException.cpp b/lldb/source/Plugins/Process/Utility/StopInfoMachException.cpp index 95f3633616c7..95be8c51ad35 100644 --- a/lldb/source/Plugins/Process/Utility/StopInfoMachException.cpp +++ b/lldb/source/Plugins/Process/Utility/StopInfoMachException.cpp @@ -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) {