blob: 46c8c17eee8cea0949cd9c50bdab82ad8d80b624 [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- Target.cpp ----------------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Chris Lattner30fdc8d2010-06-08 16:52:24 +000010// C Includes
11// C++ Includes
12// Other libraries and framework includes
13// Project includes
Eugene Zelenko8f30a652015-10-23 18:39:37 +000014#include "lldb/Target/Target.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000015#include "lldb/Breakpoint/BreakpointResolver.h"
16#include "lldb/Breakpoint/BreakpointResolverAddress.h"
17#include "lldb/Breakpoint/BreakpointResolverFileLine.h"
Jim Ingham969795f2011-09-21 01:17:13 +000018#include "lldb/Breakpoint/BreakpointResolverFileRegex.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000019#include "lldb/Breakpoint/BreakpointResolverName.h"
Johnny Chen01a67862011-10-14 00:42:25 +000020#include "lldb/Breakpoint/Watchpoint.h"
Greg Clayton8b2fe6d2010-12-14 02:59:59 +000021#include "lldb/Core/Debugger.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000022#include "lldb/Core/Event.h"
23#include "lldb/Core/Log.h"
Greg Clayton1f746072012-08-29 21:13:06 +000024#include "lldb/Core/Module.h"
25#include "lldb/Core/ModuleSpec.h"
26#include "lldb/Core/Section.h"
Greg Clayton9585fbf2013-03-19 00:20:55 +000027#include "lldb/Core/SourceManager.h"
Greg Claytonb09c5382013-12-13 17:20:18 +000028#include "lldb/Core/State.h"
Greg Clayton44d93782014-01-27 23:43:24 +000029#include "lldb/Core/StreamFile.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000030#include "lldb/Core/StreamString.h"
Greg Clayton8b2fe6d2010-12-14 02:59:59 +000031#include "lldb/Core/Timer.h"
32#include "lldb/Core/ValueObject.h"
Sean Callanan66810412015-10-19 23:11:07 +000033#include "lldb/Expression/REPL.h"
Jim Ingham151c0322015-09-15 21:13:50 +000034#include "lldb/Expression/UserExpression.h"
Sean Callanan4dbb2712015-09-25 20:35:58 +000035#include "Plugins/ExpressionParser/Clang/ClangASTSource.h"
36#include "Plugins/ExpressionParser/Clang/ClangPersistentVariables.h"
37#include "Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.h"
Zachary Turner10687b02014-10-20 17:46:43 +000038#include "lldb/Host/FileSpec.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000039#include "lldb/Host/Host.h"
Jim Ingham9575d842011-03-11 03:53:59 +000040#include "lldb/Interpreter/CommandInterpreter.h"
41#include "lldb/Interpreter/CommandReturnObject.h"
Johnny Chenb90827e2012-06-04 23:19:54 +000042#include "lldb/Interpreter/OptionGroupWatchpoint.h"
Greg Clayton67cc0632012-08-22 17:17:09 +000043#include "lldb/Interpreter/OptionValues.h"
44#include "lldb/Interpreter/Property.h"
Zachary Turnera78bd7f2015-03-03 23:11:11 +000045#include "lldb/Symbol/ClangASTContext.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000046#include "lldb/Symbol/ObjectFile.h"
Bhushan D. Attarde7f3daed2015-08-26 06:04:54 +000047#include "lldb/Symbol/Function.h"
48#include "lldb/Symbol/Symbol.h"
Jim Ingham151c0322015-09-15 21:13:50 +000049#include "lldb/Target/Language.h"
Zachary Turnera78bd7f2015-03-03 23:11:11 +000050#include "lldb/Target/LanguageRuntime.h"
51#include "lldb/Target/ObjCLanguageRuntime.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000052#include "lldb/Target/Process.h"
Greg Claytond5944cd2013-12-06 01:12:00 +000053#include "lldb/Target/SectionLoadList.h"
Jason Molendab57e4a12013-11-04 09:33:30 +000054#include "lldb/Target/StackFrame.h"
Jason Molendaeef51062013-11-05 03:57:19 +000055#include "lldb/Target/SystemRuntime.h"
Jim Ingham9575d842011-03-11 03:53:59 +000056#include "lldb/Target/Thread.h"
57#include "lldb/Target/ThreadSpec.h"
Sean Callanan9a6940c2015-10-21 00:36:34 +000058#include "lldb/Utility/LLDBAssert.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000059
60using namespace lldb;
61using namespace lldb_private;
62
Jim Ingham4bddaeb2012-02-16 06:50:00 +000063ConstString &
64Target::GetStaticBroadcasterClass ()
65{
66 static ConstString class_name ("lldb.target");
67 return class_name;
68}
69
Jim Ingham893c9322014-11-22 01:42:44 +000070Target::Target(Debugger &debugger, const ArchSpec &target_arch, const lldb::PlatformSP &platform_sp, bool is_dummy_target) :
Greg Clayton67cc0632012-08-22 17:17:09 +000071 TargetProperties (this),
Jim Ingham4f465cf2012-10-10 18:32:14 +000072 Broadcaster (&debugger, Target::GetStaticBroadcasterClass().AsCString()),
Greg Clayton32e0a752011-03-30 18:16:51 +000073 ExecutionContextScope (),
Greg Clayton66111032010-06-23 01:19:29 +000074 m_debugger (debugger),
Greg Clayton32e0a752011-03-30 18:16:51 +000075 m_platform_sp (platform_sp),
Greg Claytonaf67cec2010-12-20 20:49:23 +000076 m_mutex (Mutex::eMutexTypeRecursive),
Greg Clayton32e0a752011-03-30 18:16:51 +000077 m_arch (target_arch),
Enrico Granata17598482012-11-08 02:22:02 +000078 m_images (this),
Greg Claytond5944cd2013-12-06 01:12:00 +000079 m_section_load_history (),
Chris Lattner30fdc8d2010-06-08 16:52:24 +000080 m_breakpoint_list (false),
81 m_internal_breakpoint_list (true),
Johnny Chen01a67862011-10-14 00:42:25 +000082 m_watchpoint_list (),
Greg Clayton32e0a752011-03-30 18:16:51 +000083 m_process_sp (),
84 m_search_filter_sp (),
Chris Lattner30fdc8d2010-06-08 16:52:24 +000085 m_image_search_paths (ImageSearchPathsChanged, this),
Greg Claytone01e07b2013-04-18 18:10:51 +000086 m_ast_importer_ap (),
Greg Clayton9585fbf2013-03-19 00:20:55 +000087 m_source_manager_ap(),
Greg Clayton32e0a752011-03-30 18:16:51 +000088 m_stop_hooks (),
Jim Ingham6026ca32011-05-12 02:06:14 +000089 m_stop_hook_next_id (0),
Greg Claytond5944cd2013-12-06 01:12:00 +000090 m_valid (true),
Jim Ingham893c9322014-11-22 01:42:44 +000091 m_suppress_stop_hooks (false),
92 m_is_dummy_target(is_dummy_target)
93
Chris Lattner30fdc8d2010-06-08 16:52:24 +000094{
Greg Claytoncfd1ace2010-10-31 03:01:06 +000095 SetEventName (eBroadcastBitBreakpointChanged, "breakpoint-changed");
96 SetEventName (eBroadcastBitModulesLoaded, "modules-loaded");
97 SetEventName (eBroadcastBitModulesUnloaded, "modules-unloaded");
Jim Ingham1b5792e2012-12-18 02:03:49 +000098 SetEventName (eBroadcastBitWatchpointChanged, "watchpoint-changed");
Enrico Granataf15ee4e2013-04-05 18:49:06 +000099 SetEventName (eBroadcastBitSymbolsLoaded, "symbols-loaded");
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000100
Jim Ingham4bddaeb2012-02-16 06:50:00 +0000101 CheckInWithManager();
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000102
Greg Clayton5160ce52013-03-27 23:08:40 +0000103 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000104 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000105 log->Printf ("%p Target::Target()", static_cast<void*>(this));
Jason Molendae1b68ad2012-12-05 00:25:49 +0000106 if (m_arch.IsValid())
107 {
Jason Molendaa3f24b32012-12-12 02:23:56 +0000108 LogIfAnyCategoriesSet(LIBLLDB_LOG_TARGET, "Target::Target created with architecture %s (%s)", m_arch.GetArchitectureName(), m_arch.GetTriple().getTriple().c_str());
Jason Molendae1b68ad2012-12-05 00:25:49 +0000109 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000110}
111
Eugene Zelenko8f30a652015-10-23 18:39:37 +0000112Target::~Target()
113{
114 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
115 if (log)
116 log->Printf ("%p Target::~Target()", static_cast<void*>(this));
117 DeleteCurrentProcess ();
118}
119
Jim Ingham893c9322014-11-22 01:42:44 +0000120void
121Target::PrimeFromDummyTarget(Target *target)
122{
123 if (!target)
124 return;
125
126 m_stop_hooks = target->m_stop_hooks;
Jim Ingham33df7cd2014-12-06 01:28:03 +0000127
128 for (BreakpointSP breakpoint_sp : target->m_breakpoint_list.Breakpoints())
129 {
130 if (breakpoint_sp->IsInternal())
131 continue;
132
133 BreakpointSP new_bp (new Breakpoint (*this, *breakpoint_sp.get()));
134 AddBreakpoint (new_bp, false);
135 }
Jim Ingham893c9322014-11-22 01:42:44 +0000136}
137
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000138void
Caroline Ticeceb6b132010-10-26 03:11:13 +0000139Target::Dump (Stream *s, lldb::DescriptionLevel description_level)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000140{
Greg Clayton89411422010-10-08 00:21:05 +0000141// s->Printf("%.*p: ", (int)sizeof(void*) * 2, this);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000142 if (description_level != lldb::eDescriptionLevelBrief)
143 {
144 s->Indent();
145 s->PutCString("Target\n");
146 s->IndentMore();
Greg Clayton93aa84e2010-10-29 04:59:35 +0000147 m_images.Dump(s);
148 m_breakpoint_list.Dump(s);
149 m_internal_breakpoint_list.Dump(s);
150 s->IndentLess();
Caroline Ticeceb6b132010-10-26 03:11:13 +0000151 }
152 else
153 {
Greg Claytonaa149cb2011-08-11 02:48:45 +0000154 Module *exe_module = GetExecutableModulePointer();
155 if (exe_module)
156 s->PutCString (exe_module->GetFileSpec().GetFilename().GetCString());
Jim Ingham48028b62011-05-12 01:12:28 +0000157 else
158 s->PutCString ("No executable module.");
Caroline Ticeceb6b132010-10-26 03:11:13 +0000159 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000160}
161
162void
Greg Clayton90ba8112012-12-05 00:16:59 +0000163Target::CleanupProcess ()
164{
165 // Do any cleanup of the target we need to do between process instances.
166 // NB It is better to do this before destroying the process in case the
167 // clean up needs some help from the process.
168 m_breakpoint_list.ClearAllBreakpointSites();
169 m_internal_breakpoint_list.ClearAllBreakpointSites();
170 // Disable watchpoints just on the debugger side.
171 Mutex::Locker locker;
172 this->GetWatchpointList().GetListMutex(locker);
173 DisableAllWatchpoints(false);
174 ClearAllWatchpointHitCounts();
Enrico Granata5e3fe042015-02-11 00:37:54 +0000175 ClearAllWatchpointHistoricValues();
Greg Clayton90ba8112012-12-05 00:16:59 +0000176}
177
178void
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000179Target::DeleteCurrentProcess ()
180{
181 if (m_process_sp.get())
182 {
Greg Claytond5944cd2013-12-06 01:12:00 +0000183 m_section_load_history.Clear();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000184 if (m_process_sp->IsAlive())
Jason Molendaede31932015-04-17 05:01:58 +0000185 m_process_sp->Destroy(false);
Jim Inghamd0a3e122011-02-16 17:54:55 +0000186
187 m_process_sp->Finalize();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000188
Greg Clayton90ba8112012-12-05 00:16:59 +0000189 CleanupProcess ();
190
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000191 m_process_sp.reset();
192 }
193}
194
195const lldb::ProcessSP &
Greg Claytonc3776bf2012-02-09 06:16:32 +0000196Target::CreateProcess (Listener &listener, const char *plugin_name, const FileSpec *crash_file)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000197{
198 DeleteCurrentProcess ();
Zachary Turner7529df92015-09-01 20:02:29 +0000199 m_process_sp = Process::FindPlugin(shared_from_this(), plugin_name, listener, crash_file);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000200 return m_process_sp;
201}
202
203const lldb::ProcessSP &
204Target::GetProcessSP () const
205{
206 return m_process_sp;
207}
208
Sean Callanan66810412015-10-19 23:11:07 +0000209lldb::REPLSP
Sean Callanan3e7e9152015-10-20 00:23:46 +0000210Target::GetREPL (Error &err, lldb::LanguageType language, const char *repl_options, bool can_create)
Sean Callanan66810412015-10-19 23:11:07 +0000211{
212 if (language == eLanguageTypeUnknown)
213 {
Sean Callanan93c0b002015-10-21 19:14:33 +0000214 std::set<LanguageType> repl_languages;
215
216 Language::GetLanguagesSupportingREPLs(repl_languages);
217
218 if (repl_languages.size() == 1)
219 {
220 language = *repl_languages.begin();
221 }
Sean Callanan97f84e82015-10-21 19:31:17 +0000222 else if (repl_languages.size() == 0)
223 {
224 err.SetErrorStringWithFormat("LLDB isn't configured with support support for any REPLs.");
225 return REPLSP();
226 }
Sean Callanan93c0b002015-10-21 19:14:33 +0000227 else
228 {
229 err.SetErrorStringWithFormat("Multiple possible REPL languages. Please specify a language.");
Sean Callanan97f84e82015-10-21 19:31:17 +0000230 return REPLSP();
Sean Callanan93c0b002015-10-21 19:14:33 +0000231 }
Sean Callanan66810412015-10-19 23:11:07 +0000232 }
233
234 REPLMap::iterator pos = m_repl_map.find(language);
235
236 if (pos != m_repl_map.end())
237 {
238 return pos->second;
239 }
240
241 if (!can_create)
242 {
Sean Callanan3e7e9152015-10-20 00:23:46 +0000243 err.SetErrorStringWithFormat("Couldn't find an existing REPL for %s, and can't create a new one", Language::GetNameForLanguageType(language));
Sean Callanan66810412015-10-19 23:11:07 +0000244 return lldb::REPLSP();
245 }
246
Sean Callanan3b682de2015-10-21 00:28:44 +0000247 Debugger *const debugger = nullptr;
248 lldb::REPLSP ret = REPL::Create(err, language, debugger, this, repl_options);
Sean Callanan66810412015-10-19 23:11:07 +0000249
250 if (ret)
251 {
252 m_repl_map[language] = ret;
253 return m_repl_map[language];
254 }
255
Sean Callanan3e7e9152015-10-20 00:23:46 +0000256 if (err.Success())
257 {
258 err.SetErrorStringWithFormat("Couldn't create a REPL for %s", Language::GetNameForLanguageType(language));
259 }
260
261 return lldb::REPLSP();
Sean Callanan66810412015-10-19 23:11:07 +0000262}
263
Greg Clayton3418c852011-08-10 02:10:13 +0000264void
Sean Callanan9a6940c2015-10-21 00:36:34 +0000265Target::SetREPL (lldb::LanguageType language, lldb::REPLSP repl_sp)
266{
267 lldbassert(!m_repl_map.count(language));
268
269 m_repl_map[language] = repl_sp;
270}
271
272void
Greg Clayton3418c852011-08-10 02:10:13 +0000273Target::Destroy()
274{
275 Mutex::Locker locker (m_mutex);
Filipe Cabecinhas721ba3f2012-05-19 09:59:08 +0000276 m_valid = false;
Greg Clayton3418c852011-08-10 02:10:13 +0000277 DeleteCurrentProcess ();
278 m_platform_sp.reset();
279 m_arch.Clear();
Greg Claytonb35db632013-11-09 00:03:31 +0000280 ClearModules(true);
Greg Claytond5944cd2013-12-06 01:12:00 +0000281 m_section_load_history.Clear();
Greg Clayton3418c852011-08-10 02:10:13 +0000282 const bool notify = false;
283 m_breakpoint_list.RemoveAll(notify);
284 m_internal_breakpoint_list.RemoveAll(notify);
285 m_last_created_breakpoint.reset();
Johnny Chen01a67862011-10-14 00:42:25 +0000286 m_last_created_watchpoint.reset();
Greg Clayton3418c852011-08-10 02:10:13 +0000287 m_search_filter_sp.reset();
288 m_image_search_paths.Clear(notify);
Greg Clayton3418c852011-08-10 02:10:13 +0000289 m_stop_hooks.clear();
290 m_stop_hook_next_id = 0;
291 m_suppress_stop_hooks = false;
292}
293
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000294BreakpointList &
295Target::GetBreakpointList(bool internal)
296{
297 if (internal)
298 return m_internal_breakpoint_list;
299 else
300 return m_breakpoint_list;
301}
302
303const BreakpointList &
304Target::GetBreakpointList(bool internal) const
305{
306 if (internal)
307 return m_internal_breakpoint_list;
308 else
309 return m_breakpoint_list;
310}
311
312BreakpointSP
313Target::GetBreakpointByID (break_id_t break_id)
314{
315 BreakpointSP bp_sp;
316
317 if (LLDB_BREAK_ID_IS_INTERNAL (break_id))
318 bp_sp = m_internal_breakpoint_list.FindBreakpointByID (break_id);
319 else
320 bp_sp = m_breakpoint_list.FindBreakpointByID (break_id);
321
322 return bp_sp;
323}
324
325BreakpointSP
Jim Ingham87df91b2011-09-23 00:54:11 +0000326Target::CreateSourceRegexBreakpoint (const FileSpecList *containingModules,
Greg Clayton1f746072012-08-29 21:13:06 +0000327 const FileSpecList *source_file_spec_list,
328 RegularExpression &source_regex,
Greg Claytoneb023e72013-10-11 19:48:25 +0000329 bool internal,
Ilia K055ad9b2015-05-18 13:41:01 +0000330 bool hardware,
331 LazyBool move_to_nearest_code)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000332{
Jim Ingham87df91b2011-09-23 00:54:11 +0000333 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, source_file_spec_list));
Ilia K055ad9b2015-05-18 13:41:01 +0000334 if (move_to_nearest_code == eLazyBoolCalculate)
335 move_to_nearest_code = GetMoveToNearestCode() ? eLazyBoolYes : eLazyBoolNo;
336 BreakpointResolverSP resolver_sp(new BreakpointResolverFileRegex (NULL, source_regex, !static_cast<bool>(move_to_nearest_code)));
Jim Ingham1460e4b2014-01-10 23:46:59 +0000337 return CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true);
Jim Ingham969795f2011-09-21 01:17:13 +0000338}
339
Jim Ingham969795f2011-09-21 01:17:13 +0000340BreakpointSP
Jim Inghama8558b62012-05-22 00:12:20 +0000341Target::CreateBreakpoint (const FileSpecList *containingModules,
342 const FileSpec &file,
343 uint32_t line_no,
Greg Clayton1f746072012-08-29 21:13:06 +0000344 LazyBool check_inlines,
Jim Inghama8558b62012-05-22 00:12:20 +0000345 LazyBool skip_prologue,
Greg Claytoneb023e72013-10-11 19:48:25 +0000346 bool internal,
Ilia K055ad9b2015-05-18 13:41:01 +0000347 bool hardware,
348 LazyBool move_to_nearest_code)
Jim Ingham969795f2011-09-21 01:17:13 +0000349{
Greg Clayton1f746072012-08-29 21:13:06 +0000350 if (check_inlines == eLazyBoolCalculate)
351 {
352 const InlineStrategy inline_strategy = GetInlineStrategy();
353 switch (inline_strategy)
354 {
355 case eInlineBreakpointsNever:
356 check_inlines = eLazyBoolNo;
357 break;
358
359 case eInlineBreakpointsHeaders:
360 if (file.IsSourceImplementationFile())
361 check_inlines = eLazyBoolNo;
362 else
363 check_inlines = eLazyBoolYes;
364 break;
365
366 case eInlineBreakpointsAlways:
367 check_inlines = eLazyBoolYes;
368 break;
369 }
370 }
Greg Clayton93bfb292012-09-07 23:48:57 +0000371 SearchFilterSP filter_sp;
372 if (check_inlines == eLazyBoolNo)
373 {
374 // Not checking for inlines, we are looking only for matching compile units
375 FileSpecList compile_unit_list;
376 compile_unit_list.Append (file);
377 filter_sp = GetSearchFilterForModuleAndCUList (containingModules, &compile_unit_list);
378 }
379 else
380 {
381 filter_sp = GetSearchFilterForModuleList (containingModules);
382 }
Greg Clayton03da4cc2013-04-19 21:31:16 +0000383 if (skip_prologue == eLazyBoolCalculate)
384 skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo;
Ilia K055ad9b2015-05-18 13:41:01 +0000385 if (move_to_nearest_code == eLazyBoolCalculate)
386 move_to_nearest_code = GetMoveToNearestCode() ? eLazyBoolYes : eLazyBoolNo;
Greg Clayton03da4cc2013-04-19 21:31:16 +0000387
Greg Clayton1f746072012-08-29 21:13:06 +0000388 BreakpointResolverSP resolver_sp(new BreakpointResolverFileLine (NULL,
389 file,
390 line_no,
391 check_inlines,
Ilia K055ad9b2015-05-18 13:41:01 +0000392 skip_prologue,
393 !static_cast<bool>(move_to_nearest_code)));
Jim Ingham1460e4b2014-01-10 23:46:59 +0000394 return CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000395}
396
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000397BreakpointSP
Greg Claytoneb023e72013-10-11 19:48:25 +0000398Target::CreateBreakpoint (lldb::addr_t addr, bool internal, bool hardware)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000399{
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000400 Address so_addr;
Bhushan D. Attarde7f3daed2015-08-26 06:04:54 +0000401
402 // Check for any reason we want to move this breakpoint to other address.
403 addr = GetBreakableLoadAddress(addr);
404
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000405 // Attempt to resolve our load address if possible, though it is ok if
406 // it doesn't resolve to section/offset.
407
Greg Clayton1b72fcb2010-08-24 00:45:41 +0000408 // Try and resolve as a load address if possible
Greg Claytond5944cd2013-12-06 01:12:00 +0000409 GetSectionLoadList().ResolveLoadAddress(addr, so_addr);
Greg Clayton1b72fcb2010-08-24 00:45:41 +0000410 if (!so_addr.IsValid())
411 {
412 // The address didn't resolve, so just set this as an absolute address
413 so_addr.SetOffset (addr);
414 }
Greg Claytoneb023e72013-10-11 19:48:25 +0000415 BreakpointSP bp_sp (CreateBreakpoint(so_addr, internal, hardware));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000416 return bp_sp;
417}
418
419BreakpointSP
Greg Claytoneb023e72013-10-11 19:48:25 +0000420Target::CreateBreakpoint (Address &addr, bool internal, bool hardware)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000421{
Jim Ingham33df7cd2014-12-06 01:28:03 +0000422 SearchFilterSP filter_sp(new SearchFilterForUnconstrainedSearches (shared_from_this()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000423 BreakpointResolverSP resolver_sp (new BreakpointResolverAddress (NULL, addr));
Jim Ingham1460e4b2014-01-10 23:46:59 +0000424 return CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, false);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000425}
426
427BreakpointSP
Jim Ingham87df91b2011-09-23 00:54:11 +0000428Target::CreateBreakpoint (const FileSpecList *containingModules,
429 const FileSpecList *containingSourceFiles,
Greg Claytond16e1e52011-07-12 17:06:17 +0000430 const char *func_name,
431 uint32_t func_name_type_mask,
Dawn Perchik23b1dec2015-07-21 22:05:07 +0000432 LanguageType language,
Jim Inghama8558b62012-05-22 00:12:20 +0000433 LazyBool skip_prologue,
Greg Claytoneb023e72013-10-11 19:48:25 +0000434 bool internal,
435 bool hardware)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000436{
Greg Clayton0c5cd902010-06-28 21:30:43 +0000437 BreakpointSP bp_sp;
438 if (func_name)
439 {
Jim Ingham87df91b2011-09-23 00:54:11 +0000440 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, containingSourceFiles));
Greg Clayton03da4cc2013-04-19 21:31:16 +0000441
442 if (skip_prologue == eLazyBoolCalculate)
443 skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo;
Dawn Perchik23b1dec2015-07-21 22:05:07 +0000444 if (language == lldb::eLanguageTypeUnknown)
445 language = GetLanguage();
Greg Clayton03da4cc2013-04-19 21:31:16 +0000446
Greg Claytond16e1e52011-07-12 17:06:17 +0000447 BreakpointResolverSP resolver_sp (new BreakpointResolverName (NULL,
448 func_name,
449 func_name_type_mask,
Dawn Perchik23b1dec2015-07-21 22:05:07 +0000450 language,
Greg Claytond16e1e52011-07-12 17:06:17 +0000451 Breakpoint::Exact,
Greg Clayton03da4cc2013-04-19 21:31:16 +0000452 skip_prologue));
Jim Ingham1460e4b2014-01-10 23:46:59 +0000453 bp_sp = CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true);
Greg Clayton0c5cd902010-06-28 21:30:43 +0000454 }
455 return bp_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000456}
457
Jim Inghamfab10e82012-03-06 00:37:27 +0000458lldb::BreakpointSP
459Target::CreateBreakpoint (const FileSpecList *containingModules,
Greg Clayton4116e932012-05-15 02:33:01 +0000460 const FileSpecList *containingSourceFiles,
461 const std::vector<std::string> &func_names,
462 uint32_t func_name_type_mask,
Dawn Perchik23b1dec2015-07-21 22:05:07 +0000463 LanguageType language,
Jim Inghama8558b62012-05-22 00:12:20 +0000464 LazyBool skip_prologue,
Greg Claytoneb023e72013-10-11 19:48:25 +0000465 bool internal,
466 bool hardware)
Jim Inghamfab10e82012-03-06 00:37:27 +0000467{
468 BreakpointSP bp_sp;
469 size_t num_names = func_names.size();
470 if (num_names > 0)
471 {
472 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, containingSourceFiles));
Greg Clayton03da4cc2013-04-19 21:31:16 +0000473
474 if (skip_prologue == eLazyBoolCalculate)
475 skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo;
Dawn Perchik23b1dec2015-07-21 22:05:07 +0000476 if (language == lldb::eLanguageTypeUnknown)
477 language = GetLanguage();
Greg Clayton03da4cc2013-04-19 21:31:16 +0000478
479 BreakpointResolverSP resolver_sp (new BreakpointResolverName (NULL,
Jim Inghamfab10e82012-03-06 00:37:27 +0000480 func_names,
481 func_name_type_mask,
Dawn Perchik23b1dec2015-07-21 22:05:07 +0000482 language,
Greg Clayton03da4cc2013-04-19 21:31:16 +0000483 skip_prologue));
Jim Ingham1460e4b2014-01-10 23:46:59 +0000484 bp_sp = CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true);
Jim Inghamfab10e82012-03-06 00:37:27 +0000485 }
486 return bp_sp;
487}
488
Jim Ingham133e0fb2012-03-03 02:05:11 +0000489BreakpointSP
490Target::CreateBreakpoint (const FileSpecList *containingModules,
491 const FileSpecList *containingSourceFiles,
492 const char *func_names[],
493 size_t num_names,
494 uint32_t func_name_type_mask,
Dawn Perchik23b1dec2015-07-21 22:05:07 +0000495 LanguageType language,
Jim Inghama8558b62012-05-22 00:12:20 +0000496 LazyBool skip_prologue,
Greg Claytoneb023e72013-10-11 19:48:25 +0000497 bool internal,
498 bool hardware)
Jim Ingham133e0fb2012-03-03 02:05:11 +0000499{
500 BreakpointSP bp_sp;
501 if (num_names > 0)
502 {
503 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, containingSourceFiles));
504
Greg Clayton03da4cc2013-04-19 21:31:16 +0000505 if (skip_prologue == eLazyBoolCalculate)
506 skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo;
Dawn Perchik23b1dec2015-07-21 22:05:07 +0000507 if (language == lldb::eLanguageTypeUnknown)
508 language = GetLanguage();
509
Greg Clayton03da4cc2013-04-19 21:31:16 +0000510 BreakpointResolverSP resolver_sp (new BreakpointResolverName (NULL,
Jim Ingham133e0fb2012-03-03 02:05:11 +0000511 func_names,
512 num_names,
Jim Inghamfab10e82012-03-06 00:37:27 +0000513 func_name_type_mask,
Dawn Perchik23b1dec2015-07-21 22:05:07 +0000514 language,
Greg Clayton03da4cc2013-04-19 21:31:16 +0000515 skip_prologue));
Jim Ingham1460e4b2014-01-10 23:46:59 +0000516 bp_sp = CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true);
Jim Ingham133e0fb2012-03-03 02:05:11 +0000517 }
518 return bp_sp;
519}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000520
521SearchFilterSP
522Target::GetSearchFilterForModule (const FileSpec *containingModule)
523{
524 SearchFilterSP filter_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000525 if (containingModule != NULL)
526 {
527 // TODO: We should look into sharing module based search filters
528 // across many breakpoints like we do for the simple target based one
Greg Claytone1cd1be2012-01-29 20:56:30 +0000529 filter_sp.reset (new SearchFilterByModule (shared_from_this(), *containingModule));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000530 }
531 else
532 {
533 if (m_search_filter_sp.get() == NULL)
Jim Ingham33df7cd2014-12-06 01:28:03 +0000534 m_search_filter_sp.reset (new SearchFilterForUnconstrainedSearches (shared_from_this()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000535 filter_sp = m_search_filter_sp;
536 }
537 return filter_sp;
538}
539
Jim Ingham969795f2011-09-21 01:17:13 +0000540SearchFilterSP
541Target::GetSearchFilterForModuleList (const FileSpecList *containingModules)
542{
543 SearchFilterSP filter_sp;
Jim Ingham969795f2011-09-21 01:17:13 +0000544 if (containingModules && containingModules->GetSize() != 0)
545 {
546 // TODO: We should look into sharing module based search filters
547 // across many breakpoints like we do for the simple target based one
Greg Claytone1cd1be2012-01-29 20:56:30 +0000548 filter_sp.reset (new SearchFilterByModuleList (shared_from_this(), *containingModules));
Jim Ingham969795f2011-09-21 01:17:13 +0000549 }
550 else
551 {
552 if (m_search_filter_sp.get() == NULL)
Jim Ingham33df7cd2014-12-06 01:28:03 +0000553 m_search_filter_sp.reset (new SearchFilterForUnconstrainedSearches (shared_from_this()));
Jim Ingham969795f2011-09-21 01:17:13 +0000554 filter_sp = m_search_filter_sp;
555 }
556 return filter_sp;
557}
558
Jim Ingham87df91b2011-09-23 00:54:11 +0000559SearchFilterSP
Jim Inghama8558b62012-05-22 00:12:20 +0000560Target::GetSearchFilterForModuleAndCUList (const FileSpecList *containingModules,
561 const FileSpecList *containingSourceFiles)
Jim Ingham87df91b2011-09-23 00:54:11 +0000562{
563 if (containingSourceFiles == NULL || containingSourceFiles->GetSize() == 0)
564 return GetSearchFilterForModuleList(containingModules);
565
566 SearchFilterSP filter_sp;
Jim Ingham87df91b2011-09-23 00:54:11 +0000567 if (containingModules == NULL)
568 {
569 // We could make a special "CU List only SearchFilter". Better yet was if these could be composable,
570 // but that will take a little reworking.
571
Greg Claytone1cd1be2012-01-29 20:56:30 +0000572 filter_sp.reset (new SearchFilterByModuleListAndCU (shared_from_this(), FileSpecList(), *containingSourceFiles));
Jim Ingham87df91b2011-09-23 00:54:11 +0000573 }
574 else
575 {
Greg Claytone1cd1be2012-01-29 20:56:30 +0000576 filter_sp.reset (new SearchFilterByModuleListAndCU (shared_from_this(), *containingModules, *containingSourceFiles));
Jim Ingham87df91b2011-09-23 00:54:11 +0000577 }
578 return filter_sp;
579}
580
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000581BreakpointSP
Jim Ingham87df91b2011-09-23 00:54:11 +0000582Target::CreateFuncRegexBreakpoint (const FileSpecList *containingModules,
Jim Inghama8558b62012-05-22 00:12:20 +0000583 const FileSpecList *containingSourceFiles,
584 RegularExpression &func_regex,
585 LazyBool skip_prologue,
Greg Claytoneb023e72013-10-11 19:48:25 +0000586 bool internal,
587 bool hardware)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000588{
Jim Ingham87df91b2011-09-23 00:54:11 +0000589 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, containingSourceFiles));
Saleem Abdulrasoolb5c128b2014-07-23 01:53:52 +0000590 bool skip =
591 (skip_prologue == eLazyBoolCalculate) ? GetSkipPrologue()
592 : static_cast<bool>(skip_prologue);
Greg Claytond16e1e52011-07-12 17:06:17 +0000593 BreakpointResolverSP resolver_sp(new BreakpointResolverName (NULL,
594 func_regex,
Saleem Abdulrasoolb5c128b2014-07-23 01:53:52 +0000595 skip));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000596
Jim Ingham1460e4b2014-01-10 23:46:59 +0000597 return CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000598}
599
Jim Ingham219ba192012-03-05 04:47:34 +0000600lldb::BreakpointSP
Jim Inghama72b31c2015-04-22 19:42:18 +0000601Target::CreateExceptionBreakpoint (enum lldb::LanguageType language, bool catch_bp, bool throw_bp, bool internal, Args *additional_args, Error *error)
Jim Ingham219ba192012-03-05 04:47:34 +0000602{
Jim Inghama72b31c2015-04-22 19:42:18 +0000603 BreakpointSP exc_bkpt_sp = LanguageRuntime::CreateExceptionBreakpoint (*this, language, catch_bp, throw_bp, internal);
604 if (exc_bkpt_sp && additional_args)
605 {
606 Breakpoint::BreakpointPreconditionSP precondition_sp = exc_bkpt_sp->GetPrecondition();
607 if (precondition_sp && additional_args)
608 {
609 if (error)
610 *error = precondition_sp->ConfigurePrecondition(*additional_args);
611 else
612 precondition_sp->ConfigurePrecondition(*additional_args);
613 }
614 }
615 return exc_bkpt_sp;
Jim Ingham219ba192012-03-05 04:47:34 +0000616}
Jim Inghama72b31c2015-04-22 19:42:18 +0000617
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000618BreakpointSP
Jim Ingham1460e4b2014-01-10 23:46:59 +0000619Target::CreateBreakpoint (SearchFilterSP &filter_sp, BreakpointResolverSP &resolver_sp, bool internal, bool request_hardware, bool resolve_indirect_symbols)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000620{
621 BreakpointSP bp_sp;
622 if (filter_sp && resolver_sp)
623 {
Jim Ingham1460e4b2014-01-10 23:46:59 +0000624 bp_sp.reset(new Breakpoint (*this, filter_sp, resolver_sp, request_hardware, resolve_indirect_symbols));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000625 resolver_sp->SetBreakpoint (bp_sp.get());
Jim Ingham33df7cd2014-12-06 01:28:03 +0000626 AddBreakpoint (bp_sp, internal);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000627 }
Jim Ingham33df7cd2014-12-06 01:28:03 +0000628 return bp_sp;
629}
630
631void
632Target::AddBreakpoint (lldb::BreakpointSP bp_sp, bool internal)
633{
634 if (!bp_sp)
635 return;
636 if (internal)
637 m_internal_breakpoint_list.Add (bp_sp, false);
638 else
639 m_breakpoint_list.Add (bp_sp, true);
640
641 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
642 if (log)
643 {
644 StreamString s;
645 bp_sp->GetDescription(&s, lldb::eDescriptionLevelVerbose);
646 log->Printf ("Target::%s (internal = %s) => break_id = %s\n", __FUNCTION__, bp_sp->IsInternal() ? "yes" : "no", s.GetData());
647 }
648
649 bp_sp->ResolveBreakpoint();
650
651 if (!internal)
Jim Ingham36f3b362010-10-14 23:45:03 +0000652 {
653 m_last_created_breakpoint = bp_sp;
654 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000655}
656
Johnny Chen86364b42011-09-20 23:28:55 +0000657bool
658Target::ProcessIsValid()
659{
660 return (m_process_sp && m_process_sp->IsAlive());
661}
662
Johnny Chenb90827e2012-06-04 23:19:54 +0000663static bool
664CheckIfWatchpointsExhausted(Target *target, Error &error)
665{
666 uint32_t num_supported_hardware_watchpoints;
667 Error rc = target->GetProcessSP()->GetWatchpointSupportInfo(num_supported_hardware_watchpoints);
668 if (rc.Success())
669 {
670 uint32_t num_current_watchpoints = target->GetWatchpointList().GetSize();
671 if (num_current_watchpoints >= num_supported_hardware_watchpoints)
672 error.SetErrorStringWithFormat("number of supported hardware watchpoints (%u) has been reached",
673 num_supported_hardware_watchpoints);
674 }
675 return false;
676}
677
Johnny Chen01a67862011-10-14 00:42:25 +0000678// See also Watchpoint::SetWatchpointType(uint32_t type) and
Johnny Chenab9ee762011-09-14 00:26:03 +0000679// the OptionGroupWatchpoint::WatchType enum type.
Johnny Chen01a67862011-10-14 00:42:25 +0000680WatchpointSP
Greg Claytona1e5dc82015-08-11 22:53:00 +0000681Target::CreateWatchpoint(lldb::addr_t addr, size_t size, const CompilerType *type, uint32_t kind, Error &error)
Johnny Chen887062a2011-09-12 23:38:44 +0000682{
Greg Clayton5160ce52013-03-27 23:08:40 +0000683 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen0c406372011-09-14 20:23:45 +0000684 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000685 log->Printf("Target::%s (addr = 0x%8.8" PRIx64 " size = %" PRIu64 " type = %u)\n",
Jim Inghama7dfb662012-10-23 07:20:06 +0000686 __FUNCTION__, addr, (uint64_t)size, kind);
Johnny Chen0c406372011-09-14 20:23:45 +0000687
Johnny Chen01a67862011-10-14 00:42:25 +0000688 WatchpointSP wp_sp;
Johnny Chen86364b42011-09-20 23:28:55 +0000689 if (!ProcessIsValid())
Johnny Chenb90827e2012-06-04 23:19:54 +0000690 {
691 error.SetErrorString("process is not alive");
Johnny Chen01a67862011-10-14 00:42:25 +0000692 return wp_sp;
Johnny Chenb90827e2012-06-04 23:19:54 +0000693 }
Jim Inghamc6462312013-06-18 21:52:48 +0000694
Johnny Chen45e541f2011-09-14 22:20:15 +0000695 if (addr == LLDB_INVALID_ADDRESS || size == 0)
Johnny Chenb90827e2012-06-04 23:19:54 +0000696 {
697 if (size == 0)
698 error.SetErrorString("cannot set a watchpoint with watch_size of 0");
699 else
Daniel Malead01b2952012-11-29 21:49:15 +0000700 error.SetErrorStringWithFormat("invalid watch address: %" PRIu64, addr);
Johnny Chen01a67862011-10-14 00:42:25 +0000701 return wp_sp;
Johnny Chenb90827e2012-06-04 23:19:54 +0000702 }
Jim Inghamc6462312013-06-18 21:52:48 +0000703
704 if (!LLDB_WATCH_TYPE_IS_VALID(kind))
705 {
706 error.SetErrorStringWithFormat ("invalid watchpoint type: %d", kind);
707 }
Johnny Chen7313a642011-09-13 01:15:36 +0000708
Johnny Chen01a67862011-10-14 00:42:25 +0000709 // Currently we only support one watchpoint per address, with total number
710 // of watchpoints limited by the hardware which the inferior is running on.
Johnny Chen7385a5a2012-05-31 22:56:36 +0000711
712 // Grab the list mutex while doing operations.
Jim Ingham1b5792e2012-12-18 02:03:49 +0000713 const bool notify = false; // Don't notify about all the state changes we do on creating the watchpoint.
Johnny Chen7385a5a2012-05-31 22:56:36 +0000714 Mutex::Locker locker;
715 this->GetWatchpointList().GetListMutex(locker);
Johnny Chen01a67862011-10-14 00:42:25 +0000716 WatchpointSP matched_sp = m_watchpoint_list.FindByAddress(addr);
Johnny Chen3c532582011-09-13 23:29:31 +0000717 if (matched_sp)
718 {
Johnny Chen0c406372011-09-14 20:23:45 +0000719 size_t old_size = matched_sp->GetByteSize();
Johnny Chen3c532582011-09-13 23:29:31 +0000720 uint32_t old_type =
Johnny Chen0c406372011-09-14 20:23:45 +0000721 (matched_sp->WatchpointRead() ? LLDB_WATCH_TYPE_READ : 0) |
722 (matched_sp->WatchpointWrite() ? LLDB_WATCH_TYPE_WRITE : 0);
Johnny Chen01a67862011-10-14 00:42:25 +0000723 // Return the existing watchpoint if both size and type match.
Jim Inghamc6462312013-06-18 21:52:48 +0000724 if (size == old_size && kind == old_type)
725 {
Johnny Chen01a67862011-10-14 00:42:25 +0000726 wp_sp = matched_sp;
Jim Ingham1b5792e2012-12-18 02:03:49 +0000727 wp_sp->SetEnabled(false, notify);
Jim Inghamc6462312013-06-18 21:52:48 +0000728 }
729 else
730 {
Johnny Chen01a67862011-10-14 00:42:25 +0000731 // Nil the matched watchpoint; we will be creating a new one.
Jim Ingham1b5792e2012-12-18 02:03:49 +0000732 m_process_sp->DisableWatchpoint(matched_sp.get(), notify);
733 m_watchpoint_list.Remove(matched_sp->GetID(), true);
Johnny Chen45e541f2011-09-14 22:20:15 +0000734 }
Johnny Chen3c532582011-09-13 23:29:31 +0000735 }
736
Jason Molenda727e3922012-12-05 23:07:34 +0000737 if (!wp_sp)
738 {
Jim Ingham1b5792e2012-12-18 02:03:49 +0000739 wp_sp.reset(new Watchpoint(*this, addr, size, type));
740 wp_sp->SetWatchpointType(kind, notify);
741 m_watchpoint_list.Add (wp_sp, true);
Johnny Chen45e541f2011-09-14 22:20:15 +0000742 }
Johnny Chen0c406372011-09-14 20:23:45 +0000743
Jim Ingham1b5792e2012-12-18 02:03:49 +0000744 error = m_process_sp->EnableWatchpoint(wp_sp.get(), notify);
Johnny Chen0c406372011-09-14 20:23:45 +0000745 if (log)
Jason Molenda727e3922012-12-05 23:07:34 +0000746 log->Printf("Target::%s (creation of watchpoint %s with id = %u)\n",
747 __FUNCTION__,
748 error.Success() ? "succeeded" : "failed",
749 wp_sp->GetID());
Johnny Chen0c406372011-09-14 20:23:45 +0000750
Jason Molenda727e3922012-12-05 23:07:34 +0000751 if (error.Fail())
752 {
Johnny Chen41b77262012-03-26 22:00:10 +0000753 // Enabling the watchpoint on the device side failed.
754 // Remove the said watchpoint from the list maintained by the target instance.
Jim Ingham1b5792e2012-12-18 02:03:49 +0000755 m_watchpoint_list.Remove (wp_sp->GetID(), true);
Johnny Chenb90827e2012-06-04 23:19:54 +0000756 // See if we could provide more helpful error message.
757 if (!CheckIfWatchpointsExhausted(this, error))
758 {
759 if (!OptionGroupWatchpoint::IsWatchSizeSupported(size))
Greg Clayton6fea17e2014-03-03 19:15:20 +0000760 error.SetErrorStringWithFormat("watch size of %" PRIu64 " is not supported", (uint64_t)size);
Johnny Chenb90827e2012-06-04 23:19:54 +0000761 }
Johnny Chen01a67862011-10-14 00:42:25 +0000762 wp_sp.reset();
Johnny Chen41b77262012-03-26 22:00:10 +0000763 }
Johnny Chen9d954d82011-09-27 20:29:45 +0000764 else
Johnny Chen01a67862011-10-14 00:42:25 +0000765 m_last_created_watchpoint = wp_sp;
766 return wp_sp;
Johnny Chen887062a2011-09-12 23:38:44 +0000767}
768
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000769void
770Target::RemoveAllBreakpoints (bool internal_also)
771{
Greg Clayton5160ce52013-03-27 23:08:40 +0000772 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000773 if (log)
774 log->Printf ("Target::%s (internal_also = %s)\n", __FUNCTION__, internal_also ? "yes" : "no");
775
Greg Clayton9fed0d82010-07-23 23:33:17 +0000776 m_breakpoint_list.RemoveAll (true);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000777 if (internal_also)
Greg Clayton9fed0d82010-07-23 23:33:17 +0000778 m_internal_breakpoint_list.RemoveAll (false);
Jim Ingham36f3b362010-10-14 23:45:03 +0000779
780 m_last_created_breakpoint.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000781}
782
783void
784Target::DisableAllBreakpoints (bool internal_also)
785{
Greg Clayton5160ce52013-03-27 23:08:40 +0000786 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000787 if (log)
788 log->Printf ("Target::%s (internal_also = %s)\n", __FUNCTION__, internal_also ? "yes" : "no");
789
790 m_breakpoint_list.SetEnabledAll (false);
791 if (internal_also)
792 m_internal_breakpoint_list.SetEnabledAll (false);
793}
794
795void
796Target::EnableAllBreakpoints (bool internal_also)
797{
Greg Clayton5160ce52013-03-27 23:08:40 +0000798 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000799 if (log)
800 log->Printf ("Target::%s (internal_also = %s)\n", __FUNCTION__, internal_also ? "yes" : "no");
801
802 m_breakpoint_list.SetEnabledAll (true);
803 if (internal_also)
804 m_internal_breakpoint_list.SetEnabledAll (true);
805}
806
807bool
808Target::RemoveBreakpointByID (break_id_t break_id)
809{
Greg Clayton5160ce52013-03-27 23:08:40 +0000810 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000811 if (log)
812 log->Printf ("Target::%s (break_id = %i, internal = %s)\n", __FUNCTION__, break_id, LLDB_BREAK_ID_IS_INTERNAL (break_id) ? "yes" : "no");
813
814 if (DisableBreakpointByID (break_id))
815 {
816 if (LLDB_BREAK_ID_IS_INTERNAL (break_id))
Greg Clayton9fed0d82010-07-23 23:33:17 +0000817 m_internal_breakpoint_list.Remove(break_id, false);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000818 else
Jim Ingham36f3b362010-10-14 23:45:03 +0000819 {
Greg Claytonaa1c5872011-01-24 23:35:47 +0000820 if (m_last_created_breakpoint)
821 {
822 if (m_last_created_breakpoint->GetID() == break_id)
823 m_last_created_breakpoint.reset();
824 }
Greg Clayton9fed0d82010-07-23 23:33:17 +0000825 m_breakpoint_list.Remove(break_id, true);
Jim Ingham36f3b362010-10-14 23:45:03 +0000826 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000827 return true;
828 }
829 return false;
830}
831
832bool
833Target::DisableBreakpointByID (break_id_t break_id)
834{
Greg Clayton5160ce52013-03-27 23:08:40 +0000835 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000836 if (log)
837 log->Printf ("Target::%s (break_id = %i, internal = %s)\n", __FUNCTION__, break_id, LLDB_BREAK_ID_IS_INTERNAL (break_id) ? "yes" : "no");
838
839 BreakpointSP bp_sp;
840
841 if (LLDB_BREAK_ID_IS_INTERNAL (break_id))
842 bp_sp = m_internal_breakpoint_list.FindBreakpointByID (break_id);
843 else
844 bp_sp = m_breakpoint_list.FindBreakpointByID (break_id);
845 if (bp_sp)
846 {
847 bp_sp->SetEnabled (false);
848 return true;
849 }
850 return false;
851}
852
853bool
854Target::EnableBreakpointByID (break_id_t break_id)
855{
Greg Clayton5160ce52013-03-27 23:08:40 +0000856 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000857 if (log)
858 log->Printf ("Target::%s (break_id = %i, internal = %s)\n",
859 __FUNCTION__,
860 break_id,
861 LLDB_BREAK_ID_IS_INTERNAL (break_id) ? "yes" : "no");
862
863 BreakpointSP bp_sp;
864
865 if (LLDB_BREAK_ID_IS_INTERNAL (break_id))
866 bp_sp = m_internal_breakpoint_list.FindBreakpointByID (break_id);
867 else
868 bp_sp = m_breakpoint_list.FindBreakpointByID (break_id);
869
870 if (bp_sp)
871 {
872 bp_sp->SetEnabled (true);
873 return true;
874 }
875 return false;
876}
877
Johnny Chenedf50372011-09-23 21:21:43 +0000878// The flag 'end_to_end', default to true, signifies that the operation is
879// performed end to end, for both the debugger and the debuggee.
880
Johnny Chen01a67862011-10-14 00:42:25 +0000881// Assumption: Caller holds the list mutex lock for m_watchpoint_list for end
882// to end operations.
Johnny Chen86364b42011-09-20 23:28:55 +0000883bool
Johnny Chen01a67862011-10-14 00:42:25 +0000884Target::RemoveAllWatchpoints (bool end_to_end)
Johnny Chen86364b42011-09-20 23:28:55 +0000885{
Greg Clayton5160ce52013-03-27 23:08:40 +0000886 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen86364b42011-09-20 23:28:55 +0000887 if (log)
888 log->Printf ("Target::%s\n", __FUNCTION__);
889
Johnny Chenedf50372011-09-23 21:21:43 +0000890 if (!end_to_end) {
Jim Ingham1b5792e2012-12-18 02:03:49 +0000891 m_watchpoint_list.RemoveAll(true);
Johnny Chenedf50372011-09-23 21:21:43 +0000892 return true;
893 }
894
895 // Otherwise, it's an end to end operation.
896
Johnny Chen86364b42011-09-20 23:28:55 +0000897 if (!ProcessIsValid())
898 return false;
899
Johnny Chen01a67862011-10-14 00:42:25 +0000900 size_t num_watchpoints = m_watchpoint_list.GetSize();
Johnny Chen86364b42011-09-20 23:28:55 +0000901 for (size_t i = 0; i < num_watchpoints; ++i)
902 {
Johnny Chen01a67862011-10-14 00:42:25 +0000903 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
904 if (!wp_sp)
Johnny Chen86364b42011-09-20 23:28:55 +0000905 return false;
906
Johnny Chen01a67862011-10-14 00:42:25 +0000907 Error rc = m_process_sp->DisableWatchpoint(wp_sp.get());
Johnny Chen86364b42011-09-20 23:28:55 +0000908 if (rc.Fail())
909 return false;
910 }
Jim Ingham1b5792e2012-12-18 02:03:49 +0000911 m_watchpoint_list.RemoveAll (true);
Jim Inghamb0b45132013-07-02 02:09:46 +0000912 m_last_created_watchpoint.reset();
Johnny Chen86364b42011-09-20 23:28:55 +0000913 return true; // Success!
914}
915
Johnny Chen01a67862011-10-14 00:42:25 +0000916// Assumption: Caller holds the list mutex lock for m_watchpoint_list for end to
917// end operations.
Johnny Chen86364b42011-09-20 23:28:55 +0000918bool
Johnny Chen01a67862011-10-14 00:42:25 +0000919Target::DisableAllWatchpoints (bool end_to_end)
Johnny Chen86364b42011-09-20 23:28:55 +0000920{
Greg Clayton5160ce52013-03-27 23:08:40 +0000921 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen86364b42011-09-20 23:28:55 +0000922 if (log)
923 log->Printf ("Target::%s\n", __FUNCTION__);
924
Johnny Chenedf50372011-09-23 21:21:43 +0000925 if (!end_to_end) {
Johnny Chen01a67862011-10-14 00:42:25 +0000926 m_watchpoint_list.SetEnabledAll(false);
Johnny Chenedf50372011-09-23 21:21:43 +0000927 return true;
928 }
929
930 // Otherwise, it's an end to end operation.
931
Johnny Chen86364b42011-09-20 23:28:55 +0000932 if (!ProcessIsValid())
933 return false;
934
Johnny Chen01a67862011-10-14 00:42:25 +0000935 size_t num_watchpoints = m_watchpoint_list.GetSize();
Johnny Chen86364b42011-09-20 23:28:55 +0000936 for (size_t i = 0; i < num_watchpoints; ++i)
937 {
Johnny Chen01a67862011-10-14 00:42:25 +0000938 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
939 if (!wp_sp)
Johnny Chen86364b42011-09-20 23:28:55 +0000940 return false;
941
Johnny Chen01a67862011-10-14 00:42:25 +0000942 Error rc = m_process_sp->DisableWatchpoint(wp_sp.get());
Johnny Chen86364b42011-09-20 23:28:55 +0000943 if (rc.Fail())
944 return false;
945 }
Johnny Chen86364b42011-09-20 23:28:55 +0000946 return true; // Success!
947}
948
Johnny Chen01a67862011-10-14 00:42:25 +0000949// Assumption: Caller holds the list mutex lock for m_watchpoint_list for end to
950// end operations.
Johnny Chen86364b42011-09-20 23:28:55 +0000951bool
Johnny Chen01a67862011-10-14 00:42:25 +0000952Target::EnableAllWatchpoints (bool end_to_end)
Johnny Chen86364b42011-09-20 23:28:55 +0000953{
Greg Clayton5160ce52013-03-27 23:08:40 +0000954 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen86364b42011-09-20 23:28:55 +0000955 if (log)
956 log->Printf ("Target::%s\n", __FUNCTION__);
957
Johnny Chenedf50372011-09-23 21:21:43 +0000958 if (!end_to_end) {
Johnny Chen01a67862011-10-14 00:42:25 +0000959 m_watchpoint_list.SetEnabledAll(true);
Johnny Chenedf50372011-09-23 21:21:43 +0000960 return true;
961 }
962
963 // Otherwise, it's an end to end operation.
964
Johnny Chen86364b42011-09-20 23:28:55 +0000965 if (!ProcessIsValid())
966 return false;
967
Johnny Chen01a67862011-10-14 00:42:25 +0000968 size_t num_watchpoints = m_watchpoint_list.GetSize();
Johnny Chen86364b42011-09-20 23:28:55 +0000969 for (size_t i = 0; i < num_watchpoints; ++i)
970 {
Johnny Chen01a67862011-10-14 00:42:25 +0000971 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
972 if (!wp_sp)
Johnny Chen86364b42011-09-20 23:28:55 +0000973 return false;
974
Johnny Chen01a67862011-10-14 00:42:25 +0000975 Error rc = m_process_sp->EnableWatchpoint(wp_sp.get());
Johnny Chen86364b42011-09-20 23:28:55 +0000976 if (rc.Fail())
977 return false;
978 }
Johnny Chen86364b42011-09-20 23:28:55 +0000979 return true; // Success!
980}
981
Johnny Chena4d6bc92012-02-25 06:44:30 +0000982// Assumption: Caller holds the list mutex lock for m_watchpoint_list.
983bool
984Target::ClearAllWatchpointHitCounts ()
985{
Greg Clayton5160ce52013-03-27 23:08:40 +0000986 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chena4d6bc92012-02-25 06:44:30 +0000987 if (log)
988 log->Printf ("Target::%s\n", __FUNCTION__);
989
990 size_t num_watchpoints = m_watchpoint_list.GetSize();
991 for (size_t i = 0; i < num_watchpoints; ++i)
992 {
993 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
994 if (!wp_sp)
995 return false;
996
997 wp_sp->ResetHitCount();
998 }
999 return true; // Success!
1000}
1001
Enrico Granata5e3fe042015-02-11 00:37:54 +00001002// Assumption: Caller holds the list mutex lock for m_watchpoint_list.
1003bool
1004Target::ClearAllWatchpointHistoricValues ()
1005{
1006 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
1007 if (log)
1008 log->Printf ("Target::%s\n", __FUNCTION__);
1009
1010 size_t num_watchpoints = m_watchpoint_list.GetSize();
1011 for (size_t i = 0; i < num_watchpoints; ++i)
1012 {
1013 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
1014 if (!wp_sp)
1015 return false;
1016
1017 wp_sp->ResetHistoricValues();
1018 }
1019 return true; // Success!
1020}
1021
Johnny Chen01a67862011-10-14 00:42:25 +00001022// Assumption: Caller holds the list mutex lock for m_watchpoint_list
Johnny Chen6cc60e82011-10-05 21:35:46 +00001023// during these operations.
1024bool
Johnny Chen01a67862011-10-14 00:42:25 +00001025Target::IgnoreAllWatchpoints (uint32_t ignore_count)
Johnny Chen6cc60e82011-10-05 21:35:46 +00001026{
Greg Clayton5160ce52013-03-27 23:08:40 +00001027 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen6cc60e82011-10-05 21:35:46 +00001028 if (log)
1029 log->Printf ("Target::%s\n", __FUNCTION__);
1030
1031 if (!ProcessIsValid())
1032 return false;
1033
Johnny Chen01a67862011-10-14 00:42:25 +00001034 size_t num_watchpoints = m_watchpoint_list.GetSize();
Johnny Chen6cc60e82011-10-05 21:35:46 +00001035 for (size_t i = 0; i < num_watchpoints; ++i)
1036 {
Johnny Chen01a67862011-10-14 00:42:25 +00001037 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
1038 if (!wp_sp)
Johnny Chen6cc60e82011-10-05 21:35:46 +00001039 return false;
1040
Johnny Chen01a67862011-10-14 00:42:25 +00001041 wp_sp->SetIgnoreCount(ignore_count);
Johnny Chen6cc60e82011-10-05 21:35:46 +00001042 }
1043 return true; // Success!
1044}
1045
Johnny Chen01a67862011-10-14 00:42:25 +00001046// Assumption: Caller holds the list mutex lock for m_watchpoint_list.
Johnny Chen86364b42011-09-20 23:28:55 +00001047bool
Johnny Chen01a67862011-10-14 00:42:25 +00001048Target::DisableWatchpointByID (lldb::watch_id_t watch_id)
Johnny Chen86364b42011-09-20 23:28:55 +00001049{
Greg Clayton5160ce52013-03-27 23:08:40 +00001050 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen86364b42011-09-20 23:28:55 +00001051 if (log)
1052 log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
1053
1054 if (!ProcessIsValid())
1055 return false;
1056
Johnny Chen01a67862011-10-14 00:42:25 +00001057 WatchpointSP wp_sp = m_watchpoint_list.FindByID (watch_id);
1058 if (wp_sp)
Johnny Chen86364b42011-09-20 23:28:55 +00001059 {
Johnny Chen01a67862011-10-14 00:42:25 +00001060 Error rc = m_process_sp->DisableWatchpoint(wp_sp.get());
Johnny Chenf04ee932011-09-22 18:04:58 +00001061 if (rc.Success())
1062 return true;
Johnny Chen86364b42011-09-20 23:28:55 +00001063
Johnny Chenf04ee932011-09-22 18:04:58 +00001064 // Else, fallthrough.
Johnny Chen86364b42011-09-20 23:28:55 +00001065 }
1066 return false;
1067}
1068
Johnny Chen01a67862011-10-14 00:42:25 +00001069// Assumption: Caller holds the list mutex lock for m_watchpoint_list.
Johnny Chen86364b42011-09-20 23:28:55 +00001070bool
Johnny Chen01a67862011-10-14 00:42:25 +00001071Target::EnableWatchpointByID (lldb::watch_id_t watch_id)
Johnny Chen86364b42011-09-20 23:28:55 +00001072{
Greg Clayton5160ce52013-03-27 23:08:40 +00001073 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen86364b42011-09-20 23:28:55 +00001074 if (log)
1075 log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
1076
1077 if (!ProcessIsValid())
1078 return false;
1079
Johnny Chen01a67862011-10-14 00:42:25 +00001080 WatchpointSP wp_sp = m_watchpoint_list.FindByID (watch_id);
1081 if (wp_sp)
Johnny Chen86364b42011-09-20 23:28:55 +00001082 {
Johnny Chen01a67862011-10-14 00:42:25 +00001083 Error rc = m_process_sp->EnableWatchpoint(wp_sp.get());
Johnny Chenf04ee932011-09-22 18:04:58 +00001084 if (rc.Success())
1085 return true;
Johnny Chen86364b42011-09-20 23:28:55 +00001086
Johnny Chenf04ee932011-09-22 18:04:58 +00001087 // Else, fallthrough.
Johnny Chen86364b42011-09-20 23:28:55 +00001088 }
1089 return false;
1090}
1091
Johnny Chen01a67862011-10-14 00:42:25 +00001092// Assumption: Caller holds the list mutex lock for m_watchpoint_list.
Johnny Chen86364b42011-09-20 23:28:55 +00001093bool
Johnny Chen01a67862011-10-14 00:42:25 +00001094Target::RemoveWatchpointByID (lldb::watch_id_t watch_id)
Johnny Chen86364b42011-09-20 23:28:55 +00001095{
Greg Clayton5160ce52013-03-27 23:08:40 +00001096 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen86364b42011-09-20 23:28:55 +00001097 if (log)
1098 log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
1099
Jim Inghamb0b45132013-07-02 02:09:46 +00001100 WatchpointSP watch_to_remove_sp = m_watchpoint_list.FindByID(watch_id);
1101 if (watch_to_remove_sp == m_last_created_watchpoint)
1102 m_last_created_watchpoint.reset();
1103
Johnny Chen01a67862011-10-14 00:42:25 +00001104 if (DisableWatchpointByID (watch_id))
Johnny Chen86364b42011-09-20 23:28:55 +00001105 {
Jim Ingham1b5792e2012-12-18 02:03:49 +00001106 m_watchpoint_list.Remove(watch_id, true);
Johnny Chen86364b42011-09-20 23:28:55 +00001107 return true;
1108 }
1109 return false;
1110}
1111
Johnny Chen01a67862011-10-14 00:42:25 +00001112// Assumption: Caller holds the list mutex lock for m_watchpoint_list.
Johnny Chen6cc60e82011-10-05 21:35:46 +00001113bool
Johnny Chen01a67862011-10-14 00:42:25 +00001114Target::IgnoreWatchpointByID (lldb::watch_id_t watch_id, uint32_t ignore_count)
Johnny Chen6cc60e82011-10-05 21:35:46 +00001115{
Greg Clayton5160ce52013-03-27 23:08:40 +00001116 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen6cc60e82011-10-05 21:35:46 +00001117 if (log)
1118 log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
1119
1120 if (!ProcessIsValid())
1121 return false;
1122
Johnny Chen01a67862011-10-14 00:42:25 +00001123 WatchpointSP wp_sp = m_watchpoint_list.FindByID (watch_id);
1124 if (wp_sp)
Johnny Chen6cc60e82011-10-05 21:35:46 +00001125 {
Johnny Chen01a67862011-10-14 00:42:25 +00001126 wp_sp->SetIgnoreCount(ignore_count);
Johnny Chen6cc60e82011-10-05 21:35:46 +00001127 return true;
1128 }
1129 return false;
1130}
1131
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001132ModuleSP
1133Target::GetExecutableModule ()
1134{
Aidan Doddsc0c83852015-05-08 09:36:31 +00001135 // search for the first executable in the module list
1136 for (size_t i = 0; i < m_images.GetSize(); ++i)
1137 {
1138 ModuleSP module_sp = m_images.GetModuleAtIndex (i);
1139 lldb_private::ObjectFile * obj = module_sp->GetObjectFile();
1140 if (obj == nullptr)
1141 continue;
1142 if (obj->GetType() == ObjectFile::Type::eTypeExecutable)
1143 return module_sp;
1144 }
1145 // as fall back return the first module loaded
1146 return m_images.GetModuleAtIndex (0);
Greg Claytonaa149cb2011-08-11 02:48:45 +00001147}
1148
1149Module*
1150Target::GetExecutableModulePointer ()
1151{
Aidan Doddsc0c83852015-05-08 09:36:31 +00001152 return GetExecutableModule().get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001153}
1154
Enrico Granata17598482012-11-08 02:22:02 +00001155static void
1156LoadScriptingResourceForModule (const ModuleSP &module_sp, Target *target)
1157{
1158 Error error;
Enrico Granata97303392013-05-21 00:00:30 +00001159 StreamString feedback_stream;
1160 if (module_sp && !module_sp->LoadScriptingResourceInTarget(target, error, &feedback_stream))
Enrico Granata17598482012-11-08 02:22:02 +00001161 {
Enrico Granata97303392013-05-21 00:00:30 +00001162 if (error.AsCString())
Greg Clayton44d93782014-01-27 23:43:24 +00001163 target->GetDebugger().GetErrorFile()->Printf("unable to load scripting data for module %s - error reported was %s\n",
Enrico Granata97303392013-05-21 00:00:30 +00001164 module_sp->GetFileSpec().GetFileNameStrippingExtension().GetCString(),
1165 error.AsCString());
Enrico Granata17598482012-11-08 02:22:02 +00001166 }
Enrico Granatafe7295d2014-08-16 00:32:58 +00001167 if (feedback_stream.GetSize())
1168 target->GetDebugger().GetErrorFile()->Printf("%s\n",
1169 feedback_stream.GetData());
Enrico Granata17598482012-11-08 02:22:02 +00001170}
1171
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001172void
Greg Claytonb35db632013-11-09 00:03:31 +00001173Target::ClearModules(bool delete_locations)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001174{
Greg Claytonb35db632013-11-09 00:03:31 +00001175 ModulesDidUnload (m_images, delete_locations);
Greg Claytond5944cd2013-12-06 01:12:00 +00001176 m_section_load_history.Clear();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001177 m_images.Clear();
Greg Clayton5beec212015-10-08 21:04:34 +00001178 m_scratch_type_system_map.Clear();
Sean Callanan686b2312011-11-16 18:20:47 +00001179 m_ast_importer_ap.reset();
Greg Clayton095eeaa2013-11-05 23:28:00 +00001180}
1181
1182void
Greg Claytonb35db632013-11-09 00:03:31 +00001183Target::DidExec ()
1184{
1185 // When a process exec's we need to know about it so we can do some cleanup.
1186 m_breakpoint_list.RemoveInvalidLocations(m_arch);
1187 m_internal_breakpoint_list.RemoveInvalidLocations(m_arch);
1188}
1189
1190void
Greg Clayton095eeaa2013-11-05 23:28:00 +00001191Target::SetExecutableModule (ModuleSP& executable_sp, bool get_dependent_files)
1192{
1193 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TARGET));
Greg Claytonb35db632013-11-09 00:03:31 +00001194 ClearModules(false);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001195
1196 if (executable_sp.get())
1197 {
1198 Timer scoped_timer (__PRETTY_FUNCTION__,
Greg Claytonb5ad4ec2013-04-29 17:25:54 +00001199 "Target::SetExecutableModule (executable = '%s')",
1200 executable_sp->GetFileSpec().GetPath().c_str());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001201
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +00001202 m_images.Append(executable_sp); // The first image is our executable file
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001203
Jim Ingham5aee1622010-08-09 23:31:02 +00001204 // If we haven't set an architecture yet, reset our architecture based on what we found in the executable module.
Greg Clayton32e0a752011-03-30 18:16:51 +00001205 if (!m_arch.IsValid())
Jason Molendae1b68ad2012-12-05 00:25:49 +00001206 {
Greg Clayton32e0a752011-03-30 18:16:51 +00001207 m_arch = executable_sp->GetArchitecture();
Jason Molendae1b68ad2012-12-05 00:25:49 +00001208 if (log)
1209 log->Printf ("Target::SetExecutableModule setting architecture to %s (%s) based on executable file", m_arch.GetArchitectureName(), m_arch.GetTriple().getTriple().c_str());
1210 }
1211
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001212 FileSpecList dependent_files;
Greg Claytone996fd32011-03-08 22:40:15 +00001213 ObjectFile *executable_objfile = executable_sp->GetObjectFile();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001214
Greg Claytoncac9c5f2011-09-24 00:52:29 +00001215 if (executable_objfile && get_dependent_files)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001216 {
1217 executable_objfile->GetDependentModules(dependent_files);
1218 for (uint32_t i=0; i<dependent_files.GetSize(); i++)
1219 {
Greg Claytonded470d2011-03-19 01:12:21 +00001220 FileSpec dependent_file_spec (dependent_files.GetFileSpecPointerAtIndex(i));
1221 FileSpec platform_dependent_file_spec;
1222 if (m_platform_sp)
Steve Puccifc995722014-01-17 18:18:31 +00001223 m_platform_sp->GetFileWithUUID (dependent_file_spec, NULL, platform_dependent_file_spec);
Greg Claytonded470d2011-03-19 01:12:21 +00001224 else
1225 platform_dependent_file_spec = dependent_file_spec;
1226
Greg Claytonb9a01b32012-02-26 05:51:37 +00001227 ModuleSpec module_spec (platform_dependent_file_spec, m_arch);
1228 ModuleSP image_module_sp(GetSharedModule (module_spec));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001229 if (image_module_sp.get())
1230 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001231 ObjectFile *objfile = image_module_sp->GetObjectFile();
1232 if (objfile)
1233 objfile->GetDependentModules(dependent_files);
1234 }
1235 }
1236 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001237 }
1238}
1239
Jim Ingham5aee1622010-08-09 23:31:02 +00001240bool
1241Target::SetArchitecture (const ArchSpec &arch_spec)
1242{
Greg Clayton5160ce52013-03-27 23:08:40 +00001243 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TARGET));
Sean Callananbf4b7be2012-12-13 22:07:14 +00001244 if (m_arch.IsCompatibleMatch(arch_spec) || !m_arch.IsValid())
Jim Ingham5aee1622010-08-09 23:31:02 +00001245 {
Greg Clayton70512312012-05-08 01:45:38 +00001246 // If we haven't got a valid arch spec, or the architectures are
1247 // compatible, so just update the architecture. Architectures can be
1248 // equal, yet the triple OS and vendor might change, so we need to do
1249 // the assignment here just in case.
Greg Clayton32e0a752011-03-30 18:16:51 +00001250 m_arch = arch_spec;
Jason Molendae1b68ad2012-12-05 00:25:49 +00001251 if (log)
1252 log->Printf ("Target::SetArchitecture setting architecture to %s (%s)", arch_spec.GetArchitectureName(), arch_spec.GetTriple().getTriple().c_str());
Jim Ingham5aee1622010-08-09 23:31:02 +00001253 return true;
1254 }
1255 else
1256 {
1257 // If we have an executable file, try to reset the executable to the desired architecture
Jason Molendae1b68ad2012-12-05 00:25:49 +00001258 if (log)
Jason Molenda727e3922012-12-05 23:07:34 +00001259 log->Printf ("Target::SetArchitecture changing architecture to %s (%s)", arch_spec.GetArchitectureName(), arch_spec.GetTriple().getTriple().c_str());
Greg Clayton32e0a752011-03-30 18:16:51 +00001260 m_arch = arch_spec;
Jim Ingham5aee1622010-08-09 23:31:02 +00001261 ModuleSP executable_sp = GetExecutableModule ();
Greg Clayton095eeaa2013-11-05 23:28:00 +00001262
Greg Claytonb35db632013-11-09 00:03:31 +00001263 ClearModules(true);
Jim Ingham5aee1622010-08-09 23:31:02 +00001264 // Need to do something about unsetting breakpoints.
1265
1266 if (executable_sp)
1267 {
Jason Molendae1b68ad2012-12-05 00:25:49 +00001268 if (log)
1269 log->Printf("Target::SetArchitecture Trying to select executable file architecture %s (%s)", arch_spec.GetArchitectureName(), arch_spec.GetTriple().getTriple().c_str());
Greg Claytonb9a01b32012-02-26 05:51:37 +00001270 ModuleSpec module_spec (executable_sp->GetFileSpec(), arch_spec);
1271 Error error = ModuleList::GetSharedModule (module_spec,
1272 executable_sp,
Greg Clayton6920b522012-08-22 18:39:03 +00001273 &GetExecutableSearchPaths(),
Greg Claytonb9a01b32012-02-26 05:51:37 +00001274 NULL,
1275 NULL);
Jim Ingham5aee1622010-08-09 23:31:02 +00001276
1277 if (!error.Fail() && executable_sp)
1278 {
1279 SetExecutableModule (executable_sp, true);
1280 return true;
1281 }
Jim Ingham5aee1622010-08-09 23:31:02 +00001282 }
1283 }
Greg Clayton70512312012-05-08 01:45:38 +00001284 return false;
Jim Ingham5aee1622010-08-09 23:31:02 +00001285}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001286
Tamas Berghammere9f4dfe2015-03-13 10:32:42 +00001287bool
1288Target::MergeArchitecture (const ArchSpec &arch_spec)
1289{
1290 if (arch_spec.IsValid())
1291 {
1292 if (m_arch.IsCompatibleMatch(arch_spec))
1293 {
1294 // The current target arch is compatible with "arch_spec", see if we
1295 // can improve our current architecture using bits from "arch_spec"
1296
1297 // Merge bits from arch_spec into "merged_arch" and set our architecture
1298 ArchSpec merged_arch (m_arch);
1299 merged_arch.MergeFrom (arch_spec);
1300 return SetArchitecture(merged_arch);
1301 }
1302 else
1303 {
1304 // The new architecture is different, we just need to replace it
1305 return SetArchitecture(arch_spec);
1306 }
1307 }
1308 return false;
1309}
1310
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001311void
Enrico Granataefe637d2012-11-08 19:16:03 +00001312Target::WillClearList (const ModuleList& module_list)
Enrico Granata17598482012-11-08 02:22:02 +00001313{
1314}
1315
1316void
Enrico Granataefe637d2012-11-08 19:16:03 +00001317Target::ModuleAdded (const ModuleList& module_list, const ModuleSP &module_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001318{
1319 // A module is being added to this target for the first time
Greg Clayton23f8c952014-03-24 23:10:19 +00001320 if (m_valid)
1321 {
1322 ModuleList my_module_list;
1323 my_module_list.Append(module_sp);
1324 LoadScriptingResourceForModule(module_sp, this);
1325 ModulesDidLoad (my_module_list);
1326 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001327}
1328
1329void
Enrico Granataefe637d2012-11-08 19:16:03 +00001330Target::ModuleRemoved (const ModuleList& module_list, const ModuleSP &module_sp)
Enrico Granata17598482012-11-08 02:22:02 +00001331{
Adrian McCarthy6ecdbc82015-10-15 22:39:55 +00001332 // A module is being removed from this target.
Greg Clayton23f8c952014-03-24 23:10:19 +00001333 if (m_valid)
1334 {
1335 ModuleList my_module_list;
1336 my_module_list.Append(module_sp);
1337 ModulesDidUnload (my_module_list, false);
1338 }
Enrico Granata17598482012-11-08 02:22:02 +00001339}
1340
1341void
Enrico Granataefe637d2012-11-08 19:16:03 +00001342Target::ModuleUpdated (const ModuleList& module_list, const ModuleSP &old_module_sp, const ModuleSP &new_module_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001343{
Jim Inghame716ae02011-08-03 01:00:06 +00001344 // A module is replacing an already added module
Greg Clayton23f8c952014-03-24 23:10:19 +00001345 if (m_valid)
1346 m_breakpoint_list.UpdateBreakpointsWhenModuleIsReplaced(old_module_sp, new_module_sp);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001347}
1348
1349void
1350Target::ModulesDidLoad (ModuleList &module_list)
1351{
Greg Clayton23f8c952014-03-24 23:10:19 +00001352 if (m_valid && module_list.GetSize())
Enrico Granata17598482012-11-08 02:22:02 +00001353 {
Greg Clayton095eeaa2013-11-05 23:28:00 +00001354 m_breakpoint_list.UpdateBreakpoints (module_list, true, false);
Jason Molendaeef51062013-11-05 03:57:19 +00001355 if (m_process_sp)
1356 {
Andrew MacPhersoneb4d0602014-03-13 09:37:02 +00001357 m_process_sp->ModulesDidLoad (module_list);
Jason Molendaeef51062013-11-05 03:57:19 +00001358 }
Ilia Keb2c19a2015-03-10 21:59:55 +00001359 BroadcastEvent (eBroadcastBitModulesLoaded, new TargetEventData (this->shared_from_this(), module_list));
Enrico Granata17598482012-11-08 02:22:02 +00001360 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001361}
1362
1363void
Enrico Granataf15ee4e2013-04-05 18:49:06 +00001364Target::SymbolsDidLoad (ModuleList &module_list)
1365{
Greg Clayton23f8c952014-03-24 23:10:19 +00001366 if (m_valid && module_list.GetSize())
Enrico Granataf15ee4e2013-04-05 18:49:06 +00001367 {
Jim Ingham31caf982013-06-04 23:01:35 +00001368 if (m_process_sp)
Enrico Granataf15ee4e2013-04-05 18:49:06 +00001369 {
Jim Ingham31caf982013-06-04 23:01:35 +00001370 LanguageRuntime* runtime = m_process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC);
1371 if (runtime)
1372 {
1373 ObjCLanguageRuntime *objc_runtime = (ObjCLanguageRuntime*)runtime;
1374 objc_runtime->SymbolsDidLoad(module_list);
1375 }
Enrico Granataf15ee4e2013-04-05 18:49:06 +00001376 }
Jim Ingham31caf982013-06-04 23:01:35 +00001377
Greg Clayton095eeaa2013-11-05 23:28:00 +00001378 m_breakpoint_list.UpdateBreakpoints (module_list, true, false);
Ilia Keb2c19a2015-03-10 21:59:55 +00001379 BroadcastEvent (eBroadcastBitSymbolsLoaded, new TargetEventData (this->shared_from_this(), module_list));
Enrico Granataf15ee4e2013-04-05 18:49:06 +00001380 }
Enrico Granataf15ee4e2013-04-05 18:49:06 +00001381}
1382
1383void
Greg Clayton095eeaa2013-11-05 23:28:00 +00001384Target::ModulesDidUnload (ModuleList &module_list, bool delete_locations)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001385{
Greg Clayton23f8c952014-03-24 23:10:19 +00001386 if (m_valid && module_list.GetSize())
Enrico Granata17598482012-11-08 02:22:02 +00001387 {
Greg Clayton8012cad2014-11-17 19:39:20 +00001388 UnloadModuleSections (module_list);
Greg Clayton095eeaa2013-11-05 23:28:00 +00001389 m_breakpoint_list.UpdateBreakpoints (module_list, false, delete_locations);
Ilia Keb2c19a2015-03-10 21:59:55 +00001390 BroadcastEvent (eBroadcastBitModulesUnloaded, new TargetEventData (this->shared_from_this(), module_list));
Enrico Granata17598482012-11-08 02:22:02 +00001391 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001392}
1393
Daniel Dunbarf9f70322011-10-31 22:50:37 +00001394bool
Jim Ingham33df7cd2014-12-06 01:28:03 +00001395Target::ModuleIsExcludedForUnconstrainedSearches (const FileSpec &module_file_spec)
Jim Inghamc6674fd2011-10-28 23:14:11 +00001396{
Greg Clayton67cc0632012-08-22 17:17:09 +00001397 if (GetBreakpointsConsultPlatformAvoidList())
Jim Inghamc6674fd2011-10-28 23:14:11 +00001398 {
1399 ModuleList matchingModules;
Greg Claytonb9a01b32012-02-26 05:51:37 +00001400 ModuleSpec module_spec (module_file_spec);
1401 size_t num_modules = GetImages().FindModules(module_spec, matchingModules);
Jim Inghamc6674fd2011-10-28 23:14:11 +00001402
1403 // If there is more than one module for this file spec, only return true if ALL the modules are on the
1404 // black list.
1405 if (num_modules > 0)
1406 {
Andy Gibbsa297a972013-06-19 19:04:53 +00001407 for (size_t i = 0; i < num_modules; i++)
Jim Inghamc6674fd2011-10-28 23:14:11 +00001408 {
Jim Ingham33df7cd2014-12-06 01:28:03 +00001409 if (!ModuleIsExcludedForUnconstrainedSearches (matchingModules.GetModuleAtIndex(i)))
Jim Inghamc6674fd2011-10-28 23:14:11 +00001410 return false;
1411 }
1412 return true;
1413 }
Jim Inghamc6674fd2011-10-28 23:14:11 +00001414 }
Greg Clayton67cc0632012-08-22 17:17:09 +00001415 return false;
Jim Inghamc6674fd2011-10-28 23:14:11 +00001416}
1417
Daniel Dunbarf9f70322011-10-31 22:50:37 +00001418bool
Jim Ingham33df7cd2014-12-06 01:28:03 +00001419Target::ModuleIsExcludedForUnconstrainedSearches (const lldb::ModuleSP &module_sp)
Jim Inghamc6674fd2011-10-28 23:14:11 +00001420{
Greg Clayton67cc0632012-08-22 17:17:09 +00001421 if (GetBreakpointsConsultPlatformAvoidList())
Jim Inghamc6674fd2011-10-28 23:14:11 +00001422 {
Greg Clayton67cc0632012-08-22 17:17:09 +00001423 if (m_platform_sp)
Jim Ingham33df7cd2014-12-06 01:28:03 +00001424 return m_platform_sp->ModuleIsExcludedForUnconstrainedSearches (*this, module_sp);
Jim Inghamc6674fd2011-10-28 23:14:11 +00001425 }
Greg Clayton67cc0632012-08-22 17:17:09 +00001426 return false;
Jim Inghamc6674fd2011-10-28 23:14:11 +00001427}
1428
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001429size_t
Greg Claytondb598232011-01-07 01:57:07 +00001430Target::ReadMemoryFromFileCache (const Address& addr, void *dst, size_t dst_len, Error &error)
1431{
Greg Claytone72dfb32012-02-24 01:59:29 +00001432 SectionSP section_sp (addr.GetSection());
1433 if (section_sp)
Greg Claytondb598232011-01-07 01:57:07 +00001434 {
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +00001435 // If the contents of this section are encrypted, the on-disk file is unusable. Read only from live memory.
Jason Molenda216d91f2012-04-25 00:06:56 +00001436 if (section_sp->IsEncrypted())
1437 {
Greg Clayton57f06302012-05-25 17:05:55 +00001438 error.SetErrorString("section is encrypted");
Jason Molenda216d91f2012-04-25 00:06:56 +00001439 return 0;
1440 }
Greg Claytone72dfb32012-02-24 01:59:29 +00001441 ModuleSP module_sp (section_sp->GetModule());
1442 if (module_sp)
Greg Claytondb598232011-01-07 01:57:07 +00001443 {
Greg Claytone72dfb32012-02-24 01:59:29 +00001444 ObjectFile *objfile = section_sp->GetModule()->GetObjectFile();
1445 if (objfile)
1446 {
1447 size_t bytes_read = objfile->ReadSectionData (section_sp.get(),
1448 addr.GetOffset(),
1449 dst,
1450 dst_len);
1451 if (bytes_read > 0)
1452 return bytes_read;
1453 else
1454 error.SetErrorStringWithFormat("error reading data from section %s", section_sp->GetName().GetCString());
1455 }
Greg Claytondb598232011-01-07 01:57:07 +00001456 else
Greg Claytone72dfb32012-02-24 01:59:29 +00001457 error.SetErrorString("address isn't from a object file");
Greg Claytondb598232011-01-07 01:57:07 +00001458 }
1459 else
Greg Claytone72dfb32012-02-24 01:59:29 +00001460 error.SetErrorString("address isn't in a module");
Greg Claytondb598232011-01-07 01:57:07 +00001461 }
1462 else
Greg Claytondb598232011-01-07 01:57:07 +00001463 error.SetErrorString("address doesn't contain a section that points to a section in a object file");
Greg Claytone72dfb32012-02-24 01:59:29 +00001464
Greg Claytondb598232011-01-07 01:57:07 +00001465 return 0;
1466}
1467
1468size_t
Enrico Granata9128ee22011-09-06 19:20:51 +00001469Target::ReadMemory (const Address& addr,
1470 bool prefer_file_cache,
1471 void *dst,
1472 size_t dst_len,
1473 Error &error,
1474 lldb::addr_t *load_addr_ptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001475{
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001476 error.Clear();
Greg Claytondb598232011-01-07 01:57:07 +00001477
Enrico Granata9128ee22011-09-06 19:20:51 +00001478 // if we end up reading this from process memory, we will fill this
1479 // with the actual load address
1480 if (load_addr_ptr)
1481 *load_addr_ptr = LLDB_INVALID_ADDRESS;
1482
Greg Claytondb598232011-01-07 01:57:07 +00001483 size_t bytes_read = 0;
Greg Claytonc749eb82011-07-11 05:12:02 +00001484
1485 addr_t load_addr = LLDB_INVALID_ADDRESS;
1486 addr_t file_addr = LLDB_INVALID_ADDRESS;
Greg Clayton357132e2011-03-26 19:14:58 +00001487 Address resolved_addr;
1488 if (!addr.IsSectionOffset())
Greg Claytondda4f7b2010-06-30 23:03:03 +00001489 {
Greg Claytond5944cd2013-12-06 01:12:00 +00001490 SectionLoadList &section_load_list = GetSectionLoadList();
1491 if (section_load_list.IsEmpty())
Greg Claytonc749eb82011-07-11 05:12:02 +00001492 {
Greg Claytond16e1e52011-07-12 17:06:17 +00001493 // No sections are loaded, so we must assume we are not running
1494 // yet and anything we are given is a file address.
1495 file_addr = addr.GetOffset(); // "addr" doesn't have a section, so its offset is the file address
1496 m_images.ResolveFileAddress (file_addr, resolved_addr);
Greg Claytonc749eb82011-07-11 05:12:02 +00001497 }
Greg Claytondda4f7b2010-06-30 23:03:03 +00001498 else
Greg Claytonc749eb82011-07-11 05:12:02 +00001499 {
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +00001500 // We have at least one section loaded. This can be because
Greg Claytond16e1e52011-07-12 17:06:17 +00001501 // we have manually loaded some sections with "target modules load ..."
1502 // or because we have have a live process that has sections loaded
1503 // through the dynamic loader
1504 load_addr = addr.GetOffset(); // "addr" doesn't have a section, so its offset is the load address
Greg Claytond5944cd2013-12-06 01:12:00 +00001505 section_load_list.ResolveLoadAddress (load_addr, resolved_addr);
Greg Claytonc749eb82011-07-11 05:12:02 +00001506 }
Greg Claytondda4f7b2010-06-30 23:03:03 +00001507 }
Greg Clayton357132e2011-03-26 19:14:58 +00001508 if (!resolved_addr.IsValid())
1509 resolved_addr = addr;
Greg Claytonc749eb82011-07-11 05:12:02 +00001510
Greg Claytondb598232011-01-07 01:57:07 +00001511 if (prefer_file_cache)
1512 {
1513 bytes_read = ReadMemoryFromFileCache (resolved_addr, dst, dst_len, error);
1514 if (bytes_read > 0)
1515 return bytes_read;
1516 }
Greg Claytondda4f7b2010-06-30 23:03:03 +00001517
Johnny Chen86364b42011-09-20 23:28:55 +00001518 if (ProcessIsValid())
Greg Claytondda4f7b2010-06-30 23:03:03 +00001519 {
Greg Claytonc749eb82011-07-11 05:12:02 +00001520 if (load_addr == LLDB_INVALID_ADDRESS)
1521 load_addr = resolved_addr.GetLoadAddress (this);
1522
Greg Claytondda4f7b2010-06-30 23:03:03 +00001523 if (load_addr == LLDB_INVALID_ADDRESS)
1524 {
Greg Claytone72dfb32012-02-24 01:59:29 +00001525 ModuleSP addr_module_sp (resolved_addr.GetModule());
1526 if (addr_module_sp && addr_module_sp->GetFileSpec())
Daniel Malead01b2952012-11-29 21:49:15 +00001527 error.SetErrorStringWithFormat("%s[0x%" PRIx64 "] can't be resolved, %s in not currently loaded",
Jim Ingham4af59612014-12-19 19:20:44 +00001528 addr_module_sp->GetFileSpec().GetFilename().AsCString("<Unknown>"),
Jason Molenda7e589a62011-09-20 00:26:08 +00001529 resolved_addr.GetFileAddress(),
Jim Ingham4af59612014-12-19 19:20:44 +00001530 addr_module_sp->GetFileSpec().GetFilename().AsCString("<Unknonw>"));
Greg Claytondda4f7b2010-06-30 23:03:03 +00001531 else
Daniel Malead01b2952012-11-29 21:49:15 +00001532 error.SetErrorStringWithFormat("0x%" PRIx64 " can't be resolved", resolved_addr.GetFileAddress());
Greg Claytondda4f7b2010-06-30 23:03:03 +00001533 }
1534 else
1535 {
Greg Claytondb598232011-01-07 01:57:07 +00001536 bytes_read = m_process_sp->ReadMemory(load_addr, dst, dst_len, error);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001537 if (bytes_read != dst_len)
1538 {
1539 if (error.Success())
1540 {
1541 if (bytes_read == 0)
Daniel Malead01b2952012-11-29 21:49:15 +00001542 error.SetErrorStringWithFormat("read memory from 0x%" PRIx64 " failed", load_addr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001543 else
Daniel Malead01b2952012-11-29 21:49:15 +00001544 error.SetErrorStringWithFormat("only %" PRIu64 " of %" PRIu64 " bytes were read from memory at 0x%" PRIx64, (uint64_t)bytes_read, (uint64_t)dst_len, load_addr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001545 }
1546 }
Greg Claytondda4f7b2010-06-30 23:03:03 +00001547 if (bytes_read)
Enrico Granata9128ee22011-09-06 19:20:51 +00001548 {
1549 if (load_addr_ptr)
1550 *load_addr_ptr = load_addr;
Greg Claytondda4f7b2010-06-30 23:03:03 +00001551 return bytes_read;
Enrico Granata9128ee22011-09-06 19:20:51 +00001552 }
Greg Claytondda4f7b2010-06-30 23:03:03 +00001553 // If the address is not section offset we have an address that
1554 // doesn't resolve to any address in any currently loaded shared
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +00001555 // libraries and we failed to read memory so there isn't anything
Greg Claytondda4f7b2010-06-30 23:03:03 +00001556 // more we can do. If it is section offset, we might be able to
1557 // read cached memory from the object file.
1558 if (!resolved_addr.IsSectionOffset())
1559 return 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001560 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001561 }
Greg Claytondda4f7b2010-06-30 23:03:03 +00001562
Greg Claytonc749eb82011-07-11 05:12:02 +00001563 if (!prefer_file_cache && resolved_addr.IsSectionOffset())
Greg Claytondda4f7b2010-06-30 23:03:03 +00001564 {
Greg Claytondb598232011-01-07 01:57:07 +00001565 // If we didn't already try and read from the object file cache, then
1566 // try it after failing to read from the process.
1567 return ReadMemoryFromFileCache (resolved_addr, dst, dst_len, error);
Greg Claytondda4f7b2010-06-30 23:03:03 +00001568 }
1569 return 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001570}
1571
Greg Claytond16e1e52011-07-12 17:06:17 +00001572size_t
Enrico Granata6b4ddc62013-01-21 19:20:50 +00001573Target::ReadCStringFromMemory (const Address& addr, std::string &out_str, Error &error)
1574{
1575 char buf[256];
1576 out_str.clear();
1577 addr_t curr_addr = addr.GetLoadAddress(this);
1578 Address address(addr);
1579 while (1)
1580 {
1581 size_t length = ReadCStringFromMemory (address, buf, sizeof(buf), error);
1582 if (length == 0)
1583 break;
1584 out_str.append(buf, length);
1585 // If we got "length - 1" bytes, we didn't get the whole C string, we
1586 // need to read some more characters
1587 if (length == sizeof(buf) - 1)
1588 curr_addr += length;
1589 else
1590 break;
1591 address = Address(curr_addr);
1592 }
1593 return out_str.size();
1594}
1595
Enrico Granata6b4ddc62013-01-21 19:20:50 +00001596size_t
1597Target::ReadCStringFromMemory (const Address& addr, char *dst, size_t dst_max_len, Error &result_error)
1598{
1599 size_t total_cstr_len = 0;
1600 if (dst && dst_max_len)
1601 {
1602 result_error.Clear();
1603 // NULL out everything just to be safe
1604 memset (dst, 0, dst_max_len);
1605 Error error;
1606 addr_t curr_addr = addr.GetLoadAddress(this);
1607 Address address(addr);
Jason Molendaf0340c92014-09-03 22:30:54 +00001608
1609 // We could call m_process_sp->GetMemoryCacheLineSize() but I don't
1610 // think this really needs to be tied to the memory cache subsystem's
1611 // cache line size, so leave this as a fixed constant.
Enrico Granata6b4ddc62013-01-21 19:20:50 +00001612 const size_t cache_line_size = 512;
Jason Molendaf0340c92014-09-03 22:30:54 +00001613
Enrico Granata6b4ddc62013-01-21 19:20:50 +00001614 size_t bytes_left = dst_max_len - 1;
1615 char *curr_dst = dst;
1616
1617 while (bytes_left > 0)
1618 {
1619 addr_t cache_line_bytes_left = cache_line_size - (curr_addr % cache_line_size);
1620 addr_t bytes_to_read = std::min<addr_t>(bytes_left, cache_line_bytes_left);
1621 size_t bytes_read = ReadMemory (address, false, curr_dst, bytes_to_read, error);
1622
1623 if (bytes_read == 0)
1624 {
1625 result_error = error;
1626 dst[total_cstr_len] = '\0';
1627 break;
1628 }
1629 const size_t len = strlen(curr_dst);
1630
1631 total_cstr_len += len;
1632
1633 if (len < bytes_to_read)
1634 break;
1635
1636 curr_dst += bytes_read;
1637 curr_addr += bytes_read;
1638 bytes_left -= bytes_read;
1639 address = Address(curr_addr);
1640 }
1641 }
1642 else
1643 {
1644 if (dst == NULL)
1645 result_error.SetErrorString("invalid arguments");
1646 else
1647 result_error.Clear();
1648 }
1649 return total_cstr_len;
1650}
1651
1652size_t
Greg Claytond16e1e52011-07-12 17:06:17 +00001653Target::ReadScalarIntegerFromMemory (const Address& addr,
1654 bool prefer_file_cache,
1655 uint32_t byte_size,
1656 bool is_signed,
1657 Scalar &scalar,
1658 Error &error)
1659{
1660 uint64_t uval;
1661
1662 if (byte_size <= sizeof(uval))
1663 {
1664 size_t bytes_read = ReadMemory (addr, prefer_file_cache, &uval, byte_size, error);
1665 if (bytes_read == byte_size)
1666 {
1667 DataExtractor data (&uval, sizeof(uval), m_arch.GetByteOrder(), m_arch.GetAddressByteSize());
Greg Claytonc7bece562013-01-25 18:06:21 +00001668 lldb::offset_t offset = 0;
Greg Claytond16e1e52011-07-12 17:06:17 +00001669 if (byte_size <= 4)
1670 scalar = data.GetMaxU32 (&offset, byte_size);
1671 else
1672 scalar = data.GetMaxU64 (&offset, byte_size);
1673
1674 if (is_signed)
1675 scalar.SignExtend(byte_size * 8);
1676 return bytes_read;
1677 }
1678 }
1679 else
1680 {
1681 error.SetErrorStringWithFormat ("byte size of %u is too large for integer scalar type", byte_size);
1682 }
1683 return 0;
1684}
1685
1686uint64_t
1687Target::ReadUnsignedIntegerFromMemory (const Address& addr,
1688 bool prefer_file_cache,
1689 size_t integer_byte_size,
1690 uint64_t fail_value,
1691 Error &error)
1692{
1693 Scalar scalar;
1694 if (ReadScalarIntegerFromMemory (addr,
1695 prefer_file_cache,
1696 integer_byte_size,
1697 false,
1698 scalar,
1699 error))
1700 return scalar.ULongLong(fail_value);
1701 return fail_value;
1702}
1703
1704bool
1705Target::ReadPointerFromMemory (const Address& addr,
1706 bool prefer_file_cache,
1707 Error &error,
1708 Address &pointer_addr)
1709{
1710 Scalar scalar;
1711 if (ReadScalarIntegerFromMemory (addr,
1712 prefer_file_cache,
1713 m_arch.GetAddressByteSize(),
1714 false,
1715 scalar,
1716 error))
1717 {
1718 addr_t pointer_vm_addr = scalar.ULongLong(LLDB_INVALID_ADDRESS);
1719 if (pointer_vm_addr != LLDB_INVALID_ADDRESS)
1720 {
Greg Claytond5944cd2013-12-06 01:12:00 +00001721 SectionLoadList &section_load_list = GetSectionLoadList();
1722 if (section_load_list.IsEmpty())
Greg Claytond16e1e52011-07-12 17:06:17 +00001723 {
1724 // No sections are loaded, so we must assume we are not running
1725 // yet and anything we are given is a file address.
1726 m_images.ResolveFileAddress (pointer_vm_addr, pointer_addr);
1727 }
1728 else
1729 {
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +00001730 // We have at least one section loaded. This can be because
Greg Claytond16e1e52011-07-12 17:06:17 +00001731 // we have manually loaded some sections with "target modules load ..."
1732 // or because we have have a live process that has sections loaded
1733 // through the dynamic loader
Greg Claytond5944cd2013-12-06 01:12:00 +00001734 section_load_list.ResolveLoadAddress (pointer_vm_addr, pointer_addr);
Greg Claytond16e1e52011-07-12 17:06:17 +00001735 }
1736 // We weren't able to resolve the pointer value, so just return
1737 // an address with no section
1738 if (!pointer_addr.IsValid())
1739 pointer_addr.SetOffset (pointer_vm_addr);
1740 return true;
1741
1742 }
1743 }
1744 return false;
1745}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001746
1747ModuleSP
Greg Claytonb9a01b32012-02-26 05:51:37 +00001748Target::GetSharedModule (const ModuleSpec &module_spec, Error *error_ptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001749{
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001750 ModuleSP module_sp;
1751
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001752 Error error;
1753
Jim Ingham4a94c912012-05-17 18:38:42 +00001754 // First see if we already have this module in our module list. If we do, then we're done, we don't need
1755 // to consult the shared modules list. But only do this if we are passed a UUID.
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001756
Jim Ingham4a94c912012-05-17 18:38:42 +00001757 if (module_spec.GetUUID().IsValid())
1758 module_sp = m_images.FindFirstModule(module_spec);
1759
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001760 if (!module_sp)
1761 {
Jim Ingham4a94c912012-05-17 18:38:42 +00001762 ModuleSP old_module_sp; // This will get filled in if we have a new version of the library
1763 bool did_create_module = false;
1764
1765 // If there are image search path entries, try to use them first to acquire a suitable image.
1766 if (m_image_search_paths.GetSize())
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001767 {
Jim Ingham4a94c912012-05-17 18:38:42 +00001768 ModuleSpec transformed_spec (module_spec);
1769 if (m_image_search_paths.RemapPath (module_spec.GetFileSpec().GetDirectory(), transformed_spec.GetFileSpec().GetDirectory()))
1770 {
1771 transformed_spec.GetFileSpec().GetFilename() = module_spec.GetFileSpec().GetFilename();
1772 error = ModuleList::GetSharedModule (transformed_spec,
1773 module_sp,
Greg Clayton6920b522012-08-22 18:39:03 +00001774 &GetExecutableSearchPaths(),
Jim Ingham4a94c912012-05-17 18:38:42 +00001775 &old_module_sp,
1776 &did_create_module);
1777 }
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001778 }
Jim Ingham4a94c912012-05-17 18:38:42 +00001779
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001780 if (!module_sp)
1781 {
Jim Ingham4a94c912012-05-17 18:38:42 +00001782 // If we have a UUID, we can check our global shared module list in case
1783 // we already have it. If we don't have a valid UUID, then we can't since
1784 // the path in "module_spec" will be a platform path, and we will need to
1785 // let the platform find that file. For example, we could be asking for
1786 // "/usr/lib/dyld" and if we do not have a UUID, we don't want to pick
1787 // the local copy of "/usr/lib/dyld" since our platform could be a remote
1788 // platform that has its own "/usr/lib/dyld" in an SDK or in a local file
1789 // cache.
1790 if (module_spec.GetUUID().IsValid())
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001791 {
Jim Ingham4a94c912012-05-17 18:38:42 +00001792 // We have a UUID, it is OK to check the global module list...
1793 error = ModuleList::GetSharedModule (module_spec,
1794 module_sp,
Greg Clayton6920b522012-08-22 18:39:03 +00001795 &GetExecutableSearchPaths(),
Greg Clayton67cc0632012-08-22 17:17:09 +00001796 &old_module_sp,
Jim Ingham4a94c912012-05-17 18:38:42 +00001797 &did_create_module);
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001798 }
Jim Ingham4a94c912012-05-17 18:38:42 +00001799
1800 if (!module_sp)
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001801 {
Jim Ingham4a94c912012-05-17 18:38:42 +00001802 // The platform is responsible for finding and caching an appropriate
1803 // module in the shared module cache.
1804 if (m_platform_sp)
1805 {
Tamas Berghammer7cb18bf2015-03-24 11:15:23 +00001806 error = m_platform_sp->GetSharedModule (module_spec,
1807 m_process_sp.get(),
1808 module_sp,
Greg Clayton6920b522012-08-22 18:39:03 +00001809 &GetExecutableSearchPaths(),
Greg Clayton67cc0632012-08-22 17:17:09 +00001810 &old_module_sp,
Jim Ingham4a94c912012-05-17 18:38:42 +00001811 &did_create_module);
1812 }
1813 else
1814 {
1815 error.SetErrorString("no platform is currently set");
1816 }
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001817 }
1818 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001819
Jim Ingham4a94c912012-05-17 18:38:42 +00001820 // We found a module that wasn't in our target list. Let's make sure that there wasn't an equivalent
1821 // module in the list already, and if there was, let's remove it.
1822 if (module_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001823 {
Greg Clayton50a24bd2012-11-29 22:16:27 +00001824 ObjectFile *objfile = module_sp->GetObjectFile();
1825 if (objfile)
Jim Ingham4a94c912012-05-17 18:38:42 +00001826 {
Greg Clayton50a24bd2012-11-29 22:16:27 +00001827 switch (objfile->GetType())
Jim Ingham4a94c912012-05-17 18:38:42 +00001828 {
Greg Clayton50a24bd2012-11-29 22:16:27 +00001829 case ObjectFile::eTypeCoreFile: /// A core file that has a checkpoint of a program's execution state
1830 case ObjectFile::eTypeExecutable: /// A normal executable
1831 case ObjectFile::eTypeDynamicLinker: /// The platform's dynamic linker executable
1832 case ObjectFile::eTypeObjectFile: /// An intermediate object file
1833 case ObjectFile::eTypeSharedLibrary: /// A shared library that can be used during execution
1834 break;
1835 case ObjectFile::eTypeDebugInfo: /// An object file that contains only debug information
1836 if (error_ptr)
1837 error_ptr->SetErrorString("debug info files aren't valid target modules, please specify an executable");
1838 return ModuleSP();
1839 case ObjectFile::eTypeStubLibrary: /// A library that can be linked against but not used for execution
1840 if (error_ptr)
1841 error_ptr->SetErrorString("stub libraries aren't valid target modules, please specify an executable");
1842 return ModuleSP();
1843 default:
1844 if (error_ptr)
1845 error_ptr->SetErrorString("unsupported file type, please specify an executable");
1846 return ModuleSP();
1847 }
1848 // GetSharedModule is not guaranteed to find the old shared module, for instance
1849 // in the common case where you pass in the UUID, it is only going to find the one
1850 // module matching the UUID. In fact, it has no good way to know what the "old module"
1851 // relevant to this target is, since there might be many copies of a module with this file spec
1852 // in various running debug sessions, but only one of them will belong to this target.
1853 // So let's remove the UUID from the module list, and look in the target's module list.
1854 // Only do this if there is SOMETHING else in the module spec...
1855 if (!old_module_sp)
1856 {
1857 if (module_spec.GetUUID().IsValid() && !module_spec.GetFileSpec().GetFilename().IsEmpty() && !module_spec.GetFileSpec().GetDirectory().IsEmpty())
Jim Ingham4a94c912012-05-17 18:38:42 +00001858 {
Greg Clayton50a24bd2012-11-29 22:16:27 +00001859 ModuleSpec module_spec_copy(module_spec.GetFileSpec());
1860 module_spec_copy.GetUUID().Clear();
1861
1862 ModuleList found_modules;
1863 size_t num_found = m_images.FindModules (module_spec_copy, found_modules);
1864 if (num_found == 1)
1865 {
1866 old_module_sp = found_modules.GetModuleAtIndex(0);
1867 }
Jim Ingham4a94c912012-05-17 18:38:42 +00001868 }
1869 }
Greg Clayton50a24bd2012-11-29 22:16:27 +00001870
1871 if (old_module_sp && m_images.GetIndexForModule (old_module_sp.get()) != LLDB_INVALID_INDEX32)
1872 {
1873 m_images.ReplaceModule(old_module_sp, module_sp);
1874 Module *old_module_ptr = old_module_sp.get();
1875 old_module_sp.reset();
1876 ModuleList::RemoveSharedModuleIfOrphaned (old_module_ptr);
1877 }
1878 else
1879 m_images.Append(module_sp);
Jim Ingham4a94c912012-05-17 18:38:42 +00001880 }
Greg Clayton86e70cb2014-04-07 23:50:17 +00001881 else
1882 module_sp.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001883 }
1884 }
1885 if (error_ptr)
1886 *error_ptr = error;
1887 return module_sp;
1888}
1889
Greg Claytond9e416c2012-02-18 05:35:26 +00001890TargetSP
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001891Target::CalculateTarget ()
1892{
Greg Claytond9e416c2012-02-18 05:35:26 +00001893 return shared_from_this();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001894}
1895
Greg Claytond9e416c2012-02-18 05:35:26 +00001896ProcessSP
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001897Target::CalculateProcess ()
1898{
Greg Claytond9e416c2012-02-18 05:35:26 +00001899 return ProcessSP();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001900}
1901
Greg Claytond9e416c2012-02-18 05:35:26 +00001902ThreadSP
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001903Target::CalculateThread ()
1904{
Greg Claytond9e416c2012-02-18 05:35:26 +00001905 return ThreadSP();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001906}
1907
Jason Molendab57e4a12013-11-04 09:33:30 +00001908StackFrameSP
1909Target::CalculateStackFrame ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001910{
Jason Molendab57e4a12013-11-04 09:33:30 +00001911 return StackFrameSP();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001912}
1913
1914void
Greg Clayton0603aa92010-10-04 01:05:56 +00001915Target::CalculateExecutionContext (ExecutionContext &exe_ctx)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001916{
Greg Claytonc14ee322011-09-22 04:58:26 +00001917 exe_ctx.Clear();
1918 exe_ctx.SetTargetPtr(this);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001919}
1920
1921PathMappingList &
1922Target::GetImageSearchPathList ()
1923{
1924 return m_image_search_paths;
1925}
1926
1927void
Eugene Zelenko8f30a652015-10-23 18:39:37 +00001928Target::ImageSearchPathsChanged(const PathMappingList &path_list,
1929 void *baton)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001930{
1931 Target *target = (Target *)baton;
Greg Claytonaa149cb2011-08-11 02:48:45 +00001932 ModuleSP exe_module_sp (target->GetExecutableModule());
1933 if (exe_module_sp)
Greg Claytonaa149cb2011-08-11 02:48:45 +00001934 target->SetExecutableModule (exe_module_sp, true);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001935}
1936
Jim Ingham151c0322015-09-15 21:13:50 +00001937TypeSystem *
Sean Callanana994b0b2015-10-02 18:40:30 +00001938Target::GetScratchTypeSystemForLanguage (Error *error, lldb::LanguageType language, bool create_on_demand)
Jim Ingham151c0322015-09-15 21:13:50 +00001939{
Greg Clayton5beec212015-10-08 21:04:34 +00001940 if (!m_valid)
1941 return nullptr;
1942
Sean Callanana994b0b2015-10-02 18:40:30 +00001943 if (error)
1944 {
1945 error->Clear();
1946 }
1947
Sean Callananb92bd752015-10-01 16:28:02 +00001948 if (language == eLanguageTypeMipsAssembler // GNU AS and LLVM use it for all assembly code
Sean Callanana994b0b2015-10-02 18:40:30 +00001949 || language == eLanguageTypeUnknown)
1950 {
Sean Callananc7b054a2015-10-09 18:01:10 +00001951 std::set<lldb::LanguageType> languages_for_types;
1952 std::set<lldb::LanguageType> languages_for_expressions;
1953
1954 Language::GetLanguagesSupportingTypeSystems(languages_for_types, languages_for_expressions);
1955
1956 if (languages_for_expressions.count(eLanguageTypeC))
1957 {
1958 language = eLanguageTypeC; // LLDB's default. Override by setting the target language.
1959 }
1960 else
1961 {
1962 if (languages_for_expressions.empty())
1963 {
1964 return nullptr;
1965 }
1966 else
1967 {
1968 language = *languages_for_expressions.begin();
1969 }
1970 }
Sean Callananb92bd752015-10-01 16:28:02 +00001971 }
Sean Callananb92bd752015-10-01 16:28:02 +00001972
Greg Clayton5beec212015-10-08 21:04:34 +00001973 return m_scratch_type_system_map.GetTypeSystemForLanguage(language, this, create_on_demand);
Sean Callananb92bd752015-10-01 16:28:02 +00001974}
1975
1976PersistentExpressionState *
1977Target::GetPersistentExpressionStateForLanguage (lldb::LanguageType language)
1978{
Sean Callanana994b0b2015-10-02 18:40:30 +00001979 TypeSystem *type_system = GetScratchTypeSystemForLanguage(nullptr, language, true);
Sean Callananb92bd752015-10-01 16:28:02 +00001980
1981 if (type_system)
1982 {
1983 return type_system->GetPersistentExpressionState();
1984 }
Jim Ingham151c0322015-09-15 21:13:50 +00001985 else
Sean Callananb92bd752015-10-01 16:28:02 +00001986 {
1987 return nullptr;
1988 }
Jim Ingham151c0322015-09-15 21:13:50 +00001989}
1990
1991UserExpression *
1992Target::GetUserExpressionForLanguage(const char *expr,
Sean Callanana994b0b2015-10-02 18:40:30 +00001993 const char *expr_prefix,
1994 lldb::LanguageType language,
1995 Expression::ResultType desired_type,
1996 Error &error)
Jim Ingham151c0322015-09-15 21:13:50 +00001997{
Sean Callanana994b0b2015-10-02 18:40:30 +00001998 Error type_system_error;
1999
2000 TypeSystem *type_system = GetScratchTypeSystemForLanguage (&type_system_error, language);
Jim Ingham151c0322015-09-15 21:13:50 +00002001 UserExpression *user_expr = nullptr;
2002
2003 if (!type_system)
2004 {
Sean Callanana994b0b2015-10-02 18:40:30 +00002005 error.SetErrorStringWithFormat("Could not find type system for language %s: %s", Language::GetNameForLanguageType(language), type_system_error.AsCString());
Jim Ingham151c0322015-09-15 21:13:50 +00002006 return nullptr;
2007 }
2008
2009 user_expr = type_system->GetUserExpression(expr, expr_prefix, language, desired_type);
2010 if (!user_expr)
2011 error.SetErrorStringWithFormat("Could not create an expression for language %s", Language::GetNameForLanguageType(language));
2012
2013 return user_expr;
2014}
2015
2016FunctionCaller *
2017Target::GetFunctionCallerForLanguage (lldb::LanguageType language,
2018 const CompilerType &return_type,
2019 const Address& function_address,
2020 const ValueList &arg_value_list,
2021 const char *name,
2022 Error &error)
2023{
Sean Callanana994b0b2015-10-02 18:40:30 +00002024 Error type_system_error;
2025 TypeSystem *type_system = GetScratchTypeSystemForLanguage (&type_system_error, language);
Jim Ingham151c0322015-09-15 21:13:50 +00002026 FunctionCaller *persistent_fn = nullptr;
2027
2028 if (!type_system)
2029 {
Sean Callanana994b0b2015-10-02 18:40:30 +00002030 error.SetErrorStringWithFormat("Could not find type system for language %s: %s", Language::GetNameForLanguageType(language), type_system_error.AsCString());
Jim Ingham151c0322015-09-15 21:13:50 +00002031 return persistent_fn;
2032 }
2033
2034 persistent_fn = type_system->GetFunctionCaller (return_type, function_address, arg_value_list, name);
2035 if (!persistent_fn)
2036 error.SetErrorStringWithFormat("Could not create an expression for language %s", Language::GetNameForLanguageType(language));
2037
2038 return persistent_fn;
2039}
2040
2041UtilityFunction *
2042Target::GetUtilityFunctionForLanguage (const char *text,
2043 lldb::LanguageType language,
2044 const char *name,
2045 Error &error)
2046{
Sean Callanana994b0b2015-10-02 18:40:30 +00002047 Error type_system_error;
2048 TypeSystem *type_system = GetScratchTypeSystemForLanguage (&type_system_error, language);
Jim Ingham151c0322015-09-15 21:13:50 +00002049 UtilityFunction *utility_fn = nullptr;
2050
2051 if (!type_system)
2052 {
Sean Callanana994b0b2015-10-02 18:40:30 +00002053 error.SetErrorStringWithFormat("Could not find type system for language %s: %s", Language::GetNameForLanguageType(language), type_system_error.AsCString());
Jim Ingham151c0322015-09-15 21:13:50 +00002054 return utility_fn;
2055 }
2056
2057 utility_fn = type_system->GetUtilityFunction (text, name);
2058 if (!utility_fn)
2059 error.SetErrorStringWithFormat("Could not create an expression for language %s", Language::GetNameForLanguageType(language));
2060
2061 return utility_fn;
2062}
2063
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002064ClangASTContext *
Johnny Chen60e2c6a2011-11-30 23:18:53 +00002065Target::GetScratchClangASTContext(bool create_on_demand)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002066{
Greg Clayton5beec212015-10-08 21:04:34 +00002067 if (m_valid)
Sean Callanan4bf80d52011-11-15 22:27:19 +00002068 {
Greg Clayton5beec212015-10-08 21:04:34 +00002069 if (TypeSystem* type_system = GetScratchTypeSystemForLanguage(nullptr, eLanguageTypeC, create_on_demand))
2070 return llvm::dyn_cast<ClangASTContext>(type_system);
Sean Callanan4bf80d52011-11-15 22:27:19 +00002071 }
Greg Clayton5beec212015-10-08 21:04:34 +00002072 return nullptr;
Sean Callananb92bd752015-10-01 16:28:02 +00002073}
2074
Sean Callanan686b2312011-11-16 18:20:47 +00002075ClangASTImporter *
2076Target::GetClangASTImporter()
2077{
Greg Clayton5beec212015-10-08 21:04:34 +00002078 if (m_valid)
Sean Callanan686b2312011-11-16 18:20:47 +00002079 {
Greg Clayton5beec212015-10-08 21:04:34 +00002080 ClangASTImporter *ast_importer = m_ast_importer_ap.get();
2081
2082 if (!ast_importer)
2083 {
2084 ast_importer = new ClangASTImporter();
2085 m_ast_importer_ap.reset(ast_importer);
2086 }
2087 return ast_importer;
Sean Callanan686b2312011-11-16 18:20:47 +00002088 }
Greg Clayton5beec212015-10-08 21:04:34 +00002089 return nullptr;
Sean Callanan686b2312011-11-16 18:20:47 +00002090}
2091
Greg Clayton99d0faf2010-11-18 23:32:35 +00002092void
Caroline Tice20bd37f2011-03-10 22:14:10 +00002093Target::SettingsInitialize ()
Caroline Ticedaccaa92010-09-20 20:44:43 +00002094{
Greg Clayton6920b522012-08-22 18:39:03 +00002095 Process::SettingsInitialize ();
Greg Clayton99d0faf2010-11-18 23:32:35 +00002096}
Caroline Ticedaccaa92010-09-20 20:44:43 +00002097
Greg Clayton99d0faf2010-11-18 23:32:35 +00002098void
Caroline Tice20bd37f2011-03-10 22:14:10 +00002099Target::SettingsTerminate ()
Greg Clayton99d0faf2010-11-18 23:32:35 +00002100{
Greg Clayton6920b522012-08-22 18:39:03 +00002101 Process::SettingsTerminate ();
Greg Clayton99d0faf2010-11-18 23:32:35 +00002102}
Caroline Ticedaccaa92010-09-20 20:44:43 +00002103
Greg Claytonc859e2d2012-02-13 23:10:39 +00002104FileSpecList
2105Target::GetDefaultExecutableSearchPaths ()
2106{
Greg Clayton67cc0632012-08-22 17:17:09 +00002107 TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
2108 if (properties_sp)
2109 return properties_sp->GetExecutableSearchPaths();
Greg Claytonc859e2d2012-02-13 23:10:39 +00002110 return FileSpecList();
2111}
2112
Michael Sartaina7499c92013-07-01 19:45:50 +00002113FileSpecList
2114Target::GetDefaultDebugFileSearchPaths ()
2115{
2116 TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
2117 if (properties_sp)
2118 return properties_sp->GetDebugFileSearchPaths();
2119 return FileSpecList();
2120}
2121
Sean Callanan85054342015-04-03 15:39:47 +00002122FileSpecList
2123Target::GetDefaultClangModuleSearchPaths ()
2124{
2125 TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
2126 if (properties_sp)
2127 return properties_sp->GetClangModuleSearchPaths();
2128 return FileSpecList();
2129}
2130
Caroline Ticedaccaa92010-09-20 20:44:43 +00002131ArchSpec
2132Target::GetDefaultArchitecture ()
2133{
Greg Clayton67cc0632012-08-22 17:17:09 +00002134 TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
2135 if (properties_sp)
2136 return properties_sp->GetDefaultArchitecture();
Greg Clayton8910c902012-05-15 02:44:13 +00002137 return ArchSpec();
Caroline Ticedaccaa92010-09-20 20:44:43 +00002138}
2139
2140void
Greg Clayton67cc0632012-08-22 17:17:09 +00002141Target::SetDefaultArchitecture (const ArchSpec &arch)
Caroline Ticedaccaa92010-09-20 20:44:43 +00002142{
Greg Clayton67cc0632012-08-22 17:17:09 +00002143 TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
2144 if (properties_sp)
Jason Molendaa3f24b32012-12-12 02:23:56 +00002145 {
2146 LogIfAnyCategoriesSet(LIBLLDB_LOG_TARGET, "Target::SetDefaultArchitecture setting target's default architecture to %s (%s)", arch.GetArchitectureName(), arch.GetTriple().getTriple().c_str());
Greg Clayton67cc0632012-08-22 17:17:09 +00002147 return properties_sp->SetDefaultArchitecture(arch);
Jason Molendaa3f24b32012-12-12 02:23:56 +00002148 }
Caroline Ticedaccaa92010-09-20 20:44:43 +00002149}
2150
Greg Clayton0603aa92010-10-04 01:05:56 +00002151Target *
2152Target::GetTargetFromContexts (const ExecutionContext *exe_ctx_ptr, const SymbolContext *sc_ptr)
2153{
2154 // The target can either exist in the "process" of ExecutionContext, or in
2155 // the "target_sp" member of SymbolContext. This accessor helper function
2156 // will get the target from one of these locations.
2157
2158 Target *target = NULL;
2159 if (sc_ptr != NULL)
2160 target = sc_ptr->target_sp.get();
Greg Claytonc14ee322011-09-22 04:58:26 +00002161 if (target == NULL && exe_ctx_ptr)
2162 target = exe_ctx_ptr->GetTargetPtr();
Greg Clayton0603aa92010-10-04 01:05:56 +00002163 return target;
2164}
2165
Jim Ingham1624a2d2014-05-05 02:26:40 +00002166ExpressionResults
Eugene Zelenko8f30a652015-10-23 18:39:37 +00002167Target::EvaluateExpression(const char *expr_cstr,
2168 StackFrame *frame,
2169 lldb::ValueObjectSP &result_valobj_sp,
2170 const EvaluateExpressionOptions& options)
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00002171{
Enrico Granata97fca502012-09-18 17:43:16 +00002172 result_valobj_sp.reset();
2173
Jim Ingham8646d3c2014-05-05 02:47:44 +00002174 ExpressionResults execution_results = eExpressionSetupError;
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00002175
Greg Claytond1767f02011-12-08 02:13:16 +00002176 if (expr_cstr == NULL || expr_cstr[0] == '\0')
2177 return execution_results;
2178
Jim Ingham6026ca32011-05-12 02:06:14 +00002179 // We shouldn't run stop hooks in expressions.
2180 // Be sure to reset this if you return anywhere within this function.
2181 bool old_suppress_value = m_suppress_stop_hooks;
2182 m_suppress_stop_hooks = true;
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00002183
2184 ExecutionContext exe_ctx;
Sean Callanan0bf0baf2013-01-12 02:04:23 +00002185
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00002186 if (frame)
2187 {
2188 frame->CalculateExecutionContext(exe_ctx);
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00002189 }
2190 else if (m_process_sp)
2191 {
2192 m_process_sp->CalculateExecutionContext(exe_ctx);
2193 }
2194 else
2195 {
2196 CalculateExecutionContext(exe_ctx);
2197 }
2198
Sean Callanan0bf0baf2013-01-12 02:04:23 +00002199 // Make sure we aren't just trying to see the value of a persistent
2200 // variable (something like "$0")
Sean Callananbc8ac342015-09-04 20:49:51 +00002201 lldb::ExpressionVariableSP persistent_var_sp;
Sean Callanan0bf0baf2013-01-12 02:04:23 +00002202 // Only check for persistent variables the expression starts with a '$'
2203 if (expr_cstr[0] == '$')
Sean Callanana994b0b2015-10-02 18:40:30 +00002204 persistent_var_sp = GetScratchTypeSystemForLanguage(nullptr, eLanguageTypeC)->GetPersistentExpressionState()->GetVariable (expr_cstr);
Sean Callanan0bf0baf2013-01-12 02:04:23 +00002205
2206 if (persistent_var_sp)
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00002207 {
Sean Callanan0bf0baf2013-01-12 02:04:23 +00002208 result_valobj_sp = persistent_var_sp->GetValueObject ();
Jim Ingham8646d3c2014-05-05 02:47:44 +00002209 execution_results = eExpressionCompleted;
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00002210 }
2211 else
2212 {
Sean Callanan0bf0baf2013-01-12 02:04:23 +00002213 const char *prefix = GetExpressionPrefixContentsAsCString();
Greg Clayton62afb9f2013-11-04 19:35:17 +00002214 Error error;
Jim Ingham151c0322015-09-15 21:13:50 +00002215 execution_results = UserExpression::Evaluate (exe_ctx,
2216 options,
2217 expr_cstr,
2218 prefix,
2219 result_valobj_sp,
2220 error);
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00002221 }
Jim Ingham6026ca32011-05-12 02:06:14 +00002222
2223 m_suppress_stop_hooks = old_suppress_value;
2224
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00002225 return execution_results;
2226}
2227
Sean Callanan8f1f9a12015-09-30 19:57:57 +00002228lldb::ExpressionVariableSP
2229Target::GetPersistentVariable(const ConstString &name)
Zachary Turner32abc6e2015-03-03 19:23:09 +00002230{
Greg Clayton5beec212015-10-08 21:04:34 +00002231 lldb::ExpressionVariableSP variable_sp;
2232 m_scratch_type_system_map.ForEach([this, name, &variable_sp](TypeSystem *type_system) -> bool
Sean Callanan8f1f9a12015-09-30 19:57:57 +00002233 {
Greg Clayton5beec212015-10-08 21:04:34 +00002234 if (PersistentExpressionState *persistent_state = type_system->GetPersistentExpressionState())
Sean Callanan8f1f9a12015-09-30 19:57:57 +00002235 {
Greg Clayton5beec212015-10-08 21:04:34 +00002236 variable_sp = persistent_state->GetVariable(name);
2237
2238 if (variable_sp)
2239 return false; // Stop iterating the ForEach
Sean Callanan8f1f9a12015-09-30 19:57:57 +00002240 }
Greg Clayton5beec212015-10-08 21:04:34 +00002241 return true; // Keep iterating the ForEach
2242 });
2243 return variable_sp;
Zachary Turner32abc6e2015-03-03 19:23:09 +00002244}
2245
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002246lldb::addr_t
Sean Callananb92bd752015-10-01 16:28:02 +00002247Target::GetPersistentSymbol(const ConstString &name)
2248{
Greg Clayton5beec212015-10-08 21:04:34 +00002249 lldb::addr_t address = LLDB_INVALID_ADDRESS;
Sean Callananb92bd752015-10-01 16:28:02 +00002250
Greg Clayton5beec212015-10-08 21:04:34 +00002251 m_scratch_type_system_map.ForEach([this, name, &address](TypeSystem *type_system) -> bool
Sean Callananb92bd752015-10-01 16:28:02 +00002252 {
Greg Clayton5beec212015-10-08 21:04:34 +00002253 if (PersistentExpressionState *persistent_state = type_system->GetPersistentExpressionState())
Sean Callananb92bd752015-10-01 16:28:02 +00002254 {
Greg Clayton5beec212015-10-08 21:04:34 +00002255 address = persistent_state->LookupSymbol(name);
2256 if (address != LLDB_INVALID_ADDRESS)
2257 return false; // Stop iterating the ForEach
Sean Callananb92bd752015-10-01 16:28:02 +00002258 }
Greg Clayton5beec212015-10-08 21:04:34 +00002259 return true; // Keep iterating the ForEach
2260 });
2261 return address;
Sean Callananb92bd752015-10-01 16:28:02 +00002262}
2263
2264lldb::addr_t
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002265Target::GetCallableLoadAddress (lldb::addr_t load_addr, AddressClass addr_class) const
2266{
2267 addr_t code_addr = load_addr;
2268 switch (m_arch.GetMachine())
2269 {
Jaydeep Patil44d07fc2015-09-22 06:36:56 +00002270 case llvm::Triple::mips:
2271 case llvm::Triple::mipsel:
2272 case llvm::Triple::mips64:
2273 case llvm::Triple::mips64el:
2274 switch (addr_class)
2275 {
2276 case eAddressClassData:
2277 case eAddressClassDebug:
2278 return LLDB_INVALID_ADDRESS;
2279
2280 case eAddressClassUnknown:
2281 case eAddressClassInvalid:
2282 case eAddressClassCode:
2283 case eAddressClassCodeAlternateISA:
2284 case eAddressClassRuntime:
2285 if ((code_addr & 2ull) || (addr_class == eAddressClassCodeAlternateISA))
2286 code_addr |= 1ull;
2287 break;
2288 }
2289 break;
2290
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002291 case llvm::Triple::arm:
2292 case llvm::Triple::thumb:
2293 switch (addr_class)
2294 {
2295 case eAddressClassData:
2296 case eAddressClassDebug:
2297 return LLDB_INVALID_ADDRESS;
2298
2299 case eAddressClassUnknown:
2300 case eAddressClassInvalid:
2301 case eAddressClassCode:
2302 case eAddressClassCodeAlternateISA:
2303 case eAddressClassRuntime:
2304 // Check if bit zero it no set?
2305 if ((code_addr & 1ull) == 0)
2306 {
2307 // Bit zero isn't set, check if the address is a multiple of 2?
2308 if (code_addr & 2ull)
2309 {
2310 // The address is a multiple of 2 so it must be thumb, set bit zero
2311 code_addr |= 1ull;
2312 }
2313 else if (addr_class == eAddressClassCodeAlternateISA)
2314 {
2315 // We checked the address and the address claims to be the alternate ISA
2316 // which means thumb, so set bit zero.
2317 code_addr |= 1ull;
2318 }
2319 }
2320 break;
2321 }
2322 break;
2323
2324 default:
2325 break;
2326 }
2327 return code_addr;
2328}
2329
2330lldb::addr_t
2331Target::GetOpcodeLoadAddress (lldb::addr_t load_addr, AddressClass addr_class) const
2332{
2333 addr_t opcode_addr = load_addr;
2334 switch (m_arch.GetMachine())
2335 {
Jaydeep Patil44d07fc2015-09-22 06:36:56 +00002336 case llvm::Triple::mips:
2337 case llvm::Triple::mipsel:
2338 case llvm::Triple::mips64:
2339 case llvm::Triple::mips64el:
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002340 case llvm::Triple::arm:
2341 case llvm::Triple::thumb:
2342 switch (addr_class)
2343 {
2344 case eAddressClassData:
2345 case eAddressClassDebug:
2346 return LLDB_INVALID_ADDRESS;
2347
2348 case eAddressClassInvalid:
2349 case eAddressClassUnknown:
2350 case eAddressClassCode:
2351 case eAddressClassCodeAlternateISA:
2352 case eAddressClassRuntime:
2353 opcode_addr &= ~(1ull);
2354 break;
2355 }
2356 break;
2357
2358 default:
2359 break;
2360 }
2361 return opcode_addr;
2362}
2363
Bhushan D. Attarde7f3daed2015-08-26 06:04:54 +00002364lldb::addr_t
2365Target::GetBreakableLoadAddress (lldb::addr_t addr)
2366{
2367 addr_t breakable_addr = addr;
2368 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
2369
2370 switch (m_arch.GetMachine())
2371 {
2372 default:
2373 break;
2374 case llvm::Triple::mips:
2375 case llvm::Triple::mipsel:
2376 case llvm::Triple::mips64:
2377 case llvm::Triple::mips64el:
2378 {
2379 addr_t function_start = 0;
2380 addr_t current_offset = 0;
2381 uint32_t loop_count = 0;
2382 Address resolved_addr;
2383 uint32_t arch_flags = m_arch.GetFlags ();
2384 bool IsMips16 = arch_flags & ArchSpec::eMIPSAse_mips16;
2385 bool IsMicromips = arch_flags & ArchSpec::eMIPSAse_micromips;
2386 SectionLoadList &section_load_list = GetSectionLoadList();
2387
2388 if (section_load_list.IsEmpty())
2389 // No sections are loaded, so we must assume we are not running yet
2390 // and need to operate only on file address.
2391 m_images.ResolveFileAddress (addr, resolved_addr);
2392 else
2393 section_load_list.ResolveLoadAddress(addr, resolved_addr);
2394
2395 // Get the function boundaries to make sure we don't scan back before the beginning of the current function.
2396 ModuleSP temp_addr_module_sp (resolved_addr.GetModule());
2397 if (temp_addr_module_sp)
2398 {
2399 SymbolContext sc;
2400 uint32_t resolve_scope = eSymbolContextFunction | eSymbolContextSymbol;
Greg Clayton6071e6f2015-08-26 22:57:51 +00002401 temp_addr_module_sp->ResolveSymbolContextForAddress(resolved_addr, resolve_scope, sc);
Bhushan D. Attarde7f3daed2015-08-26 06:04:54 +00002402 if (sc.function)
2403 {
2404 function_start = sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress(this);
2405 if (function_start == LLDB_INVALID_ADDRESS)
2406 function_start = sc.function->GetAddressRange().GetBaseAddress().GetFileAddress();
2407 }
2408 else if (sc.symbol)
2409 {
2410 Address sym_addr = sc.symbol->GetAddress();
2411 function_start = sym_addr.GetFileAddress();
2412 }
2413 current_offset = addr - function_start;
2414 }
2415
2416 // If breakpoint address is start of function then we dont have to do anything.
2417 if (current_offset == 0)
2418 return breakable_addr;
2419 else
2420 loop_count = current_offset / 2;
2421
2422 if (loop_count > 3)
2423 {
2424 // Scan previous 6 bytes
2425 if (IsMips16 | IsMicromips)
2426 loop_count = 3;
2427 // For mips-only, instructions are always 4 bytes, so scan previous 4 bytes only.
2428 else
2429 loop_count = 2;
2430 }
2431
2432 // Create Disassembler Instance
2433 lldb::DisassemblerSP disasm_sp (Disassembler::FindPlugin(m_arch, NULL, NULL));
2434
2435 ExecutionContext exe_ctx;
2436 CalculateExecutionContext(exe_ctx);
2437 InstructionList instruction_list;
2438 InstructionSP prev_insn;
2439 bool prefer_file_cache = true; // Read from file
2440 uint32_t inst_to_choose = 0;
2441
2442 for (uint32_t i = 1; i <= loop_count; i++)
2443 {
2444 // Adjust the address to read from.
2445 resolved_addr.Slide (-2);
2446 AddressRange range(resolved_addr, i*2);
2447 uint32_t insn_size = 0;
2448
Greg Clayton6071e6f2015-08-26 22:57:51 +00002449 disasm_sp->ParseInstructions (&exe_ctx, range, NULL, prefer_file_cache);
Bhushan D. Attarde7f3daed2015-08-26 06:04:54 +00002450
2451 uint32_t num_insns = disasm_sp->GetInstructionList().GetSize();
2452 if (num_insns)
2453 {
2454 prev_insn = disasm_sp->GetInstructionList().GetInstructionAtIndex(0);
2455 insn_size = prev_insn->GetOpcode().GetByteSize();
2456 if (i == 1 && insn_size == 2)
2457 {
2458 // This looks like a valid 2-byte instruction (but it could be a part of upper 4 byte instruction).
2459 instruction_list.Append(prev_insn);
2460 inst_to_choose = 1;
2461 }
2462 else if (i == 2)
2463 {
2464 // Here we may get one 4-byte instruction or two 2-byte instructions.
2465 if (num_insns == 2)
2466 {
2467 // Looks like there are two 2-byte instructions above our breakpoint target address.
2468 // Now the upper 2-byte instruction is either a valid 2-byte instruction or could be a part of it's upper 4-byte instruction.
2469 // In both cases we don't care because in this case lower 2-byte instruction is definitely a valid instruction
2470 // and whatever i=1 iteration has found out is true.
2471 inst_to_choose = 1;
2472 break;
2473 }
2474 else if (insn_size == 4)
2475 {
2476 // This instruction claims its a valid 4-byte instruction. But it could be a part of it's upper 4-byte instruction.
2477 // Lets try scanning upper 2 bytes to verify this.
2478 instruction_list.Append(prev_insn);
2479 inst_to_choose = 2;
2480 }
2481 }
2482 else if (i == 3)
2483 {
2484 if (insn_size == 4)
2485 // FIXME: We reached here that means instruction at [target - 4] has already claimed to be a 4-byte instruction,
2486 // and now instruction at [target - 6] is also claiming that it's a 4-byte instruction. This can not be true.
2487 // In this case we can not decide the valid previous instruction so we let lldb set the breakpoint at the address given by user.
2488 inst_to_choose = 0;
2489 else
2490 // This is straight-forward
2491 inst_to_choose = 2;
2492 break;
2493 }
2494 }
2495 else
2496 {
2497 // Decode failed, bytes do not form a valid instruction. So whatever previous iteration has found out is true.
2498 if (i > 1)
2499 {
2500 inst_to_choose = i - 1;
2501 break;
2502 }
2503 }
2504 }
2505
2506 // Check if we are able to find any valid instruction.
2507 if (inst_to_choose)
2508 {
2509 if (inst_to_choose > instruction_list.GetSize())
2510 inst_to_choose--;
2511 prev_insn = instruction_list.GetInstructionAtIndex(inst_to_choose - 1);
2512
2513 if (prev_insn->HasDelaySlot())
2514 {
2515 uint32_t shift_size = prev_insn->GetOpcode().GetByteSize();
2516 // Adjust the breakable address
2517 breakable_addr = addr - shift_size;
2518 if (log)
2519 log->Printf ("Target::%s Breakpoint at 0x%8.8" PRIx64 " is adjusted to 0x%8.8" PRIx64 " due to delay slot\n", __FUNCTION__, addr, breakable_addr);
2520 }
2521 }
2522 break;
2523 }
2524 }
2525 return breakable_addr;
2526}
2527
Greg Clayton9585fbf2013-03-19 00:20:55 +00002528SourceManager &
2529Target::GetSourceManager ()
2530{
2531 if (m_source_manager_ap.get() == NULL)
2532 m_source_manager_ap.reset (new SourceManager(shared_from_this()));
2533 return *m_source_manager_ap;
2534}
2535
Sean Callanan9998acd2014-12-05 01:21:59 +00002536ClangModulesDeclVendor *
2537Target::GetClangModulesDeclVendor ()
2538{
2539 static Mutex s_clang_modules_decl_vendor_mutex; // If this is contended we can make it per-target
2540
2541 {
2542 Mutex::Locker clang_modules_decl_vendor_locker(s_clang_modules_decl_vendor_mutex);
2543
2544 if (!m_clang_modules_decl_vendor_ap)
2545 {
2546 m_clang_modules_decl_vendor_ap.reset(ClangModulesDeclVendor::Create(*this));
2547 }
2548 }
2549
2550 return m_clang_modules_decl_vendor_ap.get();
2551}
Greg Clayton9585fbf2013-03-19 00:20:55 +00002552
Greg Clayton44d93782014-01-27 23:43:24 +00002553Target::StopHookSP
2554Target::CreateStopHook ()
Jim Ingham9575d842011-03-11 03:53:59 +00002555{
2556 lldb::user_id_t new_uid = ++m_stop_hook_next_id;
Greg Clayton44d93782014-01-27 23:43:24 +00002557 Target::StopHookSP stop_hook_sp (new StopHook(shared_from_this(), new_uid));
2558 m_stop_hooks[new_uid] = stop_hook_sp;
2559 return stop_hook_sp;
Jim Ingham9575d842011-03-11 03:53:59 +00002560}
2561
2562bool
2563Target::RemoveStopHookByID (lldb::user_id_t user_id)
2564{
2565 size_t num_removed;
2566 num_removed = m_stop_hooks.erase (user_id);
2567 if (num_removed == 0)
2568 return false;
2569 else
2570 return true;
2571}
2572
2573void
2574Target::RemoveAllStopHooks ()
2575{
2576 m_stop_hooks.clear();
2577}
2578
2579Target::StopHookSP
2580Target::GetStopHookByID (lldb::user_id_t user_id)
2581{
2582 StopHookSP found_hook;
2583
2584 StopHookCollection::iterator specified_hook_iter;
2585 specified_hook_iter = m_stop_hooks.find (user_id);
2586 if (specified_hook_iter != m_stop_hooks.end())
2587 found_hook = (*specified_hook_iter).second;
2588 return found_hook;
2589}
2590
2591bool
2592Target::SetStopHookActiveStateByID (lldb::user_id_t user_id, bool active_state)
2593{
2594 StopHookCollection::iterator specified_hook_iter;
2595 specified_hook_iter = m_stop_hooks.find (user_id);
2596 if (specified_hook_iter == m_stop_hooks.end())
2597 return false;
2598
2599 (*specified_hook_iter).second->SetIsActive (active_state);
2600 return true;
2601}
2602
2603void
2604Target::SetAllStopHooksActiveState (bool active_state)
2605{
2606 StopHookCollection::iterator pos, end = m_stop_hooks.end();
2607 for (pos = m_stop_hooks.begin(); pos != end; pos++)
2608 {
2609 (*pos).second->SetIsActive (active_state);
2610 }
2611}
2612
2613void
2614Target::RunStopHooks ()
2615{
Jim Ingham6026ca32011-05-12 02:06:14 +00002616 if (m_suppress_stop_hooks)
2617 return;
2618
Jim Ingham9575d842011-03-11 03:53:59 +00002619 if (!m_process_sp)
2620 return;
Enrico Granatae2e091b2012-08-03 22:24:48 +00002621
2622 // <rdar://problem/12027563> make sure we check that we are not stopped because of us running a user expression
2623 // since in that case we do not want to run the stop-hooks
2624 if (m_process_sp->GetModIDRef().IsLastResumeForUserExpression())
2625 return;
2626
Jim Ingham9575d842011-03-11 03:53:59 +00002627 if (m_stop_hooks.empty())
2628 return;
2629
2630 StopHookCollection::iterator pos, end = m_stop_hooks.end();
2631
2632 // If there aren't any active stop hooks, don't bother either:
2633 bool any_active_hooks = false;
2634 for (pos = m_stop_hooks.begin(); pos != end; pos++)
2635 {
2636 if ((*pos).second->IsActive())
2637 {
2638 any_active_hooks = true;
2639 break;
2640 }
2641 }
2642 if (!any_active_hooks)
2643 return;
2644
2645 CommandReturnObject result;
2646
2647 std::vector<ExecutionContext> exc_ctx_with_reasons;
2648 std::vector<SymbolContext> sym_ctx_with_reasons;
2649
2650 ThreadList &cur_threadlist = m_process_sp->GetThreadList();
2651 size_t num_threads = cur_threadlist.GetSize();
2652 for (size_t i = 0; i < num_threads; i++)
2653 {
2654 lldb::ThreadSP cur_thread_sp = cur_threadlist.GetThreadAtIndex (i);
2655 if (cur_thread_sp->ThreadStoppedForAReason())
2656 {
Jason Molendab57e4a12013-11-04 09:33:30 +00002657 lldb::StackFrameSP cur_frame_sp = cur_thread_sp->GetStackFrameAtIndex(0);
Jim Ingham9575d842011-03-11 03:53:59 +00002658 exc_ctx_with_reasons.push_back(ExecutionContext(m_process_sp.get(), cur_thread_sp.get(), cur_frame_sp.get()));
2659 sym_ctx_with_reasons.push_back(cur_frame_sp->GetSymbolContext(eSymbolContextEverything));
2660 }
2661 }
2662
2663 // If no threads stopped for a reason, don't run the stop-hooks.
2664 size_t num_exe_ctx = exc_ctx_with_reasons.size();
2665 if (num_exe_ctx == 0)
2666 return;
2667
Jim Ingham5b52f0c2011-06-02 23:58:26 +00002668 result.SetImmediateOutputStream (m_debugger.GetAsyncOutputStream());
2669 result.SetImmediateErrorStream (m_debugger.GetAsyncErrorStream());
Jim Ingham9575d842011-03-11 03:53:59 +00002670
2671 bool keep_going = true;
2672 bool hooks_ran = false;
Jim Ingham381e25b2011-03-22 01:47:27 +00002673 bool print_hook_header;
2674 bool print_thread_header;
2675
2676 if (num_exe_ctx == 1)
2677 print_thread_header = false;
2678 else
2679 print_thread_header = true;
2680
2681 if (m_stop_hooks.size() == 1)
2682 print_hook_header = false;
2683 else
2684 print_hook_header = true;
2685
Jim Ingham9575d842011-03-11 03:53:59 +00002686 for (pos = m_stop_hooks.begin(); keep_going && pos != end; pos++)
2687 {
2688 // result.Clear();
2689 StopHookSP cur_hook_sp = (*pos).second;
2690 if (!cur_hook_sp->IsActive())
2691 continue;
2692
2693 bool any_thread_matched = false;
2694 for (size_t i = 0; keep_going && i < num_exe_ctx; i++)
2695 {
2696 if ((cur_hook_sp->GetSpecifier () == NULL
2697 || cur_hook_sp->GetSpecifier()->SymbolContextMatches(sym_ctx_with_reasons[i]))
2698 && (cur_hook_sp->GetThreadSpecifier() == NULL
Jim Ingham3d902922012-03-07 22:03:04 +00002699 || cur_hook_sp->GetThreadSpecifier()->ThreadPassesBasicTests(exc_ctx_with_reasons[i].GetThreadRef())))
Jim Ingham9575d842011-03-11 03:53:59 +00002700 {
2701 if (!hooks_ran)
2702 {
Jim Ingham9575d842011-03-11 03:53:59 +00002703 hooks_ran = true;
2704 }
Jim Ingham381e25b2011-03-22 01:47:27 +00002705 if (print_hook_header && !any_thread_matched)
Jim Ingham9575d842011-03-11 03:53:59 +00002706 {
Johnny Chenaeab25c2011-10-24 23:01:06 +00002707 const char *cmd = (cur_hook_sp->GetCommands().GetSize() == 1 ?
2708 cur_hook_sp->GetCommands().GetStringAtIndex(0) :
2709 NULL);
2710 if (cmd)
Daniel Malead01b2952012-11-29 21:49:15 +00002711 result.AppendMessageWithFormat("\n- Hook %" PRIu64 " (%s)\n", cur_hook_sp->GetID(), cmd);
Johnny Chenaeab25c2011-10-24 23:01:06 +00002712 else
Daniel Malead01b2952012-11-29 21:49:15 +00002713 result.AppendMessageWithFormat("\n- Hook %" PRIu64 "\n", cur_hook_sp->GetID());
Jim Ingham9575d842011-03-11 03:53:59 +00002714 any_thread_matched = true;
2715 }
2716
Jim Ingham381e25b2011-03-22 01:47:27 +00002717 if (print_thread_header)
Greg Claytonc14ee322011-09-22 04:58:26 +00002718 result.AppendMessageWithFormat("-- Thread %d\n", exc_ctx_with_reasons[i].GetThreadPtr()->GetIndexID());
Jim Ingham26c7bf92014-10-11 00:38:27 +00002719
2720 CommandInterpreterRunOptions options;
2721 options.SetStopOnContinue (true);
2722 options.SetStopOnError (true);
2723 options.SetEchoCommands (false);
2724 options.SetPrintResults (true);
2725 options.SetAddToHistory (false);
2726
2727 GetDebugger().GetCommandInterpreter().HandleCommands (cur_hook_sp->GetCommands(),
2728 &exc_ctx_with_reasons[i],
2729 options,
Greg Clayton32e0a752011-03-30 18:16:51 +00002730 result);
Jim Ingham9575d842011-03-11 03:53:59 +00002731
2732 // If the command started the target going again, we should bag out of
2733 // running the stop hooks.
Greg Clayton32e0a752011-03-30 18:16:51 +00002734 if ((result.GetStatus() == eReturnStatusSuccessContinuingNoResult) ||
2735 (result.GetStatus() == eReturnStatusSuccessContinuingResult))
Jim Ingham9575d842011-03-11 03:53:59 +00002736 {
Daniel Malead01b2952012-11-29 21:49:15 +00002737 result.AppendMessageWithFormat ("Aborting stop hooks, hook %" PRIu64 " set the program running.", cur_hook_sp->GetID());
Jim Ingham9575d842011-03-11 03:53:59 +00002738 keep_going = false;
2739 }
2740 }
2741 }
2742 }
Jason Molenda879cf772011-09-23 00:42:55 +00002743
Caroline Tice969ed3d2011-05-02 20:41:46 +00002744 result.GetImmediateOutputStream()->Flush();
2745 result.GetImmediateErrorStream()->Flush();
Jim Ingham9575d842011-03-11 03:53:59 +00002746}
2747
Greg Claytonfbb76342013-11-20 21:07:01 +00002748const TargetPropertiesSP &
2749Target::GetGlobalProperties()
2750{
2751 static TargetPropertiesSP g_settings_sp;
2752 if (!g_settings_sp)
2753 {
2754 g_settings_sp.reset (new TargetProperties (NULL));
2755 }
2756 return g_settings_sp;
2757}
2758
2759Error
2760Target::Install (ProcessLaunchInfo *launch_info)
2761{
2762 Error error;
2763 PlatformSP platform_sp (GetPlatform());
2764 if (platform_sp)
2765 {
2766 if (platform_sp->IsRemote())
2767 {
2768 if (platform_sp->IsConnected())
2769 {
2770 // Install all files that have an install path, and always install the
2771 // main executable when connected to a remote platform
2772 const ModuleList& modules = GetImages();
2773 const size_t num_images = modules.GetSize();
2774 for (size_t idx = 0; idx < num_images; ++idx)
2775 {
2776 const bool is_main_executable = idx == 0;
2777 ModuleSP module_sp(modules.GetModuleAtIndex(idx));
2778 if (module_sp)
2779 {
2780 FileSpec local_file (module_sp->GetFileSpec());
2781 if (local_file)
2782 {
2783 FileSpec remote_file (module_sp->GetRemoteInstallFileSpec());
2784 if (!remote_file)
2785 {
2786 if (is_main_executable) // TODO: add setting for always installing main executable???
2787 {
2788 // Always install the main executable
Chaoren Lind3173f32015-05-29 19:52:29 +00002789 remote_file = platform_sp->GetRemoteWorkingDirectory();
2790 remote_file.AppendPathComponent(module_sp->GetFileSpec().GetFilename().GetCString());
Greg Claytonfbb76342013-11-20 21:07:01 +00002791 }
2792 }
2793 if (remote_file)
2794 {
2795 error = platform_sp->Install(local_file, remote_file);
2796 if (error.Success())
2797 {
2798 module_sp->SetPlatformFileSpec(remote_file);
2799 if (is_main_executable)
2800 {
Chaoren Lind3173f32015-05-29 19:52:29 +00002801 platform_sp->SetFilePermissions(remote_file, 0700);
Greg Claytonfbb76342013-11-20 21:07:01 +00002802 if (launch_info)
2803 launch_info->SetExecutableFile(remote_file, false);
2804 }
2805 }
2806 else
2807 break;
2808 }
2809 }
2810 }
2811 }
2812 }
2813 }
2814 }
2815 return error;
2816}
Greg Clayton7b242382011-07-08 00:48:09 +00002817
Greg Claytond5944cd2013-12-06 01:12:00 +00002818bool
2819Target::ResolveLoadAddress (addr_t load_addr, Address &so_addr, uint32_t stop_id)
2820{
2821 return m_section_load_history.ResolveLoadAddress(stop_id, load_addr, so_addr);
2822}
2823
2824bool
Matthew Gardinerc928de32014-10-22 07:22:56 +00002825Target::ResolveFileAddress (lldb::addr_t file_addr, Address &resolved_addr)
2826{
2827 return m_images.ResolveFileAddress(file_addr, resolved_addr);
2828}
2829
2830bool
Greg Claytond5944cd2013-12-06 01:12:00 +00002831Target::SetSectionLoadAddress (const SectionSP &section_sp, addr_t new_section_load_addr, bool warn_multiple)
2832{
2833 const addr_t old_section_load_addr = m_section_load_history.GetSectionLoadAddress (SectionLoadHistory::eStopIDNow, section_sp);
2834 if (old_section_load_addr != new_section_load_addr)
2835 {
2836 uint32_t stop_id = 0;
2837 ProcessSP process_sp(GetProcessSP());
2838 if (process_sp)
2839 stop_id = process_sp->GetStopID();
2840 else
2841 stop_id = m_section_load_history.GetLastStopID();
2842 if (m_section_load_history.SetSectionLoadAddress (stop_id, section_sp, new_section_load_addr, warn_multiple))
2843 return true; // Return true if the section load address was changed...
2844 }
2845 return false; // Return false to indicate nothing changed
Greg Claytond5944cd2013-12-06 01:12:00 +00002846}
2847
Greg Clayton8012cad2014-11-17 19:39:20 +00002848size_t
2849Target::UnloadModuleSections (const ModuleList &module_list)
2850{
2851 size_t section_unload_count = 0;
2852 size_t num_modules = module_list.GetSize();
2853 for (size_t i=0; i<num_modules; ++i)
2854 {
2855 section_unload_count += UnloadModuleSections (module_list.GetModuleAtIndex(i));
2856 }
2857 return section_unload_count;
2858}
2859
2860size_t
2861Target::UnloadModuleSections (const lldb::ModuleSP &module_sp)
2862{
2863 uint32_t stop_id = 0;
2864 ProcessSP process_sp(GetProcessSP());
2865 if (process_sp)
2866 stop_id = process_sp->GetStopID();
2867 else
2868 stop_id = m_section_load_history.GetLastStopID();
2869 SectionList *sections = module_sp->GetSectionList();
2870 size_t section_unload_count = 0;
2871 if (sections)
2872 {
2873 const uint32_t num_sections = sections->GetNumSections(0);
2874 for (uint32_t i = 0; i < num_sections; ++i)
2875 {
2876 section_unload_count += m_section_load_history.SetSectionUnloaded(stop_id, sections->GetSectionAtIndex(i));
2877 }
2878 }
2879 return section_unload_count;
2880}
2881
Greg Claytond5944cd2013-12-06 01:12:00 +00002882bool
2883Target::SetSectionUnloaded (const lldb::SectionSP &section_sp)
2884{
2885 uint32_t stop_id = 0;
2886 ProcessSP process_sp(GetProcessSP());
2887 if (process_sp)
2888 stop_id = process_sp->GetStopID();
2889 else
2890 stop_id = m_section_load_history.GetLastStopID();
2891 return m_section_load_history.SetSectionUnloaded (stop_id, section_sp);
2892}
2893
2894bool
2895Target::SetSectionUnloaded (const lldb::SectionSP &section_sp, addr_t load_addr)
2896{
2897 uint32_t stop_id = 0;
2898 ProcessSP process_sp(GetProcessSP());
2899 if (process_sp)
2900 stop_id = process_sp->GetStopID();
2901 else
2902 stop_id = m_section_load_history.GetLastStopID();
2903 return m_section_load_history.SetSectionUnloaded (stop_id, section_sp, load_addr);
2904}
2905
2906void
2907Target::ClearAllLoadedSections ()
2908{
2909 m_section_load_history.Clear();
2910}
2911
Greg Claytonb09c5382013-12-13 17:20:18 +00002912Error
Greg Clayton8012cad2014-11-17 19:39:20 +00002913Target::Launch (ProcessLaunchInfo &launch_info, Stream *stream)
Greg Claytonb09c5382013-12-13 17:20:18 +00002914{
2915 Error error;
Todd Fialaac33cc92014-10-09 01:02:08 +00002916 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TARGET));
2917
2918 if (log)
2919 log->Printf ("Target::%s() called for %s", __FUNCTION__, launch_info.GetExecutableFile().GetPath().c_str ());
2920
Greg Claytonb09c5382013-12-13 17:20:18 +00002921 StateType state = eStateInvalid;
2922
Greg Clayton6b32f1e2013-12-18 02:06:45 +00002923 // Scope to temporarily get the process state in case someone has manually
2924 // remotely connected already to a process and we can skip the platform
2925 // launching.
2926 {
2927 ProcessSP process_sp (GetProcessSP());
2928
2929 if (process_sp)
Todd Fialaac33cc92014-10-09 01:02:08 +00002930 {
Greg Clayton6b32f1e2013-12-18 02:06:45 +00002931 state = process_sp->GetState();
Todd Fialaac33cc92014-10-09 01:02:08 +00002932 if (log)
2933 log->Printf ("Target::%s the process exists, and its current state is %s", __FUNCTION__, StateAsCString (state));
2934 }
2935 else
2936 {
2937 if (log)
2938 log->Printf ("Target::%s the process instance doesn't currently exist.", __FUNCTION__);
2939 }
Greg Clayton6b32f1e2013-12-18 02:06:45 +00002940 }
2941
Greg Claytonb09c5382013-12-13 17:20:18 +00002942 launch_info.GetFlags().Set (eLaunchFlagDebug);
2943
2944 // Get the value of synchronous execution here. If you wait till after you have started to
2945 // run, then you could have hit a breakpoint, whose command might switch the value, and
2946 // then you'll pick up that incorrect value.
2947 Debugger &debugger = GetDebugger();
2948 const bool synchronous_execution = debugger.GetCommandInterpreter().GetSynchronous ();
2949
2950 PlatformSP platform_sp (GetPlatform());
2951
2952 // Finalize the file actions, and if none were given, default to opening
2953 // up a pseudo terminal
2954 const bool default_to_use_pty = platform_sp ? platform_sp->IsHost() : false;
Todd Fiala75f47c32014-10-11 21:42:09 +00002955 if (log)
2956 log->Printf ("Target::%s have platform=%s, platform_sp->IsHost()=%s, default_to_use_pty=%s",
2957 __FUNCTION__,
2958 platform_sp ? "true" : "false",
2959 platform_sp ? (platform_sp->IsHost () ? "true" : "false") : "n/a",
2960 default_to_use_pty ? "true" : "false");
2961
Greg Claytonb09c5382013-12-13 17:20:18 +00002962 launch_info.FinalizeFileActions (this, default_to_use_pty);
2963
2964 if (state == eStateConnected)
2965 {
2966 if (launch_info.GetFlags().Test (eLaunchFlagLaunchInTTY))
2967 {
2968 error.SetErrorString("can't launch in tty when launching through a remote connection");
2969 return error;
2970 }
2971 }
2972
2973 if (!launch_info.GetArchitecture().IsValid())
2974 launch_info.GetArchitecture() = GetArchitecture();
Todd Fiala015d8182014-07-22 23:41:36 +00002975
2976 // If we're not already connected to the process, and if we have a platform that can launch a process for debugging, go ahead and do that here.
Greg Claytonb09c5382013-12-13 17:20:18 +00002977 if (state != eStateConnected && platform_sp && platform_sp->CanDebugProcess ())
2978 {
Todd Fialaac33cc92014-10-09 01:02:08 +00002979 if (log)
2980 log->Printf ("Target::%s asking the platform to debug the process", __FUNCTION__);
2981
Greg Clayton5df78fa2015-05-23 03:54:53 +00002982 // Get a weak pointer to the previous process if we have one
2983 ProcessWP process_wp;
2984 if (m_process_sp)
2985 process_wp = m_process_sp;
Greg Claytonb09c5382013-12-13 17:20:18 +00002986 m_process_sp = GetPlatform()->DebugProcess (launch_info,
2987 debugger,
2988 this,
Greg Claytonb09c5382013-12-13 17:20:18 +00002989 error);
Greg Clayton5df78fa2015-05-23 03:54:53 +00002990
2991 // Cleanup the old process since someone might still have a strong
2992 // reference to this process and we would like to allow it to cleanup
2993 // as much as it can without the object being destroyed. We try to
2994 // lock the shared pointer and if that works, then someone else still
2995 // has a strong reference to the process.
2996
2997 ProcessSP old_process_sp(process_wp.lock());
2998 if (old_process_sp)
2999 old_process_sp->Finalize();
Greg Claytonb09c5382013-12-13 17:20:18 +00003000 }
3001 else
3002 {
Todd Fialaac33cc92014-10-09 01:02:08 +00003003 if (log)
3004 log->Printf ("Target::%s the platform doesn't know how to debug a process, getting a process plugin to do this for us.", __FUNCTION__);
3005
Greg Claytonb09c5382013-12-13 17:20:18 +00003006 if (state == eStateConnected)
3007 {
3008 assert(m_process_sp);
3009 }
3010 else
3011 {
Todd Fiala015d8182014-07-22 23:41:36 +00003012 // Use a Process plugin to construct the process.
Greg Claytonb09c5382013-12-13 17:20:18 +00003013 const char *plugin_name = launch_info.GetProcessPluginName();
Greg Clayton8012cad2014-11-17 19:39:20 +00003014 CreateProcess (launch_info.GetListenerForProcess(debugger), plugin_name, NULL);
Greg Claytonb09c5382013-12-13 17:20:18 +00003015 }
Todd Fiala015d8182014-07-22 23:41:36 +00003016
3017 // Since we didn't have a platform launch the process, launch it here.
Greg Claytonb09c5382013-12-13 17:20:18 +00003018 if (m_process_sp)
3019 error = m_process_sp->Launch (launch_info);
3020 }
3021
3022 if (!m_process_sp)
3023 {
3024 if (error.Success())
3025 error.SetErrorString("failed to launch or debug process");
3026 return error;
3027 }
3028
3029 if (error.Success())
3030 {
Ilia K064e69f2015-03-23 21:16:25 +00003031 if (synchronous_execution || launch_info.GetFlags().Test(eLaunchFlagStopAtEntry) == false)
Greg Claytonb09c5382013-12-13 17:20:18 +00003032 {
Greg Clayton44d93782014-01-27 23:43:24 +00003033 ListenerSP hijack_listener_sp (launch_info.GetHijackListener());
Zachary Turnere6d213a2015-03-26 20:41:14 +00003034 if (!hijack_listener_sp)
3035 {
3036 hijack_listener_sp.reset(new Listener("lldb.Target.Launch.hijack"));
3037 launch_info.SetHijackListener(hijack_listener_sp);
3038 m_process_sp->HijackProcessEvents(hijack_listener_sp.get());
3039 }
Todd Fialaac33cc92014-10-09 01:02:08 +00003040
Ilia K38810f42015-05-20 10:15:47 +00003041 StateType state = m_process_sp->WaitForProcessToStop (NULL, NULL, false, hijack_listener_sp.get(), NULL);
Greg Claytonb09c5382013-12-13 17:20:18 +00003042
3043 if (state == eStateStopped)
3044 {
Zachary Turnere6d213a2015-03-26 20:41:14 +00003045 if (!launch_info.GetFlags().Test(eLaunchFlagStopAtEntry))
Greg Claytonb09c5382013-12-13 17:20:18 +00003046 {
Zachary Turnere6d213a2015-03-26 20:41:14 +00003047 if (synchronous_execution)
Greg Claytonb09c5382013-12-13 17:20:18 +00003048 {
Zachary Turnere6d213a2015-03-26 20:41:14 +00003049 error = m_process_sp->PrivateResume();
3050 if (error.Success())
Greg Claytonb09c5382013-12-13 17:20:18 +00003051 {
Ilia K064e69f2015-03-23 21:16:25 +00003052 state = m_process_sp->WaitForProcessToStop (NULL, NULL, true, hijack_listener_sp.get(), stream);
3053 const bool must_be_alive = false; // eStateExited is ok, so this must be false
3054 if (!StateIsStoppedState(state, must_be_alive))
3055 {
3056 error.SetErrorStringWithFormat("process isn't stopped: %s", StateAsCString(state));
3057 }
Greg Claytonb09c5382013-12-13 17:20:18 +00003058 }
3059 }
Ilia K064e69f2015-03-23 21:16:25 +00003060 else
3061 {
Zachary Turnere6d213a2015-03-26 20:41:14 +00003062 m_process_sp->RestoreProcessEvents();
3063 error = m_process_sp->PrivateResume();
Zachary Turnere6d213a2015-03-26 20:41:14 +00003064 }
3065 if (!error.Success())
3066 {
Ilia K064e69f2015-03-23 21:16:25 +00003067 Error error2;
3068 error2.SetErrorStringWithFormat("process resume at entry point failed: %s", error.AsCString());
3069 error = error2;
3070 }
Greg Claytonb09c5382013-12-13 17:20:18 +00003071 }
Greg Claytonb09c5382013-12-13 17:20:18 +00003072 }
Greg Clayton40286e02014-04-30 20:29:09 +00003073 else if (state == eStateExited)
3074 {
Zachary Turner10687b02014-10-20 17:46:43 +00003075 bool with_shell = !!launch_info.GetShell();
Greg Clayton40286e02014-04-30 20:29:09 +00003076 const int exit_status = m_process_sp->GetExitStatus();
3077 const char *exit_desc = m_process_sp->GetExitDescription();
3078#define LAUNCH_SHELL_MESSAGE "\n'r' and 'run' are aliases that default to launching through a shell.\nTry launching without going through a shell by using 'process launch'."
3079 if (exit_desc && exit_desc[0])
3080 {
3081 if (with_shell)
3082 error.SetErrorStringWithFormat ("process exited with status %i (%s)" LAUNCH_SHELL_MESSAGE, exit_status, exit_desc);
3083 else
3084 error.SetErrorStringWithFormat ("process exited with status %i (%s)", exit_status, exit_desc);
3085 }
3086 else
3087 {
3088 if (with_shell)
3089 error.SetErrorStringWithFormat ("process exited with status %i" LAUNCH_SHELL_MESSAGE, exit_status);
3090 else
3091 error.SetErrorStringWithFormat ("process exited with status %i", exit_status);
3092 }
3093 }
Greg Claytonb09c5382013-12-13 17:20:18 +00003094 else
3095 {
3096 error.SetErrorStringWithFormat ("initial process state wasn't stopped: %s", StateAsCString(state));
3097 }
3098 }
Greg Clayton44d93782014-01-27 23:43:24 +00003099 m_process_sp->RestoreProcessEvents ();
Greg Claytonb09c5382013-12-13 17:20:18 +00003100 }
3101 else
3102 {
Greg Clayton44d93782014-01-27 23:43:24 +00003103 Error error2;
Greg Claytonb09c5382013-12-13 17:20:18 +00003104 error2.SetErrorStringWithFormat ("process launch failed: %s", error.AsCString());
Greg Clayton44d93782014-01-27 23:43:24 +00003105 error = error2;
Greg Claytonb09c5382013-12-13 17:20:18 +00003106 }
3107 return error;
3108}
Oleksiy Vyalov37386142015-02-10 22:49:57 +00003109
3110Error
3111Target::Attach (ProcessAttachInfo &attach_info, Stream *stream)
3112{
3113 auto state = eStateInvalid;
3114 auto process_sp = GetProcessSP ();
3115 if (process_sp)
3116 {
3117 state = process_sp->GetState ();
3118 if (process_sp->IsAlive () && state != eStateConnected)
3119 {
3120 if (state == eStateAttaching)
3121 return Error ("process attach is in progress");
3122 return Error ("a process is already being debugged");
3123 }
3124 }
3125
Oleksiy Vyalov37386142015-02-10 22:49:57 +00003126 const ModuleSP old_exec_module_sp = GetExecutableModule ();
3127
3128 // If no process info was specified, then use the target executable
3129 // name as the process to attach to by default
3130 if (!attach_info.ProcessInfoSpecified ())
3131 {
3132 if (old_exec_module_sp)
3133 attach_info.GetExecutableFile ().GetFilename () = old_exec_module_sp->GetPlatformFileSpec ().GetFilename ();
3134
3135 if (!attach_info.ProcessInfoSpecified ())
3136 {
3137 return Error ("no process specified, create a target with a file, or specify the --pid or --name");
3138 }
3139 }
3140
3141 const auto platform_sp = GetDebugger ().GetPlatformList ().GetSelectedPlatform ();
Greg Claytonb3788ea2015-10-05 22:58:37 +00003142 ListenerSP hijack_listener_sp;
3143 const bool async = attach_info.GetAsync();
3144 if (async == false)
3145 {
3146 hijack_listener_sp.reset (new Listener ("lldb.Target.Attach.attach.hijack"));
3147 attach_info.SetHijackListener (hijack_listener_sp);
3148 }
Oleksiy Vyalov37386142015-02-10 22:49:57 +00003149
3150 Error error;
3151 if (state != eStateConnected && platform_sp != nullptr && platform_sp->CanDebugProcess ())
3152 {
3153 SetPlatform (platform_sp);
3154 process_sp = platform_sp->Attach (attach_info, GetDebugger (), this, error);
3155 }
3156 else
3157 {
3158 if (state != eStateConnected)
3159 {
3160 const char *plugin_name = attach_info.GetProcessPluginName ();
3161 process_sp = CreateProcess (attach_info.GetListenerForProcess (GetDebugger ()), plugin_name, nullptr);
3162 if (process_sp == nullptr)
3163 {
3164 error.SetErrorStringWithFormat ("failed to create process using plugin %s", (plugin_name) ? plugin_name : "null");
3165 return error;
3166 }
3167 }
Greg Claytonb3788ea2015-10-05 22:58:37 +00003168 if (hijack_listener_sp)
3169 process_sp->HijackProcessEvents (hijack_listener_sp.get ());
Oleksiy Vyalov37386142015-02-10 22:49:57 +00003170 error = process_sp->Attach (attach_info);
3171 }
3172
Greg Claytone75e5d82015-10-20 00:14:20 +00003173 if (error.Success () && process_sp)
Oleksiy Vyalov37386142015-02-10 22:49:57 +00003174 {
Greg Claytone75e5d82015-10-20 00:14:20 +00003175 if (async)
Oleksiy Vyalov37386142015-02-10 22:49:57 +00003176 {
Greg Claytone75e5d82015-10-20 00:14:20 +00003177 process_sp->RestoreProcessEvents ();
3178 }
3179 else
3180 {
3181 state = process_sp->WaitForProcessToStop (nullptr, nullptr, false, attach_info.GetHijackListener ().get (), stream);
3182 process_sp->RestoreProcessEvents ();
3183
3184 if (state != eStateStopped)
3185 {
3186 const char *exit_desc = process_sp->GetExitDescription ();
3187 if (exit_desc)
3188 error.SetErrorStringWithFormat ("%s", exit_desc);
3189 else
3190 error.SetErrorString ("process did not stop (no such process or permission problem?)");
3191 process_sp->Destroy (false);
3192 }
Oleksiy Vyalov37386142015-02-10 22:49:57 +00003193 }
3194 }
3195 return error;
3196}
3197
Jim Ingham9575d842011-03-11 03:53:59 +00003198//--------------------------------------------------------------
Greg Claytonfbb76342013-11-20 21:07:01 +00003199// Target::StopHook
Jim Ingham9575d842011-03-11 03:53:59 +00003200//--------------------------------------------------------------
Jim Ingham9575d842011-03-11 03:53:59 +00003201Target::StopHook::StopHook (lldb::TargetSP target_sp, lldb::user_id_t uid) :
3202 UserID (uid),
3203 m_target_sp (target_sp),
Jim Ingham9575d842011-03-11 03:53:59 +00003204 m_commands (),
3205 m_specifier_sp (),
Greg Claytone01e07b2013-04-18 18:10:51 +00003206 m_thread_spec_ap(),
Stephen Wilson71c21d12011-04-11 19:41:40 +00003207 m_active (true)
Jim Ingham9575d842011-03-11 03:53:59 +00003208{
3209}
3210
3211Target::StopHook::StopHook (const StopHook &rhs) :
3212 UserID (rhs.GetID()),
3213 m_target_sp (rhs.m_target_sp),
3214 m_commands (rhs.m_commands),
3215 m_specifier_sp (rhs.m_specifier_sp),
Greg Claytone01e07b2013-04-18 18:10:51 +00003216 m_thread_spec_ap (),
Stephen Wilson71c21d12011-04-11 19:41:40 +00003217 m_active (rhs.m_active)
Jim Ingham9575d842011-03-11 03:53:59 +00003218{
3219 if (rhs.m_thread_spec_ap.get() != NULL)
3220 m_thread_spec_ap.reset (new ThreadSpec(*rhs.m_thread_spec_ap.get()));
3221}
3222
Eugene Zelenko8f30a652015-10-23 18:39:37 +00003223Target::StopHook::~StopHook() = default;
Jim Ingham9575d842011-03-11 03:53:59 +00003224
3225void
Zachary Turner32abc6e2015-03-03 19:23:09 +00003226Target::StopHook::SetSpecifier(SymbolContextSpecifier *specifier)
3227{
3228 m_specifier_sp.reset(specifier);
3229}
3230
3231void
Jim Ingham9575d842011-03-11 03:53:59 +00003232Target::StopHook::SetThreadSpecifier (ThreadSpec *specifier)
3233{
3234 m_thread_spec_ap.reset (specifier);
3235}
Jim Ingham9575d842011-03-11 03:53:59 +00003236
3237void
3238Target::StopHook::GetDescription (Stream *s, lldb::DescriptionLevel level) const
3239{
3240 int indent_level = s->GetIndentLevel();
3241
3242 s->SetIndentLevel(indent_level + 2);
3243
Daniel Malead01b2952012-11-29 21:49:15 +00003244 s->Printf ("Hook: %" PRIu64 "\n", GetID());
Jim Ingham9575d842011-03-11 03:53:59 +00003245 if (m_active)
3246 s->Indent ("State: enabled\n");
3247 else
3248 s->Indent ("State: disabled\n");
3249
3250 if (m_specifier_sp)
3251 {
3252 s->Indent();
3253 s->PutCString ("Specifier:\n");
3254 s->SetIndentLevel (indent_level + 4);
3255 m_specifier_sp->GetDescription (s, level);
3256 s->SetIndentLevel (indent_level + 2);
3257 }
3258
3259 if (m_thread_spec_ap.get() != NULL)
3260 {
3261 StreamString tmp;
3262 s->Indent("Thread:\n");
3263 m_thread_spec_ap->GetDescription (&tmp, level);
3264 s->SetIndentLevel (indent_level + 4);
3265 s->Indent (tmp.GetData());
3266 s->PutCString ("\n");
3267 s->SetIndentLevel (indent_level + 2);
3268 }
3269
3270 s->Indent ("Commands: \n");
3271 s->SetIndentLevel (indent_level + 4);
3272 uint32_t num_commands = m_commands.GetSize();
3273 for (uint32_t i = 0; i < num_commands; i++)
3274 {
3275 s->Indent(m_commands.GetStringAtIndex(i));
3276 s->PutCString ("\n");
3277 }
3278 s->SetIndentLevel (indent_level);
3279}
3280
Greg Clayton67cc0632012-08-22 17:17:09 +00003281//--------------------------------------------------------------
3282// class TargetProperties
3283//--------------------------------------------------------------
3284
3285OptionEnumValueElement
3286lldb_private::g_dynamic_value_types[] =
Caroline Ticedaccaa92010-09-20 20:44:43 +00003287{
Greg Clayton67cc0632012-08-22 17:17:09 +00003288 { eNoDynamicValues, "no-dynamic-values", "Don't calculate the dynamic type of values"},
3289 { eDynamicCanRunTarget, "run-target", "Calculate the dynamic type of values even if you have to run the target."},
3290 { eDynamicDontRunTarget, "no-run-target", "Calculate the dynamic type of values, but don't run the target."},
3291 { 0, NULL, NULL }
3292};
Caroline Ticedaccaa92010-09-20 20:44:43 +00003293
Greg Clayton1f746072012-08-29 21:13:06 +00003294static OptionEnumValueElement
3295g_inline_breakpoint_enums[] =
3296{
3297 { eInlineBreakpointsNever, "never", "Never look for inline breakpoint locations (fastest). This setting should only be used if you know that no inlining occurs in your programs."},
3298 { eInlineBreakpointsHeaders, "headers", "Only check for inline breakpoint locations when setting breakpoints in header files, but not when setting breakpoint in implementation source files (default)."},
3299 { eInlineBreakpointsAlways, "always", "Always look for inline breakpoint locations when setting file and line breakpoints (slower but most accurate)."},
3300 { 0, NULL, NULL }
3301};
3302
Jim Ingham0f063ba2013-03-02 00:26:47 +00003303typedef enum x86DisassemblyFlavor
3304{
3305 eX86DisFlavorDefault,
3306 eX86DisFlavorIntel,
3307 eX86DisFlavorATT
3308} x86DisassemblyFlavor;
3309
3310static OptionEnumValueElement
3311g_x86_dis_flavor_value_types[] =
3312{
3313 { eX86DisFlavorDefault, "default", "Disassembler default (currently att)."},
3314 { eX86DisFlavorIntel, "intel", "Intel disassembler flavor."},
3315 { eX86DisFlavorATT, "att", "AT&T disassembler flavor."},
3316 { 0, NULL, NULL }
3317};
3318
Enrico Granata397ddd52013-05-21 20:13:34 +00003319static OptionEnumValueElement
Daniel Malead79ae052013-08-07 21:54:09 +00003320g_hex_immediate_style_values[] =
3321{
3322 { Disassembler::eHexStyleC, "c", "C-style (0xffff)."},
3323 { Disassembler::eHexStyleAsm, "asm", "Asm-style (0ffffh)."},
3324 { 0, NULL, NULL }
3325};
3326
3327static OptionEnumValueElement
Enrico Granata397ddd52013-05-21 20:13:34 +00003328g_load_script_from_sym_file_values[] =
3329{
3330 { eLoadScriptFromSymFileTrue, "true", "Load debug scripts inside symbol files"},
3331 { eLoadScriptFromSymFileFalse, "false", "Do not load debug scripts inside symbol files."},
3332 { eLoadScriptFromSymFileWarn, "warn", "Warn about debug scripts inside symbol files but do not load them."},
3333 { 0, NULL, NULL }
3334};
3335
Greg Claytonfd814c52013-08-13 01:42:25 +00003336static OptionEnumValueElement
3337g_memory_module_load_level_values[] =
3338{
Greg Clayton86eac942013-08-13 21:32:34 +00003339 { eMemoryModuleLoadLevelMinimal, "minimal" , "Load minimal information when loading modules from memory. Currently this setting loads sections only."},
Greg Claytonfd814c52013-08-13 01:42:25 +00003340 { eMemoryModuleLoadLevelPartial, "partial" , "Load partial information when loading modules from memory. Currently this setting loads sections and function bounds."},
3341 { eMemoryModuleLoadLevelComplete, "complete", "Load complete information when loading modules from memory. Currently this setting loads sections and all symbols."},
3342 { 0, NULL, NULL }
3343};
3344
Greg Clayton67cc0632012-08-22 17:17:09 +00003345static PropertyDefinition
3346g_properties[] =
Caroline Ticedaccaa92010-09-20 20:44:43 +00003347{
Greg Clayton67cc0632012-08-22 17:17:09 +00003348 { "default-arch" , OptionValue::eTypeArch , true , 0 , NULL, NULL, "Default architecture to choose, when there's a choice." },
Ilia K055ad9b2015-05-18 13:41:01 +00003349 { "move-to-nearest-code" , OptionValue::eTypeBoolean , false, true , NULL, NULL, "Move breakpoints to nearest code." },
Dawn Perchike0c96ac2015-07-30 22:10:08 +00003350 { "language" , OptionValue::eTypeLanguage , false, eLanguageTypeUnknown , NULL, NULL, "The language to use when interpreting expressions entered in commands." },
Greg Clayton67cc0632012-08-22 17:17:09 +00003351 { "expr-prefix" , OptionValue::eTypeFileSpec , false, 0 , NULL, NULL, "Path to a file containing expressions to be prepended to all expressions." },
Enrico Granata9aa7e8e2015-01-09 00:47:24 +00003352 { "prefer-dynamic-value" , OptionValue::eTypeEnum , false, eDynamicDontRunTarget , NULL, g_dynamic_value_types, "Should printed values be shown as their dynamic value." },
Greg Clayton67cc0632012-08-22 17:17:09 +00003353 { "enable-synthetic-value" , OptionValue::eTypeBoolean , false, true , NULL, NULL, "Should synthetic values be used by default whenever available." },
3354 { "skip-prologue" , OptionValue::eTypeBoolean , false, true , NULL, NULL, "Skip function prologues when setting breakpoints by name." },
Jim Ingham0ca778e2015-09-15 18:03:00 +00003355 { "source-map" , OptionValue::eTypePathMap , false, 0 , NULL, NULL, "Source path remappings are used to track the change of location between a source file when built, and "
Greg Clayton67cc0632012-08-22 17:17:09 +00003356 "where it exists on the current system. It consists of an array of duples, the first element of each duple is "
3357 "some part (starting at the root) of the path to the file when it was built, "
3358 "and the second is where the remainder of the original build hierarchy is rooted on the local system. "
3359 "Each element of the array is checked in order and the first one that results in a match wins." },
3360 { "exec-search-paths" , OptionValue::eTypeFileSpecList, false, 0 , NULL, NULL, "Executable search paths to use when locating executable files whose paths don't match the local file system." },
Michael Sartaina7499c92013-07-01 19:45:50 +00003361 { "debug-file-search-paths" , OptionValue::eTypeFileSpecList, false, 0 , NULL, NULL, "List of directories to be searched when locating debug symbol files." },
Sean Callanan85054342015-04-03 15:39:47 +00003362 { "clang-module-search-paths" , OptionValue::eTypeFileSpecList, false, 0 , NULL, NULL, "List of directories to be searched when locating modules for Clang." },
Sean Callananf0c5aeb2015-04-20 16:31:29 +00003363 { "auto-import-clang-modules" , OptionValue::eTypeBoolean , false, false , NULL, NULL, "Automatically load Clang modules referred to by the program." },
Greg Clayton67cc0632012-08-22 17:17:09 +00003364 { "max-children-count" , OptionValue::eTypeSInt64 , false, 256 , NULL, NULL, "Maximum number of children to expand in any level of depth." },
3365 { "max-string-summary-length" , OptionValue::eTypeSInt64 , false, 1024 , NULL, NULL, "Maximum number of characters to show when using %s in summary strings." },
Enrico Granatad325bf92013-06-04 22:54:16 +00003366 { "max-memory-read-size" , OptionValue::eTypeSInt64 , false, 1024 , NULL, NULL, "Maximum number of bytes that 'memory read' will fetch before --force must be specified." },
Greg Clayton67cc0632012-08-22 17:17:09 +00003367 { "breakpoints-use-platform-avoid-list", OptionValue::eTypeBoolean , false, true , NULL, NULL, "Consult the platform module avoid list when setting non-module specific breakpoints." },
Greg Clayton45392552012-10-17 22:57:12 +00003368 { "arg0" , OptionValue::eTypeString , false, 0 , NULL, NULL, "The first argument passed to the program in the argument array which can be different from the executable itself." },
3369 { "run-args" , OptionValue::eTypeArgs , false, 0 , NULL, NULL, "A list containing all the arguments to be passed to the executable when it is run. Note that this does NOT include the argv[0] which is in target.arg0." },
Greg Clayton67cc0632012-08-22 17:17:09 +00003370 { "env-vars" , OptionValue::eTypeDictionary, false, OptionValue::eTypeString , NULL, NULL, "A list of all the environment variables to be passed to the executable's environment, and their values." },
3371 { "inherit-env" , OptionValue::eTypeBoolean , false, true , NULL, NULL, "Inherit the environment from the process that is running LLDB." },
3372 { "input-path" , OptionValue::eTypeFileSpec , false, 0 , NULL, NULL, "The file/path to be used by the executable program for reading its standard input." },
3373 { "output-path" , OptionValue::eTypeFileSpec , false, 0 , NULL, NULL, "The file/path to be used by the executable program for writing its standard output." },
3374 { "error-path" , OptionValue::eTypeFileSpec , false, 0 , NULL, NULL, "The file/path to be used by the executable program for writing its standard error." },
Jim Ingham106d0282014-06-25 02:32:56 +00003375 { "detach-on-error" , OptionValue::eTypeBoolean , false, true , NULL, NULL, "debugserver will detach (rather than killing) a process if it loses connection with lldb." },
Greg Clayton67cc0632012-08-22 17:17:09 +00003376 { "disable-aslr" , OptionValue::eTypeBoolean , false, true , NULL, NULL, "Disable Address Space Layout Randomization (ASLR)" },
3377 { "disable-stdio" , OptionValue::eTypeBoolean , false, false , NULL, NULL, "Disable stdin/stdout for process (e.g. for a GUI application)" },
Todd Fialaad6eee62014-09-24 19:59:13 +00003378 { "inline-breakpoint-strategy" , OptionValue::eTypeEnum , false, eInlineBreakpointsAlways , NULL, g_inline_breakpoint_enums, "The strategy to use when settings breakpoints by file and line. "
Greg Clayton1f746072012-08-29 21:13:06 +00003379 "Breakpoint locations can end up being inlined by the compiler, so that a compile unit 'a.c' might contain an inlined function from another source file. "
Jim Ingham63733852015-06-16 21:39:56 +00003380 "Usually this is limited to breakpoint locations from inlined functions from header or other include files, or more accurately non-implementation source files. "
Greg Clayton1f746072012-08-29 21:13:06 +00003381 "Sometimes code might #include implementation files and cause inlined breakpoint locations in inlined implementation files. "
Todd Fialaad6eee62014-09-24 19:59:13 +00003382 "Always checking for inlined breakpoint locations can be expensive (memory and time), so if you have a project with many headers "
3383 "and find that setting breakpoints is slow, then you can change this setting to headers. "
3384 "This setting allows you to control exactly which strategy is used when setting "
Greg Clayton1f746072012-08-29 21:13:06 +00003385 "file and line breakpoints." },
Jim Ingham0f063ba2013-03-02 00:26:47 +00003386 // FIXME: This is the wrong way to do per-architecture settings, but we don't have a general per architecture settings system in place yet.
3387 { "x86-disassembly-flavor" , OptionValue::eTypeEnum , false, eX86DisFlavorDefault, NULL, g_x86_dis_flavor_value_types, "The default disassembly flavor to use for x86 or x86-64 targets." },
Daniel Malead79ae052013-08-07 21:54:09 +00003388 { "use-hex-immediates" , OptionValue::eTypeBoolean , false, true, NULL, NULL, "Show immediates in disassembly as hexadecimal." },
3389 { "hex-immediate-style" , OptionValue::eTypeEnum , false, Disassembler::eHexStyleC, NULL, g_hex_immediate_style_values, "Which style to use for printing hexadecimal disassembly values." },
Jim Ingham34951272013-04-04 01:38:54 +00003390 { "use-fast-stepping" , OptionValue::eTypeBoolean , false, true, NULL, NULL, "Use a fast stepping algorithm based on running from branch to branch rather than instruction single-stepping." },
Enrico Granata397ddd52013-05-21 20:13:34 +00003391 { "load-script-from-symbol-file" , OptionValue::eTypeEnum , false, eLoadScriptFromSymFileWarn, NULL, g_load_script_from_sym_file_values, "Allow LLDB to load scripting resources embedded in symbol files when available." },
Greg Clayton86eac942013-08-13 21:32:34 +00003392 { "memory-module-load-level" , OptionValue::eTypeEnum , false, eMemoryModuleLoadLevelComplete, NULL, g_memory_module_load_level_values,
3393 "Loading modules from memory can be slow as reading the symbol tables and other data can take a long time depending on your connection to the debug target. "
3394 "This setting helps users control how much information gets loaded when loading modules from memory."
3395 "'complete' is the default value for this setting which will load all sections and symbols by reading them from memory (slowest, most accurate). "
3396 "'partial' will load sections and attempt to find function bounds without downloading the symbol table (faster, still accurate, missing symbol names). "
3397 "'minimal' is the fastest setting and will load section data with no symbols, but should rarely be used as stack frames in these memory regions will be inaccurate and not provide any context (fastest). " },
Greg Claytonfb6621e2013-12-06 21:59:52 +00003398 { "display-expression-in-crashlogs" , OptionValue::eTypeBoolean , false, false, NULL, NULL, "Expressions that crash will show up in crash logs if the host system supports executable specific crash log strings and this setting is set to true." },
Jason Molendaa4bea722014-02-14 05:06:49 +00003399 { "trap-handler-names" , OptionValue::eTypeArray , true, OptionValue::eTypeString, NULL, NULL, "A list of trap handler function names, e.g. a common Unix user process one is _sigtramp." },
Enrico Granata560558e2015-02-11 02:35:39 +00003400 { "display-runtime-support-values" , OptionValue::eTypeBoolean , false, false, NULL, NULL, "If true, LLDB will show variables that are meant to support the operation of a language's runtime support." },
Ewan Crawford78baa192015-05-13 09:18:18 +00003401 { "non-stop-mode" , OptionValue::eTypeBoolean , false, 0, NULL, NULL, "Disable lock-step debugging, instead control threads independently." },
Greg Clayton67cc0632012-08-22 17:17:09 +00003402 { NULL , OptionValue::eTypeInvalid , false, 0 , NULL, NULL, NULL }
3403};
Enrico Granata560558e2015-02-11 02:35:39 +00003404
Greg Clayton67cc0632012-08-22 17:17:09 +00003405enum
Caroline Ticedaccaa92010-09-20 20:44:43 +00003406{
Greg Clayton67cc0632012-08-22 17:17:09 +00003407 ePropertyDefaultArch,
Ilia K055ad9b2015-05-18 13:41:01 +00003408 ePropertyMoveToNearestCode,
Dawn Perchik23b1dec2015-07-21 22:05:07 +00003409 ePropertyLanguage,
Greg Clayton67cc0632012-08-22 17:17:09 +00003410 ePropertyExprPrefix,
3411 ePropertyPreferDynamic,
3412 ePropertyEnableSynthetic,
3413 ePropertySkipPrologue,
3414 ePropertySourceMap,
3415 ePropertyExecutableSearchPaths,
Michael Sartaina7499c92013-07-01 19:45:50 +00003416 ePropertyDebugFileSearchPaths,
Sean Callanan85054342015-04-03 15:39:47 +00003417 ePropertyClangModuleSearchPaths,
Sean Callananf0c5aeb2015-04-20 16:31:29 +00003418 ePropertyAutoImportClangModules,
Greg Clayton67cc0632012-08-22 17:17:09 +00003419 ePropertyMaxChildrenCount,
3420 ePropertyMaxSummaryLength,
Enrico Granatad325bf92013-06-04 22:54:16 +00003421 ePropertyMaxMemReadSize,
Greg Clayton67cc0632012-08-22 17:17:09 +00003422 ePropertyBreakpointUseAvoidList,
Greg Clayton45392552012-10-17 22:57:12 +00003423 ePropertyArg0,
Greg Clayton67cc0632012-08-22 17:17:09 +00003424 ePropertyRunArgs,
3425 ePropertyEnvVars,
3426 ePropertyInheritEnv,
3427 ePropertyInputPath,
3428 ePropertyOutputPath,
3429 ePropertyErrorPath,
Jim Ingham106d0282014-06-25 02:32:56 +00003430 ePropertyDetachOnError,
Greg Clayton67cc0632012-08-22 17:17:09 +00003431 ePropertyDisableASLR,
Greg Clayton1f746072012-08-29 21:13:06 +00003432 ePropertyDisableSTDIO,
Jim Ingham0f063ba2013-03-02 00:26:47 +00003433 ePropertyInlineStrategy,
Jim Ingham17d023f2013-03-13 17:58:04 +00003434 ePropertyDisassemblyFlavor,
Daniel Malead79ae052013-08-07 21:54:09 +00003435 ePropertyUseHexImmediates,
3436 ePropertyHexImmediateStyle,
Enrico Granata2ea43cd2013-05-13 17:03:52 +00003437 ePropertyUseFastStepping,
Enrico Granata97303392013-05-21 00:00:30 +00003438 ePropertyLoadScriptFromSymbolFile,
Greg Claytonfb6621e2013-12-06 21:59:52 +00003439 ePropertyMemoryModuleLoadLevel,
Jason Molendaa4bea722014-02-14 05:06:49 +00003440 ePropertyDisplayExpressionsInCrashlogs,
Enrico Granata560558e2015-02-11 02:35:39 +00003441 ePropertyTrapHandlerNames,
Ewan Crawford78baa192015-05-13 09:18:18 +00003442 ePropertyDisplayRuntimeSupportValues,
3443 ePropertyNonStopModeEnabled
Greg Clayton67cc0632012-08-22 17:17:09 +00003444};
Caroline Ticedaccaa92010-09-20 20:44:43 +00003445
Greg Clayton67cc0632012-08-22 17:17:09 +00003446class TargetOptionValueProperties : public OptionValueProperties
Greg Claytonbfe5f3b2011-02-18 01:44:25 +00003447{
Greg Clayton67cc0632012-08-22 17:17:09 +00003448public:
3449 TargetOptionValueProperties (const ConstString &name) :
3450 OptionValueProperties (name),
3451 m_target (NULL),
3452 m_got_host_env (false)
Caroline Ticedaccaa92010-09-20 20:44:43 +00003453 {
Caroline Ticedaccaa92010-09-20 20:44:43 +00003454 }
Caroline Ticedaccaa92010-09-20 20:44:43 +00003455
Greg Clayton67cc0632012-08-22 17:17:09 +00003456 // This constructor is used when creating TargetOptionValueProperties when it
3457 // is part of a new lldb_private::Target instance. It will copy all current
3458 // global property values as needed
3459 TargetOptionValueProperties (Target *target, const TargetPropertiesSP &target_properties_sp) :
3460 OptionValueProperties(*target_properties_sp->GetValueProperties()),
3461 m_target (target),
3462 m_got_host_env (false)
Caroline Ticedaccaa92010-09-20 20:44:43 +00003463 {
Greg Clayton67cc0632012-08-22 17:17:09 +00003464 }
3465
Eugene Zelenko8f30a652015-10-23 18:39:37 +00003466 const Property *
3467 GetPropertyAtIndex(const ExecutionContext *exe_ctx, bool will_modify, uint32_t idx) const override
Greg Clayton67cc0632012-08-22 17:17:09 +00003468 {
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +00003469 // When getting the value for a key from the target options, we will always
Greg Clayton67cc0632012-08-22 17:17:09 +00003470 // try and grab the setting from the current target if there is one. Else we just
3471 // use the one from this instance.
3472 if (idx == ePropertyEnvVars)
3473 GetHostEnvironmentIfNeeded ();
3474
3475 if (exe_ctx)
3476 {
3477 Target *target = exe_ctx->GetTargetPtr();
3478 if (target)
3479 {
3480 TargetOptionValueProperties *target_properties = static_cast<TargetOptionValueProperties *>(target->GetValueProperties().get());
3481 if (this != target_properties)
3482 return target_properties->ProtectedGetPropertyAtIndex (idx);
3483 }
3484 }
3485 return ProtectedGetPropertyAtIndex (idx);
3486 }
Enrico Granata84a53df2013-05-20 22:29:23 +00003487
3488 lldb::TargetSP
3489 GetTargetSP ()
3490 {
3491 return m_target->shared_from_this();
3492 }
3493
Greg Clayton67cc0632012-08-22 17:17:09 +00003494protected:
Greg Clayton67cc0632012-08-22 17:17:09 +00003495 void
3496 GetHostEnvironmentIfNeeded () const
3497 {
3498 if (!m_got_host_env)
3499 {
3500 if (m_target)
3501 {
3502 m_got_host_env = true;
3503 const uint32_t idx = ePropertyInheritEnv;
3504 if (GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0))
3505 {
3506 PlatformSP platform_sp (m_target->GetPlatform());
3507 if (platform_sp)
3508 {
3509 StringList env;
3510 if (platform_sp->GetEnvironment(env))
3511 {
3512 OptionValueDictionary *env_dict = GetPropertyAtIndexAsOptionValueDictionary (NULL, ePropertyEnvVars);
3513 if (env_dict)
3514 {
3515 const bool can_replace = false;
3516 const size_t envc = env.GetSize();
3517 for (size_t idx=0; idx<envc; idx++)
3518 {
3519 const char *env_entry = env.GetStringAtIndex (idx);
3520 if (env_entry)
3521 {
3522 const char *equal_pos = ::strchr(env_entry, '=');
3523 ConstString key;
3524 // It is ok to have environment variables with no values
3525 const char *value = NULL;
3526 if (equal_pos)
3527 {
3528 key.SetCStringWithLength(env_entry, equal_pos - env_entry);
3529 if (equal_pos[1])
3530 value = equal_pos + 1;
3531 }
3532 else
3533 {
3534 key.SetCString(env_entry);
3535 }
3536 // Don't allow existing keys to be replaced with ones we get from the platform environment
3537 env_dict->SetValueForKey(key, OptionValueSP(new OptionValueString(value)), can_replace);
3538 }
3539 }
3540 }
3541 }
3542 }
3543 }
3544 }
3545 }
3546 }
3547 Target *m_target;
3548 mutable bool m_got_host_env;
3549};
3550
Greg Claytonfbb76342013-11-20 21:07:01 +00003551//----------------------------------------------------------------------
3552// TargetProperties
3553//----------------------------------------------------------------------
Greg Clayton67cc0632012-08-22 17:17:09 +00003554TargetProperties::TargetProperties (Target *target) :
Ilia K8f37ca52015-02-13 14:31:06 +00003555 Properties (),
3556 m_launch_info ()
Greg Clayton67cc0632012-08-22 17:17:09 +00003557{
3558 if (target)
3559 {
3560 m_collection_sp.reset (new TargetOptionValueProperties(target, Target::GetGlobalProperties()));
Ilia K8f37ca52015-02-13 14:31:06 +00003561
3562 // Set callbacks to update launch_info whenever "settins set" updated any of these properties
3563 m_collection_sp->SetValueChangedCallback(ePropertyArg0, TargetProperties::Arg0ValueChangedCallback, this);
3564 m_collection_sp->SetValueChangedCallback(ePropertyRunArgs, TargetProperties::RunArgsValueChangedCallback, this);
3565 m_collection_sp->SetValueChangedCallback(ePropertyEnvVars, TargetProperties::EnvVarsValueChangedCallback, this);
3566 m_collection_sp->SetValueChangedCallback(ePropertyInputPath, TargetProperties::InputPathValueChangedCallback, this);
3567 m_collection_sp->SetValueChangedCallback(ePropertyOutputPath, TargetProperties::OutputPathValueChangedCallback, this);
3568 m_collection_sp->SetValueChangedCallback(ePropertyErrorPath, TargetProperties::ErrorPathValueChangedCallback, this);
3569 m_collection_sp->SetValueChangedCallback(ePropertyDetachOnError, TargetProperties::DetachOnErrorValueChangedCallback, this);
3570 m_collection_sp->SetValueChangedCallback(ePropertyDisableASLR, TargetProperties::DisableASLRValueChangedCallback, this);
3571 m_collection_sp->SetValueChangedCallback(ePropertyDisableSTDIO, TargetProperties::DisableSTDIOValueChangedCallback, this);
3572
3573 // Update m_launch_info once it was created
3574 Arg0ValueChangedCallback(this, NULL);
3575 RunArgsValueChangedCallback(this, NULL);
3576 //EnvVarsValueChangedCallback(this, NULL); // FIXME: cause segfault in Target::GetPlatform()
3577 InputPathValueChangedCallback(this, NULL);
3578 OutputPathValueChangedCallback(this, NULL);
3579 ErrorPathValueChangedCallback(this, NULL);
3580 DetachOnErrorValueChangedCallback(this, NULL);
3581 DisableASLRValueChangedCallback(this, NULL);
3582 DisableSTDIOValueChangedCallback(this, NULL);
Caroline Ticedaccaa92010-09-20 20:44:43 +00003583 }
3584 else
Greg Clayton67cc0632012-08-22 17:17:09 +00003585 {
3586 m_collection_sp.reset (new TargetOptionValueProperties(ConstString("target")));
3587 m_collection_sp->Initialize(g_properties);
3588 m_collection_sp->AppendProperty(ConstString("process"),
3589 ConstString("Settings specify to processes."),
3590 true,
3591 Process::GetGlobalProperties()->GetValueProperties());
3592 }
Caroline Ticedaccaa92010-09-20 20:44:43 +00003593}
3594
Eugene Zelenko8f30a652015-10-23 18:39:37 +00003595TargetProperties::~TargetProperties() = default;
3596
Greg Clayton67cc0632012-08-22 17:17:09 +00003597ArchSpec
3598TargetProperties::GetDefaultArchitecture () const
3599{
3600 OptionValueArch *value = m_collection_sp->GetPropertyAtIndexAsOptionValueArch (NULL, ePropertyDefaultArch);
3601 if (value)
3602 return value->GetCurrentValue();
3603 return ArchSpec();
3604}
3605
3606void
3607TargetProperties::SetDefaultArchitecture (const ArchSpec& arch)
3608{
3609 OptionValueArch *value = m_collection_sp->GetPropertyAtIndexAsOptionValueArch (NULL, ePropertyDefaultArch);
3610 if (value)
3611 return value->SetCurrentValue(arch, true);
3612}
3613
Ilia K055ad9b2015-05-18 13:41:01 +00003614bool
3615TargetProperties::GetMoveToNearestCode() const
3616{
3617 const uint32_t idx = ePropertyMoveToNearestCode;
3618 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3619}
3620
Greg Clayton67cc0632012-08-22 17:17:09 +00003621lldb::DynamicValueType
3622TargetProperties::GetPreferDynamicValue() const
3623{
3624 const uint32_t idx = ePropertyPreferDynamic;
3625 return (lldb::DynamicValueType)m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value);
3626}
3627
3628bool
Greg Clayton15484402015-05-15 18:40:24 +00003629TargetProperties::SetPreferDynamicValue (lldb::DynamicValueType d)
3630{
3631 const uint32_t idx = ePropertyPreferDynamic;
3632 return m_collection_sp->SetPropertyAtIndexAsEnumeration(NULL, idx, d);
3633}
3634
Greg Clayton15484402015-05-15 18:40:24 +00003635bool
Greg Clayton67cc0632012-08-22 17:17:09 +00003636TargetProperties::GetDisableASLR () const
3637{
3638 const uint32_t idx = ePropertyDisableASLR;
3639 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3640}
3641
3642void
3643TargetProperties::SetDisableASLR (bool b)
3644{
3645 const uint32_t idx = ePropertyDisableASLR;
3646 m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b);
3647}
3648
3649bool
Jim Ingham106d0282014-06-25 02:32:56 +00003650TargetProperties::GetDetachOnError () const
3651{
3652 const uint32_t idx = ePropertyDetachOnError;
3653 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3654}
3655
3656void
3657TargetProperties::SetDetachOnError (bool b)
3658{
3659 const uint32_t idx = ePropertyDetachOnError;
3660 m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b);
3661}
3662
3663bool
Greg Clayton67cc0632012-08-22 17:17:09 +00003664TargetProperties::GetDisableSTDIO () const
3665{
3666 const uint32_t idx = ePropertyDisableSTDIO;
3667 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3668}
3669
3670void
3671TargetProperties::SetDisableSTDIO (bool b)
3672{
3673 const uint32_t idx = ePropertyDisableSTDIO;
3674 m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b);
3675}
3676
Jim Ingham0f063ba2013-03-02 00:26:47 +00003677const char *
3678TargetProperties::GetDisassemblyFlavor () const
3679{
3680 const uint32_t idx = ePropertyDisassemblyFlavor;
3681 const char *return_value;
3682
3683 x86DisassemblyFlavor flavor_value = (x86DisassemblyFlavor) m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value);
3684 return_value = g_x86_dis_flavor_value_types[flavor_value].string_value;
3685 return return_value;
3686}
3687
Greg Clayton1f746072012-08-29 21:13:06 +00003688InlineStrategy
3689TargetProperties::GetInlineStrategy () const
3690{
3691 const uint32_t idx = ePropertyInlineStrategy;
3692 return (InlineStrategy)m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value);
3693}
3694
Greg Clayton45392552012-10-17 22:57:12 +00003695const char *
3696TargetProperties::GetArg0 () const
3697{
3698 const uint32_t idx = ePropertyArg0;
3699 return m_collection_sp->GetPropertyAtIndexAsString (NULL, idx, NULL);
3700}
3701
3702void
3703TargetProperties::SetArg0 (const char *arg)
3704{
3705 const uint32_t idx = ePropertyArg0;
3706 m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, arg);
Greg Clayton896e0ec2015-03-26 00:15:24 +00003707 m_launch_info.SetArg0(arg);
Greg Clayton45392552012-10-17 22:57:12 +00003708}
3709
Greg Clayton67cc0632012-08-22 17:17:09 +00003710bool
3711TargetProperties::GetRunArguments (Args &args) const
3712{
3713 const uint32_t idx = ePropertyRunArgs;
3714 return m_collection_sp->GetPropertyAtIndexAsArgs (NULL, idx, args);
3715}
3716
3717void
3718TargetProperties::SetRunArguments (const Args &args)
3719{
3720 const uint32_t idx = ePropertyRunArgs;
3721 m_collection_sp->SetPropertyAtIndexFromArgs (NULL, idx, args);
Greg Clayton896e0ec2015-03-26 00:15:24 +00003722 m_launch_info.GetArguments() = args;
Greg Clayton67cc0632012-08-22 17:17:09 +00003723}
3724
3725size_t
3726TargetProperties::GetEnvironmentAsArgs (Args &env) const
3727{
3728 const uint32_t idx = ePropertyEnvVars;
3729 return m_collection_sp->GetPropertyAtIndexAsArgs (NULL, idx, env);
3730}
3731
Ilia K8f37ca52015-02-13 14:31:06 +00003732void
3733TargetProperties::SetEnvironmentFromArgs (const Args &env)
3734{
3735 const uint32_t idx = ePropertyEnvVars;
3736 m_collection_sp->SetPropertyAtIndexFromArgs (NULL, idx, env);
Greg Clayton896e0ec2015-03-26 00:15:24 +00003737 m_launch_info.GetEnvironmentEntries() = env;
Ilia K8f37ca52015-02-13 14:31:06 +00003738}
3739
Greg Clayton67cc0632012-08-22 17:17:09 +00003740bool
3741TargetProperties::GetSkipPrologue() const
3742{
3743 const uint32_t idx = ePropertySkipPrologue;
3744 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3745}
3746
3747PathMappingList &
3748TargetProperties::GetSourcePathMap () const
3749{
3750 const uint32_t idx = ePropertySourceMap;
3751 OptionValuePathMappings *option_value = m_collection_sp->GetPropertyAtIndexAsOptionValuePathMappings (NULL, false, idx);
3752 assert(option_value);
3753 return option_value->GetCurrentValue();
3754}
3755
3756FileSpecList &
Greg Clayton6920b522012-08-22 18:39:03 +00003757TargetProperties::GetExecutableSearchPaths ()
Greg Clayton67cc0632012-08-22 17:17:09 +00003758{
3759 const uint32_t idx = ePropertyExecutableSearchPaths;
3760 OptionValueFileSpecList *option_value = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList (NULL, false, idx);
3761 assert(option_value);
3762 return option_value->GetCurrentValue();
3763}
3764
Michael Sartaina7499c92013-07-01 19:45:50 +00003765FileSpecList &
3766TargetProperties::GetDebugFileSearchPaths ()
3767{
3768 const uint32_t idx = ePropertyDebugFileSearchPaths;
3769 OptionValueFileSpecList *option_value = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList (NULL, false, idx);
3770 assert(option_value);
3771 return option_value->GetCurrentValue();
3772}
3773
Sean Callanan85054342015-04-03 15:39:47 +00003774FileSpecList &
3775TargetProperties::GetClangModuleSearchPaths ()
3776{
3777 const uint32_t idx = ePropertyClangModuleSearchPaths;
3778 OptionValueFileSpecList *option_value = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList (NULL, false, idx);
3779 assert(option_value);
3780 return option_value->GetCurrentValue();
3781}
3782
Greg Clayton67cc0632012-08-22 17:17:09 +00003783bool
Sean Callananf0c5aeb2015-04-20 16:31:29 +00003784TargetProperties::GetEnableAutoImportClangModules() const
3785{
3786 const uint32_t idx = ePropertyAutoImportClangModules;
3787 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3788}
3789
3790bool
Greg Clayton67cc0632012-08-22 17:17:09 +00003791TargetProperties::GetEnableSyntheticValue () const
3792{
3793 const uint32_t idx = ePropertyEnableSynthetic;
3794 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3795}
3796
3797uint32_t
3798TargetProperties::GetMaximumNumberOfChildrenToDisplay() const
3799{
3800 const uint32_t idx = ePropertyMaxChildrenCount;
3801 return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value);
3802}
3803
3804uint32_t
3805TargetProperties::GetMaximumSizeOfStringSummary() const
3806{
3807 const uint32_t idx = ePropertyMaxSummaryLength;
3808 return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value);
3809}
3810
Enrico Granatad325bf92013-06-04 22:54:16 +00003811uint32_t
3812TargetProperties::GetMaximumMemReadSize () const
3813{
3814 const uint32_t idx = ePropertyMaxMemReadSize;
3815 return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value);
3816}
3817
Greg Clayton67cc0632012-08-22 17:17:09 +00003818FileSpec
3819TargetProperties::GetStandardInputPath () const
3820{
3821 const uint32_t idx = ePropertyInputPath;
3822 return m_collection_sp->GetPropertyAtIndexAsFileSpec (NULL, idx);
3823}
3824
3825void
3826TargetProperties::SetStandardInputPath (const char *p)
3827{
3828 const uint32_t idx = ePropertyInputPath;
3829 m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, p);
3830}
3831
3832FileSpec
3833TargetProperties::GetStandardOutputPath () const
3834{
3835 const uint32_t idx = ePropertyOutputPath;
3836 return m_collection_sp->GetPropertyAtIndexAsFileSpec (NULL, idx);
3837}
3838
3839void
3840TargetProperties::SetStandardOutputPath (const char *p)
3841{
3842 const uint32_t idx = ePropertyOutputPath;
3843 m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, p);
3844}
3845
3846FileSpec
3847TargetProperties::GetStandardErrorPath () const
3848{
3849 const uint32_t idx = ePropertyErrorPath;
3850 return m_collection_sp->GetPropertyAtIndexAsFileSpec(NULL, idx);
3851}
3852
Dawn Perchik23b1dec2015-07-21 22:05:07 +00003853LanguageType
3854TargetProperties::GetLanguage () const
3855{
3856 OptionValueLanguage *value = m_collection_sp->GetPropertyAtIndexAsOptionValueLanguage (NULL, ePropertyLanguage);
3857 if (value)
3858 return value->GetCurrentValue();
3859 return LanguageType();
3860}
3861
Greg Clayton6920b522012-08-22 18:39:03 +00003862const char *
3863TargetProperties::GetExpressionPrefixContentsAsCString ()
3864{
3865 const uint32_t idx = ePropertyExprPrefix;
3866 OptionValueFileSpec *file = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpec (NULL, false, idx);
3867 if (file)
Jim Ingham1e4f4252012-08-22 21:21:16 +00003868 {
Greg Clayton0b0b5122012-08-30 18:15:10 +00003869 const bool null_terminate = true;
3870 DataBufferSP data_sp(file->GetFileContents(null_terminate));
Jim Ingham1e4f4252012-08-22 21:21:16 +00003871 if (data_sp)
3872 return (const char *) data_sp->GetBytes();
3873 }
Greg Clayton6920b522012-08-22 18:39:03 +00003874 return NULL;
3875}
3876
Greg Clayton67cc0632012-08-22 17:17:09 +00003877void
3878TargetProperties::SetStandardErrorPath (const char *p)
3879{
3880 const uint32_t idx = ePropertyErrorPath;
3881 m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, p);
3882}
3883
3884bool
3885TargetProperties::GetBreakpointsConsultPlatformAvoidList ()
3886{
3887 const uint32_t idx = ePropertyBreakpointUseAvoidList;
3888 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3889}
3890
Jim Ingham17d023f2013-03-13 17:58:04 +00003891bool
Daniel Malead79ae052013-08-07 21:54:09 +00003892TargetProperties::GetUseHexImmediates () const
3893{
3894 const uint32_t idx = ePropertyUseHexImmediates;
3895 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3896}
3897
3898bool
Jim Ingham17d023f2013-03-13 17:58:04 +00003899TargetProperties::GetUseFastStepping () const
3900{
3901 const uint32_t idx = ePropertyUseFastStepping;
3902 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3903}
3904
Greg Claytonfb6621e2013-12-06 21:59:52 +00003905bool
3906TargetProperties::GetDisplayExpressionsInCrashlogs () const
3907{
3908 const uint32_t idx = ePropertyDisplayExpressionsInCrashlogs;
3909 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3910}
3911
Enrico Granata397ddd52013-05-21 20:13:34 +00003912LoadScriptFromSymFile
Enrico Granata2ea43cd2013-05-13 17:03:52 +00003913TargetProperties::GetLoadScriptFromSymbolFile () const
3914{
3915 const uint32_t idx = ePropertyLoadScriptFromSymbolFile;
Enrico Granata397ddd52013-05-21 20:13:34 +00003916 return (LoadScriptFromSymFile)m_collection_sp->GetPropertyAtIndexAsEnumeration(NULL, idx, g_properties[idx].default_uint_value);
Enrico Granata2ea43cd2013-05-13 17:03:52 +00003917}
3918
Daniel Malead79ae052013-08-07 21:54:09 +00003919Disassembler::HexImmediateStyle
3920TargetProperties::GetHexImmediateStyle () const
3921{
3922 const uint32_t idx = ePropertyHexImmediateStyle;
3923 return (Disassembler::HexImmediateStyle)m_collection_sp->GetPropertyAtIndexAsEnumeration(NULL, idx, g_properties[idx].default_uint_value);
3924}
3925
Greg Claytonfd814c52013-08-13 01:42:25 +00003926MemoryModuleLoadLevel
3927TargetProperties::GetMemoryModuleLoadLevel() const
3928{
3929 const uint32_t idx = ePropertyMemoryModuleLoadLevel;
3930 return (MemoryModuleLoadLevel)m_collection_sp->GetPropertyAtIndexAsEnumeration(NULL, idx, g_properties[idx].default_uint_value);
3931}
3932
Jason Molendaa4bea722014-02-14 05:06:49 +00003933bool
3934TargetProperties::GetUserSpecifiedTrapHandlerNames (Args &args) const
3935{
3936 const uint32_t idx = ePropertyTrapHandlerNames;
3937 return m_collection_sp->GetPropertyAtIndexAsArgs (NULL, idx, args);
3938}
Greg Claytonfd814c52013-08-13 01:42:25 +00003939
Jason Molendaa4bea722014-02-14 05:06:49 +00003940void
3941TargetProperties::SetUserSpecifiedTrapHandlerNames (const Args &args)
3942{
3943 const uint32_t idx = ePropertyTrapHandlerNames;
3944 m_collection_sp->SetPropertyAtIndexFromArgs (NULL, idx, args);
3945}
Greg Clayton67cc0632012-08-22 17:17:09 +00003946
Enrico Granata560558e2015-02-11 02:35:39 +00003947bool
3948TargetProperties::GetDisplayRuntimeSupportValues () const
3949{
3950 const uint32_t idx = ePropertyDisplayRuntimeSupportValues;
3951 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, false);
3952}
3953
3954void
3955TargetProperties::SetDisplayRuntimeSupportValues (bool b)
3956{
3957 const uint32_t idx = ePropertyDisplayRuntimeSupportValues;
3958 m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b);
3959}
3960
Ewan Crawford78baa192015-05-13 09:18:18 +00003961bool
3962TargetProperties::GetNonStopModeEnabled () const
3963{
3964 const uint32_t idx = ePropertyNonStopModeEnabled;
3965 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, false);
3966}
3967
Ewan Crawfordaa7eda72015-06-24 15:14:26 +00003968void
3969TargetProperties::SetNonStopModeEnabled (bool b)
3970{
3971 const uint32_t idx = ePropertyNonStopModeEnabled;
3972 m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b);
3973}
3974
Ilia K8f37ca52015-02-13 14:31:06 +00003975const ProcessLaunchInfo &
Ilia Kcc39d3f2015-02-13 17:07:55 +00003976TargetProperties::GetProcessLaunchInfo ()
Ilia K8f37ca52015-02-13 14:31:06 +00003977{
Ilia Kcc39d3f2015-02-13 17:07:55 +00003978 m_launch_info.SetArg0(GetArg0()); // FIXME: Arg0 callback doesn't work
Ilia K8f37ca52015-02-13 14:31:06 +00003979 return m_launch_info;
3980}
3981
3982void
3983TargetProperties::SetProcessLaunchInfo(const ProcessLaunchInfo &launch_info)
3984{
3985 m_launch_info = launch_info;
3986 SetArg0(launch_info.GetArg0());
3987 SetRunArguments(launch_info.GetArguments());
3988 SetEnvironmentFromArgs(launch_info.GetEnvironmentEntries());
3989 const FileAction *input_file_action = launch_info.GetFileActionForFD(STDIN_FILENO);
3990 if (input_file_action)
3991 {
3992 const char *input_path = input_file_action->GetPath();
3993 if (input_path)
3994 SetStandardInputPath(input_path);
3995 }
3996 const FileAction *output_file_action = launch_info.GetFileActionForFD(STDOUT_FILENO);
3997 if (output_file_action)
3998 {
3999 const char *output_path = output_file_action->GetPath();
4000 if (output_path)
4001 SetStandardOutputPath(output_path);
4002 }
4003 const FileAction *error_file_action = launch_info.GetFileActionForFD(STDERR_FILENO);
4004 if (error_file_action)
4005 {
4006 const char *error_path = error_file_action->GetPath();
4007 if (error_path)
4008 SetStandardErrorPath(error_path);
4009 }
4010 SetDetachOnError(launch_info.GetFlags().Test(lldb::eLaunchFlagDetachOnError));
4011 SetDisableASLR(launch_info.GetFlags().Test(lldb::eLaunchFlagDisableASLR));
4012 SetDisableSTDIO(launch_info.GetFlags().Test(lldb::eLaunchFlagDisableSTDIO));
4013}
4014
4015void
4016TargetProperties::Arg0ValueChangedCallback(void *target_property_ptr, OptionValue *)
4017{
4018 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
4019 this_->m_launch_info.SetArg0(this_->GetArg0());
4020}
4021
4022void
4023TargetProperties::RunArgsValueChangedCallback(void *target_property_ptr, OptionValue *)
4024{
4025 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
4026 Args args;
4027 if (this_->GetRunArguments(args))
4028 this_->m_launch_info.GetArguments() = args;
4029}
4030
4031void
4032TargetProperties::EnvVarsValueChangedCallback(void *target_property_ptr, OptionValue *)
4033{
4034 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
4035 Args args;
4036 if (this_->GetEnvironmentAsArgs(args))
4037 this_->m_launch_info.GetEnvironmentEntries() = args;
4038}
4039
4040void
4041TargetProperties::InputPathValueChangedCallback(void *target_property_ptr, OptionValue *)
4042{
4043 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
Chaoren Lind3173f32015-05-29 19:52:29 +00004044 this_->m_launch_info.AppendOpenFileAction(STDIN_FILENO, this_->GetStandardInputPath(), true, false);
Ilia K8f37ca52015-02-13 14:31:06 +00004045}
4046
4047void
4048TargetProperties::OutputPathValueChangedCallback(void *target_property_ptr, OptionValue *)
4049{
4050 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
Chaoren Lind3173f32015-05-29 19:52:29 +00004051 this_->m_launch_info.AppendOpenFileAction(STDOUT_FILENO, this_->GetStandardOutputPath(), false, true);
Ilia K8f37ca52015-02-13 14:31:06 +00004052}
4053
4054void
4055TargetProperties::ErrorPathValueChangedCallback(void *target_property_ptr, OptionValue *)
4056{
4057 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
Chaoren Lind3173f32015-05-29 19:52:29 +00004058 this_->m_launch_info.AppendOpenFileAction(STDERR_FILENO, this_->GetStandardErrorPath(), false, true);
Ilia K8f37ca52015-02-13 14:31:06 +00004059}
4060
4061void
4062TargetProperties::DetachOnErrorValueChangedCallback(void *target_property_ptr, OptionValue *)
4063{
4064 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
4065 if (this_->GetDetachOnError())
4066 this_->m_launch_info.GetFlags().Set(lldb::eLaunchFlagDetachOnError);
4067 else
4068 this_->m_launch_info.GetFlags().Clear(lldb::eLaunchFlagDetachOnError);
4069}
4070
4071void
4072TargetProperties::DisableASLRValueChangedCallback(void *target_property_ptr, OptionValue *)
4073{
4074 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
4075 if (this_->GetDisableASLR())
4076 this_->m_launch_info.GetFlags().Set(lldb::eLaunchFlagDisableASLR);
4077 else
4078 this_->m_launch_info.GetFlags().Clear(lldb::eLaunchFlagDisableASLR);
4079}
4080
4081void
4082TargetProperties::DisableSTDIOValueChangedCallback(void *target_property_ptr, OptionValue *)
4083{
4084 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
4085 if (this_->GetDisableSTDIO())
4086 this_->m_launch_info.GetFlags().Set(lldb::eLaunchFlagDisableSTDIO);
4087 else
4088 this_->m_launch_info.GetFlags().Clear(lldb::eLaunchFlagDisableSTDIO);
4089}
Ilia Keb2c19a2015-03-10 21:59:55 +00004090
4091//----------------------------------------------------------------------
4092// Target::TargetEventData
4093//----------------------------------------------------------------------
4094
4095Target::TargetEventData::TargetEventData (const lldb::TargetSP &target_sp) :
4096 EventData (),
4097 m_target_sp (target_sp),
4098 m_module_list ()
4099{
4100}
4101
4102Target::TargetEventData::TargetEventData (const lldb::TargetSP &target_sp, const ModuleList &module_list) :
4103 EventData (),
4104 m_target_sp (target_sp),
4105 m_module_list (module_list)
4106{
4107}
4108
Eugene Zelenko8f30a652015-10-23 18:39:37 +00004109Target::TargetEventData::~TargetEventData() = default;
Ilia Keb2c19a2015-03-10 21:59:55 +00004110
4111const ConstString &
4112Target::TargetEventData::GetFlavorString ()
4113{
4114 static ConstString g_flavor ("Target::TargetEventData");
4115 return g_flavor;
4116}
4117
4118void
4119Target::TargetEventData::Dump (Stream *s) const
4120{
4121}
4122
4123const Target::TargetEventData *
4124Target::TargetEventData::GetEventDataFromEvent (const Event *event_ptr)
4125{
4126 if (event_ptr)
4127 {
4128 const EventData *event_data = event_ptr->GetData();
4129 if (event_data && event_data->GetFlavor() == TargetEventData::GetFlavorString())
4130 return static_cast <const TargetEventData *> (event_ptr->GetData());
4131 }
4132 return NULL;
4133}
4134
4135TargetSP
4136Target::TargetEventData::GetTargetFromEvent (const Event *event_ptr)
4137{
4138 TargetSP target_sp;
4139 const TargetEventData *event_data = GetEventDataFromEvent (event_ptr);
4140 if (event_data)
4141 target_sp = event_data->m_target_sp;
4142 return target_sp;
4143}
4144
4145ModuleList
4146Target::TargetEventData::GetModuleListFromEvent (const Event *event_ptr)
4147{
4148 ModuleList module_list;
4149 const TargetEventData *event_data = GetEventDataFromEvent (event_ptr);
4150 if (event_data)
4151 module_list = event_data->m_module_list;
4152 return module_list;
4153}