blob: 0051fad8281adb0f339351a65e493880f77619a3 [file] [log] [blame]
Stephen Wilsone6f9f662010-07-24 02:19:04 +00001//===-- ProcessLinux.cpp ----------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10// C Includes
Stephen Wilson26977162011-03-23 02:14:42 +000011#include <errno.h>
12
Stephen Wilsone6f9f662010-07-24 02:19:04 +000013// C++ Includes
14// Other libraries and framework includes
15#include "lldb/Core/PluginManager.h"
Peter Collingbourne70969ef2011-06-03 20:40:44 +000016#include "lldb/Core/State.h"
Stephen Wilsone6f9f662010-07-24 02:19:04 +000017#include "lldb/Host/Host.h"
18#include "lldb/Symbol/ObjectFile.h"
Stephen Wilson2103e252011-01-16 19:45:39 +000019#include "lldb/Target/DynamicLoader.h"
Stephen Wilsone6f9f662010-07-24 02:19:04 +000020#include "lldb/Target/Target.h"
21
22#include "ProcessLinux.h"
Johnny Chen30213ff2012-01-05 19:17:38 +000023#include "ProcessPOSIXLog.h"
Peter Collingbourne70969ef2011-06-03 20:40:44 +000024#include "Plugins/Process/Utility/InferiorCallPOSIX.h"
Stephen Wilsone6f9f662010-07-24 02:19:04 +000025#include "ProcessMonitor.h"
Johnny Chen30213ff2012-01-05 19:17:38 +000026#include "POSIXThread.h"
Stephen Wilsone6f9f662010-07-24 02:19:04 +000027
28using namespace lldb;
29using namespace lldb_private;
30
31//------------------------------------------------------------------------------
32// Static functions.
33
Greg Clayton0c90ef42012-02-21 18:40:07 +000034ProcessSP
Ashok Thirumurthic0373832013-07-12 21:25:02 +000035ProcessLinux::CreateInstance(Target &target, Listener &listener, const FileSpec *core_file)
Stephen Wilsone6f9f662010-07-24 02:19:04 +000036{
Ashok Thirumurthic0373832013-07-12 21:25:02 +000037 return ProcessSP(new ProcessLinux(target, listener, (FileSpec *)core_file));
Stephen Wilsone6f9f662010-07-24 02:19:04 +000038}
39
40void
41ProcessLinux::Initialize()
42{
43 static bool g_initialized = false;
44
45 if (!g_initialized)
46 {
Johnny Chen6dcbeae2011-10-11 21:21:57 +000047 g_initialized = true;
Stephen Wilsone6f9f662010-07-24 02:19:04 +000048 PluginManager::RegisterPlugin(GetPluginNameStatic(),
49 GetPluginDescriptionStatic(),
50 CreateInstance);
Johnny Chen6dcbeae2011-10-11 21:21:57 +000051
52 Log::Callbacks log_callbacks = {
Johnny Chen30213ff2012-01-05 19:17:38 +000053 ProcessPOSIXLog::DisableLog,
54 ProcessPOSIXLog::EnableLog,
55 ProcessPOSIXLog::ListLogCategories
Johnny Chen6dcbeae2011-10-11 21:21:57 +000056 };
57
58 Log::RegisterLogChannel (ProcessLinux::GetPluginNameStatic(), log_callbacks);
Johnny Chen30213ff2012-01-05 19:17:38 +000059 ProcessPOSIXLog::RegisterPluginName(GetPluginNameStatic());
Stephen Wilsone6f9f662010-07-24 02:19:04 +000060 }
61}
62
Stephen Wilsone6f9f662010-07-24 02:19:04 +000063//------------------------------------------------------------------------------
64// Constructors and destructors.
65
Ashok Thirumurthic0373832013-07-12 21:25:02 +000066ProcessLinux::ProcessLinux(Target& target, Listener &listener, FileSpec *core_file)
Andrew Kaylor93132f52013-05-28 23:04:25 +000067 : ProcessPOSIX(target, listener), m_stopping_threads(false)
Stephen Wilsone6f9f662010-07-24 02:19:04 +000068{
Ashok Thirumurthic0373832013-07-12 21:25:02 +000069 m_core_file = core_file;
Greg Clayton386ff182011-11-05 01:09:16 +000070#if 0
Stephen Wilsone6f9f662010-07-24 02:19:04 +000071 // FIXME: Putting this code in the ctor and saving the byte order in a
72 // member variable is a hack to avoid const qual issues in GetByteOrder.
73 ObjectFile *obj_file = GetTarget().GetExecutableModule()->GetObjectFile();
74 m_byte_order = obj_file->GetByteOrder();
Greg Clayton386ff182011-11-05 01:09:16 +000075#else
76 // XXX: Will work only for local processes.
77 m_byte_order = lldb::endian::InlHostByteOrder();
78#endif
Stephen Wilsone6f9f662010-07-24 02:19:04 +000079}
80
Stephen Wilson2103e252011-01-16 19:45:39 +000081void
Johnny Chen30213ff2012-01-05 19:17:38 +000082ProcessLinux::Terminate()
Stephen Wilson2103e252011-01-16 19:45:39 +000083{
Stephen Wilson2103e252011-01-16 19:45:39 +000084}
Greg Clayton57abc5d2013-05-10 21:47:16 +000085lldb_private::ConstString
Johnny Chen30213ff2012-01-05 19:17:38 +000086ProcessLinux::GetPluginNameStatic()
Stephen Wilsone6f9f662010-07-24 02:19:04 +000087{
Greg Clayton57abc5d2013-05-10 21:47:16 +000088 static ConstString g_name("linux");
89 return g_name;
Stephen Wilsone6f9f662010-07-24 02:19:04 +000090}
91
Johnny Chen30213ff2012-01-05 19:17:38 +000092const char *
93ProcessLinux::GetPluginDescriptionStatic()
Stephen Wilsonc4391cb2011-01-15 00:10:37 +000094{
Johnny Chen30213ff2012-01-05 19:17:38 +000095 return "Process plugin for Linux";
Stephen Wilsonc4391cb2011-01-15 00:10:37 +000096}
97
Stephen Wilsone6f9f662010-07-24 02:19:04 +000098
Greg Claytonc3c0b0e2012-04-12 19:04:34 +000099bool
Johnny Chen48d042b2011-10-10 23:11:50 +0000100ProcessLinux::UpdateThreadList(ThreadList &old_thread_list, ThreadList &new_thread_list)
101{
Matt Kopec650648f2013-01-08 16:30:18 +0000102 new_thread_list = old_thread_list;
Greg Claytonc3c0b0e2012-04-12 19:04:34 +0000103 return new_thread_list.GetSize(false) > 0;
Johnny Chen48d042b2011-10-10 23:11:50 +0000104}
105
Stephen Wilson26977162011-03-23 02:14:42 +0000106
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000107//------------------------------------------------------------------------------
108// ProcessInterface protocol.
109
Greg Clayton57abc5d2013-05-10 21:47:16 +0000110lldb_private::ConstString
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000111ProcessLinux::GetPluginName()
112{
Greg Clayton57abc5d2013-05-10 21:47:16 +0000113 return GetPluginNameStatic();
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000114}
115
116uint32_t
117ProcessLinux::GetPluginVersion()
118{
119 return 1;
120}
121
122void
123ProcessLinux::GetPluginCommandHelp(const char *command, Stream *strm)
124{
125}
126
127Error
128ProcessLinux::ExecutePluginCommand(Args &command, Stream *strm)
129{
130 return Error(1, eErrorTypeGeneric);
131}
132
133Log *
134ProcessLinux::EnablePluginLogging(Stream *strm, Args &command)
135{
136 return NULL;
137}
Andrew Kaylor93132f52013-05-28 23:04:25 +0000138
139// ProcessPOSIX override
140void
141ProcessLinux::StopAllThreads(lldb::tid_t stop_tid)
142{
143 // If a breakpoint occurs while we're stopping threads, we'll get back
144 // here, but we don't want to do it again. Only the MonitorChildProcess
145 // thread calls this function, so we don't need to protect this flag.
146 if (m_stopping_threads)
147 return;
148 m_stopping_threads = true;
149
150 Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_PROCESS));
151 if (log)
152 log->Printf ("ProcessLinux::%s() stopping all threads", __FUNCTION__);
153
154 // Walk the thread list and stop the other threads. The thread that caused
155 // the stop should already be marked as stopped before we get here.
156 Mutex::Locker thread_list_lock(m_thread_list.GetMutex());
157
158 uint32_t thread_count = m_thread_list.GetSize(false);
159 for (uint32_t i = 0; i < thread_count; ++i)
160 {
161 POSIXThread *thread = static_cast<POSIXThread*>(
162 m_thread_list.GetThreadAtIndex(i, false).get());
163 assert(thread);
164 lldb::tid_t tid = thread->GetID();
165 if (!StateIsStoppedState(thread->GetState(), false))
166 m_monitor->StopThread(tid);
167 }
168
169 m_stopping_threads = false;
170
171 if (log)
172 log->Printf ("ProcessLinux::%s() finished", __FUNCTION__);
173}
Ashok Thirumurthic0373832013-07-12 21:25:02 +0000174
175bool
176ProcessLinux::CanDebug(Target &target, bool plugin_specified_by_name)
177{
178 if (plugin_specified_by_name)
179 return true;
180
181 /* If core file is specified then let elf-core plugin handle it */
182 if (m_core_file)
183 return false;
184
185 return ProcessPOSIX::CanDebug(target, plugin_specified_by_name);
186}
187