blob: aa423fb43ce5e58148391297fba892f6bea68be7 [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),
Sean Callanana3444ff2015-11-10 22:54:42 +000086 m_ast_importer_sp (),
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
Jim Ingham055a08a2015-11-17 03:39:13 +0000420Target::CreateBreakpoint (const 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
Jim Ingham055a08a2015-11-17 03:39:13 +0000427lldb::BreakpointSP
428Target::CreateAddressInModuleBreakpoint (lldb::addr_t file_addr,
429 bool internal,
430 const FileSpec *file_spec,
431 bool request_hardware)
432{
433 SearchFilterSP filter_sp(new SearchFilterForUnconstrainedSearches (shared_from_this()));
434 BreakpointResolverSP resolver_sp (new BreakpointResolverAddress (NULL, file_addr, file_spec));
435 return CreateBreakpoint (filter_sp, resolver_sp, internal, request_hardware, false);
436}
437
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000438BreakpointSP
Jim Ingham87df91b2011-09-23 00:54:11 +0000439Target::CreateBreakpoint (const FileSpecList *containingModules,
440 const FileSpecList *containingSourceFiles,
Greg Claytond16e1e52011-07-12 17:06:17 +0000441 const char *func_name,
442 uint32_t func_name_type_mask,
Dawn Perchik23b1dec2015-07-21 22:05:07 +0000443 LanguageType language,
Jim Inghama8558b62012-05-22 00:12:20 +0000444 LazyBool skip_prologue,
Greg Claytoneb023e72013-10-11 19:48:25 +0000445 bool internal,
446 bool hardware)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000447{
Greg Clayton0c5cd902010-06-28 21:30:43 +0000448 BreakpointSP bp_sp;
449 if (func_name)
450 {
Jim Ingham87df91b2011-09-23 00:54:11 +0000451 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, containingSourceFiles));
Greg Clayton03da4cc2013-04-19 21:31:16 +0000452
453 if (skip_prologue == eLazyBoolCalculate)
454 skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo;
Dawn Perchik23b1dec2015-07-21 22:05:07 +0000455 if (language == lldb::eLanguageTypeUnknown)
456 language = GetLanguage();
Greg Clayton03da4cc2013-04-19 21:31:16 +0000457
Greg Claytond16e1e52011-07-12 17:06:17 +0000458 BreakpointResolverSP resolver_sp (new BreakpointResolverName (NULL,
459 func_name,
460 func_name_type_mask,
Dawn Perchik23b1dec2015-07-21 22:05:07 +0000461 language,
Greg Claytond16e1e52011-07-12 17:06:17 +0000462 Breakpoint::Exact,
Greg Clayton03da4cc2013-04-19 21:31:16 +0000463 skip_prologue));
Jim Ingham1460e4b2014-01-10 23:46:59 +0000464 bp_sp = CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true);
Greg Clayton0c5cd902010-06-28 21:30:43 +0000465 }
466 return bp_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000467}
468
Jim Inghamfab10e82012-03-06 00:37:27 +0000469lldb::BreakpointSP
470Target::CreateBreakpoint (const FileSpecList *containingModules,
Greg Clayton4116e932012-05-15 02:33:01 +0000471 const FileSpecList *containingSourceFiles,
472 const std::vector<std::string> &func_names,
473 uint32_t func_name_type_mask,
Dawn Perchik23b1dec2015-07-21 22:05:07 +0000474 LanguageType language,
Jim Inghama8558b62012-05-22 00:12:20 +0000475 LazyBool skip_prologue,
Greg Claytoneb023e72013-10-11 19:48:25 +0000476 bool internal,
477 bool hardware)
Jim Inghamfab10e82012-03-06 00:37:27 +0000478{
479 BreakpointSP bp_sp;
480 size_t num_names = func_names.size();
481 if (num_names > 0)
482 {
483 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, containingSourceFiles));
Greg Clayton03da4cc2013-04-19 21:31:16 +0000484
485 if (skip_prologue == eLazyBoolCalculate)
486 skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo;
Dawn Perchik23b1dec2015-07-21 22:05:07 +0000487 if (language == lldb::eLanguageTypeUnknown)
488 language = GetLanguage();
Greg Clayton03da4cc2013-04-19 21:31:16 +0000489
490 BreakpointResolverSP resolver_sp (new BreakpointResolverName (NULL,
Jim Inghamfab10e82012-03-06 00:37:27 +0000491 func_names,
492 func_name_type_mask,
Dawn Perchik23b1dec2015-07-21 22:05:07 +0000493 language,
Greg Clayton03da4cc2013-04-19 21:31:16 +0000494 skip_prologue));
Jim Ingham1460e4b2014-01-10 23:46:59 +0000495 bp_sp = CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true);
Jim Inghamfab10e82012-03-06 00:37:27 +0000496 }
497 return bp_sp;
498}
499
Jim Ingham133e0fb2012-03-03 02:05:11 +0000500BreakpointSP
501Target::CreateBreakpoint (const FileSpecList *containingModules,
502 const FileSpecList *containingSourceFiles,
503 const char *func_names[],
504 size_t num_names,
505 uint32_t func_name_type_mask,
Dawn Perchik23b1dec2015-07-21 22:05:07 +0000506 LanguageType language,
Jim Inghama8558b62012-05-22 00:12:20 +0000507 LazyBool skip_prologue,
Greg Claytoneb023e72013-10-11 19:48:25 +0000508 bool internal,
509 bool hardware)
Jim Ingham133e0fb2012-03-03 02:05:11 +0000510{
511 BreakpointSP bp_sp;
512 if (num_names > 0)
513 {
514 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, containingSourceFiles));
515
Greg Clayton03da4cc2013-04-19 21:31:16 +0000516 if (skip_prologue == eLazyBoolCalculate)
517 skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo;
Dawn Perchik23b1dec2015-07-21 22:05:07 +0000518 if (language == lldb::eLanguageTypeUnknown)
519 language = GetLanguage();
520
Greg Clayton03da4cc2013-04-19 21:31:16 +0000521 BreakpointResolverSP resolver_sp (new BreakpointResolverName (NULL,
Jim Ingham133e0fb2012-03-03 02:05:11 +0000522 func_names,
523 num_names,
Jim Inghamfab10e82012-03-06 00:37:27 +0000524 func_name_type_mask,
Dawn Perchik23b1dec2015-07-21 22:05:07 +0000525 language,
Greg Clayton03da4cc2013-04-19 21:31:16 +0000526 skip_prologue));
Jim Ingham1460e4b2014-01-10 23:46:59 +0000527 bp_sp = CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true);
Jim Ingham133e0fb2012-03-03 02:05:11 +0000528 }
529 return bp_sp;
530}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000531
532SearchFilterSP
533Target::GetSearchFilterForModule (const FileSpec *containingModule)
534{
535 SearchFilterSP filter_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000536 if (containingModule != NULL)
537 {
538 // TODO: We should look into sharing module based search filters
539 // across many breakpoints like we do for the simple target based one
Greg Claytone1cd1be2012-01-29 20:56:30 +0000540 filter_sp.reset (new SearchFilterByModule (shared_from_this(), *containingModule));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000541 }
542 else
543 {
544 if (m_search_filter_sp.get() == NULL)
Jim Ingham33df7cd2014-12-06 01:28:03 +0000545 m_search_filter_sp.reset (new SearchFilterForUnconstrainedSearches (shared_from_this()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000546 filter_sp = m_search_filter_sp;
547 }
548 return filter_sp;
549}
550
Jim Ingham969795f2011-09-21 01:17:13 +0000551SearchFilterSP
552Target::GetSearchFilterForModuleList (const FileSpecList *containingModules)
553{
554 SearchFilterSP filter_sp;
Jim Ingham969795f2011-09-21 01:17:13 +0000555 if (containingModules && containingModules->GetSize() != 0)
556 {
557 // TODO: We should look into sharing module based search filters
558 // across many breakpoints like we do for the simple target based one
Greg Claytone1cd1be2012-01-29 20:56:30 +0000559 filter_sp.reset (new SearchFilterByModuleList (shared_from_this(), *containingModules));
Jim Ingham969795f2011-09-21 01:17:13 +0000560 }
561 else
562 {
563 if (m_search_filter_sp.get() == NULL)
Jim Ingham33df7cd2014-12-06 01:28:03 +0000564 m_search_filter_sp.reset (new SearchFilterForUnconstrainedSearches (shared_from_this()));
Jim Ingham969795f2011-09-21 01:17:13 +0000565 filter_sp = m_search_filter_sp;
566 }
567 return filter_sp;
568}
569
Jim Ingham87df91b2011-09-23 00:54:11 +0000570SearchFilterSP
Jim Inghama8558b62012-05-22 00:12:20 +0000571Target::GetSearchFilterForModuleAndCUList (const FileSpecList *containingModules,
572 const FileSpecList *containingSourceFiles)
Jim Ingham87df91b2011-09-23 00:54:11 +0000573{
574 if (containingSourceFiles == NULL || containingSourceFiles->GetSize() == 0)
575 return GetSearchFilterForModuleList(containingModules);
576
577 SearchFilterSP filter_sp;
Jim Ingham87df91b2011-09-23 00:54:11 +0000578 if (containingModules == NULL)
579 {
580 // We could make a special "CU List only SearchFilter". Better yet was if these could be composable,
581 // but that will take a little reworking.
582
Greg Claytone1cd1be2012-01-29 20:56:30 +0000583 filter_sp.reset (new SearchFilterByModuleListAndCU (shared_from_this(), FileSpecList(), *containingSourceFiles));
Jim Ingham87df91b2011-09-23 00:54:11 +0000584 }
585 else
586 {
Greg Claytone1cd1be2012-01-29 20:56:30 +0000587 filter_sp.reset (new SearchFilterByModuleListAndCU (shared_from_this(), *containingModules, *containingSourceFiles));
Jim Ingham87df91b2011-09-23 00:54:11 +0000588 }
589 return filter_sp;
590}
591
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000592BreakpointSP
Jim Ingham87df91b2011-09-23 00:54:11 +0000593Target::CreateFuncRegexBreakpoint (const FileSpecList *containingModules,
Jim Inghama8558b62012-05-22 00:12:20 +0000594 const FileSpecList *containingSourceFiles,
595 RegularExpression &func_regex,
Jim Ingham0fcdac32015-11-06 22:48:59 +0000596 lldb::LanguageType requested_language,
Jim Inghama8558b62012-05-22 00:12:20 +0000597 LazyBool skip_prologue,
Greg Claytoneb023e72013-10-11 19:48:25 +0000598 bool internal,
599 bool hardware)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000600{
Jim Ingham87df91b2011-09-23 00:54:11 +0000601 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, containingSourceFiles));
Saleem Abdulrasoolb5c128b2014-07-23 01:53:52 +0000602 bool skip =
603 (skip_prologue == eLazyBoolCalculate) ? GetSkipPrologue()
604 : static_cast<bool>(skip_prologue);
Greg Claytond16e1e52011-07-12 17:06:17 +0000605 BreakpointResolverSP resolver_sp(new BreakpointResolverName (NULL,
Jim Ingham0fcdac32015-11-06 22:48:59 +0000606 func_regex,
607 requested_language,
Saleem Abdulrasoolb5c128b2014-07-23 01:53:52 +0000608 skip));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000609
Jim Ingham1460e4b2014-01-10 23:46:59 +0000610 return CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000611}
612
Jim Ingham219ba192012-03-05 04:47:34 +0000613lldb::BreakpointSP
Jim Inghama72b31c2015-04-22 19:42:18 +0000614Target::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 +0000615{
Jim Inghama72b31c2015-04-22 19:42:18 +0000616 BreakpointSP exc_bkpt_sp = LanguageRuntime::CreateExceptionBreakpoint (*this, language, catch_bp, throw_bp, internal);
617 if (exc_bkpt_sp && additional_args)
618 {
619 Breakpoint::BreakpointPreconditionSP precondition_sp = exc_bkpt_sp->GetPrecondition();
620 if (precondition_sp && additional_args)
621 {
622 if (error)
623 *error = precondition_sp->ConfigurePrecondition(*additional_args);
624 else
625 precondition_sp->ConfigurePrecondition(*additional_args);
626 }
627 }
628 return exc_bkpt_sp;
Jim Ingham219ba192012-03-05 04:47:34 +0000629}
Jim Inghama72b31c2015-04-22 19:42:18 +0000630
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000631BreakpointSP
Jim Ingham1460e4b2014-01-10 23:46:59 +0000632Target::CreateBreakpoint (SearchFilterSP &filter_sp, BreakpointResolverSP &resolver_sp, bool internal, bool request_hardware, bool resolve_indirect_symbols)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000633{
634 BreakpointSP bp_sp;
635 if (filter_sp && resolver_sp)
636 {
Jim Ingham1460e4b2014-01-10 23:46:59 +0000637 bp_sp.reset(new Breakpoint (*this, filter_sp, resolver_sp, request_hardware, resolve_indirect_symbols));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000638 resolver_sp->SetBreakpoint (bp_sp.get());
Jim Ingham33df7cd2014-12-06 01:28:03 +0000639 AddBreakpoint (bp_sp, internal);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000640 }
Jim Ingham33df7cd2014-12-06 01:28:03 +0000641 return bp_sp;
642}
643
644void
645Target::AddBreakpoint (lldb::BreakpointSP bp_sp, bool internal)
646{
647 if (!bp_sp)
648 return;
649 if (internal)
650 m_internal_breakpoint_list.Add (bp_sp, false);
651 else
652 m_breakpoint_list.Add (bp_sp, true);
653
654 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
655 if (log)
656 {
657 StreamString s;
658 bp_sp->GetDescription(&s, lldb::eDescriptionLevelVerbose);
659 log->Printf ("Target::%s (internal = %s) => break_id = %s\n", __FUNCTION__, bp_sp->IsInternal() ? "yes" : "no", s.GetData());
660 }
661
662 bp_sp->ResolveBreakpoint();
663
664 if (!internal)
Jim Ingham36f3b362010-10-14 23:45:03 +0000665 {
666 m_last_created_breakpoint = bp_sp;
667 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000668}
669
Johnny Chen86364b42011-09-20 23:28:55 +0000670bool
671Target::ProcessIsValid()
672{
673 return (m_process_sp && m_process_sp->IsAlive());
674}
675
Johnny Chenb90827e2012-06-04 23:19:54 +0000676static bool
677CheckIfWatchpointsExhausted(Target *target, Error &error)
678{
679 uint32_t num_supported_hardware_watchpoints;
680 Error rc = target->GetProcessSP()->GetWatchpointSupportInfo(num_supported_hardware_watchpoints);
681 if (rc.Success())
682 {
683 uint32_t num_current_watchpoints = target->GetWatchpointList().GetSize();
684 if (num_current_watchpoints >= num_supported_hardware_watchpoints)
685 error.SetErrorStringWithFormat("number of supported hardware watchpoints (%u) has been reached",
686 num_supported_hardware_watchpoints);
687 }
688 return false;
689}
690
Johnny Chen01a67862011-10-14 00:42:25 +0000691// See also Watchpoint::SetWatchpointType(uint32_t type) and
Johnny Chenab9ee762011-09-14 00:26:03 +0000692// the OptionGroupWatchpoint::WatchType enum type.
Johnny Chen01a67862011-10-14 00:42:25 +0000693WatchpointSP
Greg Claytona1e5dc82015-08-11 22:53:00 +0000694Target::CreateWatchpoint(lldb::addr_t addr, size_t size, const CompilerType *type, uint32_t kind, Error &error)
Johnny Chen887062a2011-09-12 23:38:44 +0000695{
Greg Clayton5160ce52013-03-27 23:08:40 +0000696 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen0c406372011-09-14 20:23:45 +0000697 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000698 log->Printf("Target::%s (addr = 0x%8.8" PRIx64 " size = %" PRIu64 " type = %u)\n",
Jim Inghama7dfb662012-10-23 07:20:06 +0000699 __FUNCTION__, addr, (uint64_t)size, kind);
Johnny Chen0c406372011-09-14 20:23:45 +0000700
Johnny Chen01a67862011-10-14 00:42:25 +0000701 WatchpointSP wp_sp;
Johnny Chen86364b42011-09-20 23:28:55 +0000702 if (!ProcessIsValid())
Johnny Chenb90827e2012-06-04 23:19:54 +0000703 {
704 error.SetErrorString("process is not alive");
Johnny Chen01a67862011-10-14 00:42:25 +0000705 return wp_sp;
Johnny Chenb90827e2012-06-04 23:19:54 +0000706 }
Jim Inghamc6462312013-06-18 21:52:48 +0000707
Johnny Chen45e541f2011-09-14 22:20:15 +0000708 if (addr == LLDB_INVALID_ADDRESS || size == 0)
Johnny Chenb90827e2012-06-04 23:19:54 +0000709 {
710 if (size == 0)
711 error.SetErrorString("cannot set a watchpoint with watch_size of 0");
712 else
Daniel Malead01b2952012-11-29 21:49:15 +0000713 error.SetErrorStringWithFormat("invalid watch address: %" PRIu64, addr);
Johnny Chen01a67862011-10-14 00:42:25 +0000714 return wp_sp;
Johnny Chenb90827e2012-06-04 23:19:54 +0000715 }
Jim Inghamc6462312013-06-18 21:52:48 +0000716
717 if (!LLDB_WATCH_TYPE_IS_VALID(kind))
718 {
719 error.SetErrorStringWithFormat ("invalid watchpoint type: %d", kind);
720 }
Johnny Chen7313a642011-09-13 01:15:36 +0000721
Johnny Chen01a67862011-10-14 00:42:25 +0000722 // Currently we only support one watchpoint per address, with total number
723 // of watchpoints limited by the hardware which the inferior is running on.
Johnny Chen7385a5a2012-05-31 22:56:36 +0000724
725 // Grab the list mutex while doing operations.
Jim Ingham1b5792e2012-12-18 02:03:49 +0000726 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 +0000727 Mutex::Locker locker;
728 this->GetWatchpointList().GetListMutex(locker);
Johnny Chen01a67862011-10-14 00:42:25 +0000729 WatchpointSP matched_sp = m_watchpoint_list.FindByAddress(addr);
Johnny Chen3c532582011-09-13 23:29:31 +0000730 if (matched_sp)
731 {
Johnny Chen0c406372011-09-14 20:23:45 +0000732 size_t old_size = matched_sp->GetByteSize();
Johnny Chen3c532582011-09-13 23:29:31 +0000733 uint32_t old_type =
Johnny Chen0c406372011-09-14 20:23:45 +0000734 (matched_sp->WatchpointRead() ? LLDB_WATCH_TYPE_READ : 0) |
735 (matched_sp->WatchpointWrite() ? LLDB_WATCH_TYPE_WRITE : 0);
Johnny Chen01a67862011-10-14 00:42:25 +0000736 // Return the existing watchpoint if both size and type match.
Jim Inghamc6462312013-06-18 21:52:48 +0000737 if (size == old_size && kind == old_type)
738 {
Johnny Chen01a67862011-10-14 00:42:25 +0000739 wp_sp = matched_sp;
Jim Ingham1b5792e2012-12-18 02:03:49 +0000740 wp_sp->SetEnabled(false, notify);
Jim Inghamc6462312013-06-18 21:52:48 +0000741 }
742 else
743 {
Johnny Chen01a67862011-10-14 00:42:25 +0000744 // Nil the matched watchpoint; we will be creating a new one.
Jim Ingham1b5792e2012-12-18 02:03:49 +0000745 m_process_sp->DisableWatchpoint(matched_sp.get(), notify);
746 m_watchpoint_list.Remove(matched_sp->GetID(), true);
Johnny Chen45e541f2011-09-14 22:20:15 +0000747 }
Johnny Chen3c532582011-09-13 23:29:31 +0000748 }
749
Jason Molenda727e3922012-12-05 23:07:34 +0000750 if (!wp_sp)
751 {
Jim Ingham1b5792e2012-12-18 02:03:49 +0000752 wp_sp.reset(new Watchpoint(*this, addr, size, type));
753 wp_sp->SetWatchpointType(kind, notify);
754 m_watchpoint_list.Add (wp_sp, true);
Johnny Chen45e541f2011-09-14 22:20:15 +0000755 }
Johnny Chen0c406372011-09-14 20:23:45 +0000756
Jim Ingham1b5792e2012-12-18 02:03:49 +0000757 error = m_process_sp->EnableWatchpoint(wp_sp.get(), notify);
Johnny Chen0c406372011-09-14 20:23:45 +0000758 if (log)
Jason Molenda727e3922012-12-05 23:07:34 +0000759 log->Printf("Target::%s (creation of watchpoint %s with id = %u)\n",
760 __FUNCTION__,
761 error.Success() ? "succeeded" : "failed",
762 wp_sp->GetID());
Johnny Chen0c406372011-09-14 20:23:45 +0000763
Jason Molenda727e3922012-12-05 23:07:34 +0000764 if (error.Fail())
765 {
Johnny Chen41b77262012-03-26 22:00:10 +0000766 // Enabling the watchpoint on the device side failed.
767 // Remove the said watchpoint from the list maintained by the target instance.
Jim Ingham1b5792e2012-12-18 02:03:49 +0000768 m_watchpoint_list.Remove (wp_sp->GetID(), true);
Johnny Chenb90827e2012-06-04 23:19:54 +0000769 // See if we could provide more helpful error message.
770 if (!CheckIfWatchpointsExhausted(this, error))
771 {
772 if (!OptionGroupWatchpoint::IsWatchSizeSupported(size))
Greg Clayton6fea17e2014-03-03 19:15:20 +0000773 error.SetErrorStringWithFormat("watch size of %" PRIu64 " is not supported", (uint64_t)size);
Johnny Chenb90827e2012-06-04 23:19:54 +0000774 }
Johnny Chen01a67862011-10-14 00:42:25 +0000775 wp_sp.reset();
Johnny Chen41b77262012-03-26 22:00:10 +0000776 }
Johnny Chen9d954d82011-09-27 20:29:45 +0000777 else
Johnny Chen01a67862011-10-14 00:42:25 +0000778 m_last_created_watchpoint = wp_sp;
779 return wp_sp;
Johnny Chen887062a2011-09-12 23:38:44 +0000780}
781
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000782void
783Target::RemoveAllBreakpoints (bool internal_also)
784{
Greg Clayton5160ce52013-03-27 23:08:40 +0000785 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000786 if (log)
787 log->Printf ("Target::%s (internal_also = %s)\n", __FUNCTION__, internal_also ? "yes" : "no");
788
Greg Clayton9fed0d82010-07-23 23:33:17 +0000789 m_breakpoint_list.RemoveAll (true);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000790 if (internal_also)
Greg Clayton9fed0d82010-07-23 23:33:17 +0000791 m_internal_breakpoint_list.RemoveAll (false);
Jim Ingham36f3b362010-10-14 23:45:03 +0000792
793 m_last_created_breakpoint.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000794}
795
796void
797Target::DisableAllBreakpoints (bool internal_also)
798{
Greg Clayton5160ce52013-03-27 23:08:40 +0000799 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000800 if (log)
801 log->Printf ("Target::%s (internal_also = %s)\n", __FUNCTION__, internal_also ? "yes" : "no");
802
803 m_breakpoint_list.SetEnabledAll (false);
804 if (internal_also)
805 m_internal_breakpoint_list.SetEnabledAll (false);
806}
807
808void
809Target::EnableAllBreakpoints (bool internal_also)
810{
Greg Clayton5160ce52013-03-27 23:08:40 +0000811 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000812 if (log)
813 log->Printf ("Target::%s (internal_also = %s)\n", __FUNCTION__, internal_also ? "yes" : "no");
814
815 m_breakpoint_list.SetEnabledAll (true);
816 if (internal_also)
817 m_internal_breakpoint_list.SetEnabledAll (true);
818}
819
820bool
821Target::RemoveBreakpointByID (break_id_t break_id)
822{
Greg Clayton5160ce52013-03-27 23:08:40 +0000823 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000824 if (log)
825 log->Printf ("Target::%s (break_id = %i, internal = %s)\n", __FUNCTION__, break_id, LLDB_BREAK_ID_IS_INTERNAL (break_id) ? "yes" : "no");
826
827 if (DisableBreakpointByID (break_id))
828 {
829 if (LLDB_BREAK_ID_IS_INTERNAL (break_id))
Greg Clayton9fed0d82010-07-23 23:33:17 +0000830 m_internal_breakpoint_list.Remove(break_id, false);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000831 else
Jim Ingham36f3b362010-10-14 23:45:03 +0000832 {
Greg Claytonaa1c5872011-01-24 23:35:47 +0000833 if (m_last_created_breakpoint)
834 {
835 if (m_last_created_breakpoint->GetID() == break_id)
836 m_last_created_breakpoint.reset();
837 }
Greg Clayton9fed0d82010-07-23 23:33:17 +0000838 m_breakpoint_list.Remove(break_id, true);
Jim Ingham36f3b362010-10-14 23:45:03 +0000839 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000840 return true;
841 }
842 return false;
843}
844
845bool
846Target::DisableBreakpointByID (break_id_t break_id)
847{
Greg Clayton5160ce52013-03-27 23:08:40 +0000848 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000849 if (log)
850 log->Printf ("Target::%s (break_id = %i, internal = %s)\n", __FUNCTION__, break_id, LLDB_BREAK_ID_IS_INTERNAL (break_id) ? "yes" : "no");
851
852 BreakpointSP bp_sp;
853
854 if (LLDB_BREAK_ID_IS_INTERNAL (break_id))
855 bp_sp = m_internal_breakpoint_list.FindBreakpointByID (break_id);
856 else
857 bp_sp = m_breakpoint_list.FindBreakpointByID (break_id);
858 if (bp_sp)
859 {
860 bp_sp->SetEnabled (false);
861 return true;
862 }
863 return false;
864}
865
866bool
867Target::EnableBreakpointByID (break_id_t break_id)
868{
Greg Clayton5160ce52013-03-27 23:08:40 +0000869 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000870 if (log)
871 log->Printf ("Target::%s (break_id = %i, internal = %s)\n",
872 __FUNCTION__,
873 break_id,
874 LLDB_BREAK_ID_IS_INTERNAL (break_id) ? "yes" : "no");
875
876 BreakpointSP bp_sp;
877
878 if (LLDB_BREAK_ID_IS_INTERNAL (break_id))
879 bp_sp = m_internal_breakpoint_list.FindBreakpointByID (break_id);
880 else
881 bp_sp = m_breakpoint_list.FindBreakpointByID (break_id);
882
883 if (bp_sp)
884 {
885 bp_sp->SetEnabled (true);
886 return true;
887 }
888 return false;
889}
890
Johnny Chenedf50372011-09-23 21:21:43 +0000891// The flag 'end_to_end', default to true, signifies that the operation is
892// performed end to end, for both the debugger and the debuggee.
893
Johnny Chen01a67862011-10-14 00:42:25 +0000894// Assumption: Caller holds the list mutex lock for m_watchpoint_list for end
895// to end operations.
Johnny Chen86364b42011-09-20 23:28:55 +0000896bool
Johnny Chen01a67862011-10-14 00:42:25 +0000897Target::RemoveAllWatchpoints (bool end_to_end)
Johnny Chen86364b42011-09-20 23:28:55 +0000898{
Greg Clayton5160ce52013-03-27 23:08:40 +0000899 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen86364b42011-09-20 23:28:55 +0000900 if (log)
901 log->Printf ("Target::%s\n", __FUNCTION__);
902
Johnny Chenedf50372011-09-23 21:21:43 +0000903 if (!end_to_end) {
Jim Ingham1b5792e2012-12-18 02:03:49 +0000904 m_watchpoint_list.RemoveAll(true);
Johnny Chenedf50372011-09-23 21:21:43 +0000905 return true;
906 }
907
908 // Otherwise, it's an end to end operation.
909
Johnny Chen86364b42011-09-20 23:28:55 +0000910 if (!ProcessIsValid())
911 return false;
912
Johnny Chen01a67862011-10-14 00:42:25 +0000913 size_t num_watchpoints = m_watchpoint_list.GetSize();
Johnny Chen86364b42011-09-20 23:28:55 +0000914 for (size_t i = 0; i < num_watchpoints; ++i)
915 {
Johnny Chen01a67862011-10-14 00:42:25 +0000916 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
917 if (!wp_sp)
Johnny Chen86364b42011-09-20 23:28:55 +0000918 return false;
919
Johnny Chen01a67862011-10-14 00:42:25 +0000920 Error rc = m_process_sp->DisableWatchpoint(wp_sp.get());
Johnny Chen86364b42011-09-20 23:28:55 +0000921 if (rc.Fail())
922 return false;
923 }
Jim Ingham1b5792e2012-12-18 02:03:49 +0000924 m_watchpoint_list.RemoveAll (true);
Jim Inghamb0b45132013-07-02 02:09:46 +0000925 m_last_created_watchpoint.reset();
Johnny Chen86364b42011-09-20 23:28:55 +0000926 return true; // Success!
927}
928
Johnny Chen01a67862011-10-14 00:42:25 +0000929// Assumption: Caller holds the list mutex lock for m_watchpoint_list for end to
930// end operations.
Johnny Chen86364b42011-09-20 23:28:55 +0000931bool
Johnny Chen01a67862011-10-14 00:42:25 +0000932Target::DisableAllWatchpoints (bool end_to_end)
Johnny Chen86364b42011-09-20 23:28:55 +0000933{
Greg Clayton5160ce52013-03-27 23:08:40 +0000934 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen86364b42011-09-20 23:28:55 +0000935 if (log)
936 log->Printf ("Target::%s\n", __FUNCTION__);
937
Johnny Chenedf50372011-09-23 21:21:43 +0000938 if (!end_to_end) {
Johnny Chen01a67862011-10-14 00:42:25 +0000939 m_watchpoint_list.SetEnabledAll(false);
Johnny Chenedf50372011-09-23 21:21:43 +0000940 return true;
941 }
942
943 // Otherwise, it's an end to end operation.
944
Johnny Chen86364b42011-09-20 23:28:55 +0000945 if (!ProcessIsValid())
946 return false;
947
Johnny Chen01a67862011-10-14 00:42:25 +0000948 size_t num_watchpoints = m_watchpoint_list.GetSize();
Johnny Chen86364b42011-09-20 23:28:55 +0000949 for (size_t i = 0; i < num_watchpoints; ++i)
950 {
Johnny Chen01a67862011-10-14 00:42:25 +0000951 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
952 if (!wp_sp)
Johnny Chen86364b42011-09-20 23:28:55 +0000953 return false;
954
Johnny Chen01a67862011-10-14 00:42:25 +0000955 Error rc = m_process_sp->DisableWatchpoint(wp_sp.get());
Johnny Chen86364b42011-09-20 23:28:55 +0000956 if (rc.Fail())
957 return false;
958 }
Johnny Chen86364b42011-09-20 23:28:55 +0000959 return true; // Success!
960}
961
Johnny Chen01a67862011-10-14 00:42:25 +0000962// Assumption: Caller holds the list mutex lock for m_watchpoint_list for end to
963// end operations.
Johnny Chen86364b42011-09-20 23:28:55 +0000964bool
Johnny Chen01a67862011-10-14 00:42:25 +0000965Target::EnableAllWatchpoints (bool end_to_end)
Johnny Chen86364b42011-09-20 23:28:55 +0000966{
Greg Clayton5160ce52013-03-27 23:08:40 +0000967 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen86364b42011-09-20 23:28:55 +0000968 if (log)
969 log->Printf ("Target::%s\n", __FUNCTION__);
970
Johnny Chenedf50372011-09-23 21:21:43 +0000971 if (!end_to_end) {
Johnny Chen01a67862011-10-14 00:42:25 +0000972 m_watchpoint_list.SetEnabledAll(true);
Johnny Chenedf50372011-09-23 21:21:43 +0000973 return true;
974 }
975
976 // Otherwise, it's an end to end operation.
977
Johnny Chen86364b42011-09-20 23:28:55 +0000978 if (!ProcessIsValid())
979 return false;
980
Johnny Chen01a67862011-10-14 00:42:25 +0000981 size_t num_watchpoints = m_watchpoint_list.GetSize();
Johnny Chen86364b42011-09-20 23:28:55 +0000982 for (size_t i = 0; i < num_watchpoints; ++i)
983 {
Johnny Chen01a67862011-10-14 00:42:25 +0000984 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
985 if (!wp_sp)
Johnny Chen86364b42011-09-20 23:28:55 +0000986 return false;
987
Johnny Chen01a67862011-10-14 00:42:25 +0000988 Error rc = m_process_sp->EnableWatchpoint(wp_sp.get());
Johnny Chen86364b42011-09-20 23:28:55 +0000989 if (rc.Fail())
990 return false;
991 }
Johnny Chen86364b42011-09-20 23:28:55 +0000992 return true; // Success!
993}
994
Johnny Chena4d6bc92012-02-25 06:44:30 +0000995// Assumption: Caller holds the list mutex lock for m_watchpoint_list.
996bool
997Target::ClearAllWatchpointHitCounts ()
998{
Greg Clayton5160ce52013-03-27 23:08:40 +0000999 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chena4d6bc92012-02-25 06:44:30 +00001000 if (log)
1001 log->Printf ("Target::%s\n", __FUNCTION__);
1002
1003 size_t num_watchpoints = m_watchpoint_list.GetSize();
1004 for (size_t i = 0; i < num_watchpoints; ++i)
1005 {
1006 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
1007 if (!wp_sp)
1008 return false;
1009
1010 wp_sp->ResetHitCount();
1011 }
1012 return true; // Success!
1013}
1014
Enrico Granata5e3fe042015-02-11 00:37:54 +00001015// Assumption: Caller holds the list mutex lock for m_watchpoint_list.
1016bool
1017Target::ClearAllWatchpointHistoricValues ()
1018{
1019 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
1020 if (log)
1021 log->Printf ("Target::%s\n", __FUNCTION__);
1022
1023 size_t num_watchpoints = m_watchpoint_list.GetSize();
1024 for (size_t i = 0; i < num_watchpoints; ++i)
1025 {
1026 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
1027 if (!wp_sp)
1028 return false;
1029
1030 wp_sp->ResetHistoricValues();
1031 }
1032 return true; // Success!
1033}
1034
Johnny Chen01a67862011-10-14 00:42:25 +00001035// Assumption: Caller holds the list mutex lock for m_watchpoint_list
Johnny Chen6cc60e82011-10-05 21:35:46 +00001036// during these operations.
1037bool
Johnny Chen01a67862011-10-14 00:42:25 +00001038Target::IgnoreAllWatchpoints (uint32_t ignore_count)
Johnny Chen6cc60e82011-10-05 21:35:46 +00001039{
Greg Clayton5160ce52013-03-27 23:08:40 +00001040 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen6cc60e82011-10-05 21:35:46 +00001041 if (log)
1042 log->Printf ("Target::%s\n", __FUNCTION__);
1043
1044 if (!ProcessIsValid())
1045 return false;
1046
Johnny Chen01a67862011-10-14 00:42:25 +00001047 size_t num_watchpoints = m_watchpoint_list.GetSize();
Johnny Chen6cc60e82011-10-05 21:35:46 +00001048 for (size_t i = 0; i < num_watchpoints; ++i)
1049 {
Johnny Chen01a67862011-10-14 00:42:25 +00001050 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
1051 if (!wp_sp)
Johnny Chen6cc60e82011-10-05 21:35:46 +00001052 return false;
1053
Johnny Chen01a67862011-10-14 00:42:25 +00001054 wp_sp->SetIgnoreCount(ignore_count);
Johnny Chen6cc60e82011-10-05 21:35:46 +00001055 }
1056 return true; // Success!
1057}
1058
Johnny Chen01a67862011-10-14 00:42:25 +00001059// Assumption: Caller holds the list mutex lock for m_watchpoint_list.
Johnny Chen86364b42011-09-20 23:28:55 +00001060bool
Johnny Chen01a67862011-10-14 00:42:25 +00001061Target::DisableWatchpointByID (lldb::watch_id_t watch_id)
Johnny Chen86364b42011-09-20 23:28:55 +00001062{
Greg Clayton5160ce52013-03-27 23:08:40 +00001063 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen86364b42011-09-20 23:28:55 +00001064 if (log)
1065 log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
1066
1067 if (!ProcessIsValid())
1068 return false;
1069
Johnny Chen01a67862011-10-14 00:42:25 +00001070 WatchpointSP wp_sp = m_watchpoint_list.FindByID (watch_id);
1071 if (wp_sp)
Johnny Chen86364b42011-09-20 23:28:55 +00001072 {
Johnny Chen01a67862011-10-14 00:42:25 +00001073 Error rc = m_process_sp->DisableWatchpoint(wp_sp.get());
Johnny Chenf04ee932011-09-22 18:04:58 +00001074 if (rc.Success())
1075 return true;
Johnny Chen86364b42011-09-20 23:28:55 +00001076
Johnny Chenf04ee932011-09-22 18:04:58 +00001077 // Else, fallthrough.
Johnny Chen86364b42011-09-20 23:28:55 +00001078 }
1079 return false;
1080}
1081
Johnny Chen01a67862011-10-14 00:42:25 +00001082// Assumption: Caller holds the list mutex lock for m_watchpoint_list.
Johnny Chen86364b42011-09-20 23:28:55 +00001083bool
Johnny Chen01a67862011-10-14 00:42:25 +00001084Target::EnableWatchpointByID (lldb::watch_id_t watch_id)
Johnny Chen86364b42011-09-20 23:28:55 +00001085{
Greg Clayton5160ce52013-03-27 23:08:40 +00001086 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen86364b42011-09-20 23:28:55 +00001087 if (log)
1088 log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
1089
1090 if (!ProcessIsValid())
1091 return false;
1092
Johnny Chen01a67862011-10-14 00:42:25 +00001093 WatchpointSP wp_sp = m_watchpoint_list.FindByID (watch_id);
1094 if (wp_sp)
Johnny Chen86364b42011-09-20 23:28:55 +00001095 {
Johnny Chen01a67862011-10-14 00:42:25 +00001096 Error rc = m_process_sp->EnableWatchpoint(wp_sp.get());
Johnny Chenf04ee932011-09-22 18:04:58 +00001097 if (rc.Success())
1098 return true;
Johnny Chen86364b42011-09-20 23:28:55 +00001099
Johnny Chenf04ee932011-09-22 18:04:58 +00001100 // Else, fallthrough.
Johnny Chen86364b42011-09-20 23:28:55 +00001101 }
1102 return false;
1103}
1104
Johnny Chen01a67862011-10-14 00:42:25 +00001105// Assumption: Caller holds the list mutex lock for m_watchpoint_list.
Johnny Chen86364b42011-09-20 23:28:55 +00001106bool
Johnny Chen01a67862011-10-14 00:42:25 +00001107Target::RemoveWatchpointByID (lldb::watch_id_t watch_id)
Johnny Chen86364b42011-09-20 23:28:55 +00001108{
Greg Clayton5160ce52013-03-27 23:08:40 +00001109 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen86364b42011-09-20 23:28:55 +00001110 if (log)
1111 log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
1112
Jim Inghamb0b45132013-07-02 02:09:46 +00001113 WatchpointSP watch_to_remove_sp = m_watchpoint_list.FindByID(watch_id);
1114 if (watch_to_remove_sp == m_last_created_watchpoint)
1115 m_last_created_watchpoint.reset();
1116
Johnny Chen01a67862011-10-14 00:42:25 +00001117 if (DisableWatchpointByID (watch_id))
Johnny Chen86364b42011-09-20 23:28:55 +00001118 {
Jim Ingham1b5792e2012-12-18 02:03:49 +00001119 m_watchpoint_list.Remove(watch_id, true);
Johnny Chen86364b42011-09-20 23:28:55 +00001120 return true;
1121 }
1122 return false;
1123}
1124
Johnny Chen01a67862011-10-14 00:42:25 +00001125// Assumption: Caller holds the list mutex lock for m_watchpoint_list.
Johnny Chen6cc60e82011-10-05 21:35:46 +00001126bool
Johnny Chen01a67862011-10-14 00:42:25 +00001127Target::IgnoreWatchpointByID (lldb::watch_id_t watch_id, uint32_t ignore_count)
Johnny Chen6cc60e82011-10-05 21:35:46 +00001128{
Greg Clayton5160ce52013-03-27 23:08:40 +00001129 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
Johnny Chen6cc60e82011-10-05 21:35:46 +00001130 if (log)
1131 log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
1132
1133 if (!ProcessIsValid())
1134 return false;
1135
Johnny Chen01a67862011-10-14 00:42:25 +00001136 WatchpointSP wp_sp = m_watchpoint_list.FindByID (watch_id);
1137 if (wp_sp)
Johnny Chen6cc60e82011-10-05 21:35:46 +00001138 {
Johnny Chen01a67862011-10-14 00:42:25 +00001139 wp_sp->SetIgnoreCount(ignore_count);
Johnny Chen6cc60e82011-10-05 21:35:46 +00001140 return true;
1141 }
1142 return false;
1143}
1144
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001145ModuleSP
1146Target::GetExecutableModule ()
1147{
Aidan Doddsc0c83852015-05-08 09:36:31 +00001148 // search for the first executable in the module list
1149 for (size_t i = 0; i < m_images.GetSize(); ++i)
1150 {
1151 ModuleSP module_sp = m_images.GetModuleAtIndex (i);
1152 lldb_private::ObjectFile * obj = module_sp->GetObjectFile();
1153 if (obj == nullptr)
1154 continue;
1155 if (obj->GetType() == ObjectFile::Type::eTypeExecutable)
1156 return module_sp;
1157 }
1158 // as fall back return the first module loaded
1159 return m_images.GetModuleAtIndex (0);
Greg Claytonaa149cb2011-08-11 02:48:45 +00001160}
1161
1162Module*
1163Target::GetExecutableModulePointer ()
1164{
Aidan Doddsc0c83852015-05-08 09:36:31 +00001165 return GetExecutableModule().get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001166}
1167
Enrico Granata17598482012-11-08 02:22:02 +00001168static void
1169LoadScriptingResourceForModule (const ModuleSP &module_sp, Target *target)
1170{
1171 Error error;
Enrico Granata97303392013-05-21 00:00:30 +00001172 StreamString feedback_stream;
1173 if (module_sp && !module_sp->LoadScriptingResourceInTarget(target, error, &feedback_stream))
Enrico Granata17598482012-11-08 02:22:02 +00001174 {
Enrico Granata97303392013-05-21 00:00:30 +00001175 if (error.AsCString())
Greg Clayton44d93782014-01-27 23:43:24 +00001176 target->GetDebugger().GetErrorFile()->Printf("unable to load scripting data for module %s - error reported was %s\n",
Enrico Granata97303392013-05-21 00:00:30 +00001177 module_sp->GetFileSpec().GetFileNameStrippingExtension().GetCString(),
1178 error.AsCString());
Enrico Granata17598482012-11-08 02:22:02 +00001179 }
Enrico Granatafe7295d2014-08-16 00:32:58 +00001180 if (feedback_stream.GetSize())
1181 target->GetDebugger().GetErrorFile()->Printf("%s\n",
1182 feedback_stream.GetData());
Enrico Granata17598482012-11-08 02:22:02 +00001183}
1184
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001185void
Greg Claytonb35db632013-11-09 00:03:31 +00001186Target::ClearModules(bool delete_locations)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001187{
Greg Claytonb35db632013-11-09 00:03:31 +00001188 ModulesDidUnload (m_images, delete_locations);
Greg Claytond5944cd2013-12-06 01:12:00 +00001189 m_section_load_history.Clear();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001190 m_images.Clear();
Greg Clayton5beec212015-10-08 21:04:34 +00001191 m_scratch_type_system_map.Clear();
Sean Callanana3444ff2015-11-10 22:54:42 +00001192 m_ast_importer_sp.reset();
Greg Clayton095eeaa2013-11-05 23:28:00 +00001193}
1194
1195void
Greg Claytonb35db632013-11-09 00:03:31 +00001196Target::DidExec ()
1197{
1198 // When a process exec's we need to know about it so we can do some cleanup.
1199 m_breakpoint_list.RemoveInvalidLocations(m_arch);
1200 m_internal_breakpoint_list.RemoveInvalidLocations(m_arch);
1201}
1202
1203void
Greg Clayton095eeaa2013-11-05 23:28:00 +00001204Target::SetExecutableModule (ModuleSP& executable_sp, bool get_dependent_files)
1205{
1206 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TARGET));
Greg Claytonb35db632013-11-09 00:03:31 +00001207 ClearModules(false);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001208
1209 if (executable_sp.get())
1210 {
1211 Timer scoped_timer (__PRETTY_FUNCTION__,
Greg Claytonb5ad4ec2013-04-29 17:25:54 +00001212 "Target::SetExecutableModule (executable = '%s')",
1213 executable_sp->GetFileSpec().GetPath().c_str());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001214
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +00001215 m_images.Append(executable_sp); // The first image is our executable file
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001216
Jim Ingham5aee1622010-08-09 23:31:02 +00001217 // 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 +00001218 if (!m_arch.IsValid())
Jason Molendae1b68ad2012-12-05 00:25:49 +00001219 {
Greg Clayton32e0a752011-03-30 18:16:51 +00001220 m_arch = executable_sp->GetArchitecture();
Jason Molendae1b68ad2012-12-05 00:25:49 +00001221 if (log)
1222 log->Printf ("Target::SetExecutableModule setting architecture to %s (%s) based on executable file", m_arch.GetArchitectureName(), m_arch.GetTriple().getTriple().c_str());
1223 }
1224
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001225 FileSpecList dependent_files;
Greg Claytone996fd32011-03-08 22:40:15 +00001226 ObjectFile *executable_objfile = executable_sp->GetObjectFile();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001227
Greg Claytoncac9c5f2011-09-24 00:52:29 +00001228 if (executable_objfile && get_dependent_files)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001229 {
1230 executable_objfile->GetDependentModules(dependent_files);
1231 for (uint32_t i=0; i<dependent_files.GetSize(); i++)
1232 {
Greg Claytonded470d2011-03-19 01:12:21 +00001233 FileSpec dependent_file_spec (dependent_files.GetFileSpecPointerAtIndex(i));
1234 FileSpec platform_dependent_file_spec;
1235 if (m_platform_sp)
Steve Puccifc995722014-01-17 18:18:31 +00001236 m_platform_sp->GetFileWithUUID (dependent_file_spec, NULL, platform_dependent_file_spec);
Greg Claytonded470d2011-03-19 01:12:21 +00001237 else
1238 platform_dependent_file_spec = dependent_file_spec;
1239
Greg Claytonb9a01b32012-02-26 05:51:37 +00001240 ModuleSpec module_spec (platform_dependent_file_spec, m_arch);
1241 ModuleSP image_module_sp(GetSharedModule (module_spec));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001242 if (image_module_sp.get())
1243 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001244 ObjectFile *objfile = image_module_sp->GetObjectFile();
1245 if (objfile)
1246 objfile->GetDependentModules(dependent_files);
1247 }
1248 }
1249 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001250 }
1251}
1252
Jim Ingham5aee1622010-08-09 23:31:02 +00001253bool
1254Target::SetArchitecture (const ArchSpec &arch_spec)
1255{
Greg Clayton5160ce52013-03-27 23:08:40 +00001256 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TARGET));
Jason Molendadad8af42015-11-10 04:11:37 +00001257 bool missing_local_arch = (false == m_arch.IsValid());
1258 bool replace_local_arch = true;
1259 bool compatible_local_arch = false;
1260 ArchSpec other(arch_spec);
1261
1262 if (!missing_local_arch)
Jim Ingham5aee1622010-08-09 23:31:02 +00001263 {
Jason Molendadad8af42015-11-10 04:11:37 +00001264 if (m_arch.IsCompatibleMatch(arch_spec))
1265 {
1266 other.MergeFrom(m_arch);
1267
1268 if (m_arch.IsCompatibleMatch(other))
1269 {
1270 compatible_local_arch = true;
1271 bool arch_changed, vendor_changed, os_changed, os_ver_changed, env_changed;
1272
1273 m_arch.PiecewiseTripleCompare(other,
1274 arch_changed,
1275 vendor_changed,
1276 os_changed,
1277 os_ver_changed,
1278 env_changed);
1279
1280 if (!arch_changed && !vendor_changed && !os_changed)
1281 replace_local_arch = false;
1282 }
1283 }
1284 }
1285
1286 if (compatible_local_arch || missing_local_arch)
1287 {
1288 // If we haven't got a valid arch spec, or the architectures are compatible
1289 // update the architecture, unless the one we already have is more specified
1290 if (replace_local_arch)
1291 m_arch = other;
Jason Molendae1b68ad2012-12-05 00:25:49 +00001292 if (log)
Jason Molendadad8af42015-11-10 04:11:37 +00001293 log->Printf ("Target::SetArchitecture set architecture to %s (%s)", m_arch.GetArchitectureName(), m_arch.GetTriple().getTriple().c_str());
Jim Ingham5aee1622010-08-09 23:31:02 +00001294 return true;
1295 }
Jason Molendadad8af42015-11-10 04:11:37 +00001296
1297 // If we have an executable file, try to reset the executable to the desired architecture
1298 if (log)
1299 log->Printf ("Target::SetArchitecture changing architecture to %s (%s)", arch_spec.GetArchitectureName(), arch_spec.GetTriple().getTriple().c_str());
1300 m_arch = other;
1301 ModuleSP executable_sp = GetExecutableModule ();
Greg Clayton095eeaa2013-11-05 23:28:00 +00001302
Jason Molendadad8af42015-11-10 04:11:37 +00001303 ClearModules(true);
1304 // Need to do something about unsetting breakpoints.
1305
1306 if (executable_sp)
1307 {
1308 if (log)
1309 log->Printf("Target::SetArchitecture Trying to select executable file architecture %s (%s)", arch_spec.GetArchitectureName(), arch_spec.GetTriple().getTriple().c_str());
1310 ModuleSpec module_spec (executable_sp->GetFileSpec(), other);
1311 Error error = ModuleList::GetSharedModule (module_spec,
1312 executable_sp,
1313 &GetExecutableSearchPaths(),
1314 NULL,
1315 NULL);
1316
1317 if (!error.Fail() && executable_sp)
Jim Ingham5aee1622010-08-09 23:31:02 +00001318 {
Jason Molendadad8af42015-11-10 04:11:37 +00001319 SetExecutableModule (executable_sp, true);
1320 return true;
Jim Ingham5aee1622010-08-09 23:31:02 +00001321 }
1322 }
Greg Clayton70512312012-05-08 01:45:38 +00001323 return false;
Jim Ingham5aee1622010-08-09 23:31:02 +00001324}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001325
Tamas Berghammere9f4dfe2015-03-13 10:32:42 +00001326bool
1327Target::MergeArchitecture (const ArchSpec &arch_spec)
1328{
1329 if (arch_spec.IsValid())
1330 {
1331 if (m_arch.IsCompatibleMatch(arch_spec))
1332 {
1333 // The current target arch is compatible with "arch_spec", see if we
1334 // can improve our current architecture using bits from "arch_spec"
1335
1336 // Merge bits from arch_spec into "merged_arch" and set our architecture
1337 ArchSpec merged_arch (m_arch);
1338 merged_arch.MergeFrom (arch_spec);
1339 return SetArchitecture(merged_arch);
1340 }
1341 else
1342 {
1343 // The new architecture is different, we just need to replace it
1344 return SetArchitecture(arch_spec);
1345 }
1346 }
1347 return false;
1348}
1349
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001350void
Enrico Granataefe637d2012-11-08 19:16:03 +00001351Target::WillClearList (const ModuleList& module_list)
Enrico Granata17598482012-11-08 02:22:02 +00001352{
1353}
1354
1355void
Enrico Granataefe637d2012-11-08 19:16:03 +00001356Target::ModuleAdded (const ModuleList& module_list, const ModuleSP &module_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001357{
1358 // A module is being added to this target for the first time
Greg Clayton23f8c952014-03-24 23:10:19 +00001359 if (m_valid)
1360 {
1361 ModuleList my_module_list;
1362 my_module_list.Append(module_sp);
1363 LoadScriptingResourceForModule(module_sp, this);
1364 ModulesDidLoad (my_module_list);
1365 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001366}
1367
1368void
Enrico Granataefe637d2012-11-08 19:16:03 +00001369Target::ModuleRemoved (const ModuleList& module_list, const ModuleSP &module_sp)
Enrico Granata17598482012-11-08 02:22:02 +00001370{
Adrian McCarthy6ecdbc82015-10-15 22:39:55 +00001371 // A module is being removed from this target.
Greg Clayton23f8c952014-03-24 23:10:19 +00001372 if (m_valid)
1373 {
1374 ModuleList my_module_list;
1375 my_module_list.Append(module_sp);
1376 ModulesDidUnload (my_module_list, false);
1377 }
Enrico Granata17598482012-11-08 02:22:02 +00001378}
1379
1380void
Enrico Granataefe637d2012-11-08 19:16:03 +00001381Target::ModuleUpdated (const ModuleList& module_list, const ModuleSP &old_module_sp, const ModuleSP &new_module_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001382{
Jim Inghame716ae02011-08-03 01:00:06 +00001383 // A module is replacing an already added module
Greg Clayton23f8c952014-03-24 23:10:19 +00001384 if (m_valid)
Jason Molendad91c3fd2015-11-10 04:18:12 +00001385 {
Greg Clayton23f8c952014-03-24 23:10:19 +00001386 m_breakpoint_list.UpdateBreakpointsWhenModuleIsReplaced(old_module_sp, new_module_sp);
Jason Molendad91c3fd2015-11-10 04:18:12 +00001387 m_internal_breakpoint_list.UpdateBreakpointsWhenModuleIsReplaced(old_module_sp, new_module_sp);
1388 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001389}
1390
1391void
1392Target::ModulesDidLoad (ModuleList &module_list)
1393{
Greg Clayton23f8c952014-03-24 23:10:19 +00001394 if (m_valid && module_list.GetSize())
Enrico Granata17598482012-11-08 02:22:02 +00001395 {
Greg Clayton095eeaa2013-11-05 23:28:00 +00001396 m_breakpoint_list.UpdateBreakpoints (module_list, true, false);
Jason Molendad91c3fd2015-11-10 04:18:12 +00001397 m_internal_breakpoint_list.UpdateBreakpoints (module_list, true, false);
Jason Molendaeef51062013-11-05 03:57:19 +00001398 if (m_process_sp)
1399 {
Andrew MacPhersoneb4d0602014-03-13 09:37:02 +00001400 m_process_sp->ModulesDidLoad (module_list);
Jason Molendaeef51062013-11-05 03:57:19 +00001401 }
Ilia Keb2c19a2015-03-10 21:59:55 +00001402 BroadcastEvent (eBroadcastBitModulesLoaded, new TargetEventData (this->shared_from_this(), module_list));
Enrico Granata17598482012-11-08 02:22:02 +00001403 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001404}
1405
1406void
Enrico Granataf15ee4e2013-04-05 18:49:06 +00001407Target::SymbolsDidLoad (ModuleList &module_list)
1408{
Greg Clayton23f8c952014-03-24 23:10:19 +00001409 if (m_valid && module_list.GetSize())
Enrico Granataf15ee4e2013-04-05 18:49:06 +00001410 {
Jim Ingham31caf982013-06-04 23:01:35 +00001411 if (m_process_sp)
Enrico Granataf15ee4e2013-04-05 18:49:06 +00001412 {
Jim Ingham31caf982013-06-04 23:01:35 +00001413 LanguageRuntime* runtime = m_process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC);
1414 if (runtime)
1415 {
1416 ObjCLanguageRuntime *objc_runtime = (ObjCLanguageRuntime*)runtime;
1417 objc_runtime->SymbolsDidLoad(module_list);
1418 }
Enrico Granataf15ee4e2013-04-05 18:49:06 +00001419 }
Jim Ingham31caf982013-06-04 23:01:35 +00001420
Greg Clayton095eeaa2013-11-05 23:28:00 +00001421 m_breakpoint_list.UpdateBreakpoints (module_list, true, false);
Jason Molendad91c3fd2015-11-10 04:18:12 +00001422 m_internal_breakpoint_list.UpdateBreakpoints (module_list, true, false);
Ilia Keb2c19a2015-03-10 21:59:55 +00001423 BroadcastEvent (eBroadcastBitSymbolsLoaded, new TargetEventData (this->shared_from_this(), module_list));
Enrico Granataf15ee4e2013-04-05 18:49:06 +00001424 }
Enrico Granataf15ee4e2013-04-05 18:49:06 +00001425}
1426
1427void
Greg Clayton095eeaa2013-11-05 23:28:00 +00001428Target::ModulesDidUnload (ModuleList &module_list, bool delete_locations)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001429{
Greg Clayton23f8c952014-03-24 23:10:19 +00001430 if (m_valid && module_list.GetSize())
Enrico Granata17598482012-11-08 02:22:02 +00001431 {
Greg Clayton8012cad2014-11-17 19:39:20 +00001432 UnloadModuleSections (module_list);
Greg Clayton095eeaa2013-11-05 23:28:00 +00001433 m_breakpoint_list.UpdateBreakpoints (module_list, false, delete_locations);
Jason Molendad91c3fd2015-11-10 04:18:12 +00001434 m_internal_breakpoint_list.UpdateBreakpoints (module_list, false, delete_locations);
Ilia Keb2c19a2015-03-10 21:59:55 +00001435 BroadcastEvent (eBroadcastBitModulesUnloaded, new TargetEventData (this->shared_from_this(), module_list));
Enrico Granata17598482012-11-08 02:22:02 +00001436 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001437}
1438
Daniel Dunbarf9f70322011-10-31 22:50:37 +00001439bool
Jim Ingham33df7cd2014-12-06 01:28:03 +00001440Target::ModuleIsExcludedForUnconstrainedSearches (const FileSpec &module_file_spec)
Jim Inghamc6674fd2011-10-28 23:14:11 +00001441{
Greg Clayton67cc0632012-08-22 17:17:09 +00001442 if (GetBreakpointsConsultPlatformAvoidList())
Jim Inghamc6674fd2011-10-28 23:14:11 +00001443 {
1444 ModuleList matchingModules;
Greg Claytonb9a01b32012-02-26 05:51:37 +00001445 ModuleSpec module_spec (module_file_spec);
1446 size_t num_modules = GetImages().FindModules(module_spec, matchingModules);
Jim Inghamc6674fd2011-10-28 23:14:11 +00001447
1448 // If there is more than one module for this file spec, only return true if ALL the modules are on the
1449 // black list.
1450 if (num_modules > 0)
1451 {
Andy Gibbsa297a972013-06-19 19:04:53 +00001452 for (size_t i = 0; i < num_modules; i++)
Jim Inghamc6674fd2011-10-28 23:14:11 +00001453 {
Jim Ingham33df7cd2014-12-06 01:28:03 +00001454 if (!ModuleIsExcludedForUnconstrainedSearches (matchingModules.GetModuleAtIndex(i)))
Jim Inghamc6674fd2011-10-28 23:14:11 +00001455 return false;
1456 }
1457 return true;
1458 }
Jim Inghamc6674fd2011-10-28 23:14:11 +00001459 }
Greg Clayton67cc0632012-08-22 17:17:09 +00001460 return false;
Jim Inghamc6674fd2011-10-28 23:14:11 +00001461}
1462
Daniel Dunbarf9f70322011-10-31 22:50:37 +00001463bool
Jim Ingham33df7cd2014-12-06 01:28:03 +00001464Target::ModuleIsExcludedForUnconstrainedSearches (const lldb::ModuleSP &module_sp)
Jim Inghamc6674fd2011-10-28 23:14:11 +00001465{
Greg Clayton67cc0632012-08-22 17:17:09 +00001466 if (GetBreakpointsConsultPlatformAvoidList())
Jim Inghamc6674fd2011-10-28 23:14:11 +00001467 {
Greg Clayton67cc0632012-08-22 17:17:09 +00001468 if (m_platform_sp)
Jim Ingham33df7cd2014-12-06 01:28:03 +00001469 return m_platform_sp->ModuleIsExcludedForUnconstrainedSearches (*this, module_sp);
Jim Inghamc6674fd2011-10-28 23:14:11 +00001470 }
Greg Clayton67cc0632012-08-22 17:17:09 +00001471 return false;
Jim Inghamc6674fd2011-10-28 23:14:11 +00001472}
1473
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001474size_t
Greg Claytondb598232011-01-07 01:57:07 +00001475Target::ReadMemoryFromFileCache (const Address& addr, void *dst, size_t dst_len, Error &error)
1476{
Greg Claytone72dfb32012-02-24 01:59:29 +00001477 SectionSP section_sp (addr.GetSection());
1478 if (section_sp)
Greg Claytondb598232011-01-07 01:57:07 +00001479 {
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +00001480 // 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 +00001481 if (section_sp->IsEncrypted())
1482 {
Greg Clayton57f06302012-05-25 17:05:55 +00001483 error.SetErrorString("section is encrypted");
Jason Molenda216d91f2012-04-25 00:06:56 +00001484 return 0;
1485 }
Greg Claytone72dfb32012-02-24 01:59:29 +00001486 ModuleSP module_sp (section_sp->GetModule());
1487 if (module_sp)
Greg Claytondb598232011-01-07 01:57:07 +00001488 {
Greg Claytone72dfb32012-02-24 01:59:29 +00001489 ObjectFile *objfile = section_sp->GetModule()->GetObjectFile();
1490 if (objfile)
1491 {
1492 size_t bytes_read = objfile->ReadSectionData (section_sp.get(),
1493 addr.GetOffset(),
1494 dst,
1495 dst_len);
1496 if (bytes_read > 0)
1497 return bytes_read;
1498 else
1499 error.SetErrorStringWithFormat("error reading data from section %s", section_sp->GetName().GetCString());
1500 }
Greg Claytondb598232011-01-07 01:57:07 +00001501 else
Greg Claytone72dfb32012-02-24 01:59:29 +00001502 error.SetErrorString("address isn't from a object file");
Greg Claytondb598232011-01-07 01:57:07 +00001503 }
1504 else
Greg Claytone72dfb32012-02-24 01:59:29 +00001505 error.SetErrorString("address isn't in a module");
Greg Claytondb598232011-01-07 01:57:07 +00001506 }
1507 else
Greg Claytondb598232011-01-07 01:57:07 +00001508 error.SetErrorString("address doesn't contain a section that points to a section in a object file");
Greg Claytone72dfb32012-02-24 01:59:29 +00001509
Greg Claytondb598232011-01-07 01:57:07 +00001510 return 0;
1511}
1512
1513size_t
Enrico Granata9128ee22011-09-06 19:20:51 +00001514Target::ReadMemory (const Address& addr,
1515 bool prefer_file_cache,
1516 void *dst,
1517 size_t dst_len,
1518 Error &error,
1519 lldb::addr_t *load_addr_ptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001520{
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001521 error.Clear();
Greg Claytondb598232011-01-07 01:57:07 +00001522
Enrico Granata9128ee22011-09-06 19:20:51 +00001523 // if we end up reading this from process memory, we will fill this
1524 // with the actual load address
1525 if (load_addr_ptr)
1526 *load_addr_ptr = LLDB_INVALID_ADDRESS;
1527
Greg Claytondb598232011-01-07 01:57:07 +00001528 size_t bytes_read = 0;
Greg Claytonc749eb82011-07-11 05:12:02 +00001529
1530 addr_t load_addr = LLDB_INVALID_ADDRESS;
1531 addr_t file_addr = LLDB_INVALID_ADDRESS;
Greg Clayton357132e2011-03-26 19:14:58 +00001532 Address resolved_addr;
1533 if (!addr.IsSectionOffset())
Greg Claytondda4f7b2010-06-30 23:03:03 +00001534 {
Greg Claytond5944cd2013-12-06 01:12:00 +00001535 SectionLoadList &section_load_list = GetSectionLoadList();
1536 if (section_load_list.IsEmpty())
Greg Claytonc749eb82011-07-11 05:12:02 +00001537 {
Greg Claytond16e1e52011-07-12 17:06:17 +00001538 // No sections are loaded, so we must assume we are not running
1539 // yet and anything we are given is a file address.
1540 file_addr = addr.GetOffset(); // "addr" doesn't have a section, so its offset is the file address
1541 m_images.ResolveFileAddress (file_addr, resolved_addr);
Greg Claytonc749eb82011-07-11 05:12:02 +00001542 }
Greg Claytondda4f7b2010-06-30 23:03:03 +00001543 else
Greg Claytonc749eb82011-07-11 05:12:02 +00001544 {
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +00001545 // We have at least one section loaded. This can be because
Greg Claytond16e1e52011-07-12 17:06:17 +00001546 // we have manually loaded some sections with "target modules load ..."
1547 // or because we have have a live process that has sections loaded
1548 // through the dynamic loader
1549 load_addr = addr.GetOffset(); // "addr" doesn't have a section, so its offset is the load address
Greg Claytond5944cd2013-12-06 01:12:00 +00001550 section_load_list.ResolveLoadAddress (load_addr, resolved_addr);
Greg Claytonc749eb82011-07-11 05:12:02 +00001551 }
Greg Claytondda4f7b2010-06-30 23:03:03 +00001552 }
Greg Clayton357132e2011-03-26 19:14:58 +00001553 if (!resolved_addr.IsValid())
1554 resolved_addr = addr;
Greg Claytonc749eb82011-07-11 05:12:02 +00001555
Greg Claytondb598232011-01-07 01:57:07 +00001556 if (prefer_file_cache)
1557 {
1558 bytes_read = ReadMemoryFromFileCache (resolved_addr, dst, dst_len, error);
1559 if (bytes_read > 0)
1560 return bytes_read;
1561 }
Greg Claytondda4f7b2010-06-30 23:03:03 +00001562
Johnny Chen86364b42011-09-20 23:28:55 +00001563 if (ProcessIsValid())
Greg Claytondda4f7b2010-06-30 23:03:03 +00001564 {
Greg Claytonc749eb82011-07-11 05:12:02 +00001565 if (load_addr == LLDB_INVALID_ADDRESS)
1566 load_addr = resolved_addr.GetLoadAddress (this);
1567
Greg Claytondda4f7b2010-06-30 23:03:03 +00001568 if (load_addr == LLDB_INVALID_ADDRESS)
1569 {
Greg Claytone72dfb32012-02-24 01:59:29 +00001570 ModuleSP addr_module_sp (resolved_addr.GetModule());
1571 if (addr_module_sp && addr_module_sp->GetFileSpec())
Daniel Malead01b2952012-11-29 21:49:15 +00001572 error.SetErrorStringWithFormat("%s[0x%" PRIx64 "] can't be resolved, %s in not currently loaded",
Jim Ingham4af59612014-12-19 19:20:44 +00001573 addr_module_sp->GetFileSpec().GetFilename().AsCString("<Unknown>"),
Jason Molenda7e589a62011-09-20 00:26:08 +00001574 resolved_addr.GetFileAddress(),
Jim Ingham4af59612014-12-19 19:20:44 +00001575 addr_module_sp->GetFileSpec().GetFilename().AsCString("<Unknonw>"));
Greg Claytondda4f7b2010-06-30 23:03:03 +00001576 else
Daniel Malead01b2952012-11-29 21:49:15 +00001577 error.SetErrorStringWithFormat("0x%" PRIx64 " can't be resolved", resolved_addr.GetFileAddress());
Greg Claytondda4f7b2010-06-30 23:03:03 +00001578 }
1579 else
1580 {
Greg Claytondb598232011-01-07 01:57:07 +00001581 bytes_read = m_process_sp->ReadMemory(load_addr, dst, dst_len, error);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001582 if (bytes_read != dst_len)
1583 {
1584 if (error.Success())
1585 {
1586 if (bytes_read == 0)
Daniel Malead01b2952012-11-29 21:49:15 +00001587 error.SetErrorStringWithFormat("read memory from 0x%" PRIx64 " failed", load_addr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001588 else
Daniel Malead01b2952012-11-29 21:49:15 +00001589 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 +00001590 }
1591 }
Greg Claytondda4f7b2010-06-30 23:03:03 +00001592 if (bytes_read)
Enrico Granata9128ee22011-09-06 19:20:51 +00001593 {
1594 if (load_addr_ptr)
1595 *load_addr_ptr = load_addr;
Greg Claytondda4f7b2010-06-30 23:03:03 +00001596 return bytes_read;
Enrico Granata9128ee22011-09-06 19:20:51 +00001597 }
Greg Claytondda4f7b2010-06-30 23:03:03 +00001598 // If the address is not section offset we have an address that
1599 // doesn't resolve to any address in any currently loaded shared
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +00001600 // libraries and we failed to read memory so there isn't anything
Greg Claytondda4f7b2010-06-30 23:03:03 +00001601 // more we can do. If it is section offset, we might be able to
1602 // read cached memory from the object file.
1603 if (!resolved_addr.IsSectionOffset())
1604 return 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001605 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001606 }
Greg Claytondda4f7b2010-06-30 23:03:03 +00001607
Greg Claytonc749eb82011-07-11 05:12:02 +00001608 if (!prefer_file_cache && resolved_addr.IsSectionOffset())
Greg Claytondda4f7b2010-06-30 23:03:03 +00001609 {
Greg Claytondb598232011-01-07 01:57:07 +00001610 // If we didn't already try and read from the object file cache, then
1611 // try it after failing to read from the process.
1612 return ReadMemoryFromFileCache (resolved_addr, dst, dst_len, error);
Greg Claytondda4f7b2010-06-30 23:03:03 +00001613 }
1614 return 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001615}
1616
Greg Claytond16e1e52011-07-12 17:06:17 +00001617size_t
Enrico Granata6b4ddc62013-01-21 19:20:50 +00001618Target::ReadCStringFromMemory (const Address& addr, std::string &out_str, Error &error)
1619{
1620 char buf[256];
1621 out_str.clear();
1622 addr_t curr_addr = addr.GetLoadAddress(this);
1623 Address address(addr);
1624 while (1)
1625 {
1626 size_t length = ReadCStringFromMemory (address, buf, sizeof(buf), error);
1627 if (length == 0)
1628 break;
1629 out_str.append(buf, length);
1630 // If we got "length - 1" bytes, we didn't get the whole C string, we
1631 // need to read some more characters
1632 if (length == sizeof(buf) - 1)
1633 curr_addr += length;
1634 else
1635 break;
1636 address = Address(curr_addr);
1637 }
1638 return out_str.size();
1639}
1640
Enrico Granata6b4ddc62013-01-21 19:20:50 +00001641size_t
1642Target::ReadCStringFromMemory (const Address& addr, char *dst, size_t dst_max_len, Error &result_error)
1643{
1644 size_t total_cstr_len = 0;
1645 if (dst && dst_max_len)
1646 {
1647 result_error.Clear();
1648 // NULL out everything just to be safe
1649 memset (dst, 0, dst_max_len);
1650 Error error;
1651 addr_t curr_addr = addr.GetLoadAddress(this);
1652 Address address(addr);
Jason Molendaf0340c92014-09-03 22:30:54 +00001653
1654 // We could call m_process_sp->GetMemoryCacheLineSize() but I don't
1655 // think this really needs to be tied to the memory cache subsystem's
1656 // cache line size, so leave this as a fixed constant.
Enrico Granata6b4ddc62013-01-21 19:20:50 +00001657 const size_t cache_line_size = 512;
Jason Molendaf0340c92014-09-03 22:30:54 +00001658
Enrico Granata6b4ddc62013-01-21 19:20:50 +00001659 size_t bytes_left = dst_max_len - 1;
1660 char *curr_dst = dst;
1661
1662 while (bytes_left > 0)
1663 {
1664 addr_t cache_line_bytes_left = cache_line_size - (curr_addr % cache_line_size);
1665 addr_t bytes_to_read = std::min<addr_t>(bytes_left, cache_line_bytes_left);
1666 size_t bytes_read = ReadMemory (address, false, curr_dst, bytes_to_read, error);
1667
1668 if (bytes_read == 0)
1669 {
1670 result_error = error;
1671 dst[total_cstr_len] = '\0';
1672 break;
1673 }
1674 const size_t len = strlen(curr_dst);
1675
1676 total_cstr_len += len;
1677
1678 if (len < bytes_to_read)
1679 break;
1680
1681 curr_dst += bytes_read;
1682 curr_addr += bytes_read;
1683 bytes_left -= bytes_read;
1684 address = Address(curr_addr);
1685 }
1686 }
1687 else
1688 {
1689 if (dst == NULL)
1690 result_error.SetErrorString("invalid arguments");
1691 else
1692 result_error.Clear();
1693 }
1694 return total_cstr_len;
1695}
1696
1697size_t
Greg Claytond16e1e52011-07-12 17:06:17 +00001698Target::ReadScalarIntegerFromMemory (const Address& addr,
1699 bool prefer_file_cache,
1700 uint32_t byte_size,
1701 bool is_signed,
1702 Scalar &scalar,
1703 Error &error)
1704{
1705 uint64_t uval;
1706
1707 if (byte_size <= sizeof(uval))
1708 {
1709 size_t bytes_read = ReadMemory (addr, prefer_file_cache, &uval, byte_size, error);
1710 if (bytes_read == byte_size)
1711 {
1712 DataExtractor data (&uval, sizeof(uval), m_arch.GetByteOrder(), m_arch.GetAddressByteSize());
Greg Claytonc7bece562013-01-25 18:06:21 +00001713 lldb::offset_t offset = 0;
Greg Claytond16e1e52011-07-12 17:06:17 +00001714 if (byte_size <= 4)
1715 scalar = data.GetMaxU32 (&offset, byte_size);
1716 else
1717 scalar = data.GetMaxU64 (&offset, byte_size);
1718
1719 if (is_signed)
1720 scalar.SignExtend(byte_size * 8);
1721 return bytes_read;
1722 }
1723 }
1724 else
1725 {
1726 error.SetErrorStringWithFormat ("byte size of %u is too large for integer scalar type", byte_size);
1727 }
1728 return 0;
1729}
1730
1731uint64_t
1732Target::ReadUnsignedIntegerFromMemory (const Address& addr,
1733 bool prefer_file_cache,
1734 size_t integer_byte_size,
1735 uint64_t fail_value,
1736 Error &error)
1737{
1738 Scalar scalar;
1739 if (ReadScalarIntegerFromMemory (addr,
1740 prefer_file_cache,
1741 integer_byte_size,
1742 false,
1743 scalar,
1744 error))
1745 return scalar.ULongLong(fail_value);
1746 return fail_value;
1747}
1748
1749bool
1750Target::ReadPointerFromMemory (const Address& addr,
1751 bool prefer_file_cache,
1752 Error &error,
1753 Address &pointer_addr)
1754{
1755 Scalar scalar;
1756 if (ReadScalarIntegerFromMemory (addr,
1757 prefer_file_cache,
1758 m_arch.GetAddressByteSize(),
1759 false,
1760 scalar,
1761 error))
1762 {
1763 addr_t pointer_vm_addr = scalar.ULongLong(LLDB_INVALID_ADDRESS);
1764 if (pointer_vm_addr != LLDB_INVALID_ADDRESS)
1765 {
Greg Claytond5944cd2013-12-06 01:12:00 +00001766 SectionLoadList &section_load_list = GetSectionLoadList();
1767 if (section_load_list.IsEmpty())
Greg Claytond16e1e52011-07-12 17:06:17 +00001768 {
1769 // No sections are loaded, so we must assume we are not running
1770 // yet and anything we are given is a file address.
1771 m_images.ResolveFileAddress (pointer_vm_addr, pointer_addr);
1772 }
1773 else
1774 {
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +00001775 // We have at least one section loaded. This can be because
Greg Claytond16e1e52011-07-12 17:06:17 +00001776 // we have manually loaded some sections with "target modules load ..."
1777 // or because we have have a live process that has sections loaded
1778 // through the dynamic loader
Greg Claytond5944cd2013-12-06 01:12:00 +00001779 section_load_list.ResolveLoadAddress (pointer_vm_addr, pointer_addr);
Greg Claytond16e1e52011-07-12 17:06:17 +00001780 }
1781 // We weren't able to resolve the pointer value, so just return
1782 // an address with no section
1783 if (!pointer_addr.IsValid())
1784 pointer_addr.SetOffset (pointer_vm_addr);
1785 return true;
1786
1787 }
1788 }
1789 return false;
1790}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001791
1792ModuleSP
Greg Claytonb9a01b32012-02-26 05:51:37 +00001793Target::GetSharedModule (const ModuleSpec &module_spec, Error *error_ptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001794{
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001795 ModuleSP module_sp;
1796
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001797 Error error;
1798
Jim Ingham4a94c912012-05-17 18:38:42 +00001799 // First see if we already have this module in our module list. If we do, then we're done, we don't need
1800 // to consult the shared modules list. But only do this if we are passed a UUID.
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001801
Jim Ingham4a94c912012-05-17 18:38:42 +00001802 if (module_spec.GetUUID().IsValid())
1803 module_sp = m_images.FindFirstModule(module_spec);
1804
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001805 if (!module_sp)
1806 {
Jim Ingham4a94c912012-05-17 18:38:42 +00001807 ModuleSP old_module_sp; // This will get filled in if we have a new version of the library
1808 bool did_create_module = false;
1809
1810 // If there are image search path entries, try to use them first to acquire a suitable image.
1811 if (m_image_search_paths.GetSize())
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001812 {
Jim Ingham4a94c912012-05-17 18:38:42 +00001813 ModuleSpec transformed_spec (module_spec);
1814 if (m_image_search_paths.RemapPath (module_spec.GetFileSpec().GetDirectory(), transformed_spec.GetFileSpec().GetDirectory()))
1815 {
1816 transformed_spec.GetFileSpec().GetFilename() = module_spec.GetFileSpec().GetFilename();
1817 error = ModuleList::GetSharedModule (transformed_spec,
1818 module_sp,
Greg Clayton6920b522012-08-22 18:39:03 +00001819 &GetExecutableSearchPaths(),
Jim Ingham4a94c912012-05-17 18:38:42 +00001820 &old_module_sp,
1821 &did_create_module);
1822 }
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001823 }
Jim Ingham4a94c912012-05-17 18:38:42 +00001824
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001825 if (!module_sp)
1826 {
Jim Ingham4a94c912012-05-17 18:38:42 +00001827 // If we have a UUID, we can check our global shared module list in case
1828 // we already have it. If we don't have a valid UUID, then we can't since
1829 // the path in "module_spec" will be a platform path, and we will need to
1830 // let the platform find that file. For example, we could be asking for
1831 // "/usr/lib/dyld" and if we do not have a UUID, we don't want to pick
1832 // the local copy of "/usr/lib/dyld" since our platform could be a remote
1833 // platform that has its own "/usr/lib/dyld" in an SDK or in a local file
1834 // cache.
1835 if (module_spec.GetUUID().IsValid())
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001836 {
Jim Ingham4a94c912012-05-17 18:38:42 +00001837 // We have a UUID, it is OK to check the global module list...
1838 error = ModuleList::GetSharedModule (module_spec,
1839 module_sp,
Greg Clayton6920b522012-08-22 18:39:03 +00001840 &GetExecutableSearchPaths(),
Greg Clayton67cc0632012-08-22 17:17:09 +00001841 &old_module_sp,
Jim Ingham4a94c912012-05-17 18:38:42 +00001842 &did_create_module);
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001843 }
Jim Ingham4a94c912012-05-17 18:38:42 +00001844
1845 if (!module_sp)
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001846 {
Jim Ingham4a94c912012-05-17 18:38:42 +00001847 // The platform is responsible for finding and caching an appropriate
1848 // module in the shared module cache.
1849 if (m_platform_sp)
1850 {
Tamas Berghammer7cb18bf2015-03-24 11:15:23 +00001851 error = m_platform_sp->GetSharedModule (module_spec,
1852 m_process_sp.get(),
1853 module_sp,
Greg Clayton6920b522012-08-22 18:39:03 +00001854 &GetExecutableSearchPaths(),
Greg Clayton67cc0632012-08-22 17:17:09 +00001855 &old_module_sp,
Jim Ingham4a94c912012-05-17 18:38:42 +00001856 &did_create_module);
1857 }
1858 else
1859 {
1860 error.SetErrorString("no platform is currently set");
1861 }
Greg Claytonb69bb2e2012-04-27 00:58:27 +00001862 }
1863 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001864
Jim Ingham4a94c912012-05-17 18:38:42 +00001865 // We found a module that wasn't in our target list. Let's make sure that there wasn't an equivalent
1866 // module in the list already, and if there was, let's remove it.
1867 if (module_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001868 {
Greg Clayton50a24bd2012-11-29 22:16:27 +00001869 ObjectFile *objfile = module_sp->GetObjectFile();
1870 if (objfile)
Jim Ingham4a94c912012-05-17 18:38:42 +00001871 {
Greg Clayton50a24bd2012-11-29 22:16:27 +00001872 switch (objfile->GetType())
Jim Ingham4a94c912012-05-17 18:38:42 +00001873 {
Greg Clayton50a24bd2012-11-29 22:16:27 +00001874 case ObjectFile::eTypeCoreFile: /// A core file that has a checkpoint of a program's execution state
1875 case ObjectFile::eTypeExecutable: /// A normal executable
1876 case ObjectFile::eTypeDynamicLinker: /// The platform's dynamic linker executable
1877 case ObjectFile::eTypeObjectFile: /// An intermediate object file
1878 case ObjectFile::eTypeSharedLibrary: /// A shared library that can be used during execution
1879 break;
1880 case ObjectFile::eTypeDebugInfo: /// An object file that contains only debug information
1881 if (error_ptr)
1882 error_ptr->SetErrorString("debug info files aren't valid target modules, please specify an executable");
1883 return ModuleSP();
1884 case ObjectFile::eTypeStubLibrary: /// A library that can be linked against but not used for execution
1885 if (error_ptr)
1886 error_ptr->SetErrorString("stub libraries aren't valid target modules, please specify an executable");
1887 return ModuleSP();
1888 default:
1889 if (error_ptr)
1890 error_ptr->SetErrorString("unsupported file type, please specify an executable");
1891 return ModuleSP();
1892 }
1893 // GetSharedModule is not guaranteed to find the old shared module, for instance
1894 // in the common case where you pass in the UUID, it is only going to find the one
1895 // module matching the UUID. In fact, it has no good way to know what the "old module"
1896 // relevant to this target is, since there might be many copies of a module with this file spec
1897 // in various running debug sessions, but only one of them will belong to this target.
1898 // So let's remove the UUID from the module list, and look in the target's module list.
1899 // Only do this if there is SOMETHING else in the module spec...
1900 if (!old_module_sp)
1901 {
1902 if (module_spec.GetUUID().IsValid() && !module_spec.GetFileSpec().GetFilename().IsEmpty() && !module_spec.GetFileSpec().GetDirectory().IsEmpty())
Jim Ingham4a94c912012-05-17 18:38:42 +00001903 {
Greg Clayton50a24bd2012-11-29 22:16:27 +00001904 ModuleSpec module_spec_copy(module_spec.GetFileSpec());
1905 module_spec_copy.GetUUID().Clear();
1906
1907 ModuleList found_modules;
1908 size_t num_found = m_images.FindModules (module_spec_copy, found_modules);
1909 if (num_found == 1)
1910 {
1911 old_module_sp = found_modules.GetModuleAtIndex(0);
1912 }
Jim Ingham4a94c912012-05-17 18:38:42 +00001913 }
1914 }
Greg Clayton50a24bd2012-11-29 22:16:27 +00001915
1916 if (old_module_sp && m_images.GetIndexForModule (old_module_sp.get()) != LLDB_INVALID_INDEX32)
1917 {
1918 m_images.ReplaceModule(old_module_sp, module_sp);
1919 Module *old_module_ptr = old_module_sp.get();
1920 old_module_sp.reset();
1921 ModuleList::RemoveSharedModuleIfOrphaned (old_module_ptr);
1922 }
1923 else
1924 m_images.Append(module_sp);
Jim Ingham4a94c912012-05-17 18:38:42 +00001925 }
Greg Clayton86e70cb2014-04-07 23:50:17 +00001926 else
1927 module_sp.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001928 }
1929 }
1930 if (error_ptr)
1931 *error_ptr = error;
1932 return module_sp;
1933}
1934
Greg Claytond9e416c2012-02-18 05:35:26 +00001935TargetSP
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001936Target::CalculateTarget ()
1937{
Greg Claytond9e416c2012-02-18 05:35:26 +00001938 return shared_from_this();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001939}
1940
Greg Claytond9e416c2012-02-18 05:35:26 +00001941ProcessSP
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001942Target::CalculateProcess ()
1943{
Greg Claytond9e416c2012-02-18 05:35:26 +00001944 return ProcessSP();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001945}
1946
Greg Claytond9e416c2012-02-18 05:35:26 +00001947ThreadSP
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001948Target::CalculateThread ()
1949{
Greg Claytond9e416c2012-02-18 05:35:26 +00001950 return ThreadSP();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001951}
1952
Jason Molendab57e4a12013-11-04 09:33:30 +00001953StackFrameSP
1954Target::CalculateStackFrame ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001955{
Jason Molendab57e4a12013-11-04 09:33:30 +00001956 return StackFrameSP();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001957}
1958
1959void
Greg Clayton0603aa92010-10-04 01:05:56 +00001960Target::CalculateExecutionContext (ExecutionContext &exe_ctx)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001961{
Greg Claytonc14ee322011-09-22 04:58:26 +00001962 exe_ctx.Clear();
1963 exe_ctx.SetTargetPtr(this);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001964}
1965
1966PathMappingList &
1967Target::GetImageSearchPathList ()
1968{
1969 return m_image_search_paths;
1970}
1971
1972void
Eugene Zelenko8f30a652015-10-23 18:39:37 +00001973Target::ImageSearchPathsChanged(const PathMappingList &path_list,
1974 void *baton)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001975{
1976 Target *target = (Target *)baton;
Greg Claytonaa149cb2011-08-11 02:48:45 +00001977 ModuleSP exe_module_sp (target->GetExecutableModule());
1978 if (exe_module_sp)
Greg Claytonaa149cb2011-08-11 02:48:45 +00001979 target->SetExecutableModule (exe_module_sp, true);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001980}
1981
Jim Ingham151c0322015-09-15 21:13:50 +00001982TypeSystem *
Sean Callanana994b0b2015-10-02 18:40:30 +00001983Target::GetScratchTypeSystemForLanguage (Error *error, lldb::LanguageType language, bool create_on_demand)
Jim Ingham151c0322015-09-15 21:13:50 +00001984{
Greg Clayton5beec212015-10-08 21:04:34 +00001985 if (!m_valid)
1986 return nullptr;
1987
Sean Callanana994b0b2015-10-02 18:40:30 +00001988 if (error)
1989 {
1990 error->Clear();
1991 }
1992
Sean Callananb92bd752015-10-01 16:28:02 +00001993 if (language == eLanguageTypeMipsAssembler // GNU AS and LLVM use it for all assembly code
Sean Callanana994b0b2015-10-02 18:40:30 +00001994 || language == eLanguageTypeUnknown)
1995 {
Sean Callananc7b054a2015-10-09 18:01:10 +00001996 std::set<lldb::LanguageType> languages_for_types;
1997 std::set<lldb::LanguageType> languages_for_expressions;
1998
1999 Language::GetLanguagesSupportingTypeSystems(languages_for_types, languages_for_expressions);
2000
2001 if (languages_for_expressions.count(eLanguageTypeC))
2002 {
2003 language = eLanguageTypeC; // LLDB's default. Override by setting the target language.
2004 }
2005 else
2006 {
2007 if (languages_for_expressions.empty())
2008 {
2009 return nullptr;
2010 }
2011 else
2012 {
2013 language = *languages_for_expressions.begin();
2014 }
2015 }
Sean Callananb92bd752015-10-01 16:28:02 +00002016 }
Sean Callananb92bd752015-10-01 16:28:02 +00002017
Greg Clayton5beec212015-10-08 21:04:34 +00002018 return m_scratch_type_system_map.GetTypeSystemForLanguage(language, this, create_on_demand);
Sean Callananb92bd752015-10-01 16:28:02 +00002019}
2020
2021PersistentExpressionState *
2022Target::GetPersistentExpressionStateForLanguage (lldb::LanguageType language)
2023{
Sean Callanana994b0b2015-10-02 18:40:30 +00002024 TypeSystem *type_system = GetScratchTypeSystemForLanguage(nullptr, language, true);
Sean Callananb92bd752015-10-01 16:28:02 +00002025
2026 if (type_system)
2027 {
2028 return type_system->GetPersistentExpressionState();
2029 }
Jim Ingham151c0322015-09-15 21:13:50 +00002030 else
Sean Callananb92bd752015-10-01 16:28:02 +00002031 {
2032 return nullptr;
2033 }
Jim Ingham151c0322015-09-15 21:13:50 +00002034}
2035
2036UserExpression *
2037Target::GetUserExpressionForLanguage(const char *expr,
Sean Callanana994b0b2015-10-02 18:40:30 +00002038 const char *expr_prefix,
2039 lldb::LanguageType language,
2040 Expression::ResultType desired_type,
Jim Ingham19a63fc2015-11-03 02:11:24 +00002041 const EvaluateExpressionOptions &options,
Sean Callanana994b0b2015-10-02 18:40:30 +00002042 Error &error)
Jim Ingham151c0322015-09-15 21:13:50 +00002043{
Sean Callanana994b0b2015-10-02 18:40:30 +00002044 Error type_system_error;
2045
2046 TypeSystem *type_system = GetScratchTypeSystemForLanguage (&type_system_error, language);
Jim Ingham151c0322015-09-15 21:13:50 +00002047 UserExpression *user_expr = nullptr;
2048
2049 if (!type_system)
2050 {
Sean Callanana994b0b2015-10-02 18:40:30 +00002051 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 +00002052 return nullptr;
2053 }
2054
Jim Ingham19a63fc2015-11-03 02:11:24 +00002055 user_expr = type_system->GetUserExpression(expr, expr_prefix, language, desired_type, options);
Jim Ingham151c0322015-09-15 21:13:50 +00002056 if (!user_expr)
2057 error.SetErrorStringWithFormat("Could not create an expression for language %s", Language::GetNameForLanguageType(language));
2058
2059 return user_expr;
2060}
2061
2062FunctionCaller *
2063Target::GetFunctionCallerForLanguage (lldb::LanguageType language,
2064 const CompilerType &return_type,
2065 const Address& function_address,
2066 const ValueList &arg_value_list,
2067 const char *name,
2068 Error &error)
2069{
Sean Callanana994b0b2015-10-02 18:40:30 +00002070 Error type_system_error;
2071 TypeSystem *type_system = GetScratchTypeSystemForLanguage (&type_system_error, language);
Jim Ingham151c0322015-09-15 21:13:50 +00002072 FunctionCaller *persistent_fn = nullptr;
2073
2074 if (!type_system)
2075 {
Sean Callanana994b0b2015-10-02 18:40:30 +00002076 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 +00002077 return persistent_fn;
2078 }
2079
2080 persistent_fn = type_system->GetFunctionCaller (return_type, function_address, arg_value_list, name);
2081 if (!persistent_fn)
2082 error.SetErrorStringWithFormat("Could not create an expression for language %s", Language::GetNameForLanguageType(language));
2083
2084 return persistent_fn;
2085}
2086
2087UtilityFunction *
2088Target::GetUtilityFunctionForLanguage (const char *text,
2089 lldb::LanguageType language,
2090 const char *name,
2091 Error &error)
2092{
Sean Callanana994b0b2015-10-02 18:40:30 +00002093 Error type_system_error;
2094 TypeSystem *type_system = GetScratchTypeSystemForLanguage (&type_system_error, language);
Jim Ingham151c0322015-09-15 21:13:50 +00002095 UtilityFunction *utility_fn = nullptr;
2096
2097 if (!type_system)
2098 {
Sean Callanana994b0b2015-10-02 18:40:30 +00002099 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 +00002100 return utility_fn;
2101 }
2102
2103 utility_fn = type_system->GetUtilityFunction (text, name);
2104 if (!utility_fn)
2105 error.SetErrorStringWithFormat("Could not create an expression for language %s", Language::GetNameForLanguageType(language));
2106
2107 return utility_fn;
2108}
2109
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002110ClangASTContext *
Johnny Chen60e2c6a2011-11-30 23:18:53 +00002111Target::GetScratchClangASTContext(bool create_on_demand)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002112{
Greg Clayton5beec212015-10-08 21:04:34 +00002113 if (m_valid)
Sean Callanan4bf80d52011-11-15 22:27:19 +00002114 {
Greg Clayton5beec212015-10-08 21:04:34 +00002115 if (TypeSystem* type_system = GetScratchTypeSystemForLanguage(nullptr, eLanguageTypeC, create_on_demand))
2116 return llvm::dyn_cast<ClangASTContext>(type_system);
Sean Callanan4bf80d52011-11-15 22:27:19 +00002117 }
Greg Clayton5beec212015-10-08 21:04:34 +00002118 return nullptr;
Sean Callananb92bd752015-10-01 16:28:02 +00002119}
2120
Sean Callanana3444ff2015-11-10 22:54:42 +00002121ClangASTImporterSP
Sean Callanan686b2312011-11-16 18:20:47 +00002122Target::GetClangASTImporter()
2123{
Greg Clayton5beec212015-10-08 21:04:34 +00002124 if (m_valid)
Sean Callanan686b2312011-11-16 18:20:47 +00002125 {
Sean Callanana3444ff2015-11-10 22:54:42 +00002126 if (!m_ast_importer_sp)
Greg Clayton5beec212015-10-08 21:04:34 +00002127 {
Sean Callanana3444ff2015-11-10 22:54:42 +00002128 m_ast_importer_sp.reset(new ClangASTImporter());
Greg Clayton5beec212015-10-08 21:04:34 +00002129 }
Sean Callanana3444ff2015-11-10 22:54:42 +00002130 return m_ast_importer_sp;
Sean Callanan686b2312011-11-16 18:20:47 +00002131 }
Sean Callanana3444ff2015-11-10 22:54:42 +00002132 return ClangASTImporterSP();
Sean Callanan686b2312011-11-16 18:20:47 +00002133}
2134
Greg Clayton99d0faf2010-11-18 23:32:35 +00002135void
Caroline Tice20bd37f2011-03-10 22:14:10 +00002136Target::SettingsInitialize ()
Caroline Ticedaccaa92010-09-20 20:44:43 +00002137{
Greg Clayton6920b522012-08-22 18:39:03 +00002138 Process::SettingsInitialize ();
Greg Clayton99d0faf2010-11-18 23:32:35 +00002139}
Caroline Ticedaccaa92010-09-20 20:44:43 +00002140
Greg Clayton99d0faf2010-11-18 23:32:35 +00002141void
Caroline Tice20bd37f2011-03-10 22:14:10 +00002142Target::SettingsTerminate ()
Greg Clayton99d0faf2010-11-18 23:32:35 +00002143{
Greg Clayton6920b522012-08-22 18:39:03 +00002144 Process::SettingsTerminate ();
Greg Clayton99d0faf2010-11-18 23:32:35 +00002145}
Caroline Ticedaccaa92010-09-20 20:44:43 +00002146
Greg Claytonc859e2d2012-02-13 23:10:39 +00002147FileSpecList
2148Target::GetDefaultExecutableSearchPaths ()
2149{
Greg Clayton67cc0632012-08-22 17:17:09 +00002150 TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
2151 if (properties_sp)
2152 return properties_sp->GetExecutableSearchPaths();
Greg Claytonc859e2d2012-02-13 23:10:39 +00002153 return FileSpecList();
2154}
2155
Michael Sartaina7499c92013-07-01 19:45:50 +00002156FileSpecList
2157Target::GetDefaultDebugFileSearchPaths ()
2158{
2159 TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
2160 if (properties_sp)
2161 return properties_sp->GetDebugFileSearchPaths();
2162 return FileSpecList();
2163}
2164
Sean Callanan85054342015-04-03 15:39:47 +00002165FileSpecList
2166Target::GetDefaultClangModuleSearchPaths ()
2167{
2168 TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
2169 if (properties_sp)
2170 return properties_sp->GetClangModuleSearchPaths();
2171 return FileSpecList();
2172}
2173
Caroline Ticedaccaa92010-09-20 20:44:43 +00002174ArchSpec
2175Target::GetDefaultArchitecture ()
2176{
Greg Clayton67cc0632012-08-22 17:17:09 +00002177 TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
2178 if (properties_sp)
2179 return properties_sp->GetDefaultArchitecture();
Greg Clayton8910c902012-05-15 02:44:13 +00002180 return ArchSpec();
Caroline Ticedaccaa92010-09-20 20:44:43 +00002181}
2182
2183void
Greg Clayton67cc0632012-08-22 17:17:09 +00002184Target::SetDefaultArchitecture (const ArchSpec &arch)
Caroline Ticedaccaa92010-09-20 20:44:43 +00002185{
Greg Clayton67cc0632012-08-22 17:17:09 +00002186 TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
2187 if (properties_sp)
Jason Molendaa3f24b32012-12-12 02:23:56 +00002188 {
2189 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 +00002190 return properties_sp->SetDefaultArchitecture(arch);
Jason Molendaa3f24b32012-12-12 02:23:56 +00002191 }
Caroline Ticedaccaa92010-09-20 20:44:43 +00002192}
2193
Greg Clayton0603aa92010-10-04 01:05:56 +00002194Target *
2195Target::GetTargetFromContexts (const ExecutionContext *exe_ctx_ptr, const SymbolContext *sc_ptr)
2196{
2197 // The target can either exist in the "process" of ExecutionContext, or in
2198 // the "target_sp" member of SymbolContext. This accessor helper function
2199 // will get the target from one of these locations.
2200
2201 Target *target = NULL;
2202 if (sc_ptr != NULL)
2203 target = sc_ptr->target_sp.get();
Greg Claytonc14ee322011-09-22 04:58:26 +00002204 if (target == NULL && exe_ctx_ptr)
2205 target = exe_ctx_ptr->GetTargetPtr();
Greg Clayton0603aa92010-10-04 01:05:56 +00002206 return target;
2207}
2208
Jim Ingham1624a2d2014-05-05 02:26:40 +00002209ExpressionResults
Eugene Zelenko8f30a652015-10-23 18:39:37 +00002210Target::EvaluateExpression(const char *expr_cstr,
Jim Inghama309efe2015-10-28 22:23:17 +00002211 ExecutionContextScope *exe_scope,
Eugene Zelenko8f30a652015-10-23 18:39:37 +00002212 lldb::ValueObjectSP &result_valobj_sp,
2213 const EvaluateExpressionOptions& options)
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00002214{
Enrico Granata97fca502012-09-18 17:43:16 +00002215 result_valobj_sp.reset();
2216
Jim Ingham8646d3c2014-05-05 02:47:44 +00002217 ExpressionResults execution_results = eExpressionSetupError;
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00002218
Greg Claytond1767f02011-12-08 02:13:16 +00002219 if (expr_cstr == NULL || expr_cstr[0] == '\0')
2220 return execution_results;
2221
Jim Ingham6026ca32011-05-12 02:06:14 +00002222 // We shouldn't run stop hooks in expressions.
2223 // Be sure to reset this if you return anywhere within this function.
2224 bool old_suppress_value = m_suppress_stop_hooks;
2225 m_suppress_stop_hooks = true;
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00002226
2227 ExecutionContext exe_ctx;
Sean Callanan0bf0baf2013-01-12 02:04:23 +00002228
Jim Inghama309efe2015-10-28 22:23:17 +00002229 if (exe_scope)
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00002230 {
Jim Inghama309efe2015-10-28 22:23:17 +00002231 exe_scope->CalculateExecutionContext(exe_ctx);
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00002232 }
2233 else if (m_process_sp)
2234 {
2235 m_process_sp->CalculateExecutionContext(exe_ctx);
2236 }
2237 else
2238 {
2239 CalculateExecutionContext(exe_ctx);
2240 }
2241
Sean Callanan0bf0baf2013-01-12 02:04:23 +00002242 // Make sure we aren't just trying to see the value of a persistent
2243 // variable (something like "$0")
Sean Callananbc8ac342015-09-04 20:49:51 +00002244 lldb::ExpressionVariableSP persistent_var_sp;
Sean Callanan0bf0baf2013-01-12 02:04:23 +00002245 // Only check for persistent variables the expression starts with a '$'
2246 if (expr_cstr[0] == '$')
Sean Callanana994b0b2015-10-02 18:40:30 +00002247 persistent_var_sp = GetScratchTypeSystemForLanguage(nullptr, eLanguageTypeC)->GetPersistentExpressionState()->GetVariable (expr_cstr);
Sean Callanan0bf0baf2013-01-12 02:04:23 +00002248
2249 if (persistent_var_sp)
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00002250 {
Sean Callanan0bf0baf2013-01-12 02:04:23 +00002251 result_valobj_sp = persistent_var_sp->GetValueObject ();
Jim Ingham8646d3c2014-05-05 02:47:44 +00002252 execution_results = eExpressionCompleted;
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00002253 }
2254 else
2255 {
Sean Callanan0bf0baf2013-01-12 02:04:23 +00002256 const char *prefix = GetExpressionPrefixContentsAsCString();
Greg Clayton62afb9f2013-11-04 19:35:17 +00002257 Error error;
Jim Ingham151c0322015-09-15 21:13:50 +00002258 execution_results = UserExpression::Evaluate (exe_ctx,
2259 options,
2260 expr_cstr,
2261 prefix,
2262 result_valobj_sp,
2263 error);
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00002264 }
Jim Ingham6026ca32011-05-12 02:06:14 +00002265
2266 m_suppress_stop_hooks = old_suppress_value;
2267
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00002268 return execution_results;
2269}
2270
Sean Callanan8f1f9a12015-09-30 19:57:57 +00002271lldb::ExpressionVariableSP
2272Target::GetPersistentVariable(const ConstString &name)
Zachary Turner32abc6e2015-03-03 19:23:09 +00002273{
Greg Clayton5beec212015-10-08 21:04:34 +00002274 lldb::ExpressionVariableSP variable_sp;
2275 m_scratch_type_system_map.ForEach([this, name, &variable_sp](TypeSystem *type_system) -> bool
Sean Callanan8f1f9a12015-09-30 19:57:57 +00002276 {
Greg Clayton5beec212015-10-08 21:04:34 +00002277 if (PersistentExpressionState *persistent_state = type_system->GetPersistentExpressionState())
Sean Callanan8f1f9a12015-09-30 19:57:57 +00002278 {
Greg Clayton5beec212015-10-08 21:04:34 +00002279 variable_sp = persistent_state->GetVariable(name);
2280
2281 if (variable_sp)
2282 return false; // Stop iterating the ForEach
Sean Callanan8f1f9a12015-09-30 19:57:57 +00002283 }
Greg Clayton5beec212015-10-08 21:04:34 +00002284 return true; // Keep iterating the ForEach
2285 });
2286 return variable_sp;
Zachary Turner32abc6e2015-03-03 19:23:09 +00002287}
2288
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002289lldb::addr_t
Sean Callananb92bd752015-10-01 16:28:02 +00002290Target::GetPersistentSymbol(const ConstString &name)
2291{
Greg Clayton5beec212015-10-08 21:04:34 +00002292 lldb::addr_t address = LLDB_INVALID_ADDRESS;
Sean Callananb92bd752015-10-01 16:28:02 +00002293
Greg Clayton5beec212015-10-08 21:04:34 +00002294 m_scratch_type_system_map.ForEach([this, name, &address](TypeSystem *type_system) -> bool
Sean Callananb92bd752015-10-01 16:28:02 +00002295 {
Greg Clayton5beec212015-10-08 21:04:34 +00002296 if (PersistentExpressionState *persistent_state = type_system->GetPersistentExpressionState())
Sean Callananb92bd752015-10-01 16:28:02 +00002297 {
Greg Clayton5beec212015-10-08 21:04:34 +00002298 address = persistent_state->LookupSymbol(name);
2299 if (address != LLDB_INVALID_ADDRESS)
2300 return false; // Stop iterating the ForEach
Sean Callananb92bd752015-10-01 16:28:02 +00002301 }
Greg Clayton5beec212015-10-08 21:04:34 +00002302 return true; // Keep iterating the ForEach
2303 });
2304 return address;
Sean Callananb92bd752015-10-01 16:28:02 +00002305}
2306
2307lldb::addr_t
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002308Target::GetCallableLoadAddress (lldb::addr_t load_addr, AddressClass addr_class) const
2309{
2310 addr_t code_addr = load_addr;
2311 switch (m_arch.GetMachine())
2312 {
Jaydeep Patil44d07fc2015-09-22 06:36:56 +00002313 case llvm::Triple::mips:
2314 case llvm::Triple::mipsel:
2315 case llvm::Triple::mips64:
2316 case llvm::Triple::mips64el:
2317 switch (addr_class)
2318 {
2319 case eAddressClassData:
2320 case eAddressClassDebug:
2321 return LLDB_INVALID_ADDRESS;
2322
2323 case eAddressClassUnknown:
2324 case eAddressClassInvalid:
2325 case eAddressClassCode:
2326 case eAddressClassCodeAlternateISA:
2327 case eAddressClassRuntime:
2328 if ((code_addr & 2ull) || (addr_class == eAddressClassCodeAlternateISA))
2329 code_addr |= 1ull;
2330 break;
2331 }
2332 break;
2333
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002334 case llvm::Triple::arm:
2335 case llvm::Triple::thumb:
2336 switch (addr_class)
2337 {
2338 case eAddressClassData:
2339 case eAddressClassDebug:
2340 return LLDB_INVALID_ADDRESS;
2341
2342 case eAddressClassUnknown:
2343 case eAddressClassInvalid:
2344 case eAddressClassCode:
2345 case eAddressClassCodeAlternateISA:
2346 case eAddressClassRuntime:
2347 // Check if bit zero it no set?
2348 if ((code_addr & 1ull) == 0)
2349 {
2350 // Bit zero isn't set, check if the address is a multiple of 2?
2351 if (code_addr & 2ull)
2352 {
2353 // The address is a multiple of 2 so it must be thumb, set bit zero
2354 code_addr |= 1ull;
2355 }
2356 else if (addr_class == eAddressClassCodeAlternateISA)
2357 {
2358 // We checked the address and the address claims to be the alternate ISA
2359 // which means thumb, so set bit zero.
2360 code_addr |= 1ull;
2361 }
2362 }
2363 break;
2364 }
2365 break;
2366
2367 default:
2368 break;
2369 }
2370 return code_addr;
2371}
2372
2373lldb::addr_t
2374Target::GetOpcodeLoadAddress (lldb::addr_t load_addr, AddressClass addr_class) const
2375{
2376 addr_t opcode_addr = load_addr;
2377 switch (m_arch.GetMachine())
2378 {
Jaydeep Patil44d07fc2015-09-22 06:36:56 +00002379 case llvm::Triple::mips:
2380 case llvm::Triple::mipsel:
2381 case llvm::Triple::mips64:
2382 case llvm::Triple::mips64el:
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002383 case llvm::Triple::arm:
2384 case llvm::Triple::thumb:
2385 switch (addr_class)
2386 {
2387 case eAddressClassData:
2388 case eAddressClassDebug:
2389 return LLDB_INVALID_ADDRESS;
2390
2391 case eAddressClassInvalid:
2392 case eAddressClassUnknown:
2393 case eAddressClassCode:
2394 case eAddressClassCodeAlternateISA:
2395 case eAddressClassRuntime:
2396 opcode_addr &= ~(1ull);
2397 break;
2398 }
2399 break;
2400
2401 default:
2402 break;
2403 }
2404 return opcode_addr;
2405}
2406
Bhushan D. Attarde7f3daed2015-08-26 06:04:54 +00002407lldb::addr_t
2408Target::GetBreakableLoadAddress (lldb::addr_t addr)
2409{
2410 addr_t breakable_addr = addr;
2411 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
2412
2413 switch (m_arch.GetMachine())
2414 {
2415 default:
2416 break;
2417 case llvm::Triple::mips:
2418 case llvm::Triple::mipsel:
2419 case llvm::Triple::mips64:
2420 case llvm::Triple::mips64el:
2421 {
2422 addr_t function_start = 0;
2423 addr_t current_offset = 0;
2424 uint32_t loop_count = 0;
2425 Address resolved_addr;
2426 uint32_t arch_flags = m_arch.GetFlags ();
2427 bool IsMips16 = arch_flags & ArchSpec::eMIPSAse_mips16;
2428 bool IsMicromips = arch_flags & ArchSpec::eMIPSAse_micromips;
2429 SectionLoadList &section_load_list = GetSectionLoadList();
2430
2431 if (section_load_list.IsEmpty())
2432 // No sections are loaded, so we must assume we are not running yet
2433 // and need to operate only on file address.
2434 m_images.ResolveFileAddress (addr, resolved_addr);
2435 else
2436 section_load_list.ResolveLoadAddress(addr, resolved_addr);
2437
2438 // Get the function boundaries to make sure we don't scan back before the beginning of the current function.
2439 ModuleSP temp_addr_module_sp (resolved_addr.GetModule());
2440 if (temp_addr_module_sp)
2441 {
2442 SymbolContext sc;
2443 uint32_t resolve_scope = eSymbolContextFunction | eSymbolContextSymbol;
Greg Clayton6071e6f2015-08-26 22:57:51 +00002444 temp_addr_module_sp->ResolveSymbolContextForAddress(resolved_addr, resolve_scope, sc);
Bhushan D. Attarde7f3daed2015-08-26 06:04:54 +00002445 if (sc.function)
2446 {
2447 function_start = sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress(this);
2448 if (function_start == LLDB_INVALID_ADDRESS)
2449 function_start = sc.function->GetAddressRange().GetBaseAddress().GetFileAddress();
2450 }
2451 else if (sc.symbol)
2452 {
2453 Address sym_addr = sc.symbol->GetAddress();
2454 function_start = sym_addr.GetFileAddress();
2455 }
2456 current_offset = addr - function_start;
2457 }
2458
2459 // If breakpoint address is start of function then we dont have to do anything.
2460 if (current_offset == 0)
2461 return breakable_addr;
2462 else
2463 loop_count = current_offset / 2;
2464
2465 if (loop_count > 3)
2466 {
2467 // Scan previous 6 bytes
2468 if (IsMips16 | IsMicromips)
2469 loop_count = 3;
2470 // For mips-only, instructions are always 4 bytes, so scan previous 4 bytes only.
2471 else
2472 loop_count = 2;
2473 }
2474
2475 // Create Disassembler Instance
2476 lldb::DisassemblerSP disasm_sp (Disassembler::FindPlugin(m_arch, NULL, NULL));
2477
2478 ExecutionContext exe_ctx;
2479 CalculateExecutionContext(exe_ctx);
2480 InstructionList instruction_list;
2481 InstructionSP prev_insn;
2482 bool prefer_file_cache = true; // Read from file
2483 uint32_t inst_to_choose = 0;
2484
2485 for (uint32_t i = 1; i <= loop_count; i++)
2486 {
2487 // Adjust the address to read from.
2488 resolved_addr.Slide (-2);
2489 AddressRange range(resolved_addr, i*2);
2490 uint32_t insn_size = 0;
2491
Greg Clayton6071e6f2015-08-26 22:57:51 +00002492 disasm_sp->ParseInstructions (&exe_ctx, range, NULL, prefer_file_cache);
Bhushan D. Attarde7f3daed2015-08-26 06:04:54 +00002493
2494 uint32_t num_insns = disasm_sp->GetInstructionList().GetSize();
2495 if (num_insns)
2496 {
2497 prev_insn = disasm_sp->GetInstructionList().GetInstructionAtIndex(0);
2498 insn_size = prev_insn->GetOpcode().GetByteSize();
2499 if (i == 1 && insn_size == 2)
2500 {
2501 // This looks like a valid 2-byte instruction (but it could be a part of upper 4 byte instruction).
2502 instruction_list.Append(prev_insn);
2503 inst_to_choose = 1;
2504 }
2505 else if (i == 2)
2506 {
2507 // Here we may get one 4-byte instruction or two 2-byte instructions.
2508 if (num_insns == 2)
2509 {
2510 // Looks like there are two 2-byte instructions above our breakpoint target address.
2511 // 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.
2512 // In both cases we don't care because in this case lower 2-byte instruction is definitely a valid instruction
2513 // and whatever i=1 iteration has found out is true.
2514 inst_to_choose = 1;
2515 break;
2516 }
2517 else if (insn_size == 4)
2518 {
2519 // This instruction claims its a valid 4-byte instruction. But it could be a part of it's upper 4-byte instruction.
2520 // Lets try scanning upper 2 bytes to verify this.
2521 instruction_list.Append(prev_insn);
2522 inst_to_choose = 2;
2523 }
2524 }
2525 else if (i == 3)
2526 {
2527 if (insn_size == 4)
2528 // FIXME: We reached here that means instruction at [target - 4] has already claimed to be a 4-byte instruction,
2529 // and now instruction at [target - 6] is also claiming that it's a 4-byte instruction. This can not be true.
2530 // In this case we can not decide the valid previous instruction so we let lldb set the breakpoint at the address given by user.
2531 inst_to_choose = 0;
2532 else
2533 // This is straight-forward
2534 inst_to_choose = 2;
2535 break;
2536 }
2537 }
2538 else
2539 {
2540 // Decode failed, bytes do not form a valid instruction. So whatever previous iteration has found out is true.
2541 if (i > 1)
2542 {
2543 inst_to_choose = i - 1;
2544 break;
2545 }
2546 }
2547 }
2548
2549 // Check if we are able to find any valid instruction.
2550 if (inst_to_choose)
2551 {
2552 if (inst_to_choose > instruction_list.GetSize())
2553 inst_to_choose--;
2554 prev_insn = instruction_list.GetInstructionAtIndex(inst_to_choose - 1);
2555
2556 if (prev_insn->HasDelaySlot())
2557 {
2558 uint32_t shift_size = prev_insn->GetOpcode().GetByteSize();
2559 // Adjust the breakable address
2560 breakable_addr = addr - shift_size;
2561 if (log)
2562 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);
2563 }
2564 }
2565 break;
2566 }
2567 }
2568 return breakable_addr;
2569}
2570
Greg Clayton9585fbf2013-03-19 00:20:55 +00002571SourceManager &
2572Target::GetSourceManager ()
2573{
2574 if (m_source_manager_ap.get() == NULL)
2575 m_source_manager_ap.reset (new SourceManager(shared_from_this()));
2576 return *m_source_manager_ap;
2577}
2578
Sean Callanan9998acd2014-12-05 01:21:59 +00002579ClangModulesDeclVendor *
2580Target::GetClangModulesDeclVendor ()
2581{
2582 static Mutex s_clang_modules_decl_vendor_mutex; // If this is contended we can make it per-target
2583
2584 {
2585 Mutex::Locker clang_modules_decl_vendor_locker(s_clang_modules_decl_vendor_mutex);
2586
2587 if (!m_clang_modules_decl_vendor_ap)
2588 {
2589 m_clang_modules_decl_vendor_ap.reset(ClangModulesDeclVendor::Create(*this));
2590 }
2591 }
2592
2593 return m_clang_modules_decl_vendor_ap.get();
2594}
Greg Clayton9585fbf2013-03-19 00:20:55 +00002595
Greg Clayton44d93782014-01-27 23:43:24 +00002596Target::StopHookSP
2597Target::CreateStopHook ()
Jim Ingham9575d842011-03-11 03:53:59 +00002598{
2599 lldb::user_id_t new_uid = ++m_stop_hook_next_id;
Greg Clayton44d93782014-01-27 23:43:24 +00002600 Target::StopHookSP stop_hook_sp (new StopHook(shared_from_this(), new_uid));
2601 m_stop_hooks[new_uid] = stop_hook_sp;
2602 return stop_hook_sp;
Jim Ingham9575d842011-03-11 03:53:59 +00002603}
2604
2605bool
2606Target::RemoveStopHookByID (lldb::user_id_t user_id)
2607{
2608 size_t num_removed;
2609 num_removed = m_stop_hooks.erase (user_id);
2610 if (num_removed == 0)
2611 return false;
2612 else
2613 return true;
2614}
2615
2616void
2617Target::RemoveAllStopHooks ()
2618{
2619 m_stop_hooks.clear();
2620}
2621
2622Target::StopHookSP
2623Target::GetStopHookByID (lldb::user_id_t user_id)
2624{
2625 StopHookSP found_hook;
2626
2627 StopHookCollection::iterator specified_hook_iter;
2628 specified_hook_iter = m_stop_hooks.find (user_id);
2629 if (specified_hook_iter != m_stop_hooks.end())
2630 found_hook = (*specified_hook_iter).second;
2631 return found_hook;
2632}
2633
2634bool
2635Target::SetStopHookActiveStateByID (lldb::user_id_t user_id, bool active_state)
2636{
2637 StopHookCollection::iterator specified_hook_iter;
2638 specified_hook_iter = m_stop_hooks.find (user_id);
2639 if (specified_hook_iter == m_stop_hooks.end())
2640 return false;
2641
2642 (*specified_hook_iter).second->SetIsActive (active_state);
2643 return true;
2644}
2645
2646void
2647Target::SetAllStopHooksActiveState (bool active_state)
2648{
2649 StopHookCollection::iterator pos, end = m_stop_hooks.end();
2650 for (pos = m_stop_hooks.begin(); pos != end; pos++)
2651 {
2652 (*pos).second->SetIsActive (active_state);
2653 }
2654}
2655
2656void
2657Target::RunStopHooks ()
2658{
Jim Ingham6026ca32011-05-12 02:06:14 +00002659 if (m_suppress_stop_hooks)
2660 return;
2661
Jim Ingham9575d842011-03-11 03:53:59 +00002662 if (!m_process_sp)
2663 return;
Enrico Granatae2e091b2012-08-03 22:24:48 +00002664
2665 // <rdar://problem/12027563> make sure we check that we are not stopped because of us running a user expression
2666 // since in that case we do not want to run the stop-hooks
2667 if (m_process_sp->GetModIDRef().IsLastResumeForUserExpression())
2668 return;
2669
Jim Ingham9575d842011-03-11 03:53:59 +00002670 if (m_stop_hooks.empty())
2671 return;
2672
2673 StopHookCollection::iterator pos, end = m_stop_hooks.end();
2674
2675 // If there aren't any active stop hooks, don't bother either:
2676 bool any_active_hooks = false;
2677 for (pos = m_stop_hooks.begin(); pos != end; pos++)
2678 {
2679 if ((*pos).second->IsActive())
2680 {
2681 any_active_hooks = true;
2682 break;
2683 }
2684 }
2685 if (!any_active_hooks)
2686 return;
2687
2688 CommandReturnObject result;
2689
2690 std::vector<ExecutionContext> exc_ctx_with_reasons;
2691 std::vector<SymbolContext> sym_ctx_with_reasons;
2692
2693 ThreadList &cur_threadlist = m_process_sp->GetThreadList();
2694 size_t num_threads = cur_threadlist.GetSize();
2695 for (size_t i = 0; i < num_threads; i++)
2696 {
2697 lldb::ThreadSP cur_thread_sp = cur_threadlist.GetThreadAtIndex (i);
2698 if (cur_thread_sp->ThreadStoppedForAReason())
2699 {
Jason Molendab57e4a12013-11-04 09:33:30 +00002700 lldb::StackFrameSP cur_frame_sp = cur_thread_sp->GetStackFrameAtIndex(0);
Jim Ingham9575d842011-03-11 03:53:59 +00002701 exc_ctx_with_reasons.push_back(ExecutionContext(m_process_sp.get(), cur_thread_sp.get(), cur_frame_sp.get()));
2702 sym_ctx_with_reasons.push_back(cur_frame_sp->GetSymbolContext(eSymbolContextEverything));
2703 }
2704 }
2705
2706 // If no threads stopped for a reason, don't run the stop-hooks.
2707 size_t num_exe_ctx = exc_ctx_with_reasons.size();
2708 if (num_exe_ctx == 0)
2709 return;
2710
Jim Ingham5b52f0c2011-06-02 23:58:26 +00002711 result.SetImmediateOutputStream (m_debugger.GetAsyncOutputStream());
2712 result.SetImmediateErrorStream (m_debugger.GetAsyncErrorStream());
Jim Ingham9575d842011-03-11 03:53:59 +00002713
2714 bool keep_going = true;
2715 bool hooks_ran = false;
Jim Ingham381e25b2011-03-22 01:47:27 +00002716 bool print_hook_header;
2717 bool print_thread_header;
2718
2719 if (num_exe_ctx == 1)
2720 print_thread_header = false;
2721 else
2722 print_thread_header = true;
2723
2724 if (m_stop_hooks.size() == 1)
2725 print_hook_header = false;
2726 else
2727 print_hook_header = true;
2728
Jim Ingham9575d842011-03-11 03:53:59 +00002729 for (pos = m_stop_hooks.begin(); keep_going && pos != end; pos++)
2730 {
2731 // result.Clear();
2732 StopHookSP cur_hook_sp = (*pos).second;
2733 if (!cur_hook_sp->IsActive())
2734 continue;
2735
2736 bool any_thread_matched = false;
2737 for (size_t i = 0; keep_going && i < num_exe_ctx; i++)
2738 {
2739 if ((cur_hook_sp->GetSpecifier () == NULL
2740 || cur_hook_sp->GetSpecifier()->SymbolContextMatches(sym_ctx_with_reasons[i]))
2741 && (cur_hook_sp->GetThreadSpecifier() == NULL
Jim Ingham3d902922012-03-07 22:03:04 +00002742 || cur_hook_sp->GetThreadSpecifier()->ThreadPassesBasicTests(exc_ctx_with_reasons[i].GetThreadRef())))
Jim Ingham9575d842011-03-11 03:53:59 +00002743 {
2744 if (!hooks_ran)
2745 {
Jim Ingham9575d842011-03-11 03:53:59 +00002746 hooks_ran = true;
2747 }
Jim Ingham381e25b2011-03-22 01:47:27 +00002748 if (print_hook_header && !any_thread_matched)
Jim Ingham9575d842011-03-11 03:53:59 +00002749 {
Johnny Chenaeab25c2011-10-24 23:01:06 +00002750 const char *cmd = (cur_hook_sp->GetCommands().GetSize() == 1 ?
2751 cur_hook_sp->GetCommands().GetStringAtIndex(0) :
2752 NULL);
2753 if (cmd)
Daniel Malead01b2952012-11-29 21:49:15 +00002754 result.AppendMessageWithFormat("\n- Hook %" PRIu64 " (%s)\n", cur_hook_sp->GetID(), cmd);
Johnny Chenaeab25c2011-10-24 23:01:06 +00002755 else
Daniel Malead01b2952012-11-29 21:49:15 +00002756 result.AppendMessageWithFormat("\n- Hook %" PRIu64 "\n", cur_hook_sp->GetID());
Jim Ingham9575d842011-03-11 03:53:59 +00002757 any_thread_matched = true;
2758 }
2759
Jim Ingham381e25b2011-03-22 01:47:27 +00002760 if (print_thread_header)
Greg Claytonc14ee322011-09-22 04:58:26 +00002761 result.AppendMessageWithFormat("-- Thread %d\n", exc_ctx_with_reasons[i].GetThreadPtr()->GetIndexID());
Jim Ingham26c7bf92014-10-11 00:38:27 +00002762
2763 CommandInterpreterRunOptions options;
2764 options.SetStopOnContinue (true);
2765 options.SetStopOnError (true);
2766 options.SetEchoCommands (false);
2767 options.SetPrintResults (true);
2768 options.SetAddToHistory (false);
2769
2770 GetDebugger().GetCommandInterpreter().HandleCommands (cur_hook_sp->GetCommands(),
2771 &exc_ctx_with_reasons[i],
2772 options,
Greg Clayton32e0a752011-03-30 18:16:51 +00002773 result);
Jim Ingham9575d842011-03-11 03:53:59 +00002774
2775 // If the command started the target going again, we should bag out of
2776 // running the stop hooks.
Greg Clayton32e0a752011-03-30 18:16:51 +00002777 if ((result.GetStatus() == eReturnStatusSuccessContinuingNoResult) ||
2778 (result.GetStatus() == eReturnStatusSuccessContinuingResult))
Jim Ingham9575d842011-03-11 03:53:59 +00002779 {
Daniel Malead01b2952012-11-29 21:49:15 +00002780 result.AppendMessageWithFormat ("Aborting stop hooks, hook %" PRIu64 " set the program running.", cur_hook_sp->GetID());
Jim Ingham9575d842011-03-11 03:53:59 +00002781 keep_going = false;
2782 }
2783 }
2784 }
2785 }
Jason Molenda879cf772011-09-23 00:42:55 +00002786
Caroline Tice969ed3d2011-05-02 20:41:46 +00002787 result.GetImmediateOutputStream()->Flush();
2788 result.GetImmediateErrorStream()->Flush();
Jim Ingham9575d842011-03-11 03:53:59 +00002789}
2790
Greg Claytonfbb76342013-11-20 21:07:01 +00002791const TargetPropertiesSP &
2792Target::GetGlobalProperties()
2793{
2794 static TargetPropertiesSP g_settings_sp;
2795 if (!g_settings_sp)
2796 {
2797 g_settings_sp.reset (new TargetProperties (NULL));
2798 }
2799 return g_settings_sp;
2800}
2801
2802Error
2803Target::Install (ProcessLaunchInfo *launch_info)
2804{
2805 Error error;
2806 PlatformSP platform_sp (GetPlatform());
2807 if (platform_sp)
2808 {
2809 if (platform_sp->IsRemote())
2810 {
2811 if (platform_sp->IsConnected())
2812 {
2813 // Install all files that have an install path, and always install the
2814 // main executable when connected to a remote platform
2815 const ModuleList& modules = GetImages();
2816 const size_t num_images = modules.GetSize();
2817 for (size_t idx = 0; idx < num_images; ++idx)
2818 {
2819 const bool is_main_executable = idx == 0;
2820 ModuleSP module_sp(modules.GetModuleAtIndex(idx));
2821 if (module_sp)
2822 {
2823 FileSpec local_file (module_sp->GetFileSpec());
2824 if (local_file)
2825 {
2826 FileSpec remote_file (module_sp->GetRemoteInstallFileSpec());
2827 if (!remote_file)
2828 {
2829 if (is_main_executable) // TODO: add setting for always installing main executable???
2830 {
2831 // Always install the main executable
Chaoren Lind3173f32015-05-29 19:52:29 +00002832 remote_file = platform_sp->GetRemoteWorkingDirectory();
2833 remote_file.AppendPathComponent(module_sp->GetFileSpec().GetFilename().GetCString());
Greg Claytonfbb76342013-11-20 21:07:01 +00002834 }
2835 }
2836 if (remote_file)
2837 {
2838 error = platform_sp->Install(local_file, remote_file);
2839 if (error.Success())
2840 {
2841 module_sp->SetPlatformFileSpec(remote_file);
2842 if (is_main_executable)
2843 {
Chaoren Lind3173f32015-05-29 19:52:29 +00002844 platform_sp->SetFilePermissions(remote_file, 0700);
Greg Claytonfbb76342013-11-20 21:07:01 +00002845 if (launch_info)
2846 launch_info->SetExecutableFile(remote_file, false);
2847 }
2848 }
2849 else
2850 break;
2851 }
2852 }
2853 }
2854 }
2855 }
2856 }
2857 }
2858 return error;
2859}
Greg Clayton7b242382011-07-08 00:48:09 +00002860
Greg Claytond5944cd2013-12-06 01:12:00 +00002861bool
2862Target::ResolveLoadAddress (addr_t load_addr, Address &so_addr, uint32_t stop_id)
2863{
2864 return m_section_load_history.ResolveLoadAddress(stop_id, load_addr, so_addr);
2865}
2866
2867bool
Matthew Gardinerc928de32014-10-22 07:22:56 +00002868Target::ResolveFileAddress (lldb::addr_t file_addr, Address &resolved_addr)
2869{
2870 return m_images.ResolveFileAddress(file_addr, resolved_addr);
2871}
2872
2873bool
Greg Claytond5944cd2013-12-06 01:12:00 +00002874Target::SetSectionLoadAddress (const SectionSP &section_sp, addr_t new_section_load_addr, bool warn_multiple)
2875{
2876 const addr_t old_section_load_addr = m_section_load_history.GetSectionLoadAddress (SectionLoadHistory::eStopIDNow, section_sp);
2877 if (old_section_load_addr != new_section_load_addr)
2878 {
2879 uint32_t stop_id = 0;
2880 ProcessSP process_sp(GetProcessSP());
2881 if (process_sp)
2882 stop_id = process_sp->GetStopID();
2883 else
2884 stop_id = m_section_load_history.GetLastStopID();
2885 if (m_section_load_history.SetSectionLoadAddress (stop_id, section_sp, new_section_load_addr, warn_multiple))
2886 return true; // Return true if the section load address was changed...
2887 }
2888 return false; // Return false to indicate nothing changed
Greg Claytond5944cd2013-12-06 01:12:00 +00002889}
2890
Greg Clayton8012cad2014-11-17 19:39:20 +00002891size_t
2892Target::UnloadModuleSections (const ModuleList &module_list)
2893{
2894 size_t section_unload_count = 0;
2895 size_t num_modules = module_list.GetSize();
2896 for (size_t i=0; i<num_modules; ++i)
2897 {
2898 section_unload_count += UnloadModuleSections (module_list.GetModuleAtIndex(i));
2899 }
2900 return section_unload_count;
2901}
2902
2903size_t
2904Target::UnloadModuleSections (const lldb::ModuleSP &module_sp)
2905{
2906 uint32_t stop_id = 0;
2907 ProcessSP process_sp(GetProcessSP());
2908 if (process_sp)
2909 stop_id = process_sp->GetStopID();
2910 else
2911 stop_id = m_section_load_history.GetLastStopID();
2912 SectionList *sections = module_sp->GetSectionList();
2913 size_t section_unload_count = 0;
2914 if (sections)
2915 {
2916 const uint32_t num_sections = sections->GetNumSections(0);
2917 for (uint32_t i = 0; i < num_sections; ++i)
2918 {
2919 section_unload_count += m_section_load_history.SetSectionUnloaded(stop_id, sections->GetSectionAtIndex(i));
2920 }
2921 }
2922 return section_unload_count;
2923}
2924
Greg Claytond5944cd2013-12-06 01:12:00 +00002925bool
2926Target::SetSectionUnloaded (const lldb::SectionSP &section_sp)
2927{
2928 uint32_t stop_id = 0;
2929 ProcessSP process_sp(GetProcessSP());
2930 if (process_sp)
2931 stop_id = process_sp->GetStopID();
2932 else
2933 stop_id = m_section_load_history.GetLastStopID();
2934 return m_section_load_history.SetSectionUnloaded (stop_id, section_sp);
2935}
2936
2937bool
2938Target::SetSectionUnloaded (const lldb::SectionSP &section_sp, addr_t load_addr)
2939{
2940 uint32_t stop_id = 0;
2941 ProcessSP process_sp(GetProcessSP());
2942 if (process_sp)
2943 stop_id = process_sp->GetStopID();
2944 else
2945 stop_id = m_section_load_history.GetLastStopID();
2946 return m_section_load_history.SetSectionUnloaded (stop_id, section_sp, load_addr);
2947}
2948
2949void
2950Target::ClearAllLoadedSections ()
2951{
2952 m_section_load_history.Clear();
2953}
2954
Greg Claytonb09c5382013-12-13 17:20:18 +00002955Error
Greg Clayton8012cad2014-11-17 19:39:20 +00002956Target::Launch (ProcessLaunchInfo &launch_info, Stream *stream)
Greg Claytonb09c5382013-12-13 17:20:18 +00002957{
2958 Error error;
Todd Fialaac33cc92014-10-09 01:02:08 +00002959 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TARGET));
2960
2961 if (log)
2962 log->Printf ("Target::%s() called for %s", __FUNCTION__, launch_info.GetExecutableFile().GetPath().c_str ());
2963
Greg Claytonb09c5382013-12-13 17:20:18 +00002964 StateType state = eStateInvalid;
2965
Greg Clayton6b32f1e2013-12-18 02:06:45 +00002966 // Scope to temporarily get the process state in case someone has manually
2967 // remotely connected already to a process and we can skip the platform
2968 // launching.
2969 {
2970 ProcessSP process_sp (GetProcessSP());
2971
2972 if (process_sp)
Todd Fialaac33cc92014-10-09 01:02:08 +00002973 {
Greg Clayton6b32f1e2013-12-18 02:06:45 +00002974 state = process_sp->GetState();
Todd Fialaac33cc92014-10-09 01:02:08 +00002975 if (log)
2976 log->Printf ("Target::%s the process exists, and its current state is %s", __FUNCTION__, StateAsCString (state));
2977 }
2978 else
2979 {
2980 if (log)
2981 log->Printf ("Target::%s the process instance doesn't currently exist.", __FUNCTION__);
2982 }
Greg Clayton6b32f1e2013-12-18 02:06:45 +00002983 }
2984
Greg Claytonb09c5382013-12-13 17:20:18 +00002985 launch_info.GetFlags().Set (eLaunchFlagDebug);
2986
2987 // Get the value of synchronous execution here. If you wait till after you have started to
2988 // run, then you could have hit a breakpoint, whose command might switch the value, and
2989 // then you'll pick up that incorrect value.
2990 Debugger &debugger = GetDebugger();
2991 const bool synchronous_execution = debugger.GetCommandInterpreter().GetSynchronous ();
2992
2993 PlatformSP platform_sp (GetPlatform());
2994
2995 // Finalize the file actions, and if none were given, default to opening
2996 // up a pseudo terminal
2997 const bool default_to_use_pty = platform_sp ? platform_sp->IsHost() : false;
Todd Fiala75f47c32014-10-11 21:42:09 +00002998 if (log)
2999 log->Printf ("Target::%s have platform=%s, platform_sp->IsHost()=%s, default_to_use_pty=%s",
3000 __FUNCTION__,
3001 platform_sp ? "true" : "false",
3002 platform_sp ? (platform_sp->IsHost () ? "true" : "false") : "n/a",
3003 default_to_use_pty ? "true" : "false");
3004
Greg Claytonb09c5382013-12-13 17:20:18 +00003005 launch_info.FinalizeFileActions (this, default_to_use_pty);
3006
3007 if (state == eStateConnected)
3008 {
3009 if (launch_info.GetFlags().Test (eLaunchFlagLaunchInTTY))
3010 {
3011 error.SetErrorString("can't launch in tty when launching through a remote connection");
3012 return error;
3013 }
3014 }
3015
3016 if (!launch_info.GetArchitecture().IsValid())
3017 launch_info.GetArchitecture() = GetArchitecture();
Todd Fiala015d8182014-07-22 23:41:36 +00003018
3019 // 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 +00003020 if (state != eStateConnected && platform_sp && platform_sp->CanDebugProcess ())
3021 {
Todd Fialaac33cc92014-10-09 01:02:08 +00003022 if (log)
3023 log->Printf ("Target::%s asking the platform to debug the process", __FUNCTION__);
3024
Greg Clayton5df78fa2015-05-23 03:54:53 +00003025 // Get a weak pointer to the previous process if we have one
3026 ProcessWP process_wp;
3027 if (m_process_sp)
3028 process_wp = m_process_sp;
Greg Claytonb09c5382013-12-13 17:20:18 +00003029 m_process_sp = GetPlatform()->DebugProcess (launch_info,
3030 debugger,
3031 this,
Greg Claytonb09c5382013-12-13 17:20:18 +00003032 error);
Greg Clayton5df78fa2015-05-23 03:54:53 +00003033
3034 // Cleanup the old process since someone might still have a strong
3035 // reference to this process and we would like to allow it to cleanup
3036 // as much as it can without the object being destroyed. We try to
3037 // lock the shared pointer and if that works, then someone else still
3038 // has a strong reference to the process.
3039
3040 ProcessSP old_process_sp(process_wp.lock());
3041 if (old_process_sp)
3042 old_process_sp->Finalize();
Greg Claytonb09c5382013-12-13 17:20:18 +00003043 }
3044 else
3045 {
Todd Fialaac33cc92014-10-09 01:02:08 +00003046 if (log)
3047 log->Printf ("Target::%s the platform doesn't know how to debug a process, getting a process plugin to do this for us.", __FUNCTION__);
3048
Greg Claytonb09c5382013-12-13 17:20:18 +00003049 if (state == eStateConnected)
3050 {
3051 assert(m_process_sp);
3052 }
3053 else
3054 {
Todd Fiala015d8182014-07-22 23:41:36 +00003055 // Use a Process plugin to construct the process.
Greg Claytonb09c5382013-12-13 17:20:18 +00003056 const char *plugin_name = launch_info.GetProcessPluginName();
Greg Clayton8012cad2014-11-17 19:39:20 +00003057 CreateProcess (launch_info.GetListenerForProcess(debugger), plugin_name, NULL);
Greg Claytonb09c5382013-12-13 17:20:18 +00003058 }
Todd Fiala015d8182014-07-22 23:41:36 +00003059
3060 // Since we didn't have a platform launch the process, launch it here.
Greg Claytonb09c5382013-12-13 17:20:18 +00003061 if (m_process_sp)
3062 error = m_process_sp->Launch (launch_info);
3063 }
3064
3065 if (!m_process_sp)
3066 {
3067 if (error.Success())
3068 error.SetErrorString("failed to launch or debug process");
3069 return error;
3070 }
3071
3072 if (error.Success())
3073 {
Ilia K064e69f2015-03-23 21:16:25 +00003074 if (synchronous_execution || launch_info.GetFlags().Test(eLaunchFlagStopAtEntry) == false)
Greg Claytonb09c5382013-12-13 17:20:18 +00003075 {
Greg Clayton44d93782014-01-27 23:43:24 +00003076 ListenerSP hijack_listener_sp (launch_info.GetHijackListener());
Zachary Turnere6d213a2015-03-26 20:41:14 +00003077 if (!hijack_listener_sp)
3078 {
3079 hijack_listener_sp.reset(new Listener("lldb.Target.Launch.hijack"));
3080 launch_info.SetHijackListener(hijack_listener_sp);
3081 m_process_sp->HijackProcessEvents(hijack_listener_sp.get());
3082 }
Todd Fialaac33cc92014-10-09 01:02:08 +00003083
Ilia K38810f42015-05-20 10:15:47 +00003084 StateType state = m_process_sp->WaitForProcessToStop (NULL, NULL, false, hijack_listener_sp.get(), NULL);
Greg Claytonb09c5382013-12-13 17:20:18 +00003085
3086 if (state == eStateStopped)
3087 {
Zachary Turnere6d213a2015-03-26 20:41:14 +00003088 if (!launch_info.GetFlags().Test(eLaunchFlagStopAtEntry))
Greg Claytonb09c5382013-12-13 17:20:18 +00003089 {
Zachary Turnere6d213a2015-03-26 20:41:14 +00003090 if (synchronous_execution)
Greg Claytonb09c5382013-12-13 17:20:18 +00003091 {
Zachary Turnere6d213a2015-03-26 20:41:14 +00003092 error = m_process_sp->PrivateResume();
3093 if (error.Success())
Greg Claytonb09c5382013-12-13 17:20:18 +00003094 {
Ilia K064e69f2015-03-23 21:16:25 +00003095 state = m_process_sp->WaitForProcessToStop (NULL, NULL, true, hijack_listener_sp.get(), stream);
3096 const bool must_be_alive = false; // eStateExited is ok, so this must be false
3097 if (!StateIsStoppedState(state, must_be_alive))
3098 {
3099 error.SetErrorStringWithFormat("process isn't stopped: %s", StateAsCString(state));
3100 }
Greg Claytonb09c5382013-12-13 17:20:18 +00003101 }
3102 }
Ilia K064e69f2015-03-23 21:16:25 +00003103 else
3104 {
Zachary Turnere6d213a2015-03-26 20:41:14 +00003105 m_process_sp->RestoreProcessEvents();
3106 error = m_process_sp->PrivateResume();
Zachary Turnere6d213a2015-03-26 20:41:14 +00003107 }
3108 if (!error.Success())
3109 {
Ilia K064e69f2015-03-23 21:16:25 +00003110 Error error2;
3111 error2.SetErrorStringWithFormat("process resume at entry point failed: %s", error.AsCString());
3112 error = error2;
3113 }
Greg Claytonb09c5382013-12-13 17:20:18 +00003114 }
Greg Claytonb09c5382013-12-13 17:20:18 +00003115 }
Greg Clayton40286e02014-04-30 20:29:09 +00003116 else if (state == eStateExited)
3117 {
Zachary Turner10687b02014-10-20 17:46:43 +00003118 bool with_shell = !!launch_info.GetShell();
Greg Clayton40286e02014-04-30 20:29:09 +00003119 const int exit_status = m_process_sp->GetExitStatus();
3120 const char *exit_desc = m_process_sp->GetExitDescription();
3121#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'."
3122 if (exit_desc && exit_desc[0])
3123 {
3124 if (with_shell)
3125 error.SetErrorStringWithFormat ("process exited with status %i (%s)" LAUNCH_SHELL_MESSAGE, exit_status, exit_desc);
3126 else
3127 error.SetErrorStringWithFormat ("process exited with status %i (%s)", exit_status, exit_desc);
3128 }
3129 else
3130 {
3131 if (with_shell)
3132 error.SetErrorStringWithFormat ("process exited with status %i" LAUNCH_SHELL_MESSAGE, exit_status);
3133 else
3134 error.SetErrorStringWithFormat ("process exited with status %i", exit_status);
3135 }
3136 }
Greg Claytonb09c5382013-12-13 17:20:18 +00003137 else
3138 {
3139 error.SetErrorStringWithFormat ("initial process state wasn't stopped: %s", StateAsCString(state));
3140 }
3141 }
Greg Clayton44d93782014-01-27 23:43:24 +00003142 m_process_sp->RestoreProcessEvents ();
Greg Claytonb09c5382013-12-13 17:20:18 +00003143 }
3144 else
3145 {
Greg Clayton44d93782014-01-27 23:43:24 +00003146 Error error2;
Greg Claytonb09c5382013-12-13 17:20:18 +00003147 error2.SetErrorStringWithFormat ("process launch failed: %s", error.AsCString());
Greg Clayton44d93782014-01-27 23:43:24 +00003148 error = error2;
Greg Claytonb09c5382013-12-13 17:20:18 +00003149 }
3150 return error;
3151}
Oleksiy Vyalov37386142015-02-10 22:49:57 +00003152
3153Error
3154Target::Attach (ProcessAttachInfo &attach_info, Stream *stream)
3155{
3156 auto state = eStateInvalid;
3157 auto process_sp = GetProcessSP ();
3158 if (process_sp)
3159 {
3160 state = process_sp->GetState ();
3161 if (process_sp->IsAlive () && state != eStateConnected)
3162 {
3163 if (state == eStateAttaching)
3164 return Error ("process attach is in progress");
3165 return Error ("a process is already being debugged");
3166 }
3167 }
3168
Oleksiy Vyalov37386142015-02-10 22:49:57 +00003169 const ModuleSP old_exec_module_sp = GetExecutableModule ();
3170
3171 // If no process info was specified, then use the target executable
3172 // name as the process to attach to by default
3173 if (!attach_info.ProcessInfoSpecified ())
3174 {
3175 if (old_exec_module_sp)
3176 attach_info.GetExecutableFile ().GetFilename () = old_exec_module_sp->GetPlatformFileSpec ().GetFilename ();
3177
3178 if (!attach_info.ProcessInfoSpecified ())
3179 {
3180 return Error ("no process specified, create a target with a file, or specify the --pid or --name");
3181 }
3182 }
3183
3184 const auto platform_sp = GetDebugger ().GetPlatformList ().GetSelectedPlatform ();
Greg Claytonb3788ea2015-10-05 22:58:37 +00003185 ListenerSP hijack_listener_sp;
3186 const bool async = attach_info.GetAsync();
3187 if (async == false)
3188 {
3189 hijack_listener_sp.reset (new Listener ("lldb.Target.Attach.attach.hijack"));
3190 attach_info.SetHijackListener (hijack_listener_sp);
3191 }
Oleksiy Vyalov37386142015-02-10 22:49:57 +00003192
3193 Error error;
3194 if (state != eStateConnected && platform_sp != nullptr && platform_sp->CanDebugProcess ())
3195 {
3196 SetPlatform (platform_sp);
3197 process_sp = platform_sp->Attach (attach_info, GetDebugger (), this, error);
3198 }
3199 else
3200 {
3201 if (state != eStateConnected)
3202 {
3203 const char *plugin_name = attach_info.GetProcessPluginName ();
3204 process_sp = CreateProcess (attach_info.GetListenerForProcess (GetDebugger ()), plugin_name, nullptr);
3205 if (process_sp == nullptr)
3206 {
3207 error.SetErrorStringWithFormat ("failed to create process using plugin %s", (plugin_name) ? plugin_name : "null");
3208 return error;
3209 }
3210 }
Greg Claytonb3788ea2015-10-05 22:58:37 +00003211 if (hijack_listener_sp)
3212 process_sp->HijackProcessEvents (hijack_listener_sp.get ());
Oleksiy Vyalov37386142015-02-10 22:49:57 +00003213 error = process_sp->Attach (attach_info);
3214 }
3215
Greg Claytone75e5d82015-10-20 00:14:20 +00003216 if (error.Success () && process_sp)
Oleksiy Vyalov37386142015-02-10 22:49:57 +00003217 {
Greg Claytone75e5d82015-10-20 00:14:20 +00003218 if (async)
Oleksiy Vyalov37386142015-02-10 22:49:57 +00003219 {
Greg Claytone75e5d82015-10-20 00:14:20 +00003220 process_sp->RestoreProcessEvents ();
3221 }
3222 else
3223 {
3224 state = process_sp->WaitForProcessToStop (nullptr, nullptr, false, attach_info.GetHijackListener ().get (), stream);
3225 process_sp->RestoreProcessEvents ();
3226
3227 if (state != eStateStopped)
3228 {
3229 const char *exit_desc = process_sp->GetExitDescription ();
3230 if (exit_desc)
3231 error.SetErrorStringWithFormat ("%s", exit_desc);
3232 else
3233 error.SetErrorString ("process did not stop (no such process or permission problem?)");
3234 process_sp->Destroy (false);
3235 }
Oleksiy Vyalov37386142015-02-10 22:49:57 +00003236 }
3237 }
3238 return error;
3239}
3240
Jim Ingham9575d842011-03-11 03:53:59 +00003241//--------------------------------------------------------------
Greg Claytonfbb76342013-11-20 21:07:01 +00003242// Target::StopHook
Jim Ingham9575d842011-03-11 03:53:59 +00003243//--------------------------------------------------------------
Jim Ingham9575d842011-03-11 03:53:59 +00003244Target::StopHook::StopHook (lldb::TargetSP target_sp, lldb::user_id_t uid) :
3245 UserID (uid),
3246 m_target_sp (target_sp),
Jim Ingham9575d842011-03-11 03:53:59 +00003247 m_commands (),
3248 m_specifier_sp (),
Greg Claytone01e07b2013-04-18 18:10:51 +00003249 m_thread_spec_ap(),
Stephen Wilson71c21d12011-04-11 19:41:40 +00003250 m_active (true)
Jim Ingham9575d842011-03-11 03:53:59 +00003251{
3252}
3253
3254Target::StopHook::StopHook (const StopHook &rhs) :
3255 UserID (rhs.GetID()),
3256 m_target_sp (rhs.m_target_sp),
3257 m_commands (rhs.m_commands),
3258 m_specifier_sp (rhs.m_specifier_sp),
Greg Claytone01e07b2013-04-18 18:10:51 +00003259 m_thread_spec_ap (),
Stephen Wilson71c21d12011-04-11 19:41:40 +00003260 m_active (rhs.m_active)
Jim Ingham9575d842011-03-11 03:53:59 +00003261{
3262 if (rhs.m_thread_spec_ap.get() != NULL)
3263 m_thread_spec_ap.reset (new ThreadSpec(*rhs.m_thread_spec_ap.get()));
3264}
3265
Eugene Zelenko8f30a652015-10-23 18:39:37 +00003266Target::StopHook::~StopHook() = default;
Jim Ingham9575d842011-03-11 03:53:59 +00003267
3268void
Zachary Turner32abc6e2015-03-03 19:23:09 +00003269Target::StopHook::SetSpecifier(SymbolContextSpecifier *specifier)
3270{
3271 m_specifier_sp.reset(specifier);
3272}
3273
3274void
Jim Ingham9575d842011-03-11 03:53:59 +00003275Target::StopHook::SetThreadSpecifier (ThreadSpec *specifier)
3276{
3277 m_thread_spec_ap.reset (specifier);
3278}
Jim Ingham9575d842011-03-11 03:53:59 +00003279
3280void
3281Target::StopHook::GetDescription (Stream *s, lldb::DescriptionLevel level) const
3282{
3283 int indent_level = s->GetIndentLevel();
3284
3285 s->SetIndentLevel(indent_level + 2);
3286
Daniel Malead01b2952012-11-29 21:49:15 +00003287 s->Printf ("Hook: %" PRIu64 "\n", GetID());
Jim Ingham9575d842011-03-11 03:53:59 +00003288 if (m_active)
3289 s->Indent ("State: enabled\n");
3290 else
3291 s->Indent ("State: disabled\n");
3292
3293 if (m_specifier_sp)
3294 {
3295 s->Indent();
3296 s->PutCString ("Specifier:\n");
3297 s->SetIndentLevel (indent_level + 4);
3298 m_specifier_sp->GetDescription (s, level);
3299 s->SetIndentLevel (indent_level + 2);
3300 }
3301
3302 if (m_thread_spec_ap.get() != NULL)
3303 {
3304 StreamString tmp;
3305 s->Indent("Thread:\n");
3306 m_thread_spec_ap->GetDescription (&tmp, level);
3307 s->SetIndentLevel (indent_level + 4);
3308 s->Indent (tmp.GetData());
3309 s->PutCString ("\n");
3310 s->SetIndentLevel (indent_level + 2);
3311 }
3312
3313 s->Indent ("Commands: \n");
3314 s->SetIndentLevel (indent_level + 4);
3315 uint32_t num_commands = m_commands.GetSize();
3316 for (uint32_t i = 0; i < num_commands; i++)
3317 {
3318 s->Indent(m_commands.GetStringAtIndex(i));
3319 s->PutCString ("\n");
3320 }
3321 s->SetIndentLevel (indent_level);
3322}
3323
Greg Clayton67cc0632012-08-22 17:17:09 +00003324//--------------------------------------------------------------
3325// class TargetProperties
3326//--------------------------------------------------------------
3327
3328OptionEnumValueElement
3329lldb_private::g_dynamic_value_types[] =
Caroline Ticedaccaa92010-09-20 20:44:43 +00003330{
Greg Clayton67cc0632012-08-22 17:17:09 +00003331 { eNoDynamicValues, "no-dynamic-values", "Don't calculate the dynamic type of values"},
3332 { eDynamicCanRunTarget, "run-target", "Calculate the dynamic type of values even if you have to run the target."},
3333 { eDynamicDontRunTarget, "no-run-target", "Calculate the dynamic type of values, but don't run the target."},
3334 { 0, NULL, NULL }
3335};
Caroline Ticedaccaa92010-09-20 20:44:43 +00003336
Greg Clayton1f746072012-08-29 21:13:06 +00003337static OptionEnumValueElement
3338g_inline_breakpoint_enums[] =
3339{
3340 { 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."},
3341 { eInlineBreakpointsHeaders, "headers", "Only check for inline breakpoint locations when setting breakpoints in header files, but not when setting breakpoint in implementation source files (default)."},
3342 { eInlineBreakpointsAlways, "always", "Always look for inline breakpoint locations when setting file and line breakpoints (slower but most accurate)."},
3343 { 0, NULL, NULL }
3344};
3345
Jim Ingham0f063ba2013-03-02 00:26:47 +00003346typedef enum x86DisassemblyFlavor
3347{
3348 eX86DisFlavorDefault,
3349 eX86DisFlavorIntel,
3350 eX86DisFlavorATT
3351} x86DisassemblyFlavor;
3352
3353static OptionEnumValueElement
3354g_x86_dis_flavor_value_types[] =
3355{
3356 { eX86DisFlavorDefault, "default", "Disassembler default (currently att)."},
3357 { eX86DisFlavorIntel, "intel", "Intel disassembler flavor."},
3358 { eX86DisFlavorATT, "att", "AT&T disassembler flavor."},
3359 { 0, NULL, NULL }
3360};
3361
Enrico Granata397ddd52013-05-21 20:13:34 +00003362static OptionEnumValueElement
Daniel Malead79ae052013-08-07 21:54:09 +00003363g_hex_immediate_style_values[] =
3364{
3365 { Disassembler::eHexStyleC, "c", "C-style (0xffff)."},
3366 { Disassembler::eHexStyleAsm, "asm", "Asm-style (0ffffh)."},
3367 { 0, NULL, NULL }
3368};
3369
3370static OptionEnumValueElement
Enrico Granata397ddd52013-05-21 20:13:34 +00003371g_load_script_from_sym_file_values[] =
3372{
3373 { eLoadScriptFromSymFileTrue, "true", "Load debug scripts inside symbol files"},
3374 { eLoadScriptFromSymFileFalse, "false", "Do not load debug scripts inside symbol files."},
3375 { eLoadScriptFromSymFileWarn, "warn", "Warn about debug scripts inside symbol files but do not load them."},
3376 { 0, NULL, NULL }
3377};
3378
Greg Claytonfd814c52013-08-13 01:42:25 +00003379static OptionEnumValueElement
3380g_memory_module_load_level_values[] =
3381{
Greg Clayton86eac942013-08-13 21:32:34 +00003382 { eMemoryModuleLoadLevelMinimal, "minimal" , "Load minimal information when loading modules from memory. Currently this setting loads sections only."},
Greg Claytonfd814c52013-08-13 01:42:25 +00003383 { eMemoryModuleLoadLevelPartial, "partial" , "Load partial information when loading modules from memory. Currently this setting loads sections and function bounds."},
3384 { eMemoryModuleLoadLevelComplete, "complete", "Load complete information when loading modules from memory. Currently this setting loads sections and all symbols."},
3385 { 0, NULL, NULL }
3386};
3387
Greg Clayton67cc0632012-08-22 17:17:09 +00003388static PropertyDefinition
3389g_properties[] =
Caroline Ticedaccaa92010-09-20 20:44:43 +00003390{
Greg Clayton67cc0632012-08-22 17:17:09 +00003391 { "default-arch" , OptionValue::eTypeArch , true , 0 , NULL, NULL, "Default architecture to choose, when there's a choice." },
Ilia K055ad9b2015-05-18 13:41:01 +00003392 { "move-to-nearest-code" , OptionValue::eTypeBoolean , false, true , NULL, NULL, "Move breakpoints to nearest code." },
Dawn Perchike0c96ac2015-07-30 22:10:08 +00003393 { "language" , OptionValue::eTypeLanguage , false, eLanguageTypeUnknown , NULL, NULL, "The language to use when interpreting expressions entered in commands." },
Greg Clayton67cc0632012-08-22 17:17:09 +00003394 { "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 +00003395 { "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 +00003396 { "enable-synthetic-value" , OptionValue::eTypeBoolean , false, true , NULL, NULL, "Should synthetic values be used by default whenever available." },
3397 { "skip-prologue" , OptionValue::eTypeBoolean , false, true , NULL, NULL, "Skip function prologues when setting breakpoints by name." },
Jim Ingham0ca778e2015-09-15 18:03:00 +00003398 { "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 +00003399 "where it exists on the current system. It consists of an array of duples, the first element of each duple is "
3400 "some part (starting at the root) of the path to the file when it was built, "
3401 "and the second is where the remainder of the original build hierarchy is rooted on the local system. "
3402 "Each element of the array is checked in order and the first one that results in a match wins." },
3403 { "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 +00003404 { "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 +00003405 { "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 +00003406 { "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 +00003407 { "max-children-count" , OptionValue::eTypeSInt64 , false, 256 , NULL, NULL, "Maximum number of children to expand in any level of depth." },
3408 { "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 +00003409 { "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 +00003410 { "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 +00003411 { "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." },
3412 { "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 +00003413 { "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." },
3414 { "inherit-env" , OptionValue::eTypeBoolean , false, true , NULL, NULL, "Inherit the environment from the process that is running LLDB." },
3415 { "input-path" , OptionValue::eTypeFileSpec , false, 0 , NULL, NULL, "The file/path to be used by the executable program for reading its standard input." },
3416 { "output-path" , OptionValue::eTypeFileSpec , false, 0 , NULL, NULL, "The file/path to be used by the executable program for writing its standard output." },
3417 { "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 +00003418 { "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 +00003419 { "disable-aslr" , OptionValue::eTypeBoolean , false, true , NULL, NULL, "Disable Address Space Layout Randomization (ASLR)" },
3420 { "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 +00003421 { "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 +00003422 "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 +00003423 "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 +00003424 "Sometimes code might #include implementation files and cause inlined breakpoint locations in inlined implementation files. "
Todd Fialaad6eee62014-09-24 19:59:13 +00003425 "Always checking for inlined breakpoint locations can be expensive (memory and time), so if you have a project with many headers "
3426 "and find that setting breakpoints is slow, then you can change this setting to headers. "
3427 "This setting allows you to control exactly which strategy is used when setting "
Greg Clayton1f746072012-08-29 21:13:06 +00003428 "file and line breakpoints." },
Jim Ingham0f063ba2013-03-02 00:26:47 +00003429 // 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.
3430 { "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 +00003431 { "use-hex-immediates" , OptionValue::eTypeBoolean , false, true, NULL, NULL, "Show immediates in disassembly as hexadecimal." },
3432 { "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 +00003433 { "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 +00003434 { "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 +00003435 { "memory-module-load-level" , OptionValue::eTypeEnum , false, eMemoryModuleLoadLevelComplete, NULL, g_memory_module_load_level_values,
3436 "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. "
3437 "This setting helps users control how much information gets loaded when loading modules from memory."
3438 "'complete' is the default value for this setting which will load all sections and symbols by reading them from memory (slowest, most accurate). "
3439 "'partial' will load sections and attempt to find function bounds without downloading the symbol table (faster, still accurate, missing symbol names). "
3440 "'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 +00003441 { "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 +00003442 { "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 +00003443 { "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 +00003444 { "non-stop-mode" , OptionValue::eTypeBoolean , false, 0, NULL, NULL, "Disable lock-step debugging, instead control threads independently." },
Greg Clayton67cc0632012-08-22 17:17:09 +00003445 { NULL , OptionValue::eTypeInvalid , false, 0 , NULL, NULL, NULL }
3446};
Enrico Granata560558e2015-02-11 02:35:39 +00003447
Greg Clayton67cc0632012-08-22 17:17:09 +00003448enum
Caroline Ticedaccaa92010-09-20 20:44:43 +00003449{
Greg Clayton67cc0632012-08-22 17:17:09 +00003450 ePropertyDefaultArch,
Ilia K055ad9b2015-05-18 13:41:01 +00003451 ePropertyMoveToNearestCode,
Dawn Perchik23b1dec2015-07-21 22:05:07 +00003452 ePropertyLanguage,
Greg Clayton67cc0632012-08-22 17:17:09 +00003453 ePropertyExprPrefix,
3454 ePropertyPreferDynamic,
3455 ePropertyEnableSynthetic,
3456 ePropertySkipPrologue,
3457 ePropertySourceMap,
3458 ePropertyExecutableSearchPaths,
Michael Sartaina7499c92013-07-01 19:45:50 +00003459 ePropertyDebugFileSearchPaths,
Sean Callanan85054342015-04-03 15:39:47 +00003460 ePropertyClangModuleSearchPaths,
Sean Callananf0c5aeb2015-04-20 16:31:29 +00003461 ePropertyAutoImportClangModules,
Greg Clayton67cc0632012-08-22 17:17:09 +00003462 ePropertyMaxChildrenCount,
3463 ePropertyMaxSummaryLength,
Enrico Granatad325bf92013-06-04 22:54:16 +00003464 ePropertyMaxMemReadSize,
Greg Clayton67cc0632012-08-22 17:17:09 +00003465 ePropertyBreakpointUseAvoidList,
Greg Clayton45392552012-10-17 22:57:12 +00003466 ePropertyArg0,
Greg Clayton67cc0632012-08-22 17:17:09 +00003467 ePropertyRunArgs,
3468 ePropertyEnvVars,
3469 ePropertyInheritEnv,
3470 ePropertyInputPath,
3471 ePropertyOutputPath,
3472 ePropertyErrorPath,
Jim Ingham106d0282014-06-25 02:32:56 +00003473 ePropertyDetachOnError,
Greg Clayton67cc0632012-08-22 17:17:09 +00003474 ePropertyDisableASLR,
Greg Clayton1f746072012-08-29 21:13:06 +00003475 ePropertyDisableSTDIO,
Jim Ingham0f063ba2013-03-02 00:26:47 +00003476 ePropertyInlineStrategy,
Jim Ingham17d023f2013-03-13 17:58:04 +00003477 ePropertyDisassemblyFlavor,
Daniel Malead79ae052013-08-07 21:54:09 +00003478 ePropertyUseHexImmediates,
3479 ePropertyHexImmediateStyle,
Enrico Granata2ea43cd2013-05-13 17:03:52 +00003480 ePropertyUseFastStepping,
Enrico Granata97303392013-05-21 00:00:30 +00003481 ePropertyLoadScriptFromSymbolFile,
Greg Claytonfb6621e2013-12-06 21:59:52 +00003482 ePropertyMemoryModuleLoadLevel,
Jason Molendaa4bea722014-02-14 05:06:49 +00003483 ePropertyDisplayExpressionsInCrashlogs,
Enrico Granata560558e2015-02-11 02:35:39 +00003484 ePropertyTrapHandlerNames,
Ewan Crawford78baa192015-05-13 09:18:18 +00003485 ePropertyDisplayRuntimeSupportValues,
3486 ePropertyNonStopModeEnabled
Greg Clayton67cc0632012-08-22 17:17:09 +00003487};
Caroline Ticedaccaa92010-09-20 20:44:43 +00003488
Greg Clayton67cc0632012-08-22 17:17:09 +00003489class TargetOptionValueProperties : public OptionValueProperties
Greg Claytonbfe5f3b2011-02-18 01:44:25 +00003490{
Greg Clayton67cc0632012-08-22 17:17:09 +00003491public:
3492 TargetOptionValueProperties (const ConstString &name) :
3493 OptionValueProperties (name),
3494 m_target (NULL),
3495 m_got_host_env (false)
Caroline Ticedaccaa92010-09-20 20:44:43 +00003496 {
Caroline Ticedaccaa92010-09-20 20:44:43 +00003497 }
Caroline Ticedaccaa92010-09-20 20:44:43 +00003498
Greg Clayton67cc0632012-08-22 17:17:09 +00003499 // This constructor is used when creating TargetOptionValueProperties when it
3500 // is part of a new lldb_private::Target instance. It will copy all current
3501 // global property values as needed
3502 TargetOptionValueProperties (Target *target, const TargetPropertiesSP &target_properties_sp) :
3503 OptionValueProperties(*target_properties_sp->GetValueProperties()),
3504 m_target (target),
3505 m_got_host_env (false)
Caroline Ticedaccaa92010-09-20 20:44:43 +00003506 {
Greg Clayton67cc0632012-08-22 17:17:09 +00003507 }
3508
Eugene Zelenko8f30a652015-10-23 18:39:37 +00003509 const Property *
3510 GetPropertyAtIndex(const ExecutionContext *exe_ctx, bool will_modify, uint32_t idx) const override
Greg Clayton67cc0632012-08-22 17:17:09 +00003511 {
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +00003512 // When getting the value for a key from the target options, we will always
Greg Clayton67cc0632012-08-22 17:17:09 +00003513 // try and grab the setting from the current target if there is one. Else we just
3514 // use the one from this instance.
3515 if (idx == ePropertyEnvVars)
3516 GetHostEnvironmentIfNeeded ();
3517
3518 if (exe_ctx)
3519 {
3520 Target *target = exe_ctx->GetTargetPtr();
3521 if (target)
3522 {
3523 TargetOptionValueProperties *target_properties = static_cast<TargetOptionValueProperties *>(target->GetValueProperties().get());
3524 if (this != target_properties)
3525 return target_properties->ProtectedGetPropertyAtIndex (idx);
3526 }
3527 }
3528 return ProtectedGetPropertyAtIndex (idx);
3529 }
Enrico Granata84a53df2013-05-20 22:29:23 +00003530
3531 lldb::TargetSP
3532 GetTargetSP ()
3533 {
3534 return m_target->shared_from_this();
3535 }
3536
Greg Clayton67cc0632012-08-22 17:17:09 +00003537protected:
Greg Clayton67cc0632012-08-22 17:17:09 +00003538 void
3539 GetHostEnvironmentIfNeeded () const
3540 {
3541 if (!m_got_host_env)
3542 {
3543 if (m_target)
3544 {
3545 m_got_host_env = true;
3546 const uint32_t idx = ePropertyInheritEnv;
3547 if (GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0))
3548 {
3549 PlatformSP platform_sp (m_target->GetPlatform());
3550 if (platform_sp)
3551 {
3552 StringList env;
3553 if (platform_sp->GetEnvironment(env))
3554 {
3555 OptionValueDictionary *env_dict = GetPropertyAtIndexAsOptionValueDictionary (NULL, ePropertyEnvVars);
3556 if (env_dict)
3557 {
3558 const bool can_replace = false;
3559 const size_t envc = env.GetSize();
3560 for (size_t idx=0; idx<envc; idx++)
3561 {
3562 const char *env_entry = env.GetStringAtIndex (idx);
3563 if (env_entry)
3564 {
3565 const char *equal_pos = ::strchr(env_entry, '=');
3566 ConstString key;
3567 // It is ok to have environment variables with no values
3568 const char *value = NULL;
3569 if (equal_pos)
3570 {
3571 key.SetCStringWithLength(env_entry, equal_pos - env_entry);
3572 if (equal_pos[1])
3573 value = equal_pos + 1;
3574 }
3575 else
3576 {
3577 key.SetCString(env_entry);
3578 }
3579 // Don't allow existing keys to be replaced with ones we get from the platform environment
3580 env_dict->SetValueForKey(key, OptionValueSP(new OptionValueString(value)), can_replace);
3581 }
3582 }
3583 }
3584 }
3585 }
3586 }
3587 }
3588 }
3589 }
3590 Target *m_target;
3591 mutable bool m_got_host_env;
3592};
3593
Greg Claytonfbb76342013-11-20 21:07:01 +00003594//----------------------------------------------------------------------
3595// TargetProperties
3596//----------------------------------------------------------------------
Greg Clayton67cc0632012-08-22 17:17:09 +00003597TargetProperties::TargetProperties (Target *target) :
Ilia K8f37ca52015-02-13 14:31:06 +00003598 Properties (),
3599 m_launch_info ()
Greg Clayton67cc0632012-08-22 17:17:09 +00003600{
3601 if (target)
3602 {
3603 m_collection_sp.reset (new TargetOptionValueProperties(target, Target::GetGlobalProperties()));
Ilia K8f37ca52015-02-13 14:31:06 +00003604
3605 // Set callbacks to update launch_info whenever "settins set" updated any of these properties
3606 m_collection_sp->SetValueChangedCallback(ePropertyArg0, TargetProperties::Arg0ValueChangedCallback, this);
3607 m_collection_sp->SetValueChangedCallback(ePropertyRunArgs, TargetProperties::RunArgsValueChangedCallback, this);
3608 m_collection_sp->SetValueChangedCallback(ePropertyEnvVars, TargetProperties::EnvVarsValueChangedCallback, this);
3609 m_collection_sp->SetValueChangedCallback(ePropertyInputPath, TargetProperties::InputPathValueChangedCallback, this);
3610 m_collection_sp->SetValueChangedCallback(ePropertyOutputPath, TargetProperties::OutputPathValueChangedCallback, this);
3611 m_collection_sp->SetValueChangedCallback(ePropertyErrorPath, TargetProperties::ErrorPathValueChangedCallback, this);
3612 m_collection_sp->SetValueChangedCallback(ePropertyDetachOnError, TargetProperties::DetachOnErrorValueChangedCallback, this);
3613 m_collection_sp->SetValueChangedCallback(ePropertyDisableASLR, TargetProperties::DisableASLRValueChangedCallback, this);
3614 m_collection_sp->SetValueChangedCallback(ePropertyDisableSTDIO, TargetProperties::DisableSTDIOValueChangedCallback, this);
3615
3616 // Update m_launch_info once it was created
3617 Arg0ValueChangedCallback(this, NULL);
3618 RunArgsValueChangedCallback(this, NULL);
3619 //EnvVarsValueChangedCallback(this, NULL); // FIXME: cause segfault in Target::GetPlatform()
3620 InputPathValueChangedCallback(this, NULL);
3621 OutputPathValueChangedCallback(this, NULL);
3622 ErrorPathValueChangedCallback(this, NULL);
3623 DetachOnErrorValueChangedCallback(this, NULL);
3624 DisableASLRValueChangedCallback(this, NULL);
3625 DisableSTDIOValueChangedCallback(this, NULL);
Caroline Ticedaccaa92010-09-20 20:44:43 +00003626 }
3627 else
Greg Clayton67cc0632012-08-22 17:17:09 +00003628 {
3629 m_collection_sp.reset (new TargetOptionValueProperties(ConstString("target")));
3630 m_collection_sp->Initialize(g_properties);
3631 m_collection_sp->AppendProperty(ConstString("process"),
3632 ConstString("Settings specify to processes."),
3633 true,
3634 Process::GetGlobalProperties()->GetValueProperties());
3635 }
Caroline Ticedaccaa92010-09-20 20:44:43 +00003636}
3637
Eugene Zelenko8f30a652015-10-23 18:39:37 +00003638TargetProperties::~TargetProperties() = default;
3639
Greg Clayton67cc0632012-08-22 17:17:09 +00003640ArchSpec
3641TargetProperties::GetDefaultArchitecture () const
3642{
3643 OptionValueArch *value = m_collection_sp->GetPropertyAtIndexAsOptionValueArch (NULL, ePropertyDefaultArch);
3644 if (value)
3645 return value->GetCurrentValue();
3646 return ArchSpec();
3647}
3648
3649void
3650TargetProperties::SetDefaultArchitecture (const ArchSpec& arch)
3651{
3652 OptionValueArch *value = m_collection_sp->GetPropertyAtIndexAsOptionValueArch (NULL, ePropertyDefaultArch);
3653 if (value)
3654 return value->SetCurrentValue(arch, true);
3655}
3656
Ilia K055ad9b2015-05-18 13:41:01 +00003657bool
3658TargetProperties::GetMoveToNearestCode() const
3659{
3660 const uint32_t idx = ePropertyMoveToNearestCode;
3661 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3662}
3663
Greg Clayton67cc0632012-08-22 17:17:09 +00003664lldb::DynamicValueType
3665TargetProperties::GetPreferDynamicValue() const
3666{
3667 const uint32_t idx = ePropertyPreferDynamic;
3668 return (lldb::DynamicValueType)m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value);
3669}
3670
3671bool
Greg Clayton15484402015-05-15 18:40:24 +00003672TargetProperties::SetPreferDynamicValue (lldb::DynamicValueType d)
3673{
3674 const uint32_t idx = ePropertyPreferDynamic;
3675 return m_collection_sp->SetPropertyAtIndexAsEnumeration(NULL, idx, d);
3676}
3677
Greg Clayton15484402015-05-15 18:40:24 +00003678bool
Greg Clayton67cc0632012-08-22 17:17:09 +00003679TargetProperties::GetDisableASLR () const
3680{
3681 const uint32_t idx = ePropertyDisableASLR;
3682 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3683}
3684
3685void
3686TargetProperties::SetDisableASLR (bool b)
3687{
3688 const uint32_t idx = ePropertyDisableASLR;
3689 m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b);
3690}
3691
3692bool
Jim Ingham106d0282014-06-25 02:32:56 +00003693TargetProperties::GetDetachOnError () const
3694{
3695 const uint32_t idx = ePropertyDetachOnError;
3696 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3697}
3698
3699void
3700TargetProperties::SetDetachOnError (bool b)
3701{
3702 const uint32_t idx = ePropertyDetachOnError;
3703 m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b);
3704}
3705
3706bool
Greg Clayton67cc0632012-08-22 17:17:09 +00003707TargetProperties::GetDisableSTDIO () const
3708{
3709 const uint32_t idx = ePropertyDisableSTDIO;
3710 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3711}
3712
3713void
3714TargetProperties::SetDisableSTDIO (bool b)
3715{
3716 const uint32_t idx = ePropertyDisableSTDIO;
3717 m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b);
3718}
3719
Jim Ingham0f063ba2013-03-02 00:26:47 +00003720const char *
3721TargetProperties::GetDisassemblyFlavor () const
3722{
3723 const uint32_t idx = ePropertyDisassemblyFlavor;
3724 const char *return_value;
3725
3726 x86DisassemblyFlavor flavor_value = (x86DisassemblyFlavor) m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value);
3727 return_value = g_x86_dis_flavor_value_types[flavor_value].string_value;
3728 return return_value;
3729}
3730
Greg Clayton1f746072012-08-29 21:13:06 +00003731InlineStrategy
3732TargetProperties::GetInlineStrategy () const
3733{
3734 const uint32_t idx = ePropertyInlineStrategy;
3735 return (InlineStrategy)m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value);
3736}
3737
Greg Clayton45392552012-10-17 22:57:12 +00003738const char *
3739TargetProperties::GetArg0 () const
3740{
3741 const uint32_t idx = ePropertyArg0;
3742 return m_collection_sp->GetPropertyAtIndexAsString (NULL, idx, NULL);
3743}
3744
3745void
3746TargetProperties::SetArg0 (const char *arg)
3747{
3748 const uint32_t idx = ePropertyArg0;
3749 m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, arg);
Greg Clayton896e0ec2015-03-26 00:15:24 +00003750 m_launch_info.SetArg0(arg);
Greg Clayton45392552012-10-17 22:57:12 +00003751}
3752
Greg Clayton67cc0632012-08-22 17:17:09 +00003753bool
3754TargetProperties::GetRunArguments (Args &args) const
3755{
3756 const uint32_t idx = ePropertyRunArgs;
3757 return m_collection_sp->GetPropertyAtIndexAsArgs (NULL, idx, args);
3758}
3759
3760void
3761TargetProperties::SetRunArguments (const Args &args)
3762{
3763 const uint32_t idx = ePropertyRunArgs;
3764 m_collection_sp->SetPropertyAtIndexFromArgs (NULL, idx, args);
Greg Clayton896e0ec2015-03-26 00:15:24 +00003765 m_launch_info.GetArguments() = args;
Greg Clayton67cc0632012-08-22 17:17:09 +00003766}
3767
3768size_t
3769TargetProperties::GetEnvironmentAsArgs (Args &env) const
3770{
3771 const uint32_t idx = ePropertyEnvVars;
3772 return m_collection_sp->GetPropertyAtIndexAsArgs (NULL, idx, env);
3773}
3774
Ilia K8f37ca52015-02-13 14:31:06 +00003775void
3776TargetProperties::SetEnvironmentFromArgs (const Args &env)
3777{
3778 const uint32_t idx = ePropertyEnvVars;
3779 m_collection_sp->SetPropertyAtIndexFromArgs (NULL, idx, env);
Greg Clayton896e0ec2015-03-26 00:15:24 +00003780 m_launch_info.GetEnvironmentEntries() = env;
Ilia K8f37ca52015-02-13 14:31:06 +00003781}
3782
Greg Clayton67cc0632012-08-22 17:17:09 +00003783bool
3784TargetProperties::GetSkipPrologue() const
3785{
3786 const uint32_t idx = ePropertySkipPrologue;
3787 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3788}
3789
3790PathMappingList &
3791TargetProperties::GetSourcePathMap () const
3792{
3793 const uint32_t idx = ePropertySourceMap;
3794 OptionValuePathMappings *option_value = m_collection_sp->GetPropertyAtIndexAsOptionValuePathMappings (NULL, false, idx);
3795 assert(option_value);
3796 return option_value->GetCurrentValue();
3797}
3798
3799FileSpecList &
Greg Clayton6920b522012-08-22 18:39:03 +00003800TargetProperties::GetExecutableSearchPaths ()
Greg Clayton67cc0632012-08-22 17:17:09 +00003801{
3802 const uint32_t idx = ePropertyExecutableSearchPaths;
3803 OptionValueFileSpecList *option_value = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList (NULL, false, idx);
3804 assert(option_value);
3805 return option_value->GetCurrentValue();
3806}
3807
Michael Sartaina7499c92013-07-01 19:45:50 +00003808FileSpecList &
3809TargetProperties::GetDebugFileSearchPaths ()
3810{
3811 const uint32_t idx = ePropertyDebugFileSearchPaths;
3812 OptionValueFileSpecList *option_value = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList (NULL, false, idx);
3813 assert(option_value);
3814 return option_value->GetCurrentValue();
3815}
3816
Sean Callanan85054342015-04-03 15:39:47 +00003817FileSpecList &
3818TargetProperties::GetClangModuleSearchPaths ()
3819{
3820 const uint32_t idx = ePropertyClangModuleSearchPaths;
3821 OptionValueFileSpecList *option_value = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList (NULL, false, idx);
3822 assert(option_value);
3823 return option_value->GetCurrentValue();
3824}
3825
Greg Clayton67cc0632012-08-22 17:17:09 +00003826bool
Sean Callananf0c5aeb2015-04-20 16:31:29 +00003827TargetProperties::GetEnableAutoImportClangModules() const
3828{
3829 const uint32_t idx = ePropertyAutoImportClangModules;
3830 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3831}
3832
3833bool
Greg Clayton67cc0632012-08-22 17:17:09 +00003834TargetProperties::GetEnableSyntheticValue () const
3835{
3836 const uint32_t idx = ePropertyEnableSynthetic;
3837 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3838}
3839
3840uint32_t
3841TargetProperties::GetMaximumNumberOfChildrenToDisplay() const
3842{
3843 const uint32_t idx = ePropertyMaxChildrenCount;
3844 return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value);
3845}
3846
3847uint32_t
3848TargetProperties::GetMaximumSizeOfStringSummary() const
3849{
3850 const uint32_t idx = ePropertyMaxSummaryLength;
3851 return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value);
3852}
3853
Enrico Granatad325bf92013-06-04 22:54:16 +00003854uint32_t
3855TargetProperties::GetMaximumMemReadSize () const
3856{
3857 const uint32_t idx = ePropertyMaxMemReadSize;
3858 return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value);
3859}
3860
Greg Clayton67cc0632012-08-22 17:17:09 +00003861FileSpec
3862TargetProperties::GetStandardInputPath () const
3863{
3864 const uint32_t idx = ePropertyInputPath;
3865 return m_collection_sp->GetPropertyAtIndexAsFileSpec (NULL, idx);
3866}
3867
3868void
3869TargetProperties::SetStandardInputPath (const char *p)
3870{
3871 const uint32_t idx = ePropertyInputPath;
3872 m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, p);
3873}
3874
3875FileSpec
3876TargetProperties::GetStandardOutputPath () const
3877{
3878 const uint32_t idx = ePropertyOutputPath;
3879 return m_collection_sp->GetPropertyAtIndexAsFileSpec (NULL, idx);
3880}
3881
3882void
3883TargetProperties::SetStandardOutputPath (const char *p)
3884{
3885 const uint32_t idx = ePropertyOutputPath;
3886 m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, p);
3887}
3888
3889FileSpec
3890TargetProperties::GetStandardErrorPath () const
3891{
3892 const uint32_t idx = ePropertyErrorPath;
3893 return m_collection_sp->GetPropertyAtIndexAsFileSpec(NULL, idx);
3894}
3895
Dawn Perchik23b1dec2015-07-21 22:05:07 +00003896LanguageType
3897TargetProperties::GetLanguage () const
3898{
3899 OptionValueLanguage *value = m_collection_sp->GetPropertyAtIndexAsOptionValueLanguage (NULL, ePropertyLanguage);
3900 if (value)
3901 return value->GetCurrentValue();
3902 return LanguageType();
3903}
3904
Greg Clayton6920b522012-08-22 18:39:03 +00003905const char *
3906TargetProperties::GetExpressionPrefixContentsAsCString ()
3907{
3908 const uint32_t idx = ePropertyExprPrefix;
3909 OptionValueFileSpec *file = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpec (NULL, false, idx);
3910 if (file)
Jim Ingham1e4f4252012-08-22 21:21:16 +00003911 {
Greg Clayton0b0b5122012-08-30 18:15:10 +00003912 const bool null_terminate = true;
3913 DataBufferSP data_sp(file->GetFileContents(null_terminate));
Jim Ingham1e4f4252012-08-22 21:21:16 +00003914 if (data_sp)
3915 return (const char *) data_sp->GetBytes();
3916 }
Greg Clayton6920b522012-08-22 18:39:03 +00003917 return NULL;
3918}
3919
Greg Clayton67cc0632012-08-22 17:17:09 +00003920void
3921TargetProperties::SetStandardErrorPath (const char *p)
3922{
3923 const uint32_t idx = ePropertyErrorPath;
3924 m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, p);
3925}
3926
3927bool
3928TargetProperties::GetBreakpointsConsultPlatformAvoidList ()
3929{
3930 const uint32_t idx = ePropertyBreakpointUseAvoidList;
3931 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3932}
3933
Jim Ingham17d023f2013-03-13 17:58:04 +00003934bool
Daniel Malead79ae052013-08-07 21:54:09 +00003935TargetProperties::GetUseHexImmediates () const
3936{
3937 const uint32_t idx = ePropertyUseHexImmediates;
3938 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3939}
3940
3941bool
Jim Ingham17d023f2013-03-13 17:58:04 +00003942TargetProperties::GetUseFastStepping () const
3943{
3944 const uint32_t idx = ePropertyUseFastStepping;
3945 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3946}
3947
Greg Claytonfb6621e2013-12-06 21:59:52 +00003948bool
3949TargetProperties::GetDisplayExpressionsInCrashlogs () const
3950{
3951 const uint32_t idx = ePropertyDisplayExpressionsInCrashlogs;
3952 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
3953}
3954
Enrico Granata397ddd52013-05-21 20:13:34 +00003955LoadScriptFromSymFile
Enrico Granata2ea43cd2013-05-13 17:03:52 +00003956TargetProperties::GetLoadScriptFromSymbolFile () const
3957{
3958 const uint32_t idx = ePropertyLoadScriptFromSymbolFile;
Enrico Granata397ddd52013-05-21 20:13:34 +00003959 return (LoadScriptFromSymFile)m_collection_sp->GetPropertyAtIndexAsEnumeration(NULL, idx, g_properties[idx].default_uint_value);
Enrico Granata2ea43cd2013-05-13 17:03:52 +00003960}
3961
Daniel Malead79ae052013-08-07 21:54:09 +00003962Disassembler::HexImmediateStyle
3963TargetProperties::GetHexImmediateStyle () const
3964{
3965 const uint32_t idx = ePropertyHexImmediateStyle;
3966 return (Disassembler::HexImmediateStyle)m_collection_sp->GetPropertyAtIndexAsEnumeration(NULL, idx, g_properties[idx].default_uint_value);
3967}
3968
Greg Claytonfd814c52013-08-13 01:42:25 +00003969MemoryModuleLoadLevel
3970TargetProperties::GetMemoryModuleLoadLevel() const
3971{
3972 const uint32_t idx = ePropertyMemoryModuleLoadLevel;
3973 return (MemoryModuleLoadLevel)m_collection_sp->GetPropertyAtIndexAsEnumeration(NULL, idx, g_properties[idx].default_uint_value);
3974}
3975
Jason Molendaa4bea722014-02-14 05:06:49 +00003976bool
3977TargetProperties::GetUserSpecifiedTrapHandlerNames (Args &args) const
3978{
3979 const uint32_t idx = ePropertyTrapHandlerNames;
3980 return m_collection_sp->GetPropertyAtIndexAsArgs (NULL, idx, args);
3981}
Greg Claytonfd814c52013-08-13 01:42:25 +00003982
Jason Molendaa4bea722014-02-14 05:06:49 +00003983void
3984TargetProperties::SetUserSpecifiedTrapHandlerNames (const Args &args)
3985{
3986 const uint32_t idx = ePropertyTrapHandlerNames;
3987 m_collection_sp->SetPropertyAtIndexFromArgs (NULL, idx, args);
3988}
Greg Clayton67cc0632012-08-22 17:17:09 +00003989
Enrico Granata560558e2015-02-11 02:35:39 +00003990bool
3991TargetProperties::GetDisplayRuntimeSupportValues () const
3992{
3993 const uint32_t idx = ePropertyDisplayRuntimeSupportValues;
3994 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, false);
3995}
3996
3997void
3998TargetProperties::SetDisplayRuntimeSupportValues (bool b)
3999{
4000 const uint32_t idx = ePropertyDisplayRuntimeSupportValues;
4001 m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b);
4002}
4003
Ewan Crawford78baa192015-05-13 09:18:18 +00004004bool
4005TargetProperties::GetNonStopModeEnabled () const
4006{
4007 const uint32_t idx = ePropertyNonStopModeEnabled;
4008 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, false);
4009}
4010
Ewan Crawfordaa7eda72015-06-24 15:14:26 +00004011void
4012TargetProperties::SetNonStopModeEnabled (bool b)
4013{
4014 const uint32_t idx = ePropertyNonStopModeEnabled;
4015 m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b);
4016}
4017
Ilia K8f37ca52015-02-13 14:31:06 +00004018const ProcessLaunchInfo &
Ilia Kcc39d3f2015-02-13 17:07:55 +00004019TargetProperties::GetProcessLaunchInfo ()
Ilia K8f37ca52015-02-13 14:31:06 +00004020{
Ilia Kcc39d3f2015-02-13 17:07:55 +00004021 m_launch_info.SetArg0(GetArg0()); // FIXME: Arg0 callback doesn't work
Ilia K8f37ca52015-02-13 14:31:06 +00004022 return m_launch_info;
4023}
4024
4025void
4026TargetProperties::SetProcessLaunchInfo(const ProcessLaunchInfo &launch_info)
4027{
4028 m_launch_info = launch_info;
4029 SetArg0(launch_info.GetArg0());
4030 SetRunArguments(launch_info.GetArguments());
4031 SetEnvironmentFromArgs(launch_info.GetEnvironmentEntries());
4032 const FileAction *input_file_action = launch_info.GetFileActionForFD(STDIN_FILENO);
4033 if (input_file_action)
4034 {
4035 const char *input_path = input_file_action->GetPath();
4036 if (input_path)
4037 SetStandardInputPath(input_path);
4038 }
4039 const FileAction *output_file_action = launch_info.GetFileActionForFD(STDOUT_FILENO);
4040 if (output_file_action)
4041 {
4042 const char *output_path = output_file_action->GetPath();
4043 if (output_path)
4044 SetStandardOutputPath(output_path);
4045 }
4046 const FileAction *error_file_action = launch_info.GetFileActionForFD(STDERR_FILENO);
4047 if (error_file_action)
4048 {
4049 const char *error_path = error_file_action->GetPath();
4050 if (error_path)
4051 SetStandardErrorPath(error_path);
4052 }
4053 SetDetachOnError(launch_info.GetFlags().Test(lldb::eLaunchFlagDetachOnError));
4054 SetDisableASLR(launch_info.GetFlags().Test(lldb::eLaunchFlagDisableASLR));
4055 SetDisableSTDIO(launch_info.GetFlags().Test(lldb::eLaunchFlagDisableSTDIO));
4056}
4057
4058void
4059TargetProperties::Arg0ValueChangedCallback(void *target_property_ptr, OptionValue *)
4060{
4061 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
4062 this_->m_launch_info.SetArg0(this_->GetArg0());
4063}
4064
4065void
4066TargetProperties::RunArgsValueChangedCallback(void *target_property_ptr, OptionValue *)
4067{
4068 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
4069 Args args;
4070 if (this_->GetRunArguments(args))
4071 this_->m_launch_info.GetArguments() = args;
4072}
4073
4074void
4075TargetProperties::EnvVarsValueChangedCallback(void *target_property_ptr, OptionValue *)
4076{
4077 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
4078 Args args;
4079 if (this_->GetEnvironmentAsArgs(args))
4080 this_->m_launch_info.GetEnvironmentEntries() = args;
4081}
4082
4083void
4084TargetProperties::InputPathValueChangedCallback(void *target_property_ptr, OptionValue *)
4085{
4086 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
Chaoren Lind3173f32015-05-29 19:52:29 +00004087 this_->m_launch_info.AppendOpenFileAction(STDIN_FILENO, this_->GetStandardInputPath(), true, false);
Ilia K8f37ca52015-02-13 14:31:06 +00004088}
4089
4090void
4091TargetProperties::OutputPathValueChangedCallback(void *target_property_ptr, OptionValue *)
4092{
4093 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
Chaoren Lind3173f32015-05-29 19:52:29 +00004094 this_->m_launch_info.AppendOpenFileAction(STDOUT_FILENO, this_->GetStandardOutputPath(), false, true);
Ilia K8f37ca52015-02-13 14:31:06 +00004095}
4096
4097void
4098TargetProperties::ErrorPathValueChangedCallback(void *target_property_ptr, OptionValue *)
4099{
4100 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
Chaoren Lind3173f32015-05-29 19:52:29 +00004101 this_->m_launch_info.AppendOpenFileAction(STDERR_FILENO, this_->GetStandardErrorPath(), false, true);
Ilia K8f37ca52015-02-13 14:31:06 +00004102}
4103
4104void
4105TargetProperties::DetachOnErrorValueChangedCallback(void *target_property_ptr, OptionValue *)
4106{
4107 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
4108 if (this_->GetDetachOnError())
4109 this_->m_launch_info.GetFlags().Set(lldb::eLaunchFlagDetachOnError);
4110 else
4111 this_->m_launch_info.GetFlags().Clear(lldb::eLaunchFlagDetachOnError);
4112}
4113
4114void
4115TargetProperties::DisableASLRValueChangedCallback(void *target_property_ptr, OptionValue *)
4116{
4117 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
4118 if (this_->GetDisableASLR())
4119 this_->m_launch_info.GetFlags().Set(lldb::eLaunchFlagDisableASLR);
4120 else
4121 this_->m_launch_info.GetFlags().Clear(lldb::eLaunchFlagDisableASLR);
4122}
4123
4124void
4125TargetProperties::DisableSTDIOValueChangedCallback(void *target_property_ptr, OptionValue *)
4126{
4127 TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
4128 if (this_->GetDisableSTDIO())
4129 this_->m_launch_info.GetFlags().Set(lldb::eLaunchFlagDisableSTDIO);
4130 else
4131 this_->m_launch_info.GetFlags().Clear(lldb::eLaunchFlagDisableSTDIO);
4132}
Ilia Keb2c19a2015-03-10 21:59:55 +00004133
4134//----------------------------------------------------------------------
4135// Target::TargetEventData
4136//----------------------------------------------------------------------
4137
4138Target::TargetEventData::TargetEventData (const lldb::TargetSP &target_sp) :
4139 EventData (),
4140 m_target_sp (target_sp),
4141 m_module_list ()
4142{
4143}
4144
4145Target::TargetEventData::TargetEventData (const lldb::TargetSP &target_sp, const ModuleList &module_list) :
4146 EventData (),
4147 m_target_sp (target_sp),
4148 m_module_list (module_list)
4149{
4150}
4151
Eugene Zelenko8f30a652015-10-23 18:39:37 +00004152Target::TargetEventData::~TargetEventData() = default;
Ilia Keb2c19a2015-03-10 21:59:55 +00004153
4154const ConstString &
4155Target::TargetEventData::GetFlavorString ()
4156{
4157 static ConstString g_flavor ("Target::TargetEventData");
4158 return g_flavor;
4159}
4160
4161void
4162Target::TargetEventData::Dump (Stream *s) const
4163{
4164}
4165
4166const Target::TargetEventData *
4167Target::TargetEventData::GetEventDataFromEvent (const Event *event_ptr)
4168{
4169 if (event_ptr)
4170 {
4171 const EventData *event_data = event_ptr->GetData();
4172 if (event_data && event_data->GetFlavor() == TargetEventData::GetFlavorString())
4173 return static_cast <const TargetEventData *> (event_ptr->GetData());
4174 }
4175 return NULL;
4176}
4177
4178TargetSP
4179Target::TargetEventData::GetTargetFromEvent (const Event *event_ptr)
4180{
4181 TargetSP target_sp;
4182 const TargetEventData *event_data = GetEventDataFromEvent (event_ptr);
4183 if (event_data)
4184 target_sp = event_data->m_target_sp;
4185 return target_sp;
4186}
4187
4188ModuleList
4189Target::TargetEventData::GetModuleListFromEvent (const Event *event_ptr)
4190{
4191 ModuleList module_list;
4192 const TargetEventData *event_data = GetEventDataFromEvent (event_ptr);
4193 if (event_data)
4194 module_list = event_data->m_module_list;
4195 return module_list;
4196}