blob: 33d332318a0cf978cf1d0e5120cd4c592ce572e3 [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"
Greg Claytoneb0103f2011-04-07 22:46:35 +000037#include "lldb/Expression/ClangUserExpression.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000038#include "lldb/Host/Host.h"
Jim Ingham9575d842011-03-11 03:53:59 +000039#include "lldb/Interpreter/CommandInterpreter.h"
40#include "lldb/Interpreter/CommandReturnObject.h"
Johnny Chenb90827e2012-06-04 23:19:54 +000041#include "lldb/Interpreter/OptionGroupWatchpoint.h"
Greg Clayton67cc0632012-08-22 17:17:09 +000042#include "lldb/Interpreter/OptionValues.h"
43#include "lldb/Interpreter/Property.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000044#include "lldb/lldb-private-log.h"
45#include "lldb/Symbol/ObjectFile.h"
46#include "lldb/Target/Process.h"
Greg Claytond5944cd2013-12-06 01:12:00 +000047#include "lldb/Target/SectionLoadList.h"
Jason Molendab57e4a12013-11-04 09:33:30 +000048#include "lldb/Target/StackFrame.h"
Jason Molendaeef51062013-11-05 03:57:19 +000049#include "lldb/Target/SystemRuntime.h"
Jim Ingham9575d842011-03-11 03:53:59 +000050#include "lldb/Target/Thread.h"
51#include "lldb/Target/ThreadSpec.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000052
53using namespace lldb;
54using namespace lldb_private;
55
Jim Ingham4bddaeb2012-02-16 06:50:00 +000056ConstString &
57Target::GetStaticBroadcasterClass ()
58{
59 static ConstString class_name ("lldb.target");
60 return class_name;
61}
62
Chris Lattner30fdc8d2010-06-08 16:52:24 +000063//----------------------------------------------------------------------
64// Target constructor
65//----------------------------------------------------------------------
Greg Clayton32e0a752011-03-30 18:16:51 +000066Target::Target(Debugger &debugger, const ArchSpec &target_arch, const lldb::PlatformSP &platform_sp) :
Greg Clayton67cc0632012-08-22 17:17:09 +000067 TargetProperties (this),
Jim Ingham4f465cf2012-10-10 18:32:14 +000068 Broadcaster (&debugger, Target::GetStaticBroadcasterClass().AsCString()),
Greg Clayton32e0a752011-03-30 18:16:51 +000069 ExecutionContextScope (),
Greg Clayton66111032010-06-23 01:19:29 +000070 m_debugger (debugger),
Greg Clayton32e0a752011-03-30 18:16:51 +000071 m_platform_sp (platform_sp),
Greg Claytonaf67cec2010-12-20 20:49:23 +000072 m_mutex (Mutex::eMutexTypeRecursive),
Greg Clayton32e0a752011-03-30 18:16:51 +000073 m_arch (target_arch),
Enrico Granata17598482012-11-08 02:22:02 +000074 m_images (this),
Greg Claytond5944cd2013-12-06 01:12:00 +000075 m_section_load_history (),
Chris Lattner30fdc8d2010-06-08 16:52:24 +000076 m_breakpoint_list (false),
77 m_internal_breakpoint_list (true),
Johnny Chen01a67862011-10-14 00:42:25 +000078 m_watchpoint_list (),
Greg Clayton32e0a752011-03-30 18:16:51 +000079 m_process_sp (),
80 m_search_filter_sp (),
Chris Lattner30fdc8d2010-06-08 16:52:24 +000081 m_image_search_paths (ImageSearchPathsChanged, this),
Greg Claytone01e07b2013-04-18 18:10:51 +000082 m_scratch_ast_context_ap (),
83 m_scratch_ast_source_ap (),
84 m_ast_importer_ap (),
Jim Ingham9575d842011-03-11 03:53:59 +000085 m_persistent_variables (),
Greg Clayton9585fbf2013-03-19 00:20:55 +000086 m_source_manager_ap(),
Greg Clayton32e0a752011-03-30 18:16:51 +000087 m_stop_hooks (),
Jim Ingham6026ca32011-05-12 02:06:14 +000088 m_stop_hook_next_id (0),
Greg Claytond5944cd2013-12-06 01:12:00 +000089 m_valid (true),
Enrico Granata5d5f60c2013-09-24 22:58:37 +000090 m_suppress_stop_hooks (false)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000091{
Greg Claytoncfd1ace2010-10-31 03:01:06 +000092 SetEventName (eBroadcastBitBreakpointChanged, "breakpoint-changed");
93 SetEventName (eBroadcastBitModulesLoaded, "modules-loaded");
94 SetEventName (eBroadcastBitModulesUnloaded, "modules-unloaded");
Jim Ingham1b5792e2012-12-18 02:03:49 +000095 SetEventName (eBroadcastBitWatchpointChanged, "watchpoint-changed");
Enrico Granataf15ee4e2013-04-05 18:49:06 +000096 SetEventName (eBroadcastBitSymbolsLoaded, "symbols-loaded");
Saleem Abdulrasool324a1032014-04-04 04:06:10 +000097
Jim Ingham4bddaeb2012-02-16 06:50:00 +000098 CheckInWithManager();
Greg Claytoncfd1ace2010-10-31 03:01:06 +000099
Greg Clayton5160ce52013-03-27 23:08:40 +0000100 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000101 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000102 log->Printf ("%p Target::Target()", static_cast<void*>(this));
Jason Molendae1b68ad2012-12-05 00:25:49 +0000103 if (m_arch.IsValid())
104 {
Jason Molendaa3f24b32012-12-12 02:23:56 +0000105 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 +0000106 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000107}
108
109//----------------------------------------------------------------------
110// Destructor
111//----------------------------------------------------------------------
112Target::~Target()
113{
Greg Clayton5160ce52013-03-27 23:08:40 +0000114 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000115 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000116 log->Printf ("%p Target::~Target()", static_cast<void*>(this));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000117 DeleteCurrentProcess ();
118}
119
120void
Caroline Ticeceb6b132010-10-26 03:11:13 +0000121Target::Dump (Stream *s, lldb::DescriptionLevel description_level)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000122{
Greg Clayton89411422010-10-08 00:21:05 +0000123// s->Printf("%.*p: ", (int)sizeof(void*) * 2, this);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000124 if (description_level != lldb::eDescriptionLevelBrief)
125 {
126 s->Indent();
127 s->PutCString("Target\n");
128 s->IndentMore();
Greg Clayton93aa84e2010-10-29 04:59:35 +0000129 m_images.Dump(s);
130 m_breakpoint_list.Dump(s);
131 m_internal_breakpoint_list.Dump(s);
132 s->IndentLess();
Caroline Ticeceb6b132010-10-26 03:11:13 +0000133 }
134 else
135 {
Greg Claytonaa149cb2011-08-11 02:48:45 +0000136 Module *exe_module = GetExecutableModulePointer();
137 if (exe_module)
138 s->PutCString (exe_module->GetFileSpec().GetFilename().GetCString());
Jim Ingham48028b62011-05-12 01:12:28 +0000139 else
140 s->PutCString ("No executable module.");
Caroline Ticeceb6b132010-10-26 03:11:13 +0000141 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000142}
143
144void
Greg Clayton90ba8112012-12-05 00:16:59 +0000145Target::CleanupProcess ()
146{
147 // Do any cleanup of the target we need to do between process instances.
148 // NB It is better to do this before destroying the process in case the
149 // clean up needs some help from the process.
150 m_breakpoint_list.ClearAllBreakpointSites();
151 m_internal_breakpoint_list.ClearAllBreakpointSites();
152 // Disable watchpoints just on the debugger side.
153 Mutex::Locker locker;
154 this->GetWatchpointList().GetListMutex(locker);
155 DisableAllWatchpoints(false);
156 ClearAllWatchpointHitCounts();
157}
158
159void
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000160Target::DeleteCurrentProcess ()
161{
162 if (m_process_sp.get())
163 {
Greg Claytond5944cd2013-12-06 01:12:00 +0000164 m_section_load_history.Clear();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000165 if (m_process_sp->IsAlive())
166 m_process_sp->Destroy();
Jim Inghamd0a3e122011-02-16 17:54:55 +0000167
168 m_process_sp->Finalize();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000169
Greg Clayton90ba8112012-12-05 00:16:59 +0000170 CleanupProcess ();
171
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000172 m_process_sp.reset();
173 }
174}
175
176const lldb::ProcessSP &
Greg Claytonc3776bf2012-02-09 06:16:32 +0000177Target::CreateProcess (Listener &listener, const char *plugin_name, const FileSpec *crash_file)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000178{
179 DeleteCurrentProcess ();
Greg Claytonc3776bf2012-02-09 06:16:32 +0000180 m_process_sp = Process::FindPlugin(*this, plugin_name, listener, crash_file);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000181 return m_process_sp;
182}
183
184const lldb::ProcessSP &
185Target::GetProcessSP () const
186{
187 return m_process_sp;
188}
189
Greg Clayton3418c852011-08-10 02:10:13 +0000190void
191Target::Destroy()
192{
193 Mutex::Locker locker (m_mutex);
Filipe Cabecinhas721ba3f2012-05-19 09:59:08 +0000194 m_valid = false;
Greg Clayton3418c852011-08-10 02:10:13 +0000195 DeleteCurrentProcess ();
196 m_platform_sp.reset();
197 m_arch.Clear();
Greg Claytonb35db632013-11-09 00:03:31 +0000198 ClearModules(true);
Greg Claytond5944cd2013-12-06 01:12:00 +0000199 m_section_load_history.Clear();
Greg Clayton3418c852011-08-10 02:10:13 +0000200 const bool notify = false;
201 m_breakpoint_list.RemoveAll(notify);
202 m_internal_breakpoint_list.RemoveAll(notify);
203 m_last_created_breakpoint.reset();
Johnny Chen01a67862011-10-14 00:42:25 +0000204 m_last_created_watchpoint.reset();
Greg Clayton3418c852011-08-10 02:10:13 +0000205 m_search_filter_sp.reset();
206 m_image_search_paths.Clear(notify);
Greg Clayton3418c852011-08-10 02:10:13 +0000207 m_persistent_variables.Clear();
208 m_stop_hooks.clear();
209 m_stop_hook_next_id = 0;
210 m_suppress_stop_hooks = false;
211}
212
213
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000214BreakpointList &
215Target::GetBreakpointList(bool internal)
216{
217 if (internal)
218 return m_internal_breakpoint_list;
219 else
220 return m_breakpoint_list;
221}
222
223const BreakpointList &
224Target::GetBreakpointList(bool internal) const
225{
226 if (internal)
227 return m_internal_breakpoint_list;
228 else
229 return m_breakpoint_list;
230}
231
232BreakpointSP
233Target::GetBreakpointByID (break_id_t break_id)
234{
235 BreakpointSP bp_sp;
236
237 if (LLDB_BREAK_ID_IS_INTERNAL (break_id))
238 bp_sp = m_internal_breakpoint_list.FindBreakpointByID (break_id);
239 else
240 bp_sp = m_breakpoint_list.FindBreakpointByID (break_id);
241
242 return bp_sp;
243}
244
245BreakpointSP
Jim Ingham87df91b2011-09-23 00:54:11 +0000246Target::CreateSourceRegexBreakpoint (const FileSpecList *containingModules,
Greg Clayton1f746072012-08-29 21:13:06 +0000247 const FileSpecList *source_file_spec_list,
248 RegularExpression &source_regex,
Greg Claytoneb023e72013-10-11 19:48:25 +0000249 bool internal,
250 bool hardware)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000251{
Jim Ingham87df91b2011-09-23 00:54:11 +0000252 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, source_file_spec_list));
253 BreakpointResolverSP resolver_sp(new BreakpointResolverFileRegex (NULL, source_regex));
Jim Ingham1460e4b2014-01-10 23:46:59 +0000254 return CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true);
Jim Ingham969795f2011-09-21 01:17:13 +0000255}
256
257
258BreakpointSP
Jim Inghama8558b62012-05-22 00:12:20 +0000259Target::CreateBreakpoint (const FileSpecList *containingModules,
260 const FileSpec &file,
261 uint32_t line_no,
Greg Clayton1f746072012-08-29 21:13:06 +0000262 LazyBool check_inlines,
Jim Inghama8558b62012-05-22 00:12:20 +0000263 LazyBool skip_prologue,
Greg Claytoneb023e72013-10-11 19:48:25 +0000264 bool internal,
265 bool hardware)
Jim Ingham969795f2011-09-21 01:17:13 +0000266{
Greg Clayton1f746072012-08-29 21:13:06 +0000267 if (check_inlines == eLazyBoolCalculate)
268 {
269 const InlineStrategy inline_strategy = GetInlineStrategy();
270 switch (inline_strategy)
271 {
272 case eInlineBreakpointsNever:
273 check_inlines = eLazyBoolNo;
274 break;
275
276 case eInlineBreakpointsHeaders:
277 if (file.IsSourceImplementationFile())
278 check_inlines = eLazyBoolNo;
279 else
280 check_inlines = eLazyBoolYes;
281 break;
282
283 case eInlineBreakpointsAlways:
284 check_inlines = eLazyBoolYes;
285 break;
286 }
287 }
Greg Clayton93bfb292012-09-07 23:48:57 +0000288 SearchFilterSP filter_sp;
289 if (check_inlines == eLazyBoolNo)
290 {
291 // Not checking for inlines, we are looking only for matching compile units
292 FileSpecList compile_unit_list;
293 compile_unit_list.Append (file);
294 filter_sp = GetSearchFilterForModuleAndCUList (containingModules, &compile_unit_list);
295 }
296 else
297 {
298 filter_sp = GetSearchFilterForModuleList (containingModules);
299 }
Greg Clayton03da4cc2013-04-19 21:31:16 +0000300 if (skip_prologue == eLazyBoolCalculate)
301 skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo;
302
Greg Clayton1f746072012-08-29 21:13:06 +0000303 BreakpointResolverSP resolver_sp(new BreakpointResolverFileLine (NULL,
304 file,
305 line_no,
306 check_inlines,
Greg Clayton03da4cc2013-04-19 21:31:16 +0000307 skip_prologue));
Jim Ingham1460e4b2014-01-10 23:46:59 +0000308 return CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000309}
310
311
312BreakpointSP
Greg Claytoneb023e72013-10-11 19:48:25 +0000313Target::CreateBreakpoint (lldb::addr_t addr, bool internal, bool hardware)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000314{
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000315 Address so_addr;
316 // Attempt to resolve our load address if possible, though it is ok if
317 // it doesn't resolve to section/offset.
318
Greg Clayton1b72fcb2010-08-24 00:45:41 +0000319 // Try and resolve as a load address if possible
Greg Claytond5944cd2013-12-06 01:12:00 +0000320 GetSectionLoadList().ResolveLoadAddress(addr, so_addr);
Greg Clayton1b72fcb2010-08-24 00:45:41 +0000321 if (!so_addr.IsValid())
322 {
323 // The address didn't resolve, so just set this as an absolute address
324 so_addr.SetOffset (addr);
325 }
Greg Claytoneb023e72013-10-11 19:48:25 +0000326 BreakpointSP bp_sp (CreateBreakpoint(so_addr, internal, hardware));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000327 return bp_sp;
328}
329
330BreakpointSP
Greg Claytoneb023e72013-10-11 19:48:25 +0000331Target::CreateBreakpoint (Address &addr, bool internal, bool hardware)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000332{
Greg Claytone1cd1be2012-01-29 20:56:30 +0000333 SearchFilterSP filter_sp(new SearchFilterForNonModuleSpecificSearches (shared_from_this()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000334 BreakpointResolverSP resolver_sp (new BreakpointResolverAddress (NULL, addr));
Jim Ingham1460e4b2014-01-10 23:46:59 +0000335 return CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, false);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000336}
337
338BreakpointSP
Jim Ingham87df91b2011-09-23 00:54:11 +0000339Target::CreateBreakpoint (const FileSpecList *containingModules,
340 const FileSpecList *containingSourceFiles,
Greg Claytond16e1e52011-07-12 17:06:17 +0000341 const char *func_name,
342 uint32_t func_name_type_mask,
Jim Inghama8558b62012-05-22 00:12:20 +0000343 LazyBool skip_prologue,
Greg Claytoneb023e72013-10-11 19:48:25 +0000344 bool internal,
345 bool hardware)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000346{
Greg Clayton0c5cd902010-06-28 21:30:43 +0000347 BreakpointSP bp_sp;
348 if (func_name)
349 {
Jim Ingham87df91b2011-09-23 00:54:11 +0000350 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, containingSourceFiles));
Greg Clayton03da4cc2013-04-19 21:31:16 +0000351
352 if (skip_prologue == eLazyBoolCalculate)
353 skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo;
354
Greg Claytond16e1e52011-07-12 17:06:17 +0000355 BreakpointResolverSP resolver_sp (new BreakpointResolverName (NULL,
356 func_name,
357 func_name_type_mask,
358 Breakpoint::Exact,
Greg Clayton03da4cc2013-04-19 21:31:16 +0000359 skip_prologue));
Jim Ingham1460e4b2014-01-10 23:46:59 +0000360 bp_sp = CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true);
Greg Clayton0c5cd902010-06-28 21:30:43 +0000361 }
362 return bp_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000363}
364
Jim Inghamfab10e82012-03-06 00:37:27 +0000365lldb::BreakpointSP
366Target::CreateBreakpoint (const FileSpecList *containingModules,
Greg Clayton4116e932012-05-15 02:33:01 +0000367 const FileSpecList *containingSourceFiles,
368 const std::vector<std::string> &func_names,
369 uint32_t func_name_type_mask,
Jim Inghama8558b62012-05-22 00:12:20 +0000370 LazyBool skip_prologue,
Greg Claytoneb023e72013-10-11 19:48:25 +0000371 bool internal,
372 bool hardware)
Jim Inghamfab10e82012-03-06 00:37:27 +0000373{
374 BreakpointSP bp_sp;
375 size_t num_names = func_names.size();
376 if (num_names > 0)
377 {
378 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, containingSourceFiles));
Greg Clayton03da4cc2013-04-19 21:31:16 +0000379
380 if (skip_prologue == eLazyBoolCalculate)
381 skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo;
382
383 BreakpointResolverSP resolver_sp (new BreakpointResolverName (NULL,
Jim Inghamfab10e82012-03-06 00:37:27 +0000384 func_names,
385 func_name_type_mask,
Greg Clayton03da4cc2013-04-19 21:31:16 +0000386 skip_prologue));
Jim Ingham1460e4b2014-01-10 23:46:59 +0000387 bp_sp = CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true);
Jim Inghamfab10e82012-03-06 00:37:27 +0000388 }
389 return bp_sp;
390}
391
Jim Ingham133e0fb2012-03-03 02:05:11 +0000392BreakpointSP
393Target::CreateBreakpoint (const FileSpecList *containingModules,
394 const FileSpecList *containingSourceFiles,
395 const char *func_names[],
396 size_t num_names,
397 uint32_t func_name_type_mask,
Jim Inghama8558b62012-05-22 00:12:20 +0000398 LazyBool skip_prologue,
Greg Claytoneb023e72013-10-11 19:48:25 +0000399 bool internal,
400 bool hardware)
Jim Ingham133e0fb2012-03-03 02:05:11 +0000401{
402 BreakpointSP bp_sp;
403 if (num_names > 0)
404 {
405 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, containingSourceFiles));
406
Greg Clayton03da4cc2013-04-19 21:31:16 +0000407 if (skip_prologue == eLazyBoolCalculate)
408 skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo;
409
410 BreakpointResolverSP resolver_sp (new BreakpointResolverName (NULL,
Jim Ingham133e0fb2012-03-03 02:05:11 +0000411 func_names,
412 num_names,
Jim Inghamfab10e82012-03-06 00:37:27 +0000413 func_name_type_mask,
Greg Clayton03da4cc2013-04-19 21:31:16 +0000414 skip_prologue));
Jim Ingham1460e4b2014-01-10 23:46:59 +0000415 bp_sp = CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true);
Jim Ingham133e0fb2012-03-03 02:05:11 +0000416 }
417 return bp_sp;
418}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000419
420SearchFilterSP
421Target::GetSearchFilterForModule (const FileSpec *containingModule)
422{
423 SearchFilterSP filter_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000424 if (containingModule != NULL)
425 {
426 // TODO: We should look into sharing module based search filters
427 // across many breakpoints like we do for the simple target based one
Greg Claytone1cd1be2012-01-29 20:56:30 +0000428 filter_sp.reset (new SearchFilterByModule (shared_from_this(), *containingModule));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000429 }
430 else
431 {
432 if (m_search_filter_sp.get() == NULL)
Greg Claytone1cd1be2012-01-29 20:56:30 +0000433 m_search_filter_sp.reset (new SearchFilterForNonModuleSpecificSearches (shared_from_this()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000434 filter_sp = m_search_filter_sp;
435 }
436 return filter_sp;
437}
438
Jim Ingham969795f2011-09-21 01:17:13 +0000439SearchFilterSP
440Target::GetSearchFilterForModuleList (const FileSpecList *containingModules)
441{
442 SearchFilterSP filter_sp;
Jim Ingham969795f2011-09-21 01:17:13 +0000443 if (containingModules && containingModules->GetSize() != 0)
444 {
445 // TODO: We should look into sharing module based search filters
446 // across many breakpoints like we do for the simple target based one
Greg Claytone1cd1be2012-01-29 20:56:30 +0000447 filter_sp.reset (new SearchFilterByModuleList (shared_from_this(), *containingModules));
Jim Ingham969795f2011-09-21 01:17:13 +0000448 }
449 else
450 {
451 if (m_search_filter_sp.get() == NULL)
Greg Claytone1cd1be2012-01-29 20:56:30 +0000452 m_search_filter_sp.reset (new SearchFilterForNonModuleSpecificSearches (shared_from_this()));
Jim Ingham969795f2011-09-21 01:17:13 +0000453 filter_sp = m_search_filter_sp;
454 }
455 return filter_sp;
456}
457
Jim Ingham87df91b2011-09-23 00:54:11 +0000458SearchFilterSP
Jim Inghama8558b62012-05-22 00:12:20 +0000459Target::GetSearchFilterForModuleAndCUList (const FileSpecList *containingModules,
460 const FileSpecList *containingSourceFiles)
Jim Ingham87df91b2011-09-23 00:54:11 +0000461{
462 if (containingSourceFiles == NULL || containingSourceFiles->GetSize() == 0)
463 return GetSearchFilterForModuleList(containingModules);
464
465 SearchFilterSP filter_sp;
Jim Ingham87df91b2011-09-23 00:54:11 +0000466 if (containingModules == NULL)
467 {
468 // We could make a special "CU List only SearchFilter". Better yet was if these could be composable,
469 // but that will take a little reworking.
470
Greg Claytone1cd1be2012-01-29 20:56:30 +0000471 filter_sp.reset (new SearchFilterByModuleListAndCU (shared_from_this(), FileSpecList(), *containingSourceFiles));
Jim Ingham87df91b2011-09-23 00:54:11 +0000472 }
473 else
474 {
Greg Claytone1cd1be2012-01-29 20:56:30 +0000475 filter_sp.reset (new SearchFilterByModuleListAndCU (shared_from_this(), *containingModules, *containingSourceFiles));
Jim Ingham87df91b2011-09-23 00:54:11 +0000476 }
477 return filter_sp;
478}
479
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000480BreakpointSP
Jim Ingham87df91b2011-09-23 00:54:11 +0000481Target::CreateFuncRegexBreakpoint (const FileSpecList *containingModules,
Jim Inghama8558b62012-05-22 00:12:20 +0000482 const FileSpecList *containingSourceFiles,
483 RegularExpression &func_regex,
484 LazyBool skip_prologue,
Greg Claytoneb023e72013-10-11 19:48:25 +0000485 bool internal,
486 bool hardware)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000487{
Jim Ingham87df91b2011-09-23 00:54:11 +0000488 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, containingSourceFiles));
Greg Claytond16e1e52011-07-12 17:06:17 +0000489 BreakpointResolverSP resolver_sp(new BreakpointResolverName (NULL,
490 func_regex,
491 skip_prologue == eLazyBoolCalculate ? GetSkipPrologue() : skip_prologue));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000492
Jim Ingham1460e4b2014-01-10 23:46:59 +0000493 return CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000494}
495
Jim Ingham219ba192012-03-05 04:47:34 +0000496lldb::BreakpointSP
497Target::CreateExceptionBreakpoint (enum lldb::LanguageType language, bool catch_bp, bool throw_bp, bool internal)
498{
499 return LanguageRuntime::CreateExceptionBreakpoint (*this, language, catch_bp, throw_bp, internal);
500}
501
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000502BreakpointSP
Jim Ingham1460e4b2014-01-10 23:46:59 +0000503Target::CreateBreakpoint (SearchFilterSP &filter_sp, BreakpointResolverSP &resolver_sp, bool internal, bool request_hardware, bool resolve_indirect_symbols)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000504{
505 BreakpointSP bp_sp;
506 if (filter_sp && resolver_sp)
507 {
Jim Ingham1460e4b2014-01-10 23:46:59 +0000508 bp_sp.reset(new Breakpoint (*this, filter_sp, resolver_sp, request_hardware, resolve_indirect_symbols));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000509 resolver_sp->SetBreakpoint (bp_sp.get());
510
511 if (internal)
Greg Clayton9fed0d82010-07-23 23:33:17 +0000512 m_internal_breakpoint_list.Add (bp_sp, false);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000513 else
Greg Clayton9fed0d82010-07-23 23:33:17 +0000514 m_breakpoint_list.Add (bp_sp, true);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000515
Greg Clayton5160ce52013-03-27 23:08:40 +0000516 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000517 if (log)
518 {
519 StreamString s;
520 bp_sp->GetDescription(&s, lldb::eDescriptionLevelVerbose);
521 log->Printf ("Target::%s (internal = %s) => break_id = %s\n", __FUNCTION__, internal ? "yes" : "no", s.GetData());
522 }
523
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000524 bp_sp->ResolveBreakpoint();
525 }
Jim Ingham36f3b362010-10-14 23:45:03 +0000526
527 if (!internal && bp_sp)
528 {
529 m_last_created_breakpoint = bp_sp;
530 }
531
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000532 return bp_sp;
533}
534
Johnny Chen86364b42011-09-20 23:28:55 +0000535bool
536Target::ProcessIsValid()
537{
538 return (m_process_sp && m_process_sp->IsAlive());
539}
540
Johnny Chenb90827e2012-06-04 23:19:54 +0000541static bool
542CheckIfWatchpointsExhausted(Target *target, Error &error)
543{
544 uint32_t num_supported_hardware_watchpoints;
545 Error rc = target->GetProcessSP()->GetWatchpointSupportInfo(num_supported_hardware_watchpoints);
546 if (rc.Success())
547 {
548 uint32_t num_current_watchpoints = target->GetWatchpointList().GetSize();
549 if (num_current_watchpoints >= num_supported_hardware_watchpoints)
550 error.SetErrorStringWithFormat("number of supported hardware watchpoints (%u) has been reached",
551 num_supported_hardware_watchpoints);
552 }
553 return false;
554}
555
Johnny Chen01a67862011-10-14 00:42:25 +0000556// See also Watchpoint::SetWatchpointType(uint32_t type) and
Johnny Chenab9ee762011-09-14 00:26:03 +0000557// the OptionGroupWatchpoint::WatchType enum type.
Johnny Chen01a67862011-10-14 00:42:25 +0000558WatchpointSP
Jim Inghama7dfb662012-10-23 07:20:06 +0000559Target::CreateWatchpoint(lldb::addr_t addr, size_t size, const ClangASTType *type, uint32_t kind, Error &error)
Johnny Chen887062a2011-09-12 23:38:44 +0000560{
Greg Clayton5160ce52013-03-27 23:08:40 +0000561 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen0c406372011-09-14 20:23:45 +0000562 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000563 log->Printf("Target::%s (addr = 0x%8.8" PRIx64 " size = %" PRIu64 " type = %u)\n",
Jim Inghama7dfb662012-10-23 07:20:06 +0000564 __FUNCTION__, addr, (uint64_t)size, kind);
Johnny Chen0c406372011-09-14 20:23:45 +0000565
Johnny Chen01a67862011-10-14 00:42:25 +0000566 WatchpointSP wp_sp;
Johnny Chen86364b42011-09-20 23:28:55 +0000567 if (!ProcessIsValid())
Johnny Chenb90827e2012-06-04 23:19:54 +0000568 {
569 error.SetErrorString("process is not alive");
Johnny Chen01a67862011-10-14 00:42:25 +0000570 return wp_sp;
Johnny Chenb90827e2012-06-04 23:19:54 +0000571 }
Jim Inghamc6462312013-06-18 21:52:48 +0000572
Johnny Chen45e541f2011-09-14 22:20:15 +0000573 if (addr == LLDB_INVALID_ADDRESS || size == 0)
Johnny Chenb90827e2012-06-04 23:19:54 +0000574 {
575 if (size == 0)
576 error.SetErrorString("cannot set a watchpoint with watch_size of 0");
577 else
Daniel Malead01b2952012-11-29 21:49:15 +0000578 error.SetErrorStringWithFormat("invalid watch address: %" PRIu64, addr);
Johnny Chen01a67862011-10-14 00:42:25 +0000579 return wp_sp;
Johnny Chenb90827e2012-06-04 23:19:54 +0000580 }
Jim Inghamc6462312013-06-18 21:52:48 +0000581
582 if (!LLDB_WATCH_TYPE_IS_VALID(kind))
583 {
584 error.SetErrorStringWithFormat ("invalid watchpoint type: %d", kind);
585 }
Johnny Chen7313a642011-09-13 01:15:36 +0000586
Johnny Chen01a67862011-10-14 00:42:25 +0000587 // Currently we only support one watchpoint per address, with total number
588 // of watchpoints limited by the hardware which the inferior is running on.
Johnny Chen7385a5a2012-05-31 22:56:36 +0000589
590 // Grab the list mutex while doing operations.
Jim Ingham1b5792e2012-12-18 02:03:49 +0000591 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 +0000592 Mutex::Locker locker;
593 this->GetWatchpointList().GetListMutex(locker);
Johnny Chen01a67862011-10-14 00:42:25 +0000594 WatchpointSP matched_sp = m_watchpoint_list.FindByAddress(addr);
Johnny Chen3c532582011-09-13 23:29:31 +0000595 if (matched_sp)
596 {
Johnny Chen0c406372011-09-14 20:23:45 +0000597 size_t old_size = matched_sp->GetByteSize();
Johnny Chen3c532582011-09-13 23:29:31 +0000598 uint32_t old_type =
Johnny Chen0c406372011-09-14 20:23:45 +0000599 (matched_sp->WatchpointRead() ? LLDB_WATCH_TYPE_READ : 0) |
600 (matched_sp->WatchpointWrite() ? LLDB_WATCH_TYPE_WRITE : 0);
Johnny Chen01a67862011-10-14 00:42:25 +0000601 // Return the existing watchpoint if both size and type match.
Jim Inghamc6462312013-06-18 21:52:48 +0000602 if (size == old_size && kind == old_type)
603 {
Johnny Chen01a67862011-10-14 00:42:25 +0000604 wp_sp = matched_sp;
Jim Ingham1b5792e2012-12-18 02:03:49 +0000605 wp_sp->SetEnabled(false, notify);
Jim Inghamc6462312013-06-18 21:52:48 +0000606 }
607 else
608 {
Johnny Chen01a67862011-10-14 00:42:25 +0000609 // Nil the matched watchpoint; we will be creating a new one.
Jim Ingham1b5792e2012-12-18 02:03:49 +0000610 m_process_sp->DisableWatchpoint(matched_sp.get(), notify);
611 m_watchpoint_list.Remove(matched_sp->GetID(), true);
Johnny Chen45e541f2011-09-14 22:20:15 +0000612 }
Johnny Chen3c532582011-09-13 23:29:31 +0000613 }
614
Jason Molenda727e3922012-12-05 23:07:34 +0000615 if (!wp_sp)
616 {
Jim Ingham1b5792e2012-12-18 02:03:49 +0000617 wp_sp.reset(new Watchpoint(*this, addr, size, type));
618 wp_sp->SetWatchpointType(kind, notify);
619 m_watchpoint_list.Add (wp_sp, true);
Johnny Chen45e541f2011-09-14 22:20:15 +0000620 }
Johnny Chen0c406372011-09-14 20:23:45 +0000621
Jim Ingham1b5792e2012-12-18 02:03:49 +0000622 error = m_process_sp->EnableWatchpoint(wp_sp.get(), notify);
Johnny Chen0c406372011-09-14 20:23:45 +0000623 if (log)
Jason Molenda727e3922012-12-05 23:07:34 +0000624 log->Printf("Target::%s (creation of watchpoint %s with id = %u)\n",
625 __FUNCTION__,
626 error.Success() ? "succeeded" : "failed",
627 wp_sp->GetID());
Johnny Chen0c406372011-09-14 20:23:45 +0000628
Jason Molenda727e3922012-12-05 23:07:34 +0000629 if (error.Fail())
630 {
Johnny Chen41b77262012-03-26 22:00:10 +0000631 // Enabling the watchpoint on the device side failed.
632 // Remove the said watchpoint from the list maintained by the target instance.
Jim Ingham1b5792e2012-12-18 02:03:49 +0000633 m_watchpoint_list.Remove (wp_sp->GetID(), true);
Johnny Chenb90827e2012-06-04 23:19:54 +0000634 // See if we could provide more helpful error message.
635 if (!CheckIfWatchpointsExhausted(this, error))
636 {
637 if (!OptionGroupWatchpoint::IsWatchSizeSupported(size))
Greg Clayton6fea17e2014-03-03 19:15:20 +0000638 error.SetErrorStringWithFormat("watch size of %" PRIu64 " is not supported", (uint64_t)size);
Johnny Chenb90827e2012-06-04 23:19:54 +0000639 }
Johnny Chen01a67862011-10-14 00:42:25 +0000640 wp_sp.reset();
Johnny Chen41b77262012-03-26 22:00:10 +0000641 }
Johnny Chen9d954d82011-09-27 20:29:45 +0000642 else
Johnny Chen01a67862011-10-14 00:42:25 +0000643 m_last_created_watchpoint = wp_sp;
644 return wp_sp;
Johnny Chen887062a2011-09-12 23:38:44 +0000645}
646
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000647void
648Target::RemoveAllBreakpoints (bool internal_also)
649{
Greg Clayton5160ce52013-03-27 23:08:40 +0000650 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000651 if (log)
652 log->Printf ("Target::%s (internal_also = %s)\n", __FUNCTION__, internal_also ? "yes" : "no");
653
Greg Clayton9fed0d82010-07-23 23:33:17 +0000654 m_breakpoint_list.RemoveAll (true);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000655 if (internal_also)
Greg Clayton9fed0d82010-07-23 23:33:17 +0000656 m_internal_breakpoint_list.RemoveAll (false);
Jim Ingham36f3b362010-10-14 23:45:03 +0000657
658 m_last_created_breakpoint.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000659}
660
661void
662Target::DisableAllBreakpoints (bool internal_also)
663{
Greg Clayton5160ce52013-03-27 23:08:40 +0000664 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000665 if (log)
666 log->Printf ("Target::%s (internal_also = %s)\n", __FUNCTION__, internal_also ? "yes" : "no");
667
668 m_breakpoint_list.SetEnabledAll (false);
669 if (internal_also)
670 m_internal_breakpoint_list.SetEnabledAll (false);
671}
672
673void
674Target::EnableAllBreakpoints (bool internal_also)
675{
Greg Clayton5160ce52013-03-27 23:08:40 +0000676 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000677 if (log)
678 log->Printf ("Target::%s (internal_also = %s)\n", __FUNCTION__, internal_also ? "yes" : "no");
679
680 m_breakpoint_list.SetEnabledAll (true);
681 if (internal_also)
682 m_internal_breakpoint_list.SetEnabledAll (true);
683}
684
685bool
686Target::RemoveBreakpointByID (break_id_t break_id)
687{
Greg Clayton5160ce52013-03-27 23:08:40 +0000688 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000689 if (log)
690 log->Printf ("Target::%s (break_id = %i, internal = %s)\n", __FUNCTION__, break_id, LLDB_BREAK_ID_IS_INTERNAL (break_id) ? "yes" : "no");
691
692 if (DisableBreakpointByID (break_id))
693 {
694 if (LLDB_BREAK_ID_IS_INTERNAL (break_id))
Greg Clayton9fed0d82010-07-23 23:33:17 +0000695 m_internal_breakpoint_list.Remove(break_id, false);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000696 else
Jim Ingham36f3b362010-10-14 23:45:03 +0000697 {
Greg Claytonaa1c5872011-01-24 23:35:47 +0000698 if (m_last_created_breakpoint)
699 {
700 if (m_last_created_breakpoint->GetID() == break_id)
701 m_last_created_breakpoint.reset();
702 }
Greg Clayton9fed0d82010-07-23 23:33:17 +0000703 m_breakpoint_list.Remove(break_id, true);
Jim Ingham36f3b362010-10-14 23:45:03 +0000704 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000705 return true;
706 }
707 return false;
708}
709
710bool
711Target::DisableBreakpointByID (break_id_t break_id)
712{
Greg Clayton5160ce52013-03-27 23:08:40 +0000713 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000714 if (log)
715 log->Printf ("Target::%s (break_id = %i, internal = %s)\n", __FUNCTION__, break_id, LLDB_BREAK_ID_IS_INTERNAL (break_id) ? "yes" : "no");
716
717 BreakpointSP bp_sp;
718
719 if (LLDB_BREAK_ID_IS_INTERNAL (break_id))
720 bp_sp = m_internal_breakpoint_list.FindBreakpointByID (break_id);
721 else
722 bp_sp = m_breakpoint_list.FindBreakpointByID (break_id);
723 if (bp_sp)
724 {
725 bp_sp->SetEnabled (false);
726 return true;
727 }
728 return false;
729}
730
731bool
732Target::EnableBreakpointByID (break_id_t break_id)
733{
Greg Clayton5160ce52013-03-27 23:08:40 +0000734 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000735 if (log)
736 log->Printf ("Target::%s (break_id = %i, internal = %s)\n",
737 __FUNCTION__,
738 break_id,
739 LLDB_BREAK_ID_IS_INTERNAL (break_id) ? "yes" : "no");
740
741 BreakpointSP bp_sp;
742
743 if (LLDB_BREAK_ID_IS_INTERNAL (break_id))
744 bp_sp = m_internal_breakpoint_list.FindBreakpointByID (break_id);
745 else
746 bp_sp = m_breakpoint_list.FindBreakpointByID (break_id);
747
748 if (bp_sp)
749 {
750 bp_sp->SetEnabled (true);
751 return true;
752 }
753 return false;
754}
755
Johnny Chenedf50372011-09-23 21:21:43 +0000756// The flag 'end_to_end', default to true, signifies that the operation is
757// performed end to end, for both the debugger and the debuggee.
758
Johnny Chen01a67862011-10-14 00:42:25 +0000759// Assumption: Caller holds the list mutex lock for m_watchpoint_list for end
760// to end operations.
Johnny Chen86364b42011-09-20 23:28:55 +0000761bool
Johnny Chen01a67862011-10-14 00:42:25 +0000762Target::RemoveAllWatchpoints (bool end_to_end)
Johnny Chen86364b42011-09-20 23:28:55 +0000763{
Greg Clayton5160ce52013-03-27 23:08:40 +0000764 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen86364b42011-09-20 23:28:55 +0000765 if (log)
766 log->Printf ("Target::%s\n", __FUNCTION__);
767
Johnny Chenedf50372011-09-23 21:21:43 +0000768 if (!end_to_end) {
Jim Ingham1b5792e2012-12-18 02:03:49 +0000769 m_watchpoint_list.RemoveAll(true);
Johnny Chenedf50372011-09-23 21:21:43 +0000770 return true;
771 }
772
773 // Otherwise, it's an end to end operation.
774
Johnny Chen86364b42011-09-20 23:28:55 +0000775 if (!ProcessIsValid())
776 return false;
777
Johnny Chen01a67862011-10-14 00:42:25 +0000778 size_t num_watchpoints = m_watchpoint_list.GetSize();
Johnny Chen86364b42011-09-20 23:28:55 +0000779 for (size_t i = 0; i < num_watchpoints; ++i)
780 {
Johnny Chen01a67862011-10-14 00:42:25 +0000781 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
782 if (!wp_sp)
Johnny Chen86364b42011-09-20 23:28:55 +0000783 return false;
784
Johnny Chen01a67862011-10-14 00:42:25 +0000785 Error rc = m_process_sp->DisableWatchpoint(wp_sp.get());
Johnny Chen86364b42011-09-20 23:28:55 +0000786 if (rc.Fail())
787 return false;
788 }
Jim Ingham1b5792e2012-12-18 02:03:49 +0000789 m_watchpoint_list.RemoveAll (true);
Jim Inghamb0b45132013-07-02 02:09:46 +0000790 m_last_created_watchpoint.reset();
Johnny Chen86364b42011-09-20 23:28:55 +0000791 return true; // Success!
792}
793
Johnny Chen01a67862011-10-14 00:42:25 +0000794// Assumption: Caller holds the list mutex lock for m_watchpoint_list for end to
795// end operations.
Johnny Chen86364b42011-09-20 23:28:55 +0000796bool
Johnny Chen01a67862011-10-14 00:42:25 +0000797Target::DisableAllWatchpoints (bool end_to_end)
Johnny Chen86364b42011-09-20 23:28:55 +0000798{
Greg Clayton5160ce52013-03-27 23:08:40 +0000799 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen86364b42011-09-20 23:28:55 +0000800 if (log)
801 log->Printf ("Target::%s\n", __FUNCTION__);
802
Johnny Chenedf50372011-09-23 21:21:43 +0000803 if (!end_to_end) {
Johnny Chen01a67862011-10-14 00:42:25 +0000804 m_watchpoint_list.SetEnabledAll(false);
Johnny Chenedf50372011-09-23 21:21:43 +0000805 return true;
806 }
807
808 // Otherwise, it's an end to end operation.
809
Johnny Chen86364b42011-09-20 23:28:55 +0000810 if (!ProcessIsValid())
811 return false;
812
Johnny Chen01a67862011-10-14 00:42:25 +0000813 size_t num_watchpoints = m_watchpoint_list.GetSize();
Johnny Chen86364b42011-09-20 23:28:55 +0000814 for (size_t i = 0; i < num_watchpoints; ++i)
815 {
Johnny Chen01a67862011-10-14 00:42:25 +0000816 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
817 if (!wp_sp)
Johnny Chen86364b42011-09-20 23:28:55 +0000818 return false;
819
Johnny Chen01a67862011-10-14 00:42:25 +0000820 Error rc = m_process_sp->DisableWatchpoint(wp_sp.get());
Johnny Chen86364b42011-09-20 23:28:55 +0000821 if (rc.Fail())
822 return false;
823 }
Johnny Chen86364b42011-09-20 23:28:55 +0000824 return true; // Success!
825}
826
Johnny Chen01a67862011-10-14 00:42:25 +0000827// Assumption: Caller holds the list mutex lock for m_watchpoint_list for end to
828// end operations.
Johnny Chen86364b42011-09-20 23:28:55 +0000829bool
Johnny Chen01a67862011-10-14 00:42:25 +0000830Target::EnableAllWatchpoints (bool end_to_end)
Johnny Chen86364b42011-09-20 23:28:55 +0000831{
Greg Clayton5160ce52013-03-27 23:08:40 +0000832 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen86364b42011-09-20 23:28:55 +0000833 if (log)
834 log->Printf ("Target::%s\n", __FUNCTION__);
835
Johnny Chenedf50372011-09-23 21:21:43 +0000836 if (!end_to_end) {
Johnny Chen01a67862011-10-14 00:42:25 +0000837 m_watchpoint_list.SetEnabledAll(true);
Johnny Chenedf50372011-09-23 21:21:43 +0000838 return true;
839 }
840
841 // Otherwise, it's an end to end operation.
842
Johnny Chen86364b42011-09-20 23:28:55 +0000843 if (!ProcessIsValid())
844 return false;
845
Johnny Chen01a67862011-10-14 00:42:25 +0000846 size_t num_watchpoints = m_watchpoint_list.GetSize();
Johnny Chen86364b42011-09-20 23:28:55 +0000847 for (size_t i = 0; i < num_watchpoints; ++i)
848 {
Johnny Chen01a67862011-10-14 00:42:25 +0000849 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
850 if (!wp_sp)
Johnny Chen86364b42011-09-20 23:28:55 +0000851 return false;
852
Johnny Chen01a67862011-10-14 00:42:25 +0000853 Error rc = m_process_sp->EnableWatchpoint(wp_sp.get());
Johnny Chen86364b42011-09-20 23:28:55 +0000854 if (rc.Fail())
855 return false;
856 }
Johnny Chen86364b42011-09-20 23:28:55 +0000857 return true; // Success!
858}
859
Johnny Chena4d6bc92012-02-25 06:44:30 +0000860// Assumption: Caller holds the list mutex lock for m_watchpoint_list.
861bool
862Target::ClearAllWatchpointHitCounts ()
863{
Greg Clayton5160ce52013-03-27 23:08:40 +0000864 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chena4d6bc92012-02-25 06:44:30 +0000865 if (log)
866 log->Printf ("Target::%s\n", __FUNCTION__);
867
868 size_t num_watchpoints = m_watchpoint_list.GetSize();
869 for (size_t i = 0; i < num_watchpoints; ++i)
870 {
871 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
872 if (!wp_sp)
873 return false;
874
875 wp_sp->ResetHitCount();
876 }
877 return true; // Success!
878}
879
Johnny Chen01a67862011-10-14 00:42:25 +0000880// Assumption: Caller holds the list mutex lock for m_watchpoint_list
Johnny Chen6cc60e82011-10-05 21:35:46 +0000881// during these operations.
882bool
Johnny Chen01a67862011-10-14 00:42:25 +0000883Target::IgnoreAllWatchpoints (uint32_t ignore_count)
Johnny Chen6cc60e82011-10-05 21:35:46 +0000884{
Greg Clayton5160ce52013-03-27 23:08:40 +0000885 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen6cc60e82011-10-05 21:35:46 +0000886 if (log)
887 log->Printf ("Target::%s\n", __FUNCTION__);
888
889 if (!ProcessIsValid())
890 return false;
891
Johnny Chen01a67862011-10-14 00:42:25 +0000892 size_t num_watchpoints = m_watchpoint_list.GetSize();
Johnny Chen6cc60e82011-10-05 21:35:46 +0000893 for (size_t i = 0; i < num_watchpoints; ++i)
894 {
Johnny Chen01a67862011-10-14 00:42:25 +0000895 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
896 if (!wp_sp)
Johnny Chen6cc60e82011-10-05 21:35:46 +0000897 return false;
898
Johnny Chen01a67862011-10-14 00:42:25 +0000899 wp_sp->SetIgnoreCount(ignore_count);
Johnny Chen6cc60e82011-10-05 21:35:46 +0000900 }
901 return true; // Success!
902}
903
Johnny Chen01a67862011-10-14 00:42:25 +0000904// Assumption: Caller holds the list mutex lock for m_watchpoint_list.
Johnny Chen86364b42011-09-20 23:28:55 +0000905bool
Johnny Chen01a67862011-10-14 00:42:25 +0000906Target::DisableWatchpointByID (lldb::watch_id_t watch_id)
Johnny Chen86364b42011-09-20 23:28:55 +0000907{
Greg Clayton5160ce52013-03-27 23:08:40 +0000908 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen86364b42011-09-20 23:28:55 +0000909 if (log)
910 log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
911
912 if (!ProcessIsValid())
913 return false;
914
Johnny Chen01a67862011-10-14 00:42:25 +0000915 WatchpointSP wp_sp = m_watchpoint_list.FindByID (watch_id);
916 if (wp_sp)
Johnny Chen86364b42011-09-20 23:28:55 +0000917 {
Johnny Chen01a67862011-10-14 00:42:25 +0000918 Error rc = m_process_sp->DisableWatchpoint(wp_sp.get());
Johnny Chenf04ee932011-09-22 18:04:58 +0000919 if (rc.Success())
920 return true;
Johnny Chen86364b42011-09-20 23:28:55 +0000921
Johnny Chenf04ee932011-09-22 18:04:58 +0000922 // Else, fallthrough.
Johnny Chen86364b42011-09-20 23:28:55 +0000923 }
924 return false;
925}
926
Johnny Chen01a67862011-10-14 00:42:25 +0000927// Assumption: Caller holds the list mutex lock for m_watchpoint_list.
Johnny Chen86364b42011-09-20 23:28:55 +0000928bool
Johnny Chen01a67862011-10-14 00:42:25 +0000929Target::EnableWatchpointByID (lldb::watch_id_t watch_id)
Johnny Chen86364b42011-09-20 23:28:55 +0000930{
Greg Clayton5160ce52013-03-27 23:08:40 +0000931 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen86364b42011-09-20 23:28:55 +0000932 if (log)
933 log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
934
935 if (!ProcessIsValid())
936 return false;
937
Johnny Chen01a67862011-10-14 00:42:25 +0000938 WatchpointSP wp_sp = m_watchpoint_list.FindByID (watch_id);
939 if (wp_sp)
Johnny Chen86364b42011-09-20 23:28:55 +0000940 {
Johnny Chen01a67862011-10-14 00:42:25 +0000941 Error rc = m_process_sp->EnableWatchpoint(wp_sp.get());
Johnny Chenf04ee932011-09-22 18:04:58 +0000942 if (rc.Success())
943 return true;
Johnny Chen86364b42011-09-20 23:28:55 +0000944
Johnny Chenf04ee932011-09-22 18:04:58 +0000945 // Else, fallthrough.
Johnny Chen86364b42011-09-20 23:28:55 +0000946 }
947 return false;
948}
949
Johnny Chen01a67862011-10-14 00:42:25 +0000950// Assumption: Caller holds the list mutex lock for m_watchpoint_list.
Johnny Chen86364b42011-09-20 23:28:55 +0000951bool
Johnny Chen01a67862011-10-14 00:42:25 +0000952Target::RemoveWatchpointByID (lldb::watch_id_t watch_id)
Johnny Chen86364b42011-09-20 23:28:55 +0000953{
Greg Clayton5160ce52013-03-27 23:08:40 +0000954 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen86364b42011-09-20 23:28:55 +0000955 if (log)
956 log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
957
Jim Inghamb0b45132013-07-02 02:09:46 +0000958 WatchpointSP watch_to_remove_sp = m_watchpoint_list.FindByID(watch_id);
959 if (watch_to_remove_sp == m_last_created_watchpoint)
960 m_last_created_watchpoint.reset();
961
Johnny Chen01a67862011-10-14 00:42:25 +0000962 if (DisableWatchpointByID (watch_id))
Johnny Chen86364b42011-09-20 23:28:55 +0000963 {
Jim Ingham1b5792e2012-12-18 02:03:49 +0000964 m_watchpoint_list.Remove(watch_id, true);
Johnny Chen86364b42011-09-20 23:28:55 +0000965 return true;
966 }
967 return false;
968}
969
Johnny Chen01a67862011-10-14 00:42:25 +0000970// Assumption: Caller holds the list mutex lock for m_watchpoint_list.
Johnny Chen6cc60e82011-10-05 21:35:46 +0000971bool
Johnny Chen01a67862011-10-14 00:42:25 +0000972Target::IgnoreWatchpointByID (lldb::watch_id_t watch_id, uint32_t ignore_count)
Johnny Chen6cc60e82011-10-05 21:35:46 +0000973{
Greg Clayton5160ce52013-03-27 23:08:40 +0000974 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen6cc60e82011-10-05 21:35:46 +0000975 if (log)
976 log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
977
978 if (!ProcessIsValid())
979 return false;
980
Johnny Chen01a67862011-10-14 00:42:25 +0000981 WatchpointSP wp_sp = m_watchpoint_list.FindByID (watch_id);
982 if (wp_sp)
Johnny Chen6cc60e82011-10-05 21:35:46 +0000983 {
Johnny Chen01a67862011-10-14 00:42:25 +0000984 wp_sp->SetIgnoreCount(ignore_count);
Johnny Chen6cc60e82011-10-05 21:35:46 +0000985 return true;
986 }
987 return false;
988}
989
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000990ModuleSP
991Target::GetExecutableModule ()
992{
Greg Claytonaa149cb2011-08-11 02:48:45 +0000993 return m_images.GetModuleAtIndex(0);
994}
995
996Module*
997Target::GetExecutableModulePointer ()
998{
999 return m_images.GetModulePointerAtIndex(0);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001000}
1001
Enrico Granata17598482012-11-08 02:22:02 +00001002static void
1003LoadScriptingResourceForModule (const ModuleSP &module_sp, Target *target)
1004{
1005 Error error;
Enrico Granata97303392013-05-21 00:00:30 +00001006 StreamString feedback_stream;
1007 if (module_sp && !module_sp->LoadScriptingResourceInTarget(target, error, &feedback_stream))
Enrico Granata17598482012-11-08 02:22:02 +00001008 {
Enrico Granata97303392013-05-21 00:00:30 +00001009 if (error.AsCString())
Greg Clayton44d93782014-01-27 23:43:24 +00001010 target->GetDebugger().GetErrorFile()->Printf("unable to load scripting data for module %s - error reported was %s\n",
Enrico Granata97303392013-05-21 00:00:30 +00001011 module_sp->GetFileSpec().GetFileNameStrippingExtension().GetCString(),
1012 error.AsCString());
1013 if (feedback_stream.GetSize())
Greg Clayton44d93782014-01-27 23:43:24 +00001014 target->GetDebugger().GetErrorFile()->Printf("%s\n",
Enrico Granata97303392013-05-21 00:00:30 +00001015 feedback_stream.GetData());
Enrico Granata17598482012-11-08 02:22:02 +00001016 }
1017}
1018
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001019void
Greg Claytonb35db632013-11-09 00:03:31 +00001020Target::ClearModules(bool delete_locations)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001021{
Greg Claytonb35db632013-11-09 00:03:31 +00001022 ModulesDidUnload (m_images, delete_locations);
Greg Claytond5944cd2013-12-06 01:12:00 +00001023 m_section_load_history.Clear();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001024 m_images.Clear();
1025 m_scratch_ast_context_ap.reset();
Sean Callanan4bf80d52011-11-15 22:27:19 +00001026 m_scratch_ast_source_ap.reset();
Sean Callanan686b2312011-11-16 18:20:47 +00001027 m_ast_importer_ap.reset();
Greg Clayton095eeaa2013-11-05 23:28:00 +00001028}
1029
1030void
Greg Claytonb35db632013-11-09 00:03:31 +00001031Target::DidExec ()
1032{
1033 // When a process exec's we need to know about it so we can do some cleanup.
1034 m_breakpoint_list.RemoveInvalidLocations(m_arch);
1035 m_internal_breakpoint_list.RemoveInvalidLocations(m_arch);
1036}
1037
1038void
Greg Clayton095eeaa2013-11-05 23:28:00 +00001039Target::SetExecutableModule (ModuleSP& executable_sp, bool get_dependent_files)
1040{
1041 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TARGET));
Greg Claytonb35db632013-11-09 00:03:31 +00001042 ClearModules(false);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001043
1044 if (executable_sp.get())
1045 {
1046 Timer scoped_timer (__PRETTY_FUNCTION__,
Greg Claytonb5ad4ec2013-04-29 17:25:54 +00001047 "Target::SetExecutableModule (executable = '%s')",
1048 executable_sp->GetFileSpec().GetPath().c_str());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001049
1050 m_images.Append(executable_sp); // The first image is our exectuable file
1051
Jim Ingham5aee1622010-08-09 23:31:02 +00001052 // 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 +00001053 if (!m_arch.IsValid())
Jason Molendae1b68ad2012-12-05 00:25:49 +00001054 {
Greg Clayton32e0a752011-03-30 18:16:51 +00001055 m_arch = executable_sp->GetArchitecture();
Jason Molendae1b68ad2012-12-05 00:25:49 +00001056 if (log)
1057 log->Printf ("Target::SetExecutableModule setting architecture to %s (%s) based on executable file", m_arch.GetArchitectureName(), m_arch.GetTriple().getTriple().c_str());
1058 }
1059
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001060 FileSpecList dependent_files;
Greg Claytone996fd32011-03-08 22:40:15 +00001061 ObjectFile *executable_objfile = executable_sp->GetObjectFile();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001062
Greg Claytoncac9c5f2011-09-24 00:52:29 +00001063 if (executable_objfile && get_dependent_files)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001064 {
1065 executable_objfile->GetDependentModules(dependent_files);
1066 for (uint32_t i=0; i<dependent_files.GetSize(); i++)
1067 {
Greg Claytonded470d2011-03-19 01:12:21 +00001068 FileSpec dependent_file_spec (dependent_files.GetFileSpecPointerAtIndex(i));
1069 FileSpec platform_dependent_file_spec;
1070 if (m_platform_sp)
Steve Puccifc995722014-01-17 18:18:31 +00001071 m_platform_sp->GetFileWithUUID (dependent_file_spec, NULL, platform_dependent_file_spec);
Greg Claytonded470d2011-03-19 01:12:21 +00001072 else
1073 platform_dependent_file_spec = dependent_file_spec;
1074
Greg Claytonb9a01b32012-02-26 05:51:37 +00001075 ModuleSpec module_spec (platform_dependent_file_spec, m_arch);
1076 ModuleSP image_module_sp(GetSharedModule (module_spec));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001077 if (image_module_sp.get())
1078 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001079 ObjectFile *objfile = image_module_sp->GetObjectFile();
1080 if (objfile)
1081 objfile->GetDependentModules(dependent_files);
1082 }
1083 }
1084 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001085 }
1086}
1087
1088
Jim Ingham5aee1622010-08-09 23:31:02 +00001089bool
1090Target::SetArchitecture (const ArchSpec &arch_spec)
1091{
Greg Clayton5160ce52013-03-27 23:08:40 +00001092 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TARGET));
Sean Callananbf4b7be2012-12-13 22:07:14 +00001093 if (m_arch.IsCompatibleMatch(arch_spec) || !m_arch.IsValid())
Jim Ingham5aee1622010-08-09 23:31:02 +00001094 {
Greg Clayton70512312012-05-08 01:45:38 +00001095 // If we haven't got a valid arch spec, or the architectures are
1096 // compatible, so just update the architecture. Architectures can be
1097 // equal, yet the triple OS and vendor might change, so we need to do
1098 // the assignment here just in case.
Greg Clayton32e0a752011-03-30 18:16:51 +00001099 m_arch = arch_spec;
Jason Molendae1b68ad2012-12-05 00:25:49 +00001100 if (log)
1101 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 +00001102 return true;
1103 }
1104 else
1105 {
1106 // If we have an executable file, try to reset the executable to the desired architecture
Jason Molendae1b68ad2012-12-05 00:25:49 +00001107 if (log)
Jason Molenda727e3922012-12-05 23:07:34 +00001108 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 +00001109 m_arch = arch_spec;
Jim Ingham5aee1622010-08-09 23:31:02 +00001110 ModuleSP executable_sp = GetExecutableModule ();
Greg Clayton095eeaa2013-11-05 23:28:00 +00001111
Greg Claytonb35db632013-11-09 00:03:31 +00001112 ClearModules(true);
Jim Ingham5aee1622010-08-09 23:31:02 +00001113 // Need to do something about unsetting breakpoints.
1114
1115 if (executable_sp)
1116 {
Jason Molendae1b68ad2012-12-05 00:25:49 +00001117 if (log)
1118 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 +00001119 ModuleSpec module_spec (executable_sp->GetFileSpec(), arch_spec);
1120 Error error = ModuleList::GetSharedModule (module_spec,
1121 executable_sp,
Greg Clayton6920b522012-08-22 18:39:03 +00001122 &GetExecutableSearchPaths(),
Greg Claytonb9a01b32012-02-26 05:51:37 +00001123 NULL,
1124 NULL);
Jim Ingham5aee1622010-08-09 23:31:02 +00001125
1126 if (!error.Fail() && executable_sp)
1127 {
1128 SetExecutableModule (executable_sp, true);
1129 return true;
1130 }
Jim Ingham5aee1622010-08-09 23:31:02 +00001131 }
1132 }
Greg Clayton70512312012-05-08 01:45:38 +00001133 return false;
Jim Ingham5aee1622010-08-09 23:31:02 +00001134}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001135
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001136void
Enrico Granataefe637d2012-11-08 19:16:03 +00001137Target::WillClearList (const ModuleList& module_list)
Enrico Granata17598482012-11-08 02:22:02 +00001138{
1139}
1140
1141void
Enrico Granataefe637d2012-11-08 19:16:03 +00001142Target::ModuleAdded (const ModuleList& module_list, const ModuleSP &module_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001143{
1144 // A module is being added to this target for the first time
Greg Clayton23f8c952014-03-24 23:10:19 +00001145 if (m_valid)
1146 {
1147 ModuleList my_module_list;
1148 my_module_list.Append(module_sp);
1149 LoadScriptingResourceForModule(module_sp, this);
1150 ModulesDidLoad (my_module_list);
1151 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001152}
1153
1154void
Enrico Granataefe637d2012-11-08 19:16:03 +00001155Target::ModuleRemoved (const ModuleList& module_list, const ModuleSP &module_sp)
Enrico Granata17598482012-11-08 02:22:02 +00001156{
1157 // A module is being added to this target for the first time
Greg Clayton23f8c952014-03-24 23:10:19 +00001158 if (m_valid)
1159 {
1160 ModuleList my_module_list;
1161 my_module_list.Append(module_sp);
1162 ModulesDidUnload (my_module_list, false);
1163 }
Enrico Granata17598482012-11-08 02:22:02 +00001164}
1165
1166void
Enrico Granataefe637d2012-11-08 19:16:03 +00001167Target::ModuleUpdated (const ModuleList& module_list, const ModuleSP &old_module_sp, const ModuleSP &new_module_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001168{
Jim Inghame716ae02011-08-03 01:00:06 +00001169 // A module is replacing an already added module
Greg Clayton23f8c952014-03-24 23:10:19 +00001170 if (m_valid)
1171 m_breakpoint_list.UpdateBreakpointsWhenModuleIsReplaced(old_module_sp, new_module_sp);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001172}
1173
1174void
1175Target::ModulesDidLoad (ModuleList &module_list)
1176{
Greg Clayton23f8c952014-03-24 23:10:19 +00001177 if (m_valid && module_list.GetSize())
Enrico Granata17598482012-11-08 02:22:02 +00001178 {
Greg Clayton095eeaa2013-11-05 23:28:00 +00001179 m_breakpoint_list.UpdateBreakpoints (module_list, true, false);
Jason Molendaeef51062013-11-05 03:57:19 +00001180 if (m_process_sp)
1181 {
Andrew MacPhersoneb4d0602014-03-13 09:37:02 +00001182 m_process_sp->ModulesDidLoad (module_list);
Jason Molendaeef51062013-11-05 03:57:19 +00001183 }
Enrico Granata17598482012-11-08 02:22:02 +00001184 // TODO: make event data that packages up the module_list
1185 BroadcastEvent (eBroadcastBitModulesLoaded, NULL);
1186 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001187}
1188
1189void
Enrico Granataf15ee4e2013-04-05 18:49:06 +00001190Target::SymbolsDidLoad (ModuleList &module_list)
1191{
Greg Clayton23f8c952014-03-24 23:10:19 +00001192 if (m_valid && module_list.GetSize())
Enrico Granataf15ee4e2013-04-05 18:49:06 +00001193 {
Jim Ingham31caf982013-06-04 23:01:35 +00001194 if (m_process_sp)
Enrico Granataf15ee4e2013-04-05 18:49:06 +00001195 {
Jim Ingham31caf982013-06-04 23:01:35 +00001196 LanguageRuntime* runtime = m_process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC);
1197 if (runtime)
1198 {
1199 ObjCLanguageRuntime *objc_runtime = (ObjCLanguageRuntime*)runtime;
1200 objc_runtime->SymbolsDidLoad(module_list);
1201 }
Enrico Granataf15ee4e2013-04-05 18:49:06 +00001202 }
Jim Ingham31caf982013-06-04 23:01:35 +00001203
Greg Clayton095eeaa2013-11-05 23:28:00 +00001204 m_breakpoint_list.UpdateBreakpoints (module_list, true, false);
Jim Ingham31caf982013-06-04 23:01:35 +00001205 BroadcastEvent(eBroadcastBitSymbolsLoaded, NULL);
Enrico Granataf15ee4e2013-04-05 18:49:06 +00001206 }
Enrico Granataf15ee4e2013-04-05 18:49:06 +00001207}
1208
1209void
Greg Clayton095eeaa2013-11-05 23:28:00 +00001210Target::ModulesDidUnload (ModuleList &module_list, bool delete_locations)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001211{
Greg Clayton23f8c952014-03-24 23:10:19 +00001212 if (m_valid && module_list.GetSize())
Enrico Granata17598482012-11-08 02:22:02 +00001213 {
Greg Clayton095eeaa2013-11-05 23:28:00 +00001214 m_breakpoint_list.UpdateBreakpoints (module_list, false, delete_locations);
Enrico Granata17598482012-11-08 02:22:02 +00001215 // TODO: make event data that packages up the module_list
1216 BroadcastEvent (eBroadcastBitModulesUnloaded, NULL);
1217 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001218}
1219
Daniel Dunbarf9f70322011-10-31 22:50:37 +00001220bool
Greg Claytonb9a01b32012-02-26 05:51:37 +00001221Target::ModuleIsExcludedForNonModuleSpecificSearches (const FileSpec &module_file_spec)
Jim Inghamc6674fd2011-10-28 23:14:11 +00001222{
Greg Clayton67cc0632012-08-22 17:17:09 +00001223 if (GetBreakpointsConsultPlatformAvoidList())
Jim Inghamc6674fd2011-10-28 23:14:11 +00001224 {
1225 ModuleList matchingModules;
Greg Claytonb9a01b32012-02-26 05:51:37 +00001226 ModuleSpec module_spec (module_file_spec);
1227 size_t num_modules = GetImages().FindModules(module_spec, matchingModules);
Jim Inghamc6674fd2011-10-28 23:14:11 +00001228
1229 // If there is more than one module for this file spec, only return true if ALL the modules are on the
1230 // black list.
1231 if (num_modules > 0)
1232 {
Andy Gibbsa297a972013-06-19 19:04:53 +00001233 for (size_t i = 0; i < num_modules; i++)
Jim Inghamc6674fd2011-10-28 23:14:11 +00001234 {
1235 if (!ModuleIsExcludedForNonModuleSpecificSearches (matchingModules.GetModuleAtIndex(i)))
1236 return false;
1237 }
1238 return true;
1239 }
Jim Inghamc6674fd2011-10-28 23:14:11 +00001240 }
Greg Clayton67cc0632012-08-22 17:17:09 +00001241 return false;
Jim Inghamc6674fd2011-10-28 23:14:11 +00001242}
1243
Daniel Dunbarf9f70322011-10-31 22:50:37 +00001244bool
Jim Inghamc6674fd2011-10-28 23:14:11 +00001245Target::ModuleIsExcludedForNonModuleSpecificSearches (const lldb::ModuleSP &module_sp)
1246{
Greg Clayton67cc0632012-08-22 17:17:09 +00001247 if (GetBreakpointsConsultPlatformAvoidList())
Jim Inghamc6674fd2011-10-28 23:14:11 +00001248 {
Greg Clayton67cc0632012-08-22 17:17:09 +00001249 if (m_platform_sp)
1250 return m_platform_sp->ModuleIsExcludedForNonModuleSpecificSearches (*this, module_sp);
Jim Inghamc6674fd2011-10-28 23:14:11 +00001251 }
Greg Clayton67cc0632012-08-22 17:17:09 +00001252 return false;
Jim Inghamc6674fd2011-10-28 23:14:11 +00001253}
1254
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001255size_t
Greg Claytondb598232011-01-07 01:57:07 +00001256Target::ReadMemoryFromFileCache (const Address& addr, void *dst, size_t dst_len, Error &error)
1257{
Greg Claytone72dfb32012-02-24 01:59:29 +00001258 SectionSP section_sp (addr.GetSection());
1259 if (section_sp)
Greg Claytondb598232011-01-07 01:57:07 +00001260 {
Jason Molenda216d91f2012-04-25 00:06:56 +00001261 // If the contents of this section are encrypted, the on-disk file is unusuable. Read only from live memory.
1262 if (section_sp->IsEncrypted())
1263 {
Greg Clayton57f06302012-05-25 17:05:55 +00001264 error.SetErrorString("section is encrypted");
Jason Molenda216d91f2012-04-25 00:06:56 +00001265 return 0;
1266 }
Greg Claytone72dfb32012-02-24 01:59:29 +00001267 ModuleSP module_sp (section_sp->GetModule());
1268 if (module_sp)
Greg Claytondb598232011-01-07 01:57:07 +00001269 {
Greg Claytone72dfb32012-02-24 01:59:29 +00001270 ObjectFile *objfile = section_sp->GetModule()->GetObjectFile();
1271 if (objfile)
1272 {
1273 size_t bytes_read = objfile->ReadSectionData (section_sp.get(),
1274 addr.GetOffset(),
1275 dst,
1276 dst_len);
1277 if (bytes_read > 0)
1278 return bytes_read;
1279 else
1280 error.SetErrorStringWithFormat("error reading data from section %s", section_sp->GetName().GetCString());
1281 }
Greg Claytondb598232011-01-07 01:57:07 +00001282 else
Greg Claytone72dfb32012-02-24 01:59:29 +00001283 error.SetErrorString("address isn't from a object file");
Greg Claytondb598232011-01-07 01:57:07 +00001284 }
1285 else
Greg Claytone72dfb32012-02-24 01:59:29 +00001286 error.SetErrorString("address isn't in a module");
Greg Claytondb598232011-01-07 01:57:07 +00001287 }
1288 else
Greg Claytondb598232011-01-07 01:57:07 +00001289 error.SetErrorString("address doesn't contain a section that points to a section in a object file");
Greg Claytone72dfb32012-02-24 01:59:29 +00001290
Greg Claytondb598232011-01-07 01:57:07 +00001291 return 0;
1292}
1293
1294size_t
Enrico Granata9128ee22011-09-06 19:20:51 +00001295Target::ReadMemory (const Address& addr,
1296 bool prefer_file_cache,
1297 void *dst,
1298 size_t dst_len,
1299 Error &error,
1300 lldb::addr_t *load_addr_ptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001301{
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001302 error.Clear();
Greg Claytondb598232011-01-07 01:57:07 +00001303
Enrico Granata9128ee22011-09-06 19:20:51 +00001304 // if we end up reading this from process memory, we will fill this
1305 // with the actual load address
1306 if (load_addr_ptr)
1307 *load_addr_ptr = LLDB_INVALID_ADDRESS;
1308
Greg Claytondb598232011-01-07 01:57:07 +00001309 size_t bytes_read = 0;
Greg Claytonc749eb82011-07-11 05:12:02 +00001310
1311 addr_t load_addr = LLDB_INVALID_ADDRESS;
1312 addr_t file_addr = LLDB_INVALID_ADDRESS;
Greg Clayton357132e2011-03-26 19:14:58 +00001313 Address resolved_addr;
1314 if (!addr.IsSectionOffset())
Greg Claytondda4f7b2010-06-30 23:03:03 +00001315 {
Greg Claytond5944cd2013-12-06 01:12:00 +00001316 SectionLoadList &section_load_list = GetSectionLoadList();
1317 if (section_load_list.IsEmpty())
Greg Claytonc749eb82011-07-11 05:12:02 +00001318 {
Greg Claytond16e1e52011-07-12 17:06:17 +00001319 // No sections are loaded, so we must assume we are not running
1320 // yet and anything we are given is a file address.
1321 file_addr = addr.GetOffset(); // "addr" doesn't have a section, so its offset is the file address
1322 m_images.ResolveFileAddress (file_addr, resolved_addr);
Greg Claytonc749eb82011-07-11 05:12:02 +00001323 }
Greg Claytondda4f7b2010-06-30 23:03:03 +00001324 else
Greg Claytonc749eb82011-07-11 05:12:02 +00001325 {
Greg Claytond16e1e52011-07-12 17:06:17 +00001326 // We have at least one section loaded. This can be becuase
1327 // we have manually loaded some sections with "target modules load ..."
1328 // or because we have have a live process that has sections loaded
1329 // through the dynamic loader
1330 load_addr = addr.GetOffset(); // "addr" doesn't have a section, so its offset is the load address
Greg Claytond5944cd2013-12-06 01:12:00 +00001331 section_load_list.ResolveLoadAddress (load_addr, resolved_addr);
Greg Claytonc749eb82011-07-11 05:12:02 +00001332 }
Greg Claytondda4f7b2010-06-30 23:03:03 +00001333 }
Greg Clayton357132e2011-03-26 19:14:58 +00001334 if (!resolved_addr.IsValid())
1335 resolved_addr = addr;
Greg Claytondda4f7b2010-06-30 23:03:03 +00001336
Greg Claytonc749eb82011-07-11 05:12:02 +00001337
Greg Claytondb598232011-01-07 01:57:07 +00001338 if (prefer_file_cache)
1339 {
1340 bytes_read = ReadMemoryFromFileCache (resolved_addr, dst, dst_len, error);
1341 if (bytes_read > 0)
1342 return bytes_read;
1343 }
Greg Claytondda4f7b2010-06-30 23:03:03 +00001344
Johnny Chen86364b42011-09-20 23:28:55 +00001345 if (ProcessIsValid())
Greg Claytondda4f7b2010-06-30 23:03:03 +00001346 {
Greg Claytonc749eb82011-07-11 05:12:02 +00001347 if (load_addr == LLDB_INVALID_ADDRESS)
1348 load_addr = resolved_addr.GetLoadAddress (this);
1349
Greg Claytondda4f7b2010-06-30 23:03:03 +00001350 if (load_addr == LLDB_INVALID_ADDRESS)
1351 {
Greg Claytone72dfb32012-02-24 01:59:29 +00001352 ModuleSP addr_module_sp (resolved_addr.GetModule());
1353 if (addr_module_sp && addr_module_sp->GetFileSpec())
Daniel Malead01b2952012-11-29 21:49:15 +00001354 error.SetErrorStringWithFormat("%s[0x%" PRIx64 "] can't be resolved, %s in not currently loaded",
Greg Claytone72dfb32012-02-24 01:59:29 +00001355 addr_module_sp->GetFileSpec().GetFilename().AsCString(),
Jason Molenda7e589a62011-09-20 00:26:08 +00001356 resolved_addr.GetFileAddress(),
Greg Claytone72dfb32012-02-24 01:59:29 +00001357 addr_module_sp->GetFileSpec().GetFilename().AsCString());
Greg Claytondda4f7b2010-06-30 23:03:03 +00001358 else
Daniel Malead01b2952012-11-29 21:49:15 +00001359 error.SetErrorStringWithFormat("0x%" PRIx64 " can't be resolved", resolved_addr.GetFileAddress());
Greg Claytondda4f7b2010-06-30 23:03:03 +00001360 }
1361 else
1362 {
Greg Claytondb598232011-01-07 01:57:07 +00001363 bytes_read = m_process_sp->ReadMemory(load_addr, dst, dst_len, error);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001364 if (bytes_read != dst_len)
1365 {
1366 if (error.Success())
1367 {
1368 if (bytes_read == 0)
Daniel Malead01b2952012-11-29 21:49:15 +00001369 error.SetErrorStringWithFormat("read memory from 0x%" PRIx64 " failed", load_addr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001370 else
Daniel Malead01b2952012-11-29 21:49:15 +00001371 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 +00001372 }
1373 }
Greg Claytondda4f7b2010-06-30 23:03:03 +00001374 if (bytes_read)
Enrico Granata9128ee22011-09-06 19:20:51 +00001375 {
1376 if (load_addr_ptr)
1377 *load_addr_ptr = load_addr;
Greg Claytondda4f7b2010-06-30 23:03:03 +00001378 return bytes_read;
Enrico Granata9128ee22011-09-06 19:20:51 +00001379 }
Greg Claytondda4f7b2010-06-30 23:03:03 +00001380 // If the address is not section offset we have an address that
1381 // doesn't resolve to any address in any currently loaded shared
1382 // libaries and we failed to read memory so there isn't anything
1383 // more we can do. If it is section offset, we might be able to
1384 // read cached memory from the object file.
1385 if (!resolved_addr.IsSectionOffset())
1386 return 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001387 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001388 }
Greg Claytondda4f7b2010-06-30 23:03:03 +00001389
Greg Claytonc749eb82011-07-11 05:12:02 +00001390 if (!prefer_file_cache && resolved_addr.IsSectionOffset())
Greg Claytondda4f7b2010-06-30 23:03:03 +00001391 {
Greg Claytondb598232011-01-07 01:57:07 +00001392 // If we didn't already try and read from the object file cache, then
1393 // try it after failing to read from the process.
1394 return ReadMemoryFromFileCache (resolved_addr, dst, dst_len, error);
Greg Claytondda4f7b2010-06-30 23:03:03 +00001395 }
1396 return 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001397}
1398
Greg Claytond16e1e52011-07-12 17:06:17 +00001399size_t
Enrico Granata6b4ddc62013-01-21 19:20:50 +00001400Target::ReadCStringFromMemory (const Address& addr, std::string &out_str, Error &error)
1401{
1402 char buf[256];
1403 out_str.clear();
1404 addr_t curr_addr = addr.GetLoadAddress(this);
1405 Address address(addr);
1406 while (1)
1407 {
1408 size_t length = ReadCStringFromMemory (address, buf, sizeof(buf), error);
1409 if (length == 0)
1410 break;
1411 out_str.append(buf, length);
1412 // If we got "length - 1" bytes, we didn't get the whole C string, we
1413 // need to read some more characters
1414 if (length == sizeof(buf) - 1)
1415 curr_addr += length;
1416 else
1417 break;
1418 address = Address(curr_addr);
1419 }
1420 return out_str.size();
1421}
1422
1423
1424size_t
1425Target::ReadCStringFromMemory (const Address& addr, char *dst, size_t dst_max_len, Error &result_error)
1426{
1427 size_t total_cstr_len = 0;
1428 if (dst && dst_max_len)
1429 {
1430 result_error.Clear();
1431 // NULL out everything just to be safe
1432 memset (dst, 0, dst_max_len);
1433 Error error;
1434 addr_t curr_addr = addr.GetLoadAddress(this);
1435 Address address(addr);
1436 const size_t cache_line_size = 512;
1437 size_t bytes_left = dst_max_len - 1;
1438 char *curr_dst = dst;
1439
1440 while (bytes_left > 0)
1441 {
1442 addr_t cache_line_bytes_left = cache_line_size - (curr_addr % cache_line_size);
1443 addr_t bytes_to_read = std::min<addr_t>(bytes_left, cache_line_bytes_left);
1444 size_t bytes_read = ReadMemory (address, false, curr_dst, bytes_to_read, error);
1445
1446 if (bytes_read == 0)
1447 {
1448 result_error = error;
1449 dst[total_cstr_len] = '\0';
1450 break;
1451 }
1452 const size_t len = strlen(curr_dst);
1453
1454 total_cstr_len += len;
1455
1456 if (len < bytes_to_read)
1457 break;
1458
1459 curr_dst += bytes_read;
1460 curr_addr += bytes_read;
1461 bytes_left -= bytes_read;
1462 address = Address(curr_addr);
1463 }
1464 }
1465 else
1466 {
1467 if (dst == NULL)
1468 result_error.SetErrorString("invalid arguments");
1469 else
1470 result_error.Clear();
1471 }
1472 return total_cstr_len;
1473}
1474
1475size_t
Greg Claytond16e1e52011-07-12 17:06:17 +00001476Target::ReadScalarIntegerFromMemory (const Address& addr,
1477 bool prefer_file_cache,
1478 uint32_t byte_size,
1479 bool is_signed,
1480 Scalar &scalar,
1481 Error &error)
1482{
1483 uint64_t uval;
1484
1485 if (byte_size <= sizeof(uval))
1486 {
1487 size_t bytes_read = ReadMemory (addr, prefer_file_cache, &uval, byte_size, error);
1488 if (bytes_read == byte_size)
1489 {
1490 DataExtractor data (&uval, sizeof(uval), m_arch.GetByteOrder(), m_arch.GetAddressByteSize());
Greg Claytonc7bece562013-01-25 18:06:21 +00001491 lldb::offset_t offset = 0;
Greg Claytond16e1e52011-07-12 17:06:17 +00001492 if (byte_size <= 4)
1493 scalar = data.GetMaxU32 (&offset, byte_size);
1494 else
1495 scalar = data.GetMaxU64 (&offset, byte_size);
1496
1497 if (is_signed)
1498 scalar.SignExtend(byte_size * 8);
1499 return bytes_read;
1500 }
1501 }
1502 else
1503 {
1504 error.SetErrorStringWithFormat ("byte size of %u is too large for integer scalar type", byte_size);
1505 }
1506 return 0;
1507}
1508
1509uint64_t
1510Target::ReadUnsignedIntegerFromMemory (const Address& addr,
1511 bool prefer_file_cache,
1512 size_t integer_byte_size,
1513 uint64_t fail_value,
1514 Error &error)
1515{
1516 Scalar scalar;
1517 if (ReadScalarIntegerFromMemory (addr,
1518 prefer_file_cache,
1519 integer_byte_size,
1520 false,
1521 scalar,
1522 error))
1523 return scalar.ULongLong(fail_value);
1524 return fail_value;
1525}
1526
1527bool
1528Target::ReadPointerFromMemory (const Address& addr,
1529 bool prefer_file_cache,
1530 Error &error,
1531 Address &pointer_addr)
1532{
1533 Scalar scalar;
1534 if (ReadScalarIntegerFromMemory (addr,
1535 prefer_file_cache,
1536 m_arch.GetAddressByteSize(),
1537 false,
1538 scalar,
1539 error))
1540 {
1541 addr_t pointer_vm_addr = scalar.ULongLong(LLDB_INVALID_ADDRESS);
1542 if (pointer_vm_addr != LLDB_INVALID_ADDRESS)
1543 {
Greg Claytond5944cd2013-12-06 01:12:00 +00001544 SectionLoadList &section_load_list = GetSectionLoadList();
1545 if (section_load_list.IsEmpty())
Greg Claytond16e1e52011-07-12 17:06:17 +00001546 {
1547 // No sections are loaded, so we must assume we are not running
1548 // yet and anything we are given is a file address.
1549 m_images.ResolveFileAddress (pointer_vm_addr, pointer_addr);
1550 }
1551 else
1552 {
1553 // We have at least one section loaded. This can be becuase
1554 // we have manually loaded some sections with "target modules load ..."
1555 // or because we have have a live process that has sections loaded
1556 // through the dynamic loader
Greg Claytond5944cd2013-12-06 01:12:00 +00001557 section_load_list.ResolveLoadAddress (pointer_vm_addr, pointer_addr);
Greg Claytond16e1e52011-07-12 17:06:17 +00001558 }
1559 // We weren't able to resolve the pointer value, so just return
1560 // an address with no section
1561 if (!pointer_addr.IsValid())
1562 pointer_addr.SetOffset (pointer_vm_addr);
1563 return true;
1564
1565 }
1566 }
1567 return false;
1568}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001569
1570ModuleSP
Greg Claytonb9a01b32012-02-26 05:51:37 +00001571Target::GetSharedModule (const ModuleSpec &module_spec, Error *error_ptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001572{
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001573 ModuleSP module_sp;
1574
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001575 Error error;
1576
Jim Ingham4a94c912012-05-17 18:38:42 +00001577 // First see if we already have this module in our module list. If we do, then we're done, we don't need
1578 // to consult the shared modules list. But only do this if we are passed a UUID.
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001579
Jim Ingham4a94c912012-05-17 18:38:42 +00001580 if (module_spec.GetUUID().IsValid())
1581 module_sp = m_images.FindFirstModule(module_spec);
1582
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001583 if (!module_sp)
1584 {
Jim Ingham4a94c912012-05-17 18:38:42 +00001585 ModuleSP old_module_sp; // This will get filled in if we have a new version of the library
1586 bool did_create_module = false;
1587
1588 // If there are image search path entries, try to use them first to acquire a suitable image.
1589 if (m_image_search_paths.GetSize())
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001590 {
Jim Ingham4a94c912012-05-17 18:38:42 +00001591 ModuleSpec transformed_spec (module_spec);
1592 if (m_image_search_paths.RemapPath (module_spec.GetFileSpec().GetDirectory(), transformed_spec.GetFileSpec().GetDirectory()))
1593 {
1594 transformed_spec.GetFileSpec().GetFilename() = module_spec.GetFileSpec().GetFilename();
1595 error = ModuleList::GetSharedModule (transformed_spec,
1596 module_sp,
Greg Clayton6920b522012-08-22 18:39:03 +00001597 &GetExecutableSearchPaths(),
Jim Ingham4a94c912012-05-17 18:38:42 +00001598 &old_module_sp,
1599 &did_create_module);
1600 }
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001601 }
Jim Ingham4a94c912012-05-17 18:38:42 +00001602
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001603 if (!module_sp)
1604 {
Jim Ingham4a94c912012-05-17 18:38:42 +00001605 // If we have a UUID, we can check our global shared module list in case
1606 // we already have it. If we don't have a valid UUID, then we can't since
1607 // the path in "module_spec" will be a platform path, and we will need to
1608 // let the platform find that file. For example, we could be asking for
1609 // "/usr/lib/dyld" and if we do not have a UUID, we don't want to pick
1610 // the local copy of "/usr/lib/dyld" since our platform could be a remote
1611 // platform that has its own "/usr/lib/dyld" in an SDK or in a local file
1612 // cache.
1613 if (module_spec.GetUUID().IsValid())
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001614 {
Jim Ingham4a94c912012-05-17 18:38:42 +00001615 // We have a UUID, it is OK to check the global module list...
1616 error = ModuleList::GetSharedModule (module_spec,
1617 module_sp,
Greg Clayton6920b522012-08-22 18:39:03 +00001618 &GetExecutableSearchPaths(),
Greg Clayton67cc0632012-08-22 17:17:09 +00001619 &old_module_sp,
Jim Ingham4a94c912012-05-17 18:38:42 +00001620 &did_create_module);
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001621 }
Jim Ingham4a94c912012-05-17 18:38:42 +00001622
1623 if (!module_sp)
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001624 {
Jim Ingham4a94c912012-05-17 18:38:42 +00001625 // The platform is responsible for finding and caching an appropriate
1626 // module in the shared module cache.
1627 if (m_platform_sp)
1628 {
1629 FileSpec platform_file_spec;
1630 error = m_platform_sp->GetSharedModule (module_spec,
1631 module_sp,
Greg Clayton6920b522012-08-22 18:39:03 +00001632 &GetExecutableSearchPaths(),
Greg Clayton67cc0632012-08-22 17:17:09 +00001633 &old_module_sp,
Jim Ingham4a94c912012-05-17 18:38:42 +00001634 &did_create_module);
1635 }
1636 else
1637 {
1638 error.SetErrorString("no platform is currently set");
1639 }
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001640 }
1641 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001642
Jim Ingham4a94c912012-05-17 18:38:42 +00001643 // We found a module that wasn't in our target list. Let's make sure that there wasn't an equivalent
1644 // module in the list already, and if there was, let's remove it.
1645 if (module_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001646 {
Greg Clayton50a24bd2012-11-29 22:16:27 +00001647 ObjectFile *objfile = module_sp->GetObjectFile();
1648 if (objfile)
Jim Ingham4a94c912012-05-17 18:38:42 +00001649 {
Greg Clayton50a24bd2012-11-29 22:16:27 +00001650 switch (objfile->GetType())
Jim Ingham4a94c912012-05-17 18:38:42 +00001651 {
Greg Clayton50a24bd2012-11-29 22:16:27 +00001652 case ObjectFile::eTypeCoreFile: /// A core file that has a checkpoint of a program's execution state
1653 case ObjectFile::eTypeExecutable: /// A normal executable
1654 case ObjectFile::eTypeDynamicLinker: /// The platform's dynamic linker executable
1655 case ObjectFile::eTypeObjectFile: /// An intermediate object file
1656 case ObjectFile::eTypeSharedLibrary: /// A shared library that can be used during execution
1657 break;
1658 case ObjectFile::eTypeDebugInfo: /// An object file that contains only debug information
1659 if (error_ptr)
1660 error_ptr->SetErrorString("debug info files aren't valid target modules, please specify an executable");
1661 return ModuleSP();
1662 case ObjectFile::eTypeStubLibrary: /// A library that can be linked against but not used for execution
1663 if (error_ptr)
1664 error_ptr->SetErrorString("stub libraries aren't valid target modules, please specify an executable");
1665 return ModuleSP();
1666 default:
1667 if (error_ptr)
1668 error_ptr->SetErrorString("unsupported file type, please specify an executable");
1669 return ModuleSP();
1670 }
1671 // GetSharedModule is not guaranteed to find the old shared module, for instance
1672 // in the common case where you pass in the UUID, it is only going to find the one
1673 // module matching the UUID. In fact, it has no good way to know what the "old module"
1674 // relevant to this target is, since there might be many copies of a module with this file spec
1675 // in various running debug sessions, but only one of them will belong to this target.
1676 // So let's remove the UUID from the module list, and look in the target's module list.
1677 // Only do this if there is SOMETHING else in the module spec...
1678 if (!old_module_sp)
1679 {
1680 if (module_spec.GetUUID().IsValid() && !module_spec.GetFileSpec().GetFilename().IsEmpty() && !module_spec.GetFileSpec().GetDirectory().IsEmpty())
Jim Ingham4a94c912012-05-17 18:38:42 +00001681 {
Greg Clayton50a24bd2012-11-29 22:16:27 +00001682 ModuleSpec module_spec_copy(module_spec.GetFileSpec());
1683 module_spec_copy.GetUUID().Clear();
1684
1685 ModuleList found_modules;
1686 size_t num_found = m_images.FindModules (module_spec_copy, found_modules);
1687 if (num_found == 1)
1688 {
1689 old_module_sp = found_modules.GetModuleAtIndex(0);
1690 }
Jim Ingham4a94c912012-05-17 18:38:42 +00001691 }
1692 }
Greg Clayton50a24bd2012-11-29 22:16:27 +00001693
1694 if (old_module_sp && m_images.GetIndexForModule (old_module_sp.get()) != LLDB_INVALID_INDEX32)
1695 {
1696 m_images.ReplaceModule(old_module_sp, module_sp);
1697 Module *old_module_ptr = old_module_sp.get();
1698 old_module_sp.reset();
1699 ModuleList::RemoveSharedModuleIfOrphaned (old_module_ptr);
1700 }
1701 else
1702 m_images.Append(module_sp);
Jim Ingham4a94c912012-05-17 18:38:42 +00001703 }
Greg Clayton86e70cb2014-04-07 23:50:17 +00001704 else
1705 module_sp.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001706 }
1707 }
1708 if (error_ptr)
1709 *error_ptr = error;
1710 return module_sp;
1711}
1712
1713
Greg Claytond9e416c2012-02-18 05:35:26 +00001714TargetSP
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001715Target::CalculateTarget ()
1716{
Greg Claytond9e416c2012-02-18 05:35:26 +00001717 return shared_from_this();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001718}
1719
Greg Claytond9e416c2012-02-18 05:35:26 +00001720ProcessSP
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001721Target::CalculateProcess ()
1722{
Greg Claytond9e416c2012-02-18 05:35:26 +00001723 return ProcessSP();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001724}
1725
Greg Claytond9e416c2012-02-18 05:35:26 +00001726ThreadSP
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001727Target::CalculateThread ()
1728{
Greg Claytond9e416c2012-02-18 05:35:26 +00001729 return ThreadSP();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001730}
1731
Jason Molendab57e4a12013-11-04 09:33:30 +00001732StackFrameSP
1733Target::CalculateStackFrame ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001734{
Jason Molendab57e4a12013-11-04 09:33:30 +00001735 return StackFrameSP();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001736}
1737
1738void
Greg Clayton0603aa92010-10-04 01:05:56 +00001739Target::CalculateExecutionContext (ExecutionContext &exe_ctx)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001740{
Greg Claytonc14ee322011-09-22 04:58:26 +00001741 exe_ctx.Clear();
1742 exe_ctx.SetTargetPtr(this);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001743}
1744
1745PathMappingList &
1746Target::GetImageSearchPathList ()
1747{
1748 return m_image_search_paths;
1749}
1750
1751void
1752Target::ImageSearchPathsChanged
1753(
1754 const PathMappingList &path_list,
1755 void *baton
1756)
1757{
1758 Target *target = (Target *)baton;
Greg Claytonaa149cb2011-08-11 02:48:45 +00001759 ModuleSP exe_module_sp (target->GetExecutableModule());
1760 if (exe_module_sp)
Greg Claytonaa149cb2011-08-11 02:48:45 +00001761 target->SetExecutableModule (exe_module_sp, true);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001762}
1763
1764ClangASTContext *
Johnny Chen60e2c6a2011-11-30 23:18:53 +00001765Target::GetScratchClangASTContext(bool create_on_demand)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001766{
Greg Clayton73da2442011-08-03 01:23:55 +00001767 // Now see if we know the target triple, and if so, create our scratch AST context:
Johnny Chen60e2c6a2011-11-30 23:18:53 +00001768 if (m_scratch_ast_context_ap.get() == NULL && m_arch.IsValid() && create_on_demand)
Sean Callanan4bf80d52011-11-15 22:27:19 +00001769 {
Greg Clayton73da2442011-08-03 01:23:55 +00001770 m_scratch_ast_context_ap.reset (new ClangASTContext(m_arch.GetTriple().str().c_str()));
Greg Claytone1cd1be2012-01-29 20:56:30 +00001771 m_scratch_ast_source_ap.reset (new ClangASTSource(shared_from_this()));
Sean Callanan4bf80d52011-11-15 22:27:19 +00001772 m_scratch_ast_source_ap->InstallASTContext(m_scratch_ast_context_ap->getASTContext());
Todd Fiala955fe6f2014-02-27 17:18:23 +00001773 llvm::IntrusiveRefCntPtr<clang::ExternalASTSource> proxy_ast_source(m_scratch_ast_source_ap->CreateProxy());
Sean Callanan4bf80d52011-11-15 22:27:19 +00001774 m_scratch_ast_context_ap->SetExternalSource(proxy_ast_source);
1775 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001776 return m_scratch_ast_context_ap.get();
1777}
Caroline Ticedaccaa92010-09-20 20:44:43 +00001778
Sean Callanan686b2312011-11-16 18:20:47 +00001779ClangASTImporter *
1780Target::GetClangASTImporter()
1781{
1782 ClangASTImporter *ast_importer = m_ast_importer_ap.get();
1783
1784 if (!ast_importer)
1785 {
1786 ast_importer = new ClangASTImporter();
1787 m_ast_importer_ap.reset(ast_importer);
1788 }
1789
1790 return ast_importer;
1791}
1792
Greg Clayton99d0faf2010-11-18 23:32:35 +00001793void
Caroline Tice20bd37f2011-03-10 22:14:10 +00001794Target::SettingsInitialize ()
Caroline Ticedaccaa92010-09-20 20:44:43 +00001795{
Greg Clayton6920b522012-08-22 18:39:03 +00001796 Process::SettingsInitialize ();
Greg Clayton99d0faf2010-11-18 23:32:35 +00001797}
Caroline Ticedaccaa92010-09-20 20:44:43 +00001798
Greg Clayton99d0faf2010-11-18 23:32:35 +00001799void
Caroline Tice20bd37f2011-03-10 22:14:10 +00001800Target::SettingsTerminate ()
Greg Clayton99d0faf2010-11-18 23:32:35 +00001801{
Greg Clayton6920b522012-08-22 18:39:03 +00001802 Process::SettingsTerminate ();
Greg Clayton99d0faf2010-11-18 23:32:35 +00001803}
Caroline Ticedaccaa92010-09-20 20:44:43 +00001804
Greg Claytonc859e2d2012-02-13 23:10:39 +00001805FileSpecList
1806Target::GetDefaultExecutableSearchPaths ()
1807{
Greg Clayton67cc0632012-08-22 17:17:09 +00001808 TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
1809 if (properties_sp)
1810 return properties_sp->GetExecutableSearchPaths();
Greg Claytonc859e2d2012-02-13 23:10:39 +00001811 return FileSpecList();
1812}
1813
Michael Sartaina7499c92013-07-01 19:45:50 +00001814FileSpecList
1815Target::GetDefaultDebugFileSearchPaths ()
1816{
1817 TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
1818 if (properties_sp)
1819 return properties_sp->GetDebugFileSearchPaths();
1820 return FileSpecList();
1821}
1822
Caroline Ticedaccaa92010-09-20 20:44:43 +00001823ArchSpec
1824Target::GetDefaultArchitecture ()
1825{
Greg Clayton67cc0632012-08-22 17:17:09 +00001826 TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
1827 if (properties_sp)
1828 return properties_sp->GetDefaultArchitecture();
Greg Clayton8910c902012-05-15 02:44:13 +00001829 return ArchSpec();
Caroline Ticedaccaa92010-09-20 20:44:43 +00001830}
1831
1832void
Greg Clayton67cc0632012-08-22 17:17:09 +00001833Target::SetDefaultArchitecture (const ArchSpec &arch)
Caroline Ticedaccaa92010-09-20 20:44:43 +00001834{
Greg Clayton67cc0632012-08-22 17:17:09 +00001835 TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
1836 if (properties_sp)
Jason Molendaa3f24b32012-12-12 02:23:56 +00001837 {
1838 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 +00001839 return properties_sp->SetDefaultArchitecture(arch);
Jason Molendaa3f24b32012-12-12 02:23:56 +00001840 }
Caroline Ticedaccaa92010-09-20 20:44:43 +00001841}
1842
Greg Clayton0603aa92010-10-04 01:05:56 +00001843Target *
1844Target::GetTargetFromContexts (const ExecutionContext *exe_ctx_ptr, const SymbolContext *sc_ptr)
1845{
1846 // The target can either exist in the "process" of ExecutionContext, or in
1847 // the "target_sp" member of SymbolContext. This accessor helper function
1848 // will get the target from one of these locations.
1849
1850 Target *target = NULL;
1851 if (sc_ptr != NULL)
1852 target = sc_ptr->target_sp.get();
Greg Claytonc14ee322011-09-22 04:58:26 +00001853 if (target == NULL && exe_ctx_ptr)
1854 target = exe_ctx_ptr->GetTargetPtr();
Greg Clayton0603aa92010-10-04 01:05:56 +00001855 return target;
1856}
1857
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001858ExecutionResults
1859Target::EvaluateExpression
1860(
1861 const char *expr_cstr,
Jason Molendab57e4a12013-11-04 09:33:30 +00001862 StackFrame *frame,
Enrico Granata3372f582012-07-16 23:10:35 +00001863 lldb::ValueObjectSP &result_valobj_sp,
Enrico Granatad4439aa2012-09-05 20:41:26 +00001864 const EvaluateExpressionOptions& options
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001865)
1866{
Enrico Granata97fca502012-09-18 17:43:16 +00001867 result_valobj_sp.reset();
1868
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001869 ExecutionResults execution_results = eExecutionSetupError;
1870
Greg Claytond1767f02011-12-08 02:13:16 +00001871 if (expr_cstr == NULL || expr_cstr[0] == '\0')
1872 return execution_results;
1873
Jim Ingham6026ca32011-05-12 02:06:14 +00001874 // We shouldn't run stop hooks in expressions.
1875 // Be sure to reset this if you return anywhere within this function.
1876 bool old_suppress_value = m_suppress_stop_hooks;
1877 m_suppress_stop_hooks = true;
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001878
1879 ExecutionContext exe_ctx;
Sean Callanan0bf0baf2013-01-12 02:04:23 +00001880
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001881 if (frame)
1882 {
1883 frame->CalculateExecutionContext(exe_ctx);
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001884 }
1885 else if (m_process_sp)
1886 {
1887 m_process_sp->CalculateExecutionContext(exe_ctx);
1888 }
1889 else
1890 {
1891 CalculateExecutionContext(exe_ctx);
1892 }
1893
Sean Callanan0bf0baf2013-01-12 02:04:23 +00001894 // Make sure we aren't just trying to see the value of a persistent
1895 // variable (something like "$0")
1896 lldb::ClangExpressionVariableSP persistent_var_sp;
1897 // Only check for persistent variables the expression starts with a '$'
1898 if (expr_cstr[0] == '$')
1899 persistent_var_sp = m_persistent_variables.GetVariable (expr_cstr);
1900
1901 if (persistent_var_sp)
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001902 {
Sean Callanan0bf0baf2013-01-12 02:04:23 +00001903 result_valobj_sp = persistent_var_sp->GetValueObject ();
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001904 execution_results = eExecutionCompleted;
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001905 }
1906 else
1907 {
Sean Callanan0bf0baf2013-01-12 02:04:23 +00001908 const char *prefix = GetExpressionPrefixContentsAsCString();
Greg Clayton62afb9f2013-11-04 19:35:17 +00001909 Error error;
Sean Callanan0bf0baf2013-01-12 02:04:23 +00001910 execution_results = ClangUserExpression::Evaluate (exe_ctx,
Greg Clayton62afb9f2013-11-04 19:35:17 +00001911 options,
1912 expr_cstr,
Sean Callanan0bf0baf2013-01-12 02:04:23 +00001913 prefix,
1914 result_valobj_sp,
Greg Clayton62afb9f2013-11-04 19:35:17 +00001915 error);
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001916 }
Jim Ingham6026ca32011-05-12 02:06:14 +00001917
1918 m_suppress_stop_hooks = old_suppress_value;
1919
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001920 return execution_results;
1921}
1922
Greg Claytonf3ef3d22011-05-22 22:46:53 +00001923lldb::addr_t
1924Target::GetCallableLoadAddress (lldb::addr_t load_addr, AddressClass addr_class) const
1925{
1926 addr_t code_addr = load_addr;
1927 switch (m_arch.GetMachine())
1928 {
1929 case llvm::Triple::arm:
1930 case llvm::Triple::thumb:
1931 switch (addr_class)
1932 {
1933 case eAddressClassData:
1934 case eAddressClassDebug:
1935 return LLDB_INVALID_ADDRESS;
1936
1937 case eAddressClassUnknown:
1938 case eAddressClassInvalid:
1939 case eAddressClassCode:
1940 case eAddressClassCodeAlternateISA:
1941 case eAddressClassRuntime:
1942 // Check if bit zero it no set?
1943 if ((code_addr & 1ull) == 0)
1944 {
1945 // Bit zero isn't set, check if the address is a multiple of 2?
1946 if (code_addr & 2ull)
1947 {
1948 // The address is a multiple of 2 so it must be thumb, set bit zero
1949 code_addr |= 1ull;
1950 }
1951 else if (addr_class == eAddressClassCodeAlternateISA)
1952 {
1953 // We checked the address and the address claims to be the alternate ISA
1954 // which means thumb, so set bit zero.
1955 code_addr |= 1ull;
1956 }
1957 }
1958 break;
1959 }
1960 break;
1961
1962 default:
1963 break;
1964 }
1965 return code_addr;
1966}
1967
1968lldb::addr_t
1969Target::GetOpcodeLoadAddress (lldb::addr_t load_addr, AddressClass addr_class) const
1970{
1971 addr_t opcode_addr = load_addr;
1972 switch (m_arch.GetMachine())
1973 {
1974 case llvm::Triple::arm:
1975 case llvm::Triple::thumb:
1976 switch (addr_class)
1977 {
1978 case eAddressClassData:
1979 case eAddressClassDebug:
1980 return LLDB_INVALID_ADDRESS;
1981
1982 case eAddressClassInvalid:
1983 case eAddressClassUnknown:
1984 case eAddressClassCode:
1985 case eAddressClassCodeAlternateISA:
1986 case eAddressClassRuntime:
1987 opcode_addr &= ~(1ull);
1988 break;
1989 }
1990 break;
1991
1992 default:
1993 break;
1994 }
1995 return opcode_addr;
1996}
1997
Greg Clayton9585fbf2013-03-19 00:20:55 +00001998SourceManager &
1999Target::GetSourceManager ()
2000{
2001 if (m_source_manager_ap.get() == NULL)
2002 m_source_manager_ap.reset (new SourceManager(shared_from_this()));
2003 return *m_source_manager_ap;
2004}
2005
2006
Greg Clayton44d93782014-01-27 23:43:24 +00002007Target::StopHookSP
2008Target::CreateStopHook ()
Jim Ingham9575d842011-03-11 03:53:59 +00002009{
2010 lldb::user_id_t new_uid = ++m_stop_hook_next_id;
Greg Clayton44d93782014-01-27 23:43:24 +00002011 Target::StopHookSP stop_hook_sp (new StopHook(shared_from_this(), new_uid));
2012 m_stop_hooks[new_uid] = stop_hook_sp;
2013 return stop_hook_sp;
Jim Ingham9575d842011-03-11 03:53:59 +00002014}
2015
2016bool
2017Target::RemoveStopHookByID (lldb::user_id_t user_id)
2018{
2019 size_t num_removed;
2020 num_removed = m_stop_hooks.erase (user_id);
2021 if (num_removed == 0)
2022 return false;
2023 else
2024 return true;
2025}
2026
2027void
2028Target::RemoveAllStopHooks ()
2029{
2030 m_stop_hooks.clear();
2031}
2032
2033Target::StopHookSP
2034Target::GetStopHookByID (lldb::user_id_t user_id)
2035{
2036 StopHookSP found_hook;
2037
2038 StopHookCollection::iterator specified_hook_iter;
2039 specified_hook_iter = m_stop_hooks.find (user_id);
2040 if (specified_hook_iter != m_stop_hooks.end())
2041 found_hook = (*specified_hook_iter).second;
2042 return found_hook;
2043}
2044
2045bool
2046Target::SetStopHookActiveStateByID (lldb::user_id_t user_id, bool active_state)
2047{
2048 StopHookCollection::iterator specified_hook_iter;
2049 specified_hook_iter = m_stop_hooks.find (user_id);
2050 if (specified_hook_iter == m_stop_hooks.end())
2051 return false;
2052
2053 (*specified_hook_iter).second->SetIsActive (active_state);
2054 return true;
2055}
2056
2057void
2058Target::SetAllStopHooksActiveState (bool active_state)
2059{
2060 StopHookCollection::iterator pos, end = m_stop_hooks.end();
2061 for (pos = m_stop_hooks.begin(); pos != end; pos++)
2062 {
2063 (*pos).second->SetIsActive (active_state);
2064 }
2065}
2066
2067void
2068Target::RunStopHooks ()
2069{
Jim Ingham6026ca32011-05-12 02:06:14 +00002070 if (m_suppress_stop_hooks)
2071 return;
2072
Jim Ingham9575d842011-03-11 03:53:59 +00002073 if (!m_process_sp)
2074 return;
Enrico Granatae2e091b2012-08-03 22:24:48 +00002075
2076 // <rdar://problem/12027563> make sure we check that we are not stopped because of us running a user expression
2077 // since in that case we do not want to run the stop-hooks
2078 if (m_process_sp->GetModIDRef().IsLastResumeForUserExpression())
2079 return;
2080
Jim Ingham9575d842011-03-11 03:53:59 +00002081 if (m_stop_hooks.empty())
2082 return;
2083
2084 StopHookCollection::iterator pos, end = m_stop_hooks.end();
2085
2086 // If there aren't any active stop hooks, don't bother either:
2087 bool any_active_hooks = false;
2088 for (pos = m_stop_hooks.begin(); pos != end; pos++)
2089 {
2090 if ((*pos).second->IsActive())
2091 {
2092 any_active_hooks = true;
2093 break;
2094 }
2095 }
2096 if (!any_active_hooks)
2097 return;
2098
2099 CommandReturnObject result;
2100
2101 std::vector<ExecutionContext> exc_ctx_with_reasons;
2102 std::vector<SymbolContext> sym_ctx_with_reasons;
2103
2104 ThreadList &cur_threadlist = m_process_sp->GetThreadList();
2105 size_t num_threads = cur_threadlist.GetSize();
2106 for (size_t i = 0; i < num_threads; i++)
2107 {
2108 lldb::ThreadSP cur_thread_sp = cur_threadlist.GetThreadAtIndex (i);
2109 if (cur_thread_sp->ThreadStoppedForAReason())
2110 {
Jason Molendab57e4a12013-11-04 09:33:30 +00002111 lldb::StackFrameSP cur_frame_sp = cur_thread_sp->GetStackFrameAtIndex(0);
Jim Ingham9575d842011-03-11 03:53:59 +00002112 exc_ctx_with_reasons.push_back(ExecutionContext(m_process_sp.get(), cur_thread_sp.get(), cur_frame_sp.get()));
2113 sym_ctx_with_reasons.push_back(cur_frame_sp->GetSymbolContext(eSymbolContextEverything));
2114 }
2115 }
2116
2117 // If no threads stopped for a reason, don't run the stop-hooks.
2118 size_t num_exe_ctx = exc_ctx_with_reasons.size();
2119 if (num_exe_ctx == 0)
2120 return;
2121
Jim Ingham5b52f0c2011-06-02 23:58:26 +00002122 result.SetImmediateOutputStream (m_debugger.GetAsyncOutputStream());
2123 result.SetImmediateErrorStream (m_debugger.GetAsyncErrorStream());
Jim Ingham9575d842011-03-11 03:53:59 +00002124
2125 bool keep_going = true;
2126 bool hooks_ran = false;
Jim Ingham381e25b2011-03-22 01:47:27 +00002127 bool print_hook_header;
2128 bool print_thread_header;
2129
2130 if (num_exe_ctx == 1)
2131 print_thread_header = false;
2132 else
2133 print_thread_header = true;
2134
2135 if (m_stop_hooks.size() == 1)
2136 print_hook_header = false;
2137 else
2138 print_hook_header = true;
2139
Jim Ingham9575d842011-03-11 03:53:59 +00002140 for (pos = m_stop_hooks.begin(); keep_going && pos != end; pos++)
2141 {
2142 // result.Clear();
2143 StopHookSP cur_hook_sp = (*pos).second;
2144 if (!cur_hook_sp->IsActive())
2145 continue;
2146
2147 bool any_thread_matched = false;
2148 for (size_t i = 0; keep_going && i < num_exe_ctx; i++)
2149 {
2150 if ((cur_hook_sp->GetSpecifier () == NULL
2151 || cur_hook_sp->GetSpecifier()->SymbolContextMatches(sym_ctx_with_reasons[i]))
2152 && (cur_hook_sp->GetThreadSpecifier() == NULL
Jim Ingham3d902922012-03-07 22:03:04 +00002153 || cur_hook_sp->GetThreadSpecifier()->ThreadPassesBasicTests(exc_ctx_with_reasons[i].GetThreadRef())))
Jim Ingham9575d842011-03-11 03:53:59 +00002154 {
2155 if (!hooks_ran)
2156 {
Jim Ingham9575d842011-03-11 03:53:59 +00002157 hooks_ran = true;
2158 }
Jim Ingham381e25b2011-03-22 01:47:27 +00002159 if (print_hook_header && !any_thread_matched)
Jim Ingham9575d842011-03-11 03:53:59 +00002160 {
Johnny Chenaeab25c2011-10-24 23:01:06 +00002161 const char *cmd = (cur_hook_sp->GetCommands().GetSize() == 1 ?
2162 cur_hook_sp->GetCommands().GetStringAtIndex(0) :
2163 NULL);
2164 if (cmd)
Daniel Malead01b2952012-11-29 21:49:15 +00002165 result.AppendMessageWithFormat("\n- Hook %" PRIu64 " (%s)\n", cur_hook_sp->GetID(), cmd);
Johnny Chenaeab25c2011-10-24 23:01:06 +00002166 else
Daniel Malead01b2952012-11-29 21:49:15 +00002167 result.AppendMessageWithFormat("\n- Hook %" PRIu64 "\n", cur_hook_sp->GetID());
Jim Ingham9575d842011-03-11 03:53:59 +00002168 any_thread_matched = true;
2169 }
2170
Jim Ingham381e25b2011-03-22 01:47:27 +00002171 if (print_thread_header)
Greg Claytonc14ee322011-09-22 04:58:26 +00002172 result.AppendMessageWithFormat("-- Thread %d\n", exc_ctx_with_reasons[i].GetThreadPtr()->GetIndexID());
Jim Ingham9575d842011-03-11 03:53:59 +00002173
2174 bool stop_on_continue = true;
2175 bool stop_on_error = true;
2176 bool echo_commands = false;
2177 bool print_results = true;
2178 GetDebugger().GetCommandInterpreter().HandleCommands (cur_hook_sp->GetCommands(),
Greg Clayton32e0a752011-03-30 18:16:51 +00002179 &exc_ctx_with_reasons[i],
2180 stop_on_continue,
2181 stop_on_error,
2182 echo_commands,
Enrico Granata5f5ab602012-05-31 01:09:06 +00002183 print_results,
2184 eLazyBoolNo,
Greg Clayton32e0a752011-03-30 18:16:51 +00002185 result);
Jim Ingham9575d842011-03-11 03:53:59 +00002186
2187 // If the command started the target going again, we should bag out of
2188 // running the stop hooks.
Greg Clayton32e0a752011-03-30 18:16:51 +00002189 if ((result.GetStatus() == eReturnStatusSuccessContinuingNoResult) ||
2190 (result.GetStatus() == eReturnStatusSuccessContinuingResult))
Jim Ingham9575d842011-03-11 03:53:59 +00002191 {
Daniel Malead01b2952012-11-29 21:49:15 +00002192 result.AppendMessageWithFormat ("Aborting stop hooks, hook %" PRIu64 " set the program running.", cur_hook_sp->GetID());
Jim Ingham9575d842011-03-11 03:53:59 +00002193 keep_going = false;
2194 }
2195 }
2196 }
2197 }
Jason Molenda879cf772011-09-23 00:42:55 +00002198
Caroline Tice969ed3d2011-05-02 20:41:46 +00002199 result.GetImmediateOutputStream()->Flush();
2200 result.GetImmediateErrorStream()->Flush();
Jim Ingham9575d842011-03-11 03:53:59 +00002201}
2202
Greg Claytonfbb76342013-11-20 21:07:01 +00002203const TargetPropertiesSP &
2204Target::GetGlobalProperties()
2205{
2206 static TargetPropertiesSP g_settings_sp;
2207 if (!g_settings_sp)
2208 {
2209 g_settings_sp.reset (new TargetProperties (NULL));
2210 }
2211 return g_settings_sp;
2212}
2213
2214Error
2215Target::Install (ProcessLaunchInfo *launch_info)
2216{
2217 Error error;
2218 PlatformSP platform_sp (GetPlatform());
2219 if (platform_sp)
2220 {
2221 if (platform_sp->IsRemote())
2222 {
2223 if (platform_sp->IsConnected())
2224 {
2225 // Install all files that have an install path, and always install the
2226 // main executable when connected to a remote platform
2227 const ModuleList& modules = GetImages();
2228 const size_t num_images = modules.GetSize();
2229 for (size_t idx = 0; idx < num_images; ++idx)
2230 {
2231 const bool is_main_executable = idx == 0;
2232 ModuleSP module_sp(modules.GetModuleAtIndex(idx));
2233 if (module_sp)
2234 {
2235 FileSpec local_file (module_sp->GetFileSpec());
2236 if (local_file)
2237 {
2238 FileSpec remote_file (module_sp->GetRemoteInstallFileSpec());
2239 if (!remote_file)
2240 {
2241 if (is_main_executable) // TODO: add setting for always installing main executable???
2242 {
2243 // Always install the main executable
2244 remote_file.GetDirectory() = platform_sp->GetWorkingDirectory();
2245 remote_file.GetFilename() = module_sp->GetFileSpec().GetFilename();
2246 }
2247 }
2248 if (remote_file)
2249 {
2250 error = platform_sp->Install(local_file, remote_file);
2251 if (error.Success())
2252 {
2253 module_sp->SetPlatformFileSpec(remote_file);
2254 if (is_main_executable)
2255 {
2256 if (launch_info)
2257 launch_info->SetExecutableFile(remote_file, false);
2258 }
2259 }
2260 else
2261 break;
2262 }
2263 }
2264 }
2265 }
2266 }
2267 }
2268 }
2269 return error;
2270}
Greg Clayton7b242382011-07-08 00:48:09 +00002271
Greg Claytond5944cd2013-12-06 01:12:00 +00002272bool
2273Target::ResolveLoadAddress (addr_t load_addr, Address &so_addr, uint32_t stop_id)
2274{
2275 return m_section_load_history.ResolveLoadAddress(stop_id, load_addr, so_addr);
2276}
2277
2278bool
2279Target::SetSectionLoadAddress (const SectionSP &section_sp, addr_t new_section_load_addr, bool warn_multiple)
2280{
2281 const addr_t old_section_load_addr = m_section_load_history.GetSectionLoadAddress (SectionLoadHistory::eStopIDNow, section_sp);
2282 if (old_section_load_addr != new_section_load_addr)
2283 {
2284 uint32_t stop_id = 0;
2285 ProcessSP process_sp(GetProcessSP());
2286 if (process_sp)
2287 stop_id = process_sp->GetStopID();
2288 else
2289 stop_id = m_section_load_history.GetLastStopID();
2290 if (m_section_load_history.SetSectionLoadAddress (stop_id, section_sp, new_section_load_addr, warn_multiple))
2291 return true; // Return true if the section load address was changed...
2292 }
2293 return false; // Return false to indicate nothing changed
2294
2295}
2296
2297bool
2298Target::SetSectionUnloaded (const lldb::SectionSP &section_sp)
2299{
2300 uint32_t stop_id = 0;
2301 ProcessSP process_sp(GetProcessSP());
2302 if (process_sp)
2303 stop_id = process_sp->GetStopID();
2304 else
2305 stop_id = m_section_load_history.GetLastStopID();
2306 return m_section_load_history.SetSectionUnloaded (stop_id, section_sp);
2307}
2308
2309bool
2310Target::SetSectionUnloaded (const lldb::SectionSP &section_sp, addr_t load_addr)
2311{
2312 uint32_t stop_id = 0;
2313 ProcessSP process_sp(GetProcessSP());
2314 if (process_sp)
2315 stop_id = process_sp->GetStopID();
2316 else
2317 stop_id = m_section_load_history.GetLastStopID();
2318 return m_section_load_history.SetSectionUnloaded (stop_id, section_sp, load_addr);
2319}
2320
2321void
2322Target::ClearAllLoadedSections ()
2323{
2324 m_section_load_history.Clear();
2325}
2326
Greg Claytonb09c5382013-12-13 17:20:18 +00002327
2328Error
2329Target::Launch (Listener &listener, ProcessLaunchInfo &launch_info)
2330{
2331 Error error;
Greg Claytonb09c5382013-12-13 17:20:18 +00002332
2333 StateType state = eStateInvalid;
2334
Greg Clayton6b32f1e2013-12-18 02:06:45 +00002335 // Scope to temporarily get the process state in case someone has manually
2336 // remotely connected already to a process and we can skip the platform
2337 // launching.
2338 {
2339 ProcessSP process_sp (GetProcessSP());
2340
2341 if (process_sp)
2342 state = process_sp->GetState();
2343 }
2344
Greg Claytonb09c5382013-12-13 17:20:18 +00002345 launch_info.GetFlags().Set (eLaunchFlagDebug);
2346
2347 // Get the value of synchronous execution here. If you wait till after you have started to
2348 // run, then you could have hit a breakpoint, whose command might switch the value, and
2349 // then you'll pick up that incorrect value.
2350 Debugger &debugger = GetDebugger();
2351 const bool synchronous_execution = debugger.GetCommandInterpreter().GetSynchronous ();
2352
2353 PlatformSP platform_sp (GetPlatform());
2354
2355 // Finalize the file actions, and if none were given, default to opening
2356 // up a pseudo terminal
2357 const bool default_to_use_pty = platform_sp ? platform_sp->IsHost() : false;
2358 launch_info.FinalizeFileActions (this, default_to_use_pty);
2359
2360 if (state == eStateConnected)
2361 {
2362 if (launch_info.GetFlags().Test (eLaunchFlagLaunchInTTY))
2363 {
2364 error.SetErrorString("can't launch in tty when launching through a remote connection");
2365 return error;
2366 }
2367 }
2368
2369 if (!launch_info.GetArchitecture().IsValid())
2370 launch_info.GetArchitecture() = GetArchitecture();
2371
2372 if (state != eStateConnected && platform_sp && platform_sp->CanDebugProcess ())
2373 {
2374 m_process_sp = GetPlatform()->DebugProcess (launch_info,
2375 debugger,
2376 this,
2377 listener,
2378 error);
2379 }
2380 else
2381 {
2382 if (state == eStateConnected)
2383 {
2384 assert(m_process_sp);
2385 }
2386 else
2387 {
2388 const char *plugin_name = launch_info.GetProcessPluginName();
2389 CreateProcess (listener, plugin_name, NULL);
2390 }
2391
2392 if (m_process_sp)
2393 error = m_process_sp->Launch (launch_info);
2394 }
2395
2396 if (!m_process_sp)
2397 {
2398 if (error.Success())
2399 error.SetErrorString("failed to launch or debug process");
2400 return error;
2401 }
2402
2403 if (error.Success())
2404 {
2405 if (launch_info.GetFlags().Test(eLaunchFlagStopAtEntry) == false)
2406 {
Greg Clayton44d93782014-01-27 23:43:24 +00002407 ListenerSP hijack_listener_sp (launch_info.GetHijackListener());
2408
2409 StateType state = m_process_sp->WaitForProcessToStop (NULL, NULL, false, hijack_listener_sp.get());
Greg Claytonb09c5382013-12-13 17:20:18 +00002410
2411 if (state == eStateStopped)
2412 {
Greg Clayton44d93782014-01-27 23:43:24 +00002413 if (!synchronous_execution)
2414 m_process_sp->RestoreProcessEvents ();
2415
2416 error = m_process_sp->PrivateResume();
2417
Greg Claytonb09c5382013-12-13 17:20:18 +00002418 if (error.Success())
2419 {
2420 if (synchronous_execution)
2421 {
Greg Clayton44d93782014-01-27 23:43:24 +00002422 state = m_process_sp->WaitForProcessToStop (NULL, NULL, true, hijack_listener_sp.get());
Greg Claytonb09c5382013-12-13 17:20:18 +00002423 const bool must_be_alive = false; // eStateExited is ok, so this must be false
2424 if (!StateIsStoppedState(state, must_be_alive))
2425 {
Greg Clayton44d93782014-01-27 23:43:24 +00002426 error.SetErrorStringWithFormat("process isn't stopped: %s", StateAsCString(state));
Greg Claytonb09c5382013-12-13 17:20:18 +00002427 }
2428 }
2429 }
2430 else
2431 {
Greg Clayton44d93782014-01-27 23:43:24 +00002432 Error error2;
Greg Claytonb09c5382013-12-13 17:20:18 +00002433 error2.SetErrorStringWithFormat("process resume at entry point failed: %s", error.AsCString());
Greg Clayton44d93782014-01-27 23:43:24 +00002434 error = error2;
Greg Claytonb09c5382013-12-13 17:20:18 +00002435 }
2436 }
2437 else
2438 {
2439 error.SetErrorStringWithFormat ("initial process state wasn't stopped: %s", StateAsCString(state));
2440 }
2441 }
Greg Clayton44d93782014-01-27 23:43:24 +00002442 m_process_sp->RestoreProcessEvents ();
Greg Claytonb09c5382013-12-13 17:20:18 +00002443 }
2444 else
2445 {
Greg Clayton44d93782014-01-27 23:43:24 +00002446 Error error2;
Greg Claytonb09c5382013-12-13 17:20:18 +00002447 error2.SetErrorStringWithFormat ("process launch failed: %s", error.AsCString());
Greg Clayton44d93782014-01-27 23:43:24 +00002448 error = error2;
Greg Claytonb09c5382013-12-13 17:20:18 +00002449 }
2450 return error;
2451}
Jim Ingham9575d842011-03-11 03:53:59 +00002452//--------------------------------------------------------------
Greg Claytonfbb76342013-11-20 21:07:01 +00002453// Target::StopHook
Jim Ingham9575d842011-03-11 03:53:59 +00002454//--------------------------------------------------------------
Jim Ingham9575d842011-03-11 03:53:59 +00002455Target::StopHook::StopHook (lldb::TargetSP target_sp, lldb::user_id_t uid) :
2456 UserID (uid),
2457 m_target_sp (target_sp),
Jim Ingham9575d842011-03-11 03:53:59 +00002458 m_commands (),
2459 m_specifier_sp (),
Greg Claytone01e07b2013-04-18 18:10:51 +00002460 m_thread_spec_ap(),
Stephen Wilson71c21d12011-04-11 19:41:40 +00002461 m_active (true)
Jim Ingham9575d842011-03-11 03:53:59 +00002462{
2463}
2464
2465Target::StopHook::StopHook (const StopHook &rhs) :
2466 UserID (rhs.GetID()),
2467 m_target_sp (rhs.m_target_sp),
2468 m_commands (rhs.m_commands),
2469 m_specifier_sp (rhs.m_specifier_sp),
Greg Claytone01e07b2013-04-18 18:10:51 +00002470 m_thread_spec_ap (),
Stephen Wilson71c21d12011-04-11 19:41:40 +00002471 m_active (rhs.m_active)
Jim Ingham9575d842011-03-11 03:53:59 +00002472{
2473 if (rhs.m_thread_spec_ap.get() != NULL)
2474 m_thread_spec_ap.reset (new ThreadSpec(*rhs.m_thread_spec_ap.get()));
2475}
2476
2477
2478Target::StopHook::~StopHook ()
2479{
2480}
2481
2482void
2483Target::StopHook::SetThreadSpecifier (ThreadSpec *specifier)
2484{
2485 m_thread_spec_ap.reset (specifier);
2486}
2487
2488
2489void
2490Target::StopHook::GetDescription (Stream *s, lldb::DescriptionLevel level) const
2491{
2492 int indent_level = s->GetIndentLevel();
2493
2494 s->SetIndentLevel(indent_level + 2);
2495
Daniel Malead01b2952012-11-29 21:49:15 +00002496 s->Printf ("Hook: %" PRIu64 "\n", GetID());
Jim Ingham9575d842011-03-11 03:53:59 +00002497 if (m_active)
2498 s->Indent ("State: enabled\n");
2499 else
2500 s->Indent ("State: disabled\n");
2501
2502 if (m_specifier_sp)
2503 {
2504 s->Indent();
2505 s->PutCString ("Specifier:\n");
2506 s->SetIndentLevel (indent_level + 4);
2507 m_specifier_sp->GetDescription (s, level);
2508 s->SetIndentLevel (indent_level + 2);
2509 }
2510
2511 if (m_thread_spec_ap.get() != NULL)
2512 {
2513 StreamString tmp;
2514 s->Indent("Thread:\n");
2515 m_thread_spec_ap->GetDescription (&tmp, level);
2516 s->SetIndentLevel (indent_level + 4);
2517 s->Indent (tmp.GetData());
2518 s->PutCString ("\n");
2519 s->SetIndentLevel (indent_level + 2);
2520 }
2521
2522 s->Indent ("Commands: \n");
2523 s->SetIndentLevel (indent_level + 4);
2524 uint32_t num_commands = m_commands.GetSize();
2525 for (uint32_t i = 0; i < num_commands; i++)
2526 {
2527 s->Indent(m_commands.GetStringAtIndex(i));
2528 s->PutCString ("\n");
2529 }
2530 s->SetIndentLevel (indent_level);
2531}
2532
Greg Clayton67cc0632012-08-22 17:17:09 +00002533//--------------------------------------------------------------
2534// class TargetProperties
2535//--------------------------------------------------------------
2536
2537OptionEnumValueElement
2538lldb_private::g_dynamic_value_types[] =
Caroline Ticedaccaa92010-09-20 20:44:43 +00002539{
Greg Clayton67cc0632012-08-22 17:17:09 +00002540 { eNoDynamicValues, "no-dynamic-values", "Don't calculate the dynamic type of values"},
2541 { eDynamicCanRunTarget, "run-target", "Calculate the dynamic type of values even if you have to run the target."},
2542 { eDynamicDontRunTarget, "no-run-target", "Calculate the dynamic type of values, but don't run the target."},
2543 { 0, NULL, NULL }
2544};
Caroline Ticedaccaa92010-09-20 20:44:43 +00002545
Greg Clayton1f746072012-08-29 21:13:06 +00002546static OptionEnumValueElement
2547g_inline_breakpoint_enums[] =
2548{
2549 { 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."},
2550 { eInlineBreakpointsHeaders, "headers", "Only check for inline breakpoint locations when setting breakpoints in header files, but not when setting breakpoint in implementation source files (default)."},
2551 { eInlineBreakpointsAlways, "always", "Always look for inline breakpoint locations when setting file and line breakpoints (slower but most accurate)."},
2552 { 0, NULL, NULL }
2553};
2554
Jim Ingham0f063ba2013-03-02 00:26:47 +00002555typedef enum x86DisassemblyFlavor
2556{
2557 eX86DisFlavorDefault,
2558 eX86DisFlavorIntel,
2559 eX86DisFlavorATT
2560} x86DisassemblyFlavor;
2561
2562static OptionEnumValueElement
2563g_x86_dis_flavor_value_types[] =
2564{
2565 { eX86DisFlavorDefault, "default", "Disassembler default (currently att)."},
2566 { eX86DisFlavorIntel, "intel", "Intel disassembler flavor."},
2567 { eX86DisFlavorATT, "att", "AT&T disassembler flavor."},
2568 { 0, NULL, NULL }
2569};
2570
Enrico Granata397ddd52013-05-21 20:13:34 +00002571static OptionEnumValueElement
Daniel Malead79ae052013-08-07 21:54:09 +00002572g_hex_immediate_style_values[] =
2573{
2574 { Disassembler::eHexStyleC, "c", "C-style (0xffff)."},
2575 { Disassembler::eHexStyleAsm, "asm", "Asm-style (0ffffh)."},
2576 { 0, NULL, NULL }
2577};
2578
2579static OptionEnumValueElement
Enrico Granata397ddd52013-05-21 20:13:34 +00002580g_load_script_from_sym_file_values[] =
2581{
2582 { eLoadScriptFromSymFileTrue, "true", "Load debug scripts inside symbol files"},
2583 { eLoadScriptFromSymFileFalse, "false", "Do not load debug scripts inside symbol files."},
2584 { eLoadScriptFromSymFileWarn, "warn", "Warn about debug scripts inside symbol files but do not load them."},
2585 { 0, NULL, NULL }
2586};
2587
Greg Claytonfd814c52013-08-13 01:42:25 +00002588
2589static OptionEnumValueElement
2590g_memory_module_load_level_values[] =
2591{
Greg Clayton86eac942013-08-13 21:32:34 +00002592 { eMemoryModuleLoadLevelMinimal, "minimal" , "Load minimal information when loading modules from memory. Currently this setting loads sections only."},
Greg Claytonfd814c52013-08-13 01:42:25 +00002593 { eMemoryModuleLoadLevelPartial, "partial" , "Load partial information when loading modules from memory. Currently this setting loads sections and function bounds."},
2594 { eMemoryModuleLoadLevelComplete, "complete", "Load complete information when loading modules from memory. Currently this setting loads sections and all symbols."},
2595 { 0, NULL, NULL }
2596};
2597
Greg Clayton67cc0632012-08-22 17:17:09 +00002598static PropertyDefinition
2599g_properties[] =
Caroline Ticedaccaa92010-09-20 20:44:43 +00002600{
Greg Clayton67cc0632012-08-22 17:17:09 +00002601 { "default-arch" , OptionValue::eTypeArch , true , 0 , NULL, NULL, "Default architecture to choose, when there's a choice." },
2602 { "expr-prefix" , OptionValue::eTypeFileSpec , false, 0 , NULL, NULL, "Path to a file containing expressions to be prepended to all expressions." },
2603 { "prefer-dynamic-value" , OptionValue::eTypeEnum , false, eNoDynamicValues , NULL, g_dynamic_value_types, "Should printed values be shown as their dynamic value." },
2604 { "enable-synthetic-value" , OptionValue::eTypeBoolean , false, true , NULL, NULL, "Should synthetic values be used by default whenever available." },
2605 { "skip-prologue" , OptionValue::eTypeBoolean , false, true , NULL, NULL, "Skip function prologues when setting breakpoints by name." },
2606 { "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 "
2607 "where it exists on the current system. It consists of an array of duples, the first element of each duple is "
2608 "some part (starting at the root) of the path to the file when it was built, "
2609 "and the second is where the remainder of the original build hierarchy is rooted on the local system. "
2610 "Each element of the array is checked in order and the first one that results in a match wins." },
2611 { "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 +00002612 { "debug-file-search-paths" , OptionValue::eTypeFileSpecList, false, 0 , NULL, NULL, "List of directories to be searched when locating debug symbol files." },
Greg Clayton67cc0632012-08-22 17:17:09 +00002613 { "max-children-count" , OptionValue::eTypeSInt64 , false, 256 , NULL, NULL, "Maximum number of children to expand in any level of depth." },
2614 { "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 +00002615 { "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 +00002616 { "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 +00002617 { "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." },
2618 { "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 +00002619 { "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." },
2620 { "inherit-env" , OptionValue::eTypeBoolean , false, true , NULL, NULL, "Inherit the environment from the process that is running LLDB." },
2621 { "input-path" , OptionValue::eTypeFileSpec , false, 0 , NULL, NULL, "The file/path to be used by the executable program for reading its standard input." },
2622 { "output-path" , OptionValue::eTypeFileSpec , false, 0 , NULL, NULL, "The file/path to be used by the executable program for writing its standard output." },
2623 { "error-path" , OptionValue::eTypeFileSpec , false, 0 , NULL, NULL, "The file/path to be used by the executable program for writing its standard error." },
2624 { "disable-aslr" , OptionValue::eTypeBoolean , false, true , NULL, NULL, "Disable Address Space Layout Randomization (ASLR)" },
2625 { "disable-stdio" , OptionValue::eTypeBoolean , false, false , NULL, NULL, "Disable stdin/stdout for process (e.g. for a GUI application)" },
Greg Clayton1f746072012-08-29 21:13:06 +00002626 { "inline-breakpoint-strategy" , OptionValue::eTypeEnum , false, eInlineBreakpointsHeaders , NULL, g_inline_breakpoint_enums, "The strategy to use when settings breakpoints by file and line. "
2627 "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. "
2628 "Usually this is limitted to breakpoint locations from inlined functions from header or other include files, or more accurately non-implementation source files. "
2629 "Sometimes code might #include implementation files and cause inlined breakpoint locations in inlined implementation files. "
2630 "Always checking for inlined breakpoint locations can be expensive (memory and time), so we try to minimize the "
2631 "times we look for inlined locations. This setting allows you to control exactly which strategy is used when settings "
2632 "file and line breakpoints." },
Jim Ingham0f063ba2013-03-02 00:26:47 +00002633 // 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.
2634 { "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 +00002635 { "use-hex-immediates" , OptionValue::eTypeBoolean , false, true, NULL, NULL, "Show immediates in disassembly as hexadecimal." },
2636 { "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 +00002637 { "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 +00002638 { "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 +00002639 { "memory-module-load-level" , OptionValue::eTypeEnum , false, eMemoryModuleLoadLevelComplete, NULL, g_memory_module_load_level_values,
2640 "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. "
2641 "This setting helps users control how much information gets loaded when loading modules from memory."
2642 "'complete' is the default value for this setting which will load all sections and symbols by reading them from memory (slowest, most accurate). "
2643 "'partial' will load sections and attempt to find function bounds without downloading the symbol table (faster, still accurate, missing symbol names). "
2644 "'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 +00002645 { "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 +00002646 { "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." },
Greg Clayton67cc0632012-08-22 17:17:09 +00002647 { NULL , OptionValue::eTypeInvalid , false, 0 , NULL, NULL, NULL }
2648};
2649enum
Caroline Ticedaccaa92010-09-20 20:44:43 +00002650{
Greg Clayton67cc0632012-08-22 17:17:09 +00002651 ePropertyDefaultArch,
2652 ePropertyExprPrefix,
2653 ePropertyPreferDynamic,
2654 ePropertyEnableSynthetic,
2655 ePropertySkipPrologue,
2656 ePropertySourceMap,
2657 ePropertyExecutableSearchPaths,
Michael Sartaina7499c92013-07-01 19:45:50 +00002658 ePropertyDebugFileSearchPaths,
Greg Clayton67cc0632012-08-22 17:17:09 +00002659 ePropertyMaxChildrenCount,
2660 ePropertyMaxSummaryLength,
Enrico Granatad325bf92013-06-04 22:54:16 +00002661 ePropertyMaxMemReadSize,
Greg Clayton67cc0632012-08-22 17:17:09 +00002662 ePropertyBreakpointUseAvoidList,
Greg Clayton45392552012-10-17 22:57:12 +00002663 ePropertyArg0,
Greg Clayton67cc0632012-08-22 17:17:09 +00002664 ePropertyRunArgs,
2665 ePropertyEnvVars,
2666 ePropertyInheritEnv,
2667 ePropertyInputPath,
2668 ePropertyOutputPath,
2669 ePropertyErrorPath,
2670 ePropertyDisableASLR,
Greg Clayton1f746072012-08-29 21:13:06 +00002671 ePropertyDisableSTDIO,
Jim Ingham0f063ba2013-03-02 00:26:47 +00002672 ePropertyInlineStrategy,
Jim Ingham17d023f2013-03-13 17:58:04 +00002673 ePropertyDisassemblyFlavor,
Daniel Malead79ae052013-08-07 21:54:09 +00002674 ePropertyUseHexImmediates,
2675 ePropertyHexImmediateStyle,
Enrico Granata2ea43cd2013-05-13 17:03:52 +00002676 ePropertyUseFastStepping,
Enrico Granata97303392013-05-21 00:00:30 +00002677 ePropertyLoadScriptFromSymbolFile,
Greg Claytonfb6621e2013-12-06 21:59:52 +00002678 ePropertyMemoryModuleLoadLevel,
Jason Molendaa4bea722014-02-14 05:06:49 +00002679 ePropertyDisplayExpressionsInCrashlogs,
2680 ePropertyTrapHandlerNames
Greg Clayton67cc0632012-08-22 17:17:09 +00002681};
Caroline Ticedaccaa92010-09-20 20:44:43 +00002682
Caroline Ticedaccaa92010-09-20 20:44:43 +00002683
Greg Clayton67cc0632012-08-22 17:17:09 +00002684class TargetOptionValueProperties : public OptionValueProperties
Greg Claytonbfe5f3b2011-02-18 01:44:25 +00002685{
Greg Clayton67cc0632012-08-22 17:17:09 +00002686public:
2687 TargetOptionValueProperties (const ConstString &name) :
2688 OptionValueProperties (name),
2689 m_target (NULL),
2690 m_got_host_env (false)
Caroline Ticedaccaa92010-09-20 20:44:43 +00002691 {
Caroline Ticedaccaa92010-09-20 20:44:43 +00002692 }
Caroline Ticedaccaa92010-09-20 20:44:43 +00002693
Greg Clayton67cc0632012-08-22 17:17:09 +00002694 // This constructor is used when creating TargetOptionValueProperties when it
2695 // is part of a new lldb_private::Target instance. It will copy all current
2696 // global property values as needed
2697 TargetOptionValueProperties (Target *target, const TargetPropertiesSP &target_properties_sp) :
2698 OptionValueProperties(*target_properties_sp->GetValueProperties()),
2699 m_target (target),
2700 m_got_host_env (false)
Caroline Ticedaccaa92010-09-20 20:44:43 +00002701 {
Greg Clayton67cc0632012-08-22 17:17:09 +00002702 }
2703
2704 virtual const Property *
2705 GetPropertyAtIndex (const ExecutionContext *exe_ctx, bool will_modify, uint32_t idx) const
2706 {
2707 // When gettings the value for a key from the target options, we will always
2708 // try and grab the setting from the current target if there is one. Else we just
2709 // use the one from this instance.
2710 if (idx == ePropertyEnvVars)
2711 GetHostEnvironmentIfNeeded ();
2712
2713 if (exe_ctx)
2714 {
2715 Target *target = exe_ctx->GetTargetPtr();
2716 if (target)
2717 {
2718 TargetOptionValueProperties *target_properties = static_cast<TargetOptionValueProperties *>(target->GetValueProperties().get());
2719 if (this != target_properties)
2720 return target_properties->ProtectedGetPropertyAtIndex (idx);
2721 }
2722 }
2723 return ProtectedGetPropertyAtIndex (idx);
2724 }
Enrico Granata84a53df2013-05-20 22:29:23 +00002725
2726 lldb::TargetSP
2727 GetTargetSP ()
2728 {
2729 return m_target->shared_from_this();
2730 }
2731
Greg Clayton67cc0632012-08-22 17:17:09 +00002732protected:
2733
2734 void
2735 GetHostEnvironmentIfNeeded () const
2736 {
2737 if (!m_got_host_env)
2738 {
2739 if (m_target)
2740 {
2741 m_got_host_env = true;
2742 const uint32_t idx = ePropertyInheritEnv;
2743 if (GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0))
2744 {
2745 PlatformSP platform_sp (m_target->GetPlatform());
2746 if (platform_sp)
2747 {
2748 StringList env;
2749 if (platform_sp->GetEnvironment(env))
2750 {
2751 OptionValueDictionary *env_dict = GetPropertyAtIndexAsOptionValueDictionary (NULL, ePropertyEnvVars);
2752 if (env_dict)
2753 {
2754 const bool can_replace = false;
2755 const size_t envc = env.GetSize();
2756 for (size_t idx=0; idx<envc; idx++)
2757 {
2758 const char *env_entry = env.GetStringAtIndex (idx);
2759 if (env_entry)
2760 {
2761 const char *equal_pos = ::strchr(env_entry, '=');
2762 ConstString key;
2763 // It is ok to have environment variables with no values
2764 const char *value = NULL;
2765 if (equal_pos)
2766 {
2767 key.SetCStringWithLength(env_entry, equal_pos - env_entry);
2768 if (equal_pos[1])
2769 value = equal_pos + 1;
2770 }
2771 else
2772 {
2773 key.SetCString(env_entry);
2774 }
2775 // Don't allow existing keys to be replaced with ones we get from the platform environment
2776 env_dict->SetValueForKey(key, OptionValueSP(new OptionValueString(value)), can_replace);
2777 }
2778 }
2779 }
2780 }
2781 }
2782 }
2783 }
2784 }
2785 }
2786 Target *m_target;
2787 mutable bool m_got_host_env;
2788};
2789
Greg Claytonfbb76342013-11-20 21:07:01 +00002790//----------------------------------------------------------------------
2791// TargetProperties
2792//----------------------------------------------------------------------
Greg Clayton67cc0632012-08-22 17:17:09 +00002793TargetProperties::TargetProperties (Target *target) :
2794 Properties ()
2795{
2796 if (target)
2797 {
2798 m_collection_sp.reset (new TargetOptionValueProperties(target, Target::GetGlobalProperties()));
Caroline Ticedaccaa92010-09-20 20:44:43 +00002799 }
2800 else
Greg Clayton67cc0632012-08-22 17:17:09 +00002801 {
2802 m_collection_sp.reset (new TargetOptionValueProperties(ConstString("target")));
2803 m_collection_sp->Initialize(g_properties);
2804 m_collection_sp->AppendProperty(ConstString("process"),
2805 ConstString("Settings specify to processes."),
2806 true,
2807 Process::GetGlobalProperties()->GetValueProperties());
2808 }
Caroline Ticedaccaa92010-09-20 20:44:43 +00002809}
2810
Greg Clayton67cc0632012-08-22 17:17:09 +00002811TargetProperties::~TargetProperties ()
2812{
2813}
2814ArchSpec
2815TargetProperties::GetDefaultArchitecture () const
2816{
2817 OptionValueArch *value = m_collection_sp->GetPropertyAtIndexAsOptionValueArch (NULL, ePropertyDefaultArch);
2818 if (value)
2819 return value->GetCurrentValue();
2820 return ArchSpec();
2821}
2822
2823void
2824TargetProperties::SetDefaultArchitecture (const ArchSpec& arch)
2825{
2826 OptionValueArch *value = m_collection_sp->GetPropertyAtIndexAsOptionValueArch (NULL, ePropertyDefaultArch);
2827 if (value)
2828 return value->SetCurrentValue(arch, true);
2829}
2830
2831lldb::DynamicValueType
2832TargetProperties::GetPreferDynamicValue() const
2833{
2834 const uint32_t idx = ePropertyPreferDynamic;
2835 return (lldb::DynamicValueType)m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value);
2836}
2837
2838bool
2839TargetProperties::GetDisableASLR () const
2840{
2841 const uint32_t idx = ePropertyDisableASLR;
2842 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
2843}
2844
2845void
2846TargetProperties::SetDisableASLR (bool b)
2847{
2848 const uint32_t idx = ePropertyDisableASLR;
2849 m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b);
2850}
2851
2852bool
2853TargetProperties::GetDisableSTDIO () const
2854{
2855 const uint32_t idx = ePropertyDisableSTDIO;
2856 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
2857}
2858
2859void
2860TargetProperties::SetDisableSTDIO (bool b)
2861{
2862 const uint32_t idx = ePropertyDisableSTDIO;
2863 m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b);
2864}
2865
Jim Ingham0f063ba2013-03-02 00:26:47 +00002866const char *
2867TargetProperties::GetDisassemblyFlavor () const
2868{
2869 const uint32_t idx = ePropertyDisassemblyFlavor;
2870 const char *return_value;
2871
2872 x86DisassemblyFlavor flavor_value = (x86DisassemblyFlavor) m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value);
2873 return_value = g_x86_dis_flavor_value_types[flavor_value].string_value;
2874 return return_value;
2875}
2876
Greg Clayton1f746072012-08-29 21:13:06 +00002877InlineStrategy
2878TargetProperties::GetInlineStrategy () const
2879{
2880 const uint32_t idx = ePropertyInlineStrategy;
2881 return (InlineStrategy)m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value);
2882}
2883
Greg Clayton45392552012-10-17 22:57:12 +00002884const char *
2885TargetProperties::GetArg0 () const
2886{
2887 const uint32_t idx = ePropertyArg0;
2888 return m_collection_sp->GetPropertyAtIndexAsString (NULL, idx, NULL);
2889}
2890
2891void
2892TargetProperties::SetArg0 (const char *arg)
2893{
2894 const uint32_t idx = ePropertyArg0;
2895 m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, arg);
2896}
2897
Greg Clayton67cc0632012-08-22 17:17:09 +00002898bool
2899TargetProperties::GetRunArguments (Args &args) const
2900{
2901 const uint32_t idx = ePropertyRunArgs;
2902 return m_collection_sp->GetPropertyAtIndexAsArgs (NULL, idx, args);
2903}
2904
2905void
2906TargetProperties::SetRunArguments (const Args &args)
2907{
2908 const uint32_t idx = ePropertyRunArgs;
2909 m_collection_sp->SetPropertyAtIndexFromArgs (NULL, idx, args);
2910}
2911
2912size_t
2913TargetProperties::GetEnvironmentAsArgs (Args &env) const
2914{
2915 const uint32_t idx = ePropertyEnvVars;
2916 return m_collection_sp->GetPropertyAtIndexAsArgs (NULL, idx, env);
2917}
2918
2919bool
2920TargetProperties::GetSkipPrologue() const
2921{
2922 const uint32_t idx = ePropertySkipPrologue;
2923 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
2924}
2925
2926PathMappingList &
2927TargetProperties::GetSourcePathMap () const
2928{
2929 const uint32_t idx = ePropertySourceMap;
2930 OptionValuePathMappings *option_value = m_collection_sp->GetPropertyAtIndexAsOptionValuePathMappings (NULL, false, idx);
2931 assert(option_value);
2932 return option_value->GetCurrentValue();
2933}
2934
2935FileSpecList &
Greg Clayton6920b522012-08-22 18:39:03 +00002936TargetProperties::GetExecutableSearchPaths ()
Greg Clayton67cc0632012-08-22 17:17:09 +00002937{
2938 const uint32_t idx = ePropertyExecutableSearchPaths;
2939 OptionValueFileSpecList *option_value = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList (NULL, false, idx);
2940 assert(option_value);
2941 return option_value->GetCurrentValue();
2942}
2943
Michael Sartaina7499c92013-07-01 19:45:50 +00002944FileSpecList &
2945TargetProperties::GetDebugFileSearchPaths ()
2946{
2947 const uint32_t idx = ePropertyDebugFileSearchPaths;
2948 OptionValueFileSpecList *option_value = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList (NULL, false, idx);
2949 assert(option_value);
2950 return option_value->GetCurrentValue();
2951}
2952
Greg Clayton67cc0632012-08-22 17:17:09 +00002953bool
2954TargetProperties::GetEnableSyntheticValue () const
2955{
2956 const uint32_t idx = ePropertyEnableSynthetic;
2957 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
2958}
2959
2960uint32_t
2961TargetProperties::GetMaximumNumberOfChildrenToDisplay() const
2962{
2963 const uint32_t idx = ePropertyMaxChildrenCount;
2964 return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value);
2965}
2966
2967uint32_t
2968TargetProperties::GetMaximumSizeOfStringSummary() const
2969{
2970 const uint32_t idx = ePropertyMaxSummaryLength;
2971 return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value);
2972}
2973
Enrico Granatad325bf92013-06-04 22:54:16 +00002974uint32_t
2975TargetProperties::GetMaximumMemReadSize () const
2976{
2977 const uint32_t idx = ePropertyMaxMemReadSize;
2978 return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value);
2979}
2980
Greg Clayton67cc0632012-08-22 17:17:09 +00002981FileSpec
2982TargetProperties::GetStandardInputPath () const
2983{
2984 const uint32_t idx = ePropertyInputPath;
2985 return m_collection_sp->GetPropertyAtIndexAsFileSpec (NULL, idx);
2986}
2987
2988void
2989TargetProperties::SetStandardInputPath (const char *p)
2990{
2991 const uint32_t idx = ePropertyInputPath;
2992 m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, p);
2993}
2994
2995FileSpec
2996TargetProperties::GetStandardOutputPath () const
2997{
2998 const uint32_t idx = ePropertyOutputPath;
2999 return m_collection_sp->GetPropertyAtIndexAsFileSpec (NULL, idx);
3000}
3001
3002void
3003TargetProperties::SetStandardOutputPath (const char *p)
3004{
3005 const uint32_t idx = ePropertyOutputPath;
3006 m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, p);
3007}
3008
3009FileSpec
3010TargetProperties::GetStandardErrorPath () const
3011{
3012 const uint32_t idx = ePropertyErrorPath;
3013 return m_collection_sp->GetPropertyAtIndexAsFileSpec(NULL, idx);
3014}
3015
Greg Clayton6920b522012-08-22 18:39:03 +00003016const char *
3017TargetProperties::GetExpressionPrefixContentsAsCString ()
3018{
3019 const uint32_t idx = ePropertyExprPrefix;
3020 OptionValueFileSpec *file = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpec (NULL, false, idx);
3021 if (file)
Jim Ingham1e4f4252012-08-22 21:21:16 +00003022 {
Greg Clayton0b0b5122012-08-30 18:15:10 +00003023 const bool null_terminate = true;
3024 DataBufferSP data_sp(file->GetFileContents(null_terminate));
Jim Ingham1e4f4252012-08-22 21:21:16 +00003025 if (data_sp)
3026 return (const char *) data_sp->GetBytes();
3027 }
Greg Clayton6920b522012-08-22 18:39:03 +00003028 return NULL;
3029}
3030
Greg Clayton67cc0632012-08-22 17:17:09 +00003031void
3032TargetProperties::SetStandardErrorPath (const char *p)
3033{
3034 const uint32_t idx = ePropertyErrorPath;
3035 m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, p);
3036}
3037
3038bool
3039TargetProperties::GetBreakpointsConsultPlatformAvoidList ()
3040{
3041 const uint32_t idx = ePropertyBreakpointUseAvoidList;
3042 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3043}
3044
Jim Ingham17d023f2013-03-13 17:58:04 +00003045bool
Daniel Malead79ae052013-08-07 21:54:09 +00003046TargetProperties::GetUseHexImmediates () const
3047{
3048 const uint32_t idx = ePropertyUseHexImmediates;
3049 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3050}
3051
3052bool
Jim Ingham17d023f2013-03-13 17:58:04 +00003053TargetProperties::GetUseFastStepping () const
3054{
3055 const uint32_t idx = ePropertyUseFastStepping;
3056 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3057}
3058
Greg Claytonfb6621e2013-12-06 21:59:52 +00003059bool
3060TargetProperties::GetDisplayExpressionsInCrashlogs () const
3061{
3062 const uint32_t idx = ePropertyDisplayExpressionsInCrashlogs;
3063 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3064}
3065
Enrico Granata397ddd52013-05-21 20:13:34 +00003066LoadScriptFromSymFile
Enrico Granata2ea43cd2013-05-13 17:03:52 +00003067TargetProperties::GetLoadScriptFromSymbolFile () const
3068{
3069 const uint32_t idx = ePropertyLoadScriptFromSymbolFile;
Enrico Granata397ddd52013-05-21 20:13:34 +00003070 return (LoadScriptFromSymFile)m_collection_sp->GetPropertyAtIndexAsEnumeration(NULL, idx, g_properties[idx].default_uint_value);
Enrico Granata2ea43cd2013-05-13 17:03:52 +00003071}
3072
Daniel Malead79ae052013-08-07 21:54:09 +00003073Disassembler::HexImmediateStyle
3074TargetProperties::GetHexImmediateStyle () const
3075{
3076 const uint32_t idx = ePropertyHexImmediateStyle;
3077 return (Disassembler::HexImmediateStyle)m_collection_sp->GetPropertyAtIndexAsEnumeration(NULL, idx, g_properties[idx].default_uint_value);
3078}
3079
Greg Claytonfd814c52013-08-13 01:42:25 +00003080MemoryModuleLoadLevel
3081TargetProperties::GetMemoryModuleLoadLevel() const
3082{
3083 const uint32_t idx = ePropertyMemoryModuleLoadLevel;
3084 return (MemoryModuleLoadLevel)m_collection_sp->GetPropertyAtIndexAsEnumeration(NULL, idx, g_properties[idx].default_uint_value);
3085}
3086
Jason Molendaa4bea722014-02-14 05:06:49 +00003087bool
3088TargetProperties::GetUserSpecifiedTrapHandlerNames (Args &args) const
3089{
3090 const uint32_t idx = ePropertyTrapHandlerNames;
3091 return m_collection_sp->GetPropertyAtIndexAsArgs (NULL, idx, args);
3092}
Greg Claytonfd814c52013-08-13 01:42:25 +00003093
Jason Molendaa4bea722014-02-14 05:06:49 +00003094void
3095TargetProperties::SetUserSpecifiedTrapHandlerNames (const Args &args)
3096{
3097 const uint32_t idx = ePropertyTrapHandlerNames;
3098 m_collection_sp->SetPropertyAtIndexFromArgs (NULL, idx, args);
3099}
Greg Clayton67cc0632012-08-22 17:17:09 +00003100
Greg Claytonfbb76342013-11-20 21:07:01 +00003101//----------------------------------------------------------------------
3102// Target::TargetEventData
3103//----------------------------------------------------------------------
Jim Ingham4bddaeb2012-02-16 06:50:00 +00003104const ConstString &
3105Target::TargetEventData::GetFlavorString ()
3106{
3107 static ConstString g_flavor ("Target::TargetEventData");
3108 return g_flavor;
3109}
3110
3111const ConstString &
3112Target::TargetEventData::GetFlavor () const
3113{
3114 return TargetEventData::GetFlavorString ();
3115}
3116
3117Target::TargetEventData::TargetEventData (const lldb::TargetSP &new_target_sp) :
3118 EventData(),
3119 m_target_sp (new_target_sp)
3120{
3121}
3122
3123Target::TargetEventData::~TargetEventData()
3124{
3125
3126}
3127
3128void
3129Target::TargetEventData::Dump (Stream *s) const
3130{
3131
3132}
3133
3134const TargetSP
3135Target::TargetEventData::GetTargetFromEvent (const lldb::EventSP &event_sp)
3136{
3137 TargetSP target_sp;
3138
3139 const TargetEventData *data = GetEventDataFromEvent (event_sp.get());
3140 if (data)
3141 target_sp = data->m_target_sp;
3142
3143 return target_sp;
3144}
3145
3146const Target::TargetEventData *
3147Target::TargetEventData::GetEventDataFromEvent (const Event *event_ptr)
3148{
3149 if (event_ptr)
3150 {
3151 const EventData *event_data = event_ptr->GetData();
3152 if (event_data && event_data->GetFlavor() == TargetEventData::GetFlavorString())
3153 return static_cast <const TargetEventData *> (event_ptr->GetData());
3154 }
3155 return NULL;
3156}
3157