blob: 48f2ea70fd047bedc0a489dfe1a4ddace0813278 [file] [log] [blame]
Chris Lattner24943d22010-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
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"
20#include "lldb/Core/Event.h"
21#include "lldb/Core/Log.h"
22#include "lldb/Core/Timer.h"
23#include "lldb/Core/StreamString.h"
24#include "lldb/Host/Host.h"
25#include "lldb/lldb-private-log.h"
26#include "lldb/Symbol/ObjectFile.h"
27#include "lldb/Target/Process.h"
28#include "lldb/Core/Debugger.h"
29
30using namespace lldb;
31using namespace lldb_private;
32
33//----------------------------------------------------------------------
34// Target constructor
35//----------------------------------------------------------------------
36Target::Target() :
37 Broadcaster("Target"),
38 m_images(),
39 m_breakpoint_list (false),
40 m_internal_breakpoint_list (true),
41 m_process_sp(),
42 m_triple(),
43 m_search_filter_sp(),
44 m_image_search_paths (ImageSearchPathsChanged, this),
45 m_scratch_ast_context_ap(NULL)
46{
47 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT);
48 if (log)
49 log->Printf ("%p Target::Target()", this);
50}
51
52//----------------------------------------------------------------------
53// Destructor
54//----------------------------------------------------------------------
55Target::~Target()
56{
57 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT);
58 if (log)
59 log->Printf ("%p Target::~Target()", this);
60 DeleteCurrentProcess ();
61}
62
63void
64Target::Dump (Stream *s)
65{
66 s->Printf("%.*p: ", (int)sizeof(void*) * 2, this);
67 s->Indent();
68 s->PutCString("Target\n");
69 s->IndentMore();
70 m_images.Dump(s);
71 m_breakpoint_list.Dump(s);
72 m_internal_breakpoint_list.Dump(s);
73// if (m_process_sp.get())
74// m_process_sp->Dump(s);
75 s->IndentLess();
76}
77
78void
79Target::DeleteCurrentProcess ()
80{
81 if (m_process_sp.get())
82 {
83 if (m_process_sp->IsAlive())
84 m_process_sp->Destroy();
85 else
86 m_process_sp->Finalize();
87
88 // Do any cleanup of the target we need to do between process instances.
89 // NB It is better to do this before destroying the process in case the
90 // clean up needs some help from the process.
91 m_breakpoint_list.ClearAllBreakpointSites();
92 m_internal_breakpoint_list.ClearAllBreakpointSites();
93 m_process_sp.reset();
94 }
95}
96
97const lldb::ProcessSP &
98Target::CreateProcess (Listener &listener, const char *plugin_name)
99{
100 DeleteCurrentProcess ();
101 m_process_sp.reset(Process::FindPlugin(*this, plugin_name, listener));
102 return m_process_sp;
103}
104
105const lldb::ProcessSP &
106Target::GetProcessSP () const
107{
108 return m_process_sp;
109}
110
111lldb::TargetSP
112Target::GetSP()
113{
114 return Debugger::GetSharedInstance().GetTargetList().GetTargetSP(this);
115}
116
117BreakpointList &
118Target::GetBreakpointList(bool internal)
119{
120 if (internal)
121 return m_internal_breakpoint_list;
122 else
123 return m_breakpoint_list;
124}
125
126const BreakpointList &
127Target::GetBreakpointList(bool internal) const
128{
129 if (internal)
130 return m_internal_breakpoint_list;
131 else
132 return m_breakpoint_list;
133}
134
135BreakpointSP
136Target::GetBreakpointByID (break_id_t break_id)
137{
138 BreakpointSP bp_sp;
139
140 if (LLDB_BREAK_ID_IS_INTERNAL (break_id))
141 bp_sp = m_internal_breakpoint_list.FindBreakpointByID (break_id);
142 else
143 bp_sp = m_breakpoint_list.FindBreakpointByID (break_id);
144
145 return bp_sp;
146}
147
148BreakpointSP
149Target::CreateBreakpoint (const FileSpec *containingModule, const FileSpec &file, uint32_t line_no, bool check_inlines, bool internal)
150{
151 SearchFilterSP filter_sp(GetSearchFilterForModule (containingModule));
152 BreakpointResolverSP resolver_sp(new BreakpointResolverFileLine (NULL, file, line_no, check_inlines));
153 return CreateBreakpoint (filter_sp, resolver_sp, internal);
154}
155
156
157BreakpointSP
158Target::CreateBreakpoint (lldb::addr_t load_addr, bool internal)
159{
160 BreakpointSP bp_sp;
161 Address so_addr;
162 // Attempt to resolve our load address if possible, though it is ok if
163 // it doesn't resolve to section/offset.
164
165 Process *process = GetProcessSP().get();
166 if (process && process->ResolveLoadAddress(load_addr, so_addr))
167 bp_sp = CreateBreakpoint(so_addr, internal);
168 return bp_sp;
169}
170
171BreakpointSP
172Target::CreateBreakpoint (Address &addr, bool internal)
173{
174 TargetSP target_sp = this->GetSP();
175 SearchFilterSP filter_sp(new SearchFilter (target_sp));
176 BreakpointResolverSP resolver_sp (new BreakpointResolverAddress (NULL, addr));
177 return CreateBreakpoint (filter_sp, resolver_sp, internal);
178}
179
180BreakpointSP
181Target::CreateBreakpoint (FileSpec *containingModule, const char *func_name, bool internal)
182{
183 SearchFilterSP filter_sp(GetSearchFilterForModule (containingModule));
184 BreakpointResolverSP resolver_sp (new BreakpointResolverName (NULL, func_name));
185 return CreateBreakpoint (filter_sp, resolver_sp, internal);
186}
187
188
189SearchFilterSP
190Target::GetSearchFilterForModule (const FileSpec *containingModule)
191{
192 SearchFilterSP filter_sp;
193 lldb::TargetSP target_sp = this->GetSP();
194 if (containingModule != NULL)
195 {
196 // TODO: We should look into sharing module based search filters
197 // across many breakpoints like we do for the simple target based one
198 filter_sp.reset (new SearchFilterByModule (target_sp, *containingModule));
199 }
200 else
201 {
202 if (m_search_filter_sp.get() == NULL)
203 m_search_filter_sp.reset (new SearchFilter (target_sp));
204 filter_sp = m_search_filter_sp;
205 }
206 return filter_sp;
207}
208
209BreakpointSP
210Target::CreateBreakpoint (FileSpec *containingModule, RegularExpression &func_regex, bool internal)
211{
212 SearchFilterSP filter_sp(GetSearchFilterForModule (containingModule));
213 BreakpointResolverSP resolver_sp(new BreakpointResolverName (NULL, func_regex));
214
215 return CreateBreakpoint (filter_sp, resolver_sp, internal);
216}
217
218BreakpointSP
219Target::CreateBreakpoint (SearchFilterSP &filter_sp, BreakpointResolverSP &resolver_sp, bool internal)
220{
221 BreakpointSP bp_sp;
222 if (filter_sp && resolver_sp)
223 {
224 bp_sp.reset(new Breakpoint (*this, filter_sp, resolver_sp));
225 resolver_sp->SetBreakpoint (bp_sp.get());
226
227 if (internal)
228 m_internal_breakpoint_list.Add (bp_sp);
229 else
230 m_breakpoint_list.Add (bp_sp);
231
232 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS);
233 if (log)
234 {
235 StreamString s;
236 bp_sp->GetDescription(&s, lldb::eDescriptionLevelVerbose);
237 log->Printf ("Target::%s (internal = %s) => break_id = %s\n", __FUNCTION__, internal ? "yes" : "no", s.GetData());
238 }
239
240 // Broadcast the breakpoint creation event.
241 if (!internal && EventTypeHasListeners(eBroadcastBitBreakpointChanged))
242 {
243 BroadcastEvent (eBroadcastBitBreakpointChanged,
244 new Breakpoint::BreakpointEventData (Breakpoint::BreakpointEventData::eBreakpointAdded, bp_sp));
245 }
246
247 bp_sp->ResolveBreakpoint();
248 }
249 return bp_sp;
250}
251
252void
253Target::RemoveAllBreakpoints (bool internal_also)
254{
255 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS);
256 if (log)
257 log->Printf ("Target::%s (internal_also = %s)\n", __FUNCTION__, internal_also ? "yes" : "no");
258
259 m_breakpoint_list.RemoveAll();
260 if (internal_also)
261 m_internal_breakpoint_list.RemoveAll();
262}
263
264void
265Target::DisableAllBreakpoints (bool internal_also)
266{
267 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS);
268 if (log)
269 log->Printf ("Target::%s (internal_also = %s)\n", __FUNCTION__, internal_also ? "yes" : "no");
270
271 m_breakpoint_list.SetEnabledAll (false);
272 if (internal_also)
273 m_internal_breakpoint_list.SetEnabledAll (false);
274}
275
276void
277Target::EnableAllBreakpoints (bool internal_also)
278{
279 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS);
280 if (log)
281 log->Printf ("Target::%s (internal_also = %s)\n", __FUNCTION__, internal_also ? "yes" : "no");
282
283 m_breakpoint_list.SetEnabledAll (true);
284 if (internal_also)
285 m_internal_breakpoint_list.SetEnabledAll (true);
286}
287
288bool
289Target::RemoveBreakpointByID (break_id_t break_id)
290{
291 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS);
292 if (log)
293 log->Printf ("Target::%s (break_id = %i, internal = %s)\n", __FUNCTION__, break_id, LLDB_BREAK_ID_IS_INTERNAL (break_id) ? "yes" : "no");
294
295 if (DisableBreakpointByID (break_id))
296 {
297 if (LLDB_BREAK_ID_IS_INTERNAL (break_id))
298 m_internal_breakpoint_list.Remove(break_id);
299 else
300 m_breakpoint_list.Remove(break_id);
301 return true;
302 }
303 return false;
304}
305
306bool
307Target::DisableBreakpointByID (break_id_t break_id)
308{
309 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS);
310 if (log)
311 log->Printf ("Target::%s (break_id = %i, internal = %s)\n", __FUNCTION__, break_id, LLDB_BREAK_ID_IS_INTERNAL (break_id) ? "yes" : "no");
312
313 BreakpointSP bp_sp;
314
315 if (LLDB_BREAK_ID_IS_INTERNAL (break_id))
316 bp_sp = m_internal_breakpoint_list.FindBreakpointByID (break_id);
317 else
318 bp_sp = m_breakpoint_list.FindBreakpointByID (break_id);
319 if (bp_sp)
320 {
321 bp_sp->SetEnabled (false);
322 return true;
323 }
324 return false;
325}
326
327bool
328Target::EnableBreakpointByID (break_id_t break_id)
329{
330 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS);
331 if (log)
332 log->Printf ("Target::%s (break_id = %i, internal = %s)\n",
333 __FUNCTION__,
334 break_id,
335 LLDB_BREAK_ID_IS_INTERNAL (break_id) ? "yes" : "no");
336
337 BreakpointSP bp_sp;
338
339 if (LLDB_BREAK_ID_IS_INTERNAL (break_id))
340 bp_sp = m_internal_breakpoint_list.FindBreakpointByID (break_id);
341 else
342 bp_sp = m_breakpoint_list.FindBreakpointByID (break_id);
343
344 if (bp_sp)
345 {
346 bp_sp->SetEnabled (true);
347 return true;
348 }
349 return false;
350}
351
352ModuleSP
353Target::GetExecutableModule ()
354{
355 ModuleSP executable_sp;
356 if (m_images.GetSize() > 0)
357 executable_sp = m_images.GetModuleAtIndex(0);
358 return executable_sp;
359}
360
361void
362Target::SetExecutableModule (ModuleSP& executable_sp, bool get_dependent_files)
363{
364 m_images.Clear();
365 m_scratch_ast_context_ap.reset();
366
367 if (executable_sp.get())
368 {
369 Timer scoped_timer (__PRETTY_FUNCTION__,
370 "Target::SetExecutableModule (executable = '%s/%s')",
371 executable_sp->GetFileSpec().GetDirectory().AsCString(),
372 executable_sp->GetFileSpec().GetFilename().AsCString());
373
374 m_images.Append(executable_sp); // The first image is our exectuable file
375
376 ArchSpec exe_arch = executable_sp->GetArchitecture();
377 FileSpecList dependent_files;
378 ObjectFile * executable_objfile = executable_sp->GetObjectFile();
379 if (executable_objfile == NULL)
380 {
381
382 FileSpec bundle_executable(executable_sp->GetFileSpec());
383 if (Host::ResolveExecutableInBundle (&bundle_executable))
384 {
385 ModuleSP bundle_exe_module_sp(GetSharedModule(bundle_executable,
386 exe_arch));
387 SetExecutableModule (bundle_exe_module_sp, get_dependent_files);
388 if (bundle_exe_module_sp->GetObjectFile() != NULL)
389 executable_sp = bundle_exe_module_sp;
390 return;
391 }
392 }
393
394 if (executable_objfile)
395 {
396 executable_objfile->GetDependentModules(dependent_files);
397 for (uint32_t i=0; i<dependent_files.GetSize(); i++)
398 {
399 ModuleSP image_module_sp(GetSharedModule(dependent_files.GetFileSpecPointerAtIndex(i),
400 exe_arch));
401 if (image_module_sp.get())
402 {
403 //image_module_sp->Dump(&s);// REMOVE THIS, DEBUG ONLY
404 ObjectFile *objfile = image_module_sp->GetObjectFile();
405 if (objfile)
406 objfile->GetDependentModules(dependent_files);
407 }
408 }
409 }
410
411 // Now see if we know the target triple, and if so, create our scratch AST context:
412 ConstString target_triple;
413 if (GetTargetTriple(target_triple))
414 {
415 m_scratch_ast_context_ap.reset (new ClangASTContext(target_triple.GetCString()));
416 }
417 }
418}
419
420
421ModuleList&
422Target::GetImages ()
423{
424 return m_images;
425}
426
427ArchSpec
428Target::GetArchitecture () const
429{
430 ArchSpec arch;
431 if (m_images.GetSize() > 0)
432 {
433 Module *exe_module = m_images.GetModulePointerAtIndex(0);
434 if (exe_module)
435 arch = exe_module->GetArchitecture();
436 }
437 return arch;
438}
439
440
441
442bool
443Target::GetTargetTriple(ConstString &triple)
444{
445 triple.Clear();
446
447 if (m_triple)
448 {
449 triple = m_triple;
450 }
451 else
452 {
453 Module *exe_module = GetExecutableModule().get();
454 if (exe_module)
455 {
456 ObjectFile *objfile = exe_module->GetObjectFile();
457 if (objfile)
458 {
459 objfile->GetTargetTriple(m_triple);
460 triple = m_triple;
461 }
462 }
463 }
464 return !triple.IsEmpty();
465}
466
467void
468Target::ModuleAdded (ModuleSP &module_sp)
469{
470 // A module is being added to this target for the first time
471 ModuleList module_list;
472 module_list.Append(module_sp);
473 ModulesDidLoad (module_list);
474}
475
476void
477Target::ModuleUpdated (ModuleSP &old_module_sp, ModuleSP &new_module_sp)
478{
479 // A module is being added to this target for the first time
480 ModuleList module_list;
481 module_list.Append (old_module_sp);
482 ModulesDidUnload (module_list);
483 module_list.Clear ();
484 module_list.Append (new_module_sp);
485 ModulesDidLoad (module_list);
486}
487
488void
489Target::ModulesDidLoad (ModuleList &module_list)
490{
491 m_breakpoint_list.UpdateBreakpoints (module_list, true);
492 // TODO: make event data that packages up the module_list
493 BroadcastEvent (eBroadcastBitModulesLoaded, NULL);
494}
495
496void
497Target::ModulesDidUnload (ModuleList &module_list)
498{
499 m_breakpoint_list.UpdateBreakpoints (module_list, false);
500 // TODO: make event data that packages up the module_list
501 BroadcastEvent (eBroadcastBitModulesUnloaded, NULL);
502}
503
504size_t
505Target::ReadMemory
506(
507 lldb::AddressType addr_type,
508 lldb::addr_t addr,
509 void *dst,
510 size_t dst_len,
511 Error &error,
512 ObjectFile* objfile
513)
514{
515 size_t bytes_read = 0;
516 error.Clear();
517 switch (addr_type)
518 {
519 case eAddressTypeFile:
520 if (objfile)
521 {
522 if (m_process_sp.get())
523 {
524 // If we have an execution context with a process, lets try and
525 // resolve the file address in "objfile" and read it from the
526 // process
527 Address so_addr(addr, objfile->GetSectionList());
528 lldb::addr_t load_addr = so_addr.GetLoadAddress(m_process_sp.get());
529 if (load_addr == LLDB_INVALID_ADDRESS)
530 {
531 if (objfile->GetFileSpec())
532 error.SetErrorStringWithFormat("0x%llx can't be resolved, %s in not currently loaded.\n", addr, objfile->GetFileSpec().GetFilename().AsCString());
533 else
534 error.SetErrorStringWithFormat("0x%llx can't be resolved.\n", addr, objfile->GetFileSpec().GetFilename().AsCString());
535 }
536 else
537 {
538 bytes_read = m_process_sp->ReadMemory(load_addr, dst, dst_len, error);
539 if (bytes_read != dst_len)
540 {
541 if (error.Success())
542 {
543 if (bytes_read == 0)
544 error.SetErrorStringWithFormat("Read memory from 0x%llx failed.\n", load_addr);
545 else
546 error.SetErrorStringWithFormat("Only %zu of %zu bytes were read from memory at 0x%llx.\n", bytes_read, dst_len, load_addr);
547 }
548 }
549 }
550 }
551 else
552 {
553 // Try and read the file based address from the object file's
554 // section data.
555 }
556 }
557 break;
558
559 case eAddressTypeLoad:
560 if (m_process_sp.get())
561 {
562 bytes_read = m_process_sp->ReadMemory(addr, dst, dst_len, error);
563 if (bytes_read != dst_len)
564 {
565 if (error.Success())
566 {
567 if (bytes_read == 0)
568 error.SetErrorStringWithFormat("Read memory from 0x%llx failed.\n", addr);
569 else
570 error.SetErrorStringWithFormat("Only %zu of %zu bytes were read from memory at 0x%llx.\n", bytes_read, dst_len, addr);
571 }
572 }
573 }
574 else
575 error.SetErrorStringWithFormat("Need valid process to read load address.\n");
576 break;
577
578 case eAddressTypeHost:
579 // The address is an address in this process, so just copy it
580 ::memcpy (dst, (uint8_t*)NULL + addr, dst_len);
581 break;
582
583 default:
584 error.SetErrorStringWithFormat ("Unsupported lldb::AddressType value (%i).\n", addr_type);
585 break;
586 }
587 return bytes_read;
588}
589
590
591ModuleSP
592Target::GetSharedModule
593(
594 const FileSpec& file_spec,
595 const ArchSpec& arch,
596 const UUID *uuid_ptr,
597 const ConstString *object_name,
598 off_t object_offset,
599 Error *error_ptr
600)
601{
602 // Don't pass in the UUID so we can tell if we have a stale value in our list
603 ModuleSP old_module_sp; // This will get filled in if we have a new version of the library
604 bool did_create_module = false;
605 ModuleSP module_sp;
606
607 // If there are image search path entries, try to use them first to acquire a suitable image.
608
609 Error error;
610
611 if (m_image_search_paths.GetSize())
612 {
613 FileSpec transformed_spec;
614 if (m_image_search_paths.RemapPath (file_spec.GetDirectory(), transformed_spec.GetDirectory()))
615 {
616 transformed_spec.GetFilename() = file_spec.GetFilename();
617 error = ModuleList::GetSharedModule (transformed_spec, arch, uuid_ptr, object_name, object_offset, module_sp, &old_module_sp, &did_create_module);
618 }
619 }
620
621 // If a module hasn't been found yet, use the unmodified path.
622
623 if (!module_sp)
624 {
625 error = (ModuleList::GetSharedModule (file_spec, arch, uuid_ptr, object_name, object_offset, module_sp, &old_module_sp, &did_create_module));
626 }
627
628 if (module_sp)
629 {
630 m_images.Append (module_sp);
631 if (did_create_module)
632 {
633 if (old_module_sp && m_images.GetIndexForModule (old_module_sp.get()) != LLDB_INVALID_INDEX32)
634 ModuleUpdated(old_module_sp, module_sp);
635 else
636 ModuleAdded(module_sp);
637 }
638 }
639 if (error_ptr)
640 *error_ptr = error;
641 return module_sp;
642}
643
644
645Target *
646Target::CalculateTarget ()
647{
648 return this;
649}
650
651Process *
652Target::CalculateProcess ()
653{
654 return NULL;
655}
656
657Thread *
658Target::CalculateThread ()
659{
660 return NULL;
661}
662
663StackFrame *
664Target::CalculateStackFrame ()
665{
666 return NULL;
667}
668
669void
670Target::Calculate (ExecutionContext &exe_ctx)
671{
672 exe_ctx.target = this;
673 exe_ctx.process = NULL; // Do NOT fill in process...
674 exe_ctx.thread = NULL;
675 exe_ctx.frame = NULL;
676}
677
678PathMappingList &
679Target::GetImageSearchPathList ()
680{
681 return m_image_search_paths;
682}
683
684void
685Target::ImageSearchPathsChanged
686(
687 const PathMappingList &path_list,
688 void *baton
689)
690{
691 Target *target = (Target *)baton;
692 if (target->m_images.GetSize() > 1)
693 {
694 ModuleSP exe_module_sp (target->GetExecutableModule());
695 if (exe_module_sp)
696 {
697 target->m_images.Clear();
698 target->SetExecutableModule (exe_module_sp, true);
699 }
700 }
701}
702
703ClangASTContext *
704Target::GetScratchClangASTContext()
705{
706 return m_scratch_ast_context_ap.get();
707}