blob: 02eab6b36c9e61e07ec5b5b7f4cb744044248f82 [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
Jim Inghama72b31c2015-04-22 19:42:18 +0000526Target::CreateExceptionBreakpoint (enum lldb::LanguageType language, bool catch_bp, bool throw_bp, bool internal, Args *additional_args, Error *error)
Jim Ingham219ba192012-03-05 04:47:34 +0000527{
Jim Inghama72b31c2015-04-22 19:42:18 +0000528 BreakpointSP exc_bkpt_sp = LanguageRuntime::CreateExceptionBreakpoint (*this, language, catch_bp, throw_bp, internal);
529 if (exc_bkpt_sp && additional_args)
530 {
531 Breakpoint::BreakpointPreconditionSP precondition_sp = exc_bkpt_sp->GetPrecondition();
532 if (precondition_sp && additional_args)
533 {
534 if (error)
535 *error = precondition_sp->ConfigurePrecondition(*additional_args);
536 else
537 precondition_sp->ConfigurePrecondition(*additional_args);
538 }
539 }
540 return exc_bkpt_sp;
Jim Ingham219ba192012-03-05 04:47:34 +0000541}
Jim Inghama72b31c2015-04-22 19:42:18 +0000542
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000543BreakpointSP
Jim Ingham1460e4b2014-01-10 23:46:59 +0000544Target::CreateBreakpoint (SearchFilterSP &filter_sp, BreakpointResolverSP &resolver_sp, bool internal, bool request_hardware, bool resolve_indirect_symbols)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000545{
546 BreakpointSP bp_sp;
547 if (filter_sp && resolver_sp)
548 {
Jim Ingham1460e4b2014-01-10 23:46:59 +0000549 bp_sp.reset(new Breakpoint (*this, filter_sp, resolver_sp, request_hardware, resolve_indirect_symbols));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000550 resolver_sp->SetBreakpoint (bp_sp.get());
Jim Ingham33df7cd2014-12-06 01:28:03 +0000551 AddBreakpoint (bp_sp, internal);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000552 }
Jim Ingham33df7cd2014-12-06 01:28:03 +0000553 return bp_sp;
554}
555
556void
557Target::AddBreakpoint (lldb::BreakpointSP bp_sp, bool internal)
558{
559 if (!bp_sp)
560 return;
561 if (internal)
562 m_internal_breakpoint_list.Add (bp_sp, false);
563 else
564 m_breakpoint_list.Add (bp_sp, true);
565
566 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
567 if (log)
568 {
569 StreamString s;
570 bp_sp->GetDescription(&s, lldb::eDescriptionLevelVerbose);
571 log->Printf ("Target::%s (internal = %s) => break_id = %s\n", __FUNCTION__, bp_sp->IsInternal() ? "yes" : "no", s.GetData());
572 }
573
574 bp_sp->ResolveBreakpoint();
575
576 if (!internal)
Jim Ingham36f3b362010-10-14 23:45:03 +0000577 {
578 m_last_created_breakpoint = bp_sp;
579 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000580}
581
Johnny Chen86364b42011-09-20 23:28:55 +0000582bool
583Target::ProcessIsValid()
584{
585 return (m_process_sp && m_process_sp->IsAlive());
586}
587
Johnny Chenb90827e2012-06-04 23:19:54 +0000588static bool
589CheckIfWatchpointsExhausted(Target *target, Error &error)
590{
591 uint32_t num_supported_hardware_watchpoints;
592 Error rc = target->GetProcessSP()->GetWatchpointSupportInfo(num_supported_hardware_watchpoints);
593 if (rc.Success())
594 {
595 uint32_t num_current_watchpoints = target->GetWatchpointList().GetSize();
596 if (num_current_watchpoints >= num_supported_hardware_watchpoints)
597 error.SetErrorStringWithFormat("number of supported hardware watchpoints (%u) has been reached",
598 num_supported_hardware_watchpoints);
599 }
600 return false;
601}
602
Johnny Chen01a67862011-10-14 00:42:25 +0000603// See also Watchpoint::SetWatchpointType(uint32_t type) and
Johnny Chenab9ee762011-09-14 00:26:03 +0000604// the OptionGroupWatchpoint::WatchType enum type.
Johnny Chen01a67862011-10-14 00:42:25 +0000605WatchpointSP
Jim Inghama7dfb662012-10-23 07:20:06 +0000606Target::CreateWatchpoint(lldb::addr_t addr, size_t size, const ClangASTType *type, uint32_t kind, Error &error)
Johnny Chen887062a2011-09-12 23:38:44 +0000607{
Greg Clayton5160ce52013-03-27 23:08:40 +0000608 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen0c406372011-09-14 20:23:45 +0000609 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000610 log->Printf("Target::%s (addr = 0x%8.8" PRIx64 " size = %" PRIu64 " type = %u)\n",
Jim Inghama7dfb662012-10-23 07:20:06 +0000611 __FUNCTION__, addr, (uint64_t)size, kind);
Johnny Chen0c406372011-09-14 20:23:45 +0000612
Johnny Chen01a67862011-10-14 00:42:25 +0000613 WatchpointSP wp_sp;
Johnny Chen86364b42011-09-20 23:28:55 +0000614 if (!ProcessIsValid())
Johnny Chenb90827e2012-06-04 23:19:54 +0000615 {
616 error.SetErrorString("process is not alive");
Johnny Chen01a67862011-10-14 00:42:25 +0000617 return wp_sp;
Johnny Chenb90827e2012-06-04 23:19:54 +0000618 }
Jim Inghamc6462312013-06-18 21:52:48 +0000619
Johnny Chen45e541f2011-09-14 22:20:15 +0000620 if (addr == LLDB_INVALID_ADDRESS || size == 0)
Johnny Chenb90827e2012-06-04 23:19:54 +0000621 {
622 if (size == 0)
623 error.SetErrorString("cannot set a watchpoint with watch_size of 0");
624 else
Daniel Malead01b2952012-11-29 21:49:15 +0000625 error.SetErrorStringWithFormat("invalid watch address: %" PRIu64, addr);
Johnny Chen01a67862011-10-14 00:42:25 +0000626 return wp_sp;
Johnny Chenb90827e2012-06-04 23:19:54 +0000627 }
Jim Inghamc6462312013-06-18 21:52:48 +0000628
629 if (!LLDB_WATCH_TYPE_IS_VALID(kind))
630 {
631 error.SetErrorStringWithFormat ("invalid watchpoint type: %d", kind);
632 }
Johnny Chen7313a642011-09-13 01:15:36 +0000633
Johnny Chen01a67862011-10-14 00:42:25 +0000634 // Currently we only support one watchpoint per address, with total number
635 // of watchpoints limited by the hardware which the inferior is running on.
Johnny Chen7385a5a2012-05-31 22:56:36 +0000636
637 // Grab the list mutex while doing operations.
Jim Ingham1b5792e2012-12-18 02:03:49 +0000638 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 +0000639 Mutex::Locker locker;
640 this->GetWatchpointList().GetListMutex(locker);
Johnny Chen01a67862011-10-14 00:42:25 +0000641 WatchpointSP matched_sp = m_watchpoint_list.FindByAddress(addr);
Johnny Chen3c532582011-09-13 23:29:31 +0000642 if (matched_sp)
643 {
Johnny Chen0c406372011-09-14 20:23:45 +0000644 size_t old_size = matched_sp->GetByteSize();
Johnny Chen3c532582011-09-13 23:29:31 +0000645 uint32_t old_type =
Johnny Chen0c406372011-09-14 20:23:45 +0000646 (matched_sp->WatchpointRead() ? LLDB_WATCH_TYPE_READ : 0) |
647 (matched_sp->WatchpointWrite() ? LLDB_WATCH_TYPE_WRITE : 0);
Johnny Chen01a67862011-10-14 00:42:25 +0000648 // Return the existing watchpoint if both size and type match.
Jim Inghamc6462312013-06-18 21:52:48 +0000649 if (size == old_size && kind == old_type)
650 {
Johnny Chen01a67862011-10-14 00:42:25 +0000651 wp_sp = matched_sp;
Jim Ingham1b5792e2012-12-18 02:03:49 +0000652 wp_sp->SetEnabled(false, notify);
Jim Inghamc6462312013-06-18 21:52:48 +0000653 }
654 else
655 {
Johnny Chen01a67862011-10-14 00:42:25 +0000656 // Nil the matched watchpoint; we will be creating a new one.
Jim Ingham1b5792e2012-12-18 02:03:49 +0000657 m_process_sp->DisableWatchpoint(matched_sp.get(), notify);
658 m_watchpoint_list.Remove(matched_sp->GetID(), true);
Johnny Chen45e541f2011-09-14 22:20:15 +0000659 }
Johnny Chen3c532582011-09-13 23:29:31 +0000660 }
661
Jason Molenda727e3922012-12-05 23:07:34 +0000662 if (!wp_sp)
663 {
Jim Ingham1b5792e2012-12-18 02:03:49 +0000664 wp_sp.reset(new Watchpoint(*this, addr, size, type));
665 wp_sp->SetWatchpointType(kind, notify);
666 m_watchpoint_list.Add (wp_sp, true);
Johnny Chen45e541f2011-09-14 22:20:15 +0000667 }
Johnny Chen0c406372011-09-14 20:23:45 +0000668
Jim Ingham1b5792e2012-12-18 02:03:49 +0000669 error = m_process_sp->EnableWatchpoint(wp_sp.get(), notify);
Johnny Chen0c406372011-09-14 20:23:45 +0000670 if (log)
Jason Molenda727e3922012-12-05 23:07:34 +0000671 log->Printf("Target::%s (creation of watchpoint %s with id = %u)\n",
672 __FUNCTION__,
673 error.Success() ? "succeeded" : "failed",
674 wp_sp->GetID());
Johnny Chen0c406372011-09-14 20:23:45 +0000675
Jason Molenda727e3922012-12-05 23:07:34 +0000676 if (error.Fail())
677 {
Johnny Chen41b77262012-03-26 22:00:10 +0000678 // Enabling the watchpoint on the device side failed.
679 // Remove the said watchpoint from the list maintained by the target instance.
Jim Ingham1b5792e2012-12-18 02:03:49 +0000680 m_watchpoint_list.Remove (wp_sp->GetID(), true);
Johnny Chenb90827e2012-06-04 23:19:54 +0000681 // See if we could provide more helpful error message.
682 if (!CheckIfWatchpointsExhausted(this, error))
683 {
684 if (!OptionGroupWatchpoint::IsWatchSizeSupported(size))
Greg Clayton6fea17e2014-03-03 19:15:20 +0000685 error.SetErrorStringWithFormat("watch size of %" PRIu64 " is not supported", (uint64_t)size);
Johnny Chenb90827e2012-06-04 23:19:54 +0000686 }
Johnny Chen01a67862011-10-14 00:42:25 +0000687 wp_sp.reset();
Johnny Chen41b77262012-03-26 22:00:10 +0000688 }
Johnny Chen9d954d82011-09-27 20:29:45 +0000689 else
Johnny Chen01a67862011-10-14 00:42:25 +0000690 m_last_created_watchpoint = wp_sp;
691 return wp_sp;
Johnny Chen887062a2011-09-12 23:38:44 +0000692}
693
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000694void
695Target::RemoveAllBreakpoints (bool internal_also)
696{
Greg Clayton5160ce52013-03-27 23:08:40 +0000697 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000698 if (log)
699 log->Printf ("Target::%s (internal_also = %s)\n", __FUNCTION__, internal_also ? "yes" : "no");
700
Greg Clayton9fed0d82010-07-23 23:33:17 +0000701 m_breakpoint_list.RemoveAll (true);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000702 if (internal_also)
Greg Clayton9fed0d82010-07-23 23:33:17 +0000703 m_internal_breakpoint_list.RemoveAll (false);
Jim Ingham36f3b362010-10-14 23:45:03 +0000704
705 m_last_created_breakpoint.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000706}
707
708void
709Target::DisableAllBreakpoints (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 (false);
716 if (internal_also)
717 m_internal_breakpoint_list.SetEnabledAll (false);
718}
719
720void
721Target::EnableAllBreakpoints (bool internal_also)
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 (internal_also = %s)\n", __FUNCTION__, internal_also ? "yes" : "no");
726
727 m_breakpoint_list.SetEnabledAll (true);
728 if (internal_also)
729 m_internal_breakpoint_list.SetEnabledAll (true);
730}
731
732bool
733Target::RemoveBreakpointByID (break_id_t break_id)
734{
Greg Clayton5160ce52013-03-27 23:08:40 +0000735 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000736 if (log)
737 log->Printf ("Target::%s (break_id = %i, internal = %s)\n", __FUNCTION__, break_id, LLDB_BREAK_ID_IS_INTERNAL (break_id) ? "yes" : "no");
738
739 if (DisableBreakpointByID (break_id))
740 {
741 if (LLDB_BREAK_ID_IS_INTERNAL (break_id))
Greg Clayton9fed0d82010-07-23 23:33:17 +0000742 m_internal_breakpoint_list.Remove(break_id, false);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000743 else
Jim Ingham36f3b362010-10-14 23:45:03 +0000744 {
Greg Claytonaa1c5872011-01-24 23:35:47 +0000745 if (m_last_created_breakpoint)
746 {
747 if (m_last_created_breakpoint->GetID() == break_id)
748 m_last_created_breakpoint.reset();
749 }
Greg Clayton9fed0d82010-07-23 23:33:17 +0000750 m_breakpoint_list.Remove(break_id, true);
Jim Ingham36f3b362010-10-14 23:45:03 +0000751 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000752 return true;
753 }
754 return false;
755}
756
757bool
758Target::DisableBreakpointByID (break_id_t break_id)
759{
Greg Clayton5160ce52013-03-27 23:08:40 +0000760 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000761 if (log)
762 log->Printf ("Target::%s (break_id = %i, internal = %s)\n", __FUNCTION__, break_id, LLDB_BREAK_ID_IS_INTERNAL (break_id) ? "yes" : "no");
763
764 BreakpointSP bp_sp;
765
766 if (LLDB_BREAK_ID_IS_INTERNAL (break_id))
767 bp_sp = m_internal_breakpoint_list.FindBreakpointByID (break_id);
768 else
769 bp_sp = m_breakpoint_list.FindBreakpointByID (break_id);
770 if (bp_sp)
771 {
772 bp_sp->SetEnabled (false);
773 return true;
774 }
775 return false;
776}
777
778bool
779Target::EnableBreakpointByID (break_id_t break_id)
780{
Greg Clayton5160ce52013-03-27 23:08:40 +0000781 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000782 if (log)
783 log->Printf ("Target::%s (break_id = %i, internal = %s)\n",
784 __FUNCTION__,
785 break_id,
786 LLDB_BREAK_ID_IS_INTERNAL (break_id) ? "yes" : "no");
787
788 BreakpointSP bp_sp;
789
790 if (LLDB_BREAK_ID_IS_INTERNAL (break_id))
791 bp_sp = m_internal_breakpoint_list.FindBreakpointByID (break_id);
792 else
793 bp_sp = m_breakpoint_list.FindBreakpointByID (break_id);
794
795 if (bp_sp)
796 {
797 bp_sp->SetEnabled (true);
798 return true;
799 }
800 return false;
801}
802
Johnny Chenedf50372011-09-23 21:21:43 +0000803// The flag 'end_to_end', default to true, signifies that the operation is
804// performed end to end, for both the debugger and the debuggee.
805
Johnny Chen01a67862011-10-14 00:42:25 +0000806// Assumption: Caller holds the list mutex lock for m_watchpoint_list for end
807// to end operations.
Johnny Chen86364b42011-09-20 23:28:55 +0000808bool
Johnny Chen01a67862011-10-14 00:42:25 +0000809Target::RemoveAllWatchpoints (bool end_to_end)
Johnny Chen86364b42011-09-20 23:28:55 +0000810{
Greg Clayton5160ce52013-03-27 23:08:40 +0000811 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen86364b42011-09-20 23:28:55 +0000812 if (log)
813 log->Printf ("Target::%s\n", __FUNCTION__);
814
Johnny Chenedf50372011-09-23 21:21:43 +0000815 if (!end_to_end) {
Jim Ingham1b5792e2012-12-18 02:03:49 +0000816 m_watchpoint_list.RemoveAll(true);
Johnny Chenedf50372011-09-23 21:21:43 +0000817 return true;
818 }
819
820 // Otherwise, it's an end to end operation.
821
Johnny Chen86364b42011-09-20 23:28:55 +0000822 if (!ProcessIsValid())
823 return false;
824
Johnny Chen01a67862011-10-14 00:42:25 +0000825 size_t num_watchpoints = m_watchpoint_list.GetSize();
Johnny Chen86364b42011-09-20 23:28:55 +0000826 for (size_t i = 0; i < num_watchpoints; ++i)
827 {
Johnny Chen01a67862011-10-14 00:42:25 +0000828 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
829 if (!wp_sp)
Johnny Chen86364b42011-09-20 23:28:55 +0000830 return false;
831
Johnny Chen01a67862011-10-14 00:42:25 +0000832 Error rc = m_process_sp->DisableWatchpoint(wp_sp.get());
Johnny Chen86364b42011-09-20 23:28:55 +0000833 if (rc.Fail())
834 return false;
835 }
Jim Ingham1b5792e2012-12-18 02:03:49 +0000836 m_watchpoint_list.RemoveAll (true);
Jim Inghamb0b45132013-07-02 02:09:46 +0000837 m_last_created_watchpoint.reset();
Johnny Chen86364b42011-09-20 23:28:55 +0000838 return true; // Success!
839}
840
Johnny Chen01a67862011-10-14 00:42:25 +0000841// Assumption: Caller holds the list mutex lock for m_watchpoint_list for end to
842// end operations.
Johnny Chen86364b42011-09-20 23:28:55 +0000843bool
Johnny Chen01a67862011-10-14 00:42:25 +0000844Target::DisableAllWatchpoints (bool end_to_end)
Johnny Chen86364b42011-09-20 23:28:55 +0000845{
Greg Clayton5160ce52013-03-27 23:08:40 +0000846 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen86364b42011-09-20 23:28:55 +0000847 if (log)
848 log->Printf ("Target::%s\n", __FUNCTION__);
849
Johnny Chenedf50372011-09-23 21:21:43 +0000850 if (!end_to_end) {
Johnny Chen01a67862011-10-14 00:42:25 +0000851 m_watchpoint_list.SetEnabledAll(false);
Johnny Chenedf50372011-09-23 21:21:43 +0000852 return true;
853 }
854
855 // Otherwise, it's an end to end operation.
856
Johnny Chen86364b42011-09-20 23:28:55 +0000857 if (!ProcessIsValid())
858 return false;
859
Johnny Chen01a67862011-10-14 00:42:25 +0000860 size_t num_watchpoints = m_watchpoint_list.GetSize();
Johnny Chen86364b42011-09-20 23:28:55 +0000861 for (size_t i = 0; i < num_watchpoints; ++i)
862 {
Johnny Chen01a67862011-10-14 00:42:25 +0000863 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
864 if (!wp_sp)
Johnny Chen86364b42011-09-20 23:28:55 +0000865 return false;
866
Johnny Chen01a67862011-10-14 00:42:25 +0000867 Error rc = m_process_sp->DisableWatchpoint(wp_sp.get());
Johnny Chen86364b42011-09-20 23:28:55 +0000868 if (rc.Fail())
869 return false;
870 }
Johnny Chen86364b42011-09-20 23:28:55 +0000871 return true; // Success!
872}
873
Johnny Chen01a67862011-10-14 00:42:25 +0000874// Assumption: Caller holds the list mutex lock for m_watchpoint_list for end to
875// end operations.
Johnny Chen86364b42011-09-20 23:28:55 +0000876bool
Johnny Chen01a67862011-10-14 00:42:25 +0000877Target::EnableAllWatchpoints (bool end_to_end)
Johnny Chen86364b42011-09-20 23:28:55 +0000878{
Greg Clayton5160ce52013-03-27 23:08:40 +0000879 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen86364b42011-09-20 23:28:55 +0000880 if (log)
881 log->Printf ("Target::%s\n", __FUNCTION__);
882
Johnny Chenedf50372011-09-23 21:21:43 +0000883 if (!end_to_end) {
Johnny Chen01a67862011-10-14 00:42:25 +0000884 m_watchpoint_list.SetEnabledAll(true);
Johnny Chenedf50372011-09-23 21:21:43 +0000885 return true;
886 }
887
888 // Otherwise, it's an end to end operation.
889
Johnny Chen86364b42011-09-20 23:28:55 +0000890 if (!ProcessIsValid())
891 return false;
892
Johnny Chen01a67862011-10-14 00:42:25 +0000893 size_t num_watchpoints = m_watchpoint_list.GetSize();
Johnny Chen86364b42011-09-20 23:28:55 +0000894 for (size_t i = 0; i < num_watchpoints; ++i)
895 {
Johnny Chen01a67862011-10-14 00:42:25 +0000896 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
897 if (!wp_sp)
Johnny Chen86364b42011-09-20 23:28:55 +0000898 return false;
899
Johnny Chen01a67862011-10-14 00:42:25 +0000900 Error rc = m_process_sp->EnableWatchpoint(wp_sp.get());
Johnny Chen86364b42011-09-20 23:28:55 +0000901 if (rc.Fail())
902 return false;
903 }
Johnny Chen86364b42011-09-20 23:28:55 +0000904 return true; // Success!
905}
906
Johnny Chena4d6bc92012-02-25 06:44:30 +0000907// Assumption: Caller holds the list mutex lock for m_watchpoint_list.
908bool
909Target::ClearAllWatchpointHitCounts ()
910{
Greg Clayton5160ce52013-03-27 23:08:40 +0000911 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chena4d6bc92012-02-25 06:44:30 +0000912 if (log)
913 log->Printf ("Target::%s\n", __FUNCTION__);
914
915 size_t num_watchpoints = m_watchpoint_list.GetSize();
916 for (size_t i = 0; i < num_watchpoints; ++i)
917 {
918 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
919 if (!wp_sp)
920 return false;
921
922 wp_sp->ResetHitCount();
923 }
924 return true; // Success!
925}
926
Enrico Granata5e3fe042015-02-11 00:37:54 +0000927// Assumption: Caller holds the list mutex lock for m_watchpoint_list.
928bool
929Target::ClearAllWatchpointHistoricValues ()
930{
931 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
932 if (log)
933 log->Printf ("Target::%s\n", __FUNCTION__);
934
935 size_t num_watchpoints = m_watchpoint_list.GetSize();
936 for (size_t i = 0; i < num_watchpoints; ++i)
937 {
938 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
939 if (!wp_sp)
940 return false;
941
942 wp_sp->ResetHistoricValues();
943 }
944 return true; // Success!
945}
946
Johnny Chen01a67862011-10-14 00:42:25 +0000947// Assumption: Caller holds the list mutex lock for m_watchpoint_list
Johnny Chen6cc60e82011-10-05 21:35:46 +0000948// during these operations.
949bool
Johnny Chen01a67862011-10-14 00:42:25 +0000950Target::IgnoreAllWatchpoints (uint32_t ignore_count)
Johnny Chen6cc60e82011-10-05 21:35:46 +0000951{
Greg Clayton5160ce52013-03-27 23:08:40 +0000952 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen6cc60e82011-10-05 21:35:46 +0000953 if (log)
954 log->Printf ("Target::%s\n", __FUNCTION__);
955
956 if (!ProcessIsValid())
957 return false;
958
Johnny Chen01a67862011-10-14 00:42:25 +0000959 size_t num_watchpoints = m_watchpoint_list.GetSize();
Johnny Chen6cc60e82011-10-05 21:35:46 +0000960 for (size_t i = 0; i < num_watchpoints; ++i)
961 {
Johnny Chen01a67862011-10-14 00:42:25 +0000962 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
963 if (!wp_sp)
Johnny Chen6cc60e82011-10-05 21:35:46 +0000964 return false;
965
Johnny Chen01a67862011-10-14 00:42:25 +0000966 wp_sp->SetIgnoreCount(ignore_count);
Johnny Chen6cc60e82011-10-05 21:35:46 +0000967 }
968 return true; // Success!
969}
970
Johnny Chen01a67862011-10-14 00:42:25 +0000971// Assumption: Caller holds the list mutex lock for m_watchpoint_list.
Johnny Chen86364b42011-09-20 23:28:55 +0000972bool
Johnny Chen01a67862011-10-14 00:42:25 +0000973Target::DisableWatchpointByID (lldb::watch_id_t watch_id)
Johnny Chen86364b42011-09-20 23:28:55 +0000974{
Greg Clayton5160ce52013-03-27 23:08:40 +0000975 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen86364b42011-09-20 23:28:55 +0000976 if (log)
977 log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
978
979 if (!ProcessIsValid())
980 return false;
981
Johnny Chen01a67862011-10-14 00:42:25 +0000982 WatchpointSP wp_sp = m_watchpoint_list.FindByID (watch_id);
983 if (wp_sp)
Johnny Chen86364b42011-09-20 23:28:55 +0000984 {
Johnny Chen01a67862011-10-14 00:42:25 +0000985 Error rc = m_process_sp->DisableWatchpoint(wp_sp.get());
Johnny Chenf04ee932011-09-22 18:04:58 +0000986 if (rc.Success())
987 return true;
Johnny Chen86364b42011-09-20 23:28:55 +0000988
Johnny Chenf04ee932011-09-22 18:04:58 +0000989 // Else, fallthrough.
Johnny Chen86364b42011-09-20 23:28:55 +0000990 }
991 return false;
992}
993
Johnny Chen01a67862011-10-14 00:42:25 +0000994// Assumption: Caller holds the list mutex lock for m_watchpoint_list.
Johnny Chen86364b42011-09-20 23:28:55 +0000995bool
Johnny Chen01a67862011-10-14 00:42:25 +0000996Target::EnableWatchpointByID (lldb::watch_id_t watch_id)
Johnny Chen86364b42011-09-20 23:28:55 +0000997{
Greg Clayton5160ce52013-03-27 23:08:40 +0000998 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen86364b42011-09-20 23:28:55 +0000999 if (log)
1000 log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
1001
1002 if (!ProcessIsValid())
1003 return false;
1004
Johnny Chen01a67862011-10-14 00:42:25 +00001005 WatchpointSP wp_sp = m_watchpoint_list.FindByID (watch_id);
1006 if (wp_sp)
Johnny Chen86364b42011-09-20 23:28:55 +00001007 {
Johnny Chen01a67862011-10-14 00:42:25 +00001008 Error rc = m_process_sp->EnableWatchpoint(wp_sp.get());
Johnny Chenf04ee932011-09-22 18:04:58 +00001009 if (rc.Success())
1010 return true;
Johnny Chen86364b42011-09-20 23:28:55 +00001011
Johnny Chenf04ee932011-09-22 18:04:58 +00001012 // Else, fallthrough.
Johnny Chen86364b42011-09-20 23:28:55 +00001013 }
1014 return false;
1015}
1016
Johnny Chen01a67862011-10-14 00:42:25 +00001017// Assumption: Caller holds the list mutex lock for m_watchpoint_list.
Johnny Chen86364b42011-09-20 23:28:55 +00001018bool
Johnny Chen01a67862011-10-14 00:42:25 +00001019Target::RemoveWatchpointByID (lldb::watch_id_t watch_id)
Johnny Chen86364b42011-09-20 23:28:55 +00001020{
Greg Clayton5160ce52013-03-27 23:08:40 +00001021 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen86364b42011-09-20 23:28:55 +00001022 if (log)
1023 log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
1024
Jim Inghamb0b45132013-07-02 02:09:46 +00001025 WatchpointSP watch_to_remove_sp = m_watchpoint_list.FindByID(watch_id);
1026 if (watch_to_remove_sp == m_last_created_watchpoint)
1027 m_last_created_watchpoint.reset();
1028
Johnny Chen01a67862011-10-14 00:42:25 +00001029 if (DisableWatchpointByID (watch_id))
Johnny Chen86364b42011-09-20 23:28:55 +00001030 {
Jim Ingham1b5792e2012-12-18 02:03:49 +00001031 m_watchpoint_list.Remove(watch_id, true);
Johnny Chen86364b42011-09-20 23:28:55 +00001032 return true;
1033 }
1034 return false;
1035}
1036
Johnny Chen01a67862011-10-14 00:42:25 +00001037// Assumption: Caller holds the list mutex lock for m_watchpoint_list.
Johnny Chen6cc60e82011-10-05 21:35:46 +00001038bool
Johnny Chen01a67862011-10-14 00:42:25 +00001039Target::IgnoreWatchpointByID (lldb::watch_id_t watch_id, uint32_t ignore_count)
Johnny Chen6cc60e82011-10-05 21:35:46 +00001040{
Greg Clayton5160ce52013-03-27 23:08:40 +00001041 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen6cc60e82011-10-05 21:35:46 +00001042 if (log)
1043 log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
1044
1045 if (!ProcessIsValid())
1046 return false;
1047
Johnny Chen01a67862011-10-14 00:42:25 +00001048 WatchpointSP wp_sp = m_watchpoint_list.FindByID (watch_id);
1049 if (wp_sp)
Johnny Chen6cc60e82011-10-05 21:35:46 +00001050 {
Johnny Chen01a67862011-10-14 00:42:25 +00001051 wp_sp->SetIgnoreCount(ignore_count);
Johnny Chen6cc60e82011-10-05 21:35:46 +00001052 return true;
1053 }
1054 return false;
1055}
1056
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001057ModuleSP
1058Target::GetExecutableModule ()
1059{
Greg Claytonaa149cb2011-08-11 02:48:45 +00001060 return m_images.GetModuleAtIndex(0);
1061}
1062
1063Module*
1064Target::GetExecutableModulePointer ()
1065{
1066 return m_images.GetModulePointerAtIndex(0);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001067}
1068
Enrico Granata17598482012-11-08 02:22:02 +00001069static void
1070LoadScriptingResourceForModule (const ModuleSP &module_sp, Target *target)
1071{
1072 Error error;
Enrico Granata97303392013-05-21 00:00:30 +00001073 StreamString feedback_stream;
1074 if (module_sp && !module_sp->LoadScriptingResourceInTarget(target, error, &feedback_stream))
Enrico Granata17598482012-11-08 02:22:02 +00001075 {
Enrico Granata97303392013-05-21 00:00:30 +00001076 if (error.AsCString())
Greg Clayton44d93782014-01-27 23:43:24 +00001077 target->GetDebugger().GetErrorFile()->Printf("unable to load scripting data for module %s - error reported was %s\n",
Enrico Granata97303392013-05-21 00:00:30 +00001078 module_sp->GetFileSpec().GetFileNameStrippingExtension().GetCString(),
1079 error.AsCString());
Enrico Granata17598482012-11-08 02:22:02 +00001080 }
Enrico Granatafe7295d2014-08-16 00:32:58 +00001081 if (feedback_stream.GetSize())
1082 target->GetDebugger().GetErrorFile()->Printf("%s\n",
1083 feedback_stream.GetData());
Enrico Granata17598482012-11-08 02:22:02 +00001084}
1085
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001086void
Greg Claytonb35db632013-11-09 00:03:31 +00001087Target::ClearModules(bool delete_locations)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001088{
Greg Claytonb35db632013-11-09 00:03:31 +00001089 ModulesDidUnload (m_images, delete_locations);
Greg Claytond5944cd2013-12-06 01:12:00 +00001090 m_section_load_history.Clear();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001091 m_images.Clear();
1092 m_scratch_ast_context_ap.reset();
Sean Callanan4bf80d52011-11-15 22:27:19 +00001093 m_scratch_ast_source_ap.reset();
Sean Callanan686b2312011-11-16 18:20:47 +00001094 m_ast_importer_ap.reset();
Greg Clayton095eeaa2013-11-05 23:28:00 +00001095}
1096
1097void
Greg Claytonb35db632013-11-09 00:03:31 +00001098Target::DidExec ()
1099{
1100 // When a process exec's we need to know about it so we can do some cleanup.
1101 m_breakpoint_list.RemoveInvalidLocations(m_arch);
1102 m_internal_breakpoint_list.RemoveInvalidLocations(m_arch);
1103}
1104
1105void
Greg Clayton095eeaa2013-11-05 23:28:00 +00001106Target::SetExecutableModule (ModuleSP& executable_sp, bool get_dependent_files)
1107{
1108 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TARGET));
Greg Claytonb35db632013-11-09 00:03:31 +00001109 ClearModules(false);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001110
1111 if (executable_sp.get())
1112 {
1113 Timer scoped_timer (__PRETTY_FUNCTION__,
Greg Claytonb5ad4ec2013-04-29 17:25:54 +00001114 "Target::SetExecutableModule (executable = '%s')",
1115 executable_sp->GetFileSpec().GetPath().c_str());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001116
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +00001117 m_images.Append(executable_sp); // The first image is our executable file
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001118
Jim Ingham5aee1622010-08-09 23:31:02 +00001119 // 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 +00001120 if (!m_arch.IsValid())
Jason Molendae1b68ad2012-12-05 00:25:49 +00001121 {
Greg Clayton32e0a752011-03-30 18:16:51 +00001122 m_arch = executable_sp->GetArchitecture();
Jason Molendae1b68ad2012-12-05 00:25:49 +00001123 if (log)
1124 log->Printf ("Target::SetExecutableModule setting architecture to %s (%s) based on executable file", m_arch.GetArchitectureName(), m_arch.GetTriple().getTriple().c_str());
1125 }
1126
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001127 FileSpecList dependent_files;
Greg Claytone996fd32011-03-08 22:40:15 +00001128 ObjectFile *executable_objfile = executable_sp->GetObjectFile();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001129
Greg Claytoncac9c5f2011-09-24 00:52:29 +00001130 if (executable_objfile && get_dependent_files)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001131 {
1132 executable_objfile->GetDependentModules(dependent_files);
1133 for (uint32_t i=0; i<dependent_files.GetSize(); i++)
1134 {
Greg Claytonded470d2011-03-19 01:12:21 +00001135 FileSpec dependent_file_spec (dependent_files.GetFileSpecPointerAtIndex(i));
1136 FileSpec platform_dependent_file_spec;
1137 if (m_platform_sp)
Steve Puccifc995722014-01-17 18:18:31 +00001138 m_platform_sp->GetFileWithUUID (dependent_file_spec, NULL, platform_dependent_file_spec);
Greg Claytonded470d2011-03-19 01:12:21 +00001139 else
1140 platform_dependent_file_spec = dependent_file_spec;
1141
Greg Claytonb9a01b32012-02-26 05:51:37 +00001142 ModuleSpec module_spec (platform_dependent_file_spec, m_arch);
1143 ModuleSP image_module_sp(GetSharedModule (module_spec));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001144 if (image_module_sp.get())
1145 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001146 ObjectFile *objfile = image_module_sp->GetObjectFile();
1147 if (objfile)
1148 objfile->GetDependentModules(dependent_files);
1149 }
1150 }
1151 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001152 }
1153}
1154
1155
Jim Ingham5aee1622010-08-09 23:31:02 +00001156bool
1157Target::SetArchitecture (const ArchSpec &arch_spec)
1158{
Greg Clayton5160ce52013-03-27 23:08:40 +00001159 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TARGET));
Sean Callananbf4b7be2012-12-13 22:07:14 +00001160 if (m_arch.IsCompatibleMatch(arch_spec) || !m_arch.IsValid())
Jim Ingham5aee1622010-08-09 23:31:02 +00001161 {
Greg Clayton70512312012-05-08 01:45:38 +00001162 // If we haven't got a valid arch spec, or the architectures are
1163 // compatible, so just update the architecture. Architectures can be
1164 // equal, yet the triple OS and vendor might change, so we need to do
1165 // the assignment here just in case.
Greg Clayton32e0a752011-03-30 18:16:51 +00001166 m_arch = arch_spec;
Jason Molendae1b68ad2012-12-05 00:25:49 +00001167 if (log)
1168 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 +00001169 return true;
1170 }
1171 else
1172 {
1173 // If we have an executable file, try to reset the executable to the desired architecture
Jason Molendae1b68ad2012-12-05 00:25:49 +00001174 if (log)
Jason Molenda727e3922012-12-05 23:07:34 +00001175 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 +00001176 m_arch = arch_spec;
Jim Ingham5aee1622010-08-09 23:31:02 +00001177 ModuleSP executable_sp = GetExecutableModule ();
Greg Clayton095eeaa2013-11-05 23:28:00 +00001178
Greg Claytonb35db632013-11-09 00:03:31 +00001179 ClearModules(true);
Jim Ingham5aee1622010-08-09 23:31:02 +00001180 // Need to do something about unsetting breakpoints.
1181
1182 if (executable_sp)
1183 {
Jason Molendae1b68ad2012-12-05 00:25:49 +00001184 if (log)
1185 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 +00001186 ModuleSpec module_spec (executable_sp->GetFileSpec(), arch_spec);
1187 Error error = ModuleList::GetSharedModule (module_spec,
1188 executable_sp,
Greg Clayton6920b522012-08-22 18:39:03 +00001189 &GetExecutableSearchPaths(),
Greg Claytonb9a01b32012-02-26 05:51:37 +00001190 NULL,
1191 NULL);
Jim Ingham5aee1622010-08-09 23:31:02 +00001192
1193 if (!error.Fail() && executable_sp)
1194 {
1195 SetExecutableModule (executable_sp, true);
1196 return true;
1197 }
Jim Ingham5aee1622010-08-09 23:31:02 +00001198 }
1199 }
Greg Clayton70512312012-05-08 01:45:38 +00001200 return false;
Jim Ingham5aee1622010-08-09 23:31:02 +00001201}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001202
Tamas Berghammere9f4dfe2015-03-13 10:32:42 +00001203bool
1204Target::MergeArchitecture (const ArchSpec &arch_spec)
1205{
1206 if (arch_spec.IsValid())
1207 {
1208 if (m_arch.IsCompatibleMatch(arch_spec))
1209 {
1210 // The current target arch is compatible with "arch_spec", see if we
1211 // can improve our current architecture using bits from "arch_spec"
1212
1213 // Merge bits from arch_spec into "merged_arch" and set our architecture
1214 ArchSpec merged_arch (m_arch);
1215 merged_arch.MergeFrom (arch_spec);
1216 return SetArchitecture(merged_arch);
1217 }
1218 else
1219 {
1220 // The new architecture is different, we just need to replace it
1221 return SetArchitecture(arch_spec);
1222 }
1223 }
1224 return false;
1225}
1226
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001227void
Enrico Granataefe637d2012-11-08 19:16:03 +00001228Target::WillClearList (const ModuleList& module_list)
Enrico Granata17598482012-11-08 02:22:02 +00001229{
1230}
1231
1232void
Enrico Granataefe637d2012-11-08 19:16:03 +00001233Target::ModuleAdded (const ModuleList& module_list, const ModuleSP &module_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001234{
1235 // A module is being added to this target for the first time
Greg Clayton23f8c952014-03-24 23:10:19 +00001236 if (m_valid)
1237 {
1238 ModuleList my_module_list;
1239 my_module_list.Append(module_sp);
1240 LoadScriptingResourceForModule(module_sp, this);
1241 ModulesDidLoad (my_module_list);
1242 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001243}
1244
1245void
Enrico Granataefe637d2012-11-08 19:16:03 +00001246Target::ModuleRemoved (const ModuleList& module_list, const ModuleSP &module_sp)
Enrico Granata17598482012-11-08 02:22:02 +00001247{
1248 // A module is being added to this target for the first time
Greg Clayton23f8c952014-03-24 23:10:19 +00001249 if (m_valid)
1250 {
1251 ModuleList my_module_list;
1252 my_module_list.Append(module_sp);
1253 ModulesDidUnload (my_module_list, false);
1254 }
Enrico Granata17598482012-11-08 02:22:02 +00001255}
1256
1257void
Enrico Granataefe637d2012-11-08 19:16:03 +00001258Target::ModuleUpdated (const ModuleList& module_list, const ModuleSP &old_module_sp, const ModuleSP &new_module_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001259{
Jim Inghame716ae02011-08-03 01:00:06 +00001260 // A module is replacing an already added module
Greg Clayton23f8c952014-03-24 23:10:19 +00001261 if (m_valid)
1262 m_breakpoint_list.UpdateBreakpointsWhenModuleIsReplaced(old_module_sp, new_module_sp);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001263}
1264
1265void
1266Target::ModulesDidLoad (ModuleList &module_list)
1267{
Greg Clayton23f8c952014-03-24 23:10:19 +00001268 if (m_valid && module_list.GetSize())
Enrico Granata17598482012-11-08 02:22:02 +00001269 {
Greg Clayton095eeaa2013-11-05 23:28:00 +00001270 m_breakpoint_list.UpdateBreakpoints (module_list, true, false);
Jason Molendaeef51062013-11-05 03:57:19 +00001271 if (m_process_sp)
1272 {
Andrew MacPhersoneb4d0602014-03-13 09:37:02 +00001273 m_process_sp->ModulesDidLoad (module_list);
Jason Molendaeef51062013-11-05 03:57:19 +00001274 }
Ilia Keb2c19a2015-03-10 21:59:55 +00001275 BroadcastEvent (eBroadcastBitModulesLoaded, new TargetEventData (this->shared_from_this(), module_list));
Enrico Granata17598482012-11-08 02:22:02 +00001276 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001277}
1278
1279void
Enrico Granataf15ee4e2013-04-05 18:49:06 +00001280Target::SymbolsDidLoad (ModuleList &module_list)
1281{
Greg Clayton23f8c952014-03-24 23:10:19 +00001282 if (m_valid && module_list.GetSize())
Enrico Granataf15ee4e2013-04-05 18:49:06 +00001283 {
Jim Ingham31caf982013-06-04 23:01:35 +00001284 if (m_process_sp)
Enrico Granataf15ee4e2013-04-05 18:49:06 +00001285 {
Jim Ingham31caf982013-06-04 23:01:35 +00001286 LanguageRuntime* runtime = m_process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC);
1287 if (runtime)
1288 {
1289 ObjCLanguageRuntime *objc_runtime = (ObjCLanguageRuntime*)runtime;
1290 objc_runtime->SymbolsDidLoad(module_list);
1291 }
Enrico Granataf15ee4e2013-04-05 18:49:06 +00001292 }
Jim Ingham31caf982013-06-04 23:01:35 +00001293
Greg Clayton095eeaa2013-11-05 23:28:00 +00001294 m_breakpoint_list.UpdateBreakpoints (module_list, true, false);
Ilia Keb2c19a2015-03-10 21:59:55 +00001295 BroadcastEvent (eBroadcastBitSymbolsLoaded, new TargetEventData (this->shared_from_this(), module_list));
Enrico Granataf15ee4e2013-04-05 18:49:06 +00001296 }
Enrico Granataf15ee4e2013-04-05 18:49:06 +00001297}
1298
1299void
Greg Clayton095eeaa2013-11-05 23:28:00 +00001300Target::ModulesDidUnload (ModuleList &module_list, bool delete_locations)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001301{
Greg Clayton23f8c952014-03-24 23:10:19 +00001302 if (m_valid && module_list.GetSize())
Enrico Granata17598482012-11-08 02:22:02 +00001303 {
Greg Clayton8012cad2014-11-17 19:39:20 +00001304 UnloadModuleSections (module_list);
Greg Clayton095eeaa2013-11-05 23:28:00 +00001305 m_breakpoint_list.UpdateBreakpoints (module_list, false, delete_locations);
Ilia Keb2c19a2015-03-10 21:59:55 +00001306 BroadcastEvent (eBroadcastBitModulesUnloaded, new TargetEventData (this->shared_from_this(), module_list));
Enrico Granata17598482012-11-08 02:22:02 +00001307 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001308}
1309
Daniel Dunbarf9f70322011-10-31 22:50:37 +00001310bool
Jim Ingham33df7cd2014-12-06 01:28:03 +00001311Target::ModuleIsExcludedForUnconstrainedSearches (const FileSpec &module_file_spec)
Jim Inghamc6674fd2011-10-28 23:14:11 +00001312{
Greg Clayton67cc0632012-08-22 17:17:09 +00001313 if (GetBreakpointsConsultPlatformAvoidList())
Jim Inghamc6674fd2011-10-28 23:14:11 +00001314 {
1315 ModuleList matchingModules;
Greg Claytonb9a01b32012-02-26 05:51:37 +00001316 ModuleSpec module_spec (module_file_spec);
1317 size_t num_modules = GetImages().FindModules(module_spec, matchingModules);
Jim Inghamc6674fd2011-10-28 23:14:11 +00001318
1319 // If there is more than one module for this file spec, only return true if ALL the modules are on the
1320 // black list.
1321 if (num_modules > 0)
1322 {
Andy Gibbsa297a972013-06-19 19:04:53 +00001323 for (size_t i = 0; i < num_modules; i++)
Jim Inghamc6674fd2011-10-28 23:14:11 +00001324 {
Jim Ingham33df7cd2014-12-06 01:28:03 +00001325 if (!ModuleIsExcludedForUnconstrainedSearches (matchingModules.GetModuleAtIndex(i)))
Jim Inghamc6674fd2011-10-28 23:14:11 +00001326 return false;
1327 }
1328 return true;
1329 }
Jim Inghamc6674fd2011-10-28 23:14:11 +00001330 }
Greg Clayton67cc0632012-08-22 17:17:09 +00001331 return false;
Jim Inghamc6674fd2011-10-28 23:14:11 +00001332}
1333
Daniel Dunbarf9f70322011-10-31 22:50:37 +00001334bool
Jim Ingham33df7cd2014-12-06 01:28:03 +00001335Target::ModuleIsExcludedForUnconstrainedSearches (const lldb::ModuleSP &module_sp)
Jim Inghamc6674fd2011-10-28 23:14:11 +00001336{
Greg Clayton67cc0632012-08-22 17:17:09 +00001337 if (GetBreakpointsConsultPlatformAvoidList())
Jim Inghamc6674fd2011-10-28 23:14:11 +00001338 {
Greg Clayton67cc0632012-08-22 17:17:09 +00001339 if (m_platform_sp)
Jim Ingham33df7cd2014-12-06 01:28:03 +00001340 return m_platform_sp->ModuleIsExcludedForUnconstrainedSearches (*this, module_sp);
Jim Inghamc6674fd2011-10-28 23:14:11 +00001341 }
Greg Clayton67cc0632012-08-22 17:17:09 +00001342 return false;
Jim Inghamc6674fd2011-10-28 23:14:11 +00001343}
1344
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001345size_t
Greg Claytondb598232011-01-07 01:57:07 +00001346Target::ReadMemoryFromFileCache (const Address& addr, void *dst, size_t dst_len, Error &error)
1347{
Greg Claytone72dfb32012-02-24 01:59:29 +00001348 SectionSP section_sp (addr.GetSection());
1349 if (section_sp)
Greg Claytondb598232011-01-07 01:57:07 +00001350 {
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +00001351 // 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 +00001352 if (section_sp->IsEncrypted())
1353 {
Greg Clayton57f06302012-05-25 17:05:55 +00001354 error.SetErrorString("section is encrypted");
Jason Molenda216d91f2012-04-25 00:06:56 +00001355 return 0;
1356 }
Greg Claytone72dfb32012-02-24 01:59:29 +00001357 ModuleSP module_sp (section_sp->GetModule());
1358 if (module_sp)
Greg Claytondb598232011-01-07 01:57:07 +00001359 {
Greg Claytone72dfb32012-02-24 01:59:29 +00001360 ObjectFile *objfile = section_sp->GetModule()->GetObjectFile();
1361 if (objfile)
1362 {
1363 size_t bytes_read = objfile->ReadSectionData (section_sp.get(),
1364 addr.GetOffset(),
1365 dst,
1366 dst_len);
1367 if (bytes_read > 0)
1368 return bytes_read;
1369 else
1370 error.SetErrorStringWithFormat("error reading data from section %s", section_sp->GetName().GetCString());
1371 }
Greg Claytondb598232011-01-07 01:57:07 +00001372 else
Greg Claytone72dfb32012-02-24 01:59:29 +00001373 error.SetErrorString("address isn't from a object file");
Greg Claytondb598232011-01-07 01:57:07 +00001374 }
1375 else
Greg Claytone72dfb32012-02-24 01:59:29 +00001376 error.SetErrorString("address isn't in a module");
Greg Claytondb598232011-01-07 01:57:07 +00001377 }
1378 else
Greg Claytondb598232011-01-07 01:57:07 +00001379 error.SetErrorString("address doesn't contain a section that points to a section in a object file");
Greg Claytone72dfb32012-02-24 01:59:29 +00001380
Greg Claytondb598232011-01-07 01:57:07 +00001381 return 0;
1382}
1383
1384size_t
Enrico Granata9128ee22011-09-06 19:20:51 +00001385Target::ReadMemory (const Address& addr,
1386 bool prefer_file_cache,
1387 void *dst,
1388 size_t dst_len,
1389 Error &error,
1390 lldb::addr_t *load_addr_ptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001391{
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001392 error.Clear();
Greg Claytondb598232011-01-07 01:57:07 +00001393
Enrico Granata9128ee22011-09-06 19:20:51 +00001394 // if we end up reading this from process memory, we will fill this
1395 // with the actual load address
1396 if (load_addr_ptr)
1397 *load_addr_ptr = LLDB_INVALID_ADDRESS;
1398
Greg Claytondb598232011-01-07 01:57:07 +00001399 size_t bytes_read = 0;
Greg Claytonc749eb82011-07-11 05:12:02 +00001400
1401 addr_t load_addr = LLDB_INVALID_ADDRESS;
1402 addr_t file_addr = LLDB_INVALID_ADDRESS;
Greg Clayton357132e2011-03-26 19:14:58 +00001403 Address resolved_addr;
1404 if (!addr.IsSectionOffset())
Greg Claytondda4f7b2010-06-30 23:03:03 +00001405 {
Greg Claytond5944cd2013-12-06 01:12:00 +00001406 SectionLoadList &section_load_list = GetSectionLoadList();
1407 if (section_load_list.IsEmpty())
Greg Claytonc749eb82011-07-11 05:12:02 +00001408 {
Greg Claytond16e1e52011-07-12 17:06:17 +00001409 // No sections are loaded, so we must assume we are not running
1410 // yet and anything we are given is a file address.
1411 file_addr = addr.GetOffset(); // "addr" doesn't have a section, so its offset is the file address
1412 m_images.ResolveFileAddress (file_addr, resolved_addr);
Greg Claytonc749eb82011-07-11 05:12:02 +00001413 }
Greg Claytondda4f7b2010-06-30 23:03:03 +00001414 else
Greg Claytonc749eb82011-07-11 05:12:02 +00001415 {
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +00001416 // We have at least one section loaded. This can be because
Greg Claytond16e1e52011-07-12 17:06:17 +00001417 // we have manually loaded some sections with "target modules load ..."
1418 // or because we have have a live process that has sections loaded
1419 // through the dynamic loader
1420 load_addr = addr.GetOffset(); // "addr" doesn't have a section, so its offset is the load address
Greg Claytond5944cd2013-12-06 01:12:00 +00001421 section_load_list.ResolveLoadAddress (load_addr, resolved_addr);
Greg Claytonc749eb82011-07-11 05:12:02 +00001422 }
Greg Claytondda4f7b2010-06-30 23:03:03 +00001423 }
Greg Clayton357132e2011-03-26 19:14:58 +00001424 if (!resolved_addr.IsValid())
1425 resolved_addr = addr;
Greg Claytondda4f7b2010-06-30 23:03:03 +00001426
Greg Claytonc749eb82011-07-11 05:12:02 +00001427
Greg Claytondb598232011-01-07 01:57:07 +00001428 if (prefer_file_cache)
1429 {
1430 bytes_read = ReadMemoryFromFileCache (resolved_addr, dst, dst_len, error);
1431 if (bytes_read > 0)
1432 return bytes_read;
1433 }
Greg Claytondda4f7b2010-06-30 23:03:03 +00001434
Johnny Chen86364b42011-09-20 23:28:55 +00001435 if (ProcessIsValid())
Greg Claytondda4f7b2010-06-30 23:03:03 +00001436 {
Greg Claytonc749eb82011-07-11 05:12:02 +00001437 if (load_addr == LLDB_INVALID_ADDRESS)
1438 load_addr = resolved_addr.GetLoadAddress (this);
1439
Greg Claytondda4f7b2010-06-30 23:03:03 +00001440 if (load_addr == LLDB_INVALID_ADDRESS)
1441 {
Greg Claytone72dfb32012-02-24 01:59:29 +00001442 ModuleSP addr_module_sp (resolved_addr.GetModule());
1443 if (addr_module_sp && addr_module_sp->GetFileSpec())
Daniel Malead01b2952012-11-29 21:49:15 +00001444 error.SetErrorStringWithFormat("%s[0x%" PRIx64 "] can't be resolved, %s in not currently loaded",
Jim Ingham4af59612014-12-19 19:20:44 +00001445 addr_module_sp->GetFileSpec().GetFilename().AsCString("<Unknown>"),
Jason Molenda7e589a62011-09-20 00:26:08 +00001446 resolved_addr.GetFileAddress(),
Jim Ingham4af59612014-12-19 19:20:44 +00001447 addr_module_sp->GetFileSpec().GetFilename().AsCString("<Unknonw>"));
Greg Claytondda4f7b2010-06-30 23:03:03 +00001448 else
Daniel Malead01b2952012-11-29 21:49:15 +00001449 error.SetErrorStringWithFormat("0x%" PRIx64 " can't be resolved", resolved_addr.GetFileAddress());
Greg Claytondda4f7b2010-06-30 23:03:03 +00001450 }
1451 else
1452 {
Greg Claytondb598232011-01-07 01:57:07 +00001453 bytes_read = m_process_sp->ReadMemory(load_addr, dst, dst_len, error);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001454 if (bytes_read != dst_len)
1455 {
1456 if (error.Success())
1457 {
1458 if (bytes_read == 0)
Daniel Malead01b2952012-11-29 21:49:15 +00001459 error.SetErrorStringWithFormat("read memory from 0x%" PRIx64 " failed", load_addr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001460 else
Daniel Malead01b2952012-11-29 21:49:15 +00001461 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 +00001462 }
1463 }
Greg Claytondda4f7b2010-06-30 23:03:03 +00001464 if (bytes_read)
Enrico Granata9128ee22011-09-06 19:20:51 +00001465 {
1466 if (load_addr_ptr)
1467 *load_addr_ptr = load_addr;
Greg Claytondda4f7b2010-06-30 23:03:03 +00001468 return bytes_read;
Enrico Granata9128ee22011-09-06 19:20:51 +00001469 }
Greg Claytondda4f7b2010-06-30 23:03:03 +00001470 // If the address is not section offset we have an address that
1471 // doesn't resolve to any address in any currently loaded shared
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +00001472 // libraries and we failed to read memory so there isn't anything
Greg Claytondda4f7b2010-06-30 23:03:03 +00001473 // more we can do. If it is section offset, we might be able to
1474 // read cached memory from the object file.
1475 if (!resolved_addr.IsSectionOffset())
1476 return 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001477 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001478 }
Greg Claytondda4f7b2010-06-30 23:03:03 +00001479
Greg Claytonc749eb82011-07-11 05:12:02 +00001480 if (!prefer_file_cache && resolved_addr.IsSectionOffset())
Greg Claytondda4f7b2010-06-30 23:03:03 +00001481 {
Greg Claytondb598232011-01-07 01:57:07 +00001482 // If we didn't already try and read from the object file cache, then
1483 // try it after failing to read from the process.
1484 return ReadMemoryFromFileCache (resolved_addr, dst, dst_len, error);
Greg Claytondda4f7b2010-06-30 23:03:03 +00001485 }
1486 return 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001487}
1488
Greg Claytond16e1e52011-07-12 17:06:17 +00001489size_t
Enrico Granata6b4ddc62013-01-21 19:20:50 +00001490Target::ReadCStringFromMemory (const Address& addr, std::string &out_str, Error &error)
1491{
1492 char buf[256];
1493 out_str.clear();
1494 addr_t curr_addr = addr.GetLoadAddress(this);
1495 Address address(addr);
1496 while (1)
1497 {
1498 size_t length = ReadCStringFromMemory (address, buf, sizeof(buf), error);
1499 if (length == 0)
1500 break;
1501 out_str.append(buf, length);
1502 // If we got "length - 1" bytes, we didn't get the whole C string, we
1503 // need to read some more characters
1504 if (length == sizeof(buf) - 1)
1505 curr_addr += length;
1506 else
1507 break;
1508 address = Address(curr_addr);
1509 }
1510 return out_str.size();
1511}
1512
1513
1514size_t
1515Target::ReadCStringFromMemory (const Address& addr, char *dst, size_t dst_max_len, Error &result_error)
1516{
1517 size_t total_cstr_len = 0;
1518 if (dst && dst_max_len)
1519 {
1520 result_error.Clear();
1521 // NULL out everything just to be safe
1522 memset (dst, 0, dst_max_len);
1523 Error error;
1524 addr_t curr_addr = addr.GetLoadAddress(this);
1525 Address address(addr);
Jason Molendaf0340c92014-09-03 22:30:54 +00001526
1527 // We could call m_process_sp->GetMemoryCacheLineSize() but I don't
1528 // think this really needs to be tied to the memory cache subsystem's
1529 // cache line size, so leave this as a fixed constant.
Enrico Granata6b4ddc62013-01-21 19:20:50 +00001530 const size_t cache_line_size = 512;
Jason Molendaf0340c92014-09-03 22:30:54 +00001531
Enrico Granata6b4ddc62013-01-21 19:20:50 +00001532 size_t bytes_left = dst_max_len - 1;
1533 char *curr_dst = dst;
1534
1535 while (bytes_left > 0)
1536 {
1537 addr_t cache_line_bytes_left = cache_line_size - (curr_addr % cache_line_size);
1538 addr_t bytes_to_read = std::min<addr_t>(bytes_left, cache_line_bytes_left);
1539 size_t bytes_read = ReadMemory (address, false, curr_dst, bytes_to_read, error);
1540
1541 if (bytes_read == 0)
1542 {
1543 result_error = error;
1544 dst[total_cstr_len] = '\0';
1545 break;
1546 }
1547 const size_t len = strlen(curr_dst);
1548
1549 total_cstr_len += len;
1550
1551 if (len < bytes_to_read)
1552 break;
1553
1554 curr_dst += bytes_read;
1555 curr_addr += bytes_read;
1556 bytes_left -= bytes_read;
1557 address = Address(curr_addr);
1558 }
1559 }
1560 else
1561 {
1562 if (dst == NULL)
1563 result_error.SetErrorString("invalid arguments");
1564 else
1565 result_error.Clear();
1566 }
1567 return total_cstr_len;
1568}
1569
1570size_t
Greg Claytond16e1e52011-07-12 17:06:17 +00001571Target::ReadScalarIntegerFromMemory (const Address& addr,
1572 bool prefer_file_cache,
1573 uint32_t byte_size,
1574 bool is_signed,
1575 Scalar &scalar,
1576 Error &error)
1577{
1578 uint64_t uval;
1579
1580 if (byte_size <= sizeof(uval))
1581 {
1582 size_t bytes_read = ReadMemory (addr, prefer_file_cache, &uval, byte_size, error);
1583 if (bytes_read == byte_size)
1584 {
1585 DataExtractor data (&uval, sizeof(uval), m_arch.GetByteOrder(), m_arch.GetAddressByteSize());
Greg Claytonc7bece562013-01-25 18:06:21 +00001586 lldb::offset_t offset = 0;
Greg Claytond16e1e52011-07-12 17:06:17 +00001587 if (byte_size <= 4)
1588 scalar = data.GetMaxU32 (&offset, byte_size);
1589 else
1590 scalar = data.GetMaxU64 (&offset, byte_size);
1591
1592 if (is_signed)
1593 scalar.SignExtend(byte_size * 8);
1594 return bytes_read;
1595 }
1596 }
1597 else
1598 {
1599 error.SetErrorStringWithFormat ("byte size of %u is too large for integer scalar type", byte_size);
1600 }
1601 return 0;
1602}
1603
1604uint64_t
1605Target::ReadUnsignedIntegerFromMemory (const Address& addr,
1606 bool prefer_file_cache,
1607 size_t integer_byte_size,
1608 uint64_t fail_value,
1609 Error &error)
1610{
1611 Scalar scalar;
1612 if (ReadScalarIntegerFromMemory (addr,
1613 prefer_file_cache,
1614 integer_byte_size,
1615 false,
1616 scalar,
1617 error))
1618 return scalar.ULongLong(fail_value);
1619 return fail_value;
1620}
1621
1622bool
1623Target::ReadPointerFromMemory (const Address& addr,
1624 bool prefer_file_cache,
1625 Error &error,
1626 Address &pointer_addr)
1627{
1628 Scalar scalar;
1629 if (ReadScalarIntegerFromMemory (addr,
1630 prefer_file_cache,
1631 m_arch.GetAddressByteSize(),
1632 false,
1633 scalar,
1634 error))
1635 {
1636 addr_t pointer_vm_addr = scalar.ULongLong(LLDB_INVALID_ADDRESS);
1637 if (pointer_vm_addr != LLDB_INVALID_ADDRESS)
1638 {
Greg Claytond5944cd2013-12-06 01:12:00 +00001639 SectionLoadList &section_load_list = GetSectionLoadList();
1640 if (section_load_list.IsEmpty())
Greg Claytond16e1e52011-07-12 17:06:17 +00001641 {
1642 // No sections are loaded, so we must assume we are not running
1643 // yet and anything we are given is a file address.
1644 m_images.ResolveFileAddress (pointer_vm_addr, pointer_addr);
1645 }
1646 else
1647 {
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +00001648 // We have at least one section loaded. This can be because
Greg Claytond16e1e52011-07-12 17:06:17 +00001649 // we have manually loaded some sections with "target modules load ..."
1650 // or because we have have a live process that has sections loaded
1651 // through the dynamic loader
Greg Claytond5944cd2013-12-06 01:12:00 +00001652 section_load_list.ResolveLoadAddress (pointer_vm_addr, pointer_addr);
Greg Claytond16e1e52011-07-12 17:06:17 +00001653 }
1654 // We weren't able to resolve the pointer value, so just return
1655 // an address with no section
1656 if (!pointer_addr.IsValid())
1657 pointer_addr.SetOffset (pointer_vm_addr);
1658 return true;
1659
1660 }
1661 }
1662 return false;
1663}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001664
1665ModuleSP
Greg Claytonb9a01b32012-02-26 05:51:37 +00001666Target::GetSharedModule (const ModuleSpec &module_spec, Error *error_ptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001667{
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001668 ModuleSP module_sp;
1669
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001670 Error error;
1671
Jim Ingham4a94c912012-05-17 18:38:42 +00001672 // First see if we already have this module in our module list. If we do, then we're done, we don't need
1673 // to consult the shared modules list. But only do this if we are passed a UUID.
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001674
Jim Ingham4a94c912012-05-17 18:38:42 +00001675 if (module_spec.GetUUID().IsValid())
1676 module_sp = m_images.FindFirstModule(module_spec);
1677
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001678 if (!module_sp)
1679 {
Jim Ingham4a94c912012-05-17 18:38:42 +00001680 ModuleSP old_module_sp; // This will get filled in if we have a new version of the library
1681 bool did_create_module = false;
1682
1683 // If there are image search path entries, try to use them first to acquire a suitable image.
1684 if (m_image_search_paths.GetSize())
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001685 {
Jim Ingham4a94c912012-05-17 18:38:42 +00001686 ModuleSpec transformed_spec (module_spec);
1687 if (m_image_search_paths.RemapPath (module_spec.GetFileSpec().GetDirectory(), transformed_spec.GetFileSpec().GetDirectory()))
1688 {
1689 transformed_spec.GetFileSpec().GetFilename() = module_spec.GetFileSpec().GetFilename();
1690 error = ModuleList::GetSharedModule (transformed_spec,
1691 module_sp,
Greg Clayton6920b522012-08-22 18:39:03 +00001692 &GetExecutableSearchPaths(),
Jim Ingham4a94c912012-05-17 18:38:42 +00001693 &old_module_sp,
1694 &did_create_module);
1695 }
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001696 }
Jim Ingham4a94c912012-05-17 18:38:42 +00001697
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001698 if (!module_sp)
1699 {
Jim Ingham4a94c912012-05-17 18:38:42 +00001700 // If we have a UUID, we can check our global shared module list in case
1701 // we already have it. If we don't have a valid UUID, then we can't since
1702 // the path in "module_spec" will be a platform path, and we will need to
1703 // let the platform find that file. For example, we could be asking for
1704 // "/usr/lib/dyld" and if we do not have a UUID, we don't want to pick
1705 // the local copy of "/usr/lib/dyld" since our platform could be a remote
1706 // platform that has its own "/usr/lib/dyld" in an SDK or in a local file
1707 // cache.
1708 if (module_spec.GetUUID().IsValid())
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001709 {
Jim Ingham4a94c912012-05-17 18:38:42 +00001710 // We have a UUID, it is OK to check the global module list...
1711 error = ModuleList::GetSharedModule (module_spec,
1712 module_sp,
Greg Clayton6920b522012-08-22 18:39:03 +00001713 &GetExecutableSearchPaths(),
Greg Clayton67cc0632012-08-22 17:17:09 +00001714 &old_module_sp,
Jim Ingham4a94c912012-05-17 18:38:42 +00001715 &did_create_module);
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001716 }
Jim Ingham4a94c912012-05-17 18:38:42 +00001717
1718 if (!module_sp)
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001719 {
Jim Ingham4a94c912012-05-17 18:38:42 +00001720 // The platform is responsible for finding and caching an appropriate
1721 // module in the shared module cache.
1722 if (m_platform_sp)
1723 {
Tamas Berghammer7cb18bf2015-03-24 11:15:23 +00001724 error = m_platform_sp->GetSharedModule (module_spec,
1725 m_process_sp.get(),
1726 module_sp,
Greg Clayton6920b522012-08-22 18:39:03 +00001727 &GetExecutableSearchPaths(),
Greg Clayton67cc0632012-08-22 17:17:09 +00001728 &old_module_sp,
Jim Ingham4a94c912012-05-17 18:38:42 +00001729 &did_create_module);
1730 }
1731 else
1732 {
1733 error.SetErrorString("no platform is currently set");
1734 }
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001735 }
1736 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001737
Jim Ingham4a94c912012-05-17 18:38:42 +00001738 // We found a module that wasn't in our target list. Let's make sure that there wasn't an equivalent
1739 // module in the list already, and if there was, let's remove it.
1740 if (module_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001741 {
Greg Clayton50a24bd2012-11-29 22:16:27 +00001742 ObjectFile *objfile = module_sp->GetObjectFile();
1743 if (objfile)
Jim Ingham4a94c912012-05-17 18:38:42 +00001744 {
Greg Clayton50a24bd2012-11-29 22:16:27 +00001745 switch (objfile->GetType())
Jim Ingham4a94c912012-05-17 18:38:42 +00001746 {
Greg Clayton50a24bd2012-11-29 22:16:27 +00001747 case ObjectFile::eTypeCoreFile: /// A core file that has a checkpoint of a program's execution state
1748 case ObjectFile::eTypeExecutable: /// A normal executable
1749 case ObjectFile::eTypeDynamicLinker: /// The platform's dynamic linker executable
1750 case ObjectFile::eTypeObjectFile: /// An intermediate object file
1751 case ObjectFile::eTypeSharedLibrary: /// A shared library that can be used during execution
1752 break;
1753 case ObjectFile::eTypeDebugInfo: /// An object file that contains only debug information
1754 if (error_ptr)
1755 error_ptr->SetErrorString("debug info files aren't valid target modules, please specify an executable");
1756 return ModuleSP();
1757 case ObjectFile::eTypeStubLibrary: /// A library that can be linked against but not used for execution
1758 if (error_ptr)
1759 error_ptr->SetErrorString("stub libraries aren't valid target modules, please specify an executable");
1760 return ModuleSP();
1761 default:
1762 if (error_ptr)
1763 error_ptr->SetErrorString("unsupported file type, please specify an executable");
1764 return ModuleSP();
1765 }
1766 // GetSharedModule is not guaranteed to find the old shared module, for instance
1767 // in the common case where you pass in the UUID, it is only going to find the one
1768 // module matching the UUID. In fact, it has no good way to know what the "old module"
1769 // relevant to this target is, since there might be many copies of a module with this file spec
1770 // in various running debug sessions, but only one of them will belong to this target.
1771 // So let's remove the UUID from the module list, and look in the target's module list.
1772 // Only do this if there is SOMETHING else in the module spec...
1773 if (!old_module_sp)
1774 {
1775 if (module_spec.GetUUID().IsValid() && !module_spec.GetFileSpec().GetFilename().IsEmpty() && !module_spec.GetFileSpec().GetDirectory().IsEmpty())
Jim Ingham4a94c912012-05-17 18:38:42 +00001776 {
Greg Clayton50a24bd2012-11-29 22:16:27 +00001777 ModuleSpec module_spec_copy(module_spec.GetFileSpec());
1778 module_spec_copy.GetUUID().Clear();
1779
1780 ModuleList found_modules;
1781 size_t num_found = m_images.FindModules (module_spec_copy, found_modules);
1782 if (num_found == 1)
1783 {
1784 old_module_sp = found_modules.GetModuleAtIndex(0);
1785 }
Jim Ingham4a94c912012-05-17 18:38:42 +00001786 }
1787 }
Greg Clayton50a24bd2012-11-29 22:16:27 +00001788
1789 if (old_module_sp && m_images.GetIndexForModule (old_module_sp.get()) != LLDB_INVALID_INDEX32)
1790 {
1791 m_images.ReplaceModule(old_module_sp, module_sp);
1792 Module *old_module_ptr = old_module_sp.get();
1793 old_module_sp.reset();
1794 ModuleList::RemoveSharedModuleIfOrphaned (old_module_ptr);
1795 }
1796 else
1797 m_images.Append(module_sp);
Jim Ingham4a94c912012-05-17 18:38:42 +00001798 }
Greg Clayton86e70cb2014-04-07 23:50:17 +00001799 else
1800 module_sp.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001801 }
1802 }
1803 if (error_ptr)
1804 *error_ptr = error;
1805 return module_sp;
1806}
1807
1808
Greg Claytond9e416c2012-02-18 05:35:26 +00001809TargetSP
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001810Target::CalculateTarget ()
1811{
Greg Claytond9e416c2012-02-18 05:35:26 +00001812 return shared_from_this();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001813}
1814
Greg Claytond9e416c2012-02-18 05:35:26 +00001815ProcessSP
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001816Target::CalculateProcess ()
1817{
Greg Claytond9e416c2012-02-18 05:35:26 +00001818 return ProcessSP();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001819}
1820
Greg Claytond9e416c2012-02-18 05:35:26 +00001821ThreadSP
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001822Target::CalculateThread ()
1823{
Greg Claytond9e416c2012-02-18 05:35:26 +00001824 return ThreadSP();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001825}
1826
Jason Molendab57e4a12013-11-04 09:33:30 +00001827StackFrameSP
1828Target::CalculateStackFrame ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001829{
Jason Molendab57e4a12013-11-04 09:33:30 +00001830 return StackFrameSP();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001831}
1832
1833void
Greg Clayton0603aa92010-10-04 01:05:56 +00001834Target::CalculateExecutionContext (ExecutionContext &exe_ctx)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001835{
Greg Claytonc14ee322011-09-22 04:58:26 +00001836 exe_ctx.Clear();
1837 exe_ctx.SetTargetPtr(this);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001838}
1839
1840PathMappingList &
1841Target::GetImageSearchPathList ()
1842{
1843 return m_image_search_paths;
1844}
1845
1846void
1847Target::ImageSearchPathsChanged
1848(
1849 const PathMappingList &path_list,
1850 void *baton
1851)
1852{
1853 Target *target = (Target *)baton;
Greg Claytonaa149cb2011-08-11 02:48:45 +00001854 ModuleSP exe_module_sp (target->GetExecutableModule());
1855 if (exe_module_sp)
Greg Claytonaa149cb2011-08-11 02:48:45 +00001856 target->SetExecutableModule (exe_module_sp, true);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001857}
1858
1859ClangASTContext *
Johnny Chen60e2c6a2011-11-30 23:18:53 +00001860Target::GetScratchClangASTContext(bool create_on_demand)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001861{
Greg Clayton73da2442011-08-03 01:23:55 +00001862 // Now see if we know the target triple, and if so, create our scratch AST context:
Johnny Chen60e2c6a2011-11-30 23:18:53 +00001863 if (m_scratch_ast_context_ap.get() == NULL && m_arch.IsValid() && create_on_demand)
Sean Callanan4bf80d52011-11-15 22:27:19 +00001864 {
Greg Clayton73da2442011-08-03 01:23:55 +00001865 m_scratch_ast_context_ap.reset (new ClangASTContext(m_arch.GetTriple().str().c_str()));
Greg Claytone1cd1be2012-01-29 20:56:30 +00001866 m_scratch_ast_source_ap.reset (new ClangASTSource(shared_from_this()));
Sean Callanan4bf80d52011-11-15 22:27:19 +00001867 m_scratch_ast_source_ap->InstallASTContext(m_scratch_ast_context_ap->getASTContext());
Todd Fiala955fe6f2014-02-27 17:18:23 +00001868 llvm::IntrusiveRefCntPtr<clang::ExternalASTSource> proxy_ast_source(m_scratch_ast_source_ap->CreateProxy());
Sean Callanan4bf80d52011-11-15 22:27:19 +00001869 m_scratch_ast_context_ap->SetExternalSource(proxy_ast_source);
1870 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001871 return m_scratch_ast_context_ap.get();
1872}
Caroline Ticedaccaa92010-09-20 20:44:43 +00001873
Sean Callanan686b2312011-11-16 18:20:47 +00001874ClangASTImporter *
1875Target::GetClangASTImporter()
1876{
1877 ClangASTImporter *ast_importer = m_ast_importer_ap.get();
1878
1879 if (!ast_importer)
1880 {
1881 ast_importer = new ClangASTImporter();
1882 m_ast_importer_ap.reset(ast_importer);
1883 }
1884
1885 return ast_importer;
1886}
1887
Greg Clayton99d0faf2010-11-18 23:32:35 +00001888void
Caroline Tice20bd37f2011-03-10 22:14:10 +00001889Target::SettingsInitialize ()
Caroline Ticedaccaa92010-09-20 20:44:43 +00001890{
Greg Clayton6920b522012-08-22 18:39:03 +00001891 Process::SettingsInitialize ();
Greg Clayton99d0faf2010-11-18 23:32:35 +00001892}
Caroline Ticedaccaa92010-09-20 20:44:43 +00001893
Greg Clayton99d0faf2010-11-18 23:32:35 +00001894void
Caroline Tice20bd37f2011-03-10 22:14:10 +00001895Target::SettingsTerminate ()
Greg Clayton99d0faf2010-11-18 23:32:35 +00001896{
Greg Clayton6920b522012-08-22 18:39:03 +00001897 Process::SettingsTerminate ();
Greg Clayton99d0faf2010-11-18 23:32:35 +00001898}
Caroline Ticedaccaa92010-09-20 20:44:43 +00001899
Greg Claytonc859e2d2012-02-13 23:10:39 +00001900FileSpecList
1901Target::GetDefaultExecutableSearchPaths ()
1902{
Greg Clayton67cc0632012-08-22 17:17:09 +00001903 TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
1904 if (properties_sp)
1905 return properties_sp->GetExecutableSearchPaths();
Greg Claytonc859e2d2012-02-13 23:10:39 +00001906 return FileSpecList();
1907}
1908
Michael Sartaina7499c92013-07-01 19:45:50 +00001909FileSpecList
1910Target::GetDefaultDebugFileSearchPaths ()
1911{
1912 TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
1913 if (properties_sp)
1914 return properties_sp->GetDebugFileSearchPaths();
1915 return FileSpecList();
1916}
1917
Sean Callanan85054342015-04-03 15:39:47 +00001918FileSpecList
1919Target::GetDefaultClangModuleSearchPaths ()
1920{
1921 TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
1922 if (properties_sp)
1923 return properties_sp->GetClangModuleSearchPaths();
1924 return FileSpecList();
1925}
1926
Caroline Ticedaccaa92010-09-20 20:44:43 +00001927ArchSpec
1928Target::GetDefaultArchitecture ()
1929{
Greg Clayton67cc0632012-08-22 17:17:09 +00001930 TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
1931 if (properties_sp)
1932 return properties_sp->GetDefaultArchitecture();
Greg Clayton8910c902012-05-15 02:44:13 +00001933 return ArchSpec();
Caroline Ticedaccaa92010-09-20 20:44:43 +00001934}
1935
1936void
Greg Clayton67cc0632012-08-22 17:17:09 +00001937Target::SetDefaultArchitecture (const ArchSpec &arch)
Caroline Ticedaccaa92010-09-20 20:44:43 +00001938{
Greg Clayton67cc0632012-08-22 17:17:09 +00001939 TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
1940 if (properties_sp)
Jason Molendaa3f24b32012-12-12 02:23:56 +00001941 {
1942 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 +00001943 return properties_sp->SetDefaultArchitecture(arch);
Jason Molendaa3f24b32012-12-12 02:23:56 +00001944 }
Caroline Ticedaccaa92010-09-20 20:44:43 +00001945}
1946
Greg Clayton0603aa92010-10-04 01:05:56 +00001947Target *
1948Target::GetTargetFromContexts (const ExecutionContext *exe_ctx_ptr, const SymbolContext *sc_ptr)
1949{
1950 // The target can either exist in the "process" of ExecutionContext, or in
1951 // the "target_sp" member of SymbolContext. This accessor helper function
1952 // will get the target from one of these locations.
1953
1954 Target *target = NULL;
1955 if (sc_ptr != NULL)
1956 target = sc_ptr->target_sp.get();
Greg Claytonc14ee322011-09-22 04:58:26 +00001957 if (target == NULL && exe_ctx_ptr)
1958 target = exe_ctx_ptr->GetTargetPtr();
Greg Clayton0603aa92010-10-04 01:05:56 +00001959 return target;
1960}
1961
Jim Ingham1624a2d2014-05-05 02:26:40 +00001962ExpressionResults
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001963Target::EvaluateExpression
1964(
1965 const char *expr_cstr,
Jason Molendab57e4a12013-11-04 09:33:30 +00001966 StackFrame *frame,
Enrico Granata3372f582012-07-16 23:10:35 +00001967 lldb::ValueObjectSP &result_valobj_sp,
Enrico Granatad4439aa2012-09-05 20:41:26 +00001968 const EvaluateExpressionOptions& options
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001969)
1970{
Enrico Granata97fca502012-09-18 17:43:16 +00001971 result_valobj_sp.reset();
1972
Jim Ingham8646d3c2014-05-05 02:47:44 +00001973 ExpressionResults execution_results = eExpressionSetupError;
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001974
Greg Claytond1767f02011-12-08 02:13:16 +00001975 if (expr_cstr == NULL || expr_cstr[0] == '\0')
1976 return execution_results;
1977
Jim Ingham6026ca32011-05-12 02:06:14 +00001978 // We shouldn't run stop hooks in expressions.
1979 // Be sure to reset this if you return anywhere within this function.
1980 bool old_suppress_value = m_suppress_stop_hooks;
1981 m_suppress_stop_hooks = true;
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001982
1983 ExecutionContext exe_ctx;
Sean Callanan0bf0baf2013-01-12 02:04:23 +00001984
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001985 if (frame)
1986 {
1987 frame->CalculateExecutionContext(exe_ctx);
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001988 }
1989 else if (m_process_sp)
1990 {
1991 m_process_sp->CalculateExecutionContext(exe_ctx);
1992 }
1993 else
1994 {
1995 CalculateExecutionContext(exe_ctx);
1996 }
1997
Sean Callanan0bf0baf2013-01-12 02:04:23 +00001998 // Make sure we aren't just trying to see the value of a persistent
1999 // variable (something like "$0")
2000 lldb::ClangExpressionVariableSP persistent_var_sp;
2001 // Only check for persistent variables the expression starts with a '$'
2002 if (expr_cstr[0] == '$')
Zachary Turner32abc6e2015-03-03 19:23:09 +00002003 persistent_var_sp = m_persistent_variables->GetVariable (expr_cstr);
Sean Callanan0bf0baf2013-01-12 02:04:23 +00002004
2005 if (persistent_var_sp)
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00002006 {
Sean Callanan0bf0baf2013-01-12 02:04:23 +00002007 result_valobj_sp = persistent_var_sp->GetValueObject ();
Jim Ingham8646d3c2014-05-05 02:47:44 +00002008 execution_results = eExpressionCompleted;
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00002009 }
2010 else
2011 {
Sean Callanan0bf0baf2013-01-12 02:04:23 +00002012 const char *prefix = GetExpressionPrefixContentsAsCString();
Greg Clayton62afb9f2013-11-04 19:35:17 +00002013 Error error;
Sean Callanan0bf0baf2013-01-12 02:04:23 +00002014 execution_results = ClangUserExpression::Evaluate (exe_ctx,
Greg Clayton62afb9f2013-11-04 19:35:17 +00002015 options,
2016 expr_cstr,
Sean Callanan0bf0baf2013-01-12 02:04:23 +00002017 prefix,
2018 result_valobj_sp,
Greg Clayton62afb9f2013-11-04 19:35:17 +00002019 error);
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00002020 }
Jim Ingham6026ca32011-05-12 02:06:14 +00002021
2022 m_suppress_stop_hooks = old_suppress_value;
2023
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00002024 return execution_results;
2025}
2026
Zachary Turner32abc6e2015-03-03 19:23:09 +00002027ClangPersistentVariables &
2028Target::GetPersistentVariables()
2029{
2030 return *m_persistent_variables;
2031}
2032
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002033lldb::addr_t
2034Target::GetCallableLoadAddress (lldb::addr_t load_addr, AddressClass addr_class) const
2035{
2036 addr_t code_addr = load_addr;
2037 switch (m_arch.GetMachine())
2038 {
2039 case llvm::Triple::arm:
2040 case llvm::Triple::thumb:
2041 switch (addr_class)
2042 {
2043 case eAddressClassData:
2044 case eAddressClassDebug:
2045 return LLDB_INVALID_ADDRESS;
2046
2047 case eAddressClassUnknown:
2048 case eAddressClassInvalid:
2049 case eAddressClassCode:
2050 case eAddressClassCodeAlternateISA:
2051 case eAddressClassRuntime:
2052 // Check if bit zero it no set?
2053 if ((code_addr & 1ull) == 0)
2054 {
2055 // Bit zero isn't set, check if the address is a multiple of 2?
2056 if (code_addr & 2ull)
2057 {
2058 // The address is a multiple of 2 so it must be thumb, set bit zero
2059 code_addr |= 1ull;
2060 }
2061 else if (addr_class == eAddressClassCodeAlternateISA)
2062 {
2063 // We checked the address and the address claims to be the alternate ISA
2064 // which means thumb, so set bit zero.
2065 code_addr |= 1ull;
2066 }
2067 }
2068 break;
2069 }
2070 break;
2071
2072 default:
2073 break;
2074 }
2075 return code_addr;
2076}
2077
2078lldb::addr_t
2079Target::GetOpcodeLoadAddress (lldb::addr_t load_addr, AddressClass addr_class) const
2080{
2081 addr_t opcode_addr = load_addr;
2082 switch (m_arch.GetMachine())
2083 {
2084 case llvm::Triple::arm:
2085 case llvm::Triple::thumb:
2086 switch (addr_class)
2087 {
2088 case eAddressClassData:
2089 case eAddressClassDebug:
2090 return LLDB_INVALID_ADDRESS;
2091
2092 case eAddressClassInvalid:
2093 case eAddressClassUnknown:
2094 case eAddressClassCode:
2095 case eAddressClassCodeAlternateISA:
2096 case eAddressClassRuntime:
2097 opcode_addr &= ~(1ull);
2098 break;
2099 }
2100 break;
2101
2102 default:
2103 break;
2104 }
2105 return opcode_addr;
2106}
2107
Greg Clayton9585fbf2013-03-19 00:20:55 +00002108SourceManager &
2109Target::GetSourceManager ()
2110{
2111 if (m_source_manager_ap.get() == NULL)
2112 m_source_manager_ap.reset (new SourceManager(shared_from_this()));
2113 return *m_source_manager_ap;
2114}
2115
Sean Callanan9998acd2014-12-05 01:21:59 +00002116ClangModulesDeclVendor *
2117Target::GetClangModulesDeclVendor ()
2118{
2119 static Mutex s_clang_modules_decl_vendor_mutex; // If this is contended we can make it per-target
2120
2121 {
2122 Mutex::Locker clang_modules_decl_vendor_locker(s_clang_modules_decl_vendor_mutex);
2123
2124 if (!m_clang_modules_decl_vendor_ap)
2125 {
2126 m_clang_modules_decl_vendor_ap.reset(ClangModulesDeclVendor::Create(*this));
2127 }
2128 }
2129
2130 return m_clang_modules_decl_vendor_ap.get();
2131}
Greg Clayton9585fbf2013-03-19 00:20:55 +00002132
Greg Clayton44d93782014-01-27 23:43:24 +00002133Target::StopHookSP
2134Target::CreateStopHook ()
Jim Ingham9575d842011-03-11 03:53:59 +00002135{
2136 lldb::user_id_t new_uid = ++m_stop_hook_next_id;
Greg Clayton44d93782014-01-27 23:43:24 +00002137 Target::StopHookSP stop_hook_sp (new StopHook(shared_from_this(), new_uid));
2138 m_stop_hooks[new_uid] = stop_hook_sp;
2139 return stop_hook_sp;
Jim Ingham9575d842011-03-11 03:53:59 +00002140}
2141
2142bool
2143Target::RemoveStopHookByID (lldb::user_id_t user_id)
2144{
2145 size_t num_removed;
2146 num_removed = m_stop_hooks.erase (user_id);
2147 if (num_removed == 0)
2148 return false;
2149 else
2150 return true;
2151}
2152
2153void
2154Target::RemoveAllStopHooks ()
2155{
2156 m_stop_hooks.clear();
2157}
2158
2159Target::StopHookSP
2160Target::GetStopHookByID (lldb::user_id_t user_id)
2161{
2162 StopHookSP found_hook;
2163
2164 StopHookCollection::iterator specified_hook_iter;
2165 specified_hook_iter = m_stop_hooks.find (user_id);
2166 if (specified_hook_iter != m_stop_hooks.end())
2167 found_hook = (*specified_hook_iter).second;
2168 return found_hook;
2169}
2170
2171bool
2172Target::SetStopHookActiveStateByID (lldb::user_id_t user_id, bool active_state)
2173{
2174 StopHookCollection::iterator specified_hook_iter;
2175 specified_hook_iter = m_stop_hooks.find (user_id);
2176 if (specified_hook_iter == m_stop_hooks.end())
2177 return false;
2178
2179 (*specified_hook_iter).second->SetIsActive (active_state);
2180 return true;
2181}
2182
2183void
2184Target::SetAllStopHooksActiveState (bool active_state)
2185{
2186 StopHookCollection::iterator pos, end = m_stop_hooks.end();
2187 for (pos = m_stop_hooks.begin(); pos != end; pos++)
2188 {
2189 (*pos).second->SetIsActive (active_state);
2190 }
2191}
2192
2193void
2194Target::RunStopHooks ()
2195{
Jim Ingham6026ca32011-05-12 02:06:14 +00002196 if (m_suppress_stop_hooks)
2197 return;
2198
Jim Ingham9575d842011-03-11 03:53:59 +00002199 if (!m_process_sp)
2200 return;
Enrico Granatae2e091b2012-08-03 22:24:48 +00002201
2202 // <rdar://problem/12027563> make sure we check that we are not stopped because of us running a user expression
2203 // since in that case we do not want to run the stop-hooks
2204 if (m_process_sp->GetModIDRef().IsLastResumeForUserExpression())
2205 return;
2206
Jim Ingham9575d842011-03-11 03:53:59 +00002207 if (m_stop_hooks.empty())
2208 return;
2209
2210 StopHookCollection::iterator pos, end = m_stop_hooks.end();
2211
2212 // If there aren't any active stop hooks, don't bother either:
2213 bool any_active_hooks = false;
2214 for (pos = m_stop_hooks.begin(); pos != end; pos++)
2215 {
2216 if ((*pos).second->IsActive())
2217 {
2218 any_active_hooks = true;
2219 break;
2220 }
2221 }
2222 if (!any_active_hooks)
2223 return;
2224
2225 CommandReturnObject result;
2226
2227 std::vector<ExecutionContext> exc_ctx_with_reasons;
2228 std::vector<SymbolContext> sym_ctx_with_reasons;
2229
2230 ThreadList &cur_threadlist = m_process_sp->GetThreadList();
2231 size_t num_threads = cur_threadlist.GetSize();
2232 for (size_t i = 0; i < num_threads; i++)
2233 {
2234 lldb::ThreadSP cur_thread_sp = cur_threadlist.GetThreadAtIndex (i);
2235 if (cur_thread_sp->ThreadStoppedForAReason())
2236 {
Jason Molendab57e4a12013-11-04 09:33:30 +00002237 lldb::StackFrameSP cur_frame_sp = cur_thread_sp->GetStackFrameAtIndex(0);
Jim Ingham9575d842011-03-11 03:53:59 +00002238 exc_ctx_with_reasons.push_back(ExecutionContext(m_process_sp.get(), cur_thread_sp.get(), cur_frame_sp.get()));
2239 sym_ctx_with_reasons.push_back(cur_frame_sp->GetSymbolContext(eSymbolContextEverything));
2240 }
2241 }
2242
2243 // If no threads stopped for a reason, don't run the stop-hooks.
2244 size_t num_exe_ctx = exc_ctx_with_reasons.size();
2245 if (num_exe_ctx == 0)
2246 return;
2247
Jim Ingham5b52f0c2011-06-02 23:58:26 +00002248 result.SetImmediateOutputStream (m_debugger.GetAsyncOutputStream());
2249 result.SetImmediateErrorStream (m_debugger.GetAsyncErrorStream());
Jim Ingham9575d842011-03-11 03:53:59 +00002250
2251 bool keep_going = true;
2252 bool hooks_ran = false;
Jim Ingham381e25b2011-03-22 01:47:27 +00002253 bool print_hook_header;
2254 bool print_thread_header;
2255
2256 if (num_exe_ctx == 1)
2257 print_thread_header = false;
2258 else
2259 print_thread_header = true;
2260
2261 if (m_stop_hooks.size() == 1)
2262 print_hook_header = false;
2263 else
2264 print_hook_header = true;
2265
Jim Ingham9575d842011-03-11 03:53:59 +00002266 for (pos = m_stop_hooks.begin(); keep_going && pos != end; pos++)
2267 {
2268 // result.Clear();
2269 StopHookSP cur_hook_sp = (*pos).second;
2270 if (!cur_hook_sp->IsActive())
2271 continue;
2272
2273 bool any_thread_matched = false;
2274 for (size_t i = 0; keep_going && i < num_exe_ctx; i++)
2275 {
2276 if ((cur_hook_sp->GetSpecifier () == NULL
2277 || cur_hook_sp->GetSpecifier()->SymbolContextMatches(sym_ctx_with_reasons[i]))
2278 && (cur_hook_sp->GetThreadSpecifier() == NULL
Jim Ingham3d902922012-03-07 22:03:04 +00002279 || cur_hook_sp->GetThreadSpecifier()->ThreadPassesBasicTests(exc_ctx_with_reasons[i].GetThreadRef())))
Jim Ingham9575d842011-03-11 03:53:59 +00002280 {
2281 if (!hooks_ran)
2282 {
Jim Ingham9575d842011-03-11 03:53:59 +00002283 hooks_ran = true;
2284 }
Jim Ingham381e25b2011-03-22 01:47:27 +00002285 if (print_hook_header && !any_thread_matched)
Jim Ingham9575d842011-03-11 03:53:59 +00002286 {
Johnny Chenaeab25c2011-10-24 23:01:06 +00002287 const char *cmd = (cur_hook_sp->GetCommands().GetSize() == 1 ?
2288 cur_hook_sp->GetCommands().GetStringAtIndex(0) :
2289 NULL);
2290 if (cmd)
Daniel Malead01b2952012-11-29 21:49:15 +00002291 result.AppendMessageWithFormat("\n- Hook %" PRIu64 " (%s)\n", cur_hook_sp->GetID(), cmd);
Johnny Chenaeab25c2011-10-24 23:01:06 +00002292 else
Daniel Malead01b2952012-11-29 21:49:15 +00002293 result.AppendMessageWithFormat("\n- Hook %" PRIu64 "\n", cur_hook_sp->GetID());
Jim Ingham9575d842011-03-11 03:53:59 +00002294 any_thread_matched = true;
2295 }
2296
Jim Ingham381e25b2011-03-22 01:47:27 +00002297 if (print_thread_header)
Greg Claytonc14ee322011-09-22 04:58:26 +00002298 result.AppendMessageWithFormat("-- Thread %d\n", exc_ctx_with_reasons[i].GetThreadPtr()->GetIndexID());
Jim Ingham26c7bf92014-10-11 00:38:27 +00002299
2300 CommandInterpreterRunOptions options;
2301 options.SetStopOnContinue (true);
2302 options.SetStopOnError (true);
2303 options.SetEchoCommands (false);
2304 options.SetPrintResults (true);
2305 options.SetAddToHistory (false);
2306
2307 GetDebugger().GetCommandInterpreter().HandleCommands (cur_hook_sp->GetCommands(),
2308 &exc_ctx_with_reasons[i],
2309 options,
Greg Clayton32e0a752011-03-30 18:16:51 +00002310 result);
Jim Ingham9575d842011-03-11 03:53:59 +00002311
2312 // If the command started the target going again, we should bag out of
2313 // running the stop hooks.
Greg Clayton32e0a752011-03-30 18:16:51 +00002314 if ((result.GetStatus() == eReturnStatusSuccessContinuingNoResult) ||
2315 (result.GetStatus() == eReturnStatusSuccessContinuingResult))
Jim Ingham9575d842011-03-11 03:53:59 +00002316 {
Daniel Malead01b2952012-11-29 21:49:15 +00002317 result.AppendMessageWithFormat ("Aborting stop hooks, hook %" PRIu64 " set the program running.", cur_hook_sp->GetID());
Jim Ingham9575d842011-03-11 03:53:59 +00002318 keep_going = false;
2319 }
2320 }
2321 }
2322 }
Jason Molenda879cf772011-09-23 00:42:55 +00002323
Caroline Tice969ed3d2011-05-02 20:41:46 +00002324 result.GetImmediateOutputStream()->Flush();
2325 result.GetImmediateErrorStream()->Flush();
Jim Ingham9575d842011-03-11 03:53:59 +00002326}
2327
Greg Claytonfbb76342013-11-20 21:07:01 +00002328const TargetPropertiesSP &
2329Target::GetGlobalProperties()
2330{
2331 static TargetPropertiesSP g_settings_sp;
2332 if (!g_settings_sp)
2333 {
2334 g_settings_sp.reset (new TargetProperties (NULL));
2335 }
2336 return g_settings_sp;
2337}
2338
2339Error
2340Target::Install (ProcessLaunchInfo *launch_info)
2341{
2342 Error error;
2343 PlatformSP platform_sp (GetPlatform());
2344 if (platform_sp)
2345 {
2346 if (platform_sp->IsRemote())
2347 {
2348 if (platform_sp->IsConnected())
2349 {
2350 // Install all files that have an install path, and always install the
2351 // main executable when connected to a remote platform
2352 const ModuleList& modules = GetImages();
2353 const size_t num_images = modules.GetSize();
2354 for (size_t idx = 0; idx < num_images; ++idx)
2355 {
2356 const bool is_main_executable = idx == 0;
2357 ModuleSP module_sp(modules.GetModuleAtIndex(idx));
2358 if (module_sp)
2359 {
2360 FileSpec local_file (module_sp->GetFileSpec());
2361 if (local_file)
2362 {
2363 FileSpec remote_file (module_sp->GetRemoteInstallFileSpec());
2364 if (!remote_file)
2365 {
2366 if (is_main_executable) // TODO: add setting for always installing main executable???
2367 {
2368 // Always install the main executable
2369 remote_file.GetDirectory() = platform_sp->GetWorkingDirectory();
2370 remote_file.GetFilename() = module_sp->GetFileSpec().GetFilename();
2371 }
2372 }
2373 if (remote_file)
2374 {
2375 error = platform_sp->Install(local_file, remote_file);
2376 if (error.Success())
2377 {
2378 module_sp->SetPlatformFileSpec(remote_file);
2379 if (is_main_executable)
2380 {
2381 if (launch_info)
2382 launch_info->SetExecutableFile(remote_file, false);
2383 }
2384 }
2385 else
2386 break;
2387 }
2388 }
2389 }
2390 }
2391 }
2392 }
2393 }
2394 return error;
2395}
Greg Clayton7b242382011-07-08 00:48:09 +00002396
Greg Claytond5944cd2013-12-06 01:12:00 +00002397bool
2398Target::ResolveLoadAddress (addr_t load_addr, Address &so_addr, uint32_t stop_id)
2399{
2400 return m_section_load_history.ResolveLoadAddress(stop_id, load_addr, so_addr);
2401}
2402
2403bool
Matthew Gardinerc928de32014-10-22 07:22:56 +00002404Target::ResolveFileAddress (lldb::addr_t file_addr, Address &resolved_addr)
2405{
2406 return m_images.ResolveFileAddress(file_addr, resolved_addr);
2407}
2408
2409bool
Greg Claytond5944cd2013-12-06 01:12:00 +00002410Target::SetSectionLoadAddress (const SectionSP &section_sp, addr_t new_section_load_addr, bool warn_multiple)
2411{
2412 const addr_t old_section_load_addr = m_section_load_history.GetSectionLoadAddress (SectionLoadHistory::eStopIDNow, section_sp);
2413 if (old_section_load_addr != new_section_load_addr)
2414 {
2415 uint32_t stop_id = 0;
2416 ProcessSP process_sp(GetProcessSP());
2417 if (process_sp)
2418 stop_id = process_sp->GetStopID();
2419 else
2420 stop_id = m_section_load_history.GetLastStopID();
2421 if (m_section_load_history.SetSectionLoadAddress (stop_id, section_sp, new_section_load_addr, warn_multiple))
2422 return true; // Return true if the section load address was changed...
2423 }
2424 return false; // Return false to indicate nothing changed
2425
2426}
2427
Greg Clayton8012cad2014-11-17 19:39:20 +00002428size_t
2429Target::UnloadModuleSections (const ModuleList &module_list)
2430{
2431 size_t section_unload_count = 0;
2432 size_t num_modules = module_list.GetSize();
2433 for (size_t i=0; i<num_modules; ++i)
2434 {
2435 section_unload_count += UnloadModuleSections (module_list.GetModuleAtIndex(i));
2436 }
2437 return section_unload_count;
2438}
2439
2440size_t
2441Target::UnloadModuleSections (const lldb::ModuleSP &module_sp)
2442{
2443 uint32_t stop_id = 0;
2444 ProcessSP process_sp(GetProcessSP());
2445 if (process_sp)
2446 stop_id = process_sp->GetStopID();
2447 else
2448 stop_id = m_section_load_history.GetLastStopID();
2449 SectionList *sections = module_sp->GetSectionList();
2450 size_t section_unload_count = 0;
2451 if (sections)
2452 {
2453 const uint32_t num_sections = sections->GetNumSections(0);
2454 for (uint32_t i = 0; i < num_sections; ++i)
2455 {
2456 section_unload_count += m_section_load_history.SetSectionUnloaded(stop_id, sections->GetSectionAtIndex(i));
2457 }
2458 }
2459 return section_unload_count;
2460}
2461
Greg Claytond5944cd2013-12-06 01:12:00 +00002462bool
2463Target::SetSectionUnloaded (const lldb::SectionSP &section_sp)
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);
2472}
2473
2474bool
2475Target::SetSectionUnloaded (const lldb::SectionSP &section_sp, addr_t load_addr)
2476{
2477 uint32_t stop_id = 0;
2478 ProcessSP process_sp(GetProcessSP());
2479 if (process_sp)
2480 stop_id = process_sp->GetStopID();
2481 else
2482 stop_id = m_section_load_history.GetLastStopID();
2483 return m_section_load_history.SetSectionUnloaded (stop_id, section_sp, load_addr);
2484}
2485
2486void
2487Target::ClearAllLoadedSections ()
2488{
2489 m_section_load_history.Clear();
2490}
2491
Greg Claytonb09c5382013-12-13 17:20:18 +00002492
2493Error
Greg Clayton8012cad2014-11-17 19:39:20 +00002494Target::Launch (ProcessLaunchInfo &launch_info, Stream *stream)
Greg Claytonb09c5382013-12-13 17:20:18 +00002495{
2496 Error error;
Todd Fialaac33cc92014-10-09 01:02:08 +00002497 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TARGET));
2498
2499 if (log)
2500 log->Printf ("Target::%s() called for %s", __FUNCTION__, launch_info.GetExecutableFile().GetPath().c_str ());
2501
Greg Claytonb09c5382013-12-13 17:20:18 +00002502 StateType state = eStateInvalid;
2503
Greg Clayton6b32f1e2013-12-18 02:06:45 +00002504 // Scope to temporarily get the process state in case someone has manually
2505 // remotely connected already to a process and we can skip the platform
2506 // launching.
2507 {
2508 ProcessSP process_sp (GetProcessSP());
2509
2510 if (process_sp)
Todd Fialaac33cc92014-10-09 01:02:08 +00002511 {
Greg Clayton6b32f1e2013-12-18 02:06:45 +00002512 state = process_sp->GetState();
Todd Fialaac33cc92014-10-09 01:02:08 +00002513 if (log)
2514 log->Printf ("Target::%s the process exists, and its current state is %s", __FUNCTION__, StateAsCString (state));
2515 }
2516 else
2517 {
2518 if (log)
2519 log->Printf ("Target::%s the process instance doesn't currently exist.", __FUNCTION__);
2520 }
Greg Clayton6b32f1e2013-12-18 02:06:45 +00002521 }
2522
Greg Claytonb09c5382013-12-13 17:20:18 +00002523 launch_info.GetFlags().Set (eLaunchFlagDebug);
2524
2525 // Get the value of synchronous execution here. If you wait till after you have started to
2526 // run, then you could have hit a breakpoint, whose command might switch the value, and
2527 // then you'll pick up that incorrect value.
2528 Debugger &debugger = GetDebugger();
2529 const bool synchronous_execution = debugger.GetCommandInterpreter().GetSynchronous ();
2530
2531 PlatformSP platform_sp (GetPlatform());
2532
2533 // Finalize the file actions, and if none were given, default to opening
2534 // up a pseudo terminal
2535 const bool default_to_use_pty = platform_sp ? platform_sp->IsHost() : false;
Todd Fiala75f47c32014-10-11 21:42:09 +00002536 if (log)
2537 log->Printf ("Target::%s have platform=%s, platform_sp->IsHost()=%s, default_to_use_pty=%s",
2538 __FUNCTION__,
2539 platform_sp ? "true" : "false",
2540 platform_sp ? (platform_sp->IsHost () ? "true" : "false") : "n/a",
2541 default_to_use_pty ? "true" : "false");
2542
Greg Claytonb09c5382013-12-13 17:20:18 +00002543 launch_info.FinalizeFileActions (this, default_to_use_pty);
2544
2545 if (state == eStateConnected)
2546 {
2547 if (launch_info.GetFlags().Test (eLaunchFlagLaunchInTTY))
2548 {
2549 error.SetErrorString("can't launch in tty when launching through a remote connection");
2550 return error;
2551 }
2552 }
2553
2554 if (!launch_info.GetArchitecture().IsValid())
2555 launch_info.GetArchitecture() = GetArchitecture();
Todd Fiala015d8182014-07-22 23:41:36 +00002556
2557 // 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 +00002558 if (state != eStateConnected && platform_sp && platform_sp->CanDebugProcess ())
2559 {
Todd Fialaac33cc92014-10-09 01:02:08 +00002560 if (log)
2561 log->Printf ("Target::%s asking the platform to debug the process", __FUNCTION__);
2562
Greg Claytonb09c5382013-12-13 17:20:18 +00002563 m_process_sp = GetPlatform()->DebugProcess (launch_info,
2564 debugger,
2565 this,
Greg Claytonb09c5382013-12-13 17:20:18 +00002566 error);
2567 }
2568 else
2569 {
Todd Fialaac33cc92014-10-09 01:02:08 +00002570 if (log)
2571 log->Printf ("Target::%s the platform doesn't know how to debug a process, getting a process plugin to do this for us.", __FUNCTION__);
2572
Greg Claytonb09c5382013-12-13 17:20:18 +00002573 if (state == eStateConnected)
2574 {
2575 assert(m_process_sp);
2576 }
2577 else
2578 {
Todd Fiala015d8182014-07-22 23:41:36 +00002579 // Use a Process plugin to construct the process.
Greg Claytonb09c5382013-12-13 17:20:18 +00002580 const char *plugin_name = launch_info.GetProcessPluginName();
Greg Clayton8012cad2014-11-17 19:39:20 +00002581 CreateProcess (launch_info.GetListenerForProcess(debugger), plugin_name, NULL);
Greg Claytonb09c5382013-12-13 17:20:18 +00002582 }
Todd Fiala015d8182014-07-22 23:41:36 +00002583
2584 // Since we didn't have a platform launch the process, launch it here.
Greg Claytonb09c5382013-12-13 17:20:18 +00002585 if (m_process_sp)
2586 error = m_process_sp->Launch (launch_info);
2587 }
2588
2589 if (!m_process_sp)
2590 {
2591 if (error.Success())
2592 error.SetErrorString("failed to launch or debug process");
2593 return error;
2594 }
2595
2596 if (error.Success())
2597 {
Ilia K064e69f2015-03-23 21:16:25 +00002598 if (synchronous_execution || launch_info.GetFlags().Test(eLaunchFlagStopAtEntry) == false)
Greg Claytonb09c5382013-12-13 17:20:18 +00002599 {
Ilia K064e69f2015-03-23 21:16:25 +00002600 EventSP event_sp;
Greg Clayton44d93782014-01-27 23:43:24 +00002601 ListenerSP hijack_listener_sp (launch_info.GetHijackListener());
Zachary Turnere6d213a2015-03-26 20:41:14 +00002602 if (!hijack_listener_sp)
2603 {
2604 hijack_listener_sp.reset(new Listener("lldb.Target.Launch.hijack"));
2605 launch_info.SetHijackListener(hijack_listener_sp);
2606 m_process_sp->HijackProcessEvents(hijack_listener_sp.get());
2607 }
Todd Fialaac33cc92014-10-09 01:02:08 +00002608
Ilia K064e69f2015-03-23 21:16:25 +00002609 StateType state = m_process_sp->WaitForProcessToStop (NULL, &event_sp, false, hijack_listener_sp.get(), NULL);
Greg Claytonb09c5382013-12-13 17:20:18 +00002610
2611 if (state == eStateStopped)
2612 {
Zachary Turnere6d213a2015-03-26 20:41:14 +00002613 if (!launch_info.GetFlags().Test(eLaunchFlagStopAtEntry))
Greg Claytonb09c5382013-12-13 17:20:18 +00002614 {
Zachary Turnere6d213a2015-03-26 20:41:14 +00002615 if (synchronous_execution)
Greg Claytonb09c5382013-12-13 17:20:18 +00002616 {
Zachary Turnere6d213a2015-03-26 20:41:14 +00002617 error = m_process_sp->PrivateResume();
2618 if (error.Success())
Greg Claytonb09c5382013-12-13 17:20:18 +00002619 {
Ilia K064e69f2015-03-23 21:16:25 +00002620 state = m_process_sp->WaitForProcessToStop (NULL, NULL, true, hijack_listener_sp.get(), stream);
2621 const bool must_be_alive = false; // eStateExited is ok, so this must be false
2622 if (!StateIsStoppedState(state, must_be_alive))
2623 {
2624 error.SetErrorStringWithFormat("process isn't stopped: %s", StateAsCString(state));
2625 }
Greg Claytonb09c5382013-12-13 17:20:18 +00002626 }
2627 }
Ilia K064e69f2015-03-23 21:16:25 +00002628 else
2629 {
Zachary Turnere6d213a2015-03-26 20:41:14 +00002630 m_process_sp->RestoreProcessEvents();
2631 error = m_process_sp->PrivateResume();
2632 if (error.Success())
2633 {
2634 // there is a race condition where this thread will return up the call stack to the main command
2635 // handler and show an (lldb) prompt before HandlePrivateEvent (from PrivateStateThread) has
2636 // a chance to call PushProcessIOHandler()
2637 m_process_sp->SyncIOHandler(2000);
2638 }
2639 }
2640 if (!error.Success())
2641 {
Ilia K064e69f2015-03-23 21:16:25 +00002642 Error error2;
2643 error2.SetErrorStringWithFormat("process resume at entry point failed: %s", error.AsCString());
2644 error = error2;
2645 }
Greg Claytonb09c5382013-12-13 17:20:18 +00002646 }
2647 else
2648 {
Zachary Turnere6d213a2015-03-26 20:41:14 +00002649 assert(synchronous_execution && launch_info.GetFlags().Test(eLaunchFlagStopAtEntry));
Ilia K064e69f2015-03-23 21:16:25 +00002650
2651 // Target was stopped at entry as was intended. Need to notify the listeners about it.
2652 m_process_sp->RestoreProcessEvents();
2653 m_process_sp->HandlePrivateEvent(event_sp);
2654
2655 // there is a race condition where this thread will return up the call stack to the main command
2656 // handler and show an (lldb) prompt before HandlePrivateEvent (from PrivateStateThread) has
2657 // a chance to call PushProcessIOHandler()
2658 m_process_sp->SyncIOHandler(2000);
Greg Claytonb09c5382013-12-13 17:20:18 +00002659 }
2660 }
Greg Clayton40286e02014-04-30 20:29:09 +00002661 else if (state == eStateExited)
2662 {
Zachary Turner10687b02014-10-20 17:46:43 +00002663 bool with_shell = !!launch_info.GetShell();
Greg Clayton40286e02014-04-30 20:29:09 +00002664 const int exit_status = m_process_sp->GetExitStatus();
2665 const char *exit_desc = m_process_sp->GetExitDescription();
2666#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'."
2667 if (exit_desc && exit_desc[0])
2668 {
2669 if (with_shell)
2670 error.SetErrorStringWithFormat ("process exited with status %i (%s)" LAUNCH_SHELL_MESSAGE, exit_status, exit_desc);
2671 else
2672 error.SetErrorStringWithFormat ("process exited with status %i (%s)", exit_status, exit_desc);
2673 }
2674 else
2675 {
2676 if (with_shell)
2677 error.SetErrorStringWithFormat ("process exited with status %i" LAUNCH_SHELL_MESSAGE, exit_status);
2678 else
2679 error.SetErrorStringWithFormat ("process exited with status %i", exit_status);
2680 }
2681 }
Greg Claytonb09c5382013-12-13 17:20:18 +00002682 else
2683 {
2684 error.SetErrorStringWithFormat ("initial process state wasn't stopped: %s", StateAsCString(state));
2685 }
2686 }
Greg Clayton44d93782014-01-27 23:43:24 +00002687 m_process_sp->RestoreProcessEvents ();
Greg Claytonb09c5382013-12-13 17:20:18 +00002688 }
2689 else
2690 {
Greg Clayton44d93782014-01-27 23:43:24 +00002691 Error error2;
Greg Claytonb09c5382013-12-13 17:20:18 +00002692 error2.SetErrorStringWithFormat ("process launch failed: %s", error.AsCString());
Greg Clayton44d93782014-01-27 23:43:24 +00002693 error = error2;
Greg Claytonb09c5382013-12-13 17:20:18 +00002694 }
2695 return error;
2696}
Oleksiy Vyalov37386142015-02-10 22:49:57 +00002697
2698Error
2699Target::Attach (ProcessAttachInfo &attach_info, Stream *stream)
2700{
2701 auto state = eStateInvalid;
2702 auto process_sp = GetProcessSP ();
2703 if (process_sp)
2704 {
2705 state = process_sp->GetState ();
2706 if (process_sp->IsAlive () && state != eStateConnected)
2707 {
2708 if (state == eStateAttaching)
2709 return Error ("process attach is in progress");
2710 return Error ("a process is already being debugged");
2711 }
2712 }
2713
2714 ListenerSP hijack_listener_sp (new Listener ("lldb.Target.Attach.attach.hijack"));
2715 attach_info.SetHijackListener (hijack_listener_sp);
2716
2717 const ModuleSP old_exec_module_sp = GetExecutableModule ();
2718
2719 // If no process info was specified, then use the target executable
2720 // name as the process to attach to by default
2721 if (!attach_info.ProcessInfoSpecified ())
2722 {
2723 if (old_exec_module_sp)
2724 attach_info.GetExecutableFile ().GetFilename () = old_exec_module_sp->GetPlatformFileSpec ().GetFilename ();
2725
2726 if (!attach_info.ProcessInfoSpecified ())
2727 {
2728 return Error ("no process specified, create a target with a file, or specify the --pid or --name");
2729 }
2730 }
2731
2732 const auto platform_sp = GetDebugger ().GetPlatformList ().GetSelectedPlatform ();
2733
2734 Error error;
2735 if (state != eStateConnected && platform_sp != nullptr && platform_sp->CanDebugProcess ())
2736 {
2737 SetPlatform (platform_sp);
2738 process_sp = platform_sp->Attach (attach_info, GetDebugger (), this, error);
2739 }
2740 else
2741 {
2742 if (state != eStateConnected)
2743 {
2744 const char *plugin_name = attach_info.GetProcessPluginName ();
2745 process_sp = CreateProcess (attach_info.GetListenerForProcess (GetDebugger ()), plugin_name, nullptr);
2746 if (process_sp == nullptr)
2747 {
2748 error.SetErrorStringWithFormat ("failed to create process using plugin %s", (plugin_name) ? plugin_name : "null");
2749 return error;
2750 }
2751 }
2752 process_sp->HijackProcessEvents (hijack_listener_sp.get ());
2753 error = process_sp->Attach (attach_info);
2754 }
2755
2756 if (error.Success () && process_sp)
2757 {
2758 state = process_sp->WaitForProcessToStop (nullptr, nullptr, false, attach_info.GetHijackListener ().get (), stream);
2759 process_sp->RestoreProcessEvents ();
2760
2761 if (state != eStateStopped)
2762 {
2763 const char *exit_desc = process_sp->GetExitDescription ();
2764 if (exit_desc)
2765 error.SetErrorStringWithFormat ("attach failed: %s", exit_desc);
2766 else
2767 error.SetErrorString ("attach failed: process did not stop (no such process or permission problem?)");
Jason Molendaede31932015-04-17 05:01:58 +00002768 process_sp->Destroy (false);
Oleksiy Vyalov37386142015-02-10 22:49:57 +00002769 }
2770 }
2771 return error;
2772}
2773
Jim Ingham9575d842011-03-11 03:53:59 +00002774//--------------------------------------------------------------
Greg Claytonfbb76342013-11-20 21:07:01 +00002775// Target::StopHook
Jim Ingham9575d842011-03-11 03:53:59 +00002776//--------------------------------------------------------------
Jim Ingham9575d842011-03-11 03:53:59 +00002777Target::StopHook::StopHook (lldb::TargetSP target_sp, lldb::user_id_t uid) :
2778 UserID (uid),
2779 m_target_sp (target_sp),
Jim Ingham9575d842011-03-11 03:53:59 +00002780 m_commands (),
2781 m_specifier_sp (),
Greg Claytone01e07b2013-04-18 18:10:51 +00002782 m_thread_spec_ap(),
Stephen Wilson71c21d12011-04-11 19:41:40 +00002783 m_active (true)
Jim Ingham9575d842011-03-11 03:53:59 +00002784{
2785}
2786
2787Target::StopHook::StopHook (const StopHook &rhs) :
2788 UserID (rhs.GetID()),
2789 m_target_sp (rhs.m_target_sp),
2790 m_commands (rhs.m_commands),
2791 m_specifier_sp (rhs.m_specifier_sp),
Greg Claytone01e07b2013-04-18 18:10:51 +00002792 m_thread_spec_ap (),
Stephen Wilson71c21d12011-04-11 19:41:40 +00002793 m_active (rhs.m_active)
Jim Ingham9575d842011-03-11 03:53:59 +00002794{
2795 if (rhs.m_thread_spec_ap.get() != NULL)
2796 m_thread_spec_ap.reset (new ThreadSpec(*rhs.m_thread_spec_ap.get()));
2797}
2798
2799
2800Target::StopHook::~StopHook ()
2801{
2802}
2803
2804void
Zachary Turner32abc6e2015-03-03 19:23:09 +00002805Target::StopHook::SetSpecifier(SymbolContextSpecifier *specifier)
2806{
2807 m_specifier_sp.reset(specifier);
2808}
2809
2810void
Jim Ingham9575d842011-03-11 03:53:59 +00002811Target::StopHook::SetThreadSpecifier (ThreadSpec *specifier)
2812{
2813 m_thread_spec_ap.reset (specifier);
2814}
2815
2816
2817void
2818Target::StopHook::GetDescription (Stream *s, lldb::DescriptionLevel level) const
2819{
2820 int indent_level = s->GetIndentLevel();
2821
2822 s->SetIndentLevel(indent_level + 2);
2823
Daniel Malead01b2952012-11-29 21:49:15 +00002824 s->Printf ("Hook: %" PRIu64 "\n", GetID());
Jim Ingham9575d842011-03-11 03:53:59 +00002825 if (m_active)
2826 s->Indent ("State: enabled\n");
2827 else
2828 s->Indent ("State: disabled\n");
2829
2830 if (m_specifier_sp)
2831 {
2832 s->Indent();
2833 s->PutCString ("Specifier:\n");
2834 s->SetIndentLevel (indent_level + 4);
2835 m_specifier_sp->GetDescription (s, level);
2836 s->SetIndentLevel (indent_level + 2);
2837 }
2838
2839 if (m_thread_spec_ap.get() != NULL)
2840 {
2841 StreamString tmp;
2842 s->Indent("Thread:\n");
2843 m_thread_spec_ap->GetDescription (&tmp, level);
2844 s->SetIndentLevel (indent_level + 4);
2845 s->Indent (tmp.GetData());
2846 s->PutCString ("\n");
2847 s->SetIndentLevel (indent_level + 2);
2848 }
2849
2850 s->Indent ("Commands: \n");
2851 s->SetIndentLevel (indent_level + 4);
2852 uint32_t num_commands = m_commands.GetSize();
2853 for (uint32_t i = 0; i < num_commands; i++)
2854 {
2855 s->Indent(m_commands.GetStringAtIndex(i));
2856 s->PutCString ("\n");
2857 }
2858 s->SetIndentLevel (indent_level);
2859}
2860
Greg Clayton67cc0632012-08-22 17:17:09 +00002861//--------------------------------------------------------------
2862// class TargetProperties
2863//--------------------------------------------------------------
2864
2865OptionEnumValueElement
2866lldb_private::g_dynamic_value_types[] =
Caroline Ticedaccaa92010-09-20 20:44:43 +00002867{
Greg Clayton67cc0632012-08-22 17:17:09 +00002868 { eNoDynamicValues, "no-dynamic-values", "Don't calculate the dynamic type of values"},
2869 { eDynamicCanRunTarget, "run-target", "Calculate the dynamic type of values even if you have to run the target."},
2870 { eDynamicDontRunTarget, "no-run-target", "Calculate the dynamic type of values, but don't run the target."},
2871 { 0, NULL, NULL }
2872};
Caroline Ticedaccaa92010-09-20 20:44:43 +00002873
Greg Clayton1f746072012-08-29 21:13:06 +00002874static OptionEnumValueElement
2875g_inline_breakpoint_enums[] =
2876{
2877 { 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."},
2878 { eInlineBreakpointsHeaders, "headers", "Only check for inline breakpoint locations when setting breakpoints in header files, but not when setting breakpoint in implementation source files (default)."},
2879 { eInlineBreakpointsAlways, "always", "Always look for inline breakpoint locations when setting file and line breakpoints (slower but most accurate)."},
2880 { 0, NULL, NULL }
2881};
2882
Jim Ingham0f063ba2013-03-02 00:26:47 +00002883typedef enum x86DisassemblyFlavor
2884{
2885 eX86DisFlavorDefault,
2886 eX86DisFlavorIntel,
2887 eX86DisFlavorATT
2888} x86DisassemblyFlavor;
2889
2890static OptionEnumValueElement
2891g_x86_dis_flavor_value_types[] =
2892{
2893 { eX86DisFlavorDefault, "default", "Disassembler default (currently att)."},
2894 { eX86DisFlavorIntel, "intel", "Intel disassembler flavor."},
2895 { eX86DisFlavorATT, "att", "AT&T disassembler flavor."},
2896 { 0, NULL, NULL }
2897};
2898
Enrico Granata397ddd52013-05-21 20:13:34 +00002899static OptionEnumValueElement
Daniel Malead79ae052013-08-07 21:54:09 +00002900g_hex_immediate_style_values[] =
2901{
2902 { Disassembler::eHexStyleC, "c", "C-style (0xffff)."},
2903 { Disassembler::eHexStyleAsm, "asm", "Asm-style (0ffffh)."},
2904 { 0, NULL, NULL }
2905};
2906
2907static OptionEnumValueElement
Enrico Granata397ddd52013-05-21 20:13:34 +00002908g_load_script_from_sym_file_values[] =
2909{
2910 { eLoadScriptFromSymFileTrue, "true", "Load debug scripts inside symbol files"},
2911 { eLoadScriptFromSymFileFalse, "false", "Do not load debug scripts inside symbol files."},
2912 { eLoadScriptFromSymFileWarn, "warn", "Warn about debug scripts inside symbol files but do not load them."},
2913 { 0, NULL, NULL }
2914};
2915
Greg Claytonfd814c52013-08-13 01:42:25 +00002916
2917static OptionEnumValueElement
2918g_memory_module_load_level_values[] =
2919{
Greg Clayton86eac942013-08-13 21:32:34 +00002920 { eMemoryModuleLoadLevelMinimal, "minimal" , "Load minimal information when loading modules from memory. Currently this setting loads sections only."},
Greg Claytonfd814c52013-08-13 01:42:25 +00002921 { eMemoryModuleLoadLevelPartial, "partial" , "Load partial information when loading modules from memory. Currently this setting loads sections and function bounds."},
2922 { eMemoryModuleLoadLevelComplete, "complete", "Load complete information when loading modules from memory. Currently this setting loads sections and all symbols."},
2923 { 0, NULL, NULL }
2924};
2925
Greg Clayton67cc0632012-08-22 17:17:09 +00002926static PropertyDefinition
2927g_properties[] =
Caroline Ticedaccaa92010-09-20 20:44:43 +00002928{
Greg Clayton67cc0632012-08-22 17:17:09 +00002929 { "default-arch" , OptionValue::eTypeArch , true , 0 , NULL, NULL, "Default architecture to choose, when there's a choice." },
2930 { "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 +00002931 { "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 +00002932 { "enable-synthetic-value" , OptionValue::eTypeBoolean , false, true , NULL, NULL, "Should synthetic values be used by default whenever available." },
2933 { "skip-prologue" , OptionValue::eTypeBoolean , false, true , NULL, NULL, "Skip function prologues when setting breakpoints by name." },
2934 { "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 "
2935 "where it exists on the current system. It consists of an array of duples, the first element of each duple is "
2936 "some part (starting at the root) of the path to the file when it was built, "
2937 "and the second is where the remainder of the original build hierarchy is rooted on the local system. "
2938 "Each element of the array is checked in order and the first one that results in a match wins." },
2939 { "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 +00002940 { "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 +00002941 { "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 +00002942 { "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 +00002943 { "max-children-count" , OptionValue::eTypeSInt64 , false, 256 , NULL, NULL, "Maximum number of children to expand in any level of depth." },
2944 { "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 +00002945 { "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 +00002946 { "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 +00002947 { "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." },
2948 { "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 +00002949 { "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." },
2950 { "inherit-env" , OptionValue::eTypeBoolean , false, true , NULL, NULL, "Inherit the environment from the process that is running LLDB." },
2951 { "input-path" , OptionValue::eTypeFileSpec , false, 0 , NULL, NULL, "The file/path to be used by the executable program for reading its standard input." },
2952 { "output-path" , OptionValue::eTypeFileSpec , false, 0 , NULL, NULL, "The file/path to be used by the executable program for writing its standard output." },
2953 { "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 +00002954 { "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 +00002955 { "disable-aslr" , OptionValue::eTypeBoolean , false, true , NULL, NULL, "Disable Address Space Layout Randomization (ASLR)" },
2956 { "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 +00002957 { "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 +00002958 "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. "
2959 "Usually this is limitted to breakpoint locations from inlined functions from header or other include files, or more accurately non-implementation source files. "
2960 "Sometimes code might #include implementation files and cause inlined breakpoint locations in inlined implementation files. "
Todd Fialaad6eee62014-09-24 19:59:13 +00002961 "Always checking for inlined breakpoint locations can be expensive (memory and time), so if you have a project with many headers "
2962 "and find that setting breakpoints is slow, then you can change this setting to headers. "
2963 "This setting allows you to control exactly which strategy is used when setting "
Greg Clayton1f746072012-08-29 21:13:06 +00002964 "file and line breakpoints." },
Jim Ingham0f063ba2013-03-02 00:26:47 +00002965 // 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.
2966 { "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 +00002967 { "use-hex-immediates" , OptionValue::eTypeBoolean , false, true, NULL, NULL, "Show immediates in disassembly as hexadecimal." },
2968 { "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 +00002969 { "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 +00002970 { "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 +00002971 { "memory-module-load-level" , OptionValue::eTypeEnum , false, eMemoryModuleLoadLevelComplete, NULL, g_memory_module_load_level_values,
2972 "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. "
2973 "This setting helps users control how much information gets loaded when loading modules from memory."
2974 "'complete' is the default value for this setting which will load all sections and symbols by reading them from memory (slowest, most accurate). "
2975 "'partial' will load sections and attempt to find function bounds without downloading the symbol table (faster, still accurate, missing symbol names). "
2976 "'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 +00002977 { "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 +00002978 { "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 +00002979 { "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 +00002980 { NULL , OptionValue::eTypeInvalid , false, 0 , NULL, NULL, NULL }
2981};
Enrico Granata560558e2015-02-11 02:35:39 +00002982
Greg Clayton67cc0632012-08-22 17:17:09 +00002983enum
Caroline Ticedaccaa92010-09-20 20:44:43 +00002984{
Greg Clayton67cc0632012-08-22 17:17:09 +00002985 ePropertyDefaultArch,
2986 ePropertyExprPrefix,
2987 ePropertyPreferDynamic,
2988 ePropertyEnableSynthetic,
2989 ePropertySkipPrologue,
2990 ePropertySourceMap,
2991 ePropertyExecutableSearchPaths,
Michael Sartaina7499c92013-07-01 19:45:50 +00002992 ePropertyDebugFileSearchPaths,
Sean Callanan85054342015-04-03 15:39:47 +00002993 ePropertyClangModuleSearchPaths,
Sean Callananf0c5aeb2015-04-20 16:31:29 +00002994 ePropertyAutoImportClangModules,
Greg Clayton67cc0632012-08-22 17:17:09 +00002995 ePropertyMaxChildrenCount,
2996 ePropertyMaxSummaryLength,
Enrico Granatad325bf92013-06-04 22:54:16 +00002997 ePropertyMaxMemReadSize,
Greg Clayton67cc0632012-08-22 17:17:09 +00002998 ePropertyBreakpointUseAvoidList,
Greg Clayton45392552012-10-17 22:57:12 +00002999 ePropertyArg0,
Greg Clayton67cc0632012-08-22 17:17:09 +00003000 ePropertyRunArgs,
3001 ePropertyEnvVars,
3002 ePropertyInheritEnv,
3003 ePropertyInputPath,
3004 ePropertyOutputPath,
3005 ePropertyErrorPath,
Jim Ingham106d0282014-06-25 02:32:56 +00003006 ePropertyDetachOnError,
Greg Clayton67cc0632012-08-22 17:17:09 +00003007 ePropertyDisableASLR,
Greg Clayton1f746072012-08-29 21:13:06 +00003008 ePropertyDisableSTDIO,
Jim Ingham0f063ba2013-03-02 00:26:47 +00003009 ePropertyInlineStrategy,
Jim Ingham17d023f2013-03-13 17:58:04 +00003010 ePropertyDisassemblyFlavor,
Daniel Malead79ae052013-08-07 21:54:09 +00003011 ePropertyUseHexImmediates,
3012 ePropertyHexImmediateStyle,
Enrico Granata2ea43cd2013-05-13 17:03:52 +00003013 ePropertyUseFastStepping,
Enrico Granata97303392013-05-21 00:00:30 +00003014 ePropertyLoadScriptFromSymbolFile,
Greg Claytonfb6621e2013-12-06 21:59:52 +00003015 ePropertyMemoryModuleLoadLevel,
Jason Molendaa4bea722014-02-14 05:06:49 +00003016 ePropertyDisplayExpressionsInCrashlogs,
Enrico Granata560558e2015-02-11 02:35:39 +00003017 ePropertyTrapHandlerNames,
3018 ePropertyDisplayRuntimeSupportValues
Greg Clayton67cc0632012-08-22 17:17:09 +00003019};
Caroline Ticedaccaa92010-09-20 20:44:43 +00003020
Caroline Ticedaccaa92010-09-20 20:44:43 +00003021
Greg Clayton67cc0632012-08-22 17:17:09 +00003022class TargetOptionValueProperties : public OptionValueProperties
Greg Claytonbfe5f3b2011-02-18 01:44:25 +00003023{
Greg Clayton67cc0632012-08-22 17:17:09 +00003024public:
3025 TargetOptionValueProperties (const ConstString &name) :
3026 OptionValueProperties (name),
3027 m_target (NULL),
3028 m_got_host_env (false)
Caroline Ticedaccaa92010-09-20 20:44:43 +00003029 {
Caroline Ticedaccaa92010-09-20 20:44:43 +00003030 }
Caroline Ticedaccaa92010-09-20 20:44:43 +00003031
Greg Clayton67cc0632012-08-22 17:17:09 +00003032 // This constructor is used when creating TargetOptionValueProperties when it
3033 // is part of a new lldb_private::Target instance. It will copy all current
3034 // global property values as needed
3035 TargetOptionValueProperties (Target *target, const TargetPropertiesSP &target_properties_sp) :
3036 OptionValueProperties(*target_properties_sp->GetValueProperties()),
3037 m_target (target),
3038 m_got_host_env (false)
Caroline Ticedaccaa92010-09-20 20:44:43 +00003039 {
Greg Clayton67cc0632012-08-22 17:17:09 +00003040 }
3041
3042 virtual const Property *
3043 GetPropertyAtIndex (const ExecutionContext *exe_ctx, bool will_modify, uint32_t idx) const
3044 {
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +00003045 // When getting the value for a key from the target options, we will always
Greg Clayton67cc0632012-08-22 17:17:09 +00003046 // try and grab the setting from the current target if there is one. Else we just
3047 // use the one from this instance.
3048 if (idx == ePropertyEnvVars)
3049 GetHostEnvironmentIfNeeded ();
3050
3051 if (exe_ctx)
3052 {
3053 Target *target = exe_ctx->GetTargetPtr();
3054 if (target)
3055 {
3056 TargetOptionValueProperties *target_properties = static_cast<TargetOptionValueProperties *>(target->GetValueProperties().get());
3057 if (this != target_properties)
3058 return target_properties->ProtectedGetPropertyAtIndex (idx);
3059 }
3060 }
3061 return ProtectedGetPropertyAtIndex (idx);
3062 }
Enrico Granata84a53df2013-05-20 22:29:23 +00003063
3064 lldb::TargetSP
3065 GetTargetSP ()
3066 {
3067 return m_target->shared_from_this();
3068 }
3069
Greg Clayton67cc0632012-08-22 17:17:09 +00003070protected:
3071
3072 void
3073 GetHostEnvironmentIfNeeded () const
3074 {
3075 if (!m_got_host_env)
3076 {
3077 if (m_target)
3078 {
3079 m_got_host_env = true;
3080 const uint32_t idx = ePropertyInheritEnv;
3081 if (GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0))
3082 {
3083 PlatformSP platform_sp (m_target->GetPlatform());
3084 if (platform_sp)
3085 {
3086 StringList env;
3087 if (platform_sp->GetEnvironment(env))
3088 {
3089 OptionValueDictionary *env_dict = GetPropertyAtIndexAsOptionValueDictionary (NULL, ePropertyEnvVars);
3090 if (env_dict)
3091 {
3092 const bool can_replace = false;
3093 const size_t envc = env.GetSize();
3094 for (size_t idx=0; idx<envc; idx++)
3095 {
3096 const char *env_entry = env.GetStringAtIndex (idx);
3097 if (env_entry)
3098 {
3099 const char *equal_pos = ::strchr(env_entry, '=');
3100 ConstString key;
3101 // It is ok to have environment variables with no values
3102 const char *value = NULL;
3103 if (equal_pos)
3104 {
3105 key.SetCStringWithLength(env_entry, equal_pos - env_entry);
3106 if (equal_pos[1])
3107 value = equal_pos + 1;
3108 }
3109 else
3110 {
3111 key.SetCString(env_entry);
3112 }
3113 // Don't allow existing keys to be replaced with ones we get from the platform environment
3114 env_dict->SetValueForKey(key, OptionValueSP(new OptionValueString(value)), can_replace);
3115 }
3116 }
3117 }
3118 }
3119 }
3120 }
3121 }
3122 }
3123 }
3124 Target *m_target;
3125 mutable bool m_got_host_env;
3126};
3127
Greg Claytonfbb76342013-11-20 21:07:01 +00003128//----------------------------------------------------------------------
3129// TargetProperties
3130//----------------------------------------------------------------------
Greg Clayton67cc0632012-08-22 17:17:09 +00003131TargetProperties::TargetProperties (Target *target) :
Ilia K8f37ca52015-02-13 14:31:06 +00003132 Properties (),
3133 m_launch_info ()
Greg Clayton67cc0632012-08-22 17:17:09 +00003134{
3135 if (target)
3136 {
3137 m_collection_sp.reset (new TargetOptionValueProperties(target, Target::GetGlobalProperties()));
Ilia K8f37ca52015-02-13 14:31:06 +00003138
3139 // Set callbacks to update launch_info whenever "settins set" updated any of these properties
3140 m_collection_sp->SetValueChangedCallback(ePropertyArg0, TargetProperties::Arg0ValueChangedCallback, this);
3141 m_collection_sp->SetValueChangedCallback(ePropertyRunArgs, TargetProperties::RunArgsValueChangedCallback, this);
3142 m_collection_sp->SetValueChangedCallback(ePropertyEnvVars, TargetProperties::EnvVarsValueChangedCallback, this);
3143 m_collection_sp->SetValueChangedCallback(ePropertyInputPath, TargetProperties::InputPathValueChangedCallback, this);
3144 m_collection_sp->SetValueChangedCallback(ePropertyOutputPath, TargetProperties::OutputPathValueChangedCallback, this);
3145 m_collection_sp->SetValueChangedCallback(ePropertyErrorPath, TargetProperties::ErrorPathValueChangedCallback, this);
3146 m_collection_sp->SetValueChangedCallback(ePropertyDetachOnError, TargetProperties::DetachOnErrorValueChangedCallback, this);
3147 m_collection_sp->SetValueChangedCallback(ePropertyDisableASLR, TargetProperties::DisableASLRValueChangedCallback, this);
3148 m_collection_sp->SetValueChangedCallback(ePropertyDisableSTDIO, TargetProperties::DisableSTDIOValueChangedCallback, this);
3149
3150 // Update m_launch_info once it was created
3151 Arg0ValueChangedCallback(this, NULL);
3152 RunArgsValueChangedCallback(this, NULL);
3153 //EnvVarsValueChangedCallback(this, NULL); // FIXME: cause segfault in Target::GetPlatform()
3154 InputPathValueChangedCallback(this, NULL);
3155 OutputPathValueChangedCallback(this, NULL);
3156 ErrorPathValueChangedCallback(this, NULL);
3157 DetachOnErrorValueChangedCallback(this, NULL);
3158 DisableASLRValueChangedCallback(this, NULL);
3159 DisableSTDIOValueChangedCallback(this, NULL);
Caroline Ticedaccaa92010-09-20 20:44:43 +00003160 }
3161 else
Greg Clayton67cc0632012-08-22 17:17:09 +00003162 {
3163 m_collection_sp.reset (new TargetOptionValueProperties(ConstString("target")));
3164 m_collection_sp->Initialize(g_properties);
3165 m_collection_sp->AppendProperty(ConstString("process"),
3166 ConstString("Settings specify to processes."),
3167 true,
3168 Process::GetGlobalProperties()->GetValueProperties());
3169 }
Ilia K8f37ca52015-02-13 14:31:06 +00003170
Caroline Ticedaccaa92010-09-20 20:44:43 +00003171}
3172
Greg Clayton67cc0632012-08-22 17:17:09 +00003173TargetProperties::~TargetProperties ()
3174{
3175}
3176ArchSpec
3177TargetProperties::GetDefaultArchitecture () const
3178{
3179 OptionValueArch *value = m_collection_sp->GetPropertyAtIndexAsOptionValueArch (NULL, ePropertyDefaultArch);
3180 if (value)
3181 return value->GetCurrentValue();
3182 return ArchSpec();
3183}
3184
3185void
3186TargetProperties::SetDefaultArchitecture (const ArchSpec& arch)
3187{
3188 OptionValueArch *value = m_collection_sp->GetPropertyAtIndexAsOptionValueArch (NULL, ePropertyDefaultArch);
3189 if (value)
3190 return value->SetCurrentValue(arch, true);
3191}
3192
3193lldb::DynamicValueType
3194TargetProperties::GetPreferDynamicValue() const
3195{
3196 const uint32_t idx = ePropertyPreferDynamic;
3197 return (lldb::DynamicValueType)m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value);
3198}
3199
3200bool
3201TargetProperties::GetDisableASLR () const
3202{
3203 const uint32_t idx = ePropertyDisableASLR;
3204 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3205}
3206
3207void
3208TargetProperties::SetDisableASLR (bool b)
3209{
3210 const uint32_t idx = ePropertyDisableASLR;
3211 m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b);
3212}
3213
3214bool
Jim Ingham106d0282014-06-25 02:32:56 +00003215TargetProperties::GetDetachOnError () const
3216{
3217 const uint32_t idx = ePropertyDetachOnError;
3218 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3219}
3220
3221void
3222TargetProperties::SetDetachOnError (bool b)
3223{
3224 const uint32_t idx = ePropertyDetachOnError;
3225 m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b);
3226}
3227
3228bool
Greg Clayton67cc0632012-08-22 17:17:09 +00003229TargetProperties::GetDisableSTDIO () const
3230{
3231 const uint32_t idx = ePropertyDisableSTDIO;
3232 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3233}
3234
3235void
3236TargetProperties::SetDisableSTDIO (bool b)
3237{
3238 const uint32_t idx = ePropertyDisableSTDIO;
3239 m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b);
3240}
3241
Jim Ingham0f063ba2013-03-02 00:26:47 +00003242const char *
3243TargetProperties::GetDisassemblyFlavor () const
3244{
3245 const uint32_t idx = ePropertyDisassemblyFlavor;
3246 const char *return_value;
3247
3248 x86DisassemblyFlavor flavor_value = (x86DisassemblyFlavor) m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value);
3249 return_value = g_x86_dis_flavor_value_types[flavor_value].string_value;
3250 return return_value;
3251}
3252
Greg Clayton1f746072012-08-29 21:13:06 +00003253InlineStrategy
3254TargetProperties::GetInlineStrategy () const
3255{
3256 const uint32_t idx = ePropertyInlineStrategy;
3257 return (InlineStrategy)m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value);
3258}
3259
Greg Clayton45392552012-10-17 22:57:12 +00003260const char *
3261TargetProperties::GetArg0 () const
3262{
3263 const uint32_t idx = ePropertyArg0;
3264 return m_collection_sp->GetPropertyAtIndexAsString (NULL, idx, NULL);
3265}
3266
3267void
3268TargetProperties::SetArg0 (const char *arg)
3269{
3270 const uint32_t idx = ePropertyArg0;
3271 m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, arg);
Greg Clayton896e0ec2015-03-26 00:15:24 +00003272 m_launch_info.SetArg0(arg);
Greg Clayton45392552012-10-17 22:57:12 +00003273}
3274
Greg Clayton67cc0632012-08-22 17:17:09 +00003275bool
3276TargetProperties::GetRunArguments (Args &args) const
3277{
3278 const uint32_t idx = ePropertyRunArgs;
3279 return m_collection_sp->GetPropertyAtIndexAsArgs (NULL, idx, args);
3280}
3281
3282void
3283TargetProperties::SetRunArguments (const Args &args)
3284{
3285 const uint32_t idx = ePropertyRunArgs;
3286 m_collection_sp->SetPropertyAtIndexFromArgs (NULL, idx, args);
Greg Clayton896e0ec2015-03-26 00:15:24 +00003287 m_launch_info.GetArguments() = args;
Greg Clayton67cc0632012-08-22 17:17:09 +00003288}
3289
3290size_t
3291TargetProperties::GetEnvironmentAsArgs (Args &env) const
3292{
3293 const uint32_t idx = ePropertyEnvVars;
3294 return m_collection_sp->GetPropertyAtIndexAsArgs (NULL, idx, env);
3295}
3296
Ilia K8f37ca52015-02-13 14:31:06 +00003297void
3298TargetProperties::SetEnvironmentFromArgs (const Args &env)
3299{
3300 const uint32_t idx = ePropertyEnvVars;
3301 m_collection_sp->SetPropertyAtIndexFromArgs (NULL, idx, env);
Greg Clayton896e0ec2015-03-26 00:15:24 +00003302 m_launch_info.GetEnvironmentEntries() = env;
Ilia K8f37ca52015-02-13 14:31:06 +00003303}
3304
Greg Clayton67cc0632012-08-22 17:17:09 +00003305bool
3306TargetProperties::GetSkipPrologue() const
3307{
3308 const uint32_t idx = ePropertySkipPrologue;
3309 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3310}
3311
3312PathMappingList &
3313TargetProperties::GetSourcePathMap () const
3314{
3315 const uint32_t idx = ePropertySourceMap;
3316 OptionValuePathMappings *option_value = m_collection_sp->GetPropertyAtIndexAsOptionValuePathMappings (NULL, false, idx);
3317 assert(option_value);
3318 return option_value->GetCurrentValue();
3319}
3320
3321FileSpecList &
Greg Clayton6920b522012-08-22 18:39:03 +00003322TargetProperties::GetExecutableSearchPaths ()
Greg Clayton67cc0632012-08-22 17:17:09 +00003323{
3324 const uint32_t idx = ePropertyExecutableSearchPaths;
3325 OptionValueFileSpecList *option_value = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList (NULL, false, idx);
3326 assert(option_value);
3327 return option_value->GetCurrentValue();
3328}
3329
Michael Sartaina7499c92013-07-01 19:45:50 +00003330FileSpecList &
3331TargetProperties::GetDebugFileSearchPaths ()
3332{
3333 const uint32_t idx = ePropertyDebugFileSearchPaths;
3334 OptionValueFileSpecList *option_value = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList (NULL, false, idx);
3335 assert(option_value);
3336 return option_value->GetCurrentValue();
3337}
3338
Sean Callanan85054342015-04-03 15:39:47 +00003339FileSpecList &
3340TargetProperties::GetClangModuleSearchPaths ()
3341{
3342 const uint32_t idx = ePropertyClangModuleSearchPaths;
3343 OptionValueFileSpecList *option_value = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList (NULL, false, idx);
3344 assert(option_value);
3345 return option_value->GetCurrentValue();
3346}
3347
Greg Clayton67cc0632012-08-22 17:17:09 +00003348bool
Sean Callananf0c5aeb2015-04-20 16:31:29 +00003349TargetProperties::GetEnableAutoImportClangModules() const
3350{
3351 const uint32_t idx = ePropertyAutoImportClangModules;
3352 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3353}
3354
3355bool
Greg Clayton67cc0632012-08-22 17:17:09 +00003356TargetProperties::GetEnableSyntheticValue () const
3357{
3358 const uint32_t idx = ePropertyEnableSynthetic;
3359 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3360}
3361
3362uint32_t
3363TargetProperties::GetMaximumNumberOfChildrenToDisplay() const
3364{
3365 const uint32_t idx = ePropertyMaxChildrenCount;
3366 return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value);
3367}
3368
3369uint32_t
3370TargetProperties::GetMaximumSizeOfStringSummary() const
3371{
3372 const uint32_t idx = ePropertyMaxSummaryLength;
3373 return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value);
3374}
3375
Enrico Granatad325bf92013-06-04 22:54:16 +00003376uint32_t
3377TargetProperties::GetMaximumMemReadSize () const
3378{
3379 const uint32_t idx = ePropertyMaxMemReadSize;
3380 return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value);
3381}
3382
Greg Clayton67cc0632012-08-22 17:17:09 +00003383FileSpec
3384TargetProperties::GetStandardInputPath () const
3385{
3386 const uint32_t idx = ePropertyInputPath;
3387 return m_collection_sp->GetPropertyAtIndexAsFileSpec (NULL, idx);
3388}
3389
3390void
3391TargetProperties::SetStandardInputPath (const char *p)
3392{
3393 const uint32_t idx = ePropertyInputPath;
3394 m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, p);
3395}
3396
3397FileSpec
3398TargetProperties::GetStandardOutputPath () const
3399{
3400 const uint32_t idx = ePropertyOutputPath;
3401 return m_collection_sp->GetPropertyAtIndexAsFileSpec (NULL, idx);
3402}
3403
3404void
3405TargetProperties::SetStandardOutputPath (const char *p)
3406{
3407 const uint32_t idx = ePropertyOutputPath;
3408 m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, p);
3409}
3410
3411FileSpec
3412TargetProperties::GetStandardErrorPath () const
3413{
3414 const uint32_t idx = ePropertyErrorPath;
3415 return m_collection_sp->GetPropertyAtIndexAsFileSpec(NULL, idx);
3416}
3417
Greg Clayton6920b522012-08-22 18:39:03 +00003418const char *
3419TargetProperties::GetExpressionPrefixContentsAsCString ()
3420{
3421 const uint32_t idx = ePropertyExprPrefix;
3422 OptionValueFileSpec *file = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpec (NULL, false, idx);
3423 if (file)
Jim Ingham1e4f4252012-08-22 21:21:16 +00003424 {
Greg Clayton0b0b5122012-08-30 18:15:10 +00003425 const bool null_terminate = true;
3426 DataBufferSP data_sp(file->GetFileContents(null_terminate));
Jim Ingham1e4f4252012-08-22 21:21:16 +00003427 if (data_sp)
3428 return (const char *) data_sp->GetBytes();
3429 }
Greg Clayton6920b522012-08-22 18:39:03 +00003430 return NULL;
3431}
3432
Greg Clayton67cc0632012-08-22 17:17:09 +00003433void
3434TargetProperties::SetStandardErrorPath (const char *p)
3435{
3436 const uint32_t idx = ePropertyErrorPath;
3437 m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, p);
3438}
3439
3440bool
3441TargetProperties::GetBreakpointsConsultPlatformAvoidList ()
3442{
3443 const uint32_t idx = ePropertyBreakpointUseAvoidList;
3444 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3445}
3446
Jim Ingham17d023f2013-03-13 17:58:04 +00003447bool
Daniel Malead79ae052013-08-07 21:54:09 +00003448TargetProperties::GetUseHexImmediates () const
3449{
3450 const uint32_t idx = ePropertyUseHexImmediates;
3451 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3452}
3453
3454bool
Jim Ingham17d023f2013-03-13 17:58:04 +00003455TargetProperties::GetUseFastStepping () const
3456{
3457 const uint32_t idx = ePropertyUseFastStepping;
3458 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3459}
3460
Greg Claytonfb6621e2013-12-06 21:59:52 +00003461bool
3462TargetProperties::GetDisplayExpressionsInCrashlogs () const
3463{
3464 const uint32_t idx = ePropertyDisplayExpressionsInCrashlogs;
3465 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3466}
3467
Enrico Granata397ddd52013-05-21 20:13:34 +00003468LoadScriptFromSymFile
Enrico Granata2ea43cd2013-05-13 17:03:52 +00003469TargetProperties::GetLoadScriptFromSymbolFile () const
3470{
3471 const uint32_t idx = ePropertyLoadScriptFromSymbolFile;
Enrico Granata397ddd52013-05-21 20:13:34 +00003472 return (LoadScriptFromSymFile)m_collection_sp->GetPropertyAtIndexAsEnumeration(NULL, idx, g_properties[idx].default_uint_value);
Enrico Granata2ea43cd2013-05-13 17:03:52 +00003473}
3474
Daniel Malead79ae052013-08-07 21:54:09 +00003475Disassembler::HexImmediateStyle
3476TargetProperties::GetHexImmediateStyle () const
3477{
3478 const uint32_t idx = ePropertyHexImmediateStyle;
3479 return (Disassembler::HexImmediateStyle)m_collection_sp->GetPropertyAtIndexAsEnumeration(NULL, idx, g_properties[idx].default_uint_value);
3480}
3481
Greg Claytonfd814c52013-08-13 01:42:25 +00003482MemoryModuleLoadLevel
3483TargetProperties::GetMemoryModuleLoadLevel() const
3484{
3485 const uint32_t idx = ePropertyMemoryModuleLoadLevel;
3486 return (MemoryModuleLoadLevel)m_collection_sp->GetPropertyAtIndexAsEnumeration(NULL, idx, g_properties[idx].default_uint_value);
3487}
3488
Jason Molendaa4bea722014-02-14 05:06:49 +00003489bool
3490TargetProperties::GetUserSpecifiedTrapHandlerNames (Args &args) const
3491{
3492 const uint32_t idx = ePropertyTrapHandlerNames;
3493 return m_collection_sp->GetPropertyAtIndexAsArgs (NULL, idx, args);
3494}
Greg Claytonfd814c52013-08-13 01:42:25 +00003495
Jason Molendaa4bea722014-02-14 05:06:49 +00003496void
3497TargetProperties::SetUserSpecifiedTrapHandlerNames (const Args &args)
3498{
3499 const uint32_t idx = ePropertyTrapHandlerNames;
3500 m_collection_sp->SetPropertyAtIndexFromArgs (NULL, idx, args);
3501}
Greg Clayton67cc0632012-08-22 17:17:09 +00003502
Enrico Granata560558e2015-02-11 02:35:39 +00003503bool
3504TargetProperties::GetDisplayRuntimeSupportValues () const
3505{
3506 const uint32_t idx = ePropertyDisplayRuntimeSupportValues;
3507 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, false);
3508}
3509
3510void
3511TargetProperties::SetDisplayRuntimeSupportValues (bool b)
3512{
3513 const uint32_t idx = ePropertyDisplayRuntimeSupportValues;
3514 m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b);
3515}
3516
Ilia K8f37ca52015-02-13 14:31:06 +00003517const ProcessLaunchInfo &
Ilia Kcc39d3f2015-02-13 17:07:55 +00003518TargetProperties::GetProcessLaunchInfo ()
Ilia K8f37ca52015-02-13 14:31:06 +00003519{
Ilia Kcc39d3f2015-02-13 17:07:55 +00003520 m_launch_info.SetArg0(GetArg0()); // FIXME: Arg0 callback doesn't work
Ilia K8f37ca52015-02-13 14:31:06 +00003521 return m_launch_info;
3522}
3523
3524void
3525TargetProperties::SetProcessLaunchInfo(const ProcessLaunchInfo &launch_info)
3526{
3527 m_launch_info = launch_info;
3528 SetArg0(launch_info.GetArg0());
3529 SetRunArguments(launch_info.GetArguments());
3530 SetEnvironmentFromArgs(launch_info.GetEnvironmentEntries());
3531 const FileAction *input_file_action = launch_info.GetFileActionForFD(STDIN_FILENO);
3532 if (input_file_action)
3533 {
3534 const char *input_path = input_file_action->GetPath();
3535 if (input_path)
3536 SetStandardInputPath(input_path);
3537 }
3538 const FileAction *output_file_action = launch_info.GetFileActionForFD(STDOUT_FILENO);
3539 if (output_file_action)
3540 {
3541 const char *output_path = output_file_action->GetPath();
3542 if (output_path)
3543 SetStandardOutputPath(output_path);
3544 }
3545 const FileAction *error_file_action = launch_info.GetFileActionForFD(STDERR_FILENO);
3546 if (error_file_action)
3547 {
3548 const char *error_path = error_file_action->GetPath();
3549 if (error_path)
3550 SetStandardErrorPath(error_path);
3551 }
3552 SetDetachOnError(launch_info.GetFlags().Test(lldb::eLaunchFlagDetachOnError));
3553 SetDisableASLR(launch_info.GetFlags().Test(lldb::eLaunchFlagDisableASLR));
3554 SetDisableSTDIO(launch_info.GetFlags().Test(lldb::eLaunchFlagDisableSTDIO));
3555}
3556
3557void
3558TargetProperties::Arg0ValueChangedCallback(void *target_property_ptr, OptionValue *)
3559{
3560 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
3561 this_->m_launch_info.SetArg0(this_->GetArg0());
3562}
3563
3564void
3565TargetProperties::RunArgsValueChangedCallback(void *target_property_ptr, OptionValue *)
3566{
3567 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
3568 Args args;
3569 if (this_->GetRunArguments(args))
3570 this_->m_launch_info.GetArguments() = args;
3571}
3572
3573void
3574TargetProperties::EnvVarsValueChangedCallback(void *target_property_ptr, OptionValue *)
3575{
3576 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
3577 Args args;
3578 if (this_->GetEnvironmentAsArgs(args))
3579 this_->m_launch_info.GetEnvironmentEntries() = args;
3580}
3581
3582void
3583TargetProperties::InputPathValueChangedCallback(void *target_property_ptr, OptionValue *)
3584{
3585 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
3586 this_->m_launch_info.AppendOpenFileAction(STDIN_FILENO, this_->GetStandardInputPath().GetPath().c_str(), true, false);
3587}
3588
3589void
3590TargetProperties::OutputPathValueChangedCallback(void *target_property_ptr, OptionValue *)
3591{
3592 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
3593 this_->m_launch_info.AppendOpenFileAction(STDOUT_FILENO, this_->GetStandardOutputPath().GetPath().c_str(), false, true);
3594}
3595
3596void
3597TargetProperties::ErrorPathValueChangedCallback(void *target_property_ptr, OptionValue *)
3598{
3599 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
3600 this_->m_launch_info.AppendOpenFileAction(STDERR_FILENO, this_->GetStandardErrorPath().GetPath().c_str(), false, true);
3601}
3602
3603void
3604TargetProperties::DetachOnErrorValueChangedCallback(void *target_property_ptr, OptionValue *)
3605{
3606 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
3607 if (this_->GetDetachOnError())
3608 this_->m_launch_info.GetFlags().Set(lldb::eLaunchFlagDetachOnError);
3609 else
3610 this_->m_launch_info.GetFlags().Clear(lldb::eLaunchFlagDetachOnError);
3611}
3612
3613void
3614TargetProperties::DisableASLRValueChangedCallback(void *target_property_ptr, OptionValue *)
3615{
3616 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
3617 if (this_->GetDisableASLR())
3618 this_->m_launch_info.GetFlags().Set(lldb::eLaunchFlagDisableASLR);
3619 else
3620 this_->m_launch_info.GetFlags().Clear(lldb::eLaunchFlagDisableASLR);
3621}
3622
3623void
3624TargetProperties::DisableSTDIOValueChangedCallback(void *target_property_ptr, OptionValue *)
3625{
3626 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
3627 if (this_->GetDisableSTDIO())
3628 this_->m_launch_info.GetFlags().Set(lldb::eLaunchFlagDisableSTDIO);
3629 else
3630 this_->m_launch_info.GetFlags().Clear(lldb::eLaunchFlagDisableSTDIO);
3631}
Ilia Keb2c19a2015-03-10 21:59:55 +00003632
3633//----------------------------------------------------------------------
3634// Target::TargetEventData
3635//----------------------------------------------------------------------
3636
3637Target::TargetEventData::TargetEventData (const lldb::TargetSP &target_sp) :
3638 EventData (),
3639 m_target_sp (target_sp),
3640 m_module_list ()
3641{
3642}
3643
3644Target::TargetEventData::TargetEventData (const lldb::TargetSP &target_sp, const ModuleList &module_list) :
3645 EventData (),
3646 m_target_sp (target_sp),
3647 m_module_list (module_list)
3648{
3649}
3650
3651Target::TargetEventData::~TargetEventData()
3652{
3653}
3654
3655const ConstString &
3656Target::TargetEventData::GetFlavorString ()
3657{
3658 static ConstString g_flavor ("Target::TargetEventData");
3659 return g_flavor;
3660}
3661
3662void
3663Target::TargetEventData::Dump (Stream *s) const
3664{
3665}
3666
3667const Target::TargetEventData *
3668Target::TargetEventData::GetEventDataFromEvent (const Event *event_ptr)
3669{
3670 if (event_ptr)
3671 {
3672 const EventData *event_data = event_ptr->GetData();
3673 if (event_data && event_data->GetFlavor() == TargetEventData::GetFlavorString())
3674 return static_cast <const TargetEventData *> (event_ptr->GetData());
3675 }
3676 return NULL;
3677}
3678
3679TargetSP
3680Target::TargetEventData::GetTargetFromEvent (const Event *event_ptr)
3681{
3682 TargetSP target_sp;
3683 const TargetEventData *event_data = GetEventDataFromEvent (event_ptr);
3684 if (event_data)
3685 target_sp = event_data->m_target_sp;
3686 return target_sp;
3687}
3688
3689ModuleList
3690Target::TargetEventData::GetModuleListFromEvent (const Event *event_ptr)
3691{
3692 ModuleList module_list;
3693 const TargetEventData *event_data = GetEventDataFromEvent (event_ptr);
3694 if (event_data)
3695 module_list = event_data->m_module_list;
3696 return module_list;
3697}