blob: 00192a56c8e9c4ad85623f00ed2327cece3bc488 [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:241//===-- 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
10#include "lldb/Target/Target.h"
11
12// C Includes
13// C++ Includes
14// Other libraries and framework includes
15// Project includes
16#include "lldb/Breakpoint/BreakpointResolver.h"
17#include "lldb/Breakpoint/BreakpointResolverAddress.h"
18#include "lldb/Breakpoint/BreakpointResolverFileLine.h"
19#include "lldb/Breakpoint/BreakpointResolverName.h"
Greg Clayton8b2fe6d2010-12-14 02:59:5920#include "lldb/Core/Debugger.h"
Chris Lattner30fdc8d2010-06-08 16:52:2421#include "lldb/Core/Event.h"
22#include "lldb/Core/Log.h"
Caroline Tice969ed3d12011-05-02 20:41:4623#include "lldb/Core/StreamAsynchronousIO.h"
Chris Lattner30fdc8d2010-06-08 16:52:2424#include "lldb/Core/StreamString.h"
Greg Clayton8b2fe6d2010-12-14 02:59:5925#include "lldb/Core/Timer.h"
26#include "lldb/Core/ValueObject.h"
Greg Claytoneb0103f2011-04-07 22:46:3527#include "lldb/Expression/ClangUserExpression.h"
Chris Lattner30fdc8d2010-06-08 16:52:2428#include "lldb/Host/Host.h"
Jim Ingham9575d842011-03-11 03:53:5929#include "lldb/Interpreter/CommandInterpreter.h"
30#include "lldb/Interpreter/CommandReturnObject.h"
Chris Lattner30fdc8d2010-06-08 16:52:2431#include "lldb/lldb-private-log.h"
32#include "lldb/Symbol/ObjectFile.h"
33#include "lldb/Target/Process.h"
Greg Clayton8b2fe6d2010-12-14 02:59:5934#include "lldb/Target/StackFrame.h"
Jim Ingham9575d842011-03-11 03:53:5935#include "lldb/Target/Thread.h"
36#include "lldb/Target/ThreadSpec.h"
Chris Lattner30fdc8d2010-06-08 16:52:2437
38using namespace lldb;
39using namespace lldb_private;
40
41//----------------------------------------------------------------------
42// Target constructor
43//----------------------------------------------------------------------
Greg Clayton32e0a752011-03-30 18:16:5144Target::Target(Debugger &debugger, const ArchSpec &target_arch, const lldb::PlatformSP &platform_sp) :
45 Broadcaster ("lldb.target"),
46 ExecutionContextScope (),
Greg Claytondbe54502010-11-19 03:46:0147 TargetInstanceSettings (*GetSettingsController()),
Greg Clayton66111032010-06-23 01:19:2948 m_debugger (debugger),
Greg Clayton32e0a752011-03-30 18:16:5149 m_platform_sp (platform_sp),
Greg Claytonaf67cec2010-12-20 20:49:2350 m_mutex (Mutex::eMutexTypeRecursive),
Greg Clayton32e0a752011-03-30 18:16:5151 m_arch (target_arch),
52 m_images (),
Greg Claytonf5e56de2010-09-14 23:36:4053 m_section_load_list (),
Chris Lattner30fdc8d2010-06-08 16:52:2454 m_breakpoint_list (false),
55 m_internal_breakpoint_list (true),
Johnny Chen1d6bad02011-09-06 20:05:2556 m_watchpoint_location_list (),
Greg Clayton32e0a752011-03-30 18:16:5157 m_process_sp (),
58 m_search_filter_sp (),
Chris Lattner30fdc8d2010-06-08 16:52:2459 m_image_search_paths (ImageSearchPathsChanged, this),
Greg Clayton8b2fe6d2010-12-14 02:59:5960 m_scratch_ast_context_ap (NULL),
Jim Ingham9575d842011-03-11 03:53:5961 m_persistent_variables (),
Greg Clayton32e0a752011-03-30 18:16:5162 m_stop_hooks (),
Jim Ingham6026ca32011-05-12 02:06:1463 m_stop_hook_next_id (0),
64 m_suppress_stop_hooks (false)
Chris Lattner30fdc8d2010-06-08 16:52:2465{
Greg Claytoncfd1ace2010-10-31 03:01:0666 SetEventName (eBroadcastBitBreakpointChanged, "breakpoint-changed");
67 SetEventName (eBroadcastBitModulesLoaded, "modules-loaded");
68 SetEventName (eBroadcastBitModulesUnloaded, "modules-unloaded");
69
Greg Clayton2d4edfb2010-11-06 01:53:3070 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
Chris Lattner30fdc8d2010-06-08 16:52:2471 if (log)
72 log->Printf ("%p Target::Target()", this);
73}
74
75//----------------------------------------------------------------------
76// Destructor
77//----------------------------------------------------------------------
78Target::~Target()
79{
Greg Clayton2d4edfb2010-11-06 01:53:3080 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
Chris Lattner30fdc8d2010-06-08 16:52:2481 if (log)
82 log->Printf ("%p Target::~Target()", this);
83 DeleteCurrentProcess ();
84}
85
86void
Caroline Ticeceb6b132010-10-26 03:11:1387Target::Dump (Stream *s, lldb::DescriptionLevel description_level)
Chris Lattner30fdc8d2010-06-08 16:52:2488{
Greg Clayton89411422010-10-08 00:21:0589// s->Printf("%.*p: ", (int)sizeof(void*) * 2, this);
Caroline Ticeceb6b132010-10-26 03:11:1390 if (description_level != lldb::eDescriptionLevelBrief)
91 {
92 s->Indent();
93 s->PutCString("Target\n");
94 s->IndentMore();
Greg Clayton93aa84e2010-10-29 04:59:3595 m_images.Dump(s);
96 m_breakpoint_list.Dump(s);
97 m_internal_breakpoint_list.Dump(s);
98 s->IndentLess();
Caroline Ticeceb6b132010-10-26 03:11:1399 }
100 else
101 {
Greg Claytonaa149cb2011-08-11 02:48:45102 Module *exe_module = GetExecutableModulePointer();
103 if (exe_module)
104 s->PutCString (exe_module->GetFileSpec().GetFilename().GetCString());
Jim Ingham48028b62011-05-12 01:12:28105 else
106 s->PutCString ("No executable module.");
Caroline Ticeceb6b132010-10-26 03:11:13107 }
Chris Lattner30fdc8d2010-06-08 16:52:24108}
109
110void
111Target::DeleteCurrentProcess ()
112{
113 if (m_process_sp.get())
114 {
Greg Clayton17f69202010-09-14 23:52:43115 m_section_load_list.Clear();
Chris Lattner30fdc8d2010-06-08 16:52:24116 if (m_process_sp->IsAlive())
117 m_process_sp->Destroy();
Jim Inghamd0a3e12b2011-02-16 17:54:55118
119 m_process_sp->Finalize();
Chris Lattner30fdc8d2010-06-08 16:52:24120
121 // Do any cleanup of the target we need to do between process instances.
122 // NB It is better to do this before destroying the process in case the
123 // clean up needs some help from the process.
124 m_breakpoint_list.ClearAllBreakpointSites();
125 m_internal_breakpoint_list.ClearAllBreakpointSites();
126 m_process_sp.reset();
127 }
128}
129
130const lldb::ProcessSP &
131Target::CreateProcess (Listener &listener, const char *plugin_name)
132{
133 DeleteCurrentProcess ();
134 m_process_sp.reset(Process::FindPlugin(*this, plugin_name, listener));
135 return m_process_sp;
136}
137
138const lldb::ProcessSP &
139Target::GetProcessSP () const
140{
141 return m_process_sp;
142}
143
144lldb::TargetSP
145Target::GetSP()
146{
Greg Clayton66111032010-06-23 01:19:29147 return m_debugger.GetTargetList().GetTargetSP(this);
Chris Lattner30fdc8d2010-06-08 16:52:24148}
149
Greg Clayton3418c852011-08-10 02:10:13150void
151Target::Destroy()
152{
153 Mutex::Locker locker (m_mutex);
154 DeleteCurrentProcess ();
155 m_platform_sp.reset();
156 m_arch.Clear();
157 m_images.Clear();
158 m_section_load_list.Clear();
159 const bool notify = false;
160 m_breakpoint_list.RemoveAll(notify);
161 m_internal_breakpoint_list.RemoveAll(notify);
162 m_last_created_breakpoint.reset();
163 m_search_filter_sp.reset();
164 m_image_search_paths.Clear(notify);
165 m_scratch_ast_context_ap.reset();
166 m_persistent_variables.Clear();
167 m_stop_hooks.clear();
168 m_stop_hook_next_id = 0;
169 m_suppress_stop_hooks = false;
170}
171
172
Chris Lattner30fdc8d2010-06-08 16:52:24173BreakpointList &
174Target::GetBreakpointList(bool internal)
175{
176 if (internal)
177 return m_internal_breakpoint_list;
178 else
179 return m_breakpoint_list;
180}
181
182const BreakpointList &
183Target::GetBreakpointList(bool internal) const
184{
185 if (internal)
186 return m_internal_breakpoint_list;
187 else
188 return m_breakpoint_list;
189}
190
191BreakpointSP
192Target::GetBreakpointByID (break_id_t break_id)
193{
194 BreakpointSP bp_sp;
195
196 if (LLDB_BREAK_ID_IS_INTERNAL (break_id))
197 bp_sp = m_internal_breakpoint_list.FindBreakpointByID (break_id);
198 else
199 bp_sp = m_breakpoint_list.FindBreakpointByID (break_id);
200
201 return bp_sp;
202}
203
204BreakpointSP
205Target::CreateBreakpoint (const FileSpec *containingModule, const FileSpec &file, uint32_t line_no, bool check_inlines, bool internal)
206{
207 SearchFilterSP filter_sp(GetSearchFilterForModule (containingModule));
208 BreakpointResolverSP resolver_sp(new BreakpointResolverFileLine (NULL, file, line_no, check_inlines));
209 return CreateBreakpoint (filter_sp, resolver_sp, internal);
210}
211
212
213BreakpointSP
Greg Clayton1b72fcb2010-08-24 00:45:41214Target::CreateBreakpoint (lldb::addr_t addr, bool internal)
Chris Lattner30fdc8d2010-06-08 16:52:24215{
Chris Lattner30fdc8d2010-06-08 16:52:24216 Address so_addr;
217 // Attempt to resolve our load address if possible, though it is ok if
218 // it doesn't resolve to section/offset.
219
Greg Clayton1b72fcb2010-08-24 00:45:41220 // Try and resolve as a load address if possible
Greg Claytonf5e56de2010-09-14 23:36:40221 m_section_load_list.ResolveLoadAddress(addr, so_addr);
Greg Clayton1b72fcb2010-08-24 00:45:41222 if (!so_addr.IsValid())
223 {
224 // The address didn't resolve, so just set this as an absolute address
225 so_addr.SetOffset (addr);
226 }
227 BreakpointSP bp_sp (CreateBreakpoint(so_addr, internal));
Chris Lattner30fdc8d2010-06-08 16:52:24228 return bp_sp;
229}
230
231BreakpointSP
232Target::CreateBreakpoint (Address &addr, bool internal)
233{
234 TargetSP target_sp = this->GetSP();
235 SearchFilterSP filter_sp(new SearchFilter (target_sp));
236 BreakpointResolverSP resolver_sp (new BreakpointResolverAddress (NULL, addr));
237 return CreateBreakpoint (filter_sp, resolver_sp, internal);
238}
239
240BreakpointSP
Greg Claytond16e1e52011-07-12 17:06:17241Target::CreateBreakpoint (const FileSpec *containingModule,
242 const char *func_name,
243 uint32_t func_name_type_mask,
244 bool internal,
245 LazyBool skip_prologue)
Chris Lattner30fdc8d2010-06-08 16:52:24246{
Greg Clayton0c5cd902010-06-28 21:30:43247 BreakpointSP bp_sp;
248 if (func_name)
249 {
250 SearchFilterSP filter_sp(GetSearchFilterForModule (containingModule));
Greg Claytond16e1e52011-07-12 17:06:17251
252 BreakpointResolverSP resolver_sp (new BreakpointResolverName (NULL,
253 func_name,
254 func_name_type_mask,
255 Breakpoint::Exact,
256 skip_prologue == eLazyBoolCalculate ? GetSkipPrologue() : skip_prologue));
Greg Clayton0c5cd902010-06-28 21:30:43257 bp_sp = CreateBreakpoint (filter_sp, resolver_sp, internal);
258 }
259 return bp_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24260}
261
262
263SearchFilterSP
264Target::GetSearchFilterForModule (const FileSpec *containingModule)
265{
266 SearchFilterSP filter_sp;
267 lldb::TargetSP target_sp = this->GetSP();
268 if (containingModule != NULL)
269 {
270 // TODO: We should look into sharing module based search filters
271 // across many breakpoints like we do for the simple target based one
272 filter_sp.reset (new SearchFilterByModule (target_sp, *containingModule));
273 }
274 else
275 {
276 if (m_search_filter_sp.get() == NULL)
277 m_search_filter_sp.reset (new SearchFilter (target_sp));
278 filter_sp = m_search_filter_sp;
279 }
280 return filter_sp;
281}
282
283BreakpointSP
Greg Claytond16e1e52011-07-12 17:06:17284Target::CreateBreakpoint (const FileSpec *containingModule,
285 RegularExpression &func_regex,
286 bool internal,
287 LazyBool skip_prologue)
Chris Lattner30fdc8d2010-06-08 16:52:24288{
289 SearchFilterSP filter_sp(GetSearchFilterForModule (containingModule));
Greg Claytond16e1e52011-07-12 17:06:17290 BreakpointResolverSP resolver_sp(new BreakpointResolverName (NULL,
291 func_regex,
292 skip_prologue == eLazyBoolCalculate ? GetSkipPrologue() : skip_prologue));
Chris Lattner30fdc8d2010-06-08 16:52:24293
294 return CreateBreakpoint (filter_sp, resolver_sp, internal);
295}
296
297BreakpointSP
298Target::CreateBreakpoint (SearchFilterSP &filter_sp, BreakpointResolverSP &resolver_sp, bool internal)
299{
300 BreakpointSP bp_sp;
301 if (filter_sp && resolver_sp)
302 {
303 bp_sp.reset(new Breakpoint (*this, filter_sp, resolver_sp));
304 resolver_sp->SetBreakpoint (bp_sp.get());
305
306 if (internal)
Greg Clayton9fed0d82010-07-23 23:33:17307 m_internal_breakpoint_list.Add (bp_sp, false);
Chris Lattner30fdc8d2010-06-08 16:52:24308 else
Greg Clayton9fed0d82010-07-23 23:33:17309 m_breakpoint_list.Add (bp_sp, true);
Chris Lattner30fdc8d2010-06-08 16:52:24310
Greg Clayton2d4edfb2010-11-06 01:53:30311 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Chris Lattner30fdc8d2010-06-08 16:52:24312 if (log)
313 {
314 StreamString s;
315 bp_sp->GetDescription(&s, lldb::eDescriptionLevelVerbose);
316 log->Printf ("Target::%s (internal = %s) => break_id = %s\n", __FUNCTION__, internal ? "yes" : "no", s.GetData());
317 }
318
Chris Lattner30fdc8d2010-06-08 16:52:24319 bp_sp->ResolveBreakpoint();
320 }
Jim Ingham36f3b362010-10-14 23:45:03321
322 if (!internal && bp_sp)
323 {
324 m_last_created_breakpoint = bp_sp;
325 }
326
Chris Lattner30fdc8d2010-06-08 16:52:24327 return bp_sp;
328}
329
330void
331Target::RemoveAllBreakpoints (bool internal_also)
332{
Greg Clayton2d4edfb2010-11-06 01:53:30333 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Chris Lattner30fdc8d2010-06-08 16:52:24334 if (log)
335 log->Printf ("Target::%s (internal_also = %s)\n", __FUNCTION__, internal_also ? "yes" : "no");
336
Greg Clayton9fed0d82010-07-23 23:33:17337 m_breakpoint_list.RemoveAll (true);
Chris Lattner30fdc8d2010-06-08 16:52:24338 if (internal_also)
Greg Clayton9fed0d82010-07-23 23:33:17339 m_internal_breakpoint_list.RemoveAll (false);
Jim Ingham36f3b362010-10-14 23:45:03340
341 m_last_created_breakpoint.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24342}
343
344void
345Target::DisableAllBreakpoints (bool internal_also)
346{
Greg Clayton2d4edfb2010-11-06 01:53:30347 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Chris Lattner30fdc8d2010-06-08 16:52:24348 if (log)
349 log->Printf ("Target::%s (internal_also = %s)\n", __FUNCTION__, internal_also ? "yes" : "no");
350
351 m_breakpoint_list.SetEnabledAll (false);
352 if (internal_also)
353 m_internal_breakpoint_list.SetEnabledAll (false);
354}
355
356void
357Target::EnableAllBreakpoints (bool internal_also)
358{
Greg Clayton2d4edfb2010-11-06 01:53:30359 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Chris Lattner30fdc8d2010-06-08 16:52:24360 if (log)
361 log->Printf ("Target::%s (internal_also = %s)\n", __FUNCTION__, internal_also ? "yes" : "no");
362
363 m_breakpoint_list.SetEnabledAll (true);
364 if (internal_also)
365 m_internal_breakpoint_list.SetEnabledAll (true);
366}
367
368bool
369Target::RemoveBreakpointByID (break_id_t break_id)
370{
Greg Clayton2d4edfb2010-11-06 01:53:30371 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Chris Lattner30fdc8d2010-06-08 16:52:24372 if (log)
373 log->Printf ("Target::%s (break_id = %i, internal = %s)\n", __FUNCTION__, break_id, LLDB_BREAK_ID_IS_INTERNAL (break_id) ? "yes" : "no");
374
375 if (DisableBreakpointByID (break_id))
376 {
377 if (LLDB_BREAK_ID_IS_INTERNAL (break_id))
Greg Clayton9fed0d82010-07-23 23:33:17378 m_internal_breakpoint_list.Remove(break_id, false);
Chris Lattner30fdc8d2010-06-08 16:52:24379 else
Jim Ingham36f3b362010-10-14 23:45:03380 {
Greg Claytonaa1c5872011-01-24 23:35:47381 if (m_last_created_breakpoint)
382 {
383 if (m_last_created_breakpoint->GetID() == break_id)
384 m_last_created_breakpoint.reset();
385 }
Greg Clayton9fed0d82010-07-23 23:33:17386 m_breakpoint_list.Remove(break_id, true);
Jim Ingham36f3b362010-10-14 23:45:03387 }
Chris Lattner30fdc8d2010-06-08 16:52:24388 return true;
389 }
390 return false;
391}
392
393bool
394Target::DisableBreakpointByID (break_id_t break_id)
395{
Greg Clayton2d4edfb2010-11-06 01:53:30396 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Chris Lattner30fdc8d2010-06-08 16:52:24397 if (log)
398 log->Printf ("Target::%s (break_id = %i, internal = %s)\n", __FUNCTION__, break_id, LLDB_BREAK_ID_IS_INTERNAL (break_id) ? "yes" : "no");
399
400 BreakpointSP bp_sp;
401
402 if (LLDB_BREAK_ID_IS_INTERNAL (break_id))
403 bp_sp = m_internal_breakpoint_list.FindBreakpointByID (break_id);
404 else
405 bp_sp = m_breakpoint_list.FindBreakpointByID (break_id);
406 if (bp_sp)
407 {
408 bp_sp->SetEnabled (false);
409 return true;
410 }
411 return false;
412}
413
414bool
415Target::EnableBreakpointByID (break_id_t break_id)
416{
Greg Clayton2d4edfb2010-11-06 01:53:30417 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Chris Lattner30fdc8d2010-06-08 16:52:24418 if (log)
419 log->Printf ("Target::%s (break_id = %i, internal = %s)\n",
420 __FUNCTION__,
421 break_id,
422 LLDB_BREAK_ID_IS_INTERNAL (break_id) ? "yes" : "no");
423
424 BreakpointSP bp_sp;
425
426 if (LLDB_BREAK_ID_IS_INTERNAL (break_id))
427 bp_sp = m_internal_breakpoint_list.FindBreakpointByID (break_id);
428 else
429 bp_sp = m_breakpoint_list.FindBreakpointByID (break_id);
430
431 if (bp_sp)
432 {
433 bp_sp->SetEnabled (true);
434 return true;
435 }
436 return false;
437}
438
439ModuleSP
440Target::GetExecutableModule ()
441{
Greg Claytonaa149cb2011-08-11 02:48:45442 return m_images.GetModuleAtIndex(0);
443}
444
445Module*
446Target::GetExecutableModulePointer ()
447{
448 return m_images.GetModulePointerAtIndex(0);
Chris Lattner30fdc8d2010-06-08 16:52:24449}
450
451void
452Target::SetExecutableModule (ModuleSP& executable_sp, bool get_dependent_files)
453{
454 m_images.Clear();
455 m_scratch_ast_context_ap.reset();
456
457 if (executable_sp.get())
458 {
459 Timer scoped_timer (__PRETTY_FUNCTION__,
460 "Target::SetExecutableModule (executable = '%s/%s')",
461 executable_sp->GetFileSpec().GetDirectory().AsCString(),
462 executable_sp->GetFileSpec().GetFilename().AsCString());
463
464 m_images.Append(executable_sp); // The first image is our exectuable file
465
Jim Ingham5aee1622010-08-09 23:31:02466 // 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:51467 if (!m_arch.IsValid())
468 m_arch = executable_sp->GetArchitecture();
Jim Ingham5aee1622010-08-09 23:31:02469
Chris Lattner30fdc8d2010-06-08 16:52:24470 FileSpecList dependent_files;
Greg Claytone996fd32011-03-08 22:40:15471 ObjectFile *executable_objfile = executable_sp->GetObjectFile();
Chris Lattner30fdc8d2010-06-08 16:52:24472
473 if (executable_objfile)
474 {
475 executable_objfile->GetDependentModules(dependent_files);
476 for (uint32_t i=0; i<dependent_files.GetSize(); i++)
477 {
Greg Claytonded470d2011-03-19 01:12:21478 FileSpec dependent_file_spec (dependent_files.GetFileSpecPointerAtIndex(i));
479 FileSpec platform_dependent_file_spec;
480 if (m_platform_sp)
Greg Claytond314e812011-03-23 00:09:55481 m_platform_sp->GetFile (dependent_file_spec, NULL, platform_dependent_file_spec);
Greg Claytonded470d2011-03-19 01:12:21482 else
483 platform_dependent_file_spec = dependent_file_spec;
484
485 ModuleSP image_module_sp(GetSharedModule (platform_dependent_file_spec,
Greg Clayton32e0a752011-03-30 18:16:51486 m_arch));
Chris Lattner30fdc8d2010-06-08 16:52:24487 if (image_module_sp.get())
488 {
Chris Lattner30fdc8d2010-06-08 16:52:24489 ObjectFile *objfile = image_module_sp->GetObjectFile();
490 if (objfile)
491 objfile->GetDependentModules(dependent_files);
492 }
493 }
494 }
495
Chris Lattner30fdc8d2010-06-08 16:52:24496 }
Caroline Tice1559a462010-09-27 00:30:10497
498 UpdateInstanceName();
Chris Lattner30fdc8d2010-06-08 16:52:24499}
500
501
Jim Ingham5aee1622010-08-09 23:31:02502bool
503Target::SetArchitecture (const ArchSpec &arch_spec)
504{
Greg Clayton32e0a752011-03-30 18:16:51505 if (m_arch == arch_spec)
Jim Ingham5aee1622010-08-09 23:31:02506 {
507 // If we're setting the architecture to our current architecture, we
508 // don't need to do anything.
509 return true;
510 }
Greg Clayton32e0a752011-03-30 18:16:51511 else if (!m_arch.IsValid())
Jim Ingham5aee1622010-08-09 23:31:02512 {
513 // If we haven't got a valid arch spec, then we just need to set it.
Greg Clayton32e0a752011-03-30 18:16:51514 m_arch = arch_spec;
Jim Ingham5aee1622010-08-09 23:31:02515 return true;
516 }
517 else
518 {
519 // If we have an executable file, try to reset the executable to the desired architecture
Greg Clayton32e0a752011-03-30 18:16:51520 m_arch = arch_spec;
Jim Ingham5aee1622010-08-09 23:31:02521 ModuleSP executable_sp = GetExecutableModule ();
522 m_images.Clear();
523 m_scratch_ast_context_ap.reset();
Jim Ingham5aee1622010-08-09 23:31:02524 // Need to do something about unsetting breakpoints.
525
526 if (executable_sp)
527 {
528 FileSpec exec_file_spec = executable_sp->GetFileSpec();
529 Error error = ModuleList::GetSharedModule(exec_file_spec,
530 arch_spec,
531 NULL,
532 NULL,
533 0,
534 executable_sp,
535 NULL,
536 NULL);
537
538 if (!error.Fail() && executable_sp)
539 {
540 SetExecutableModule (executable_sp, true);
541 return true;
542 }
543 else
544 {
545 return false;
546 }
547 }
548 else
549 {
550 return false;
551 }
552 }
553}
Chris Lattner30fdc8d2010-06-08 16:52:24554
Chris Lattner30fdc8d2010-06-08 16:52:24555void
556Target::ModuleAdded (ModuleSP &module_sp)
557{
558 // A module is being added to this target for the first time
559 ModuleList module_list;
560 module_list.Append(module_sp);
561 ModulesDidLoad (module_list);
562}
563
564void
565Target::ModuleUpdated (ModuleSP &old_module_sp, ModuleSP &new_module_sp)
566{
Jim Inghame716ae02011-08-03 01:00:06567 // A module is replacing an already added module
Chris Lattner30fdc8d2010-06-08 16:52:24568 ModuleList module_list;
569 module_list.Append (old_module_sp);
570 ModulesDidUnload (module_list);
571 module_list.Clear ();
572 module_list.Append (new_module_sp);
573 ModulesDidLoad (module_list);
574}
575
576void
577Target::ModulesDidLoad (ModuleList &module_list)
578{
579 m_breakpoint_list.UpdateBreakpoints (module_list, true);
580 // TODO: make event data that packages up the module_list
581 BroadcastEvent (eBroadcastBitModulesLoaded, NULL);
582}
583
584void
585Target::ModulesDidUnload (ModuleList &module_list)
586{
587 m_breakpoint_list.UpdateBreakpoints (module_list, false);
Greg Claytona4d78302010-12-06 23:51:26588
589 // Remove the images from the target image list
590 m_images.Remove(module_list);
591
Chris Lattner30fdc8d2010-06-08 16:52:24592 // TODO: make event data that packages up the module_list
593 BroadcastEvent (eBroadcastBitModulesUnloaded, NULL);
594}
595
596size_t
Greg Claytondb598232011-01-07 01:57:07597Target::ReadMemoryFromFileCache (const Address& addr, void *dst, size_t dst_len, Error &error)
598{
599 const Section *section = addr.GetSection();
600 if (section && section->GetModule())
601 {
602 ObjectFile *objfile = section->GetModule()->GetObjectFile();
603 if (objfile)
604 {
605 size_t bytes_read = section->ReadSectionDataFromObjectFile (objfile,
606 addr.GetOffset(),
607 dst,
608 dst_len);
609 if (bytes_read > 0)
610 return bytes_read;
611 else
612 error.SetErrorStringWithFormat("error reading data from section %s", section->GetName().GetCString());
613 }
614 else
615 {
616 error.SetErrorString("address isn't from a object file");
617 }
618 }
619 else
620 {
621 error.SetErrorString("address doesn't contain a section that points to a section in a object file");
622 }
623 return 0;
624}
625
626size_t
Enrico Granata9128ee2f2011-09-06 19:20:51627Target::ReadMemory (const Address& addr,
628 bool prefer_file_cache,
629 void *dst,
630 size_t dst_len,
631 Error &error,
632 lldb::addr_t *load_addr_ptr)
Chris Lattner30fdc8d2010-06-08 16:52:24633{
Chris Lattner30fdc8d2010-06-08 16:52:24634 error.Clear();
Greg Claytondb598232011-01-07 01:57:07635
Enrico Granata9128ee2f2011-09-06 19:20:51636 // if we end up reading this from process memory, we will fill this
637 // with the actual load address
638 if (load_addr_ptr)
639 *load_addr_ptr = LLDB_INVALID_ADDRESS;
640
Greg Claytondda4f7b2010-06-30 23:03:03641 bool process_is_valid = m_process_sp && m_process_sp->IsAlive();
642
Greg Claytondb598232011-01-07 01:57:07643 size_t bytes_read = 0;
Greg Claytonc749eb82011-07-11 05:12:02644
645 addr_t load_addr = LLDB_INVALID_ADDRESS;
646 addr_t file_addr = LLDB_INVALID_ADDRESS;
Greg Clayton357132e2011-03-26 19:14:58647 Address resolved_addr;
648 if (!addr.IsSectionOffset())
Greg Claytondda4f7b2010-06-30 23:03:03649 {
Greg Claytond16e1e52011-07-12 17:06:17650 if (m_section_load_list.IsEmpty())
Greg Claytonc749eb82011-07-11 05:12:02651 {
Greg Claytond16e1e52011-07-12 17:06:17652 // No sections are loaded, so we must assume we are not running
653 // yet and anything we are given is a file address.
654 file_addr = addr.GetOffset(); // "addr" doesn't have a section, so its offset is the file address
655 m_images.ResolveFileAddress (file_addr, resolved_addr);
Greg Claytonc749eb82011-07-11 05:12:02656 }
Greg Claytondda4f7b2010-06-30 23:03:03657 else
Greg Claytonc749eb82011-07-11 05:12:02658 {
Greg Claytond16e1e52011-07-12 17:06:17659 // We have at least one section loaded. This can be becuase
660 // we have manually loaded some sections with "target modules load ..."
661 // or because we have have a live process that has sections loaded
662 // through the dynamic loader
663 load_addr = addr.GetOffset(); // "addr" doesn't have a section, so its offset is the load address
664 m_section_load_list.ResolveLoadAddress (load_addr, resolved_addr);
Greg Claytonc749eb82011-07-11 05:12:02665 }
Greg Claytondda4f7b2010-06-30 23:03:03666 }
Greg Clayton357132e2011-03-26 19:14:58667 if (!resolved_addr.IsValid())
668 resolved_addr = addr;
Greg Claytondda4f7b2010-06-30 23:03:03669
Greg Claytonc749eb82011-07-11 05:12:02670
Greg Claytondb598232011-01-07 01:57:07671 if (prefer_file_cache)
672 {
673 bytes_read = ReadMemoryFromFileCache (resolved_addr, dst, dst_len, error);
674 if (bytes_read > 0)
675 return bytes_read;
676 }
Greg Claytondda4f7b2010-06-30 23:03:03677
678 if (process_is_valid)
679 {
Greg Claytonc749eb82011-07-11 05:12:02680 if (load_addr == LLDB_INVALID_ADDRESS)
681 load_addr = resolved_addr.GetLoadAddress (this);
682
Greg Claytondda4f7b2010-06-30 23:03:03683 if (load_addr == LLDB_INVALID_ADDRESS)
684 {
685 if (resolved_addr.GetModule() && resolved_addr.GetModule()->GetFileSpec())
686 error.SetErrorStringWithFormat("%s[0x%llx] can't be resolved, %s in not currently loaded.\n",
687 resolved_addr.GetModule()->GetFileSpec().GetFilename().AsCString(),
688 resolved_addr.GetFileAddress());
689 else
690 error.SetErrorStringWithFormat("0x%llx can't be resolved.\n", resolved_addr.GetFileAddress());
691 }
692 else
693 {
Greg Claytondb598232011-01-07 01:57:07694 bytes_read = m_process_sp->ReadMemory(load_addr, dst, dst_len, error);
Chris Lattner30fdc8d2010-06-08 16:52:24695 if (bytes_read != dst_len)
696 {
697 if (error.Success())
698 {
699 if (bytes_read == 0)
Greg Claytondda4f7b2010-06-30 23:03:03700 error.SetErrorStringWithFormat("Read memory from 0x%llx failed.\n", load_addr);
Chris Lattner30fdc8d2010-06-08 16:52:24701 else
Greg Claytondda4f7b2010-06-30 23:03:03702 error.SetErrorStringWithFormat("Only %zu of %zu bytes were read from memory at 0x%llx.\n", bytes_read, dst_len, load_addr);
Chris Lattner30fdc8d2010-06-08 16:52:24703 }
704 }
Greg Claytondda4f7b2010-06-30 23:03:03705 if (bytes_read)
Enrico Granata9128ee2f2011-09-06 19:20:51706 {
707 if (load_addr_ptr)
708 *load_addr_ptr = load_addr;
Greg Claytondda4f7b2010-06-30 23:03:03709 return bytes_read;
Enrico Granata9128ee2f2011-09-06 19:20:51710 }
Greg Claytondda4f7b2010-06-30 23:03:03711 // If the address is not section offset we have an address that
712 // doesn't resolve to any address in any currently loaded shared
713 // libaries and we failed to read memory so there isn't anything
714 // more we can do. If it is section offset, we might be able to
715 // read cached memory from the object file.
716 if (!resolved_addr.IsSectionOffset())
717 return 0;
Chris Lattner30fdc8d2010-06-08 16:52:24718 }
Chris Lattner30fdc8d2010-06-08 16:52:24719 }
Greg Claytondda4f7b2010-06-30 23:03:03720
Greg Claytonc749eb82011-07-11 05:12:02721 if (!prefer_file_cache && resolved_addr.IsSectionOffset())
Greg Claytondda4f7b2010-06-30 23:03:03722 {
Greg Claytondb598232011-01-07 01:57:07723 // If we didn't already try and read from the object file cache, then
724 // try it after failing to read from the process.
725 return ReadMemoryFromFileCache (resolved_addr, dst, dst_len, error);
Greg Claytondda4f7b2010-06-30 23:03:03726 }
727 return 0;
Chris Lattner30fdc8d2010-06-08 16:52:24728}
729
Greg Claytond16e1e52011-07-12 17:06:17730size_t
731Target::ReadScalarIntegerFromMemory (const Address& addr,
732 bool prefer_file_cache,
733 uint32_t byte_size,
734 bool is_signed,
735 Scalar &scalar,
736 Error &error)
737{
738 uint64_t uval;
739
740 if (byte_size <= sizeof(uval))
741 {
742 size_t bytes_read = ReadMemory (addr, prefer_file_cache, &uval, byte_size, error);
743 if (bytes_read == byte_size)
744 {
745 DataExtractor data (&uval, sizeof(uval), m_arch.GetByteOrder(), m_arch.GetAddressByteSize());
746 uint32_t offset = 0;
747 if (byte_size <= 4)
748 scalar = data.GetMaxU32 (&offset, byte_size);
749 else
750 scalar = data.GetMaxU64 (&offset, byte_size);
751
752 if (is_signed)
753 scalar.SignExtend(byte_size * 8);
754 return bytes_read;
755 }
756 }
757 else
758 {
759 error.SetErrorStringWithFormat ("byte size of %u is too large for integer scalar type", byte_size);
760 }
761 return 0;
762}
763
764uint64_t
765Target::ReadUnsignedIntegerFromMemory (const Address& addr,
766 bool prefer_file_cache,
767 size_t integer_byte_size,
768 uint64_t fail_value,
769 Error &error)
770{
771 Scalar scalar;
772 if (ReadScalarIntegerFromMemory (addr,
773 prefer_file_cache,
774 integer_byte_size,
775 false,
776 scalar,
777 error))
778 return scalar.ULongLong(fail_value);
779 return fail_value;
780}
781
782bool
783Target::ReadPointerFromMemory (const Address& addr,
784 bool prefer_file_cache,
785 Error &error,
786 Address &pointer_addr)
787{
788 Scalar scalar;
789 if (ReadScalarIntegerFromMemory (addr,
790 prefer_file_cache,
791 m_arch.GetAddressByteSize(),
792 false,
793 scalar,
794 error))
795 {
796 addr_t pointer_vm_addr = scalar.ULongLong(LLDB_INVALID_ADDRESS);
797 if (pointer_vm_addr != LLDB_INVALID_ADDRESS)
798 {
799 if (m_section_load_list.IsEmpty())
800 {
801 // No sections are loaded, so we must assume we are not running
802 // yet and anything we are given is a file address.
803 m_images.ResolveFileAddress (pointer_vm_addr, pointer_addr);
804 }
805 else
806 {
807 // We have at least one section loaded. This can be becuase
808 // we have manually loaded some sections with "target modules load ..."
809 // or because we have have a live process that has sections loaded
810 // through the dynamic loader
811 m_section_load_list.ResolveLoadAddress (pointer_vm_addr, pointer_addr);
812 }
813 // We weren't able to resolve the pointer value, so just return
814 // an address with no section
815 if (!pointer_addr.IsValid())
816 pointer_addr.SetOffset (pointer_vm_addr);
817 return true;
818
819 }
820 }
821 return false;
822}
Chris Lattner30fdc8d2010-06-08 16:52:24823
824ModuleSP
825Target::GetSharedModule
826(
827 const FileSpec& file_spec,
828 const ArchSpec& arch,
Greg Clayton60830262011-02-04 18:53:10829 const lldb_private::UUID *uuid_ptr,
Chris Lattner30fdc8d2010-06-08 16:52:24830 const ConstString *object_name,
831 off_t object_offset,
832 Error *error_ptr
833)
834{
835 // Don't pass in the UUID so we can tell if we have a stale value in our list
836 ModuleSP old_module_sp; // This will get filled in if we have a new version of the library
837 bool did_create_module = false;
838 ModuleSP module_sp;
839
Chris Lattner30fdc8d2010-06-08 16:52:24840 Error error;
841
Greg Clayton32e0a752011-03-30 18:16:51842 // If there are image search path entries, try to use them first to acquire a suitable image.
Chris Lattner30fdc8d2010-06-08 16:52:24843 if (m_image_search_paths.GetSize())
844 {
845 FileSpec transformed_spec;
846 if (m_image_search_paths.RemapPath (file_spec.GetDirectory(), transformed_spec.GetDirectory()))
847 {
848 transformed_spec.GetFilename() = file_spec.GetFilename();
849 error = ModuleList::GetSharedModule (transformed_spec, arch, uuid_ptr, object_name, object_offset, module_sp, &old_module_sp, &did_create_module);
850 }
851 }
852
Greg Clayton32e0a752011-03-30 18:16:51853 // The platform is responsible for finding and caching an appropriate
854 // module in the shared module cache.
855 if (m_platform_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24856 {
Greg Clayton32e0a752011-03-30 18:16:51857 FileSpec platform_file_spec;
858 error = m_platform_sp->GetSharedModule (file_spec,
859 arch,
860 uuid_ptr,
861 object_name,
862 object_offset,
863 module_sp,
864 &old_module_sp,
865 &did_create_module);
866 }
867 else
868 {
869 error.SetErrorString("no platform is currently set");
Chris Lattner30fdc8d2010-06-08 16:52:24870 }
871
Greg Clayton32e0a752011-03-30 18:16:51872 // If a module hasn't been found yet, use the unmodified path.
Chris Lattner30fdc8d2010-06-08 16:52:24873 if (module_sp)
874 {
875 m_images.Append (module_sp);
876 if (did_create_module)
877 {
878 if (old_module_sp && m_images.GetIndexForModule (old_module_sp.get()) != LLDB_INVALID_INDEX32)
879 ModuleUpdated(old_module_sp, module_sp);
880 else
881 ModuleAdded(module_sp);
882 }
883 }
884 if (error_ptr)
885 *error_ptr = error;
886 return module_sp;
887}
888
889
890Target *
891Target::CalculateTarget ()
892{
893 return this;
894}
895
896Process *
897Target::CalculateProcess ()
898{
899 return NULL;
900}
901
902Thread *
903Target::CalculateThread ()
904{
905 return NULL;
906}
907
908StackFrame *
909Target::CalculateStackFrame ()
910{
911 return NULL;
912}
913
914void
Greg Clayton0603aa92010-10-04 01:05:56915Target::CalculateExecutionContext (ExecutionContext &exe_ctx)
Chris Lattner30fdc8d2010-06-08 16:52:24916{
917 exe_ctx.target = this;
918 exe_ctx.process = NULL; // Do NOT fill in process...
919 exe_ctx.thread = NULL;
920 exe_ctx.frame = NULL;
921}
922
923PathMappingList &
924Target::GetImageSearchPathList ()
925{
926 return m_image_search_paths;
927}
928
929void
930Target::ImageSearchPathsChanged
931(
932 const PathMappingList &path_list,
933 void *baton
934)
935{
936 Target *target = (Target *)baton;
Greg Claytonaa149cb2011-08-11 02:48:45937 ModuleSP exe_module_sp (target->GetExecutableModule());
938 if (exe_module_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24939 {
Greg Claytonaa149cb2011-08-11 02:48:45940 target->m_images.Clear();
941 target->SetExecutableModule (exe_module_sp, true);
Chris Lattner30fdc8d2010-06-08 16:52:24942 }
943}
944
945ClangASTContext *
946Target::GetScratchClangASTContext()
947{
Greg Clayton73da2442011-08-03 01:23:55948 // Now see if we know the target triple, and if so, create our scratch AST context:
949 if (m_scratch_ast_context_ap.get() == NULL && m_arch.IsValid())
950 m_scratch_ast_context_ap.reset (new ClangASTContext(m_arch.GetTriple().str().c_str()));
Chris Lattner30fdc8d2010-06-08 16:52:24951 return m_scratch_ast_context_ap.get();
952}
Caroline Ticedaccaa92010-09-20 20:44:43953
Greg Clayton99d0faf2010-11-18 23:32:35954void
Caroline Tice20bd37f2011-03-10 22:14:10955Target::SettingsInitialize ()
Caroline Ticedaccaa92010-09-20 20:44:43956{
Greg Clayton99d0faf2010-11-18 23:32:35957 UserSettingsControllerSP &usc = GetSettingsController();
958 usc.reset (new SettingsController);
959 UserSettingsController::InitializeSettingsController (usc,
960 SettingsController::global_settings_table,
961 SettingsController::instance_settings_table);
Caroline Tice20bd37f2011-03-10 22:14:10962
963 // Now call SettingsInitialize() on each 'child' setting of Target
964 Process::SettingsInitialize ();
Greg Clayton99d0faf2010-11-18 23:32:35965}
Caroline Ticedaccaa92010-09-20 20:44:43966
Greg Clayton99d0faf2010-11-18 23:32:35967void
Caroline Tice20bd37f2011-03-10 22:14:10968Target::SettingsTerminate ()
Greg Clayton99d0faf2010-11-18 23:32:35969{
Caroline Tice20bd37f2011-03-10 22:14:10970
971 // Must call SettingsTerminate() on each settings 'child' of Target, before terminating Target's Settings.
972
973 Process::SettingsTerminate ();
974
975 // Now terminate Target Settings.
976
Greg Clayton99d0faf2010-11-18 23:32:35977 UserSettingsControllerSP &usc = GetSettingsController();
978 UserSettingsController::FinalizeSettingsController (usc);
979 usc.reset();
980}
Caroline Ticedaccaa92010-09-20 20:44:43981
Greg Clayton99d0faf2010-11-18 23:32:35982UserSettingsControllerSP &
983Target::GetSettingsController ()
984{
985 static UserSettingsControllerSP g_settings_controller;
Caroline Ticedaccaa92010-09-20 20:44:43986 return g_settings_controller;
987}
988
989ArchSpec
990Target::GetDefaultArchitecture ()
991{
Greg Clayton64195a22011-02-23 00:35:02992 lldb::UserSettingsControllerSP settings_controller_sp (GetSettingsController());
993
994 if (settings_controller_sp)
995 return static_cast<Target::SettingsController *>(settings_controller_sp.get())->GetArchitecture ();
996 return ArchSpec();
Caroline Ticedaccaa92010-09-20 20:44:43997}
998
999void
Greg Clayton64195a22011-02-23 00:35:021000Target::SetDefaultArchitecture (const ArchSpec& arch)
Caroline Ticedaccaa92010-09-20 20:44:431001{
Greg Clayton64195a22011-02-23 00:35:021002 lldb::UserSettingsControllerSP settings_controller_sp (GetSettingsController());
1003
1004 if (settings_controller_sp)
1005 static_cast<Target::SettingsController *>(settings_controller_sp.get())->GetArchitecture () = arch;
Caroline Ticedaccaa92010-09-20 20:44:431006}
1007
Greg Clayton0603aa92010-10-04 01:05:561008Target *
1009Target::GetTargetFromContexts (const ExecutionContext *exe_ctx_ptr, const SymbolContext *sc_ptr)
1010{
1011 // The target can either exist in the "process" of ExecutionContext, or in
1012 // the "target_sp" member of SymbolContext. This accessor helper function
1013 // will get the target from one of these locations.
1014
1015 Target *target = NULL;
1016 if (sc_ptr != NULL)
1017 target = sc_ptr->target_sp.get();
1018 if (target == NULL)
1019 {
1020 if (exe_ctx_ptr != NULL && exe_ctx_ptr->process != NULL)
1021 target = &exe_ctx_ptr->process->GetTarget();
1022 }
1023 return target;
1024}
1025
1026
Caroline Tice1559a462010-09-27 00:30:101027void
1028Target::UpdateInstanceName ()
1029{
1030 StreamString sstr;
1031
Greg Claytonaa149cb2011-08-11 02:48:451032 Module *exe_module = GetExecutableModulePointer();
1033 if (exe_module)
Caroline Tice1559a462010-09-27 00:30:101034 {
Greg Clayton307de252010-10-27 02:06:371035 sstr.Printf ("%s_%s",
Greg Claytonaa149cb2011-08-11 02:48:451036 exe_module->GetFileSpec().GetFilename().AsCString(),
1037 exe_module->GetArchitecture().GetArchitectureName());
1038 GetSettingsController()->RenameInstanceSettings (GetInstanceName().AsCString(), sstr.GetData());
Caroline Tice1559a462010-09-27 00:30:101039 }
1040}
1041
Sean Callanan322f5292010-10-29 00:29:031042const char *
1043Target::GetExpressionPrefixContentsAsCString ()
1044{
Greg Clayton7e14f912011-04-23 02:04:551045 if (m_expr_prefix_contents_sp)
1046 return (const char *)m_expr_prefix_contents_sp->GetBytes();
1047 return NULL;
Sean Callanan322f5292010-10-29 00:29:031048}
1049
Greg Clayton8b2fe6d2010-12-14 02:59:591050ExecutionResults
1051Target::EvaluateExpression
1052(
1053 const char *expr_cstr,
1054 StackFrame *frame,
1055 bool unwind_on_error,
Sean Callanan92adcac2011-01-13 08:53:351056 bool keep_in_memory,
Jim Ingham2837b762011-05-04 03:43:181057 lldb::DynamicValueType use_dynamic,
Greg Clayton8b2fe6d2010-12-14 02:59:591058 lldb::ValueObjectSP &result_valobj_sp
1059)
1060{
1061 ExecutionResults execution_results = eExecutionSetupError;
1062
1063 result_valobj_sp.reset();
Jim Ingham6026ca32011-05-12 02:06:141064
1065 // We shouldn't run stop hooks in expressions.
1066 // Be sure to reset this if you return anywhere within this function.
1067 bool old_suppress_value = m_suppress_stop_hooks;
1068 m_suppress_stop_hooks = true;
Greg Clayton8b2fe6d2010-12-14 02:59:591069
1070 ExecutionContext exe_ctx;
1071 if (frame)
1072 {
1073 frame->CalculateExecutionContext(exe_ctx);
Greg Clayton54979cd2010-12-15 05:08:081074 Error error;
Greg Clayton6d5e68e2011-01-20 19:27:181075 const uint32_t expr_path_options = StackFrame::eExpressionPathOptionCheckPtrVsMember |
Enrico Granata27b625e2011-08-09 01:04:561076 StackFrame::eExpressionPathOptionsNoFragileObjcIvar |
1077 StackFrame::eExpressionPathOptionsNoSyntheticChildren;
Jim Ingham2837b762011-05-04 03:43:181078 lldb::VariableSP var_sp;
1079 result_valobj_sp = frame->GetValueForVariableExpressionPath (expr_cstr,
1080 use_dynamic,
1081 expr_path_options,
1082 var_sp,
1083 error);
Greg Clayton8b2fe6d2010-12-14 02:59:591084 }
1085 else if (m_process_sp)
1086 {
1087 m_process_sp->CalculateExecutionContext(exe_ctx);
1088 }
1089 else
1090 {
1091 CalculateExecutionContext(exe_ctx);
1092 }
1093
1094 if (result_valobj_sp)
1095 {
1096 execution_results = eExecutionCompleted;
1097 // We got a result from the frame variable expression path above...
1098 ConstString persistent_variable_name (m_persistent_variables.GetNextPersistentVariableName());
1099
1100 lldb::ValueObjectSP const_valobj_sp;
1101
1102 // Check in case our value is already a constant value
1103 if (result_valobj_sp->GetIsConstant())
1104 {
1105 const_valobj_sp = result_valobj_sp;
1106 const_valobj_sp->SetName (persistent_variable_name);
1107 }
1108 else
Jim Ingham78a685a2011-04-16 00:01:131109 {
Jim Ingham2837b762011-05-04 03:43:181110 if (use_dynamic != lldb::eNoDynamicValues)
Jim Ingham78a685a2011-04-16 00:01:131111 {
Jim Ingham2837b762011-05-04 03:43:181112 ValueObjectSP dynamic_sp = result_valobj_sp->GetDynamicValue(use_dynamic);
Jim Ingham78a685a2011-04-16 00:01:131113 if (dynamic_sp)
1114 result_valobj_sp = dynamic_sp;
1115 }
1116
Jim Ingham6035b672011-03-31 00:19:251117 const_valobj_sp = result_valobj_sp->CreateConstantValue (persistent_variable_name);
Jim Ingham78a685a2011-04-16 00:01:131118 }
Greg Clayton8b2fe6d2010-12-14 02:59:591119
Sean Callanan92adcac2011-01-13 08:53:351120 lldb::ValueObjectSP live_valobj_sp = result_valobj_sp;
1121
Greg Clayton8b2fe6d2010-12-14 02:59:591122 result_valobj_sp = const_valobj_sp;
1123
Sean Callanan92adcac2011-01-13 08:53:351124 ClangExpressionVariableSP clang_expr_variable_sp(m_persistent_variables.CreatePersistentVariable(result_valobj_sp));
1125 assert (clang_expr_variable_sp.get());
1126
1127 // Set flags and live data as appropriate
1128
1129 const Value &result_value = live_valobj_sp->GetValue();
1130
1131 switch (result_value.GetValueType())
1132 {
1133 case Value::eValueTypeHostAddress:
1134 case Value::eValueTypeFileAddress:
1135 // we don't do anything with these for now
1136 break;
1137 case Value::eValueTypeScalar:
1138 clang_expr_variable_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
1139 clang_expr_variable_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
1140 break;
1141 case Value::eValueTypeLoadAddress:
1142 clang_expr_variable_sp->m_live_sp = live_valobj_sp;
1143 clang_expr_variable_sp->m_flags |= ClangExpressionVariable::EVIsProgramReference;
1144 break;
1145 }
Greg Clayton8b2fe6d2010-12-14 02:59:591146 }
1147 else
1148 {
1149 // Make sure we aren't just trying to see the value of a persistent
1150 // variable (something like "$0")
Greg Clayton3e06bd92011-01-09 21:07:351151 lldb::ClangExpressionVariableSP persistent_var_sp;
1152 // Only check for persistent variables the expression starts with a '$'
1153 if (expr_cstr[0] == '$')
1154 persistent_var_sp = m_persistent_variables.GetVariable (expr_cstr);
1155
Greg Clayton8b2fe6d2010-12-14 02:59:591156 if (persistent_var_sp)
1157 {
1158 result_valobj_sp = persistent_var_sp->GetValueObject ();
1159 execution_results = eExecutionCompleted;
1160 }
1161 else
1162 {
1163 const char *prefix = GetExpressionPrefixContentsAsCString();
1164
1165 execution_results = ClangUserExpression::Evaluate (exe_ctx,
Sean Callanan92adcac2011-01-13 08:53:351166 unwind_on_error,
Greg Clayton8b2fe6d2010-12-14 02:59:591167 expr_cstr,
1168 prefix,
1169 result_valobj_sp);
1170 }
1171 }
Jim Ingham6026ca32011-05-12 02:06:141172
1173 m_suppress_stop_hooks = old_suppress_value;
1174
Greg Clayton8b2fe6d2010-12-14 02:59:591175 return execution_results;
1176}
1177
Greg Claytonf3ef3d22011-05-22 22:46:531178lldb::addr_t
1179Target::GetCallableLoadAddress (lldb::addr_t load_addr, AddressClass addr_class) const
1180{
1181 addr_t code_addr = load_addr;
1182 switch (m_arch.GetMachine())
1183 {
1184 case llvm::Triple::arm:
1185 case llvm::Triple::thumb:
1186 switch (addr_class)
1187 {
1188 case eAddressClassData:
1189 case eAddressClassDebug:
1190 return LLDB_INVALID_ADDRESS;
1191
1192 case eAddressClassUnknown:
1193 case eAddressClassInvalid:
1194 case eAddressClassCode:
1195 case eAddressClassCodeAlternateISA:
1196 case eAddressClassRuntime:
1197 // Check if bit zero it no set?
1198 if ((code_addr & 1ull) == 0)
1199 {
1200 // Bit zero isn't set, check if the address is a multiple of 2?
1201 if (code_addr & 2ull)
1202 {
1203 // The address is a multiple of 2 so it must be thumb, set bit zero
1204 code_addr |= 1ull;
1205 }
1206 else if (addr_class == eAddressClassCodeAlternateISA)
1207 {
1208 // We checked the address and the address claims to be the alternate ISA
1209 // which means thumb, so set bit zero.
1210 code_addr |= 1ull;
1211 }
1212 }
1213 break;
1214 }
1215 break;
1216
1217 default:
1218 break;
1219 }
1220 return code_addr;
1221}
1222
1223lldb::addr_t
1224Target::GetOpcodeLoadAddress (lldb::addr_t load_addr, AddressClass addr_class) const
1225{
1226 addr_t opcode_addr = load_addr;
1227 switch (m_arch.GetMachine())
1228 {
1229 case llvm::Triple::arm:
1230 case llvm::Triple::thumb:
1231 switch (addr_class)
1232 {
1233 case eAddressClassData:
1234 case eAddressClassDebug:
1235 return LLDB_INVALID_ADDRESS;
1236
1237 case eAddressClassInvalid:
1238 case eAddressClassUnknown:
1239 case eAddressClassCode:
1240 case eAddressClassCodeAlternateISA:
1241 case eAddressClassRuntime:
1242 opcode_addr &= ~(1ull);
1243 break;
1244 }
1245 break;
1246
1247 default:
1248 break;
1249 }
1250 return opcode_addr;
1251}
1252
Jim Ingham9575d842011-03-11 03:53:591253lldb::user_id_t
1254Target::AddStopHook (Target::StopHookSP &new_hook_sp)
1255{
1256 lldb::user_id_t new_uid = ++m_stop_hook_next_id;
1257 new_hook_sp.reset (new StopHook(GetSP(), new_uid));
1258 m_stop_hooks[new_uid] = new_hook_sp;
1259 return new_uid;
1260}
1261
1262bool
1263Target::RemoveStopHookByID (lldb::user_id_t user_id)
1264{
1265 size_t num_removed;
1266 num_removed = m_stop_hooks.erase (user_id);
1267 if (num_removed == 0)
1268 return false;
1269 else
1270 return true;
1271}
1272
1273void
1274Target::RemoveAllStopHooks ()
1275{
1276 m_stop_hooks.clear();
1277}
1278
1279Target::StopHookSP
1280Target::GetStopHookByID (lldb::user_id_t user_id)
1281{
1282 StopHookSP found_hook;
1283
1284 StopHookCollection::iterator specified_hook_iter;
1285 specified_hook_iter = m_stop_hooks.find (user_id);
1286 if (specified_hook_iter != m_stop_hooks.end())
1287 found_hook = (*specified_hook_iter).second;
1288 return found_hook;
1289}
1290
1291bool
1292Target::SetStopHookActiveStateByID (lldb::user_id_t user_id, bool active_state)
1293{
1294 StopHookCollection::iterator specified_hook_iter;
1295 specified_hook_iter = m_stop_hooks.find (user_id);
1296 if (specified_hook_iter == m_stop_hooks.end())
1297 return false;
1298
1299 (*specified_hook_iter).second->SetIsActive (active_state);
1300 return true;
1301}
1302
1303void
1304Target::SetAllStopHooksActiveState (bool active_state)
1305{
1306 StopHookCollection::iterator pos, end = m_stop_hooks.end();
1307 for (pos = m_stop_hooks.begin(); pos != end; pos++)
1308 {
1309 (*pos).second->SetIsActive (active_state);
1310 }
1311}
1312
1313void
1314Target::RunStopHooks ()
1315{
Jim Ingham6026ca32011-05-12 02:06:141316 if (m_suppress_stop_hooks)
1317 return;
1318
Jim Ingham9575d842011-03-11 03:53:591319 if (!m_process_sp)
1320 return;
1321
1322 if (m_stop_hooks.empty())
1323 return;
1324
1325 StopHookCollection::iterator pos, end = m_stop_hooks.end();
1326
1327 // If there aren't any active stop hooks, don't bother either:
1328 bool any_active_hooks = false;
1329 for (pos = m_stop_hooks.begin(); pos != end; pos++)
1330 {
1331 if ((*pos).second->IsActive())
1332 {
1333 any_active_hooks = true;
1334 break;
1335 }
1336 }
1337 if (!any_active_hooks)
1338 return;
1339
1340 CommandReturnObject result;
1341
1342 std::vector<ExecutionContext> exc_ctx_with_reasons;
1343 std::vector<SymbolContext> sym_ctx_with_reasons;
1344
1345 ThreadList &cur_threadlist = m_process_sp->GetThreadList();
1346 size_t num_threads = cur_threadlist.GetSize();
1347 for (size_t i = 0; i < num_threads; i++)
1348 {
1349 lldb::ThreadSP cur_thread_sp = cur_threadlist.GetThreadAtIndex (i);
1350 if (cur_thread_sp->ThreadStoppedForAReason())
1351 {
1352 lldb::StackFrameSP cur_frame_sp = cur_thread_sp->GetStackFrameAtIndex(0);
1353 exc_ctx_with_reasons.push_back(ExecutionContext(m_process_sp.get(), cur_thread_sp.get(), cur_frame_sp.get()));
1354 sym_ctx_with_reasons.push_back(cur_frame_sp->GetSymbolContext(eSymbolContextEverything));
1355 }
1356 }
1357
1358 // If no threads stopped for a reason, don't run the stop-hooks.
1359 size_t num_exe_ctx = exc_ctx_with_reasons.size();
1360 if (num_exe_ctx == 0)
1361 return;
1362
Jim Ingham5b52f0c2011-06-02 23:58:261363 result.SetImmediateOutputStream (m_debugger.GetAsyncOutputStream());
1364 result.SetImmediateErrorStream (m_debugger.GetAsyncErrorStream());
Jim Ingham9575d842011-03-11 03:53:591365
1366 bool keep_going = true;
1367 bool hooks_ran = false;
Jim Ingham381e25b2011-03-22 01:47:271368 bool print_hook_header;
1369 bool print_thread_header;
1370
1371 if (num_exe_ctx == 1)
1372 print_thread_header = false;
1373 else
1374 print_thread_header = true;
1375
1376 if (m_stop_hooks.size() == 1)
1377 print_hook_header = false;
1378 else
1379 print_hook_header = true;
1380
Jim Ingham9575d842011-03-11 03:53:591381 for (pos = m_stop_hooks.begin(); keep_going && pos != end; pos++)
1382 {
1383 // result.Clear();
1384 StopHookSP cur_hook_sp = (*pos).second;
1385 if (!cur_hook_sp->IsActive())
1386 continue;
1387
1388 bool any_thread_matched = false;
1389 for (size_t i = 0; keep_going && i < num_exe_ctx; i++)
1390 {
1391 if ((cur_hook_sp->GetSpecifier () == NULL
1392 || cur_hook_sp->GetSpecifier()->SymbolContextMatches(sym_ctx_with_reasons[i]))
1393 && (cur_hook_sp->GetThreadSpecifier() == NULL
1394 || cur_hook_sp->GetThreadSpecifier()->ThreadPassesBasicTests(exc_ctx_with_reasons[i].thread)))
1395 {
1396 if (!hooks_ran)
1397 {
Jim Ingham381e25b2011-03-22 01:47:271398 result.AppendMessage("\n** Stop Hooks **");
Jim Ingham9575d842011-03-11 03:53:591399 hooks_ran = true;
1400 }
Jim Ingham381e25b2011-03-22 01:47:271401 if (print_hook_header && !any_thread_matched)
Jim Ingham9575d842011-03-11 03:53:591402 {
1403 result.AppendMessageWithFormat("\n- Hook %d\n", cur_hook_sp->GetID());
1404 any_thread_matched = true;
1405 }
1406
Jim Ingham381e25b2011-03-22 01:47:271407 if (print_thread_header)
1408 result.AppendMessageWithFormat("-- Thread %d\n", exc_ctx_with_reasons[i].thread->GetIndexID());
Jim Ingham9575d842011-03-11 03:53:591409
1410 bool stop_on_continue = true;
1411 bool stop_on_error = true;
1412 bool echo_commands = false;
1413 bool print_results = true;
1414 GetDebugger().GetCommandInterpreter().HandleCommands (cur_hook_sp->GetCommands(),
Greg Clayton32e0a752011-03-30 18:16:511415 &exc_ctx_with_reasons[i],
1416 stop_on_continue,
1417 stop_on_error,
1418 echo_commands,
1419 print_results,
1420 result);
Jim Ingham9575d842011-03-11 03:53:591421
1422 // If the command started the target going again, we should bag out of
1423 // running the stop hooks.
Greg Clayton32e0a752011-03-30 18:16:511424 if ((result.GetStatus() == eReturnStatusSuccessContinuingNoResult) ||
1425 (result.GetStatus() == eReturnStatusSuccessContinuingResult))
Jim Ingham9575d842011-03-11 03:53:591426 {
1427 result.AppendMessageWithFormat ("Aborting stop hooks, hook %d set the program running.", cur_hook_sp->GetID());
1428 keep_going = false;
1429 }
1430 }
1431 }
1432 }
1433 if (hooks_ran)
1434 result.AppendMessage ("\n** End Stop Hooks **\n");
Caroline Tice969ed3d12011-05-02 20:41:461435
1436 result.GetImmediateOutputStream()->Flush();
1437 result.GetImmediateErrorStream()->Flush();
Jim Ingham9575d842011-03-11 03:53:591438}
1439
Greg Clayton7b242382011-07-08 00:48:091440bool
1441Target::LoadModuleWithSlide (Module *module, lldb::addr_t slide)
1442{
1443 bool changed = false;
1444 if (module)
1445 {
1446 ObjectFile *object_file = module->GetObjectFile();
1447 if (object_file)
1448 {
1449 SectionList *section_list = object_file->GetSectionList ();
1450 if (section_list)
1451 {
1452 // All sections listed in the dyld image info structure will all
1453 // either be fixed up already, or they will all be off by a single
1454 // slide amount that is determined by finding the first segment
1455 // that is at file offset zero which also has bytes (a file size
1456 // that is greater than zero) in the object file.
1457
1458 // Determine the slide amount (if any)
1459 const size_t num_sections = section_list->GetSize();
1460 size_t sect_idx = 0;
1461 for (sect_idx = 0; sect_idx < num_sections; ++sect_idx)
1462 {
1463 // Iterate through the object file sections to find the
1464 // first section that starts of file offset zero and that
1465 // has bytes in the file...
1466 Section *section = section_list->GetSectionAtIndex (sect_idx).get();
1467 if (section)
1468 {
1469 if (m_section_load_list.SetSectionLoadAddress (section, section->GetFileAddress() + slide))
1470 changed = true;
1471 }
1472 }
1473 }
1474 }
1475 }
1476 return changed;
1477}
1478
1479
Jim Ingham9575d842011-03-11 03:53:591480//--------------------------------------------------------------
1481// class Target::StopHook
1482//--------------------------------------------------------------
1483
1484
1485Target::StopHook::StopHook (lldb::TargetSP target_sp, lldb::user_id_t uid) :
1486 UserID (uid),
1487 m_target_sp (target_sp),
Jim Ingham9575d842011-03-11 03:53:591488 m_commands (),
1489 m_specifier_sp (),
Stephen Wilson71c21d12011-04-11 19:41:401490 m_thread_spec_ap(NULL),
1491 m_active (true)
Jim Ingham9575d842011-03-11 03:53:591492{
1493}
1494
1495Target::StopHook::StopHook (const StopHook &rhs) :
1496 UserID (rhs.GetID()),
1497 m_target_sp (rhs.m_target_sp),
1498 m_commands (rhs.m_commands),
1499 m_specifier_sp (rhs.m_specifier_sp),
Stephen Wilson71c21d12011-04-11 19:41:401500 m_thread_spec_ap (NULL),
1501 m_active (rhs.m_active)
Jim Ingham9575d842011-03-11 03:53:591502{
1503 if (rhs.m_thread_spec_ap.get() != NULL)
1504 m_thread_spec_ap.reset (new ThreadSpec(*rhs.m_thread_spec_ap.get()));
1505}
1506
1507
1508Target::StopHook::~StopHook ()
1509{
1510}
1511
1512void
1513Target::StopHook::SetThreadSpecifier (ThreadSpec *specifier)
1514{
1515 m_thread_spec_ap.reset (specifier);
1516}
1517
1518
1519void
1520Target::StopHook::GetDescription (Stream *s, lldb::DescriptionLevel level) const
1521{
1522 int indent_level = s->GetIndentLevel();
1523
1524 s->SetIndentLevel(indent_level + 2);
1525
1526 s->Printf ("Hook: %d\n", GetID());
1527 if (m_active)
1528 s->Indent ("State: enabled\n");
1529 else
1530 s->Indent ("State: disabled\n");
1531
1532 if (m_specifier_sp)
1533 {
1534 s->Indent();
1535 s->PutCString ("Specifier:\n");
1536 s->SetIndentLevel (indent_level + 4);
1537 m_specifier_sp->GetDescription (s, level);
1538 s->SetIndentLevel (indent_level + 2);
1539 }
1540
1541 if (m_thread_spec_ap.get() != NULL)
1542 {
1543 StreamString tmp;
1544 s->Indent("Thread:\n");
1545 m_thread_spec_ap->GetDescription (&tmp, level);
1546 s->SetIndentLevel (indent_level + 4);
1547 s->Indent (tmp.GetData());
1548 s->PutCString ("\n");
1549 s->SetIndentLevel (indent_level + 2);
1550 }
1551
1552 s->Indent ("Commands: \n");
1553 s->SetIndentLevel (indent_level + 4);
1554 uint32_t num_commands = m_commands.GetSize();
1555 for (uint32_t i = 0; i < num_commands; i++)
1556 {
1557 s->Indent(m_commands.GetStringAtIndex(i));
1558 s->PutCString ("\n");
1559 }
1560 s->SetIndentLevel (indent_level);
1561}
1562
1563
Caroline Ticedaccaa92010-09-20 20:44:431564//--------------------------------------------------------------
1565// class Target::SettingsController
1566//--------------------------------------------------------------
1567
1568Target::SettingsController::SettingsController () :
1569 UserSettingsController ("target", Debugger::GetSettingsController()),
1570 m_default_architecture ()
1571{
1572 m_default_settings.reset (new TargetInstanceSettings (*this, false,
1573 InstanceSettings::GetDefaultName().AsCString()));
1574}
1575
1576Target::SettingsController::~SettingsController ()
1577{
1578}
1579
1580lldb::InstanceSettingsSP
1581Target::SettingsController::CreateInstanceSettings (const char *instance_name)
1582{
Greg Claytondbe54502010-11-19 03:46:011583 TargetInstanceSettings *new_settings = new TargetInstanceSettings (*GetSettingsController(),
1584 false,
1585 instance_name);
Caroline Ticedaccaa92010-09-20 20:44:431586 lldb::InstanceSettingsSP new_settings_sp (new_settings);
1587 return new_settings_sp;
1588}
1589
Caroline Ticedaccaa92010-09-20 20:44:431590
Jim Ingham78a685a2011-04-16 00:01:131591#define TSC_DEFAULT_ARCH "default-arch"
1592#define TSC_EXPR_PREFIX "expr-prefix"
Jim Ingham78a685a2011-04-16 00:01:131593#define TSC_PREFER_DYNAMIC "prefer-dynamic-value"
Greg Clayton385aa282011-04-22 03:55:061594#define TSC_SKIP_PROLOGUE "skip-prologue"
Greg Clayton7e14f912011-04-23 02:04:551595#define TSC_SOURCE_MAP "source-map"
Enrico Granata22c55d12011-08-12 02:00:061596#define TSC_MAX_CHILDREN "max-children-count"
Enrico Granata9128ee2f2011-09-06 19:20:511597#define TSC_MAX_STRLENSUMMARY "max-string-summary-length"
Greg Claytonbfe5f3b2011-02-18 01:44:251598
1599
1600static const ConstString &
1601GetSettingNameForDefaultArch ()
1602{
1603 static ConstString g_const_string (TSC_DEFAULT_ARCH);
Greg Claytonbfe5f3b2011-02-18 01:44:251604 return g_const_string;
Caroline Ticedaccaa92010-09-20 20:44:431605}
1606
Greg Claytonbfe5f3b2011-02-18 01:44:251607static const ConstString &
1608GetSettingNameForExpressionPrefix ()
1609{
1610 static ConstString g_const_string (TSC_EXPR_PREFIX);
1611 return g_const_string;
1612}
1613
1614static const ConstString &
Jim Ingham78a685a2011-04-16 00:01:131615GetSettingNameForPreferDynamicValue ()
1616{
1617 static ConstString g_const_string (TSC_PREFER_DYNAMIC);
1618 return g_const_string;
1619}
1620
Greg Clayton7e14f912011-04-23 02:04:551621static const ConstString &
1622GetSettingNameForSourcePathMap ()
1623{
1624 static ConstString g_const_string (TSC_SOURCE_MAP);
1625 return g_const_string;
1626}
Greg Claytonbfe5f3b2011-02-18 01:44:251627
Greg Clayton385aa282011-04-22 03:55:061628static const ConstString &
1629GetSettingNameForSkipPrologue ()
1630{
1631 static ConstString g_const_string (TSC_SKIP_PROLOGUE);
1632 return g_const_string;
1633}
1634
Enrico Granata22c55d12011-08-12 02:00:061635static const ConstString &
1636GetSettingNameForMaxChildren ()
1637{
1638 static ConstString g_const_string (TSC_MAX_CHILDREN);
1639 return g_const_string;
1640}
Greg Clayton385aa282011-04-22 03:55:061641
Enrico Granata9128ee2f2011-09-06 19:20:511642static const ConstString &
1643GetSettingNameForMaxStringSummaryLength ()
1644{
1645 static ConstString g_const_string (TSC_MAX_STRLENSUMMARY);
1646 return g_const_string;
1647}
Greg Clayton385aa282011-04-22 03:55:061648
Caroline Ticedaccaa92010-09-20 20:44:431649bool
1650Target::SettingsController::SetGlobalVariable (const ConstString &var_name,
1651 const char *index_value,
1652 const char *value,
1653 const SettingEntry &entry,
Greg Claytone0d378b2011-03-24 21:19:541654 const VarSetOperationType op,
Caroline Ticedaccaa92010-09-20 20:44:431655 Error&err)
1656{
Greg Claytonbfe5f3b2011-02-18 01:44:251657 if (var_name == GetSettingNameForDefaultArch())
Caroline Ticedaccaa92010-09-20 20:44:431658 {
Greg Claytoneb0103f2011-04-07 22:46:351659 m_default_architecture.SetTriple (value, NULL);
Greg Clayton64195a22011-02-23 00:35:021660 if (!m_default_architecture.IsValid())
1661 err.SetErrorStringWithFormat ("'%s' is not a valid architecture or triple.", value);
Caroline Ticedaccaa92010-09-20 20:44:431662 }
1663 return true;
1664}
1665
1666
1667bool
1668Target::SettingsController::GetGlobalVariable (const ConstString &var_name,
1669 StringList &value,
1670 Error &err)
1671{
Greg Claytonbfe5f3b2011-02-18 01:44:251672 if (var_name == GetSettingNameForDefaultArch())
Caroline Ticedaccaa92010-09-20 20:44:431673 {
Greg Clayton307de252010-10-27 02:06:371674 // If the arch is invalid (the default), don't show a string for it
1675 if (m_default_architecture.IsValid())
Greg Clayton64195a22011-02-23 00:35:021676 value.AppendString (m_default_architecture.GetArchitectureName());
Caroline Ticedaccaa92010-09-20 20:44:431677 return true;
1678 }
1679 else
1680 err.SetErrorStringWithFormat ("unrecognized variable name '%s'", var_name.AsCString());
1681
1682 return false;
1683}
1684
1685//--------------------------------------------------------------
1686// class TargetInstanceSettings
1687//--------------------------------------------------------------
1688
Greg Clayton85851dd2010-12-04 00:10:171689TargetInstanceSettings::TargetInstanceSettings
1690(
1691 UserSettingsController &owner,
1692 bool live_instance,
1693 const char *name
1694) :
Greg Claytonbfe5f3b2011-02-18 01:44:251695 InstanceSettings (owner, name ? name : InstanceSettings::InvalidName().AsCString(), live_instance),
Greg Clayton7e14f912011-04-23 02:04:551696 m_expr_prefix_file (),
1697 m_expr_prefix_contents_sp (),
Jim Ingham2837b762011-05-04 03:43:181698 m_prefer_dynamic_value (2),
Greg Clayton7e14f912011-04-23 02:04:551699 m_skip_prologue (true, true),
Enrico Granata22c55d12011-08-12 02:00:061700 m_source_map (NULL, NULL),
Enrico Granata9128ee2f2011-09-06 19:20:511701 m_max_children_display(256),
1702 m_max_strlen_length(1024)
Caroline Ticedaccaa92010-09-20 20:44:431703{
1704 // CopyInstanceSettings is a pure virtual function in InstanceSettings; it therefore cannot be called
1705 // until the vtables for TargetInstanceSettings are properly set up, i.e. AFTER all the initializers.
1706 // For this reason it has to be called here, rather than in the initializer or in the parent constructor.
1707 // This is true for CreateInstanceName() too.
1708
1709 if (GetInstanceName () == InstanceSettings::InvalidName())
1710 {
1711 ChangeInstanceName (std::string (CreateInstanceName().AsCString()));
1712 m_owner.RegisterInstanceSettings (this);
1713 }
1714
1715 if (live_instance)
1716 {
1717 const lldb::InstanceSettingsSP &pending_settings = m_owner.FindPendingSettings (m_instance_name);
1718 CopyInstanceSettings (pending_settings,false);
Caroline Ticedaccaa92010-09-20 20:44:431719 }
1720}
1721
1722TargetInstanceSettings::TargetInstanceSettings (const TargetInstanceSettings &rhs) :
Greg Clayton7e14f912011-04-23 02:04:551723 InstanceSettings (*Target::GetSettingsController(), CreateInstanceName().AsCString()),
1724 m_expr_prefix_file (rhs.m_expr_prefix_file),
1725 m_expr_prefix_contents_sp (rhs.m_expr_prefix_contents_sp),
1726 m_prefer_dynamic_value (rhs.m_prefer_dynamic_value),
1727 m_skip_prologue (rhs.m_skip_prologue),
Enrico Granata22c55d12011-08-12 02:00:061728 m_source_map (rhs.m_source_map),
Enrico Granata9128ee2f2011-09-06 19:20:511729 m_max_children_display(rhs.m_max_children_display),
1730 m_max_strlen_length(rhs.m_max_strlen_length)
Caroline Ticedaccaa92010-09-20 20:44:431731{
1732 if (m_instance_name != InstanceSettings::GetDefaultName())
1733 {
1734 const lldb::InstanceSettingsSP &pending_settings = m_owner.FindPendingSettings (m_instance_name);
1735 CopyInstanceSettings (pending_settings,false);
Caroline Ticedaccaa92010-09-20 20:44:431736 }
1737}
1738
1739TargetInstanceSettings::~TargetInstanceSettings ()
1740{
1741}
1742
1743TargetInstanceSettings&
1744TargetInstanceSettings::operator= (const TargetInstanceSettings &rhs)
1745{
1746 if (this != &rhs)
1747 {
1748 }
1749
1750 return *this;
1751}
1752
Caroline Ticedaccaa92010-09-20 20:44:431753void
1754TargetInstanceSettings::UpdateInstanceSettingsVariable (const ConstString &var_name,
1755 const char *index_value,
1756 const char *value,
1757 const ConstString &instance_name,
1758 const SettingEntry &entry,
Greg Claytone0d378b2011-03-24 21:19:541759 VarSetOperationType op,
Caroline Ticedaccaa92010-09-20 20:44:431760 Error &err,
1761 bool pending)
1762{
Greg Claytonbfe5f3b2011-02-18 01:44:251763 if (var_name == GetSettingNameForExpressionPrefix ())
Sean Callanan322f5292010-10-29 00:29:031764 {
Greg Clayton7e14f912011-04-23 02:04:551765 err = UserSettingsController::UpdateFileSpecOptionValue (value, op, m_expr_prefix_file);
1766 if (err.Success())
Sean Callanan322f5292010-10-29 00:29:031767 {
Greg Clayton7e14f912011-04-23 02:04:551768 switch (op)
Sean Callanan322f5292010-10-29 00:29:031769 {
Greg Clayton7e14f912011-04-23 02:04:551770 default:
1771 break;
1772 case eVarSetOperationAssign:
1773 case eVarSetOperationAppend:
Sean Callanan322f5292010-10-29 00:29:031774 {
Greg Clayton7e14f912011-04-23 02:04:551775 if (!m_expr_prefix_file.GetCurrentValue().Exists())
1776 {
1777 err.SetErrorToGenericError ();
1778 err.SetErrorStringWithFormat ("%s does not exist.\n", value);
1779 return;
1780 }
1781
1782 m_expr_prefix_contents_sp = m_expr_prefix_file.GetCurrentValue().ReadFileContents();
1783
1784 if (!m_expr_prefix_contents_sp && m_expr_prefix_contents_sp->GetByteSize() == 0)
1785 {
1786 err.SetErrorStringWithFormat ("Couldn't read data from '%s'\n", value);
1787 m_expr_prefix_contents_sp.reset();
1788 }
Sean Callanan322f5292010-10-29 00:29:031789 }
Greg Clayton7e14f912011-04-23 02:04:551790 break;
1791 case eVarSetOperationClear:
1792 m_expr_prefix_contents_sp.reset();
Sean Callanan322f5292010-10-29 00:29:031793 }
Sean Callanan322f5292010-10-29 00:29:031794 }
1795 }
Jim Ingham78a685a2011-04-16 00:01:131796 else if (var_name == GetSettingNameForPreferDynamicValue())
1797 {
Jim Ingham2837b762011-05-04 03:43:181798 int new_value;
1799 UserSettingsController::UpdateEnumVariable (g_dynamic_value_types, &new_value, value, err);
1800 if (err.Success())
1801 m_prefer_dynamic_value = new_value;
Greg Clayton385aa282011-04-22 03:55:061802 }
1803 else if (var_name == GetSettingNameForSkipPrologue())
1804 {
Greg Clayton7e14f912011-04-23 02:04:551805 err = UserSettingsController::UpdateBooleanOptionValue (value, op, m_skip_prologue);
1806 }
Enrico Granata22c55d12011-08-12 02:00:061807 else if (var_name == GetSettingNameForMaxChildren())
1808 {
1809 bool ok;
1810 uint32_t new_value = Args::StringToUInt32(value, 0, 10, &ok);
1811 if (ok)
1812 m_max_children_display = new_value;
1813 }
Enrico Granata9128ee2f2011-09-06 19:20:511814 else if (var_name == GetSettingNameForMaxStringSummaryLength())
1815 {
1816 bool ok;
1817 uint32_t new_value = Args::StringToUInt32(value, 0, 10, &ok);
1818 if (ok)
1819 m_max_strlen_length = new_value;
1820 }
Greg Clayton7e14f912011-04-23 02:04:551821 else if (var_name == GetSettingNameForSourcePathMap ())
1822 {
1823 switch (op)
1824 {
1825 case eVarSetOperationReplace:
1826 case eVarSetOperationInsertBefore:
1827 case eVarSetOperationInsertAfter:
1828 case eVarSetOperationRemove:
1829 default:
1830 break;
1831 case eVarSetOperationAssign:
1832 m_source_map.Clear(true);
1833 // Fall through to append....
1834 case eVarSetOperationAppend:
1835 {
1836 Args args(value);
1837 const uint32_t argc = args.GetArgumentCount();
1838 if (argc & 1 || argc == 0)
1839 {
1840 err.SetErrorStringWithFormat ("an even number of paths must be supplied to to the source-map setting: %u arguments given", argc);
1841 }
1842 else
1843 {
1844 char resolved_new_path[PATH_MAX];
1845 FileSpec file_spec;
1846 const char *old_path;
1847 for (uint32_t idx = 0; (old_path = args.GetArgumentAtIndex(idx)) != NULL; idx += 2)
1848 {
1849 const char *new_path = args.GetArgumentAtIndex(idx+1);
1850 assert (new_path); // We have an even number of paths, this shouldn't happen!
1851
1852 file_spec.SetFile(new_path, true);
1853 if (file_spec.Exists())
1854 {
1855 if (file_spec.GetPath (resolved_new_path, sizeof(resolved_new_path)) >= sizeof(resolved_new_path))
1856 {
1857 err.SetErrorStringWithFormat("new path '%s' is too long", new_path);
1858 return;
1859 }
1860 }
1861 else
1862 {
1863 err.SetErrorStringWithFormat("new path '%s' doesn't exist", new_path);
1864 return;
1865 }
1866 m_source_map.Append(ConstString (old_path), ConstString (resolved_new_path), true);
1867 }
1868 }
1869 }
1870 break;
1871
1872 case eVarSetOperationClear:
1873 m_source_map.Clear(true);
1874 break;
1875 }
Jim Ingham78a685a2011-04-16 00:01:131876 }
Caroline Ticedaccaa92010-09-20 20:44:431877}
1878
1879void
Greg Claytonbfe5f3b2011-02-18 01:44:251880TargetInstanceSettings::CopyInstanceSettings (const lldb::InstanceSettingsSP &new_settings, bool pending)
Caroline Ticedaccaa92010-09-20 20:44:431881{
Sean Callanan322f5292010-10-29 00:29:031882 TargetInstanceSettings *new_settings_ptr = static_cast <TargetInstanceSettings *> (new_settings.get());
1883
1884 if (!new_settings_ptr)
1885 return;
1886
Greg Clayton7e14f912011-04-23 02:04:551887 m_expr_prefix_file = new_settings_ptr->m_expr_prefix_file;
1888 m_expr_prefix_contents_sp = new_settings_ptr->m_expr_prefix_contents_sp;
1889 m_prefer_dynamic_value = new_settings_ptr->m_prefer_dynamic_value;
1890 m_skip_prologue = new_settings_ptr->m_skip_prologue;
Enrico Granata22c55d12011-08-12 02:00:061891 m_max_children_display = new_settings_ptr->m_max_children_display;
Enrico Granata9128ee2f2011-09-06 19:20:511892 m_max_strlen_length = new_settings_ptr->m_max_strlen_length;
Caroline Ticedaccaa92010-09-20 20:44:431893}
1894
Caroline Tice12cecd72010-09-20 21:37:421895bool
Caroline Ticedaccaa92010-09-20 20:44:431896TargetInstanceSettings::GetInstanceSettingsValue (const SettingEntry &entry,
1897 const ConstString &var_name,
1898 StringList &value,
Caroline Tice12cecd72010-09-20 21:37:421899 Error *err)
Caroline Ticedaccaa92010-09-20 20:44:431900{
Greg Claytonbfe5f3b2011-02-18 01:44:251901 if (var_name == GetSettingNameForExpressionPrefix ())
Sean Callanan322f5292010-10-29 00:29:031902 {
Greg Clayton7e14f912011-04-23 02:04:551903 char path[PATH_MAX];
1904 const size_t path_len = m_expr_prefix_file.GetCurrentValue().GetPath (path, sizeof(path));
1905 if (path_len > 0)
1906 value.AppendString (path, path_len);
Sean Callanan322f5292010-10-29 00:29:031907 }
Jim Ingham78a685a2011-04-16 00:01:131908 else if (var_name == GetSettingNameForPreferDynamicValue())
1909 {
Jim Ingham2837b762011-05-04 03:43:181910 value.AppendString (g_dynamic_value_types[m_prefer_dynamic_value].string_value);
Jim Ingham78a685a2011-04-16 00:01:131911 }
Greg Clayton385aa282011-04-22 03:55:061912 else if (var_name == GetSettingNameForSkipPrologue())
1913 {
1914 if (m_skip_prologue)
1915 value.AppendString ("true");
1916 else
1917 value.AppendString ("false");
1918 }
Greg Clayton7e14f912011-04-23 02:04:551919 else if (var_name == GetSettingNameForSourcePathMap ())
1920 {
1921 }
Enrico Granata22c55d12011-08-12 02:00:061922 else if (var_name == GetSettingNameForMaxChildren())
1923 {
1924 StreamString count_str;
1925 count_str.Printf ("%d", m_max_children_display);
1926 value.AppendString (count_str.GetData());
1927 }
Enrico Granata9128ee2f2011-09-06 19:20:511928 else if (var_name == GetSettingNameForMaxStringSummaryLength())
1929 {
1930 StreamString count_str;
1931 count_str.Printf ("%d", m_max_strlen_length);
1932 value.AppendString (count_str.GetData());
1933 }
Sean Callanan322f5292010-10-29 00:29:031934 else
1935 {
1936 if (err)
1937 err->SetErrorStringWithFormat ("unrecognized variable name '%s'", var_name.AsCString());
1938 return false;
1939 }
1940
1941 return true;
Caroline Ticedaccaa92010-09-20 20:44:431942}
1943
1944const ConstString
1945TargetInstanceSettings::CreateInstanceName ()
1946{
Caroline Ticedaccaa92010-09-20 20:44:431947 StreamString sstr;
Caroline Tice1559a462010-09-27 00:30:101948 static int instance_count = 1;
1949
Caroline Ticedaccaa92010-09-20 20:44:431950 sstr.Printf ("target_%d", instance_count);
1951 ++instance_count;
1952
1953 const ConstString ret_val (sstr.GetData());
1954 return ret_val;
1955}
1956
1957//--------------------------------------------------
1958// Target::SettingsController Variable Tables
1959//--------------------------------------------------
Jim Ingham2837b762011-05-04 03:43:181960OptionEnumValueElement
1961TargetInstanceSettings::g_dynamic_value_types[] =
1962{
Greg Clayton5d2fbfe2011-05-30 00:39:481963{ eNoDynamicValues, "no-dynamic-values", "Don't calculate the dynamic type of values"},
1964{ eDynamicCanRunTarget, "run-target", "Calculate the dynamic type of values even if you have to run the target."},
1965{ eDynamicDontRunTarget, "no-run-target", "Calculate the dynamic type of values, but don't run the target."},
Jim Ingham2837b762011-05-04 03:43:181966{ 0, NULL, NULL }
1967};
Caroline Ticedaccaa92010-09-20 20:44:431968
1969SettingEntry
1970Target::SettingsController::global_settings_table[] =
1971{
Greg Claytonbfe5f3b2011-02-18 01:44:251972 // var-name var-type default enum init'd hidden help-text
1973 // ================= ================== =========== ==== ====== ====== =========================================================================
1974 { TSC_DEFAULT_ARCH , eSetVarTypeString , NULL , NULL, false, false, "Default architecture to choose, when there's a choice." },
1975 { NULL , eSetVarTypeNone , NULL , NULL, false, false, NULL }
1976};
1977
Caroline Ticedaccaa92010-09-20 20:44:431978SettingEntry
1979Target::SettingsController::instance_settings_table[] =
1980{
Enrico Granata9128ee2f2011-09-06 19:20:511981 // var-name var-type default enum init'd hidden help-text
1982 // ================= ================== =============== ======================= ====== ====== =========================================================================
1983 { TSC_EXPR_PREFIX , eSetVarTypeString , NULL , NULL, false, false, "Path to a file containing expressions to be prepended to all expressions." },
1984 { TSC_PREFER_DYNAMIC , eSetVarTypeEnum , NULL , g_dynamic_value_types, false, false, "Should printed values be shown as their dynamic value." },
1985 { TSC_SKIP_PROLOGUE , eSetVarTypeBoolean, "true" , NULL, false, false, "Skip function prologues when setting breakpoints by name." },
1986 { TSC_SOURCE_MAP , eSetVarTypeArray , NULL , NULL, false, false, "Source path remappings to use when locating source files from debug information." },
1987 { TSC_MAX_CHILDREN , eSetVarTypeInt , "256" , NULL, true, false, "Maximum number of children to expand in any level of depth." },
1988 { TSC_MAX_STRLENSUMMARY , eSetVarTypeInt , "1024" , NULL, true, false, "Maximum number of characters to show when using %s in summary strings." },
1989 { NULL , eSetVarTypeNone , NULL , NULL, false, false, NULL }
Caroline Ticedaccaa92010-09-20 20:44:431990};