blob: 6042a8f926746debaeef2f3ae3aec898e16b80c6 [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- Target.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
Daniel Malea93a64302012-12-05 00:20:57 +000010#include "lldb/lldb-python.h"
11
Chris Lattner30fdc8d2010-06-08 16:52:24 +000012#include "lldb/Target/Target.h"
13
14// C Includes
15// C++ Includes
16// Other libraries and framework includes
17// Project includes
18#include "lldb/Breakpoint/BreakpointResolver.h"
19#include "lldb/Breakpoint/BreakpointResolverAddress.h"
20#include "lldb/Breakpoint/BreakpointResolverFileLine.h"
Jim Ingham969795f2011-09-21 01:17:13 +000021#include "lldb/Breakpoint/BreakpointResolverFileRegex.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000022#include "lldb/Breakpoint/BreakpointResolverName.h"
Johnny Chen01a67862011-10-14 00:42:25 +000023#include "lldb/Breakpoint/Watchpoint.h"
Greg Clayton8b2fe6d2010-12-14 02:59:59 +000024#include "lldb/Core/Debugger.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000025#include "lldb/Core/Event.h"
26#include "lldb/Core/Log.h"
Greg Clayton1f746072012-08-29 21:13:06 +000027#include "lldb/Core/Module.h"
28#include "lldb/Core/ModuleSpec.h"
29#include "lldb/Core/Section.h"
Greg Clayton9585fbf2013-03-19 00:20:55 +000030#include "lldb/Core/SourceManager.h"
Greg Claytonb09c5382013-12-13 17:20:18 +000031#include "lldb/Core/State.h"
Greg Clayton44d93782014-01-27 23:43:24 +000032#include "lldb/Core/StreamFile.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000033#include "lldb/Core/StreamString.h"
Greg Clayton8b2fe6d2010-12-14 02:59:59 +000034#include "lldb/Core/Timer.h"
35#include "lldb/Core/ValueObject.h"
Sean Callanan4bf80d52011-11-15 22:27:19 +000036#include "lldb/Expression/ClangASTSource.h"
Zachary Turneraf0f45f2015-03-03 21:05:17 +000037#include "lldb/Expression/ClangPersistentVariables.h"
Greg Claytoneb0103f2011-04-07 22:46:35 +000038#include "lldb/Expression/ClangUserExpression.h"
Zachary Turner32abc6e2015-03-03 19:23:09 +000039#include "lldb/Expression/ClangModulesDeclVendor.h"
Zachary Turner10687b02014-10-20 17:46:43 +000040#include "lldb/Host/FileSpec.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000041#include "lldb/Host/Host.h"
Jim Ingham9575d842011-03-11 03:53:59 +000042#include "lldb/Interpreter/CommandInterpreter.h"
43#include "lldb/Interpreter/CommandReturnObject.h"
Johnny Chenb90827e2012-06-04 23:19:54 +000044#include "lldb/Interpreter/OptionGroupWatchpoint.h"
Greg Clayton67cc0632012-08-22 17:17:09 +000045#include "lldb/Interpreter/OptionValues.h"
46#include "lldb/Interpreter/Property.h"
Zachary Turnera78bd7f2015-03-03 23:11:11 +000047#include "lldb/Symbol/ClangASTContext.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000048#include "lldb/Symbol/ObjectFile.h"
Zachary Turnera78bd7f2015-03-03 23:11:11 +000049#include "lldb/Target/LanguageRuntime.h"
50#include "lldb/Target/ObjCLanguageRuntime.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000051#include "lldb/Target/Process.h"
Greg Claytond5944cd2013-12-06 01:12:00 +000052#include "lldb/Target/SectionLoadList.h"
Jason Molendab57e4a12013-11-04 09:33:30 +000053#include "lldb/Target/StackFrame.h"
Jason Molendaeef51062013-11-05 03:57:19 +000054#include "lldb/Target/SystemRuntime.h"
Jim Ingham9575d842011-03-11 03:53:59 +000055#include "lldb/Target/Thread.h"
56#include "lldb/Target/ThreadSpec.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000057
58using namespace lldb;
59using namespace lldb_private;
60
Jim Ingham4bddaeb2012-02-16 06:50:00 +000061ConstString &
62Target::GetStaticBroadcasterClass ()
63{
64 static ConstString class_name ("lldb.target");
65 return class_name;
66}
67
Chris Lattner30fdc8d2010-06-08 16:52:24 +000068//----------------------------------------------------------------------
69// Target constructor
70//----------------------------------------------------------------------
Jim Ingham893c9322014-11-22 01:42:44 +000071Target::Target(Debugger &debugger, const ArchSpec &target_arch, const lldb::PlatformSP &platform_sp, bool is_dummy_target) :
Greg Clayton67cc0632012-08-22 17:17:09 +000072 TargetProperties (this),
Jim Ingham4f465cf2012-10-10 18:32:14 +000073 Broadcaster (&debugger, Target::GetStaticBroadcasterClass().AsCString()),
Greg Clayton32e0a752011-03-30 18:16:51 +000074 ExecutionContextScope (),
Greg Clayton66111032010-06-23 01:19:29 +000075 m_debugger (debugger),
Greg Clayton32e0a752011-03-30 18:16:51 +000076 m_platform_sp (platform_sp),
Greg Claytonaf67cec2010-12-20 20:49:23 +000077 m_mutex (Mutex::eMutexTypeRecursive),
Greg Clayton32e0a752011-03-30 18:16:51 +000078 m_arch (target_arch),
Enrico Granata17598482012-11-08 02:22:02 +000079 m_images (this),
Greg Claytond5944cd2013-12-06 01:12:00 +000080 m_section_load_history (),
Chris Lattner30fdc8d2010-06-08 16:52:24 +000081 m_breakpoint_list (false),
82 m_internal_breakpoint_list (true),
Johnny Chen01a67862011-10-14 00:42:25 +000083 m_watchpoint_list (),
Greg Clayton32e0a752011-03-30 18:16:51 +000084 m_process_sp (),
85 m_search_filter_sp (),
Chris Lattner30fdc8d2010-06-08 16:52:24 +000086 m_image_search_paths (ImageSearchPathsChanged, this),
Greg Claytone01e07b2013-04-18 18:10:51 +000087 m_scratch_ast_context_ap (),
88 m_scratch_ast_source_ap (),
89 m_ast_importer_ap (),
Zachary Turner32abc6e2015-03-03 19:23:09 +000090 m_persistent_variables (new ClangPersistentVariables),
Greg Clayton9585fbf2013-03-19 00:20:55 +000091 m_source_manager_ap(),
Greg Clayton32e0a752011-03-30 18:16:51 +000092 m_stop_hooks (),
Jim Ingham6026ca32011-05-12 02:06:14 +000093 m_stop_hook_next_id (0),
Greg Claytond5944cd2013-12-06 01:12:00 +000094 m_valid (true),
Jim Ingham893c9322014-11-22 01:42:44 +000095 m_suppress_stop_hooks (false),
96 m_is_dummy_target(is_dummy_target)
97
Chris Lattner30fdc8d2010-06-08 16:52:24 +000098{
Greg Claytoncfd1ace2010-10-31 03:01:06 +000099 SetEventName (eBroadcastBitBreakpointChanged, "breakpoint-changed");
100 SetEventName (eBroadcastBitModulesLoaded, "modules-loaded");
101 SetEventName (eBroadcastBitModulesUnloaded, "modules-unloaded");
Jim Ingham1b5792e2012-12-18 02:03:49 +0000102 SetEventName (eBroadcastBitWatchpointChanged, "watchpoint-changed");
Enrico Granataf15ee4e2013-04-05 18:49:06 +0000103 SetEventName (eBroadcastBitSymbolsLoaded, "symbols-loaded");
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000104
Jim Ingham4bddaeb2012-02-16 06:50:00 +0000105 CheckInWithManager();
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000106
Greg Clayton5160ce52013-03-27 23:08:40 +0000107 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000108 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000109 log->Printf ("%p Target::Target()", static_cast<void*>(this));
Jason Molendae1b68ad2012-12-05 00:25:49 +0000110 if (m_arch.IsValid())
111 {
Jason Molendaa3f24b32012-12-12 02:23:56 +0000112 LogIfAnyCategoriesSet(LIBLLDB_LOG_TARGET, "Target::Target created with architecture %s (%s)", m_arch.GetArchitectureName(), m_arch.GetTriple().getTriple().c_str());
Jason Molendae1b68ad2012-12-05 00:25:49 +0000113 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000114}
115
Jim Ingham893c9322014-11-22 01:42:44 +0000116void
117Target::PrimeFromDummyTarget(Target *target)
118{
119 if (!target)
120 return;
121
122 m_stop_hooks = target->m_stop_hooks;
Jim Ingham33df7cd2014-12-06 01:28:03 +0000123
124 for (BreakpointSP breakpoint_sp : target->m_breakpoint_list.Breakpoints())
125 {
126 if (breakpoint_sp->IsInternal())
127 continue;
128
129 BreakpointSP new_bp (new Breakpoint (*this, *breakpoint_sp.get()));
130 AddBreakpoint (new_bp, false);
131 }
Jim Ingham893c9322014-11-22 01:42:44 +0000132}
133
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000134//----------------------------------------------------------------------
135// Destructor
136//----------------------------------------------------------------------
137Target::~Target()
138{
Greg Clayton5160ce52013-03-27 23:08:40 +0000139 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000140 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000141 log->Printf ("%p Target::~Target()", static_cast<void*>(this));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000142 DeleteCurrentProcess ();
143}
144
145void
Caroline Ticeceb6b132010-10-26 03:11:13 +0000146Target::Dump (Stream *s, lldb::DescriptionLevel description_level)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000147{
Greg Clayton89411422010-10-08 00:21:05 +0000148// s->Printf("%.*p: ", (int)sizeof(void*) * 2, this);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000149 if (description_level != lldb::eDescriptionLevelBrief)
150 {
151 s->Indent();
152 s->PutCString("Target\n");
153 s->IndentMore();
Greg Clayton93aa84e2010-10-29 04:59:35 +0000154 m_images.Dump(s);
155 m_breakpoint_list.Dump(s);
156 m_internal_breakpoint_list.Dump(s);
157 s->IndentLess();
Caroline Ticeceb6b132010-10-26 03:11:13 +0000158 }
159 else
160 {
Greg Claytonaa149cb2011-08-11 02:48:45 +0000161 Module *exe_module = GetExecutableModulePointer();
162 if (exe_module)
163 s->PutCString (exe_module->GetFileSpec().GetFilename().GetCString());
Jim Ingham48028b62011-05-12 01:12:28 +0000164 else
165 s->PutCString ("No executable module.");
Caroline Ticeceb6b132010-10-26 03:11:13 +0000166 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000167}
168
169void
Greg Clayton90ba8112012-12-05 00:16:59 +0000170Target::CleanupProcess ()
171{
172 // Do any cleanup of the target we need to do between process instances.
173 // NB It is better to do this before destroying the process in case the
174 // clean up needs some help from the process.
175 m_breakpoint_list.ClearAllBreakpointSites();
176 m_internal_breakpoint_list.ClearAllBreakpointSites();
177 // Disable watchpoints just on the debugger side.
178 Mutex::Locker locker;
179 this->GetWatchpointList().GetListMutex(locker);
180 DisableAllWatchpoints(false);
181 ClearAllWatchpointHitCounts();
Enrico Granata5e3fe042015-02-11 00:37:54 +0000182 ClearAllWatchpointHistoricValues();
Greg Clayton90ba8112012-12-05 00:16:59 +0000183}
184
185void
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000186Target::DeleteCurrentProcess ()
187{
188 if (m_process_sp.get())
189 {
Greg Claytond5944cd2013-12-06 01:12:00 +0000190 m_section_load_history.Clear();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000191 if (m_process_sp->IsAlive())
Jason Molendaede31932015-04-17 05:01:58 +0000192 m_process_sp->Destroy(false);
Jim Inghamd0a3e122011-02-16 17:54:55 +0000193
194 m_process_sp->Finalize();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000195
Greg Clayton90ba8112012-12-05 00:16:59 +0000196 CleanupProcess ();
197
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000198 m_process_sp.reset();
199 }
200}
201
202const lldb::ProcessSP &
Greg Claytonc3776bf2012-02-09 06:16:32 +0000203Target::CreateProcess (Listener &listener, const char *plugin_name, const FileSpec *crash_file)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000204{
205 DeleteCurrentProcess ();
Greg Claytonc3776bf2012-02-09 06:16:32 +0000206 m_process_sp = Process::FindPlugin(*this, plugin_name, listener, crash_file);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000207 return m_process_sp;
208}
209
210const lldb::ProcessSP &
211Target::GetProcessSP () const
212{
213 return m_process_sp;
214}
215
Greg Clayton3418c852011-08-10 02:10:13 +0000216void
217Target::Destroy()
218{
219 Mutex::Locker locker (m_mutex);
Filipe Cabecinhas721ba3f2012-05-19 09:59:08 +0000220 m_valid = false;
Greg Clayton3418c852011-08-10 02:10:13 +0000221 DeleteCurrentProcess ();
222 m_platform_sp.reset();
223 m_arch.Clear();
Greg Claytonb35db632013-11-09 00:03:31 +0000224 ClearModules(true);
Greg Claytond5944cd2013-12-06 01:12:00 +0000225 m_section_load_history.Clear();
Greg Clayton3418c852011-08-10 02:10:13 +0000226 const bool notify = false;
227 m_breakpoint_list.RemoveAll(notify);
228 m_internal_breakpoint_list.RemoveAll(notify);
229 m_last_created_breakpoint.reset();
Johnny Chen01a67862011-10-14 00:42:25 +0000230 m_last_created_watchpoint.reset();
Greg Clayton3418c852011-08-10 02:10:13 +0000231 m_search_filter_sp.reset();
232 m_image_search_paths.Clear(notify);
Zachary Turner32abc6e2015-03-03 19:23:09 +0000233 m_persistent_variables->Clear();
Greg Clayton3418c852011-08-10 02:10:13 +0000234 m_stop_hooks.clear();
235 m_stop_hook_next_id = 0;
236 m_suppress_stop_hooks = false;
237}
238
239
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000240BreakpointList &
241Target::GetBreakpointList(bool internal)
242{
243 if (internal)
244 return m_internal_breakpoint_list;
245 else
246 return m_breakpoint_list;
247}
248
249const BreakpointList &
250Target::GetBreakpointList(bool internal) const
251{
252 if (internal)
253 return m_internal_breakpoint_list;
254 else
255 return m_breakpoint_list;
256}
257
258BreakpointSP
259Target::GetBreakpointByID (break_id_t break_id)
260{
261 BreakpointSP bp_sp;
262
263 if (LLDB_BREAK_ID_IS_INTERNAL (break_id))
264 bp_sp = m_internal_breakpoint_list.FindBreakpointByID (break_id);
265 else
266 bp_sp = m_breakpoint_list.FindBreakpointByID (break_id);
267
268 return bp_sp;
269}
270
271BreakpointSP
Jim Ingham87df91b2011-09-23 00:54:11 +0000272Target::CreateSourceRegexBreakpoint (const FileSpecList *containingModules,
Greg Clayton1f746072012-08-29 21:13:06 +0000273 const FileSpecList *source_file_spec_list,
274 RegularExpression &source_regex,
Greg Claytoneb023e72013-10-11 19:48:25 +0000275 bool internal,
276 bool hardware)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000277{
Jim Ingham87df91b2011-09-23 00:54:11 +0000278 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, source_file_spec_list));
279 BreakpointResolverSP resolver_sp(new BreakpointResolverFileRegex (NULL, source_regex));
Jim Ingham1460e4b2014-01-10 23:46:59 +0000280 return CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true);
Jim Ingham969795f2011-09-21 01:17:13 +0000281}
282
283
284BreakpointSP
Jim Inghama8558b62012-05-22 00:12:20 +0000285Target::CreateBreakpoint (const FileSpecList *containingModules,
286 const FileSpec &file,
287 uint32_t line_no,
Greg Clayton1f746072012-08-29 21:13:06 +0000288 LazyBool check_inlines,
Jim Inghama8558b62012-05-22 00:12:20 +0000289 LazyBool skip_prologue,
Greg Claytoneb023e72013-10-11 19:48:25 +0000290 bool internal,
291 bool hardware)
Jim Ingham969795f2011-09-21 01:17:13 +0000292{
Greg Clayton1f746072012-08-29 21:13:06 +0000293 if (check_inlines == eLazyBoolCalculate)
294 {
295 const InlineStrategy inline_strategy = GetInlineStrategy();
296 switch (inline_strategy)
297 {
298 case eInlineBreakpointsNever:
299 check_inlines = eLazyBoolNo;
300 break;
301
302 case eInlineBreakpointsHeaders:
303 if (file.IsSourceImplementationFile())
304 check_inlines = eLazyBoolNo;
305 else
306 check_inlines = eLazyBoolYes;
307 break;
308
309 case eInlineBreakpointsAlways:
310 check_inlines = eLazyBoolYes;
311 break;
312 }
313 }
Greg Clayton93bfb292012-09-07 23:48:57 +0000314 SearchFilterSP filter_sp;
315 if (check_inlines == eLazyBoolNo)
316 {
317 // Not checking for inlines, we are looking only for matching compile units
318 FileSpecList compile_unit_list;
319 compile_unit_list.Append (file);
320 filter_sp = GetSearchFilterForModuleAndCUList (containingModules, &compile_unit_list);
321 }
322 else
323 {
324 filter_sp = GetSearchFilterForModuleList (containingModules);
325 }
Greg Clayton03da4cc2013-04-19 21:31:16 +0000326 if (skip_prologue == eLazyBoolCalculate)
327 skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo;
328
Greg Clayton1f746072012-08-29 21:13:06 +0000329 BreakpointResolverSP resolver_sp(new BreakpointResolverFileLine (NULL,
330 file,
331 line_no,
332 check_inlines,
Greg Clayton03da4cc2013-04-19 21:31:16 +0000333 skip_prologue));
Jim Ingham1460e4b2014-01-10 23:46:59 +0000334 return CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000335}
336
337
338BreakpointSP
Greg Claytoneb023e72013-10-11 19:48:25 +0000339Target::CreateBreakpoint (lldb::addr_t addr, bool internal, bool hardware)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000340{
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000341 Address so_addr;
342 // Attempt to resolve our load address if possible, though it is ok if
343 // it doesn't resolve to section/offset.
344
Greg Clayton1b72fcb2010-08-24 00:45:41 +0000345 // Try and resolve as a load address if possible
Greg Claytond5944cd2013-12-06 01:12:00 +0000346 GetSectionLoadList().ResolveLoadAddress(addr, so_addr);
Greg Clayton1b72fcb2010-08-24 00:45:41 +0000347 if (!so_addr.IsValid())
348 {
349 // The address didn't resolve, so just set this as an absolute address
350 so_addr.SetOffset (addr);
351 }
Greg Claytoneb023e72013-10-11 19:48:25 +0000352 BreakpointSP bp_sp (CreateBreakpoint(so_addr, internal, hardware));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000353 return bp_sp;
354}
355
356BreakpointSP
Greg Claytoneb023e72013-10-11 19:48:25 +0000357Target::CreateBreakpoint (Address &addr, bool internal, bool hardware)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000358{
Jim Ingham33df7cd2014-12-06 01:28:03 +0000359 SearchFilterSP filter_sp(new SearchFilterForUnconstrainedSearches (shared_from_this()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000360 BreakpointResolverSP resolver_sp (new BreakpointResolverAddress (NULL, addr));
Jim Ingham1460e4b2014-01-10 23:46:59 +0000361 return CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, false);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000362}
363
364BreakpointSP
Jim Ingham87df91b2011-09-23 00:54:11 +0000365Target::CreateBreakpoint (const FileSpecList *containingModules,
366 const FileSpecList *containingSourceFiles,
Greg Claytond16e1e52011-07-12 17:06:17 +0000367 const char *func_name,
368 uint32_t func_name_type_mask,
Jim Inghama8558b62012-05-22 00:12:20 +0000369 LazyBool skip_prologue,
Greg Claytoneb023e72013-10-11 19:48:25 +0000370 bool internal,
371 bool hardware)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000372{
Greg Clayton0c5cd902010-06-28 21:30:43 +0000373 BreakpointSP bp_sp;
374 if (func_name)
375 {
Jim Ingham87df91b2011-09-23 00:54:11 +0000376 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, containingSourceFiles));
Greg Clayton03da4cc2013-04-19 21:31:16 +0000377
378 if (skip_prologue == eLazyBoolCalculate)
379 skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo;
380
Greg Claytond16e1e52011-07-12 17:06:17 +0000381 BreakpointResolverSP resolver_sp (new BreakpointResolverName (NULL,
382 func_name,
383 func_name_type_mask,
384 Breakpoint::Exact,
Greg Clayton03da4cc2013-04-19 21:31:16 +0000385 skip_prologue));
Jim Ingham1460e4b2014-01-10 23:46:59 +0000386 bp_sp = CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true);
Greg Clayton0c5cd902010-06-28 21:30:43 +0000387 }
388 return bp_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000389}
390
Jim Inghamfab10e82012-03-06 00:37:27 +0000391lldb::BreakpointSP
392Target::CreateBreakpoint (const FileSpecList *containingModules,
Greg Clayton4116e932012-05-15 02:33:01 +0000393 const FileSpecList *containingSourceFiles,
394 const std::vector<std::string> &func_names,
395 uint32_t func_name_type_mask,
Jim Inghama8558b62012-05-22 00:12:20 +0000396 LazyBool skip_prologue,
Greg Claytoneb023e72013-10-11 19:48:25 +0000397 bool internal,
398 bool hardware)
Jim Inghamfab10e82012-03-06 00:37:27 +0000399{
400 BreakpointSP bp_sp;
401 size_t num_names = func_names.size();
402 if (num_names > 0)
403 {
404 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, containingSourceFiles));
Greg Clayton03da4cc2013-04-19 21:31:16 +0000405
406 if (skip_prologue == eLazyBoolCalculate)
407 skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo;
408
409 BreakpointResolverSP resolver_sp (new BreakpointResolverName (NULL,
Jim Inghamfab10e82012-03-06 00:37:27 +0000410 func_names,
411 func_name_type_mask,
Greg Clayton03da4cc2013-04-19 21:31:16 +0000412 skip_prologue));
Jim Ingham1460e4b2014-01-10 23:46:59 +0000413 bp_sp = CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true);
Jim Inghamfab10e82012-03-06 00:37:27 +0000414 }
415 return bp_sp;
416}
417
Jim Ingham133e0fb2012-03-03 02:05:11 +0000418BreakpointSP
419Target::CreateBreakpoint (const FileSpecList *containingModules,
420 const FileSpecList *containingSourceFiles,
421 const char *func_names[],
422 size_t num_names,
423 uint32_t func_name_type_mask,
Jim Inghama8558b62012-05-22 00:12:20 +0000424 LazyBool skip_prologue,
Greg Claytoneb023e72013-10-11 19:48:25 +0000425 bool internal,
426 bool hardware)
Jim Ingham133e0fb2012-03-03 02:05:11 +0000427{
428 BreakpointSP bp_sp;
429 if (num_names > 0)
430 {
431 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, containingSourceFiles));
432
Greg Clayton03da4cc2013-04-19 21:31:16 +0000433 if (skip_prologue == eLazyBoolCalculate)
434 skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo;
435
436 BreakpointResolverSP resolver_sp (new BreakpointResolverName (NULL,
Jim Ingham133e0fb2012-03-03 02:05:11 +0000437 func_names,
438 num_names,
Jim Inghamfab10e82012-03-06 00:37:27 +0000439 func_name_type_mask,
Greg Clayton03da4cc2013-04-19 21:31:16 +0000440 skip_prologue));
Jim Ingham1460e4b2014-01-10 23:46:59 +0000441 bp_sp = CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true);
Jim Ingham133e0fb2012-03-03 02:05:11 +0000442 }
443 return bp_sp;
444}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000445
446SearchFilterSP
447Target::GetSearchFilterForModule (const FileSpec *containingModule)
448{
449 SearchFilterSP filter_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000450 if (containingModule != NULL)
451 {
452 // TODO: We should look into sharing module based search filters
453 // across many breakpoints like we do for the simple target based one
Greg Claytone1cd1be2012-01-29 20:56:30 +0000454 filter_sp.reset (new SearchFilterByModule (shared_from_this(), *containingModule));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000455 }
456 else
457 {
458 if (m_search_filter_sp.get() == NULL)
Jim Ingham33df7cd2014-12-06 01:28:03 +0000459 m_search_filter_sp.reset (new SearchFilterForUnconstrainedSearches (shared_from_this()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000460 filter_sp = m_search_filter_sp;
461 }
462 return filter_sp;
463}
464
Jim Ingham969795f2011-09-21 01:17:13 +0000465SearchFilterSP
466Target::GetSearchFilterForModuleList (const FileSpecList *containingModules)
467{
468 SearchFilterSP filter_sp;
Jim Ingham969795f2011-09-21 01:17:13 +0000469 if (containingModules && containingModules->GetSize() != 0)
470 {
471 // TODO: We should look into sharing module based search filters
472 // across many breakpoints like we do for the simple target based one
Greg Claytone1cd1be2012-01-29 20:56:30 +0000473 filter_sp.reset (new SearchFilterByModuleList (shared_from_this(), *containingModules));
Jim Ingham969795f2011-09-21 01:17:13 +0000474 }
475 else
476 {
477 if (m_search_filter_sp.get() == NULL)
Jim Ingham33df7cd2014-12-06 01:28:03 +0000478 m_search_filter_sp.reset (new SearchFilterForUnconstrainedSearches (shared_from_this()));
Jim Ingham969795f2011-09-21 01:17:13 +0000479 filter_sp = m_search_filter_sp;
480 }
481 return filter_sp;
482}
483
Jim Ingham87df91b2011-09-23 00:54:11 +0000484SearchFilterSP
Jim Inghama8558b62012-05-22 00:12:20 +0000485Target::GetSearchFilterForModuleAndCUList (const FileSpecList *containingModules,
486 const FileSpecList *containingSourceFiles)
Jim Ingham87df91b2011-09-23 00:54:11 +0000487{
488 if (containingSourceFiles == NULL || containingSourceFiles->GetSize() == 0)
489 return GetSearchFilterForModuleList(containingModules);
490
491 SearchFilterSP filter_sp;
Jim Ingham87df91b2011-09-23 00:54:11 +0000492 if (containingModules == NULL)
493 {
494 // We could make a special "CU List only SearchFilter". Better yet was if these could be composable,
495 // but that will take a little reworking.
496
Greg Claytone1cd1be2012-01-29 20:56:30 +0000497 filter_sp.reset (new SearchFilterByModuleListAndCU (shared_from_this(), FileSpecList(), *containingSourceFiles));
Jim Ingham87df91b2011-09-23 00:54:11 +0000498 }
499 else
500 {
Greg Claytone1cd1be2012-01-29 20:56:30 +0000501 filter_sp.reset (new SearchFilterByModuleListAndCU (shared_from_this(), *containingModules, *containingSourceFiles));
Jim Ingham87df91b2011-09-23 00:54:11 +0000502 }
503 return filter_sp;
504}
505
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000506BreakpointSP
Jim Ingham87df91b2011-09-23 00:54:11 +0000507Target::CreateFuncRegexBreakpoint (const FileSpecList *containingModules,
Jim Inghama8558b62012-05-22 00:12:20 +0000508 const FileSpecList *containingSourceFiles,
509 RegularExpression &func_regex,
510 LazyBool skip_prologue,
Greg Claytoneb023e72013-10-11 19:48:25 +0000511 bool internal,
512 bool hardware)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000513{
Jim Ingham87df91b2011-09-23 00:54:11 +0000514 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, containingSourceFiles));
Saleem Abdulrasoolb5c128b2014-07-23 01:53:52 +0000515 bool skip =
516 (skip_prologue == eLazyBoolCalculate) ? GetSkipPrologue()
517 : static_cast<bool>(skip_prologue);
Greg Claytond16e1e52011-07-12 17:06:17 +0000518 BreakpointResolverSP resolver_sp(new BreakpointResolverName (NULL,
519 func_regex,
Saleem Abdulrasoolb5c128b2014-07-23 01:53:52 +0000520 skip));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000521
Jim Ingham1460e4b2014-01-10 23:46:59 +0000522 return CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000523}
524
Jim Ingham219ba192012-03-05 04:47:34 +0000525lldb::BreakpointSP
526Target::CreateExceptionBreakpoint (enum lldb::LanguageType language, bool catch_bp, bool throw_bp, bool internal)
527{
528 return LanguageRuntime::CreateExceptionBreakpoint (*this, language, catch_bp, throw_bp, internal);
529}
530
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000531BreakpointSP
Jim Ingham1460e4b2014-01-10 23:46:59 +0000532Target::CreateBreakpoint (SearchFilterSP &filter_sp, BreakpointResolverSP &resolver_sp, bool internal, bool request_hardware, bool resolve_indirect_symbols)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000533{
534 BreakpointSP bp_sp;
535 if (filter_sp && resolver_sp)
536 {
Jim Ingham1460e4b2014-01-10 23:46:59 +0000537 bp_sp.reset(new Breakpoint (*this, filter_sp, resolver_sp, request_hardware, resolve_indirect_symbols));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000538 resolver_sp->SetBreakpoint (bp_sp.get());
Jim Ingham33df7cd2014-12-06 01:28:03 +0000539 AddBreakpoint (bp_sp, internal);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000540 }
Jim Ingham33df7cd2014-12-06 01:28:03 +0000541 return bp_sp;
542}
543
544void
545Target::AddBreakpoint (lldb::BreakpointSP bp_sp, bool internal)
546{
547 if (!bp_sp)
548 return;
549 if (internal)
550 m_internal_breakpoint_list.Add (bp_sp, false);
551 else
552 m_breakpoint_list.Add (bp_sp, true);
553
554 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
555 if (log)
556 {
557 StreamString s;
558 bp_sp->GetDescription(&s, lldb::eDescriptionLevelVerbose);
559 log->Printf ("Target::%s (internal = %s) => break_id = %s\n", __FUNCTION__, bp_sp->IsInternal() ? "yes" : "no", s.GetData());
560 }
561
562 bp_sp->ResolveBreakpoint();
563
564 if (!internal)
Jim Ingham36f3b362010-10-14 23:45:03 +0000565 {
566 m_last_created_breakpoint = bp_sp;
567 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000568}
569
Johnny Chen86364b42011-09-20 23:28:55 +0000570bool
571Target::ProcessIsValid()
572{
573 return (m_process_sp && m_process_sp->IsAlive());
574}
575
Johnny Chenb90827e2012-06-04 23:19:54 +0000576static bool
577CheckIfWatchpointsExhausted(Target *target, Error &error)
578{
579 uint32_t num_supported_hardware_watchpoints;
580 Error rc = target->GetProcessSP()->GetWatchpointSupportInfo(num_supported_hardware_watchpoints);
581 if (rc.Success())
582 {
583 uint32_t num_current_watchpoints = target->GetWatchpointList().GetSize();
584 if (num_current_watchpoints >= num_supported_hardware_watchpoints)
585 error.SetErrorStringWithFormat("number of supported hardware watchpoints (%u) has been reached",
586 num_supported_hardware_watchpoints);
587 }
588 return false;
589}
590
Johnny Chen01a67862011-10-14 00:42:25 +0000591// See also Watchpoint::SetWatchpointType(uint32_t type) and
Johnny Chenab9ee762011-09-14 00:26:03 +0000592// the OptionGroupWatchpoint::WatchType enum type.
Johnny Chen01a67862011-10-14 00:42:25 +0000593WatchpointSP
Jim Inghama7dfb662012-10-23 07:20:06 +0000594Target::CreateWatchpoint(lldb::addr_t addr, size_t size, const ClangASTType *type, uint32_t kind, Error &error)
Johnny Chen887062a2011-09-12 23:38:44 +0000595{
Greg Clayton5160ce52013-03-27 23:08:40 +0000596 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen0c406372011-09-14 20:23:45 +0000597 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000598 log->Printf("Target::%s (addr = 0x%8.8" PRIx64 " size = %" PRIu64 " type = %u)\n",
Jim Inghama7dfb662012-10-23 07:20:06 +0000599 __FUNCTION__, addr, (uint64_t)size, kind);
Johnny Chen0c406372011-09-14 20:23:45 +0000600
Johnny Chen01a67862011-10-14 00:42:25 +0000601 WatchpointSP wp_sp;
Johnny Chen86364b42011-09-20 23:28:55 +0000602 if (!ProcessIsValid())
Johnny Chenb90827e2012-06-04 23:19:54 +0000603 {
604 error.SetErrorString("process is not alive");
Johnny Chen01a67862011-10-14 00:42:25 +0000605 return wp_sp;
Johnny Chenb90827e2012-06-04 23:19:54 +0000606 }
Jim Inghamc6462312013-06-18 21:52:48 +0000607
Johnny Chen45e541f2011-09-14 22:20:15 +0000608 if (addr == LLDB_INVALID_ADDRESS || size == 0)
Johnny Chenb90827e2012-06-04 23:19:54 +0000609 {
610 if (size == 0)
611 error.SetErrorString("cannot set a watchpoint with watch_size of 0");
612 else
Daniel Malead01b2952012-11-29 21:49:15 +0000613 error.SetErrorStringWithFormat("invalid watch address: %" PRIu64, addr);
Johnny Chen01a67862011-10-14 00:42:25 +0000614 return wp_sp;
Johnny Chenb90827e2012-06-04 23:19:54 +0000615 }
Jim Inghamc6462312013-06-18 21:52:48 +0000616
617 if (!LLDB_WATCH_TYPE_IS_VALID(kind))
618 {
619 error.SetErrorStringWithFormat ("invalid watchpoint type: %d", kind);
620 }
Johnny Chen7313a642011-09-13 01:15:36 +0000621
Johnny Chen01a67862011-10-14 00:42:25 +0000622 // Currently we only support one watchpoint per address, with total number
623 // of watchpoints limited by the hardware which the inferior is running on.
Johnny Chen7385a5a2012-05-31 22:56:36 +0000624
625 // Grab the list mutex while doing operations.
Jim Ingham1b5792e2012-12-18 02:03:49 +0000626 const bool notify = false; // Don't notify about all the state changes we do on creating the watchpoint.
Johnny Chen7385a5a2012-05-31 22:56:36 +0000627 Mutex::Locker locker;
628 this->GetWatchpointList().GetListMutex(locker);
Johnny Chen01a67862011-10-14 00:42:25 +0000629 WatchpointSP matched_sp = m_watchpoint_list.FindByAddress(addr);
Johnny Chen3c532582011-09-13 23:29:31 +0000630 if (matched_sp)
631 {
Johnny Chen0c406372011-09-14 20:23:45 +0000632 size_t old_size = matched_sp->GetByteSize();
Johnny Chen3c532582011-09-13 23:29:31 +0000633 uint32_t old_type =
Johnny Chen0c406372011-09-14 20:23:45 +0000634 (matched_sp->WatchpointRead() ? LLDB_WATCH_TYPE_READ : 0) |
635 (matched_sp->WatchpointWrite() ? LLDB_WATCH_TYPE_WRITE : 0);
Johnny Chen01a67862011-10-14 00:42:25 +0000636 // Return the existing watchpoint if both size and type match.
Jim Inghamc6462312013-06-18 21:52:48 +0000637 if (size == old_size && kind == old_type)
638 {
Johnny Chen01a67862011-10-14 00:42:25 +0000639 wp_sp = matched_sp;
Jim Ingham1b5792e2012-12-18 02:03:49 +0000640 wp_sp->SetEnabled(false, notify);
Jim Inghamc6462312013-06-18 21:52:48 +0000641 }
642 else
643 {
Johnny Chen01a67862011-10-14 00:42:25 +0000644 // Nil the matched watchpoint; we will be creating a new one.
Jim Ingham1b5792e2012-12-18 02:03:49 +0000645 m_process_sp->DisableWatchpoint(matched_sp.get(), notify);
646 m_watchpoint_list.Remove(matched_sp->GetID(), true);
Johnny Chen45e541f2011-09-14 22:20:15 +0000647 }
Johnny Chen3c532582011-09-13 23:29:31 +0000648 }
649
Jason Molenda727e3922012-12-05 23:07:34 +0000650 if (!wp_sp)
651 {
Jim Ingham1b5792e2012-12-18 02:03:49 +0000652 wp_sp.reset(new Watchpoint(*this, addr, size, type));
653 wp_sp->SetWatchpointType(kind, notify);
654 m_watchpoint_list.Add (wp_sp, true);
Johnny Chen45e541f2011-09-14 22:20:15 +0000655 }
Johnny Chen0c406372011-09-14 20:23:45 +0000656
Jim Ingham1b5792e2012-12-18 02:03:49 +0000657 error = m_process_sp->EnableWatchpoint(wp_sp.get(), notify);
Johnny Chen0c406372011-09-14 20:23:45 +0000658 if (log)
Jason Molenda727e3922012-12-05 23:07:34 +0000659 log->Printf("Target::%s (creation of watchpoint %s with id = %u)\n",
660 __FUNCTION__,
661 error.Success() ? "succeeded" : "failed",
662 wp_sp->GetID());
Johnny Chen0c406372011-09-14 20:23:45 +0000663
Jason Molenda727e3922012-12-05 23:07:34 +0000664 if (error.Fail())
665 {
Johnny Chen41b77262012-03-26 22:00:10 +0000666 // Enabling the watchpoint on the device side failed.
667 // Remove the said watchpoint from the list maintained by the target instance.
Jim Ingham1b5792e2012-12-18 02:03:49 +0000668 m_watchpoint_list.Remove (wp_sp->GetID(), true);
Johnny Chenb90827e2012-06-04 23:19:54 +0000669 // See if we could provide more helpful error message.
670 if (!CheckIfWatchpointsExhausted(this, error))
671 {
672 if (!OptionGroupWatchpoint::IsWatchSizeSupported(size))
Greg Clayton6fea17e2014-03-03 19:15:20 +0000673 error.SetErrorStringWithFormat("watch size of %" PRIu64 " is not supported", (uint64_t)size);
Johnny Chenb90827e2012-06-04 23:19:54 +0000674 }
Johnny Chen01a67862011-10-14 00:42:25 +0000675 wp_sp.reset();
Johnny Chen41b77262012-03-26 22:00:10 +0000676 }
Johnny Chen9d954d82011-09-27 20:29:45 +0000677 else
Johnny Chen01a67862011-10-14 00:42:25 +0000678 m_last_created_watchpoint = wp_sp;
679 return wp_sp;
Johnny Chen887062a2011-09-12 23:38:44 +0000680}
681
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000682void
683Target::RemoveAllBreakpoints (bool internal_also)
684{
Greg Clayton5160ce52013-03-27 23:08:40 +0000685 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000686 if (log)
687 log->Printf ("Target::%s (internal_also = %s)\n", __FUNCTION__, internal_also ? "yes" : "no");
688
Greg Clayton9fed0d82010-07-23 23:33:17 +0000689 m_breakpoint_list.RemoveAll (true);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000690 if (internal_also)
Greg Clayton9fed0d82010-07-23 23:33:17 +0000691 m_internal_breakpoint_list.RemoveAll (false);
Jim Ingham36f3b362010-10-14 23:45:03 +0000692
693 m_last_created_breakpoint.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000694}
695
696void
697Target::DisableAllBreakpoints (bool internal_also)
698{
Greg Clayton5160ce52013-03-27 23:08:40 +0000699 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000700 if (log)
701 log->Printf ("Target::%s (internal_also = %s)\n", __FUNCTION__, internal_also ? "yes" : "no");
702
703 m_breakpoint_list.SetEnabledAll (false);
704 if (internal_also)
705 m_internal_breakpoint_list.SetEnabledAll (false);
706}
707
708void
709Target::EnableAllBreakpoints (bool internal_also)
710{
Greg Clayton5160ce52013-03-27 23:08:40 +0000711 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000712 if (log)
713 log->Printf ("Target::%s (internal_also = %s)\n", __FUNCTION__, internal_also ? "yes" : "no");
714
715 m_breakpoint_list.SetEnabledAll (true);
716 if (internal_also)
717 m_internal_breakpoint_list.SetEnabledAll (true);
718}
719
720bool
721Target::RemoveBreakpointByID (break_id_t break_id)
722{
Greg Clayton5160ce52013-03-27 23:08:40 +0000723 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000724 if (log)
725 log->Printf ("Target::%s (break_id = %i, internal = %s)\n", __FUNCTION__, break_id, LLDB_BREAK_ID_IS_INTERNAL (break_id) ? "yes" : "no");
726
727 if (DisableBreakpointByID (break_id))
728 {
729 if (LLDB_BREAK_ID_IS_INTERNAL (break_id))
Greg Clayton9fed0d82010-07-23 23:33:17 +0000730 m_internal_breakpoint_list.Remove(break_id, false);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000731 else
Jim Ingham36f3b362010-10-14 23:45:03 +0000732 {
Greg Claytonaa1c5872011-01-24 23:35:47 +0000733 if (m_last_created_breakpoint)
734 {
735 if (m_last_created_breakpoint->GetID() == break_id)
736 m_last_created_breakpoint.reset();
737 }
Greg Clayton9fed0d82010-07-23 23:33:17 +0000738 m_breakpoint_list.Remove(break_id, true);
Jim Ingham36f3b362010-10-14 23:45:03 +0000739 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000740 return true;
741 }
742 return false;
743}
744
745bool
746Target::DisableBreakpointByID (break_id_t break_id)
747{
Greg Clayton5160ce52013-03-27 23:08:40 +0000748 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000749 if (log)
750 log->Printf ("Target::%s (break_id = %i, internal = %s)\n", __FUNCTION__, break_id, LLDB_BREAK_ID_IS_INTERNAL (break_id) ? "yes" : "no");
751
752 BreakpointSP bp_sp;
753
754 if (LLDB_BREAK_ID_IS_INTERNAL (break_id))
755 bp_sp = m_internal_breakpoint_list.FindBreakpointByID (break_id);
756 else
757 bp_sp = m_breakpoint_list.FindBreakpointByID (break_id);
758 if (bp_sp)
759 {
760 bp_sp->SetEnabled (false);
761 return true;
762 }
763 return false;
764}
765
766bool
767Target::EnableBreakpointByID (break_id_t break_id)
768{
Greg Clayton5160ce52013-03-27 23:08:40 +0000769 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000770 if (log)
771 log->Printf ("Target::%s (break_id = %i, internal = %s)\n",
772 __FUNCTION__,
773 break_id,
774 LLDB_BREAK_ID_IS_INTERNAL (break_id) ? "yes" : "no");
775
776 BreakpointSP bp_sp;
777
778 if (LLDB_BREAK_ID_IS_INTERNAL (break_id))
779 bp_sp = m_internal_breakpoint_list.FindBreakpointByID (break_id);
780 else
781 bp_sp = m_breakpoint_list.FindBreakpointByID (break_id);
782
783 if (bp_sp)
784 {
785 bp_sp->SetEnabled (true);
786 return true;
787 }
788 return false;
789}
790
Johnny Chenedf50372011-09-23 21:21:43 +0000791// The flag 'end_to_end', default to true, signifies that the operation is
792// performed end to end, for both the debugger and the debuggee.
793
Johnny Chen01a67862011-10-14 00:42:25 +0000794// Assumption: Caller holds the list mutex lock for m_watchpoint_list for end
795// to end operations.
Johnny Chen86364b42011-09-20 23:28:55 +0000796bool
Johnny Chen01a67862011-10-14 00:42:25 +0000797Target::RemoveAllWatchpoints (bool end_to_end)
Johnny Chen86364b42011-09-20 23:28:55 +0000798{
Greg Clayton5160ce52013-03-27 23:08:40 +0000799 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen86364b42011-09-20 23:28:55 +0000800 if (log)
801 log->Printf ("Target::%s\n", __FUNCTION__);
802
Johnny Chenedf50372011-09-23 21:21:43 +0000803 if (!end_to_end) {
Jim Ingham1b5792e2012-12-18 02:03:49 +0000804 m_watchpoint_list.RemoveAll(true);
Johnny Chenedf50372011-09-23 21:21:43 +0000805 return true;
806 }
807
808 // Otherwise, it's an end to end operation.
809
Johnny Chen86364b42011-09-20 23:28:55 +0000810 if (!ProcessIsValid())
811 return false;
812
Johnny Chen01a67862011-10-14 00:42:25 +0000813 size_t num_watchpoints = m_watchpoint_list.GetSize();
Johnny Chen86364b42011-09-20 23:28:55 +0000814 for (size_t i = 0; i < num_watchpoints; ++i)
815 {
Johnny Chen01a67862011-10-14 00:42:25 +0000816 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
817 if (!wp_sp)
Johnny Chen86364b42011-09-20 23:28:55 +0000818 return false;
819
Johnny Chen01a67862011-10-14 00:42:25 +0000820 Error rc = m_process_sp->DisableWatchpoint(wp_sp.get());
Johnny Chen86364b42011-09-20 23:28:55 +0000821 if (rc.Fail())
822 return false;
823 }
Jim Ingham1b5792e2012-12-18 02:03:49 +0000824 m_watchpoint_list.RemoveAll (true);
Jim Inghamb0b45132013-07-02 02:09:46 +0000825 m_last_created_watchpoint.reset();
Johnny Chen86364b42011-09-20 23:28:55 +0000826 return true; // Success!
827}
828
Johnny Chen01a67862011-10-14 00:42:25 +0000829// Assumption: Caller holds the list mutex lock for m_watchpoint_list for end to
830// end operations.
Johnny Chen86364b42011-09-20 23:28:55 +0000831bool
Johnny Chen01a67862011-10-14 00:42:25 +0000832Target::DisableAllWatchpoints (bool end_to_end)
Johnny Chen86364b42011-09-20 23:28:55 +0000833{
Greg Clayton5160ce52013-03-27 23:08:40 +0000834 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen86364b42011-09-20 23:28:55 +0000835 if (log)
836 log->Printf ("Target::%s\n", __FUNCTION__);
837
Johnny Chenedf50372011-09-23 21:21:43 +0000838 if (!end_to_end) {
Johnny Chen01a67862011-10-14 00:42:25 +0000839 m_watchpoint_list.SetEnabledAll(false);
Johnny Chenedf50372011-09-23 21:21:43 +0000840 return true;
841 }
842
843 // Otherwise, it's an end to end operation.
844
Johnny Chen86364b42011-09-20 23:28:55 +0000845 if (!ProcessIsValid())
846 return false;
847
Johnny Chen01a67862011-10-14 00:42:25 +0000848 size_t num_watchpoints = m_watchpoint_list.GetSize();
Johnny Chen86364b42011-09-20 23:28:55 +0000849 for (size_t i = 0; i < num_watchpoints; ++i)
850 {
Johnny Chen01a67862011-10-14 00:42:25 +0000851 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
852 if (!wp_sp)
Johnny Chen86364b42011-09-20 23:28:55 +0000853 return false;
854
Johnny Chen01a67862011-10-14 00:42:25 +0000855 Error rc = m_process_sp->DisableWatchpoint(wp_sp.get());
Johnny Chen86364b42011-09-20 23:28:55 +0000856 if (rc.Fail())
857 return false;
858 }
Johnny Chen86364b42011-09-20 23:28:55 +0000859 return true; // Success!
860}
861
Johnny Chen01a67862011-10-14 00:42:25 +0000862// Assumption: Caller holds the list mutex lock for m_watchpoint_list for end to
863// end operations.
Johnny Chen86364b42011-09-20 23:28:55 +0000864bool
Johnny Chen01a67862011-10-14 00:42:25 +0000865Target::EnableAllWatchpoints (bool end_to_end)
Johnny Chen86364b42011-09-20 23:28:55 +0000866{
Greg Clayton5160ce52013-03-27 23:08:40 +0000867 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen86364b42011-09-20 23:28:55 +0000868 if (log)
869 log->Printf ("Target::%s\n", __FUNCTION__);
870
Johnny Chenedf50372011-09-23 21:21:43 +0000871 if (!end_to_end) {
Johnny Chen01a67862011-10-14 00:42:25 +0000872 m_watchpoint_list.SetEnabledAll(true);
Johnny Chenedf50372011-09-23 21:21:43 +0000873 return true;
874 }
875
876 // Otherwise, it's an end to end operation.
877
Johnny Chen86364b42011-09-20 23:28:55 +0000878 if (!ProcessIsValid())
879 return false;
880
Johnny Chen01a67862011-10-14 00:42:25 +0000881 size_t num_watchpoints = m_watchpoint_list.GetSize();
Johnny Chen86364b42011-09-20 23:28:55 +0000882 for (size_t i = 0; i < num_watchpoints; ++i)
883 {
Johnny Chen01a67862011-10-14 00:42:25 +0000884 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
885 if (!wp_sp)
Johnny Chen86364b42011-09-20 23:28:55 +0000886 return false;
887
Johnny Chen01a67862011-10-14 00:42:25 +0000888 Error rc = m_process_sp->EnableWatchpoint(wp_sp.get());
Johnny Chen86364b42011-09-20 23:28:55 +0000889 if (rc.Fail())
890 return false;
891 }
Johnny Chen86364b42011-09-20 23:28:55 +0000892 return true; // Success!
893}
894
Johnny Chena4d6bc92012-02-25 06:44:30 +0000895// Assumption: Caller holds the list mutex lock for m_watchpoint_list.
896bool
897Target::ClearAllWatchpointHitCounts ()
898{
Greg Clayton5160ce52013-03-27 23:08:40 +0000899 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chena4d6bc92012-02-25 06:44:30 +0000900 if (log)
901 log->Printf ("Target::%s\n", __FUNCTION__);
902
903 size_t num_watchpoints = m_watchpoint_list.GetSize();
904 for (size_t i = 0; i < num_watchpoints; ++i)
905 {
906 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
907 if (!wp_sp)
908 return false;
909
910 wp_sp->ResetHitCount();
911 }
912 return true; // Success!
913}
914
Enrico Granata5e3fe042015-02-11 00:37:54 +0000915// Assumption: Caller holds the list mutex lock for m_watchpoint_list.
916bool
917Target::ClearAllWatchpointHistoricValues ()
918{
919 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
920 if (log)
921 log->Printf ("Target::%s\n", __FUNCTION__);
922
923 size_t num_watchpoints = m_watchpoint_list.GetSize();
924 for (size_t i = 0; i < num_watchpoints; ++i)
925 {
926 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
927 if (!wp_sp)
928 return false;
929
930 wp_sp->ResetHistoricValues();
931 }
932 return true; // Success!
933}
934
Johnny Chen01a67862011-10-14 00:42:25 +0000935// Assumption: Caller holds the list mutex lock for m_watchpoint_list
Johnny Chen6cc60e82011-10-05 21:35:46 +0000936// during these operations.
937bool
Johnny Chen01a67862011-10-14 00:42:25 +0000938Target::IgnoreAllWatchpoints (uint32_t ignore_count)
Johnny Chen6cc60e82011-10-05 21:35:46 +0000939{
Greg Clayton5160ce52013-03-27 23:08:40 +0000940 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen6cc60e82011-10-05 21:35:46 +0000941 if (log)
942 log->Printf ("Target::%s\n", __FUNCTION__);
943
944 if (!ProcessIsValid())
945 return false;
946
Johnny Chen01a67862011-10-14 00:42:25 +0000947 size_t num_watchpoints = m_watchpoint_list.GetSize();
Johnny Chen6cc60e82011-10-05 21:35:46 +0000948 for (size_t i = 0; i < num_watchpoints; ++i)
949 {
Johnny Chen01a67862011-10-14 00:42:25 +0000950 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
951 if (!wp_sp)
Johnny Chen6cc60e82011-10-05 21:35:46 +0000952 return false;
953
Johnny Chen01a67862011-10-14 00:42:25 +0000954 wp_sp->SetIgnoreCount(ignore_count);
Johnny Chen6cc60e82011-10-05 21:35:46 +0000955 }
956 return true; // Success!
957}
958
Johnny Chen01a67862011-10-14 00:42:25 +0000959// Assumption: Caller holds the list mutex lock for m_watchpoint_list.
Johnny Chen86364b42011-09-20 23:28:55 +0000960bool
Johnny Chen01a67862011-10-14 00:42:25 +0000961Target::DisableWatchpointByID (lldb::watch_id_t watch_id)
Johnny Chen86364b42011-09-20 23:28:55 +0000962{
Greg Clayton5160ce52013-03-27 23:08:40 +0000963 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen86364b42011-09-20 23:28:55 +0000964 if (log)
965 log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
966
967 if (!ProcessIsValid())
968 return false;
969
Johnny Chen01a67862011-10-14 00:42:25 +0000970 WatchpointSP wp_sp = m_watchpoint_list.FindByID (watch_id);
971 if (wp_sp)
Johnny Chen86364b42011-09-20 23:28:55 +0000972 {
Johnny Chen01a67862011-10-14 00:42:25 +0000973 Error rc = m_process_sp->DisableWatchpoint(wp_sp.get());
Johnny Chenf04ee932011-09-22 18:04:58 +0000974 if (rc.Success())
975 return true;
Johnny Chen86364b42011-09-20 23:28:55 +0000976
Johnny Chenf04ee932011-09-22 18:04:58 +0000977 // Else, fallthrough.
Johnny Chen86364b42011-09-20 23:28:55 +0000978 }
979 return false;
980}
981
Johnny Chen01a67862011-10-14 00:42:25 +0000982// Assumption: Caller holds the list mutex lock for m_watchpoint_list.
Johnny Chen86364b42011-09-20 23:28:55 +0000983bool
Johnny Chen01a67862011-10-14 00:42:25 +0000984Target::EnableWatchpointByID (lldb::watch_id_t watch_id)
Johnny Chen86364b42011-09-20 23:28:55 +0000985{
Greg Clayton5160ce52013-03-27 23:08:40 +0000986 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen86364b42011-09-20 23:28:55 +0000987 if (log)
988 log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
989
990 if (!ProcessIsValid())
991 return false;
992
Johnny Chen01a67862011-10-14 00:42:25 +0000993 WatchpointSP wp_sp = m_watchpoint_list.FindByID (watch_id);
994 if (wp_sp)
Johnny Chen86364b42011-09-20 23:28:55 +0000995 {
Johnny Chen01a67862011-10-14 00:42:25 +0000996 Error rc = m_process_sp->EnableWatchpoint(wp_sp.get());
Johnny Chenf04ee932011-09-22 18:04:58 +0000997 if (rc.Success())
998 return true;
Johnny Chen86364b42011-09-20 23:28:55 +0000999
Johnny Chenf04ee932011-09-22 18:04:58 +00001000 // Else, fallthrough.
Johnny Chen86364b42011-09-20 23:28:55 +00001001 }
1002 return false;
1003}
1004
Johnny Chen01a67862011-10-14 00:42:25 +00001005// Assumption: Caller holds the list mutex lock for m_watchpoint_list.
Johnny Chen86364b42011-09-20 23:28:55 +00001006bool
Johnny Chen01a67862011-10-14 00:42:25 +00001007Target::RemoveWatchpointByID (lldb::watch_id_t watch_id)
Johnny Chen86364b42011-09-20 23:28:55 +00001008{
Greg Clayton5160ce52013-03-27 23:08:40 +00001009 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen86364b42011-09-20 23:28:55 +00001010 if (log)
1011 log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
1012
Jim Inghamb0b45132013-07-02 02:09:46 +00001013 WatchpointSP watch_to_remove_sp = m_watchpoint_list.FindByID(watch_id);
1014 if (watch_to_remove_sp == m_last_created_watchpoint)
1015 m_last_created_watchpoint.reset();
1016
Johnny Chen01a67862011-10-14 00:42:25 +00001017 if (DisableWatchpointByID (watch_id))
Johnny Chen86364b42011-09-20 23:28:55 +00001018 {
Jim Ingham1b5792e2012-12-18 02:03:49 +00001019 m_watchpoint_list.Remove(watch_id, true);
Johnny Chen86364b42011-09-20 23:28:55 +00001020 return true;
1021 }
1022 return false;
1023}
1024
Johnny Chen01a67862011-10-14 00:42:25 +00001025// Assumption: Caller holds the list mutex lock for m_watchpoint_list.
Johnny Chen6cc60e82011-10-05 21:35:46 +00001026bool
Johnny Chen01a67862011-10-14 00:42:25 +00001027Target::IgnoreWatchpointByID (lldb::watch_id_t watch_id, uint32_t ignore_count)
Johnny Chen6cc60e82011-10-05 21:35:46 +00001028{
Greg Clayton5160ce52013-03-27 23:08:40 +00001029 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen6cc60e82011-10-05 21:35:46 +00001030 if (log)
1031 log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
1032
1033 if (!ProcessIsValid())
1034 return false;
1035
Johnny Chen01a67862011-10-14 00:42:25 +00001036 WatchpointSP wp_sp = m_watchpoint_list.FindByID (watch_id);
1037 if (wp_sp)
Johnny Chen6cc60e82011-10-05 21:35:46 +00001038 {
Johnny Chen01a67862011-10-14 00:42:25 +00001039 wp_sp->SetIgnoreCount(ignore_count);
Johnny Chen6cc60e82011-10-05 21:35:46 +00001040 return true;
1041 }
1042 return false;
1043}
1044
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001045ModuleSP
1046Target::GetExecutableModule ()
1047{
Greg Claytonaa149cb2011-08-11 02:48:45 +00001048 return m_images.GetModuleAtIndex(0);
1049}
1050
1051Module*
1052Target::GetExecutableModulePointer ()
1053{
1054 return m_images.GetModulePointerAtIndex(0);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001055}
1056
Enrico Granata17598482012-11-08 02:22:02 +00001057static void
1058LoadScriptingResourceForModule (const ModuleSP &module_sp, Target *target)
1059{
1060 Error error;
Enrico Granata97303392013-05-21 00:00:30 +00001061 StreamString feedback_stream;
1062 if (module_sp && !module_sp->LoadScriptingResourceInTarget(target, error, &feedback_stream))
Enrico Granata17598482012-11-08 02:22:02 +00001063 {
Enrico Granata97303392013-05-21 00:00:30 +00001064 if (error.AsCString())
Greg Clayton44d93782014-01-27 23:43:24 +00001065 target->GetDebugger().GetErrorFile()->Printf("unable to load scripting data for module %s - error reported was %s\n",
Enrico Granata97303392013-05-21 00:00:30 +00001066 module_sp->GetFileSpec().GetFileNameStrippingExtension().GetCString(),
1067 error.AsCString());
Enrico Granata17598482012-11-08 02:22:02 +00001068 }
Enrico Granatafe7295d2014-08-16 00:32:58 +00001069 if (feedback_stream.GetSize())
1070 target->GetDebugger().GetErrorFile()->Printf("%s\n",
1071 feedback_stream.GetData());
Enrico Granata17598482012-11-08 02:22:02 +00001072}
1073
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001074void
Greg Claytonb35db632013-11-09 00:03:31 +00001075Target::ClearModules(bool delete_locations)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001076{
Greg Claytonb35db632013-11-09 00:03:31 +00001077 ModulesDidUnload (m_images, delete_locations);
Greg Claytond5944cd2013-12-06 01:12:00 +00001078 m_section_load_history.Clear();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001079 m_images.Clear();
1080 m_scratch_ast_context_ap.reset();
Sean Callanan4bf80d52011-11-15 22:27:19 +00001081 m_scratch_ast_source_ap.reset();
Sean Callanan686b2312011-11-16 18:20:47 +00001082 m_ast_importer_ap.reset();
Greg Clayton095eeaa2013-11-05 23:28:00 +00001083}
1084
1085void
Greg Claytonb35db632013-11-09 00:03:31 +00001086Target::DidExec ()
1087{
1088 // When a process exec's we need to know about it so we can do some cleanup.
1089 m_breakpoint_list.RemoveInvalidLocations(m_arch);
1090 m_internal_breakpoint_list.RemoveInvalidLocations(m_arch);
1091}
1092
1093void
Greg Clayton095eeaa2013-11-05 23:28:00 +00001094Target::SetExecutableModule (ModuleSP& executable_sp, bool get_dependent_files)
1095{
1096 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TARGET));
Greg Claytonb35db632013-11-09 00:03:31 +00001097 ClearModules(false);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001098
1099 if (executable_sp.get())
1100 {
1101 Timer scoped_timer (__PRETTY_FUNCTION__,
Greg Claytonb5ad4ec2013-04-29 17:25:54 +00001102 "Target::SetExecutableModule (executable = '%s')",
1103 executable_sp->GetFileSpec().GetPath().c_str());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001104
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +00001105 m_images.Append(executable_sp); // The first image is our executable file
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001106
Jim Ingham5aee1622010-08-09 23:31:02 +00001107 // If we haven't set an architecture yet, reset our architecture based on what we found in the executable module.
Greg Clayton32e0a752011-03-30 18:16:51 +00001108 if (!m_arch.IsValid())
Jason Molendae1b68ad2012-12-05 00:25:49 +00001109 {
Greg Clayton32e0a752011-03-30 18:16:51 +00001110 m_arch = executable_sp->GetArchitecture();
Jason Molendae1b68ad2012-12-05 00:25:49 +00001111 if (log)
1112 log->Printf ("Target::SetExecutableModule setting architecture to %s (%s) based on executable file", m_arch.GetArchitectureName(), m_arch.GetTriple().getTriple().c_str());
1113 }
1114
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001115 FileSpecList dependent_files;
Greg Claytone996fd32011-03-08 22:40:15 +00001116 ObjectFile *executable_objfile = executable_sp->GetObjectFile();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001117
Greg Claytoncac9c5f2011-09-24 00:52:29 +00001118 if (executable_objfile && get_dependent_files)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001119 {
1120 executable_objfile->GetDependentModules(dependent_files);
1121 for (uint32_t i=0; i<dependent_files.GetSize(); i++)
1122 {
Greg Claytonded470d2011-03-19 01:12:21 +00001123 FileSpec dependent_file_spec (dependent_files.GetFileSpecPointerAtIndex(i));
1124 FileSpec platform_dependent_file_spec;
1125 if (m_platform_sp)
Steve Puccifc995722014-01-17 18:18:31 +00001126 m_platform_sp->GetFileWithUUID (dependent_file_spec, NULL, platform_dependent_file_spec);
Greg Claytonded470d2011-03-19 01:12:21 +00001127 else
1128 platform_dependent_file_spec = dependent_file_spec;
1129
Greg Claytonb9a01b32012-02-26 05:51:37 +00001130 ModuleSpec module_spec (platform_dependent_file_spec, m_arch);
1131 ModuleSP image_module_sp(GetSharedModule (module_spec));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001132 if (image_module_sp.get())
1133 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001134 ObjectFile *objfile = image_module_sp->GetObjectFile();
1135 if (objfile)
1136 objfile->GetDependentModules(dependent_files);
1137 }
1138 }
1139 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001140 }
1141}
1142
1143
Jim Ingham5aee1622010-08-09 23:31:02 +00001144bool
1145Target::SetArchitecture (const ArchSpec &arch_spec)
1146{
Greg Clayton5160ce52013-03-27 23:08:40 +00001147 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TARGET));
Sean Callananbf4b7be2012-12-13 22:07:14 +00001148 if (m_arch.IsCompatibleMatch(arch_spec) || !m_arch.IsValid())
Jim Ingham5aee1622010-08-09 23:31:02 +00001149 {
Greg Clayton70512312012-05-08 01:45:38 +00001150 // If we haven't got a valid arch spec, or the architectures are
1151 // compatible, so just update the architecture. Architectures can be
1152 // equal, yet the triple OS and vendor might change, so we need to do
1153 // the assignment here just in case.
Greg Clayton32e0a752011-03-30 18:16:51 +00001154 m_arch = arch_spec;
Jason Molendae1b68ad2012-12-05 00:25:49 +00001155 if (log)
1156 log->Printf ("Target::SetArchitecture setting architecture to %s (%s)", arch_spec.GetArchitectureName(), arch_spec.GetTriple().getTriple().c_str());
Jim Ingham5aee1622010-08-09 23:31:02 +00001157 return true;
1158 }
1159 else
1160 {
1161 // If we have an executable file, try to reset the executable to the desired architecture
Jason Molendae1b68ad2012-12-05 00:25:49 +00001162 if (log)
Jason Molenda727e3922012-12-05 23:07:34 +00001163 log->Printf ("Target::SetArchitecture changing architecture to %s (%s)", arch_spec.GetArchitectureName(), arch_spec.GetTriple().getTriple().c_str());
Greg Clayton32e0a752011-03-30 18:16:51 +00001164 m_arch = arch_spec;
Jim Ingham5aee1622010-08-09 23:31:02 +00001165 ModuleSP executable_sp = GetExecutableModule ();
Greg Clayton095eeaa2013-11-05 23:28:00 +00001166
Greg Claytonb35db632013-11-09 00:03:31 +00001167 ClearModules(true);
Jim Ingham5aee1622010-08-09 23:31:02 +00001168 // Need to do something about unsetting breakpoints.
1169
1170 if (executable_sp)
1171 {
Jason Molendae1b68ad2012-12-05 00:25:49 +00001172 if (log)
1173 log->Printf("Target::SetArchitecture Trying to select executable file architecture %s (%s)", arch_spec.GetArchitectureName(), arch_spec.GetTriple().getTriple().c_str());
Greg Claytonb9a01b32012-02-26 05:51:37 +00001174 ModuleSpec module_spec (executable_sp->GetFileSpec(), arch_spec);
1175 Error error = ModuleList::GetSharedModule (module_spec,
1176 executable_sp,
Greg Clayton6920b522012-08-22 18:39:03 +00001177 &GetExecutableSearchPaths(),
Greg Claytonb9a01b32012-02-26 05:51:37 +00001178 NULL,
1179 NULL);
Jim Ingham5aee1622010-08-09 23:31:02 +00001180
1181 if (!error.Fail() && executable_sp)
1182 {
1183 SetExecutableModule (executable_sp, true);
1184 return true;
1185 }
Jim Ingham5aee1622010-08-09 23:31:02 +00001186 }
1187 }
Greg Clayton70512312012-05-08 01:45:38 +00001188 return false;
Jim Ingham5aee1622010-08-09 23:31:02 +00001189}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001190
Tamas Berghammere9f4dfe2015-03-13 10:32:42 +00001191bool
1192Target::MergeArchitecture (const ArchSpec &arch_spec)
1193{
1194 if (arch_spec.IsValid())
1195 {
1196 if (m_arch.IsCompatibleMatch(arch_spec))
1197 {
1198 // The current target arch is compatible with "arch_spec", see if we
1199 // can improve our current architecture using bits from "arch_spec"
1200
1201 // Merge bits from arch_spec into "merged_arch" and set our architecture
1202 ArchSpec merged_arch (m_arch);
1203 merged_arch.MergeFrom (arch_spec);
1204 return SetArchitecture(merged_arch);
1205 }
1206 else
1207 {
1208 // The new architecture is different, we just need to replace it
1209 return SetArchitecture(arch_spec);
1210 }
1211 }
1212 return false;
1213}
1214
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001215void
Enrico Granataefe637d2012-11-08 19:16:03 +00001216Target::WillClearList (const ModuleList& module_list)
Enrico Granata17598482012-11-08 02:22:02 +00001217{
1218}
1219
1220void
Enrico Granataefe637d2012-11-08 19:16:03 +00001221Target::ModuleAdded (const ModuleList& module_list, const ModuleSP &module_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001222{
1223 // A module is being added to this target for the first time
Greg Clayton23f8c952014-03-24 23:10:19 +00001224 if (m_valid)
1225 {
1226 ModuleList my_module_list;
1227 my_module_list.Append(module_sp);
1228 LoadScriptingResourceForModule(module_sp, this);
1229 ModulesDidLoad (my_module_list);
1230 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001231}
1232
1233void
Enrico Granataefe637d2012-11-08 19:16:03 +00001234Target::ModuleRemoved (const ModuleList& module_list, const ModuleSP &module_sp)
Enrico Granata17598482012-11-08 02:22:02 +00001235{
1236 // A module is being added to this target for the first time
Greg Clayton23f8c952014-03-24 23:10:19 +00001237 if (m_valid)
1238 {
1239 ModuleList my_module_list;
1240 my_module_list.Append(module_sp);
1241 ModulesDidUnload (my_module_list, false);
1242 }
Enrico Granata17598482012-11-08 02:22:02 +00001243}
1244
1245void
Enrico Granataefe637d2012-11-08 19:16:03 +00001246Target::ModuleUpdated (const ModuleList& module_list, const ModuleSP &old_module_sp, const ModuleSP &new_module_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001247{
Jim Inghame716ae02011-08-03 01:00:06 +00001248 // A module is replacing an already added module
Greg Clayton23f8c952014-03-24 23:10:19 +00001249 if (m_valid)
1250 m_breakpoint_list.UpdateBreakpointsWhenModuleIsReplaced(old_module_sp, new_module_sp);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001251}
1252
1253void
1254Target::ModulesDidLoad (ModuleList &module_list)
1255{
Greg Clayton23f8c952014-03-24 23:10:19 +00001256 if (m_valid && module_list.GetSize())
Enrico Granata17598482012-11-08 02:22:02 +00001257 {
Greg Clayton095eeaa2013-11-05 23:28:00 +00001258 m_breakpoint_list.UpdateBreakpoints (module_list, true, false);
Jason Molendaeef51062013-11-05 03:57:19 +00001259 if (m_process_sp)
1260 {
Andrew MacPhersoneb4d0602014-03-13 09:37:02 +00001261 m_process_sp->ModulesDidLoad (module_list);
Jason Molendaeef51062013-11-05 03:57:19 +00001262 }
Ilia Keb2c19a2015-03-10 21:59:55 +00001263 BroadcastEvent (eBroadcastBitModulesLoaded, new TargetEventData (this->shared_from_this(), module_list));
Enrico Granata17598482012-11-08 02:22:02 +00001264 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001265}
1266
1267void
Enrico Granataf15ee4e2013-04-05 18:49:06 +00001268Target::SymbolsDidLoad (ModuleList &module_list)
1269{
Greg Clayton23f8c952014-03-24 23:10:19 +00001270 if (m_valid && module_list.GetSize())
Enrico Granataf15ee4e2013-04-05 18:49:06 +00001271 {
Jim Ingham31caf982013-06-04 23:01:35 +00001272 if (m_process_sp)
Enrico Granataf15ee4e2013-04-05 18:49:06 +00001273 {
Jim Ingham31caf982013-06-04 23:01:35 +00001274 LanguageRuntime* runtime = m_process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC);
1275 if (runtime)
1276 {
1277 ObjCLanguageRuntime *objc_runtime = (ObjCLanguageRuntime*)runtime;
1278 objc_runtime->SymbolsDidLoad(module_list);
1279 }
Enrico Granataf15ee4e2013-04-05 18:49:06 +00001280 }
Jim Ingham31caf982013-06-04 23:01:35 +00001281
Greg Clayton095eeaa2013-11-05 23:28:00 +00001282 m_breakpoint_list.UpdateBreakpoints (module_list, true, false);
Ilia Keb2c19a2015-03-10 21:59:55 +00001283 BroadcastEvent (eBroadcastBitSymbolsLoaded, new TargetEventData (this->shared_from_this(), module_list));
Enrico Granataf15ee4e2013-04-05 18:49:06 +00001284 }
Enrico Granataf15ee4e2013-04-05 18:49:06 +00001285}
1286
1287void
Greg Clayton095eeaa2013-11-05 23:28:00 +00001288Target::ModulesDidUnload (ModuleList &module_list, bool delete_locations)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001289{
Greg Clayton23f8c952014-03-24 23:10:19 +00001290 if (m_valid && module_list.GetSize())
Enrico Granata17598482012-11-08 02:22:02 +00001291 {
Greg Clayton8012cad2014-11-17 19:39:20 +00001292 UnloadModuleSections (module_list);
Greg Clayton095eeaa2013-11-05 23:28:00 +00001293 m_breakpoint_list.UpdateBreakpoints (module_list, false, delete_locations);
Ilia Keb2c19a2015-03-10 21:59:55 +00001294 BroadcastEvent (eBroadcastBitModulesUnloaded, new TargetEventData (this->shared_from_this(), module_list));
Enrico Granata17598482012-11-08 02:22:02 +00001295 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001296}
1297
Daniel Dunbarf9f70322011-10-31 22:50:37 +00001298bool
Jim Ingham33df7cd2014-12-06 01:28:03 +00001299Target::ModuleIsExcludedForUnconstrainedSearches (const FileSpec &module_file_spec)
Jim Inghamc6674fd2011-10-28 23:14:11 +00001300{
Greg Clayton67cc0632012-08-22 17:17:09 +00001301 if (GetBreakpointsConsultPlatformAvoidList())
Jim Inghamc6674fd2011-10-28 23:14:11 +00001302 {
1303 ModuleList matchingModules;
Greg Claytonb9a01b32012-02-26 05:51:37 +00001304 ModuleSpec module_spec (module_file_spec);
1305 size_t num_modules = GetImages().FindModules(module_spec, matchingModules);
Jim Inghamc6674fd2011-10-28 23:14:11 +00001306
1307 // If there is more than one module for this file spec, only return true if ALL the modules are on the
1308 // black list.
1309 if (num_modules > 0)
1310 {
Andy Gibbsa297a972013-06-19 19:04:53 +00001311 for (size_t i = 0; i < num_modules; i++)
Jim Inghamc6674fd2011-10-28 23:14:11 +00001312 {
Jim Ingham33df7cd2014-12-06 01:28:03 +00001313 if (!ModuleIsExcludedForUnconstrainedSearches (matchingModules.GetModuleAtIndex(i)))
Jim Inghamc6674fd2011-10-28 23:14:11 +00001314 return false;
1315 }
1316 return true;
1317 }
Jim Inghamc6674fd2011-10-28 23:14:11 +00001318 }
Greg Clayton67cc0632012-08-22 17:17:09 +00001319 return false;
Jim Inghamc6674fd2011-10-28 23:14:11 +00001320}
1321
Daniel Dunbarf9f70322011-10-31 22:50:37 +00001322bool
Jim Ingham33df7cd2014-12-06 01:28:03 +00001323Target::ModuleIsExcludedForUnconstrainedSearches (const lldb::ModuleSP &module_sp)
Jim Inghamc6674fd2011-10-28 23:14:11 +00001324{
Greg Clayton67cc0632012-08-22 17:17:09 +00001325 if (GetBreakpointsConsultPlatformAvoidList())
Jim Inghamc6674fd2011-10-28 23:14:11 +00001326 {
Greg Clayton67cc0632012-08-22 17:17:09 +00001327 if (m_platform_sp)
Jim Ingham33df7cd2014-12-06 01:28:03 +00001328 return m_platform_sp->ModuleIsExcludedForUnconstrainedSearches (*this, module_sp);
Jim Inghamc6674fd2011-10-28 23:14:11 +00001329 }
Greg Clayton67cc0632012-08-22 17:17:09 +00001330 return false;
Jim Inghamc6674fd2011-10-28 23:14:11 +00001331}
1332
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001333size_t
Greg Claytondb598232011-01-07 01:57:07 +00001334Target::ReadMemoryFromFileCache (const Address& addr, void *dst, size_t dst_len, Error &error)
1335{
Greg Claytone72dfb32012-02-24 01:59:29 +00001336 SectionSP section_sp (addr.GetSection());
1337 if (section_sp)
Greg Claytondb598232011-01-07 01:57:07 +00001338 {
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +00001339 // If the contents of this section are encrypted, the on-disk file is unusable. Read only from live memory.
Jason Molenda216d91f2012-04-25 00:06:56 +00001340 if (section_sp->IsEncrypted())
1341 {
Greg Clayton57f06302012-05-25 17:05:55 +00001342 error.SetErrorString("section is encrypted");
Jason Molenda216d91f2012-04-25 00:06:56 +00001343 return 0;
1344 }
Greg Claytone72dfb32012-02-24 01:59:29 +00001345 ModuleSP module_sp (section_sp->GetModule());
1346 if (module_sp)
Greg Claytondb598232011-01-07 01:57:07 +00001347 {
Greg Claytone72dfb32012-02-24 01:59:29 +00001348 ObjectFile *objfile = section_sp->GetModule()->GetObjectFile();
1349 if (objfile)
1350 {
1351 size_t bytes_read = objfile->ReadSectionData (section_sp.get(),
1352 addr.GetOffset(),
1353 dst,
1354 dst_len);
1355 if (bytes_read > 0)
1356 return bytes_read;
1357 else
1358 error.SetErrorStringWithFormat("error reading data from section %s", section_sp->GetName().GetCString());
1359 }
Greg Claytondb598232011-01-07 01:57:07 +00001360 else
Greg Claytone72dfb32012-02-24 01:59:29 +00001361 error.SetErrorString("address isn't from a object file");
Greg Claytondb598232011-01-07 01:57:07 +00001362 }
1363 else
Greg Claytone72dfb32012-02-24 01:59:29 +00001364 error.SetErrorString("address isn't in a module");
Greg Claytondb598232011-01-07 01:57:07 +00001365 }
1366 else
Greg Claytondb598232011-01-07 01:57:07 +00001367 error.SetErrorString("address doesn't contain a section that points to a section in a object file");
Greg Claytone72dfb32012-02-24 01:59:29 +00001368
Greg Claytondb598232011-01-07 01:57:07 +00001369 return 0;
1370}
1371
1372size_t
Enrico Granata9128ee22011-09-06 19:20:51 +00001373Target::ReadMemory (const Address& addr,
1374 bool prefer_file_cache,
1375 void *dst,
1376 size_t dst_len,
1377 Error &error,
1378 lldb::addr_t *load_addr_ptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001379{
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001380 error.Clear();
Greg Claytondb598232011-01-07 01:57:07 +00001381
Enrico Granata9128ee22011-09-06 19:20:51 +00001382 // if we end up reading this from process memory, we will fill this
1383 // with the actual load address
1384 if (load_addr_ptr)
1385 *load_addr_ptr = LLDB_INVALID_ADDRESS;
1386
Greg Claytondb598232011-01-07 01:57:07 +00001387 size_t bytes_read = 0;
Greg Claytonc749eb82011-07-11 05:12:02 +00001388
1389 addr_t load_addr = LLDB_INVALID_ADDRESS;
1390 addr_t file_addr = LLDB_INVALID_ADDRESS;
Greg Clayton357132e2011-03-26 19:14:58 +00001391 Address resolved_addr;
1392 if (!addr.IsSectionOffset())
Greg Claytondda4f7b2010-06-30 23:03:03 +00001393 {
Greg Claytond5944cd2013-12-06 01:12:00 +00001394 SectionLoadList &section_load_list = GetSectionLoadList();
1395 if (section_load_list.IsEmpty())
Greg Claytonc749eb82011-07-11 05:12:02 +00001396 {
Greg Claytond16e1e52011-07-12 17:06:17 +00001397 // No sections are loaded, so we must assume we are not running
1398 // yet and anything we are given is a file address.
1399 file_addr = addr.GetOffset(); // "addr" doesn't have a section, so its offset is the file address
1400 m_images.ResolveFileAddress (file_addr, resolved_addr);
Greg Claytonc749eb82011-07-11 05:12:02 +00001401 }
Greg Claytondda4f7b2010-06-30 23:03:03 +00001402 else
Greg Claytonc749eb82011-07-11 05:12:02 +00001403 {
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +00001404 // We have at least one section loaded. This can be because
Greg Claytond16e1e52011-07-12 17:06:17 +00001405 // we have manually loaded some sections with "target modules load ..."
1406 // or because we have have a live process that has sections loaded
1407 // through the dynamic loader
1408 load_addr = addr.GetOffset(); // "addr" doesn't have a section, so its offset is the load address
Greg Claytond5944cd2013-12-06 01:12:00 +00001409 section_load_list.ResolveLoadAddress (load_addr, resolved_addr);
Greg Claytonc749eb82011-07-11 05:12:02 +00001410 }
Greg Claytondda4f7b2010-06-30 23:03:03 +00001411 }
Greg Clayton357132e2011-03-26 19:14:58 +00001412 if (!resolved_addr.IsValid())
1413 resolved_addr = addr;
Greg Claytondda4f7b2010-06-30 23:03:03 +00001414
Greg Claytonc749eb82011-07-11 05:12:02 +00001415
Greg Claytondb598232011-01-07 01:57:07 +00001416 if (prefer_file_cache)
1417 {
1418 bytes_read = ReadMemoryFromFileCache (resolved_addr, dst, dst_len, error);
1419 if (bytes_read > 0)
1420 return bytes_read;
1421 }
Greg Claytondda4f7b2010-06-30 23:03:03 +00001422
Johnny Chen86364b42011-09-20 23:28:55 +00001423 if (ProcessIsValid())
Greg Claytondda4f7b2010-06-30 23:03:03 +00001424 {
Greg Claytonc749eb82011-07-11 05:12:02 +00001425 if (load_addr == LLDB_INVALID_ADDRESS)
1426 load_addr = resolved_addr.GetLoadAddress (this);
1427
Greg Claytondda4f7b2010-06-30 23:03:03 +00001428 if (load_addr == LLDB_INVALID_ADDRESS)
1429 {
Greg Claytone72dfb32012-02-24 01:59:29 +00001430 ModuleSP addr_module_sp (resolved_addr.GetModule());
1431 if (addr_module_sp && addr_module_sp->GetFileSpec())
Daniel Malead01b2952012-11-29 21:49:15 +00001432 error.SetErrorStringWithFormat("%s[0x%" PRIx64 "] can't be resolved, %s in not currently loaded",
Jim Ingham4af59612014-12-19 19:20:44 +00001433 addr_module_sp->GetFileSpec().GetFilename().AsCString("<Unknown>"),
Jason Molenda7e589a62011-09-20 00:26:08 +00001434 resolved_addr.GetFileAddress(),
Jim Ingham4af59612014-12-19 19:20:44 +00001435 addr_module_sp->GetFileSpec().GetFilename().AsCString("<Unknonw>"));
Greg Claytondda4f7b2010-06-30 23:03:03 +00001436 else
Daniel Malead01b2952012-11-29 21:49:15 +00001437 error.SetErrorStringWithFormat("0x%" PRIx64 " can't be resolved", resolved_addr.GetFileAddress());
Greg Claytondda4f7b2010-06-30 23:03:03 +00001438 }
1439 else
1440 {
Greg Claytondb598232011-01-07 01:57:07 +00001441 bytes_read = m_process_sp->ReadMemory(load_addr, dst, dst_len, error);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001442 if (bytes_read != dst_len)
1443 {
1444 if (error.Success())
1445 {
1446 if (bytes_read == 0)
Daniel Malead01b2952012-11-29 21:49:15 +00001447 error.SetErrorStringWithFormat("read memory from 0x%" PRIx64 " failed", load_addr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001448 else
Daniel Malead01b2952012-11-29 21:49:15 +00001449 error.SetErrorStringWithFormat("only %" PRIu64 " of %" PRIu64 " bytes were read from memory at 0x%" PRIx64, (uint64_t)bytes_read, (uint64_t)dst_len, load_addr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001450 }
1451 }
Greg Claytondda4f7b2010-06-30 23:03:03 +00001452 if (bytes_read)
Enrico Granata9128ee22011-09-06 19:20:51 +00001453 {
1454 if (load_addr_ptr)
1455 *load_addr_ptr = load_addr;
Greg Claytondda4f7b2010-06-30 23:03:03 +00001456 return bytes_read;
Enrico Granata9128ee22011-09-06 19:20:51 +00001457 }
Greg Claytondda4f7b2010-06-30 23:03:03 +00001458 // If the address is not section offset we have an address that
1459 // doesn't resolve to any address in any currently loaded shared
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +00001460 // libraries and we failed to read memory so there isn't anything
Greg Claytondda4f7b2010-06-30 23:03:03 +00001461 // more we can do. If it is section offset, we might be able to
1462 // read cached memory from the object file.
1463 if (!resolved_addr.IsSectionOffset())
1464 return 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001465 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001466 }
Greg Claytondda4f7b2010-06-30 23:03:03 +00001467
Greg Claytonc749eb82011-07-11 05:12:02 +00001468 if (!prefer_file_cache && resolved_addr.IsSectionOffset())
Greg Claytondda4f7b2010-06-30 23:03:03 +00001469 {
Greg Claytondb598232011-01-07 01:57:07 +00001470 // If we didn't already try and read from the object file cache, then
1471 // try it after failing to read from the process.
1472 return ReadMemoryFromFileCache (resolved_addr, dst, dst_len, error);
Greg Claytondda4f7b2010-06-30 23:03:03 +00001473 }
1474 return 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001475}
1476
Greg Claytond16e1e52011-07-12 17:06:17 +00001477size_t
Enrico Granata6b4ddc62013-01-21 19:20:50 +00001478Target::ReadCStringFromMemory (const Address& addr, std::string &out_str, Error &error)
1479{
1480 char buf[256];
1481 out_str.clear();
1482 addr_t curr_addr = addr.GetLoadAddress(this);
1483 Address address(addr);
1484 while (1)
1485 {
1486 size_t length = ReadCStringFromMemory (address, buf, sizeof(buf), error);
1487 if (length == 0)
1488 break;
1489 out_str.append(buf, length);
1490 // If we got "length - 1" bytes, we didn't get the whole C string, we
1491 // need to read some more characters
1492 if (length == sizeof(buf) - 1)
1493 curr_addr += length;
1494 else
1495 break;
1496 address = Address(curr_addr);
1497 }
1498 return out_str.size();
1499}
1500
1501
1502size_t
1503Target::ReadCStringFromMemory (const Address& addr, char *dst, size_t dst_max_len, Error &result_error)
1504{
1505 size_t total_cstr_len = 0;
1506 if (dst && dst_max_len)
1507 {
1508 result_error.Clear();
1509 // NULL out everything just to be safe
1510 memset (dst, 0, dst_max_len);
1511 Error error;
1512 addr_t curr_addr = addr.GetLoadAddress(this);
1513 Address address(addr);
Jason Molendaf0340c92014-09-03 22:30:54 +00001514
1515 // We could call m_process_sp->GetMemoryCacheLineSize() but I don't
1516 // think this really needs to be tied to the memory cache subsystem's
1517 // cache line size, so leave this as a fixed constant.
Enrico Granata6b4ddc62013-01-21 19:20:50 +00001518 const size_t cache_line_size = 512;
Jason Molendaf0340c92014-09-03 22:30:54 +00001519
Enrico Granata6b4ddc62013-01-21 19:20:50 +00001520 size_t bytes_left = dst_max_len - 1;
1521 char *curr_dst = dst;
1522
1523 while (bytes_left > 0)
1524 {
1525 addr_t cache_line_bytes_left = cache_line_size - (curr_addr % cache_line_size);
1526 addr_t bytes_to_read = std::min<addr_t>(bytes_left, cache_line_bytes_left);
1527 size_t bytes_read = ReadMemory (address, false, curr_dst, bytes_to_read, error);
1528
1529 if (bytes_read == 0)
1530 {
1531 result_error = error;
1532 dst[total_cstr_len] = '\0';
1533 break;
1534 }
1535 const size_t len = strlen(curr_dst);
1536
1537 total_cstr_len += len;
1538
1539 if (len < bytes_to_read)
1540 break;
1541
1542 curr_dst += bytes_read;
1543 curr_addr += bytes_read;
1544 bytes_left -= bytes_read;
1545 address = Address(curr_addr);
1546 }
1547 }
1548 else
1549 {
1550 if (dst == NULL)
1551 result_error.SetErrorString("invalid arguments");
1552 else
1553 result_error.Clear();
1554 }
1555 return total_cstr_len;
1556}
1557
1558size_t
Greg Claytond16e1e52011-07-12 17:06:17 +00001559Target::ReadScalarIntegerFromMemory (const Address& addr,
1560 bool prefer_file_cache,
1561 uint32_t byte_size,
1562 bool is_signed,
1563 Scalar &scalar,
1564 Error &error)
1565{
1566 uint64_t uval;
1567
1568 if (byte_size <= sizeof(uval))
1569 {
1570 size_t bytes_read = ReadMemory (addr, prefer_file_cache, &uval, byte_size, error);
1571 if (bytes_read == byte_size)
1572 {
1573 DataExtractor data (&uval, sizeof(uval), m_arch.GetByteOrder(), m_arch.GetAddressByteSize());
Greg Claytonc7bece562013-01-25 18:06:21 +00001574 lldb::offset_t offset = 0;
Greg Claytond16e1e52011-07-12 17:06:17 +00001575 if (byte_size <= 4)
1576 scalar = data.GetMaxU32 (&offset, byte_size);
1577 else
1578 scalar = data.GetMaxU64 (&offset, byte_size);
1579
1580 if (is_signed)
1581 scalar.SignExtend(byte_size * 8);
1582 return bytes_read;
1583 }
1584 }
1585 else
1586 {
1587 error.SetErrorStringWithFormat ("byte size of %u is too large for integer scalar type", byte_size);
1588 }
1589 return 0;
1590}
1591
1592uint64_t
1593Target::ReadUnsignedIntegerFromMemory (const Address& addr,
1594 bool prefer_file_cache,
1595 size_t integer_byte_size,
1596 uint64_t fail_value,
1597 Error &error)
1598{
1599 Scalar scalar;
1600 if (ReadScalarIntegerFromMemory (addr,
1601 prefer_file_cache,
1602 integer_byte_size,
1603 false,
1604 scalar,
1605 error))
1606 return scalar.ULongLong(fail_value);
1607 return fail_value;
1608}
1609
1610bool
1611Target::ReadPointerFromMemory (const Address& addr,
1612 bool prefer_file_cache,
1613 Error &error,
1614 Address &pointer_addr)
1615{
1616 Scalar scalar;
1617 if (ReadScalarIntegerFromMemory (addr,
1618 prefer_file_cache,
1619 m_arch.GetAddressByteSize(),
1620 false,
1621 scalar,
1622 error))
1623 {
1624 addr_t pointer_vm_addr = scalar.ULongLong(LLDB_INVALID_ADDRESS);
1625 if (pointer_vm_addr != LLDB_INVALID_ADDRESS)
1626 {
Greg Claytond5944cd2013-12-06 01:12:00 +00001627 SectionLoadList &section_load_list = GetSectionLoadList();
1628 if (section_load_list.IsEmpty())
Greg Claytond16e1e52011-07-12 17:06:17 +00001629 {
1630 // No sections are loaded, so we must assume we are not running
1631 // yet and anything we are given is a file address.
1632 m_images.ResolveFileAddress (pointer_vm_addr, pointer_addr);
1633 }
1634 else
1635 {
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +00001636 // We have at least one section loaded. This can be because
Greg Claytond16e1e52011-07-12 17:06:17 +00001637 // we have manually loaded some sections with "target modules load ..."
1638 // or because we have have a live process that has sections loaded
1639 // through the dynamic loader
Greg Claytond5944cd2013-12-06 01:12:00 +00001640 section_load_list.ResolveLoadAddress (pointer_vm_addr, pointer_addr);
Greg Claytond16e1e52011-07-12 17:06:17 +00001641 }
1642 // We weren't able to resolve the pointer value, so just return
1643 // an address with no section
1644 if (!pointer_addr.IsValid())
1645 pointer_addr.SetOffset (pointer_vm_addr);
1646 return true;
1647
1648 }
1649 }
1650 return false;
1651}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001652
1653ModuleSP
Greg Claytonb9a01b32012-02-26 05:51:37 +00001654Target::GetSharedModule (const ModuleSpec &module_spec, Error *error_ptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001655{
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001656 ModuleSP module_sp;
1657
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001658 Error error;
1659
Jim Ingham4a94c912012-05-17 18:38:42 +00001660 // First see if we already have this module in our module list. If we do, then we're done, we don't need
1661 // to consult the shared modules list. But only do this if we are passed a UUID.
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001662
Jim Ingham4a94c912012-05-17 18:38:42 +00001663 if (module_spec.GetUUID().IsValid())
1664 module_sp = m_images.FindFirstModule(module_spec);
1665
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001666 if (!module_sp)
1667 {
Jim Ingham4a94c912012-05-17 18:38:42 +00001668 ModuleSP old_module_sp; // This will get filled in if we have a new version of the library
1669 bool did_create_module = false;
1670
1671 // If there are image search path entries, try to use them first to acquire a suitable image.
1672 if (m_image_search_paths.GetSize())
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001673 {
Jim Ingham4a94c912012-05-17 18:38:42 +00001674 ModuleSpec transformed_spec (module_spec);
1675 if (m_image_search_paths.RemapPath (module_spec.GetFileSpec().GetDirectory(), transformed_spec.GetFileSpec().GetDirectory()))
1676 {
1677 transformed_spec.GetFileSpec().GetFilename() = module_spec.GetFileSpec().GetFilename();
1678 error = ModuleList::GetSharedModule (transformed_spec,
1679 module_sp,
Greg Clayton6920b522012-08-22 18:39:03 +00001680 &GetExecutableSearchPaths(),
Jim Ingham4a94c912012-05-17 18:38:42 +00001681 &old_module_sp,
1682 &did_create_module);
1683 }
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001684 }
Jim Ingham4a94c912012-05-17 18:38:42 +00001685
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001686 if (!module_sp)
1687 {
Jim Ingham4a94c912012-05-17 18:38:42 +00001688 // If we have a UUID, we can check our global shared module list in case
1689 // we already have it. If we don't have a valid UUID, then we can't since
1690 // the path in "module_spec" will be a platform path, and we will need to
1691 // let the platform find that file. For example, we could be asking for
1692 // "/usr/lib/dyld" and if we do not have a UUID, we don't want to pick
1693 // the local copy of "/usr/lib/dyld" since our platform could be a remote
1694 // platform that has its own "/usr/lib/dyld" in an SDK or in a local file
1695 // cache.
1696 if (module_spec.GetUUID().IsValid())
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001697 {
Jim Ingham4a94c912012-05-17 18:38:42 +00001698 // We have a UUID, it is OK to check the global module list...
1699 error = ModuleList::GetSharedModule (module_spec,
1700 module_sp,
Greg Clayton6920b522012-08-22 18:39:03 +00001701 &GetExecutableSearchPaths(),
Greg Clayton67cc0632012-08-22 17:17:09 +00001702 &old_module_sp,
Jim Ingham4a94c912012-05-17 18:38:42 +00001703 &did_create_module);
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001704 }
Jim Ingham4a94c912012-05-17 18:38:42 +00001705
1706 if (!module_sp)
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001707 {
Jim Ingham4a94c912012-05-17 18:38:42 +00001708 // The platform is responsible for finding and caching an appropriate
1709 // module in the shared module cache.
1710 if (m_platform_sp)
1711 {
Tamas Berghammer7cb18bf2015-03-24 11:15:23 +00001712 error = m_platform_sp->GetSharedModule (module_spec,
1713 m_process_sp.get(),
1714 module_sp,
Greg Clayton6920b522012-08-22 18:39:03 +00001715 &GetExecutableSearchPaths(),
Greg Clayton67cc0632012-08-22 17:17:09 +00001716 &old_module_sp,
Jim Ingham4a94c912012-05-17 18:38:42 +00001717 &did_create_module);
1718 }
1719 else
1720 {
1721 error.SetErrorString("no platform is currently set");
1722 }
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001723 }
1724 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001725
Jim Ingham4a94c912012-05-17 18:38:42 +00001726 // We found a module that wasn't in our target list. Let's make sure that there wasn't an equivalent
1727 // module in the list already, and if there was, let's remove it.
1728 if (module_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001729 {
Greg Clayton50a24bd2012-11-29 22:16:27 +00001730 ObjectFile *objfile = module_sp->GetObjectFile();
1731 if (objfile)
Jim Ingham4a94c912012-05-17 18:38:42 +00001732 {
Greg Clayton50a24bd2012-11-29 22:16:27 +00001733 switch (objfile->GetType())
Jim Ingham4a94c912012-05-17 18:38:42 +00001734 {
Greg Clayton50a24bd2012-11-29 22:16:27 +00001735 case ObjectFile::eTypeCoreFile: /// A core file that has a checkpoint of a program's execution state
1736 case ObjectFile::eTypeExecutable: /// A normal executable
1737 case ObjectFile::eTypeDynamicLinker: /// The platform's dynamic linker executable
1738 case ObjectFile::eTypeObjectFile: /// An intermediate object file
1739 case ObjectFile::eTypeSharedLibrary: /// A shared library that can be used during execution
1740 break;
1741 case ObjectFile::eTypeDebugInfo: /// An object file that contains only debug information
1742 if (error_ptr)
1743 error_ptr->SetErrorString("debug info files aren't valid target modules, please specify an executable");
1744 return ModuleSP();
1745 case ObjectFile::eTypeStubLibrary: /// A library that can be linked against but not used for execution
1746 if (error_ptr)
1747 error_ptr->SetErrorString("stub libraries aren't valid target modules, please specify an executable");
1748 return ModuleSP();
1749 default:
1750 if (error_ptr)
1751 error_ptr->SetErrorString("unsupported file type, please specify an executable");
1752 return ModuleSP();
1753 }
1754 // GetSharedModule is not guaranteed to find the old shared module, for instance
1755 // in the common case where you pass in the UUID, it is only going to find the one
1756 // module matching the UUID. In fact, it has no good way to know what the "old module"
1757 // relevant to this target is, since there might be many copies of a module with this file spec
1758 // in various running debug sessions, but only one of them will belong to this target.
1759 // So let's remove the UUID from the module list, and look in the target's module list.
1760 // Only do this if there is SOMETHING else in the module spec...
1761 if (!old_module_sp)
1762 {
1763 if (module_spec.GetUUID().IsValid() && !module_spec.GetFileSpec().GetFilename().IsEmpty() && !module_spec.GetFileSpec().GetDirectory().IsEmpty())
Jim Ingham4a94c912012-05-17 18:38:42 +00001764 {
Greg Clayton50a24bd2012-11-29 22:16:27 +00001765 ModuleSpec module_spec_copy(module_spec.GetFileSpec());
1766 module_spec_copy.GetUUID().Clear();
1767
1768 ModuleList found_modules;
1769 size_t num_found = m_images.FindModules (module_spec_copy, found_modules);
1770 if (num_found == 1)
1771 {
1772 old_module_sp = found_modules.GetModuleAtIndex(0);
1773 }
Jim Ingham4a94c912012-05-17 18:38:42 +00001774 }
1775 }
Greg Clayton50a24bd2012-11-29 22:16:27 +00001776
1777 if (old_module_sp && m_images.GetIndexForModule (old_module_sp.get()) != LLDB_INVALID_INDEX32)
1778 {
1779 m_images.ReplaceModule(old_module_sp, module_sp);
1780 Module *old_module_ptr = old_module_sp.get();
1781 old_module_sp.reset();
1782 ModuleList::RemoveSharedModuleIfOrphaned (old_module_ptr);
1783 }
1784 else
1785 m_images.Append(module_sp);
Jim Ingham4a94c912012-05-17 18:38:42 +00001786 }
Greg Clayton86e70cb2014-04-07 23:50:17 +00001787 else
1788 module_sp.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001789 }
1790 }
1791 if (error_ptr)
1792 *error_ptr = error;
1793 return module_sp;
1794}
1795
1796
Greg Claytond9e416c2012-02-18 05:35:26 +00001797TargetSP
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001798Target::CalculateTarget ()
1799{
Greg Claytond9e416c2012-02-18 05:35:26 +00001800 return shared_from_this();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001801}
1802
Greg Claytond9e416c2012-02-18 05:35:26 +00001803ProcessSP
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001804Target::CalculateProcess ()
1805{
Greg Claytond9e416c2012-02-18 05:35:26 +00001806 return ProcessSP();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001807}
1808
Greg Claytond9e416c2012-02-18 05:35:26 +00001809ThreadSP
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001810Target::CalculateThread ()
1811{
Greg Claytond9e416c2012-02-18 05:35:26 +00001812 return ThreadSP();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001813}
1814
Jason Molendab57e4a12013-11-04 09:33:30 +00001815StackFrameSP
1816Target::CalculateStackFrame ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001817{
Jason Molendab57e4a12013-11-04 09:33:30 +00001818 return StackFrameSP();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001819}
1820
1821void
Greg Clayton0603aa92010-10-04 01:05:56 +00001822Target::CalculateExecutionContext (ExecutionContext &exe_ctx)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001823{
Greg Claytonc14ee322011-09-22 04:58:26 +00001824 exe_ctx.Clear();
1825 exe_ctx.SetTargetPtr(this);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001826}
1827
1828PathMappingList &
1829Target::GetImageSearchPathList ()
1830{
1831 return m_image_search_paths;
1832}
1833
1834void
1835Target::ImageSearchPathsChanged
1836(
1837 const PathMappingList &path_list,
1838 void *baton
1839)
1840{
1841 Target *target = (Target *)baton;
Greg Claytonaa149cb2011-08-11 02:48:45 +00001842 ModuleSP exe_module_sp (target->GetExecutableModule());
1843 if (exe_module_sp)
Greg Claytonaa149cb2011-08-11 02:48:45 +00001844 target->SetExecutableModule (exe_module_sp, true);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001845}
1846
1847ClangASTContext *
Johnny Chen60e2c6a2011-11-30 23:18:53 +00001848Target::GetScratchClangASTContext(bool create_on_demand)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001849{
Greg Clayton73da2442011-08-03 01:23:55 +00001850 // Now see if we know the target triple, and if so, create our scratch AST context:
Johnny Chen60e2c6a2011-11-30 23:18:53 +00001851 if (m_scratch_ast_context_ap.get() == NULL && m_arch.IsValid() && create_on_demand)
Sean Callanan4bf80d52011-11-15 22:27:19 +00001852 {
Greg Clayton73da2442011-08-03 01:23:55 +00001853 m_scratch_ast_context_ap.reset (new ClangASTContext(m_arch.GetTriple().str().c_str()));
Greg Claytone1cd1be2012-01-29 20:56:30 +00001854 m_scratch_ast_source_ap.reset (new ClangASTSource(shared_from_this()));
Sean Callanan4bf80d52011-11-15 22:27:19 +00001855 m_scratch_ast_source_ap->InstallASTContext(m_scratch_ast_context_ap->getASTContext());
Todd Fiala955fe6f2014-02-27 17:18:23 +00001856 llvm::IntrusiveRefCntPtr<clang::ExternalASTSource> proxy_ast_source(m_scratch_ast_source_ap->CreateProxy());
Sean Callanan4bf80d52011-11-15 22:27:19 +00001857 m_scratch_ast_context_ap->SetExternalSource(proxy_ast_source);
1858 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001859 return m_scratch_ast_context_ap.get();
1860}
Caroline Ticedaccaa92010-09-20 20:44:43 +00001861
Sean Callanan686b2312011-11-16 18:20:47 +00001862ClangASTImporter *
1863Target::GetClangASTImporter()
1864{
1865 ClangASTImporter *ast_importer = m_ast_importer_ap.get();
1866
1867 if (!ast_importer)
1868 {
1869 ast_importer = new ClangASTImporter();
1870 m_ast_importer_ap.reset(ast_importer);
1871 }
1872
1873 return ast_importer;
1874}
1875
Greg Clayton99d0faf2010-11-18 23:32:35 +00001876void
Caroline Tice20bd37f2011-03-10 22:14:10 +00001877Target::SettingsInitialize ()
Caroline Ticedaccaa92010-09-20 20:44:43 +00001878{
Greg Clayton6920b522012-08-22 18:39:03 +00001879 Process::SettingsInitialize ();
Greg Clayton99d0faf2010-11-18 23:32:35 +00001880}
Caroline Ticedaccaa92010-09-20 20:44:43 +00001881
Greg Clayton99d0faf2010-11-18 23:32:35 +00001882void
Caroline Tice20bd37f2011-03-10 22:14:10 +00001883Target::SettingsTerminate ()
Greg Clayton99d0faf2010-11-18 23:32:35 +00001884{
Greg Clayton6920b522012-08-22 18:39:03 +00001885 Process::SettingsTerminate ();
Greg Clayton99d0faf2010-11-18 23:32:35 +00001886}
Caroline Ticedaccaa92010-09-20 20:44:43 +00001887
Greg Claytonc859e2d2012-02-13 23:10:39 +00001888FileSpecList
1889Target::GetDefaultExecutableSearchPaths ()
1890{
Greg Clayton67cc0632012-08-22 17:17:09 +00001891 TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
1892 if (properties_sp)
1893 return properties_sp->GetExecutableSearchPaths();
Greg Claytonc859e2d2012-02-13 23:10:39 +00001894 return FileSpecList();
1895}
1896
Michael Sartaina7499c92013-07-01 19:45:50 +00001897FileSpecList
1898Target::GetDefaultDebugFileSearchPaths ()
1899{
1900 TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
1901 if (properties_sp)
1902 return properties_sp->GetDebugFileSearchPaths();
1903 return FileSpecList();
1904}
1905
Sean Callanan85054342015-04-03 15:39:47 +00001906FileSpecList
1907Target::GetDefaultClangModuleSearchPaths ()
1908{
1909 TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
1910 if (properties_sp)
1911 return properties_sp->GetClangModuleSearchPaths();
1912 return FileSpecList();
1913}
1914
Caroline Ticedaccaa92010-09-20 20:44:43 +00001915ArchSpec
1916Target::GetDefaultArchitecture ()
1917{
Greg Clayton67cc0632012-08-22 17:17:09 +00001918 TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
1919 if (properties_sp)
1920 return properties_sp->GetDefaultArchitecture();
Greg Clayton8910c902012-05-15 02:44:13 +00001921 return ArchSpec();
Caroline Ticedaccaa92010-09-20 20:44:43 +00001922}
1923
1924void
Greg Clayton67cc0632012-08-22 17:17:09 +00001925Target::SetDefaultArchitecture (const ArchSpec &arch)
Caroline Ticedaccaa92010-09-20 20:44:43 +00001926{
Greg Clayton67cc0632012-08-22 17:17:09 +00001927 TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
1928 if (properties_sp)
Jason Molendaa3f24b32012-12-12 02:23:56 +00001929 {
1930 LogIfAnyCategoriesSet(LIBLLDB_LOG_TARGET, "Target::SetDefaultArchitecture setting target's default architecture to %s (%s)", arch.GetArchitectureName(), arch.GetTriple().getTriple().c_str());
Greg Clayton67cc0632012-08-22 17:17:09 +00001931 return properties_sp->SetDefaultArchitecture(arch);
Jason Molendaa3f24b32012-12-12 02:23:56 +00001932 }
Caroline Ticedaccaa92010-09-20 20:44:43 +00001933}
1934
Greg Clayton0603aa92010-10-04 01:05:56 +00001935Target *
1936Target::GetTargetFromContexts (const ExecutionContext *exe_ctx_ptr, const SymbolContext *sc_ptr)
1937{
1938 // The target can either exist in the "process" of ExecutionContext, or in
1939 // the "target_sp" member of SymbolContext. This accessor helper function
1940 // will get the target from one of these locations.
1941
1942 Target *target = NULL;
1943 if (sc_ptr != NULL)
1944 target = sc_ptr->target_sp.get();
Greg Claytonc14ee322011-09-22 04:58:26 +00001945 if (target == NULL && exe_ctx_ptr)
1946 target = exe_ctx_ptr->GetTargetPtr();
Greg Clayton0603aa92010-10-04 01:05:56 +00001947 return target;
1948}
1949
Jim Ingham1624a2d2014-05-05 02:26:40 +00001950ExpressionResults
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001951Target::EvaluateExpression
1952(
1953 const char *expr_cstr,
Jason Molendab57e4a12013-11-04 09:33:30 +00001954 StackFrame *frame,
Enrico Granata3372f582012-07-16 23:10:35 +00001955 lldb::ValueObjectSP &result_valobj_sp,
Enrico Granatad4439aa2012-09-05 20:41:26 +00001956 const EvaluateExpressionOptions& options
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001957)
1958{
Enrico Granata97fca502012-09-18 17:43:16 +00001959 result_valobj_sp.reset();
1960
Jim Ingham8646d3c2014-05-05 02:47:44 +00001961 ExpressionResults execution_results = eExpressionSetupError;
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001962
Greg Claytond1767f02011-12-08 02:13:16 +00001963 if (expr_cstr == NULL || expr_cstr[0] == '\0')
1964 return execution_results;
1965
Jim Ingham6026ca32011-05-12 02:06:14 +00001966 // We shouldn't run stop hooks in expressions.
1967 // Be sure to reset this if you return anywhere within this function.
1968 bool old_suppress_value = m_suppress_stop_hooks;
1969 m_suppress_stop_hooks = true;
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001970
1971 ExecutionContext exe_ctx;
Sean Callanan0bf0baf2013-01-12 02:04:23 +00001972
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001973 if (frame)
1974 {
1975 frame->CalculateExecutionContext(exe_ctx);
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001976 }
1977 else if (m_process_sp)
1978 {
1979 m_process_sp->CalculateExecutionContext(exe_ctx);
1980 }
1981 else
1982 {
1983 CalculateExecutionContext(exe_ctx);
1984 }
1985
Sean Callanan0bf0baf2013-01-12 02:04:23 +00001986 // Make sure we aren't just trying to see the value of a persistent
1987 // variable (something like "$0")
1988 lldb::ClangExpressionVariableSP persistent_var_sp;
1989 // Only check for persistent variables the expression starts with a '$'
1990 if (expr_cstr[0] == '$')
Zachary Turner32abc6e2015-03-03 19:23:09 +00001991 persistent_var_sp = m_persistent_variables->GetVariable (expr_cstr);
Sean Callanan0bf0baf2013-01-12 02:04:23 +00001992
1993 if (persistent_var_sp)
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001994 {
Sean Callanan0bf0baf2013-01-12 02:04:23 +00001995 result_valobj_sp = persistent_var_sp->GetValueObject ();
Jim Ingham8646d3c2014-05-05 02:47:44 +00001996 execution_results = eExpressionCompleted;
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001997 }
1998 else
1999 {
Sean Callanan0bf0baf2013-01-12 02:04:23 +00002000 const char *prefix = GetExpressionPrefixContentsAsCString();
Greg Clayton62afb9f2013-11-04 19:35:17 +00002001 Error error;
Sean Callanan0bf0baf2013-01-12 02:04:23 +00002002 execution_results = ClangUserExpression::Evaluate (exe_ctx,
Greg Clayton62afb9f2013-11-04 19:35:17 +00002003 options,
2004 expr_cstr,
Sean Callanan0bf0baf2013-01-12 02:04:23 +00002005 prefix,
2006 result_valobj_sp,
Greg Clayton62afb9f2013-11-04 19:35:17 +00002007 error);
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00002008 }
Jim Ingham6026ca32011-05-12 02:06:14 +00002009
2010 m_suppress_stop_hooks = old_suppress_value;
2011
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00002012 return execution_results;
2013}
2014
Zachary Turner32abc6e2015-03-03 19:23:09 +00002015ClangPersistentVariables &
2016Target::GetPersistentVariables()
2017{
2018 return *m_persistent_variables;
2019}
2020
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002021lldb::addr_t
2022Target::GetCallableLoadAddress (lldb::addr_t load_addr, AddressClass addr_class) const
2023{
2024 addr_t code_addr = load_addr;
2025 switch (m_arch.GetMachine())
2026 {
2027 case llvm::Triple::arm:
2028 case llvm::Triple::thumb:
2029 switch (addr_class)
2030 {
2031 case eAddressClassData:
2032 case eAddressClassDebug:
2033 return LLDB_INVALID_ADDRESS;
2034
2035 case eAddressClassUnknown:
2036 case eAddressClassInvalid:
2037 case eAddressClassCode:
2038 case eAddressClassCodeAlternateISA:
2039 case eAddressClassRuntime:
2040 // Check if bit zero it no set?
2041 if ((code_addr & 1ull) == 0)
2042 {
2043 // Bit zero isn't set, check if the address is a multiple of 2?
2044 if (code_addr & 2ull)
2045 {
2046 // The address is a multiple of 2 so it must be thumb, set bit zero
2047 code_addr |= 1ull;
2048 }
2049 else if (addr_class == eAddressClassCodeAlternateISA)
2050 {
2051 // We checked the address and the address claims to be the alternate ISA
2052 // which means thumb, so set bit zero.
2053 code_addr |= 1ull;
2054 }
2055 }
2056 break;
2057 }
2058 break;
2059
2060 default:
2061 break;
2062 }
2063 return code_addr;
2064}
2065
2066lldb::addr_t
2067Target::GetOpcodeLoadAddress (lldb::addr_t load_addr, AddressClass addr_class) const
2068{
2069 addr_t opcode_addr = load_addr;
2070 switch (m_arch.GetMachine())
2071 {
2072 case llvm::Triple::arm:
2073 case llvm::Triple::thumb:
2074 switch (addr_class)
2075 {
2076 case eAddressClassData:
2077 case eAddressClassDebug:
2078 return LLDB_INVALID_ADDRESS;
2079
2080 case eAddressClassInvalid:
2081 case eAddressClassUnknown:
2082 case eAddressClassCode:
2083 case eAddressClassCodeAlternateISA:
2084 case eAddressClassRuntime:
2085 opcode_addr &= ~(1ull);
2086 break;
2087 }
2088 break;
2089
2090 default:
2091 break;
2092 }
2093 return opcode_addr;
2094}
2095
Greg Clayton9585fbf2013-03-19 00:20:55 +00002096SourceManager &
2097Target::GetSourceManager ()
2098{
2099 if (m_source_manager_ap.get() == NULL)
2100 m_source_manager_ap.reset (new SourceManager(shared_from_this()));
2101 return *m_source_manager_ap;
2102}
2103
Sean Callanan9998acd2014-12-05 01:21:59 +00002104ClangModulesDeclVendor *
2105Target::GetClangModulesDeclVendor ()
2106{
2107 static Mutex s_clang_modules_decl_vendor_mutex; // If this is contended we can make it per-target
2108
2109 {
2110 Mutex::Locker clang_modules_decl_vendor_locker(s_clang_modules_decl_vendor_mutex);
2111
2112 if (!m_clang_modules_decl_vendor_ap)
2113 {
2114 m_clang_modules_decl_vendor_ap.reset(ClangModulesDeclVendor::Create(*this));
2115 }
2116 }
2117
2118 return m_clang_modules_decl_vendor_ap.get();
2119}
Greg Clayton9585fbf2013-03-19 00:20:55 +00002120
Greg Clayton44d93782014-01-27 23:43:24 +00002121Target::StopHookSP
2122Target::CreateStopHook ()
Jim Ingham9575d842011-03-11 03:53:59 +00002123{
2124 lldb::user_id_t new_uid = ++m_stop_hook_next_id;
Greg Clayton44d93782014-01-27 23:43:24 +00002125 Target::StopHookSP stop_hook_sp (new StopHook(shared_from_this(), new_uid));
2126 m_stop_hooks[new_uid] = stop_hook_sp;
2127 return stop_hook_sp;
Jim Ingham9575d842011-03-11 03:53:59 +00002128}
2129
2130bool
2131Target::RemoveStopHookByID (lldb::user_id_t user_id)
2132{
2133 size_t num_removed;
2134 num_removed = m_stop_hooks.erase (user_id);
2135 if (num_removed == 0)
2136 return false;
2137 else
2138 return true;
2139}
2140
2141void
2142Target::RemoveAllStopHooks ()
2143{
2144 m_stop_hooks.clear();
2145}
2146
2147Target::StopHookSP
2148Target::GetStopHookByID (lldb::user_id_t user_id)
2149{
2150 StopHookSP found_hook;
2151
2152 StopHookCollection::iterator specified_hook_iter;
2153 specified_hook_iter = m_stop_hooks.find (user_id);
2154 if (specified_hook_iter != m_stop_hooks.end())
2155 found_hook = (*specified_hook_iter).second;
2156 return found_hook;
2157}
2158
2159bool
2160Target::SetStopHookActiveStateByID (lldb::user_id_t user_id, bool active_state)
2161{
2162 StopHookCollection::iterator specified_hook_iter;
2163 specified_hook_iter = m_stop_hooks.find (user_id);
2164 if (specified_hook_iter == m_stop_hooks.end())
2165 return false;
2166
2167 (*specified_hook_iter).second->SetIsActive (active_state);
2168 return true;
2169}
2170
2171void
2172Target::SetAllStopHooksActiveState (bool active_state)
2173{
2174 StopHookCollection::iterator pos, end = m_stop_hooks.end();
2175 for (pos = m_stop_hooks.begin(); pos != end; pos++)
2176 {
2177 (*pos).second->SetIsActive (active_state);
2178 }
2179}
2180
2181void
2182Target::RunStopHooks ()
2183{
Jim Ingham6026ca32011-05-12 02:06:14 +00002184 if (m_suppress_stop_hooks)
2185 return;
2186
Jim Ingham9575d842011-03-11 03:53:59 +00002187 if (!m_process_sp)
2188 return;
Enrico Granatae2e091b2012-08-03 22:24:48 +00002189
2190 // <rdar://problem/12027563> make sure we check that we are not stopped because of us running a user expression
2191 // since in that case we do not want to run the stop-hooks
2192 if (m_process_sp->GetModIDRef().IsLastResumeForUserExpression())
2193 return;
2194
Jim Ingham9575d842011-03-11 03:53:59 +00002195 if (m_stop_hooks.empty())
2196 return;
2197
2198 StopHookCollection::iterator pos, end = m_stop_hooks.end();
2199
2200 // If there aren't any active stop hooks, don't bother either:
2201 bool any_active_hooks = false;
2202 for (pos = m_stop_hooks.begin(); pos != end; pos++)
2203 {
2204 if ((*pos).second->IsActive())
2205 {
2206 any_active_hooks = true;
2207 break;
2208 }
2209 }
2210 if (!any_active_hooks)
2211 return;
2212
2213 CommandReturnObject result;
2214
2215 std::vector<ExecutionContext> exc_ctx_with_reasons;
2216 std::vector<SymbolContext> sym_ctx_with_reasons;
2217
2218 ThreadList &cur_threadlist = m_process_sp->GetThreadList();
2219 size_t num_threads = cur_threadlist.GetSize();
2220 for (size_t i = 0; i < num_threads; i++)
2221 {
2222 lldb::ThreadSP cur_thread_sp = cur_threadlist.GetThreadAtIndex (i);
2223 if (cur_thread_sp->ThreadStoppedForAReason())
2224 {
Jason Molendab57e4a12013-11-04 09:33:30 +00002225 lldb::StackFrameSP cur_frame_sp = cur_thread_sp->GetStackFrameAtIndex(0);
Jim Ingham9575d842011-03-11 03:53:59 +00002226 exc_ctx_with_reasons.push_back(ExecutionContext(m_process_sp.get(), cur_thread_sp.get(), cur_frame_sp.get()));
2227 sym_ctx_with_reasons.push_back(cur_frame_sp->GetSymbolContext(eSymbolContextEverything));
2228 }
2229 }
2230
2231 // If no threads stopped for a reason, don't run the stop-hooks.
2232 size_t num_exe_ctx = exc_ctx_with_reasons.size();
2233 if (num_exe_ctx == 0)
2234 return;
2235
Jim Ingham5b52f0c2011-06-02 23:58:26 +00002236 result.SetImmediateOutputStream (m_debugger.GetAsyncOutputStream());
2237 result.SetImmediateErrorStream (m_debugger.GetAsyncErrorStream());
Jim Ingham9575d842011-03-11 03:53:59 +00002238
2239 bool keep_going = true;
2240 bool hooks_ran = false;
Jim Ingham381e25b2011-03-22 01:47:27 +00002241 bool print_hook_header;
2242 bool print_thread_header;
2243
2244 if (num_exe_ctx == 1)
2245 print_thread_header = false;
2246 else
2247 print_thread_header = true;
2248
2249 if (m_stop_hooks.size() == 1)
2250 print_hook_header = false;
2251 else
2252 print_hook_header = true;
2253
Jim Ingham9575d842011-03-11 03:53:59 +00002254 for (pos = m_stop_hooks.begin(); keep_going && pos != end; pos++)
2255 {
2256 // result.Clear();
2257 StopHookSP cur_hook_sp = (*pos).second;
2258 if (!cur_hook_sp->IsActive())
2259 continue;
2260
2261 bool any_thread_matched = false;
2262 for (size_t i = 0; keep_going && i < num_exe_ctx; i++)
2263 {
2264 if ((cur_hook_sp->GetSpecifier () == NULL
2265 || cur_hook_sp->GetSpecifier()->SymbolContextMatches(sym_ctx_with_reasons[i]))
2266 && (cur_hook_sp->GetThreadSpecifier() == NULL
Jim Ingham3d902922012-03-07 22:03:04 +00002267 || cur_hook_sp->GetThreadSpecifier()->ThreadPassesBasicTests(exc_ctx_with_reasons[i].GetThreadRef())))
Jim Ingham9575d842011-03-11 03:53:59 +00002268 {
2269 if (!hooks_ran)
2270 {
Jim Ingham9575d842011-03-11 03:53:59 +00002271 hooks_ran = true;
2272 }
Jim Ingham381e25b2011-03-22 01:47:27 +00002273 if (print_hook_header && !any_thread_matched)
Jim Ingham9575d842011-03-11 03:53:59 +00002274 {
Johnny Chenaeab25c2011-10-24 23:01:06 +00002275 const char *cmd = (cur_hook_sp->GetCommands().GetSize() == 1 ?
2276 cur_hook_sp->GetCommands().GetStringAtIndex(0) :
2277 NULL);
2278 if (cmd)
Daniel Malead01b2952012-11-29 21:49:15 +00002279 result.AppendMessageWithFormat("\n- Hook %" PRIu64 " (%s)\n", cur_hook_sp->GetID(), cmd);
Johnny Chenaeab25c2011-10-24 23:01:06 +00002280 else
Daniel Malead01b2952012-11-29 21:49:15 +00002281 result.AppendMessageWithFormat("\n- Hook %" PRIu64 "\n", cur_hook_sp->GetID());
Jim Ingham9575d842011-03-11 03:53:59 +00002282 any_thread_matched = true;
2283 }
2284
Jim Ingham381e25b2011-03-22 01:47:27 +00002285 if (print_thread_header)
Greg Claytonc14ee322011-09-22 04:58:26 +00002286 result.AppendMessageWithFormat("-- Thread %d\n", exc_ctx_with_reasons[i].GetThreadPtr()->GetIndexID());
Jim Ingham26c7bf92014-10-11 00:38:27 +00002287
2288 CommandInterpreterRunOptions options;
2289 options.SetStopOnContinue (true);
2290 options.SetStopOnError (true);
2291 options.SetEchoCommands (false);
2292 options.SetPrintResults (true);
2293 options.SetAddToHistory (false);
2294
2295 GetDebugger().GetCommandInterpreter().HandleCommands (cur_hook_sp->GetCommands(),
2296 &exc_ctx_with_reasons[i],
2297 options,
Greg Clayton32e0a752011-03-30 18:16:51 +00002298 result);
Jim Ingham9575d842011-03-11 03:53:59 +00002299
2300 // If the command started the target going again, we should bag out of
2301 // running the stop hooks.
Greg Clayton32e0a752011-03-30 18:16:51 +00002302 if ((result.GetStatus() == eReturnStatusSuccessContinuingNoResult) ||
2303 (result.GetStatus() == eReturnStatusSuccessContinuingResult))
Jim Ingham9575d842011-03-11 03:53:59 +00002304 {
Daniel Malead01b2952012-11-29 21:49:15 +00002305 result.AppendMessageWithFormat ("Aborting stop hooks, hook %" PRIu64 " set the program running.", cur_hook_sp->GetID());
Jim Ingham9575d842011-03-11 03:53:59 +00002306 keep_going = false;
2307 }
2308 }
2309 }
2310 }
Jason Molenda879cf772011-09-23 00:42:55 +00002311
Caroline Tice969ed3d2011-05-02 20:41:46 +00002312 result.GetImmediateOutputStream()->Flush();
2313 result.GetImmediateErrorStream()->Flush();
Jim Ingham9575d842011-03-11 03:53:59 +00002314}
2315
Greg Claytonfbb76342013-11-20 21:07:01 +00002316const TargetPropertiesSP &
2317Target::GetGlobalProperties()
2318{
2319 static TargetPropertiesSP g_settings_sp;
2320 if (!g_settings_sp)
2321 {
2322 g_settings_sp.reset (new TargetProperties (NULL));
2323 }
2324 return g_settings_sp;
2325}
2326
2327Error
2328Target::Install (ProcessLaunchInfo *launch_info)
2329{
2330 Error error;
2331 PlatformSP platform_sp (GetPlatform());
2332 if (platform_sp)
2333 {
2334 if (platform_sp->IsRemote())
2335 {
2336 if (platform_sp->IsConnected())
2337 {
2338 // Install all files that have an install path, and always install the
2339 // main executable when connected to a remote platform
2340 const ModuleList& modules = GetImages();
2341 const size_t num_images = modules.GetSize();
2342 for (size_t idx = 0; idx < num_images; ++idx)
2343 {
2344 const bool is_main_executable = idx == 0;
2345 ModuleSP module_sp(modules.GetModuleAtIndex(idx));
2346 if (module_sp)
2347 {
2348 FileSpec local_file (module_sp->GetFileSpec());
2349 if (local_file)
2350 {
2351 FileSpec remote_file (module_sp->GetRemoteInstallFileSpec());
2352 if (!remote_file)
2353 {
2354 if (is_main_executable) // TODO: add setting for always installing main executable???
2355 {
2356 // Always install the main executable
2357 remote_file.GetDirectory() = platform_sp->GetWorkingDirectory();
2358 remote_file.GetFilename() = module_sp->GetFileSpec().GetFilename();
2359 }
2360 }
2361 if (remote_file)
2362 {
2363 error = platform_sp->Install(local_file, remote_file);
2364 if (error.Success())
2365 {
2366 module_sp->SetPlatformFileSpec(remote_file);
2367 if (is_main_executable)
2368 {
2369 if (launch_info)
2370 launch_info->SetExecutableFile(remote_file, false);
2371 }
2372 }
2373 else
2374 break;
2375 }
2376 }
2377 }
2378 }
2379 }
2380 }
2381 }
2382 return error;
2383}
Greg Clayton7b242382011-07-08 00:48:09 +00002384
Greg Claytond5944cd2013-12-06 01:12:00 +00002385bool
2386Target::ResolveLoadAddress (addr_t load_addr, Address &so_addr, uint32_t stop_id)
2387{
2388 return m_section_load_history.ResolveLoadAddress(stop_id, load_addr, so_addr);
2389}
2390
2391bool
Matthew Gardinerc928de32014-10-22 07:22:56 +00002392Target::ResolveFileAddress (lldb::addr_t file_addr, Address &resolved_addr)
2393{
2394 return m_images.ResolveFileAddress(file_addr, resolved_addr);
2395}
2396
2397bool
Greg Claytond5944cd2013-12-06 01:12:00 +00002398Target::SetSectionLoadAddress (const SectionSP &section_sp, addr_t new_section_load_addr, bool warn_multiple)
2399{
2400 const addr_t old_section_load_addr = m_section_load_history.GetSectionLoadAddress (SectionLoadHistory::eStopIDNow, section_sp);
2401 if (old_section_load_addr != new_section_load_addr)
2402 {
2403 uint32_t stop_id = 0;
2404 ProcessSP process_sp(GetProcessSP());
2405 if (process_sp)
2406 stop_id = process_sp->GetStopID();
2407 else
2408 stop_id = m_section_load_history.GetLastStopID();
2409 if (m_section_load_history.SetSectionLoadAddress (stop_id, section_sp, new_section_load_addr, warn_multiple))
2410 return true; // Return true if the section load address was changed...
2411 }
2412 return false; // Return false to indicate nothing changed
2413
2414}
2415
Greg Clayton8012cad2014-11-17 19:39:20 +00002416size_t
2417Target::UnloadModuleSections (const ModuleList &module_list)
2418{
2419 size_t section_unload_count = 0;
2420 size_t num_modules = module_list.GetSize();
2421 for (size_t i=0; i<num_modules; ++i)
2422 {
2423 section_unload_count += UnloadModuleSections (module_list.GetModuleAtIndex(i));
2424 }
2425 return section_unload_count;
2426}
2427
2428size_t
2429Target::UnloadModuleSections (const lldb::ModuleSP &module_sp)
2430{
2431 uint32_t stop_id = 0;
2432 ProcessSP process_sp(GetProcessSP());
2433 if (process_sp)
2434 stop_id = process_sp->GetStopID();
2435 else
2436 stop_id = m_section_load_history.GetLastStopID();
2437 SectionList *sections = module_sp->GetSectionList();
2438 size_t section_unload_count = 0;
2439 if (sections)
2440 {
2441 const uint32_t num_sections = sections->GetNumSections(0);
2442 for (uint32_t i = 0; i < num_sections; ++i)
2443 {
2444 section_unload_count += m_section_load_history.SetSectionUnloaded(stop_id, sections->GetSectionAtIndex(i));
2445 }
2446 }
2447 return section_unload_count;
2448}
2449
Greg Claytond5944cd2013-12-06 01:12:00 +00002450bool
2451Target::SetSectionUnloaded (const lldb::SectionSP &section_sp)
2452{
2453 uint32_t stop_id = 0;
2454 ProcessSP process_sp(GetProcessSP());
2455 if (process_sp)
2456 stop_id = process_sp->GetStopID();
2457 else
2458 stop_id = m_section_load_history.GetLastStopID();
2459 return m_section_load_history.SetSectionUnloaded (stop_id, section_sp);
2460}
2461
2462bool
2463Target::SetSectionUnloaded (const lldb::SectionSP &section_sp, addr_t load_addr)
2464{
2465 uint32_t stop_id = 0;
2466 ProcessSP process_sp(GetProcessSP());
2467 if (process_sp)
2468 stop_id = process_sp->GetStopID();
2469 else
2470 stop_id = m_section_load_history.GetLastStopID();
2471 return m_section_load_history.SetSectionUnloaded (stop_id, section_sp, load_addr);
2472}
2473
2474void
2475Target::ClearAllLoadedSections ()
2476{
2477 m_section_load_history.Clear();
2478}
2479
Greg Claytonb09c5382013-12-13 17:20:18 +00002480
2481Error
Greg Clayton8012cad2014-11-17 19:39:20 +00002482Target::Launch (ProcessLaunchInfo &launch_info, Stream *stream)
Greg Claytonb09c5382013-12-13 17:20:18 +00002483{
2484 Error error;
Todd Fialaac33cc92014-10-09 01:02:08 +00002485 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TARGET));
2486
2487 if (log)
2488 log->Printf ("Target::%s() called for %s", __FUNCTION__, launch_info.GetExecutableFile().GetPath().c_str ());
2489
Greg Claytonb09c5382013-12-13 17:20:18 +00002490 StateType state = eStateInvalid;
2491
Greg Clayton6b32f1e2013-12-18 02:06:45 +00002492 // Scope to temporarily get the process state in case someone has manually
2493 // remotely connected already to a process and we can skip the platform
2494 // launching.
2495 {
2496 ProcessSP process_sp (GetProcessSP());
2497
2498 if (process_sp)
Todd Fialaac33cc92014-10-09 01:02:08 +00002499 {
Greg Clayton6b32f1e2013-12-18 02:06:45 +00002500 state = process_sp->GetState();
Todd Fialaac33cc92014-10-09 01:02:08 +00002501 if (log)
2502 log->Printf ("Target::%s the process exists, and its current state is %s", __FUNCTION__, StateAsCString (state));
2503 }
2504 else
2505 {
2506 if (log)
2507 log->Printf ("Target::%s the process instance doesn't currently exist.", __FUNCTION__);
2508 }
Greg Clayton6b32f1e2013-12-18 02:06:45 +00002509 }
2510
Greg Claytonb09c5382013-12-13 17:20:18 +00002511 launch_info.GetFlags().Set (eLaunchFlagDebug);
2512
2513 // Get the value of synchronous execution here. If you wait till after you have started to
2514 // run, then you could have hit a breakpoint, whose command might switch the value, and
2515 // then you'll pick up that incorrect value.
2516 Debugger &debugger = GetDebugger();
2517 const bool synchronous_execution = debugger.GetCommandInterpreter().GetSynchronous ();
2518
2519 PlatformSP platform_sp (GetPlatform());
2520
2521 // Finalize the file actions, and if none were given, default to opening
2522 // up a pseudo terminal
2523 const bool default_to_use_pty = platform_sp ? platform_sp->IsHost() : false;
Todd Fiala75f47c32014-10-11 21:42:09 +00002524 if (log)
2525 log->Printf ("Target::%s have platform=%s, platform_sp->IsHost()=%s, default_to_use_pty=%s",
2526 __FUNCTION__,
2527 platform_sp ? "true" : "false",
2528 platform_sp ? (platform_sp->IsHost () ? "true" : "false") : "n/a",
2529 default_to_use_pty ? "true" : "false");
2530
Greg Claytonb09c5382013-12-13 17:20:18 +00002531 launch_info.FinalizeFileActions (this, default_to_use_pty);
2532
2533 if (state == eStateConnected)
2534 {
2535 if (launch_info.GetFlags().Test (eLaunchFlagLaunchInTTY))
2536 {
2537 error.SetErrorString("can't launch in tty when launching through a remote connection");
2538 return error;
2539 }
2540 }
2541
2542 if (!launch_info.GetArchitecture().IsValid())
2543 launch_info.GetArchitecture() = GetArchitecture();
Todd Fiala015d8182014-07-22 23:41:36 +00002544
2545 // If we're not already connected to the process, and if we have a platform that can launch a process for debugging, go ahead and do that here.
Greg Claytonb09c5382013-12-13 17:20:18 +00002546 if (state != eStateConnected && platform_sp && platform_sp->CanDebugProcess ())
2547 {
Todd Fialaac33cc92014-10-09 01:02:08 +00002548 if (log)
2549 log->Printf ("Target::%s asking the platform to debug the process", __FUNCTION__);
2550
Greg Claytonb09c5382013-12-13 17:20:18 +00002551 m_process_sp = GetPlatform()->DebugProcess (launch_info,
2552 debugger,
2553 this,
Greg Claytonb09c5382013-12-13 17:20:18 +00002554 error);
2555 }
2556 else
2557 {
Todd Fialaac33cc92014-10-09 01:02:08 +00002558 if (log)
2559 log->Printf ("Target::%s the platform doesn't know how to debug a process, getting a process plugin to do this for us.", __FUNCTION__);
2560
Greg Claytonb09c5382013-12-13 17:20:18 +00002561 if (state == eStateConnected)
2562 {
2563 assert(m_process_sp);
2564 }
2565 else
2566 {
Todd Fiala015d8182014-07-22 23:41:36 +00002567 // Use a Process plugin to construct the process.
Greg Claytonb09c5382013-12-13 17:20:18 +00002568 const char *plugin_name = launch_info.GetProcessPluginName();
Greg Clayton8012cad2014-11-17 19:39:20 +00002569 CreateProcess (launch_info.GetListenerForProcess(debugger), plugin_name, NULL);
Greg Claytonb09c5382013-12-13 17:20:18 +00002570 }
Todd Fiala015d8182014-07-22 23:41:36 +00002571
2572 // Since we didn't have a platform launch the process, launch it here.
Greg Claytonb09c5382013-12-13 17:20:18 +00002573 if (m_process_sp)
2574 error = m_process_sp->Launch (launch_info);
2575 }
2576
2577 if (!m_process_sp)
2578 {
2579 if (error.Success())
2580 error.SetErrorString("failed to launch or debug process");
2581 return error;
2582 }
2583
2584 if (error.Success())
2585 {
Ilia K064e69f2015-03-23 21:16:25 +00002586 if (synchronous_execution || launch_info.GetFlags().Test(eLaunchFlagStopAtEntry) == false)
Greg Claytonb09c5382013-12-13 17:20:18 +00002587 {
Ilia K064e69f2015-03-23 21:16:25 +00002588 EventSP event_sp;
Greg Clayton44d93782014-01-27 23:43:24 +00002589 ListenerSP hijack_listener_sp (launch_info.GetHijackListener());
Zachary Turnere6d213a2015-03-26 20:41:14 +00002590 if (!hijack_listener_sp)
2591 {
2592 hijack_listener_sp.reset(new Listener("lldb.Target.Launch.hijack"));
2593 launch_info.SetHijackListener(hijack_listener_sp);
2594 m_process_sp->HijackProcessEvents(hijack_listener_sp.get());
2595 }
Todd Fialaac33cc92014-10-09 01:02:08 +00002596
Ilia K064e69f2015-03-23 21:16:25 +00002597 StateType state = m_process_sp->WaitForProcessToStop (NULL, &event_sp, false, hijack_listener_sp.get(), NULL);
Greg Claytonb09c5382013-12-13 17:20:18 +00002598
2599 if (state == eStateStopped)
2600 {
Zachary Turnere6d213a2015-03-26 20:41:14 +00002601 if (!launch_info.GetFlags().Test(eLaunchFlagStopAtEntry))
Greg Claytonb09c5382013-12-13 17:20:18 +00002602 {
Zachary Turnere6d213a2015-03-26 20:41:14 +00002603 if (synchronous_execution)
Greg Claytonb09c5382013-12-13 17:20:18 +00002604 {
Zachary Turnere6d213a2015-03-26 20:41:14 +00002605 error = m_process_sp->PrivateResume();
2606 if (error.Success())
Greg Claytonb09c5382013-12-13 17:20:18 +00002607 {
Ilia K064e69f2015-03-23 21:16:25 +00002608 state = m_process_sp->WaitForProcessToStop (NULL, NULL, true, hijack_listener_sp.get(), stream);
2609 const bool must_be_alive = false; // eStateExited is ok, so this must be false
2610 if (!StateIsStoppedState(state, must_be_alive))
2611 {
2612 error.SetErrorStringWithFormat("process isn't stopped: %s", StateAsCString(state));
2613 }
Greg Claytonb09c5382013-12-13 17:20:18 +00002614 }
2615 }
Ilia K064e69f2015-03-23 21:16:25 +00002616 else
2617 {
Zachary Turnere6d213a2015-03-26 20:41:14 +00002618 m_process_sp->RestoreProcessEvents();
2619 error = m_process_sp->PrivateResume();
2620 if (error.Success())
2621 {
2622 // there is a race condition where this thread will return up the call stack to the main command
2623 // handler and show an (lldb) prompt before HandlePrivateEvent (from PrivateStateThread) has
2624 // a chance to call PushProcessIOHandler()
2625 m_process_sp->SyncIOHandler(2000);
2626 }
2627 }
2628 if (!error.Success())
2629 {
Ilia K064e69f2015-03-23 21:16:25 +00002630 Error error2;
2631 error2.SetErrorStringWithFormat("process resume at entry point failed: %s", error.AsCString());
2632 error = error2;
2633 }
Greg Claytonb09c5382013-12-13 17:20:18 +00002634 }
2635 else
2636 {
Zachary Turnere6d213a2015-03-26 20:41:14 +00002637 assert(synchronous_execution && launch_info.GetFlags().Test(eLaunchFlagStopAtEntry));
Ilia K064e69f2015-03-23 21:16:25 +00002638
2639 // Target was stopped at entry as was intended. Need to notify the listeners about it.
2640 m_process_sp->RestoreProcessEvents();
2641 m_process_sp->HandlePrivateEvent(event_sp);
2642
2643 // there is a race condition where this thread will return up the call stack to the main command
2644 // handler and show an (lldb) prompt before HandlePrivateEvent (from PrivateStateThread) has
2645 // a chance to call PushProcessIOHandler()
2646 m_process_sp->SyncIOHandler(2000);
Greg Claytonb09c5382013-12-13 17:20:18 +00002647 }
2648 }
Greg Clayton40286e02014-04-30 20:29:09 +00002649 else if (state == eStateExited)
2650 {
Zachary Turner10687b02014-10-20 17:46:43 +00002651 bool with_shell = !!launch_info.GetShell();
Greg Clayton40286e02014-04-30 20:29:09 +00002652 const int exit_status = m_process_sp->GetExitStatus();
2653 const char *exit_desc = m_process_sp->GetExitDescription();
2654#define LAUNCH_SHELL_MESSAGE "\n'r' and 'run' are aliases that default to launching through a shell.\nTry launching without going through a shell by using 'process launch'."
2655 if (exit_desc && exit_desc[0])
2656 {
2657 if (with_shell)
2658 error.SetErrorStringWithFormat ("process exited with status %i (%s)" LAUNCH_SHELL_MESSAGE, exit_status, exit_desc);
2659 else
2660 error.SetErrorStringWithFormat ("process exited with status %i (%s)", exit_status, exit_desc);
2661 }
2662 else
2663 {
2664 if (with_shell)
2665 error.SetErrorStringWithFormat ("process exited with status %i" LAUNCH_SHELL_MESSAGE, exit_status);
2666 else
2667 error.SetErrorStringWithFormat ("process exited with status %i", exit_status);
2668 }
2669 }
Greg Claytonb09c5382013-12-13 17:20:18 +00002670 else
2671 {
2672 error.SetErrorStringWithFormat ("initial process state wasn't stopped: %s", StateAsCString(state));
2673 }
2674 }
Greg Clayton44d93782014-01-27 23:43:24 +00002675 m_process_sp->RestoreProcessEvents ();
Greg Claytonb09c5382013-12-13 17:20:18 +00002676 }
2677 else
2678 {
Greg Clayton44d93782014-01-27 23:43:24 +00002679 Error error2;
Greg Claytonb09c5382013-12-13 17:20:18 +00002680 error2.SetErrorStringWithFormat ("process launch failed: %s", error.AsCString());
Greg Clayton44d93782014-01-27 23:43:24 +00002681 error = error2;
Greg Claytonb09c5382013-12-13 17:20:18 +00002682 }
2683 return error;
2684}
Oleksiy Vyalov37386142015-02-10 22:49:57 +00002685
2686Error
2687Target::Attach (ProcessAttachInfo &attach_info, Stream *stream)
2688{
2689 auto state = eStateInvalid;
2690 auto process_sp = GetProcessSP ();
2691 if (process_sp)
2692 {
2693 state = process_sp->GetState ();
2694 if (process_sp->IsAlive () && state != eStateConnected)
2695 {
2696 if (state == eStateAttaching)
2697 return Error ("process attach is in progress");
2698 return Error ("a process is already being debugged");
2699 }
2700 }
2701
2702 ListenerSP hijack_listener_sp (new Listener ("lldb.Target.Attach.attach.hijack"));
2703 attach_info.SetHijackListener (hijack_listener_sp);
2704
2705 const ModuleSP old_exec_module_sp = GetExecutableModule ();
2706
2707 // If no process info was specified, then use the target executable
2708 // name as the process to attach to by default
2709 if (!attach_info.ProcessInfoSpecified ())
2710 {
2711 if (old_exec_module_sp)
2712 attach_info.GetExecutableFile ().GetFilename () = old_exec_module_sp->GetPlatformFileSpec ().GetFilename ();
2713
2714 if (!attach_info.ProcessInfoSpecified ())
2715 {
2716 return Error ("no process specified, create a target with a file, or specify the --pid or --name");
2717 }
2718 }
2719
2720 const auto platform_sp = GetDebugger ().GetPlatformList ().GetSelectedPlatform ();
2721
2722 Error error;
2723 if (state != eStateConnected && platform_sp != nullptr && platform_sp->CanDebugProcess ())
2724 {
2725 SetPlatform (platform_sp);
2726 process_sp = platform_sp->Attach (attach_info, GetDebugger (), this, error);
2727 }
2728 else
2729 {
2730 if (state != eStateConnected)
2731 {
2732 const char *plugin_name = attach_info.GetProcessPluginName ();
2733 process_sp = CreateProcess (attach_info.GetListenerForProcess (GetDebugger ()), plugin_name, nullptr);
2734 if (process_sp == nullptr)
2735 {
2736 error.SetErrorStringWithFormat ("failed to create process using plugin %s", (plugin_name) ? plugin_name : "null");
2737 return error;
2738 }
2739 }
2740 process_sp->HijackProcessEvents (hijack_listener_sp.get ());
2741 error = process_sp->Attach (attach_info);
2742 }
2743
2744 if (error.Success () && process_sp)
2745 {
2746 state = process_sp->WaitForProcessToStop (nullptr, nullptr, false, attach_info.GetHijackListener ().get (), stream);
2747 process_sp->RestoreProcessEvents ();
2748
2749 if (state != eStateStopped)
2750 {
2751 const char *exit_desc = process_sp->GetExitDescription ();
2752 if (exit_desc)
2753 error.SetErrorStringWithFormat ("attach failed: %s", exit_desc);
2754 else
2755 error.SetErrorString ("attach failed: process did not stop (no such process or permission problem?)");
Jason Molendaede31932015-04-17 05:01:58 +00002756 process_sp->Destroy (false);
Oleksiy Vyalov37386142015-02-10 22:49:57 +00002757 }
2758 }
2759 return error;
2760}
2761
Jim Ingham9575d842011-03-11 03:53:59 +00002762//--------------------------------------------------------------
Greg Claytonfbb76342013-11-20 21:07:01 +00002763// Target::StopHook
Jim Ingham9575d842011-03-11 03:53:59 +00002764//--------------------------------------------------------------
Jim Ingham9575d842011-03-11 03:53:59 +00002765Target::StopHook::StopHook (lldb::TargetSP target_sp, lldb::user_id_t uid) :
2766 UserID (uid),
2767 m_target_sp (target_sp),
Jim Ingham9575d842011-03-11 03:53:59 +00002768 m_commands (),
2769 m_specifier_sp (),
Greg Claytone01e07b2013-04-18 18:10:51 +00002770 m_thread_spec_ap(),
Stephen Wilson71c21d12011-04-11 19:41:40 +00002771 m_active (true)
Jim Ingham9575d842011-03-11 03:53:59 +00002772{
2773}
2774
2775Target::StopHook::StopHook (const StopHook &rhs) :
2776 UserID (rhs.GetID()),
2777 m_target_sp (rhs.m_target_sp),
2778 m_commands (rhs.m_commands),
2779 m_specifier_sp (rhs.m_specifier_sp),
Greg Claytone01e07b2013-04-18 18:10:51 +00002780 m_thread_spec_ap (),
Stephen Wilson71c21d12011-04-11 19:41:40 +00002781 m_active (rhs.m_active)
Jim Ingham9575d842011-03-11 03:53:59 +00002782{
2783 if (rhs.m_thread_spec_ap.get() != NULL)
2784 m_thread_spec_ap.reset (new ThreadSpec(*rhs.m_thread_spec_ap.get()));
2785}
2786
2787
2788Target::StopHook::~StopHook ()
2789{
2790}
2791
2792void
Zachary Turner32abc6e2015-03-03 19:23:09 +00002793Target::StopHook::SetSpecifier(SymbolContextSpecifier *specifier)
2794{
2795 m_specifier_sp.reset(specifier);
2796}
2797
2798void
Jim Ingham9575d842011-03-11 03:53:59 +00002799Target::StopHook::SetThreadSpecifier (ThreadSpec *specifier)
2800{
2801 m_thread_spec_ap.reset (specifier);
2802}
2803
2804
2805void
2806Target::StopHook::GetDescription (Stream *s, lldb::DescriptionLevel level) const
2807{
2808 int indent_level = s->GetIndentLevel();
2809
2810 s->SetIndentLevel(indent_level + 2);
2811
Daniel Malead01b2952012-11-29 21:49:15 +00002812 s->Printf ("Hook: %" PRIu64 "\n", GetID());
Jim Ingham9575d842011-03-11 03:53:59 +00002813 if (m_active)
2814 s->Indent ("State: enabled\n");
2815 else
2816 s->Indent ("State: disabled\n");
2817
2818 if (m_specifier_sp)
2819 {
2820 s->Indent();
2821 s->PutCString ("Specifier:\n");
2822 s->SetIndentLevel (indent_level + 4);
2823 m_specifier_sp->GetDescription (s, level);
2824 s->SetIndentLevel (indent_level + 2);
2825 }
2826
2827 if (m_thread_spec_ap.get() != NULL)
2828 {
2829 StreamString tmp;
2830 s->Indent("Thread:\n");
2831 m_thread_spec_ap->GetDescription (&tmp, level);
2832 s->SetIndentLevel (indent_level + 4);
2833 s->Indent (tmp.GetData());
2834 s->PutCString ("\n");
2835 s->SetIndentLevel (indent_level + 2);
2836 }
2837
2838 s->Indent ("Commands: \n");
2839 s->SetIndentLevel (indent_level + 4);
2840 uint32_t num_commands = m_commands.GetSize();
2841 for (uint32_t i = 0; i < num_commands; i++)
2842 {
2843 s->Indent(m_commands.GetStringAtIndex(i));
2844 s->PutCString ("\n");
2845 }
2846 s->SetIndentLevel (indent_level);
2847}
2848
Greg Clayton67cc0632012-08-22 17:17:09 +00002849//--------------------------------------------------------------
2850// class TargetProperties
2851//--------------------------------------------------------------
2852
2853OptionEnumValueElement
2854lldb_private::g_dynamic_value_types[] =
Caroline Ticedaccaa92010-09-20 20:44:43 +00002855{
Greg Clayton67cc0632012-08-22 17:17:09 +00002856 { eNoDynamicValues, "no-dynamic-values", "Don't calculate the dynamic type of values"},
2857 { eDynamicCanRunTarget, "run-target", "Calculate the dynamic type of values even if you have to run the target."},
2858 { eDynamicDontRunTarget, "no-run-target", "Calculate the dynamic type of values, but don't run the target."},
2859 { 0, NULL, NULL }
2860};
Caroline Ticedaccaa92010-09-20 20:44:43 +00002861
Greg Clayton1f746072012-08-29 21:13:06 +00002862static OptionEnumValueElement
2863g_inline_breakpoint_enums[] =
2864{
2865 { eInlineBreakpointsNever, "never", "Never look for inline breakpoint locations (fastest). This setting should only be used if you know that no inlining occurs in your programs."},
2866 { eInlineBreakpointsHeaders, "headers", "Only check for inline breakpoint locations when setting breakpoints in header files, but not when setting breakpoint in implementation source files (default)."},
2867 { eInlineBreakpointsAlways, "always", "Always look for inline breakpoint locations when setting file and line breakpoints (slower but most accurate)."},
2868 { 0, NULL, NULL }
2869};
2870
Jim Ingham0f063ba2013-03-02 00:26:47 +00002871typedef enum x86DisassemblyFlavor
2872{
2873 eX86DisFlavorDefault,
2874 eX86DisFlavorIntel,
2875 eX86DisFlavorATT
2876} x86DisassemblyFlavor;
2877
2878static OptionEnumValueElement
2879g_x86_dis_flavor_value_types[] =
2880{
2881 { eX86DisFlavorDefault, "default", "Disassembler default (currently att)."},
2882 { eX86DisFlavorIntel, "intel", "Intel disassembler flavor."},
2883 { eX86DisFlavorATT, "att", "AT&T disassembler flavor."},
2884 { 0, NULL, NULL }
2885};
2886
Enrico Granata397ddd52013-05-21 20:13:34 +00002887static OptionEnumValueElement
Daniel Malead79ae052013-08-07 21:54:09 +00002888g_hex_immediate_style_values[] =
2889{
2890 { Disassembler::eHexStyleC, "c", "C-style (0xffff)."},
2891 { Disassembler::eHexStyleAsm, "asm", "Asm-style (0ffffh)."},
2892 { 0, NULL, NULL }
2893};
2894
2895static OptionEnumValueElement
Enrico Granata397ddd52013-05-21 20:13:34 +00002896g_load_script_from_sym_file_values[] =
2897{
2898 { eLoadScriptFromSymFileTrue, "true", "Load debug scripts inside symbol files"},
2899 { eLoadScriptFromSymFileFalse, "false", "Do not load debug scripts inside symbol files."},
2900 { eLoadScriptFromSymFileWarn, "warn", "Warn about debug scripts inside symbol files but do not load them."},
2901 { 0, NULL, NULL }
2902};
2903
Greg Claytonfd814c52013-08-13 01:42:25 +00002904
2905static OptionEnumValueElement
2906g_memory_module_load_level_values[] =
2907{
Greg Clayton86eac942013-08-13 21:32:34 +00002908 { eMemoryModuleLoadLevelMinimal, "minimal" , "Load minimal information when loading modules from memory. Currently this setting loads sections only."},
Greg Claytonfd814c52013-08-13 01:42:25 +00002909 { eMemoryModuleLoadLevelPartial, "partial" , "Load partial information when loading modules from memory. Currently this setting loads sections and function bounds."},
2910 { eMemoryModuleLoadLevelComplete, "complete", "Load complete information when loading modules from memory. Currently this setting loads sections and all symbols."},
2911 { 0, NULL, NULL }
2912};
2913
Greg Clayton67cc0632012-08-22 17:17:09 +00002914static PropertyDefinition
2915g_properties[] =
Caroline Ticedaccaa92010-09-20 20:44:43 +00002916{
Greg Clayton67cc0632012-08-22 17:17:09 +00002917 { "default-arch" , OptionValue::eTypeArch , true , 0 , NULL, NULL, "Default architecture to choose, when there's a choice." },
2918 { "expr-prefix" , OptionValue::eTypeFileSpec , false, 0 , NULL, NULL, "Path to a file containing expressions to be prepended to all expressions." },
Enrico Granata9aa7e8e2015-01-09 00:47:24 +00002919 { "prefer-dynamic-value" , OptionValue::eTypeEnum , false, eDynamicDontRunTarget , NULL, g_dynamic_value_types, "Should printed values be shown as their dynamic value." },
Greg Clayton67cc0632012-08-22 17:17:09 +00002920 { "enable-synthetic-value" , OptionValue::eTypeBoolean , false, true , NULL, NULL, "Should synthetic values be used by default whenever available." },
2921 { "skip-prologue" , OptionValue::eTypeBoolean , false, true , NULL, NULL, "Skip function prologues when setting breakpoints by name." },
2922 { "source-map" , OptionValue::eTypePathMap , false, 0 , NULL, NULL, "Source path remappings used to track the change of location between a source file when built, and "
2923 "where it exists on the current system. It consists of an array of duples, the first element of each duple is "
2924 "some part (starting at the root) of the path to the file when it was built, "
2925 "and the second is where the remainder of the original build hierarchy is rooted on the local system. "
2926 "Each element of the array is checked in order and the first one that results in a match wins." },
2927 { "exec-search-paths" , OptionValue::eTypeFileSpecList, false, 0 , NULL, NULL, "Executable search paths to use when locating executable files whose paths don't match the local file system." },
Michael Sartaina7499c92013-07-01 19:45:50 +00002928 { "debug-file-search-paths" , OptionValue::eTypeFileSpecList, false, 0 , NULL, NULL, "List of directories to be searched when locating debug symbol files." },
Sean Callanan85054342015-04-03 15:39:47 +00002929 { "clang-module-search-paths" , OptionValue::eTypeFileSpecList, false, 0 , NULL, NULL, "List of directories to be searched when locating modules for Clang." },
Sean Callananf0c5aeb2015-04-20 16:31:29 +00002930 { "auto-import-clang-modules" , OptionValue::eTypeBoolean , false, false , NULL, NULL, "Automatically load Clang modules referred to by the program." },
Greg Clayton67cc0632012-08-22 17:17:09 +00002931 { "max-children-count" , OptionValue::eTypeSInt64 , false, 256 , NULL, NULL, "Maximum number of children to expand in any level of depth." },
2932 { "max-string-summary-length" , OptionValue::eTypeSInt64 , false, 1024 , NULL, NULL, "Maximum number of characters to show when using %s in summary strings." },
Enrico Granatad325bf92013-06-04 22:54:16 +00002933 { "max-memory-read-size" , OptionValue::eTypeSInt64 , false, 1024 , NULL, NULL, "Maximum number of bytes that 'memory read' will fetch before --force must be specified." },
Greg Clayton67cc0632012-08-22 17:17:09 +00002934 { "breakpoints-use-platform-avoid-list", OptionValue::eTypeBoolean , false, true , NULL, NULL, "Consult the platform module avoid list when setting non-module specific breakpoints." },
Greg Clayton45392552012-10-17 22:57:12 +00002935 { "arg0" , OptionValue::eTypeString , false, 0 , NULL, NULL, "The first argument passed to the program in the argument array which can be different from the executable itself." },
2936 { "run-args" , OptionValue::eTypeArgs , false, 0 , NULL, NULL, "A list containing all the arguments to be passed to the executable when it is run. Note that this does NOT include the argv[0] which is in target.arg0." },
Greg Clayton67cc0632012-08-22 17:17:09 +00002937 { "env-vars" , OptionValue::eTypeDictionary, false, OptionValue::eTypeString , NULL, NULL, "A list of all the environment variables to be passed to the executable's environment, and their values." },
2938 { "inherit-env" , OptionValue::eTypeBoolean , false, true , NULL, NULL, "Inherit the environment from the process that is running LLDB." },
2939 { "input-path" , OptionValue::eTypeFileSpec , false, 0 , NULL, NULL, "The file/path to be used by the executable program for reading its standard input." },
2940 { "output-path" , OptionValue::eTypeFileSpec , false, 0 , NULL, NULL, "The file/path to be used by the executable program for writing its standard output." },
2941 { "error-path" , OptionValue::eTypeFileSpec , false, 0 , NULL, NULL, "The file/path to be used by the executable program for writing its standard error." },
Jim Ingham106d0282014-06-25 02:32:56 +00002942 { "detach-on-error" , OptionValue::eTypeBoolean , false, true , NULL, NULL, "debugserver will detach (rather than killing) a process if it loses connection with lldb." },
Greg Clayton67cc0632012-08-22 17:17:09 +00002943 { "disable-aslr" , OptionValue::eTypeBoolean , false, true , NULL, NULL, "Disable Address Space Layout Randomization (ASLR)" },
2944 { "disable-stdio" , OptionValue::eTypeBoolean , false, false , NULL, NULL, "Disable stdin/stdout for process (e.g. for a GUI application)" },
Todd Fialaad6eee62014-09-24 19:59:13 +00002945 { "inline-breakpoint-strategy" , OptionValue::eTypeEnum , false, eInlineBreakpointsAlways , NULL, g_inline_breakpoint_enums, "The strategy to use when settings breakpoints by file and line. "
Greg Clayton1f746072012-08-29 21:13:06 +00002946 "Breakpoint locations can end up being inlined by the compiler, so that a compile unit 'a.c' might contain an inlined function from another source file. "
2947 "Usually this is limitted to breakpoint locations from inlined functions from header or other include files, or more accurately non-implementation source files. "
2948 "Sometimes code might #include implementation files and cause inlined breakpoint locations in inlined implementation files. "
Todd Fialaad6eee62014-09-24 19:59:13 +00002949 "Always checking for inlined breakpoint locations can be expensive (memory and time), so if you have a project with many headers "
2950 "and find that setting breakpoints is slow, then you can change this setting to headers. "
2951 "This setting allows you to control exactly which strategy is used when setting "
Greg Clayton1f746072012-08-29 21:13:06 +00002952 "file and line breakpoints." },
Jim Ingham0f063ba2013-03-02 00:26:47 +00002953 // FIXME: This is the wrong way to do per-architecture settings, but we don't have a general per architecture settings system in place yet.
2954 { "x86-disassembly-flavor" , OptionValue::eTypeEnum , false, eX86DisFlavorDefault, NULL, g_x86_dis_flavor_value_types, "The default disassembly flavor to use for x86 or x86-64 targets." },
Daniel Malead79ae052013-08-07 21:54:09 +00002955 { "use-hex-immediates" , OptionValue::eTypeBoolean , false, true, NULL, NULL, "Show immediates in disassembly as hexadecimal." },
2956 { "hex-immediate-style" , OptionValue::eTypeEnum , false, Disassembler::eHexStyleC, NULL, g_hex_immediate_style_values, "Which style to use for printing hexadecimal disassembly values." },
Jim Ingham34951272013-04-04 01:38:54 +00002957 { "use-fast-stepping" , OptionValue::eTypeBoolean , false, true, NULL, NULL, "Use a fast stepping algorithm based on running from branch to branch rather than instruction single-stepping." },
Enrico Granata397ddd52013-05-21 20:13:34 +00002958 { "load-script-from-symbol-file" , OptionValue::eTypeEnum , false, eLoadScriptFromSymFileWarn, NULL, g_load_script_from_sym_file_values, "Allow LLDB to load scripting resources embedded in symbol files when available." },
Greg Clayton86eac942013-08-13 21:32:34 +00002959 { "memory-module-load-level" , OptionValue::eTypeEnum , false, eMemoryModuleLoadLevelComplete, NULL, g_memory_module_load_level_values,
2960 "Loading modules from memory can be slow as reading the symbol tables and other data can take a long time depending on your connection to the debug target. "
2961 "This setting helps users control how much information gets loaded when loading modules from memory."
2962 "'complete' is the default value for this setting which will load all sections and symbols by reading them from memory (slowest, most accurate). "
2963 "'partial' will load sections and attempt to find function bounds without downloading the symbol table (faster, still accurate, missing symbol names). "
2964 "'minimal' is the fastest setting and will load section data with no symbols, but should rarely be used as stack frames in these memory regions will be inaccurate and not provide any context (fastest). " },
Greg Claytonfb6621e2013-12-06 21:59:52 +00002965 { "display-expression-in-crashlogs" , OptionValue::eTypeBoolean , false, false, NULL, NULL, "Expressions that crash will show up in crash logs if the host system supports executable specific crash log strings and this setting is set to true." },
Jason Molendaa4bea722014-02-14 05:06:49 +00002966 { "trap-handler-names" , OptionValue::eTypeArray , true, OptionValue::eTypeString, NULL, NULL, "A list of trap handler function names, e.g. a common Unix user process one is _sigtramp." },
Enrico Granata560558e2015-02-11 02:35:39 +00002967 { "display-runtime-support-values" , OptionValue::eTypeBoolean , false, false, NULL, NULL, "If true, LLDB will show variables that are meant to support the operation of a language's runtime support." },
Greg Clayton67cc0632012-08-22 17:17:09 +00002968 { NULL , OptionValue::eTypeInvalid , false, 0 , NULL, NULL, NULL }
2969};
Enrico Granata560558e2015-02-11 02:35:39 +00002970
Greg Clayton67cc0632012-08-22 17:17:09 +00002971enum
Caroline Ticedaccaa92010-09-20 20:44:43 +00002972{
Greg Clayton67cc0632012-08-22 17:17:09 +00002973 ePropertyDefaultArch,
2974 ePropertyExprPrefix,
2975 ePropertyPreferDynamic,
2976 ePropertyEnableSynthetic,
2977 ePropertySkipPrologue,
2978 ePropertySourceMap,
2979 ePropertyExecutableSearchPaths,
Michael Sartaina7499c92013-07-01 19:45:50 +00002980 ePropertyDebugFileSearchPaths,
Sean Callanan85054342015-04-03 15:39:47 +00002981 ePropertyClangModuleSearchPaths,
Sean Callananf0c5aeb2015-04-20 16:31:29 +00002982 ePropertyAutoImportClangModules,
Greg Clayton67cc0632012-08-22 17:17:09 +00002983 ePropertyMaxChildrenCount,
2984 ePropertyMaxSummaryLength,
Enrico Granatad325bf92013-06-04 22:54:16 +00002985 ePropertyMaxMemReadSize,
Greg Clayton67cc0632012-08-22 17:17:09 +00002986 ePropertyBreakpointUseAvoidList,
Greg Clayton45392552012-10-17 22:57:12 +00002987 ePropertyArg0,
Greg Clayton67cc0632012-08-22 17:17:09 +00002988 ePropertyRunArgs,
2989 ePropertyEnvVars,
2990 ePropertyInheritEnv,
2991 ePropertyInputPath,
2992 ePropertyOutputPath,
2993 ePropertyErrorPath,
Jim Ingham106d0282014-06-25 02:32:56 +00002994 ePropertyDetachOnError,
Greg Clayton67cc0632012-08-22 17:17:09 +00002995 ePropertyDisableASLR,
Greg Clayton1f746072012-08-29 21:13:06 +00002996 ePropertyDisableSTDIO,
Jim Ingham0f063ba2013-03-02 00:26:47 +00002997 ePropertyInlineStrategy,
Jim Ingham17d023f2013-03-13 17:58:04 +00002998 ePropertyDisassemblyFlavor,
Daniel Malead79ae052013-08-07 21:54:09 +00002999 ePropertyUseHexImmediates,
3000 ePropertyHexImmediateStyle,
Enrico Granata2ea43cd2013-05-13 17:03:52 +00003001 ePropertyUseFastStepping,
Enrico Granata97303392013-05-21 00:00:30 +00003002 ePropertyLoadScriptFromSymbolFile,
Greg Claytonfb6621e2013-12-06 21:59:52 +00003003 ePropertyMemoryModuleLoadLevel,
Jason Molendaa4bea722014-02-14 05:06:49 +00003004 ePropertyDisplayExpressionsInCrashlogs,
Enrico Granata560558e2015-02-11 02:35:39 +00003005 ePropertyTrapHandlerNames,
3006 ePropertyDisplayRuntimeSupportValues
Greg Clayton67cc0632012-08-22 17:17:09 +00003007};
Caroline Ticedaccaa92010-09-20 20:44:43 +00003008
Caroline Ticedaccaa92010-09-20 20:44:43 +00003009
Greg Clayton67cc0632012-08-22 17:17:09 +00003010class TargetOptionValueProperties : public OptionValueProperties
Greg Claytonbfe5f3b2011-02-18 01:44:25 +00003011{
Greg Clayton67cc0632012-08-22 17:17:09 +00003012public:
3013 TargetOptionValueProperties (const ConstString &name) :
3014 OptionValueProperties (name),
3015 m_target (NULL),
3016 m_got_host_env (false)
Caroline Ticedaccaa92010-09-20 20:44:43 +00003017 {
Caroline Ticedaccaa92010-09-20 20:44:43 +00003018 }
Caroline Ticedaccaa92010-09-20 20:44:43 +00003019
Greg Clayton67cc0632012-08-22 17:17:09 +00003020 // This constructor is used when creating TargetOptionValueProperties when it
3021 // is part of a new lldb_private::Target instance. It will copy all current
3022 // global property values as needed
3023 TargetOptionValueProperties (Target *target, const TargetPropertiesSP &target_properties_sp) :
3024 OptionValueProperties(*target_properties_sp->GetValueProperties()),
3025 m_target (target),
3026 m_got_host_env (false)
Caroline Ticedaccaa92010-09-20 20:44:43 +00003027 {
Greg Clayton67cc0632012-08-22 17:17:09 +00003028 }
3029
3030 virtual const Property *
3031 GetPropertyAtIndex (const ExecutionContext *exe_ctx, bool will_modify, uint32_t idx) const
3032 {
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +00003033 // When getting the value for a key from the target options, we will always
Greg Clayton67cc0632012-08-22 17:17:09 +00003034 // try and grab the setting from the current target if there is one. Else we just
3035 // use the one from this instance.
3036 if (idx == ePropertyEnvVars)
3037 GetHostEnvironmentIfNeeded ();
3038
3039 if (exe_ctx)
3040 {
3041 Target *target = exe_ctx->GetTargetPtr();
3042 if (target)
3043 {
3044 TargetOptionValueProperties *target_properties = static_cast<TargetOptionValueProperties *>(target->GetValueProperties().get());
3045 if (this != target_properties)
3046 return target_properties->ProtectedGetPropertyAtIndex (idx);
3047 }
3048 }
3049 return ProtectedGetPropertyAtIndex (idx);
3050 }
Enrico Granata84a53df2013-05-20 22:29:23 +00003051
3052 lldb::TargetSP
3053 GetTargetSP ()
3054 {
3055 return m_target->shared_from_this();
3056 }
3057
Greg Clayton67cc0632012-08-22 17:17:09 +00003058protected:
3059
3060 void
3061 GetHostEnvironmentIfNeeded () const
3062 {
3063 if (!m_got_host_env)
3064 {
3065 if (m_target)
3066 {
3067 m_got_host_env = true;
3068 const uint32_t idx = ePropertyInheritEnv;
3069 if (GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0))
3070 {
3071 PlatformSP platform_sp (m_target->GetPlatform());
3072 if (platform_sp)
3073 {
3074 StringList env;
3075 if (platform_sp->GetEnvironment(env))
3076 {
3077 OptionValueDictionary *env_dict = GetPropertyAtIndexAsOptionValueDictionary (NULL, ePropertyEnvVars);
3078 if (env_dict)
3079 {
3080 const bool can_replace = false;
3081 const size_t envc = env.GetSize();
3082 for (size_t idx=0; idx<envc; idx++)
3083 {
3084 const char *env_entry = env.GetStringAtIndex (idx);
3085 if (env_entry)
3086 {
3087 const char *equal_pos = ::strchr(env_entry, '=');
3088 ConstString key;
3089 // It is ok to have environment variables with no values
3090 const char *value = NULL;
3091 if (equal_pos)
3092 {
3093 key.SetCStringWithLength(env_entry, equal_pos - env_entry);
3094 if (equal_pos[1])
3095 value = equal_pos + 1;
3096 }
3097 else
3098 {
3099 key.SetCString(env_entry);
3100 }
3101 // Don't allow existing keys to be replaced with ones we get from the platform environment
3102 env_dict->SetValueForKey(key, OptionValueSP(new OptionValueString(value)), can_replace);
3103 }
3104 }
3105 }
3106 }
3107 }
3108 }
3109 }
3110 }
3111 }
3112 Target *m_target;
3113 mutable bool m_got_host_env;
3114};
3115
Greg Claytonfbb76342013-11-20 21:07:01 +00003116//----------------------------------------------------------------------
3117// TargetProperties
3118//----------------------------------------------------------------------
Greg Clayton67cc0632012-08-22 17:17:09 +00003119TargetProperties::TargetProperties (Target *target) :
Ilia K8f37ca52015-02-13 14:31:06 +00003120 Properties (),
3121 m_launch_info ()
Greg Clayton67cc0632012-08-22 17:17:09 +00003122{
3123 if (target)
3124 {
3125 m_collection_sp.reset (new TargetOptionValueProperties(target, Target::GetGlobalProperties()));
Ilia K8f37ca52015-02-13 14:31:06 +00003126
3127 // Set callbacks to update launch_info whenever "settins set" updated any of these properties
3128 m_collection_sp->SetValueChangedCallback(ePropertyArg0, TargetProperties::Arg0ValueChangedCallback, this);
3129 m_collection_sp->SetValueChangedCallback(ePropertyRunArgs, TargetProperties::RunArgsValueChangedCallback, this);
3130 m_collection_sp->SetValueChangedCallback(ePropertyEnvVars, TargetProperties::EnvVarsValueChangedCallback, this);
3131 m_collection_sp->SetValueChangedCallback(ePropertyInputPath, TargetProperties::InputPathValueChangedCallback, this);
3132 m_collection_sp->SetValueChangedCallback(ePropertyOutputPath, TargetProperties::OutputPathValueChangedCallback, this);
3133 m_collection_sp->SetValueChangedCallback(ePropertyErrorPath, TargetProperties::ErrorPathValueChangedCallback, this);
3134 m_collection_sp->SetValueChangedCallback(ePropertyDetachOnError, TargetProperties::DetachOnErrorValueChangedCallback, this);
3135 m_collection_sp->SetValueChangedCallback(ePropertyDisableASLR, TargetProperties::DisableASLRValueChangedCallback, this);
3136 m_collection_sp->SetValueChangedCallback(ePropertyDisableSTDIO, TargetProperties::DisableSTDIOValueChangedCallback, this);
3137
3138 // Update m_launch_info once it was created
3139 Arg0ValueChangedCallback(this, NULL);
3140 RunArgsValueChangedCallback(this, NULL);
3141 //EnvVarsValueChangedCallback(this, NULL); // FIXME: cause segfault in Target::GetPlatform()
3142 InputPathValueChangedCallback(this, NULL);
3143 OutputPathValueChangedCallback(this, NULL);
3144 ErrorPathValueChangedCallback(this, NULL);
3145 DetachOnErrorValueChangedCallback(this, NULL);
3146 DisableASLRValueChangedCallback(this, NULL);
3147 DisableSTDIOValueChangedCallback(this, NULL);
Caroline Ticedaccaa92010-09-20 20:44:43 +00003148 }
3149 else
Greg Clayton67cc0632012-08-22 17:17:09 +00003150 {
3151 m_collection_sp.reset (new TargetOptionValueProperties(ConstString("target")));
3152 m_collection_sp->Initialize(g_properties);
3153 m_collection_sp->AppendProperty(ConstString("process"),
3154 ConstString("Settings specify to processes."),
3155 true,
3156 Process::GetGlobalProperties()->GetValueProperties());
3157 }
Ilia K8f37ca52015-02-13 14:31:06 +00003158
Caroline Ticedaccaa92010-09-20 20:44:43 +00003159}
3160
Greg Clayton67cc0632012-08-22 17:17:09 +00003161TargetProperties::~TargetProperties ()
3162{
3163}
3164ArchSpec
3165TargetProperties::GetDefaultArchitecture () const
3166{
3167 OptionValueArch *value = m_collection_sp->GetPropertyAtIndexAsOptionValueArch (NULL, ePropertyDefaultArch);
3168 if (value)
3169 return value->GetCurrentValue();
3170 return ArchSpec();
3171}
3172
3173void
3174TargetProperties::SetDefaultArchitecture (const ArchSpec& arch)
3175{
3176 OptionValueArch *value = m_collection_sp->GetPropertyAtIndexAsOptionValueArch (NULL, ePropertyDefaultArch);
3177 if (value)
3178 return value->SetCurrentValue(arch, true);
3179}
3180
3181lldb::DynamicValueType
3182TargetProperties::GetPreferDynamicValue() const
3183{
3184 const uint32_t idx = ePropertyPreferDynamic;
3185 return (lldb::DynamicValueType)m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value);
3186}
3187
3188bool
3189TargetProperties::GetDisableASLR () const
3190{
3191 const uint32_t idx = ePropertyDisableASLR;
3192 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3193}
3194
3195void
3196TargetProperties::SetDisableASLR (bool b)
3197{
3198 const uint32_t idx = ePropertyDisableASLR;
3199 m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b);
3200}
3201
3202bool
Jim Ingham106d0282014-06-25 02:32:56 +00003203TargetProperties::GetDetachOnError () const
3204{
3205 const uint32_t idx = ePropertyDetachOnError;
3206 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3207}
3208
3209void
3210TargetProperties::SetDetachOnError (bool b)
3211{
3212 const uint32_t idx = ePropertyDetachOnError;
3213 m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b);
3214}
3215
3216bool
Greg Clayton67cc0632012-08-22 17:17:09 +00003217TargetProperties::GetDisableSTDIO () const
3218{
3219 const uint32_t idx = ePropertyDisableSTDIO;
3220 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3221}
3222
3223void
3224TargetProperties::SetDisableSTDIO (bool b)
3225{
3226 const uint32_t idx = ePropertyDisableSTDIO;
3227 m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b);
3228}
3229
Jim Ingham0f063ba2013-03-02 00:26:47 +00003230const char *
3231TargetProperties::GetDisassemblyFlavor () const
3232{
3233 const uint32_t idx = ePropertyDisassemblyFlavor;
3234 const char *return_value;
3235
3236 x86DisassemblyFlavor flavor_value = (x86DisassemblyFlavor) m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value);
3237 return_value = g_x86_dis_flavor_value_types[flavor_value].string_value;
3238 return return_value;
3239}
3240
Greg Clayton1f746072012-08-29 21:13:06 +00003241InlineStrategy
3242TargetProperties::GetInlineStrategy () const
3243{
3244 const uint32_t idx = ePropertyInlineStrategy;
3245 return (InlineStrategy)m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value);
3246}
3247
Greg Clayton45392552012-10-17 22:57:12 +00003248const char *
3249TargetProperties::GetArg0 () const
3250{
3251 const uint32_t idx = ePropertyArg0;
3252 return m_collection_sp->GetPropertyAtIndexAsString (NULL, idx, NULL);
3253}
3254
3255void
3256TargetProperties::SetArg0 (const char *arg)
3257{
3258 const uint32_t idx = ePropertyArg0;
3259 m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, arg);
Greg Clayton896e0ec2015-03-26 00:15:24 +00003260 m_launch_info.SetArg0(arg);
Greg Clayton45392552012-10-17 22:57:12 +00003261}
3262
Greg Clayton67cc0632012-08-22 17:17:09 +00003263bool
3264TargetProperties::GetRunArguments (Args &args) const
3265{
3266 const uint32_t idx = ePropertyRunArgs;
3267 return m_collection_sp->GetPropertyAtIndexAsArgs (NULL, idx, args);
3268}
3269
3270void
3271TargetProperties::SetRunArguments (const Args &args)
3272{
3273 const uint32_t idx = ePropertyRunArgs;
3274 m_collection_sp->SetPropertyAtIndexFromArgs (NULL, idx, args);
Greg Clayton896e0ec2015-03-26 00:15:24 +00003275 m_launch_info.GetArguments() = args;
Greg Clayton67cc0632012-08-22 17:17:09 +00003276}
3277
3278size_t
3279TargetProperties::GetEnvironmentAsArgs (Args &env) const
3280{
3281 const uint32_t idx = ePropertyEnvVars;
3282 return m_collection_sp->GetPropertyAtIndexAsArgs (NULL, idx, env);
3283}
3284
Ilia K8f37ca52015-02-13 14:31:06 +00003285void
3286TargetProperties::SetEnvironmentFromArgs (const Args &env)
3287{
3288 const uint32_t idx = ePropertyEnvVars;
3289 m_collection_sp->SetPropertyAtIndexFromArgs (NULL, idx, env);
Greg Clayton896e0ec2015-03-26 00:15:24 +00003290 m_launch_info.GetEnvironmentEntries() = env;
Ilia K8f37ca52015-02-13 14:31:06 +00003291}
3292
Greg Clayton67cc0632012-08-22 17:17:09 +00003293bool
3294TargetProperties::GetSkipPrologue() const
3295{
3296 const uint32_t idx = ePropertySkipPrologue;
3297 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3298}
3299
3300PathMappingList &
3301TargetProperties::GetSourcePathMap () const
3302{
3303 const uint32_t idx = ePropertySourceMap;
3304 OptionValuePathMappings *option_value = m_collection_sp->GetPropertyAtIndexAsOptionValuePathMappings (NULL, false, idx);
3305 assert(option_value);
3306 return option_value->GetCurrentValue();
3307}
3308
3309FileSpecList &
Greg Clayton6920b522012-08-22 18:39:03 +00003310TargetProperties::GetExecutableSearchPaths ()
Greg Clayton67cc0632012-08-22 17:17:09 +00003311{
3312 const uint32_t idx = ePropertyExecutableSearchPaths;
3313 OptionValueFileSpecList *option_value = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList (NULL, false, idx);
3314 assert(option_value);
3315 return option_value->GetCurrentValue();
3316}
3317
Michael Sartaina7499c92013-07-01 19:45:50 +00003318FileSpecList &
3319TargetProperties::GetDebugFileSearchPaths ()
3320{
3321 const uint32_t idx = ePropertyDebugFileSearchPaths;
3322 OptionValueFileSpecList *option_value = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList (NULL, false, idx);
3323 assert(option_value);
3324 return option_value->GetCurrentValue();
3325}
3326
Sean Callanan85054342015-04-03 15:39:47 +00003327FileSpecList &
3328TargetProperties::GetClangModuleSearchPaths ()
3329{
3330 const uint32_t idx = ePropertyClangModuleSearchPaths;
3331 OptionValueFileSpecList *option_value = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList (NULL, false, idx);
3332 assert(option_value);
3333 return option_value->GetCurrentValue();
3334}
3335
Greg Clayton67cc0632012-08-22 17:17:09 +00003336bool
Sean Callananf0c5aeb2015-04-20 16:31:29 +00003337TargetProperties::GetEnableAutoImportClangModules() const
3338{
3339 const uint32_t idx = ePropertyAutoImportClangModules;
3340 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3341}
3342
3343bool
Greg Clayton67cc0632012-08-22 17:17:09 +00003344TargetProperties::GetEnableSyntheticValue () const
3345{
3346 const uint32_t idx = ePropertyEnableSynthetic;
3347 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3348}
3349
3350uint32_t
3351TargetProperties::GetMaximumNumberOfChildrenToDisplay() const
3352{
3353 const uint32_t idx = ePropertyMaxChildrenCount;
3354 return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value);
3355}
3356
3357uint32_t
3358TargetProperties::GetMaximumSizeOfStringSummary() const
3359{
3360 const uint32_t idx = ePropertyMaxSummaryLength;
3361 return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value);
3362}
3363
Enrico Granatad325bf92013-06-04 22:54:16 +00003364uint32_t
3365TargetProperties::GetMaximumMemReadSize () const
3366{
3367 const uint32_t idx = ePropertyMaxMemReadSize;
3368 return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value);
3369}
3370
Greg Clayton67cc0632012-08-22 17:17:09 +00003371FileSpec
3372TargetProperties::GetStandardInputPath () const
3373{
3374 const uint32_t idx = ePropertyInputPath;
3375 return m_collection_sp->GetPropertyAtIndexAsFileSpec (NULL, idx);
3376}
3377
3378void
3379TargetProperties::SetStandardInputPath (const char *p)
3380{
3381 const uint32_t idx = ePropertyInputPath;
3382 m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, p);
3383}
3384
3385FileSpec
3386TargetProperties::GetStandardOutputPath () const
3387{
3388 const uint32_t idx = ePropertyOutputPath;
3389 return m_collection_sp->GetPropertyAtIndexAsFileSpec (NULL, idx);
3390}
3391
3392void
3393TargetProperties::SetStandardOutputPath (const char *p)
3394{
3395 const uint32_t idx = ePropertyOutputPath;
3396 m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, p);
3397}
3398
3399FileSpec
3400TargetProperties::GetStandardErrorPath () const
3401{
3402 const uint32_t idx = ePropertyErrorPath;
3403 return m_collection_sp->GetPropertyAtIndexAsFileSpec(NULL, idx);
3404}
3405
Greg Clayton6920b522012-08-22 18:39:03 +00003406const char *
3407TargetProperties::GetExpressionPrefixContentsAsCString ()
3408{
3409 const uint32_t idx = ePropertyExprPrefix;
3410 OptionValueFileSpec *file = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpec (NULL, false, idx);
3411 if (file)
Jim Ingham1e4f4252012-08-22 21:21:16 +00003412 {
Greg Clayton0b0b5122012-08-30 18:15:10 +00003413 const bool null_terminate = true;
3414 DataBufferSP data_sp(file->GetFileContents(null_terminate));
Jim Ingham1e4f4252012-08-22 21:21:16 +00003415 if (data_sp)
3416 return (const char *) data_sp->GetBytes();
3417 }
Greg Clayton6920b522012-08-22 18:39:03 +00003418 return NULL;
3419}
3420
Greg Clayton67cc0632012-08-22 17:17:09 +00003421void
3422TargetProperties::SetStandardErrorPath (const char *p)
3423{
3424 const uint32_t idx = ePropertyErrorPath;
3425 m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, p);
3426}
3427
3428bool
3429TargetProperties::GetBreakpointsConsultPlatformAvoidList ()
3430{
3431 const uint32_t idx = ePropertyBreakpointUseAvoidList;
3432 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3433}
3434
Jim Ingham17d023f2013-03-13 17:58:04 +00003435bool
Daniel Malead79ae052013-08-07 21:54:09 +00003436TargetProperties::GetUseHexImmediates () const
3437{
3438 const uint32_t idx = ePropertyUseHexImmediates;
3439 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3440}
3441
3442bool
Jim Ingham17d023f2013-03-13 17:58:04 +00003443TargetProperties::GetUseFastStepping () const
3444{
3445 const uint32_t idx = ePropertyUseFastStepping;
3446 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3447}
3448
Greg Claytonfb6621e2013-12-06 21:59:52 +00003449bool
3450TargetProperties::GetDisplayExpressionsInCrashlogs () const
3451{
3452 const uint32_t idx = ePropertyDisplayExpressionsInCrashlogs;
3453 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3454}
3455
Enrico Granata397ddd52013-05-21 20:13:34 +00003456LoadScriptFromSymFile
Enrico Granata2ea43cd2013-05-13 17:03:52 +00003457TargetProperties::GetLoadScriptFromSymbolFile () const
3458{
3459 const uint32_t idx = ePropertyLoadScriptFromSymbolFile;
Enrico Granata397ddd52013-05-21 20:13:34 +00003460 return (LoadScriptFromSymFile)m_collection_sp->GetPropertyAtIndexAsEnumeration(NULL, idx, g_properties[idx].default_uint_value);
Enrico Granata2ea43cd2013-05-13 17:03:52 +00003461}
3462
Daniel Malead79ae052013-08-07 21:54:09 +00003463Disassembler::HexImmediateStyle
3464TargetProperties::GetHexImmediateStyle () const
3465{
3466 const uint32_t idx = ePropertyHexImmediateStyle;
3467 return (Disassembler::HexImmediateStyle)m_collection_sp->GetPropertyAtIndexAsEnumeration(NULL, idx, g_properties[idx].default_uint_value);
3468}
3469
Greg Claytonfd814c52013-08-13 01:42:25 +00003470MemoryModuleLoadLevel
3471TargetProperties::GetMemoryModuleLoadLevel() const
3472{
3473 const uint32_t idx = ePropertyMemoryModuleLoadLevel;
3474 return (MemoryModuleLoadLevel)m_collection_sp->GetPropertyAtIndexAsEnumeration(NULL, idx, g_properties[idx].default_uint_value);
3475}
3476
Jason Molendaa4bea722014-02-14 05:06:49 +00003477bool
3478TargetProperties::GetUserSpecifiedTrapHandlerNames (Args &args) const
3479{
3480 const uint32_t idx = ePropertyTrapHandlerNames;
3481 return m_collection_sp->GetPropertyAtIndexAsArgs (NULL, idx, args);
3482}
Greg Claytonfd814c52013-08-13 01:42:25 +00003483
Jason Molendaa4bea722014-02-14 05:06:49 +00003484void
3485TargetProperties::SetUserSpecifiedTrapHandlerNames (const Args &args)
3486{
3487 const uint32_t idx = ePropertyTrapHandlerNames;
3488 m_collection_sp->SetPropertyAtIndexFromArgs (NULL, idx, args);
3489}
Greg Clayton67cc0632012-08-22 17:17:09 +00003490
Enrico Granata560558e2015-02-11 02:35:39 +00003491bool
3492TargetProperties::GetDisplayRuntimeSupportValues () const
3493{
3494 const uint32_t idx = ePropertyDisplayRuntimeSupportValues;
3495 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, false);
3496}
3497
3498void
3499TargetProperties::SetDisplayRuntimeSupportValues (bool b)
3500{
3501 const uint32_t idx = ePropertyDisplayRuntimeSupportValues;
3502 m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b);
3503}
3504
Ilia K8f37ca52015-02-13 14:31:06 +00003505const ProcessLaunchInfo &
Ilia Kcc39d3f2015-02-13 17:07:55 +00003506TargetProperties::GetProcessLaunchInfo ()
Ilia K8f37ca52015-02-13 14:31:06 +00003507{
Ilia Kcc39d3f2015-02-13 17:07:55 +00003508 m_launch_info.SetArg0(GetArg0()); // FIXME: Arg0 callback doesn't work
Ilia K8f37ca52015-02-13 14:31:06 +00003509 return m_launch_info;
3510}
3511
3512void
3513TargetProperties::SetProcessLaunchInfo(const ProcessLaunchInfo &launch_info)
3514{
3515 m_launch_info = launch_info;
3516 SetArg0(launch_info.GetArg0());
3517 SetRunArguments(launch_info.GetArguments());
3518 SetEnvironmentFromArgs(launch_info.GetEnvironmentEntries());
3519 const FileAction *input_file_action = launch_info.GetFileActionForFD(STDIN_FILENO);
3520 if (input_file_action)
3521 {
3522 const char *input_path = input_file_action->GetPath();
3523 if (input_path)
3524 SetStandardInputPath(input_path);
3525 }
3526 const FileAction *output_file_action = launch_info.GetFileActionForFD(STDOUT_FILENO);
3527 if (output_file_action)
3528 {
3529 const char *output_path = output_file_action->GetPath();
3530 if (output_path)
3531 SetStandardOutputPath(output_path);
3532 }
3533 const FileAction *error_file_action = launch_info.GetFileActionForFD(STDERR_FILENO);
3534 if (error_file_action)
3535 {
3536 const char *error_path = error_file_action->GetPath();
3537 if (error_path)
3538 SetStandardErrorPath(error_path);
3539 }
3540 SetDetachOnError(launch_info.GetFlags().Test(lldb::eLaunchFlagDetachOnError));
3541 SetDisableASLR(launch_info.GetFlags().Test(lldb::eLaunchFlagDisableASLR));
3542 SetDisableSTDIO(launch_info.GetFlags().Test(lldb::eLaunchFlagDisableSTDIO));
3543}
3544
3545void
3546TargetProperties::Arg0ValueChangedCallback(void *target_property_ptr, OptionValue *)
3547{
3548 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
3549 this_->m_launch_info.SetArg0(this_->GetArg0());
3550}
3551
3552void
3553TargetProperties::RunArgsValueChangedCallback(void *target_property_ptr, OptionValue *)
3554{
3555 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
3556 Args args;
3557 if (this_->GetRunArguments(args))
3558 this_->m_launch_info.GetArguments() = args;
3559}
3560
3561void
3562TargetProperties::EnvVarsValueChangedCallback(void *target_property_ptr, OptionValue *)
3563{
3564 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
3565 Args args;
3566 if (this_->GetEnvironmentAsArgs(args))
3567 this_->m_launch_info.GetEnvironmentEntries() = args;
3568}
3569
3570void
3571TargetProperties::InputPathValueChangedCallback(void *target_property_ptr, OptionValue *)
3572{
3573 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
3574 this_->m_launch_info.AppendOpenFileAction(STDIN_FILENO, this_->GetStandardInputPath().GetPath().c_str(), true, false);
3575}
3576
3577void
3578TargetProperties::OutputPathValueChangedCallback(void *target_property_ptr, OptionValue *)
3579{
3580 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
3581 this_->m_launch_info.AppendOpenFileAction(STDOUT_FILENO, this_->GetStandardOutputPath().GetPath().c_str(), false, true);
3582}
3583
3584void
3585TargetProperties::ErrorPathValueChangedCallback(void *target_property_ptr, OptionValue *)
3586{
3587 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
3588 this_->m_launch_info.AppendOpenFileAction(STDERR_FILENO, this_->GetStandardErrorPath().GetPath().c_str(), false, true);
3589}
3590
3591void
3592TargetProperties::DetachOnErrorValueChangedCallback(void *target_property_ptr, OptionValue *)
3593{
3594 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
3595 if (this_->GetDetachOnError())
3596 this_->m_launch_info.GetFlags().Set(lldb::eLaunchFlagDetachOnError);
3597 else
3598 this_->m_launch_info.GetFlags().Clear(lldb::eLaunchFlagDetachOnError);
3599}
3600
3601void
3602TargetProperties::DisableASLRValueChangedCallback(void *target_property_ptr, OptionValue *)
3603{
3604 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
3605 if (this_->GetDisableASLR())
3606 this_->m_launch_info.GetFlags().Set(lldb::eLaunchFlagDisableASLR);
3607 else
3608 this_->m_launch_info.GetFlags().Clear(lldb::eLaunchFlagDisableASLR);
3609}
3610
3611void
3612TargetProperties::DisableSTDIOValueChangedCallback(void *target_property_ptr, OptionValue *)
3613{
3614 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
3615 if (this_->GetDisableSTDIO())
3616 this_->m_launch_info.GetFlags().Set(lldb::eLaunchFlagDisableSTDIO);
3617 else
3618 this_->m_launch_info.GetFlags().Clear(lldb::eLaunchFlagDisableSTDIO);
3619}
Ilia Keb2c19a2015-03-10 21:59:55 +00003620
3621//----------------------------------------------------------------------
3622// Target::TargetEventData
3623//----------------------------------------------------------------------
3624
3625Target::TargetEventData::TargetEventData (const lldb::TargetSP &target_sp) :
3626 EventData (),
3627 m_target_sp (target_sp),
3628 m_module_list ()
3629{
3630}
3631
3632Target::TargetEventData::TargetEventData (const lldb::TargetSP &target_sp, const ModuleList &module_list) :
3633 EventData (),
3634 m_target_sp (target_sp),
3635 m_module_list (module_list)
3636{
3637}
3638
3639Target::TargetEventData::~TargetEventData()
3640{
3641}
3642
3643const ConstString &
3644Target::TargetEventData::GetFlavorString ()
3645{
3646 static ConstString g_flavor ("Target::TargetEventData");
3647 return g_flavor;
3648}
3649
3650void
3651Target::TargetEventData::Dump (Stream *s) const
3652{
3653}
3654
3655const Target::TargetEventData *
3656Target::TargetEventData::GetEventDataFromEvent (const Event *event_ptr)
3657{
3658 if (event_ptr)
3659 {
3660 const EventData *event_data = event_ptr->GetData();
3661 if (event_data && event_data->GetFlavor() == TargetEventData::GetFlavorString())
3662 return static_cast <const TargetEventData *> (event_ptr->GetData());
3663 }
3664 return NULL;
3665}
3666
3667TargetSP
3668Target::TargetEventData::GetTargetFromEvent (const Event *event_ptr)
3669{
3670 TargetSP target_sp;
3671 const TargetEventData *event_data = GetEventDataFromEvent (event_ptr);
3672 if (event_data)
3673 target_sp = event_data->m_target_sp;
3674 return target_sp;
3675}
3676
3677ModuleList
3678Target::TargetEventData::GetModuleListFromEvent (const Event *event_ptr)
3679{
3680 ModuleList module_list;
3681 const TargetEventData *event_data = GetEventDataFromEvent (event_ptr);
3682 if (event_data)
3683 module_list = event_data->m_module_list;
3684 return module_list;
3685}