blob: 2368fa18ce7739f4768abe8caa6194e43f670ccd [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- Target.cpp ----------------------------------------------*- C++ -*-===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Chris Lattner30fdc8d2010-06-08 16:52:24 +00006//
7//===----------------------------------------------------------------------===//
8
Pavel Labath181b8232018-12-14 15:59:49 +00009#include "lldb/Target/Target.h"
Kate Stoneb9c1b512016-09-06 20:57:50 +000010#include "Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.h"
Jim Ingham01f16662016-09-14 19:07:35 +000011#include "lldb/Breakpoint/BreakpointIDList.h"
Alex Langford7f9c9f22019-06-21 19:43:07 +000012#include "lldb/Breakpoint/BreakpointPrecondition.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000013#include "lldb/Breakpoint/BreakpointResolver.h"
14#include "lldb/Breakpoint/BreakpointResolverAddress.h"
15#include "lldb/Breakpoint/BreakpointResolverFileLine.h"
Jim Ingham969795f2011-09-21 01:17:13 +000016#include "lldb/Breakpoint/BreakpointResolverFileRegex.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000017#include "lldb/Breakpoint/BreakpointResolverName.h"
Jim Ingham3815e702018-09-13 21:35:32 +000018#include "lldb/Breakpoint/BreakpointResolverScripted.h"
Johnny Chen01a67862011-10-14 00:42:25 +000019#include "lldb/Breakpoint/Watchpoint.h"
Greg Clayton8b2fe6d2010-12-14 02:59:59 +000020#include "lldb/Core/Debugger.h"
Greg Clayton1f746072012-08-29 21:13:06 +000021#include "lldb/Core/Module.h"
22#include "lldb/Core/ModuleSpec.h"
Pavel Labath13e37d42017-10-25 21:05:31 +000023#include "lldb/Core/PluginManager.h"
Jim Ingham3815e702018-09-13 21:35:32 +000024#include "lldb/Core/SearchFilter.h"
Pavel Labath181b8232018-12-14 15:59:49 +000025#include "lldb/Core/Section.h"
Greg Clayton9585fbf2013-03-19 00:20:55 +000026#include "lldb/Core/SourceManager.h"
Greg Clayton44d93782014-01-27 23:43:24 +000027#include "lldb/Core/StreamFile.h"
Jim Ingham3815e702018-09-13 21:35:32 +000028#include "lldb/Core/StructuredDataImpl.h"
Greg Clayton8b2fe6d2010-12-14 02:59:59 +000029#include "lldb/Core/ValueObject.h"
Sean Callanan66810412015-10-19 23:11:07 +000030#include "lldb/Expression/REPL.h"
Jim Ingham151c0322015-09-15 21:13:50 +000031#include "lldb/Expression/UserExpression.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000032#include "lldb/Host/Host.h"
Pavel Labathb6dbe9a2017-07-18 13:14:01 +000033#include "lldb/Host/PosixApi.h"
Jim Ingham9575d842011-03-11 03:53:59 +000034#include "lldb/Interpreter/CommandInterpreter.h"
35#include "lldb/Interpreter/CommandReturnObject.h"
Johnny Chenb90827e2012-06-04 23:19:54 +000036#include "lldb/Interpreter/OptionGroupWatchpoint.h"
Greg Clayton67cc0632012-08-22 17:17:09 +000037#include "lldb/Interpreter/OptionValues.h"
38#include "lldb/Interpreter/Property.h"
Zachary Turnera78bd7f2015-03-03 23:11:11 +000039#include "lldb/Symbol/ClangASTContext.h"
Alex Langford2c3c0452019-07-11 23:45:35 +000040#include "lldb/Symbol/ClangASTImporter.h"
Bhushan D. Attarde7f3daed2015-08-26 06:04:54 +000041#include "lldb/Symbol/Function.h"
Kate Stoneb9c1b512016-09-06 20:57:50 +000042#include "lldb/Symbol/ObjectFile.h"
Bhushan D. Attarde7f3daed2015-08-26 06:04:54 +000043#include "lldb/Symbol/Symbol.h"
Jim Ingham151c0322015-09-15 21:13:50 +000044#include "lldb/Target/Language.h"
Zachary Turnera78bd7f2015-03-03 23:11:11 +000045#include "lldb/Target/LanguageRuntime.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000046#include "lldb/Target/Process.h"
Greg Claytond5944cd2013-12-06 01:12:00 +000047#include "lldb/Target/SectionLoadList.h"
Jason Molendab57e4a12013-11-04 09:33:30 +000048#include "lldb/Target/StackFrame.h"
Jason Molendaeef51062013-11-05 03:57:19 +000049#include "lldb/Target/SystemRuntime.h"
Jim Ingham9575d842011-03-11 03:53:59 +000050#include "lldb/Target/Thread.h"
51#include "lldb/Target/ThreadSpec.h"
Pavel Labath181b8232018-12-14 15:59:49 +000052#include "lldb/Utility/Event.h"
Zachary Turner5713a052017-03-22 18:40:07 +000053#include "lldb/Utility/FileSpec.h"
Sean Callanan9a6940c2015-10-21 00:36:34 +000054#include "lldb/Utility/LLDBAssert.h"
Zachary Turner6f9e6902017-03-03 20:56:28 +000055#include "lldb/Utility/Log.h"
Pavel Labathd821c992018-08-07 11:07:21 +000056#include "lldb/Utility/State.h"
Zachary Turnerbf9a7732017-02-02 21:39:50 +000057#include "lldb/Utility/StreamString.h"
Pavel Labath38d06322017-06-29 14:32:17 +000058#include "lldb/Utility/Timer.h"
Jonas Devlieghere796ac802019-02-11 23:13:08 +000059
Tatyana Krasnukhaf62e23d2019-06-10 21:13:37 +000060#include "llvm/ADT/ScopeExit.h"
61
Jonas Devlieghere796ac802019-02-11 23:13:08 +000062#include <memory>
Pavel Labath181b8232018-12-14 15:59:49 +000063#include <mutex>
Chris Lattner30fdc8d2010-06-08 16:52:24 +000064
65using namespace lldb;
66using namespace lldb_private;
67
Pavel Labath43d35412016-12-06 11:24:51 +000068constexpr std::chrono::milliseconds EvaluateExpressionOptions::default_timeout;
69
Pavel Labath13e37d42017-10-25 21:05:31 +000070Target::Arch::Arch(const ArchSpec &spec)
71 : m_spec(spec),
72 m_plugin_up(PluginManager::CreateArchitectureInstance(spec)) {}
73
Jonas Devlieghered3607752019-07-19 00:56:26 +000074const Target::Arch &Target::Arch::operator=(const ArchSpec &spec) {
Pavel Labath13e37d42017-10-25 21:05:31 +000075 m_spec = spec;
76 m_plugin_up = PluginManager::CreateArchitectureInstance(spec);
77 return *this;
78}
79
Kate Stoneb9c1b512016-09-06 20:57:50 +000080ConstString &Target::GetStaticBroadcasterClass() {
81 static ConstString class_name("lldb.target");
82 return class_name;
Jim Ingham4bddaeb2012-02-16 06:50:00 +000083}
84
Kate Stoneb9c1b512016-09-06 20:57:50 +000085Target::Target(Debugger &debugger, const ArchSpec &target_arch,
86 const lldb::PlatformSP &platform_sp, bool is_dummy_target)
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +000087 : TargetProperties(this),
Kate Stoneb9c1b512016-09-06 20:57:50 +000088 Broadcaster(debugger.GetBroadcasterManager(),
89 Target::GetStaticBroadcasterClass().AsCString()),
90 ExecutionContextScope(), m_debugger(debugger), m_platform_sp(platform_sp),
Davide Italiano24fff242018-04-13 18:02:39 +000091 m_mutex(), m_arch(target_arch), m_images(this), m_section_load_history(),
92 m_breakpoint_list(false), m_internal_breakpoint_list(true),
93 m_watchpoint_list(), m_process_sp(), m_search_filter_sp(),
94 m_image_search_paths(ImageSearchPathsChanged, this), m_ast_importer_sp(),
Jonas Devlieghered5b44032019-02-13 06:25:41 +000095 m_source_manager_up(), m_stop_hooks(), m_stop_hook_next_id(0),
Davide Italiano24fff242018-04-13 18:02:39 +000096 m_valid(true), m_suppress_stop_hooks(false),
97 m_is_dummy_target(is_dummy_target),
98 m_stats_storage(static_cast<int>(StatisticKind::StatisticMax))
Jim Ingham893c9322014-11-22 01:42:44 +000099
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000100{
Kate Stoneb9c1b512016-09-06 20:57:50 +0000101 SetEventName(eBroadcastBitBreakpointChanged, "breakpoint-changed");
102 SetEventName(eBroadcastBitModulesLoaded, "modules-loaded");
103 SetEventName(eBroadcastBitModulesUnloaded, "modules-unloaded");
104 SetEventName(eBroadcastBitWatchpointChanged, "watchpoint-changed");
105 SetEventName(eBroadcastBitSymbolsLoaded, "symbols-loaded");
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000106
Kate Stoneb9c1b512016-09-06 20:57:50 +0000107 CheckInWithManager();
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000108
Jonas Devlieghereeaedc5e2019-07-23 17:03:37 +0000109 LLDB_LOG(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_OBJECT),
110 "{0} Target::Target()", static_cast<void *>(this));
Pavel Labath13e37d42017-10-25 21:05:31 +0000111 if (target_arch.IsValid()) {
Jonas Devlieghereb2a9cf72019-07-22 23:48:01 +0000112 LLDB_LOG(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_TARGET),
Jonas Devlieghereeaedc5e2019-07-23 17:03:37 +0000113 "Target::Target created with architecture {0} ({1})",
Jonas Devlieghereb2a9cf72019-07-22 23:48:01 +0000114 target_arch.GetArchitectureName(),
115 target_arch.GetTriple().getTriple().c_str());
Kate Stoneb9c1b512016-09-06 20:57:50 +0000116 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000117}
118
Kate Stoneb9c1b512016-09-06 20:57:50 +0000119Target::~Target() {
120 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_OBJECT));
Jonas Devlieghereeaedc5e2019-07-23 17:03:37 +0000121 LLDB_LOG(log, "{0} Target::~Target()", static_cast<void *>(this));
Kate Stoneb9c1b512016-09-06 20:57:50 +0000122 DeleteCurrentProcess();
Eugene Zelenko8f30a652015-10-23 18:39:37 +0000123}
124
Kate Stoneb9c1b512016-09-06 20:57:50 +0000125void Target::PrimeFromDummyTarget(Target *target) {
126 if (!target)
127 return;
Jim Ingham893c9322014-11-22 01:42:44 +0000128
Kate Stoneb9c1b512016-09-06 20:57:50 +0000129 m_stop_hooks = target->m_stop_hooks;
130
131 for (BreakpointSP breakpoint_sp : target->m_breakpoint_list.Breakpoints()) {
132 if (breakpoint_sp->IsInternal())
133 continue;
134
135 BreakpointSP new_bp(new Breakpoint(*this, *breakpoint_sp.get()));
136 AddBreakpoint(new_bp, false);
137 }
Jonas Devlieghered3607752019-07-19 00:56:26 +0000138
139 for (auto bp_name_entry : target->m_breakpoint_names) {
140
Jim Inghamb842f2e2017-09-14 20:22:49 +0000141 BreakpointName *new_bp_name = new BreakpointName(*bp_name_entry.second);
142 AddBreakpointName(new_bp_name);
143 }
Jim Ingham893c9322014-11-22 01:42:44 +0000144}
145
Kate Stoneb9c1b512016-09-06 20:57:50 +0000146void Target::Dump(Stream *s, lldb::DescriptionLevel description_level) {
147 // s->Printf("%.*p: ", (int)sizeof(void*) * 2, this);
148 if (description_level != lldb::eDescriptionLevelBrief) {
149 s->Indent();
150 s->PutCString("Target\n");
151 s->IndentMore();
152 m_images.Dump(s);
153 m_breakpoint_list.Dump(s);
154 m_internal_breakpoint_list.Dump(s);
155 s->IndentLess();
156 } else {
157 Module *exe_module = GetExecutableModulePointer();
158 if (exe_module)
159 s->PutCString(exe_module->GetFileSpec().GetFilename().GetCString());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000160 else
Kate Stoneb9c1b512016-09-06 20:57:50 +0000161 s->PutCString("No executable module.");
162 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000163}
164
Kate Stoneb9c1b512016-09-06 20:57:50 +0000165void Target::CleanupProcess() {
166 // Do any cleanup of the target we need to do between process instances.
167 // NB It is better to do this before destroying the process in case the
168 // clean up needs some help from the process.
169 m_breakpoint_list.ClearAllBreakpointSites();
170 m_internal_breakpoint_list.ClearAllBreakpointSites();
171 // Disable watchpoints just on the debugger side.
172 std::unique_lock<std::recursive_mutex> lock;
173 this->GetWatchpointList().GetListMutex(lock);
174 DisableAllWatchpoints(false);
175 ClearAllWatchpointHitCounts();
176 ClearAllWatchpointHistoricValues();
Greg Clayton90ba8112012-12-05 00:16:59 +0000177}
178
Kate Stoneb9c1b512016-09-06 20:57:50 +0000179void Target::DeleteCurrentProcess() {
180 if (m_process_sp) {
Greg Claytond5944cd2013-12-06 01:12:00 +0000181 m_section_load_history.Clear();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000182 if (m_process_sp->IsAlive())
183 m_process_sp->Destroy(false);
184
185 m_process_sp->Finalize();
186
187 CleanupProcess();
188
189 m_process_sp.reset();
190 }
Greg Clayton3418c852011-08-10 02:10:13 +0000191}
192
Kate Stoneb9c1b512016-09-06 20:57:50 +0000193const lldb::ProcessSP &Target::CreateProcess(ListenerSP listener_sp,
Zachary Turner31659452016-11-17 21:15:14 +0000194 llvm::StringRef plugin_name,
Kate Stoneb9c1b512016-09-06 20:57:50 +0000195 const FileSpec *crash_file) {
Pavel Labathcb8c6992019-01-07 10:59:57 +0000196 if (!listener_sp)
197 listener_sp = GetDebugger().GetListener();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000198 DeleteCurrentProcess();
199 m_process_sp = Process::FindPlugin(shared_from_this(), plugin_name,
200 listener_sp, crash_file);
201 return m_process_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000202}
203
Kate Stoneb9c1b512016-09-06 20:57:50 +0000204const lldb::ProcessSP &Target::GetProcessSP() const { return m_process_sp; }
205
Zachary Turner97206d52017-05-12 04:51:55 +0000206lldb::REPLSP Target::GetREPL(Status &err, lldb::LanguageType language,
Kate Stoneb9c1b512016-09-06 20:57:50 +0000207 const char *repl_options, bool can_create) {
208 if (language == eLanguageTypeUnknown) {
209 std::set<LanguageType> repl_languages;
210
211 Language::GetLanguagesSupportingREPLs(repl_languages);
212
213 if (repl_languages.size() == 1) {
214 language = *repl_languages.begin();
215 } else if (repl_languages.size() == 0) {
216 err.SetErrorStringWithFormat(
217 "LLDB isn't configured with REPL support for any languages.");
218 return REPLSP();
219 } else {
220 err.SetErrorStringWithFormat(
221 "Multiple possible REPL languages. Please specify a language.");
222 return REPLSP();
223 }
224 }
225
226 REPLMap::iterator pos = m_repl_map.find(language);
227
228 if (pos != m_repl_map.end()) {
229 return pos->second;
230 }
231
232 if (!can_create) {
233 err.SetErrorStringWithFormat(
234 "Couldn't find an existing REPL for %s, and can't create a new one",
235 Language::GetNameForLanguageType(language));
236 return lldb::REPLSP();
237 }
238
239 Debugger *const debugger = nullptr;
240 lldb::REPLSP ret = REPL::Create(err, language, debugger, this, repl_options);
241
242 if (ret) {
243 m_repl_map[language] = ret;
244 return m_repl_map[language];
245 }
246
247 if (err.Success()) {
248 err.SetErrorStringWithFormat("Couldn't create a REPL for %s",
249 Language::GetNameForLanguageType(language));
250 }
251
252 return lldb::REPLSP();
253}
254
255void Target::SetREPL(lldb::LanguageType language, lldb::REPLSP repl_sp) {
256 lldbassert(!m_repl_map.count(language));
257
258 m_repl_map[language] = repl_sp;
259}
260
261void Target::Destroy() {
262 std::lock_guard<std::recursive_mutex> guard(m_mutex);
263 m_valid = false;
264 DeleteCurrentProcess();
265 m_platform_sp.reset();
Pavel Labath13e37d42017-10-25 21:05:31 +0000266 m_arch = ArchSpec();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000267 ClearModules(true);
268 m_section_load_history.Clear();
269 const bool notify = false;
270 m_breakpoint_list.RemoveAll(notify);
271 m_internal_breakpoint_list.RemoveAll(notify);
272 m_last_created_breakpoint.reset();
273 m_last_created_watchpoint.reset();
274 m_search_filter_sp.reset();
275 m_image_search_paths.Clear(notify);
276 m_stop_hooks.clear();
277 m_stop_hook_next_id = 0;
278 m_suppress_stop_hooks = false;
279}
280
281BreakpointList &Target::GetBreakpointList(bool internal) {
282 if (internal)
283 return m_internal_breakpoint_list;
284 else
285 return m_breakpoint_list;
286}
287
288const BreakpointList &Target::GetBreakpointList(bool internal) const {
289 if (internal)
290 return m_internal_breakpoint_list;
291 else
292 return m_breakpoint_list;
293}
294
295BreakpointSP Target::GetBreakpointByID(break_id_t break_id) {
296 BreakpointSP bp_sp;
297
298 if (LLDB_BREAK_ID_IS_INTERNAL(break_id))
299 bp_sp = m_internal_breakpoint_list.FindBreakpointByID(break_id);
300 else
301 bp_sp = m_breakpoint_list.FindBreakpointByID(break_id);
302
303 return bp_sp;
304}
305
306BreakpointSP Target::CreateSourceRegexBreakpoint(
307 const FileSpecList *containingModules,
308 const FileSpecList *source_file_spec_list,
309 const std::unordered_set<std::string> &function_names,
310 RegularExpression &source_regex, bool internal, bool hardware,
311 LazyBool move_to_nearest_code) {
312 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList(
313 containingModules, source_file_spec_list));
314 if (move_to_nearest_code == eLazyBoolCalculate)
315 move_to_nearest_code = GetMoveToNearestCode() ? eLazyBoolYes : eLazyBoolNo;
316 BreakpointResolverSP resolver_sp(new BreakpointResolverFileRegex(
317 nullptr, source_regex, function_names,
318 !static_cast<bool>(move_to_nearest_code)));
319
320 return CreateBreakpoint(filter_sp, resolver_sp, internal, hardware, true);
321}
322
323BreakpointSP Target::CreateBreakpoint(const FileSpecList *containingModules,
324 const FileSpec &file, uint32_t line_no,
Adrian Prantl431b1582018-08-30 15:11:00 +0000325 uint32_t column, lldb::addr_t offset,
Kate Stoneb9c1b512016-09-06 20:57:50 +0000326 LazyBool check_inlines,
327 LazyBool skip_prologue, bool internal,
328 bool hardware,
329 LazyBool move_to_nearest_code) {
330 FileSpec remapped_file;
Greg Clayton86188d82018-05-21 14:14:36 +0000331 if (!GetSourcePathMap().ReverseRemapPath(file, remapped_file))
Kate Stoneb9c1b512016-09-06 20:57:50 +0000332 remapped_file = file;
333
334 if (check_inlines == eLazyBoolCalculate) {
335 const InlineStrategy inline_strategy = GetInlineStrategy();
336 switch (inline_strategy) {
337 case eInlineBreakpointsNever:
338 check_inlines = eLazyBoolNo;
339 break;
340
341 case eInlineBreakpointsHeaders:
342 if (remapped_file.IsSourceImplementationFile())
343 check_inlines = eLazyBoolNo;
344 else
345 check_inlines = eLazyBoolYes;
346 break;
347
348 case eInlineBreakpointsAlways:
349 check_inlines = eLazyBoolYes;
350 break;
351 }
352 }
353 SearchFilterSP filter_sp;
354 if (check_inlines == eLazyBoolNo) {
355 // Not checking for inlines, we are looking only for matching compile units
356 FileSpecList compile_unit_list;
357 compile_unit_list.Append(remapped_file);
358 filter_sp = GetSearchFilterForModuleAndCUList(containingModules,
359 &compile_unit_list);
360 } else {
361 filter_sp = GetSearchFilterForModuleList(containingModules);
362 }
363 if (skip_prologue == eLazyBoolCalculate)
364 skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo;
365 if (move_to_nearest_code == eLazyBoolCalculate)
366 move_to_nearest_code = GetMoveToNearestCode() ? eLazyBoolYes : eLazyBoolNo;
367
368 BreakpointResolverSP resolver_sp(new BreakpointResolverFileLine(
Adrian Prantl431b1582018-08-30 15:11:00 +0000369 nullptr, remapped_file, line_no, column, offset, check_inlines,
370 skip_prologue, !static_cast<bool>(move_to_nearest_code)));
Kate Stoneb9c1b512016-09-06 20:57:50 +0000371 return CreateBreakpoint(filter_sp, resolver_sp, internal, hardware, true);
372}
373
374BreakpointSP Target::CreateBreakpoint(lldb::addr_t addr, bool internal,
375 bool hardware) {
376 Address so_addr;
377
378 // Check for any reason we want to move this breakpoint to other address.
379 addr = GetBreakableLoadAddress(addr);
380
Adrian Prantl05097242018-04-30 16:49:04 +0000381 // Attempt to resolve our load address if possible, though it is ok if it
382 // doesn't resolve to section/offset.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000383
384 // Try and resolve as a load address if possible
385 GetSectionLoadList().ResolveLoadAddress(addr, so_addr);
386 if (!so_addr.IsValid()) {
387 // The address didn't resolve, so just set this as an absolute address
388 so_addr.SetOffset(addr);
389 }
390 BreakpointSP bp_sp(CreateBreakpoint(so_addr, internal, hardware));
391 return bp_sp;
392}
393
394BreakpointSP Target::CreateBreakpoint(const Address &addr, bool internal,
395 bool hardware) {
396 SearchFilterSP filter_sp(
397 new SearchFilterForUnconstrainedSearches(shared_from_this()));
398 BreakpointResolverSP resolver_sp(
399 new BreakpointResolverAddress(nullptr, addr));
400 return CreateBreakpoint(filter_sp, resolver_sp, internal, hardware, false);
401}
402
403lldb::BreakpointSP
404Target::CreateAddressInModuleBreakpoint(lldb::addr_t file_addr, bool internal,
405 const FileSpec *file_spec,
406 bool request_hardware) {
407 SearchFilterSP filter_sp(
408 new SearchFilterForUnconstrainedSearches(shared_from_this()));
409 BreakpointResolverSP resolver_sp(
410 new BreakpointResolverAddress(nullptr, file_addr, file_spec));
411 return CreateBreakpoint(filter_sp, resolver_sp, internal, request_hardware,
412 false);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000413}
414
Zachary Turner117b1fa2018-10-25 20:45:40 +0000415BreakpointSP Target::CreateBreakpoint(
416 const FileSpecList *containingModules,
417 const FileSpecList *containingSourceFiles, const char *func_name,
418 FunctionNameType func_name_type_mask, LanguageType language,
419 lldb::addr_t offset, LazyBool skip_prologue, bool internal, bool hardware) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000420 BreakpointSP bp_sp;
421 if (func_name) {
422 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList(
423 containingModules, containingSourceFiles));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000424
Greg Clayton03da4cc2013-04-19 21:31:16 +0000425 if (skip_prologue == eLazyBoolCalculate)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000426 skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo;
427 if (language == lldb::eLanguageTypeUnknown)
428 language = GetLanguage();
429
430 BreakpointResolverSP resolver_sp(new BreakpointResolverName(
431 nullptr, func_name, func_name_type_mask, language, Breakpoint::Exact,
432 offset, skip_prologue));
433 bp_sp = CreateBreakpoint(filter_sp, resolver_sp, internal, hardware, true);
434 }
435 return bp_sp;
436}
437
438lldb::BreakpointSP
439Target::CreateBreakpoint(const FileSpecList *containingModules,
440 const FileSpecList *containingSourceFiles,
441 const std::vector<std::string> &func_names,
Zachary Turner117b1fa2018-10-25 20:45:40 +0000442 FunctionNameType func_name_type_mask,
443 LanguageType language, lldb::addr_t offset,
444 LazyBool skip_prologue, bool internal, bool hardware) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000445 BreakpointSP bp_sp;
446 size_t num_names = func_names.size();
447 if (num_names > 0) {
448 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList(
449 containingModules, containingSourceFiles));
450
451 if (skip_prologue == eLazyBoolCalculate)
452 skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo;
453 if (language == lldb::eLanguageTypeUnknown)
454 language = GetLanguage();
455
456 BreakpointResolverSP resolver_sp(
457 new BreakpointResolverName(nullptr, func_names, func_name_type_mask,
458 language, offset, skip_prologue));
459 bp_sp = CreateBreakpoint(filter_sp, resolver_sp, internal, hardware, true);
460 }
461 return bp_sp;
462}
463
Zachary Turner117b1fa2018-10-25 20:45:40 +0000464BreakpointSP
465Target::CreateBreakpoint(const FileSpecList *containingModules,
466 const FileSpecList *containingSourceFiles,
467 const char *func_names[], size_t num_names,
468 FunctionNameType func_name_type_mask,
469 LanguageType language, lldb::addr_t offset,
470 LazyBool skip_prologue, bool internal, bool hardware) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000471 BreakpointSP bp_sp;
472 if (num_names > 0) {
473 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList(
474 containingModules, containingSourceFiles));
475
476 if (skip_prologue == eLazyBoolCalculate) {
477 if (offset == 0)
Greg Clayton03da4cc2013-04-19 21:31:16 +0000478 skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000479 else
480 skip_prologue = eLazyBoolNo;
Greg Clayton1b72fcb2010-08-24 00:45:41 +0000481 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000482 if (language == lldb::eLanguageTypeUnknown)
483 language = GetLanguage();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000484
Kate Stoneb9c1b512016-09-06 20:57:50 +0000485 BreakpointResolverSP resolver_sp(new BreakpointResolverName(
486 nullptr, func_names, num_names, func_name_type_mask, language, offset,
487 skip_prologue));
488 resolver_sp->SetOffset(offset);
489 bp_sp = CreateBreakpoint(filter_sp, resolver_sp, internal, hardware, true);
490 }
491 return bp_sp;
Jim Ingham133e0fb2012-03-03 02:05:11 +0000492}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000493
494SearchFilterSP
Kate Stoneb9c1b512016-09-06 20:57:50 +0000495Target::GetSearchFilterForModule(const FileSpec *containingModule) {
496 SearchFilterSP filter_sp;
497 if (containingModule != nullptr) {
498 // TODO: We should look into sharing module based search filters
499 // across many breakpoints like we do for the simple target based one
Jonas Devlieghere796ac802019-02-11 23:13:08 +0000500 filter_sp = std::make_shared<SearchFilterByModule>(shared_from_this(),
501 *containingModule);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000502 } else {
503 if (!m_search_filter_sp)
Jonas Devlieghere796ac802019-02-11 23:13:08 +0000504 m_search_filter_sp =
505 std::make_shared<SearchFilterForUnconstrainedSearches>(
506 shared_from_this());
Kate Stoneb9c1b512016-09-06 20:57:50 +0000507 filter_sp = m_search_filter_sp;
508 }
509 return filter_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000510}
511
Jim Ingham969795f2011-09-21 01:17:13 +0000512SearchFilterSP
Kate Stoneb9c1b512016-09-06 20:57:50 +0000513Target::GetSearchFilterForModuleList(const FileSpecList *containingModules) {
514 SearchFilterSP filter_sp;
515 if (containingModules && containingModules->GetSize() != 0) {
516 // TODO: We should look into sharing module based search filters
517 // across many breakpoints like we do for the simple target based one
Jonas Devlieghere796ac802019-02-11 23:13:08 +0000518 filter_sp = std::make_shared<SearchFilterByModuleList>(shared_from_this(),
519 *containingModules);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000520 } else {
521 if (!m_search_filter_sp)
Jonas Devlieghere796ac802019-02-11 23:13:08 +0000522 m_search_filter_sp =
523 std::make_shared<SearchFilterForUnconstrainedSearches>(
524 shared_from_this());
Kate Stoneb9c1b512016-09-06 20:57:50 +0000525 filter_sp = m_search_filter_sp;
526 }
527 return filter_sp;
Jim Ingham969795f2011-09-21 01:17:13 +0000528}
529
Kate Stoneb9c1b512016-09-06 20:57:50 +0000530SearchFilterSP Target::GetSearchFilterForModuleAndCUList(
531 const FileSpecList *containingModules,
532 const FileSpecList *containingSourceFiles) {
533 if (containingSourceFiles == nullptr || containingSourceFiles->GetSize() == 0)
534 return GetSearchFilterForModuleList(containingModules);
535
536 SearchFilterSP filter_sp;
537 if (containingModules == nullptr) {
538 // We could make a special "CU List only SearchFilter". Better yet was if
Adrian Prantl05097242018-04-30 16:49:04 +0000539 // these could be composable, but that will take a little reworking.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000540
Jonas Devlieghere796ac802019-02-11 23:13:08 +0000541 filter_sp = std::make_shared<SearchFilterByModuleListAndCU>(
542 shared_from_this(), FileSpecList(), *containingSourceFiles);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000543 } else {
Jonas Devlieghere796ac802019-02-11 23:13:08 +0000544 filter_sp = std::make_shared<SearchFilterByModuleListAndCU>(
545 shared_from_this(), *containingModules, *containingSourceFiles);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000546 }
547 return filter_sp;
Jim Ingham87df91b2011-09-23 00:54:11 +0000548}
549
Kate Stoneb9c1b512016-09-06 20:57:50 +0000550BreakpointSP Target::CreateFuncRegexBreakpoint(
551 const FileSpecList *containingModules,
552 const FileSpecList *containingSourceFiles, RegularExpression &func_regex,
553 lldb::LanguageType requested_language, LazyBool skip_prologue,
554 bool internal, bool hardware) {
555 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList(
556 containingModules, containingSourceFiles));
557 bool skip = (skip_prologue == eLazyBoolCalculate)
558 ? GetSkipPrologue()
559 : static_cast<bool>(skip_prologue);
560 BreakpointResolverSP resolver_sp(new BreakpointResolverName(
561 nullptr, func_regex, requested_language, 0, skip));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000562
Kate Stoneb9c1b512016-09-06 20:57:50 +0000563 return CreateBreakpoint(filter_sp, resolver_sp, internal, hardware, true);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000564}
565
Jim Ingham219ba192012-03-05 04:47:34 +0000566lldb::BreakpointSP
Kate Stoneb9c1b512016-09-06 20:57:50 +0000567Target::CreateExceptionBreakpoint(enum lldb::LanguageType language,
568 bool catch_bp, bool throw_bp, bool internal,
Zachary Turner97206d52017-05-12 04:51:55 +0000569 Args *additional_args, Status *error) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000570 BreakpointSP exc_bkpt_sp = LanguageRuntime::CreateExceptionBreakpoint(
571 *this, language, catch_bp, throw_bp, internal);
572 if (exc_bkpt_sp && additional_args) {
Alex Langford7f9c9f22019-06-21 19:43:07 +0000573 BreakpointPreconditionSP precondition_sp = exc_bkpt_sp->GetPrecondition();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000574 if (precondition_sp && additional_args) {
575 if (error)
576 *error = precondition_sp->ConfigurePrecondition(*additional_args);
577 else
578 precondition_sp->ConfigurePrecondition(*additional_args);
Jim Inghama72b31c2015-04-22 19:42:18 +0000579 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000580 }
581 return exc_bkpt_sp;
Jim Ingham219ba192012-03-05 04:47:34 +0000582}
Jim Inghama72b31c2015-04-22 19:42:18 +0000583
Jonas Devlieghered3607752019-07-19 00:56:26 +0000584lldb::BreakpointSP Target::CreateScriptedBreakpoint(
585 const llvm::StringRef class_name, const FileSpecList *containingModules,
586 const FileSpecList *containingSourceFiles, bool internal,
587 bool request_hardware, StructuredData::ObjectSP extra_args_sp,
588 Status *creation_error) {
Jim Ingham3815e702018-09-13 21:35:32 +0000589 SearchFilterSP filter_sp;
Jonas Devlieghered3607752019-07-19 00:56:26 +0000590
Jim Ingham3815e702018-09-13 21:35:32 +0000591 lldb::SearchDepth depth = lldb::eSearchDepthTarget;
Jonas Devlieghered3607752019-07-19 00:56:26 +0000592 bool has_files =
593 containingSourceFiles && containingSourceFiles->GetSize() > 0;
Jim Ingham3815e702018-09-13 21:35:32 +0000594 bool has_modules = containingModules && containingModules->GetSize() > 0;
Jonas Devlieghered3607752019-07-19 00:56:26 +0000595
Jim Ingham3815e702018-09-13 21:35:32 +0000596 if (has_files && has_modules) {
Jonas Devlieghered3607752019-07-19 00:56:26 +0000597 filter_sp = GetSearchFilterForModuleAndCUList(containingModules,
598 containingSourceFiles);
Jim Ingham3815e702018-09-13 21:35:32 +0000599 } else if (has_files) {
Jonas Devlieghered3607752019-07-19 00:56:26 +0000600 filter_sp =
601 GetSearchFilterForModuleAndCUList(nullptr, containingSourceFiles);
Jim Ingham3815e702018-09-13 21:35:32 +0000602 } else if (has_modules) {
603 filter_sp = GetSearchFilterForModuleList(containingModules);
604 } else {
Jonas Devlieghere796ac802019-02-11 23:13:08 +0000605 filter_sp = std::make_shared<SearchFilterForUnconstrainedSearches>(
606 shared_from_this());
Jim Ingham3815e702018-09-13 21:35:32 +0000607 }
Jonas Devlieghered3607752019-07-19 00:56:26 +0000608
Jim Ingham3815e702018-09-13 21:35:32 +0000609 StructuredDataImpl *extra_args_impl = new StructuredDataImpl();
610 if (extra_args_sp)
611 extra_args_impl->SetObjectSP(extra_args_sp);
Jonas Devlieghere2b29b432019-04-26 22:43:16 +0000612
613 BreakpointResolverSP resolver_sp(new BreakpointResolverScripted(
614 nullptr, class_name, depth, extra_args_impl,
615 *GetDebugger().GetScriptInterpreter()));
Jim Ingham3815e702018-09-13 21:35:32 +0000616 return CreateBreakpoint(filter_sp, resolver_sp, internal, false, true);
Jim Ingham3815e702018-09-13 21:35:32 +0000617}
618
Kate Stoneb9c1b512016-09-06 20:57:50 +0000619BreakpointSP Target::CreateBreakpoint(SearchFilterSP &filter_sp,
620 BreakpointResolverSP &resolver_sp,
621 bool internal, bool request_hardware,
622 bool resolve_indirect_symbols) {
623 BreakpointSP bp_sp;
624 if (filter_sp && resolver_sp) {
Jonas Devliegheree103ae92018-11-15 01:18:15 +0000625 const bool hardware = request_hardware || GetRequireHardwareBreakpoints();
626 bp_sp.reset(new Breakpoint(*this, filter_sp, resolver_sp, hardware,
Kate Stoneb9c1b512016-09-06 20:57:50 +0000627 resolve_indirect_symbols));
628 resolver_sp->SetBreakpoint(bp_sp.get());
629 AddBreakpoint(bp_sp, internal);
630 }
631 return bp_sp;
Jim Ingham33df7cd2014-12-06 01:28:03 +0000632}
633
Kate Stoneb9c1b512016-09-06 20:57:50 +0000634void Target::AddBreakpoint(lldb::BreakpointSP bp_sp, bool internal) {
635 if (!bp_sp)
636 return;
637 if (internal)
638 m_internal_breakpoint_list.Add(bp_sp, false);
639 else
640 m_breakpoint_list.Add(bp_sp, true);
Jim Ingham33df7cd2014-12-06 01:28:03 +0000641
Kate Stoneb9c1b512016-09-06 20:57:50 +0000642 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_BREAKPOINTS));
643 if (log) {
644 StreamString s;
645 bp_sp->GetDescription(&s, lldb::eDescriptionLevelVerbose);
Jonas Devlieghere63e5fb72019-07-24 17:56:10 +0000646 LLDB_LOGF(log, "Target::%s (internal = %s) => break_id = %s\n",
647 __FUNCTION__, bp_sp->IsInternal() ? "yes" : "no", s.GetData());
Kate Stoneb9c1b512016-09-06 20:57:50 +0000648 }
Jim Ingham33df7cd2014-12-06 01:28:03 +0000649
Kate Stoneb9c1b512016-09-06 20:57:50 +0000650 bp_sp->ResolveBreakpoint();
Jim Ingham33df7cd2014-12-06 01:28:03 +0000651
Kate Stoneb9c1b512016-09-06 20:57:50 +0000652 if (!internal) {
653 m_last_created_breakpoint = bp_sp;
654 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000655}
656
Jonas Devlieghered3607752019-07-19 00:56:26 +0000657void Target::AddNameToBreakpoint(BreakpointID &id, const char *name,
658 Status &error) {
659 BreakpointSP bp_sp =
660 m_breakpoint_list.FindBreakpointByID(id.GetBreakpointID());
661 if (!bp_sp) {
662 StreamString s;
663 id.GetDescription(&s, eDescriptionLevelBrief);
664 error.SetErrorStringWithFormat("Could not find breakpoint %s", s.GetData());
665 return;
666 }
667 AddNameToBreakpoint(bp_sp, name, error);
668}
Jim Inghamb842f2e2017-09-14 20:22:49 +0000669
Jonas Devlieghered3607752019-07-19 00:56:26 +0000670void Target::AddNameToBreakpoint(BreakpointSP &bp_sp, const char *name,
671 Status &error) {
672 if (!bp_sp)
673 return;
Jim Inghamb842f2e2017-09-14 20:22:49 +0000674
Jonas Devlieghered3607752019-07-19 00:56:26 +0000675 BreakpointName *bp_name = FindBreakpointName(ConstString(name), true, error);
676 if (!bp_name)
677 return;
678
679 bp_name->ConfigureBreakpoint(bp_sp);
680 bp_sp->AddName(name);
681}
Jim Inghamb842f2e2017-09-14 20:22:49 +0000682
683void Target::AddBreakpointName(BreakpointName *bp_name) {
684 m_breakpoint_names.insert(std::make_pair(bp_name->GetName(), bp_name));
685}
686
Jonas Devlieghered3607752019-07-19 00:56:26 +0000687BreakpointName *Target::FindBreakpointName(ConstString name, bool can_create,
688 Status &error) {
Jim Inghamb842f2e2017-09-14 20:22:49 +0000689 BreakpointID::StringIsBreakpointName(name.GetStringRef(), error);
690 if (!error.Success())
691 return nullptr;
692
693 BreakpointNameList::iterator iter = m_breakpoint_names.find(name);
694 if (iter == m_breakpoint_names.end()) {
Jonas Devlieghered3607752019-07-19 00:56:26 +0000695 if (!can_create) {
Jim Inghamb842f2e2017-09-14 20:22:49 +0000696 error.SetErrorStringWithFormat("Breakpoint name \"%s\" doesn't exist and "
Jonas Devlieghered3607752019-07-19 00:56:26 +0000697 "can_create is false.",
698 name.AsCString());
Jim Inghamb842f2e2017-09-14 20:22:49 +0000699 return nullptr;
700 }
701
Jonas Devlieghered3607752019-07-19 00:56:26 +0000702 iter = m_breakpoint_names
703 .insert(std::make_pair(name, new BreakpointName(name)))
704 .first;
Jim Inghamb842f2e2017-09-14 20:22:49 +0000705 }
706 return (iter->second);
707}
708
Jonas Devlieghered3607752019-07-19 00:56:26 +0000709void Target::DeleteBreakpointName(ConstString name) {
Jim Inghamb842f2e2017-09-14 20:22:49 +0000710 BreakpointNameList::iterator iter = m_breakpoint_names.find(name);
Jonas Devlieghered3607752019-07-19 00:56:26 +0000711
Jim Inghamb842f2e2017-09-14 20:22:49 +0000712 if (iter != m_breakpoint_names.end()) {
713 const char *name_cstr = name.AsCString();
714 m_breakpoint_names.erase(iter);
715 for (auto bp_sp : m_breakpoint_list.Breakpoints())
716 bp_sp->RemoveName(name_cstr);
717 }
718}
719
720void Target::RemoveNameFromBreakpoint(lldb::BreakpointSP &bp_sp,
Jonas Devlieghered3607752019-07-19 00:56:26 +0000721 ConstString name) {
Jim Inghamb842f2e2017-09-14 20:22:49 +0000722 bp_sp->RemoveName(name.AsCString());
723}
724
Jonas Devlieghered3607752019-07-19 00:56:26 +0000725void Target::ConfigureBreakpointName(
726 BreakpointName &bp_name, const BreakpointOptions &new_options,
727 const BreakpointName::Permissions &new_permissions) {
Jim Inghamb842f2e2017-09-14 20:22:49 +0000728 bp_name.GetOptions().CopyOverSetOptions(new_options);
729 bp_name.GetPermissions().MergeInto(new_permissions);
730 ApplyNameToBreakpoints(bp_name);
731}
732
733void Target::ApplyNameToBreakpoints(BreakpointName &bp_name) {
734 BreakpointList bkpts_with_name(false);
Jonas Devlieghered3607752019-07-19 00:56:26 +0000735 m_breakpoint_list.FindBreakpointsByName(bp_name.GetName().AsCString(),
Jim Inghamb842f2e2017-09-14 20:22:49 +0000736 bkpts_with_name);
737
738 for (auto bp_sp : bkpts_with_name.Breakpoints())
739 bp_name.ConfigureBreakpoint(bp_sp);
740}
741
Jonas Devlieghered3607752019-07-19 00:56:26 +0000742void Target::GetBreakpointNames(std::vector<std::string> &names) {
Jim Inghamb842f2e2017-09-14 20:22:49 +0000743 names.clear();
744 for (auto bp_name : m_breakpoint_names) {
745 names.push_back(bp_name.first.AsCString());
746 }
Jonas Devlieghere9bbba272019-01-08 23:25:06 +0000747 llvm::sort(names.begin(), names.end());
Jim Inghamb842f2e2017-09-14 20:22:49 +0000748}
749
Kate Stoneb9c1b512016-09-06 20:57:50 +0000750bool Target::ProcessIsValid() {
751 return (m_process_sp && m_process_sp->IsAlive());
Johnny Chen86364b42011-09-20 23:28:55 +0000752}
753
Jason Molendac0e793d2018-11-09 22:33:26 +0000754static bool CheckIfWatchpointsSupported(Target *target, Status &error) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000755 uint32_t num_supported_hardware_watchpoints;
Zachary Turner97206d52017-05-12 04:51:55 +0000756 Status rc = target->GetProcessSP()->GetWatchpointSupportInfo(
Kate Stoneb9c1b512016-09-06 20:57:50 +0000757 num_supported_hardware_watchpoints);
Jason Molendac0e793d2018-11-09 22:33:26 +0000758
759 // If unable to determine the # of watchpoints available,
760 // assume they are supported.
761 if (rc.Fail())
762 return true;
763
Kate Stoneb9c1b512016-09-06 20:57:50 +0000764 if (num_supported_hardware_watchpoints == 0) {
765 error.SetErrorStringWithFormat(
766 "Target supports (%u) hardware watchpoint slots.\n",
767 num_supported_hardware_watchpoints);
768 return false;
769 }
770 return true;
Johnny Chenb90827e2012-06-04 23:19:54 +0000771}
772
Adrian Prantl05097242018-04-30 16:49:04 +0000773// See also Watchpoint::SetWatchpointType(uint32_t type) and the
774// OptionGroupWatchpoint::WatchType enum type.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000775WatchpointSP Target::CreateWatchpoint(lldb::addr_t addr, size_t size,
776 const CompilerType *type, uint32_t kind,
Zachary Turner97206d52017-05-12 04:51:55 +0000777 Status &error) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000778 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_WATCHPOINTS));
Jonas Devlieghere63e5fb72019-07-24 17:56:10 +0000779 LLDB_LOGF(log,
780 "Target::%s (addr = 0x%8.8" PRIx64 " size = %" PRIu64
781 " type = %u)\n",
782 __FUNCTION__, addr, (uint64_t)size, kind);
Johnny Chen0c406372011-09-14 20:23:45 +0000783
Kate Stoneb9c1b512016-09-06 20:57:50 +0000784 WatchpointSP wp_sp;
785 if (!ProcessIsValid()) {
786 error.SetErrorString("process is not alive");
Johnny Chen01a67862011-10-14 00:42:25 +0000787 return wp_sp;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000788 }
Johnny Chen887062a2011-09-12 23:38:44 +0000789
Kate Stoneb9c1b512016-09-06 20:57:50 +0000790 if (addr == LLDB_INVALID_ADDRESS || size == 0) {
791 if (size == 0)
792 error.SetErrorString("cannot set a watchpoint with watch_size of 0");
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000793 else
Kate Stoneb9c1b512016-09-06 20:57:50 +0000794 error.SetErrorStringWithFormat("invalid watch address: %" PRIu64, addr);
795 return wp_sp;
796 }
797
798 if (!LLDB_WATCH_TYPE_IS_VALID(kind)) {
799 error.SetErrorStringWithFormat("invalid watchpoint type: %d", kind);
800 }
801
Jason Molendac0e793d2018-11-09 22:33:26 +0000802 if (!CheckIfWatchpointsSupported(this, error))
Kate Stoneb9c1b512016-09-06 20:57:50 +0000803 return wp_sp;
804
Adrian Prantl05097242018-04-30 16:49:04 +0000805 // Currently we only support one watchpoint per address, with total number of
806 // watchpoints limited by the hardware which the inferior is running on.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000807
808 // Grab the list mutex while doing operations.
809 const bool notify = false; // Don't notify about all the state changes we do
810 // on creating the watchpoint.
811 std::unique_lock<std::recursive_mutex> lock;
812 this->GetWatchpointList().GetListMutex(lock);
813 WatchpointSP matched_sp = m_watchpoint_list.FindByAddress(addr);
814 if (matched_sp) {
815 size_t old_size = matched_sp->GetByteSize();
816 uint32_t old_type =
817 (matched_sp->WatchpointRead() ? LLDB_WATCH_TYPE_READ : 0) |
818 (matched_sp->WatchpointWrite() ? LLDB_WATCH_TYPE_WRITE : 0);
819 // Return the existing watchpoint if both size and type match.
820 if (size == old_size && kind == old_type) {
821 wp_sp = matched_sp;
822 wp_sp->SetEnabled(false, notify);
823 } else {
824 // Nil the matched watchpoint; we will be creating a new one.
825 m_process_sp->DisableWatchpoint(matched_sp.get(), notify);
826 m_watchpoint_list.Remove(matched_sp->GetID(), true);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000827 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000828 }
829
830 if (!wp_sp) {
Jonas Devlieghere796ac802019-02-11 23:13:08 +0000831 wp_sp = std::make_shared<Watchpoint>(*this, addr, size, type);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000832 wp_sp->SetWatchpointType(kind, notify);
833 m_watchpoint_list.Add(wp_sp, true);
834 }
835
836 error = m_process_sp->EnableWatchpoint(wp_sp.get(), notify);
Jonas Devlieghere63e5fb72019-07-24 17:56:10 +0000837 LLDB_LOGF(log, "Target::%s (creation of watchpoint %s with id = %u)\n",
838 __FUNCTION__, error.Success() ? "succeeded" : "failed",
839 wp_sp->GetID());
Kate Stoneb9c1b512016-09-06 20:57:50 +0000840
841 if (error.Fail()) {
Adrian Prantl05097242018-04-30 16:49:04 +0000842 // Enabling the watchpoint on the device side failed. Remove the said
843 // watchpoint from the list maintained by the target instance.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000844 m_watchpoint_list.Remove(wp_sp->GetID(), true);
845 // See if we could provide more helpful error message.
846 if (!OptionGroupWatchpoint::IsWatchSizeSupported(size))
847 error.SetErrorStringWithFormat(
848 "watch size of %" PRIu64 " is not supported", (uint64_t)size);
849
850 wp_sp.reset();
851 } else
852 m_last_created_watchpoint = wp_sp;
853 return wp_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000854}
855
Jonas Devlieghered3607752019-07-19 00:56:26 +0000856void Target::RemoveAllowedBreakpoints() {
Jim Inghamb842f2e2017-09-14 20:22:49 +0000857 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_BREAKPOINTS));
Jonas Devlieghere63e5fb72019-07-24 17:56:10 +0000858 LLDB_LOGF(log, "Target::%s \n", __FUNCTION__);
Jim Inghamb842f2e2017-09-14 20:22:49 +0000859
860 m_breakpoint_list.RemoveAllowed(true);
Jonas Devlieghered3607752019-07-19 00:56:26 +0000861
Jim Inghamb842f2e2017-09-14 20:22:49 +0000862 m_last_created_breakpoint.reset();
863}
864
Kate Stoneb9c1b512016-09-06 20:57:50 +0000865void Target::RemoveAllBreakpoints(bool internal_also) {
866 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_BREAKPOINTS));
Jonas Devlieghere63e5fb72019-07-24 17:56:10 +0000867 LLDB_LOGF(log, "Target::%s (internal_also = %s)\n", __FUNCTION__,
868 internal_also ? "yes" : "no");
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000869
Kate Stoneb9c1b512016-09-06 20:57:50 +0000870 m_breakpoint_list.RemoveAll(true);
871 if (internal_also)
872 m_internal_breakpoint_list.RemoveAll(false);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000873
Kate Stoneb9c1b512016-09-06 20:57:50 +0000874 m_last_created_breakpoint.reset();
875}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000876
Kate Stoneb9c1b512016-09-06 20:57:50 +0000877void Target::DisableAllBreakpoints(bool internal_also) {
878 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_BREAKPOINTS));
Jonas Devlieghere63e5fb72019-07-24 17:56:10 +0000879 LLDB_LOGF(log, "Target::%s (internal_also = %s)\n", __FUNCTION__,
880 internal_also ? "yes" : "no");
Kate Stoneb9c1b512016-09-06 20:57:50 +0000881
882 m_breakpoint_list.SetEnabledAll(false);
883 if (internal_also)
884 m_internal_breakpoint_list.SetEnabledAll(false);
885}
886
Jim Inghamb842f2e2017-09-14 20:22:49 +0000887void Target::DisableAllowedBreakpoints() {
888 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_BREAKPOINTS));
Jonas Devlieghere63e5fb72019-07-24 17:56:10 +0000889 LLDB_LOGF(log, "Target::%s", __FUNCTION__);
Jim Inghamb842f2e2017-09-14 20:22:49 +0000890
891 m_breakpoint_list.SetEnabledAllowed(false);
892}
893
Kate Stoneb9c1b512016-09-06 20:57:50 +0000894void Target::EnableAllBreakpoints(bool internal_also) {
895 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_BREAKPOINTS));
Jonas Devlieghere63e5fb72019-07-24 17:56:10 +0000896 LLDB_LOGF(log, "Target::%s (internal_also = %s)\n", __FUNCTION__,
897 internal_also ? "yes" : "no");
Kate Stoneb9c1b512016-09-06 20:57:50 +0000898
899 m_breakpoint_list.SetEnabledAll(true);
900 if (internal_also)
901 m_internal_breakpoint_list.SetEnabledAll(true);
902}
903
Jim Inghamb842f2e2017-09-14 20:22:49 +0000904void Target::EnableAllowedBreakpoints() {
905 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_BREAKPOINTS));
Jonas Devlieghere63e5fb72019-07-24 17:56:10 +0000906 LLDB_LOGF(log, "Target::%s", __FUNCTION__);
Jim Inghamb842f2e2017-09-14 20:22:49 +0000907
908 m_breakpoint_list.SetEnabledAllowed(true);
909}
910
Kate Stoneb9c1b512016-09-06 20:57:50 +0000911bool Target::RemoveBreakpointByID(break_id_t break_id) {
912 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_BREAKPOINTS));
Jonas Devlieghere63e5fb72019-07-24 17:56:10 +0000913 LLDB_LOGF(log, "Target::%s (break_id = %i, internal = %s)\n", __FUNCTION__,
914 break_id, LLDB_BREAK_ID_IS_INTERNAL(break_id) ? "yes" : "no");
Kate Stoneb9c1b512016-09-06 20:57:50 +0000915
916 if (DisableBreakpointByID(break_id)) {
917 if (LLDB_BREAK_ID_IS_INTERNAL(break_id))
918 m_internal_breakpoint_list.Remove(break_id, false);
919 else {
920 if (m_last_created_breakpoint) {
921 if (m_last_created_breakpoint->GetID() == break_id)
922 m_last_created_breakpoint.reset();
923 }
924 m_breakpoint_list.Remove(break_id, true);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000925 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000926 return true;
927 }
928 return false;
929}
930
931bool Target::DisableBreakpointByID(break_id_t break_id) {
932 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_BREAKPOINTS));
Jonas Devlieghere63e5fb72019-07-24 17:56:10 +0000933 LLDB_LOGF(log, "Target::%s (break_id = %i, internal = %s)\n", __FUNCTION__,
934 break_id, LLDB_BREAK_ID_IS_INTERNAL(break_id) ? "yes" : "no");
Kate Stoneb9c1b512016-09-06 20:57:50 +0000935
936 BreakpointSP bp_sp;
937
938 if (LLDB_BREAK_ID_IS_INTERNAL(break_id))
939 bp_sp = m_internal_breakpoint_list.FindBreakpointByID(break_id);
940 else
941 bp_sp = m_breakpoint_list.FindBreakpointByID(break_id);
942 if (bp_sp) {
943 bp_sp->SetEnabled(false);
944 return true;
945 }
946 return false;
947}
948
949bool Target::EnableBreakpointByID(break_id_t break_id) {
950 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_BREAKPOINTS));
Jonas Devlieghere63e5fb72019-07-24 17:56:10 +0000951 LLDB_LOGF(log, "Target::%s (break_id = %i, internal = %s)\n", __FUNCTION__,
952 break_id, LLDB_BREAK_ID_IS_INTERNAL(break_id) ? "yes" : "no");
Kate Stoneb9c1b512016-09-06 20:57:50 +0000953
954 BreakpointSP bp_sp;
955
956 if (LLDB_BREAK_ID_IS_INTERNAL(break_id))
957 bp_sp = m_internal_breakpoint_list.FindBreakpointByID(break_id);
958 else
959 bp_sp = m_breakpoint_list.FindBreakpointByID(break_id);
960
961 if (bp_sp) {
962 bp_sp->SetEnabled(true);
963 return true;
964 }
965 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000966}
967
Zachary Turner97206d52017-05-12 04:51:55 +0000968Status Target::SerializeBreakpointsToFile(const FileSpec &file,
969 const BreakpointIDList &bp_ids,
970 bool append) {
971 Status error;
Jim Ingham01f16662016-09-14 19:07:35 +0000972
973 if (!file) {
974 error.SetErrorString("Invalid FileSpec.");
975 return error;
976 }
977
978 std::string path(file.GetPath());
Jim Ingham2d3628e2016-09-22 23:42:42 +0000979 StructuredData::ObjectSP input_data_sp;
980
981 StructuredData::ArraySP break_store_sp;
982 StructuredData::Array *break_store_ptr = nullptr;
983
984 if (append) {
985 input_data_sp = StructuredData::ParseJSONFromFile(file, error);
986 if (error.Success()) {
987 break_store_ptr = input_data_sp->GetAsArray();
988 if (!break_store_ptr) {
989 error.SetErrorStringWithFormat(
990 "Tried to append to invalid input file %s", path.c_str());
991 return error;
992 }
993 }
994 }
995
996 if (!break_store_ptr) {
Jonas Devlieghere796ac802019-02-11 23:13:08 +0000997 break_store_sp = std::make_shared<StructuredData::Array>();
Jim Ingham2d3628e2016-09-22 23:42:42 +0000998 break_store_ptr = break_store_sp.get();
999 }
1000
Jim Ingham01f16662016-09-14 19:07:35 +00001001 StreamFile out_file(path.c_str(),
1002 File::OpenOptions::eOpenOptionTruncate |
1003 File::OpenOptions::eOpenOptionWrite |
1004 File::OpenOptions::eOpenOptionCanCreate |
1005 File::OpenOptions::eOpenOptionCloseOnExec,
1006 lldb::eFilePermissionsFileDefault);
1007 if (!out_file.GetFile().IsValid()) {
1008 error.SetErrorStringWithFormat("Unable to open output file: %s.",
1009 path.c_str());
1010 return error;
1011 }
1012
1013 std::unique_lock<std::recursive_mutex> lock;
1014 GetBreakpointList().GetListMutex(lock);
1015
Jim Ingham01f16662016-09-14 19:07:35 +00001016 if (bp_ids.GetSize() == 0) {
1017 const BreakpointList &breakpoints = GetBreakpointList();
1018
1019 size_t num_breakpoints = breakpoints.GetSize();
1020 for (size_t i = 0; i < num_breakpoints; i++) {
1021 Breakpoint *bp = breakpoints.GetBreakpointAtIndex(i).get();
1022 StructuredData::ObjectSP bkpt_save_sp = bp->SerializeToStructuredData();
1023 // If a breakpoint can't serialize it, just ignore it for now:
1024 if (bkpt_save_sp)
Jim Ingham2d3628e2016-09-22 23:42:42 +00001025 break_store_ptr->AddItem(bkpt_save_sp);
Jim Ingham01f16662016-09-14 19:07:35 +00001026 }
1027 } else {
1028
1029 std::unordered_set<lldb::break_id_t> processed_bkpts;
1030 const size_t count = bp_ids.GetSize();
1031 for (size_t i = 0; i < count; ++i) {
1032 BreakpointID cur_bp_id = bp_ids.GetBreakpointIDAtIndex(i);
1033 lldb::break_id_t bp_id = cur_bp_id.GetBreakpointID();
1034
1035 if (bp_id != LLDB_INVALID_BREAK_ID) {
1036 // Only do each breakpoint once:
1037 std::pair<std::unordered_set<lldb::break_id_t>::iterator, bool>
1038 insert_result = processed_bkpts.insert(bp_id);
1039 if (!insert_result.second)
1040 continue;
1041
1042 Breakpoint *bp = GetBreakpointByID(bp_id).get();
1043 StructuredData::ObjectSP bkpt_save_sp = bp->SerializeToStructuredData();
1044 // If the user explicitly asked to serialize a breakpoint, and we
Adrian Prantl05097242018-04-30 16:49:04 +00001045 // can't, then raise an error:
Jim Ingham01f16662016-09-14 19:07:35 +00001046 if (!bkpt_save_sp) {
1047 error.SetErrorStringWithFormat("Unable to serialize breakpoint %d",
1048 bp_id);
1049 return error;
1050 }
Jim Ingham2d3628e2016-09-22 23:42:42 +00001051 break_store_ptr->AddItem(bkpt_save_sp);
Jim Ingham01f16662016-09-14 19:07:35 +00001052 }
1053 }
1054 }
1055
Jim Ingham2d3628e2016-09-22 23:42:42 +00001056 break_store_ptr->Dump(out_file, false);
Jim Ingham01f16662016-09-14 19:07:35 +00001057 out_file.PutChar('\n');
1058 return error;
1059}
1060
Zachary Turner97206d52017-05-12 04:51:55 +00001061Status Target::CreateBreakpointsFromFile(const FileSpec &file,
1062 BreakpointIDList &new_bps) {
Jim Ingham3acdf382016-09-22 22:20:28 +00001063 std::vector<std::string> no_names;
1064 return CreateBreakpointsFromFile(file, no_names, new_bps);
1065}
1066
Zachary Turner97206d52017-05-12 04:51:55 +00001067Status Target::CreateBreakpointsFromFile(const FileSpec &file,
1068 std::vector<std::string> &names,
1069 BreakpointIDList &new_bps) {
Jim Ingham01f16662016-09-14 19:07:35 +00001070 std::unique_lock<std::recursive_mutex> lock;
1071 GetBreakpointList().GetListMutex(lock);
1072
Zachary Turner97206d52017-05-12 04:51:55 +00001073 Status error;
Jim Ingham01f16662016-09-14 19:07:35 +00001074 StructuredData::ObjectSP input_data_sp =
1075 StructuredData::ParseJSONFromFile(file, error);
1076 if (!error.Success()) {
1077 return error;
1078 } else if (!input_data_sp || !input_data_sp->IsValid()) {
1079 error.SetErrorStringWithFormat("Invalid JSON from input file: %s.",
1080 file.GetPath().c_str());
1081 return error;
1082 }
1083
1084 StructuredData::Array *bkpt_array = input_data_sp->GetAsArray();
1085 if (!bkpt_array) {
1086 error.SetErrorStringWithFormat(
1087 "Invalid breakpoint data from input file: %s.", file.GetPath().c_str());
1088 return error;
1089 }
1090
1091 size_t num_bkpts = bkpt_array->GetSize();
Jim Ingham3acdf382016-09-22 22:20:28 +00001092 size_t num_names = names.size();
1093
Jim Ingham01f16662016-09-14 19:07:35 +00001094 for (size_t i = 0; i < num_bkpts; i++) {
1095 StructuredData::ObjectSP bkpt_object_sp = bkpt_array->GetItemAtIndex(i);
1096 // Peel off the breakpoint key, and feed the rest to the Breakpoint:
1097 StructuredData::Dictionary *bkpt_dict = bkpt_object_sp->GetAsDictionary();
1098 if (!bkpt_dict) {
1099 error.SetErrorStringWithFormat(
1100 "Invalid breakpoint data for element %zu from input file: %s.", i,
1101 file.GetPath().c_str());
1102 return error;
1103 }
1104 StructuredData::ObjectSP bkpt_data_sp =
1105 bkpt_dict->GetValueForKey(Breakpoint::GetSerializationKey());
Jim Ingham3acdf382016-09-22 22:20:28 +00001106 if (num_names &&
1107 !Breakpoint::SerializedBreakpointMatchesNames(bkpt_data_sp, names))
1108 continue;
1109
Jim Ingham01f16662016-09-14 19:07:35 +00001110 BreakpointSP bkpt_sp =
1111 Breakpoint::CreateFromStructuredData(*this, bkpt_data_sp, error);
1112 if (!error.Success()) {
1113 error.SetErrorStringWithFormat(
1114 "Error restoring breakpoint %zu from %s: %s.", i,
1115 file.GetPath().c_str(), error.AsCString());
1116 return error;
1117 }
1118 new_bps.AddBreakpointID(BreakpointID(bkpt_sp->GetID()));
1119 }
1120 return error;
1121}
1122
Johnny Chenedf50372011-09-23 21:21:43 +00001123// The flag 'end_to_end', default to true, signifies that the operation is
1124// performed end to end, for both the debugger and the debuggee.
1125
Johnny Chen01a67862011-10-14 00:42:25 +00001126// Assumption: Caller holds the list mutex lock for m_watchpoint_list for end
1127// to end operations.
Kate Stoneb9c1b512016-09-06 20:57:50 +00001128bool Target::RemoveAllWatchpoints(bool end_to_end) {
1129 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_WATCHPOINTS));
Jonas Devlieghere63e5fb72019-07-24 17:56:10 +00001130 LLDB_LOGF(log, "Target::%s\n", __FUNCTION__);
Johnny Chen86364b42011-09-20 23:28:55 +00001131
Kate Stoneb9c1b512016-09-06 20:57:50 +00001132 if (!end_to_end) {
1133 m_watchpoint_list.RemoveAll(true);
1134 return true;
1135 }
Johnny Chenedf50372011-09-23 21:21:43 +00001136
Kate Stoneb9c1b512016-09-06 20:57:50 +00001137 // Otherwise, it's an end to end operation.
Johnny Chenedf50372011-09-23 21:21:43 +00001138
Kate Stoneb9c1b512016-09-06 20:57:50 +00001139 if (!ProcessIsValid())
1140 return false;
Johnny Chen86364b42011-09-20 23:28:55 +00001141
Kate Stoneb9c1b512016-09-06 20:57:50 +00001142 size_t num_watchpoints = m_watchpoint_list.GetSize();
1143 for (size_t i = 0; i < num_watchpoints; ++i) {
1144 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
1145 if (!wp_sp)
1146 return false;
Johnny Chen86364b42011-09-20 23:28:55 +00001147
Zachary Turner97206d52017-05-12 04:51:55 +00001148 Status rc = m_process_sp->DisableWatchpoint(wp_sp.get());
Kate Stoneb9c1b512016-09-06 20:57:50 +00001149 if (rc.Fail())
1150 return false;
1151 }
1152 m_watchpoint_list.RemoveAll(true);
1153 m_last_created_watchpoint.reset();
1154 return true; // Success!
Johnny Chen86364b42011-09-20 23:28:55 +00001155}
1156
Adrian Prantl05097242018-04-30 16:49:04 +00001157// Assumption: Caller holds the list mutex lock for m_watchpoint_list for end
1158// to end operations.
Kate Stoneb9c1b512016-09-06 20:57:50 +00001159bool Target::DisableAllWatchpoints(bool end_to_end) {
1160 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_WATCHPOINTS));
Jonas Devlieghere63e5fb72019-07-24 17:56:10 +00001161 LLDB_LOGF(log, "Target::%s\n", __FUNCTION__);
Johnny Chen86364b42011-09-20 23:28:55 +00001162
Kate Stoneb9c1b512016-09-06 20:57:50 +00001163 if (!end_to_end) {
1164 m_watchpoint_list.SetEnabledAll(false);
1165 return true;
1166 }
Johnny Chenedf50372011-09-23 21:21:43 +00001167
Kate Stoneb9c1b512016-09-06 20:57:50 +00001168 // Otherwise, it's an end to end operation.
Johnny Chenedf50372011-09-23 21:21:43 +00001169
Kate Stoneb9c1b512016-09-06 20:57:50 +00001170 if (!ProcessIsValid())
1171 return false;
Johnny Chen86364b42011-09-20 23:28:55 +00001172
Kate Stoneb9c1b512016-09-06 20:57:50 +00001173 size_t num_watchpoints = m_watchpoint_list.GetSize();
1174 for (size_t i = 0; i < num_watchpoints; ++i) {
1175 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
1176 if (!wp_sp)
1177 return false;
Johnny Chen86364b42011-09-20 23:28:55 +00001178
Zachary Turner97206d52017-05-12 04:51:55 +00001179 Status rc = m_process_sp->DisableWatchpoint(wp_sp.get());
Kate Stoneb9c1b512016-09-06 20:57:50 +00001180 if (rc.Fail())
1181 return false;
1182 }
1183 return true; // Success!
Johnny Chen86364b42011-09-20 23:28:55 +00001184}
1185
Adrian Prantl05097242018-04-30 16:49:04 +00001186// Assumption: Caller holds the list mutex lock for m_watchpoint_list for end
1187// to end operations.
Kate Stoneb9c1b512016-09-06 20:57:50 +00001188bool Target::EnableAllWatchpoints(bool end_to_end) {
1189 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_WATCHPOINTS));
Jonas Devlieghere63e5fb72019-07-24 17:56:10 +00001190 LLDB_LOGF(log, "Target::%s\n", __FUNCTION__);
Johnny Chen86364b42011-09-20 23:28:55 +00001191
Kate Stoneb9c1b512016-09-06 20:57:50 +00001192 if (!end_to_end) {
1193 m_watchpoint_list.SetEnabledAll(true);
1194 return true;
1195 }
Johnny Chenedf50372011-09-23 21:21:43 +00001196
Kate Stoneb9c1b512016-09-06 20:57:50 +00001197 // Otherwise, it's an end to end operation.
Johnny Chenedf50372011-09-23 21:21:43 +00001198
Kate Stoneb9c1b512016-09-06 20:57:50 +00001199 if (!ProcessIsValid())
1200 return false;
Johnny Chen86364b42011-09-20 23:28:55 +00001201
Kate Stoneb9c1b512016-09-06 20:57:50 +00001202 size_t num_watchpoints = m_watchpoint_list.GetSize();
1203 for (size_t i = 0; i < num_watchpoints; ++i) {
1204 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
1205 if (!wp_sp)
1206 return false;
Johnny Chen86364b42011-09-20 23:28:55 +00001207
Zachary Turner97206d52017-05-12 04:51:55 +00001208 Status rc = m_process_sp->EnableWatchpoint(wp_sp.get());
Kate Stoneb9c1b512016-09-06 20:57:50 +00001209 if (rc.Fail())
1210 return false;
1211 }
1212 return true; // Success!
Johnny Chen86364b42011-09-20 23:28:55 +00001213}
1214
Johnny Chena4d6bc92012-02-25 06:44:30 +00001215// Assumption: Caller holds the list mutex lock for m_watchpoint_list.
Kate Stoneb9c1b512016-09-06 20:57:50 +00001216bool Target::ClearAllWatchpointHitCounts() {
1217 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_WATCHPOINTS));
Jonas Devlieghere63e5fb72019-07-24 17:56:10 +00001218 LLDB_LOGF(log, "Target::%s\n", __FUNCTION__);
Johnny Chena4d6bc92012-02-25 06:44:30 +00001219
Kate Stoneb9c1b512016-09-06 20:57:50 +00001220 size_t num_watchpoints = m_watchpoint_list.GetSize();
1221 for (size_t i = 0; i < num_watchpoints; ++i) {
1222 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
1223 if (!wp_sp)
1224 return false;
Johnny Chena4d6bc92012-02-25 06:44:30 +00001225
Kate Stoneb9c1b512016-09-06 20:57:50 +00001226 wp_sp->ResetHitCount();
1227 }
1228 return true; // Success!
Johnny Chena4d6bc92012-02-25 06:44:30 +00001229}
1230
Enrico Granata5e3fe042015-02-11 00:37:54 +00001231// Assumption: Caller holds the list mutex lock for m_watchpoint_list.
Kate Stoneb9c1b512016-09-06 20:57:50 +00001232bool Target::ClearAllWatchpointHistoricValues() {
1233 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_WATCHPOINTS));
Jonas Devlieghere63e5fb72019-07-24 17:56:10 +00001234 LLDB_LOGF(log, "Target::%s\n", __FUNCTION__);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001235
1236 size_t num_watchpoints = m_watchpoint_list.GetSize();
1237 for (size_t i = 0; i < num_watchpoints; ++i) {
1238 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
1239 if (!wp_sp)
1240 return false;
1241
1242 wp_sp->ResetHistoricValues();
1243 }
1244 return true; // Success!
Enrico Granata5e3fe042015-02-11 00:37:54 +00001245}
1246
Adrian Prantl05097242018-04-30 16:49:04 +00001247// Assumption: Caller holds the list mutex lock for m_watchpoint_list during
1248// these operations.
Kate Stoneb9c1b512016-09-06 20:57:50 +00001249bool Target::IgnoreAllWatchpoints(uint32_t ignore_count) {
1250 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_WATCHPOINTS));
Jonas Devlieghere63e5fb72019-07-24 17:56:10 +00001251 LLDB_LOGF(log, "Target::%s\n", __FUNCTION__);
Johnny Chen6cc60e82011-10-05 21:35:46 +00001252
Kate Stoneb9c1b512016-09-06 20:57:50 +00001253 if (!ProcessIsValid())
1254 return false;
Johnny Chen6cc60e82011-10-05 21:35:46 +00001255
Kate Stoneb9c1b512016-09-06 20:57:50 +00001256 size_t num_watchpoints = m_watchpoint_list.GetSize();
1257 for (size_t i = 0; i < num_watchpoints; ++i) {
1258 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
1259 if (!wp_sp)
1260 return false;
Johnny Chen6cc60e82011-10-05 21:35:46 +00001261
Kate Stoneb9c1b512016-09-06 20:57:50 +00001262 wp_sp->SetIgnoreCount(ignore_count);
1263 }
1264 return true; // Success!
Johnny Chen6cc60e82011-10-05 21:35:46 +00001265}
1266
Johnny Chen01a67862011-10-14 00:42:25 +00001267// Assumption: Caller holds the list mutex lock for m_watchpoint_list.
Kate Stoneb9c1b512016-09-06 20:57:50 +00001268bool Target::DisableWatchpointByID(lldb::watch_id_t watch_id) {
1269 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_WATCHPOINTS));
Jonas Devlieghere63e5fb72019-07-24 17:56:10 +00001270 LLDB_LOGF(log, "Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
Johnny Chen86364b42011-09-20 23:28:55 +00001271
Kate Stoneb9c1b512016-09-06 20:57:50 +00001272 if (!ProcessIsValid())
Johnny Chen86364b42011-09-20 23:28:55 +00001273 return false;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001274
1275 WatchpointSP wp_sp = m_watchpoint_list.FindByID(watch_id);
1276 if (wp_sp) {
Zachary Turner97206d52017-05-12 04:51:55 +00001277 Status rc = m_process_sp->DisableWatchpoint(wp_sp.get());
Kate Stoneb9c1b512016-09-06 20:57:50 +00001278 if (rc.Success())
1279 return true;
1280
1281 // Else, fallthrough.
1282 }
1283 return false;
Johnny Chen86364b42011-09-20 23:28:55 +00001284}
1285
Johnny Chen01a67862011-10-14 00:42:25 +00001286// Assumption: Caller holds the list mutex lock for m_watchpoint_list.
Kate Stoneb9c1b512016-09-06 20:57:50 +00001287bool Target::EnableWatchpointByID(lldb::watch_id_t watch_id) {
1288 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_WATCHPOINTS));
Jonas Devlieghere63e5fb72019-07-24 17:56:10 +00001289 LLDB_LOGF(log, "Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
Johnny Chen86364b42011-09-20 23:28:55 +00001290
Kate Stoneb9c1b512016-09-06 20:57:50 +00001291 if (!ProcessIsValid())
Johnny Chen86364b42011-09-20 23:28:55 +00001292 return false;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001293
1294 WatchpointSP wp_sp = m_watchpoint_list.FindByID(watch_id);
1295 if (wp_sp) {
Zachary Turner97206d52017-05-12 04:51:55 +00001296 Status rc = m_process_sp->EnableWatchpoint(wp_sp.get());
Kate Stoneb9c1b512016-09-06 20:57:50 +00001297 if (rc.Success())
1298 return true;
1299
1300 // Else, fallthrough.
1301 }
1302 return false;
Johnny Chen86364b42011-09-20 23:28:55 +00001303}
1304
Johnny Chen01a67862011-10-14 00:42:25 +00001305// Assumption: Caller holds the list mutex lock for m_watchpoint_list.
Kate Stoneb9c1b512016-09-06 20:57:50 +00001306bool Target::RemoveWatchpointByID(lldb::watch_id_t watch_id) {
1307 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_WATCHPOINTS));
Jonas Devlieghere63e5fb72019-07-24 17:56:10 +00001308 LLDB_LOGF(log, "Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
Johnny Chen86364b42011-09-20 23:28:55 +00001309
Kate Stoneb9c1b512016-09-06 20:57:50 +00001310 WatchpointSP watch_to_remove_sp = m_watchpoint_list.FindByID(watch_id);
1311 if (watch_to_remove_sp == m_last_created_watchpoint)
1312 m_last_created_watchpoint.reset();
1313
1314 if (DisableWatchpointByID(watch_id)) {
1315 m_watchpoint_list.Remove(watch_id, true);
1316 return true;
1317 }
1318 return false;
Johnny Chen86364b42011-09-20 23:28:55 +00001319}
1320
Johnny Chen01a67862011-10-14 00:42:25 +00001321// Assumption: Caller holds the list mutex lock for m_watchpoint_list.
Kate Stoneb9c1b512016-09-06 20:57:50 +00001322bool Target::IgnoreWatchpointByID(lldb::watch_id_t watch_id,
1323 uint32_t ignore_count) {
1324 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_WATCHPOINTS));
Jonas Devlieghere63e5fb72019-07-24 17:56:10 +00001325 LLDB_LOGF(log, "Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
Johnny Chen6cc60e82011-10-05 21:35:46 +00001326
Kate Stoneb9c1b512016-09-06 20:57:50 +00001327 if (!ProcessIsValid())
Johnny Chen6cc60e82011-10-05 21:35:46 +00001328 return false;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001329
1330 WatchpointSP wp_sp = m_watchpoint_list.FindByID(watch_id);
1331 if (wp_sp) {
1332 wp_sp->SetIgnoreCount(ignore_count);
1333 return true;
1334 }
1335 return false;
Johnny Chen6cc60e82011-10-05 21:35:46 +00001336}
1337
Kate Stoneb9c1b512016-09-06 20:57:50 +00001338ModuleSP Target::GetExecutableModule() {
1339 // search for the first executable in the module list
1340 for (size_t i = 0; i < m_images.GetSize(); ++i) {
1341 ModuleSP module_sp = m_images.GetModuleAtIndex(i);
1342 lldb_private::ObjectFile *obj = module_sp->GetObjectFile();
1343 if (obj == nullptr)
1344 continue;
1345 if (obj->GetType() == ObjectFile::Type::eTypeExecutable)
1346 return module_sp;
1347 }
1348 // as fall back return the first module loaded
1349 return m_images.GetModuleAtIndex(0);
Greg Claytonaa149cb2011-08-11 02:48:45 +00001350}
1351
Kate Stoneb9c1b512016-09-06 20:57:50 +00001352Module *Target::GetExecutableModulePointer() {
1353 return GetExecutableModule().get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001354}
1355
Kate Stoneb9c1b512016-09-06 20:57:50 +00001356static void LoadScriptingResourceForModule(const ModuleSP &module_sp,
1357 Target *target) {
Zachary Turner97206d52017-05-12 04:51:55 +00001358 Status error;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001359 StreamString feedback_stream;
Jonas Devlieghered3607752019-07-19 00:56:26 +00001360 if (module_sp && !module_sp->LoadScriptingResourceInTarget(
1361 target, error, &feedback_stream)) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001362 if (error.AsCString())
1363 target->GetDebugger().GetErrorFile()->Printf(
1364 "unable to load scripting data for module %s - error reported was "
1365 "%s\n",
1366 module_sp->GetFileSpec().GetFileNameStrippingExtension().GetCString(),
1367 error.AsCString());
1368 }
1369 if (feedback_stream.GetSize())
1370 target->GetDebugger().GetErrorFile()->Printf("%s\n",
1371 feedback_stream.GetData());
Enrico Granata17598482012-11-08 02:22:02 +00001372}
1373
Kate Stoneb9c1b512016-09-06 20:57:50 +00001374void Target::ClearModules(bool delete_locations) {
1375 ModulesDidUnload(m_images, delete_locations);
1376 m_section_load_history.Clear();
1377 m_images.Clear();
1378 m_scratch_type_system_map.Clear();
1379 m_ast_importer_sp.reset();
Greg Clayton095eeaa2013-11-05 23:28:00 +00001380}
1381
Kate Stoneb9c1b512016-09-06 20:57:50 +00001382void Target::DidExec() {
1383 // When a process exec's we need to know about it so we can do some cleanup.
Pavel Labath13e37d42017-10-25 21:05:31 +00001384 m_breakpoint_list.RemoveInvalidLocations(m_arch.GetSpec());
1385 m_internal_breakpoint_list.RemoveInvalidLocations(m_arch.GetSpec());
Greg Claytonb35db632013-11-09 00:03:31 +00001386}
1387
Kate Stoneb9c1b512016-09-06 20:57:50 +00001388void Target::SetExecutableModule(ModuleSP &executable_sp,
Jonas Devliegheref9a07e92018-09-20 09:09:05 +00001389 LoadDependentFiles load_dependent_files) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001390 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_TARGET));
1391 ClearModules(false);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001392
Kate Stoneb9c1b512016-09-06 20:57:50 +00001393 if (executable_sp) {
Pavel Labathf9d16472017-05-15 13:02:37 +00001394 static Timer::Category func_cat(LLVM_PRETTY_FUNCTION);
1395 Timer scoped_timer(func_cat,
Kate Stoneb9c1b512016-09-06 20:57:50 +00001396 "Target::SetExecutableModule (executable = '%s')",
1397 executable_sp->GetFileSpec().GetPath().c_str());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001398
Jason Molenda1724a172019-04-08 23:03:02 +00001399 const bool notify = true;
Jonas Devlieghered3607752019-07-19 00:56:26 +00001400 m_images.Append(executable_sp,
1401 notify); // The first image is our executable file
Jason Molendae1b68ad2012-12-05 00:25:49 +00001402
Kate Stoneb9c1b512016-09-06 20:57:50 +00001403 // If we haven't set an architecture yet, reset our architecture based on
1404 // what we found in the executable module.
Pavel Labath13e37d42017-10-25 21:05:31 +00001405 if (!m_arch.GetSpec().IsValid()) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001406 m_arch = executable_sp->GetArchitecture();
Pavel Labath13e37d42017-10-25 21:05:31 +00001407 LLDB_LOG(log,
1408 "setting architecture to {0} ({1}) based on executable file",
1409 m_arch.GetSpec().GetArchitectureName(),
1410 m_arch.GetSpec().GetTriple().getTriple());
Jason Molendadad8af42015-11-10 04:11:37 +00001411 }
1412
Kate Stoneb9c1b512016-09-06 20:57:50 +00001413 FileSpecList dependent_files;
1414 ObjectFile *executable_objfile = executable_sp->GetObjectFile();
Jonas Devlieghere041e68f2018-09-27 06:59:15 +00001415 bool load_dependents = true;
Jonas Devliegheref9a07e92018-09-20 09:09:05 +00001416 switch (load_dependent_files) {
1417 case eLoadDependentsDefault:
Jonas Devlieghere041e68f2018-09-27 06:59:15 +00001418 load_dependents = executable_sp->IsExecutable();
Jonas Devliegheref9a07e92018-09-20 09:09:05 +00001419 break;
1420 case eLoadDependentsYes:
Jonas Devlieghere041e68f2018-09-27 06:59:15 +00001421 load_dependents = true;
Jonas Devliegheref9a07e92018-09-20 09:09:05 +00001422 break;
1423 case eLoadDependentsNo:
Jonas Devlieghere041e68f2018-09-27 06:59:15 +00001424 load_dependents = false;
Jonas Devliegheref9a07e92018-09-20 09:09:05 +00001425 break;
1426 }
Greg Clayton095eeaa2013-11-05 23:28:00 +00001427
Jonas Devlieghere041e68f2018-09-27 06:59:15 +00001428 if (executable_objfile && load_dependents) {
Jason Molenda1724a172019-04-08 23:03:02 +00001429 ModuleList added_modules;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001430 executable_objfile->GetDependentModules(dependent_files);
1431 for (uint32_t i = 0; i < dependent_files.GetSize(); i++) {
1432 FileSpec dependent_file_spec(
1433 dependent_files.GetFileSpecPointerAtIndex(i));
1434 FileSpec platform_dependent_file_spec;
Greg Clayton67cc0632012-08-22 17:17:09 +00001435 if (m_platform_sp)
Kate Stoneb9c1b512016-09-06 20:57:50 +00001436 m_platform_sp->GetFileWithUUID(dependent_file_spec, nullptr,
1437 platform_dependent_file_spec);
1438 else
1439 platform_dependent_file_spec = dependent_file_spec;
1440
Pavel Labath13e37d42017-10-25 21:05:31 +00001441 ModuleSpec module_spec(platform_dependent_file_spec, m_arch.GetSpec());
Jonas Devlieghered3607752019-07-19 00:56:26 +00001442 ModuleSP image_module_sp(
1443 GetOrCreateModule(module_spec, false /* notify */));
Kate Stoneb9c1b512016-09-06 20:57:50 +00001444 if (image_module_sp) {
Jonas Devlieghered3607752019-07-19 00:56:26 +00001445 added_modules.AppendIfNeeded(image_module_sp, false);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001446 ObjectFile *objfile = image_module_sp->GetObjectFile();
1447 if (objfile)
1448 objfile->GetDependentModules(dependent_files);
1449 }
1450 }
Jason Molenda1724a172019-04-08 23:03:02 +00001451 ModulesDidLoad(added_modules);
Jim Inghamc6674fd2011-10-28 23:14:11 +00001452 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001453 }
Jim Inghamc6674fd2011-10-28 23:14:11 +00001454}
1455
Greg Clayton19c8f392018-08-06 16:56:10 +00001456bool Target::SetArchitecture(const ArchSpec &arch_spec, bool set_platform) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001457 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_TARGET));
Pavel Labath13e37d42017-10-25 21:05:31 +00001458 bool missing_local_arch = !m_arch.GetSpec().IsValid();
Kate Stoneb9c1b512016-09-06 20:57:50 +00001459 bool replace_local_arch = true;
1460 bool compatible_local_arch = false;
1461 ArchSpec other(arch_spec);
Greg Claytone72dfb32012-02-24 01:59:29 +00001462
Greg Clayton19c8f392018-08-06 16:56:10 +00001463 // Changing the architecture might mean that the currently selected platform
1464 // isn't compatible. Set the platform correctly if we are asked to do so,
1465 // otherwise assume the user will set the platform manually.
1466 if (set_platform) {
1467 if (other.IsValid()) {
1468 auto platform_sp = GetPlatform();
1469 if (!platform_sp ||
1470 !platform_sp->IsCompatibleArchitecture(other, false, nullptr)) {
1471 ArchSpec platform_arch;
1472 auto arch_platform_sp =
1473 Platform::GetPlatformForArchitecture(other, &platform_arch);
1474 if (arch_platform_sp) {
1475 SetPlatform(arch_platform_sp);
1476 if (platform_arch.IsValid())
1477 other = platform_arch;
1478 }
1479 }
1480 }
1481 }
1482
Kate Stoneb9c1b512016-09-06 20:57:50 +00001483 if (!missing_local_arch) {
Pavel Labath13e37d42017-10-25 21:05:31 +00001484 if (m_arch.GetSpec().IsCompatibleMatch(arch_spec)) {
1485 other.MergeFrom(m_arch.GetSpec());
Kate Stoneb9c1b512016-09-06 20:57:50 +00001486
Pavel Labath13e37d42017-10-25 21:05:31 +00001487 if (m_arch.GetSpec().IsCompatibleMatch(other)) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001488 compatible_local_arch = true;
1489 bool arch_changed, vendor_changed, os_changed, os_ver_changed,
1490 env_changed;
1491
Jonas Devlieghered3607752019-07-19 00:56:26 +00001492 m_arch.GetSpec().PiecewiseTripleCompare(other, arch_changed,
1493 vendor_changed, os_changed,
1494 os_ver_changed, env_changed);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001495
1496 if (!arch_changed && !vendor_changed && !os_changed && !env_changed)
1497 replace_local_arch = false;
1498 }
1499 }
1500 }
1501
1502 if (compatible_local_arch || missing_local_arch) {
1503 // If we haven't got a valid arch spec, or the architectures are compatible
Adrian Prantl05097242018-04-30 16:49:04 +00001504 // update the architecture, unless the one we already have is more
1505 // specified
Kate Stoneb9c1b512016-09-06 20:57:50 +00001506 if (replace_local_arch)
1507 m_arch = other;
Pavel Labath13e37d42017-10-25 21:05:31 +00001508 LLDB_LOG(log, "set architecture to {0} ({1})",
1509 m_arch.GetSpec().GetArchitectureName(),
1510 m_arch.GetSpec().GetTriple().getTriple());
Kate Stoneb9c1b512016-09-06 20:57:50 +00001511 return true;
1512 }
1513
1514 // If we have an executable file, try to reset the executable to the desired
1515 // architecture
Jonas Devlieghere63e5fb72019-07-24 17:56:10 +00001516 LLDB_LOGF(log, "Target::SetArchitecture changing architecture to %s (%s)",
1517 arch_spec.GetArchitectureName(),
1518 arch_spec.GetTriple().getTriple().c_str());
Kate Stoneb9c1b512016-09-06 20:57:50 +00001519 m_arch = other;
1520 ModuleSP executable_sp = GetExecutableModule();
1521
1522 ClearModules(true);
1523 // Need to do something about unsetting breakpoints.
1524
1525 if (executable_sp) {
Jonas Devlieghere63e5fb72019-07-24 17:56:10 +00001526 LLDB_LOGF(log,
1527 "Target::SetArchitecture Trying to select executable file "
1528 "architecture %s (%s)",
1529 arch_spec.GetArchitectureName(),
1530 arch_spec.GetTriple().getTriple().c_str());
Kate Stoneb9c1b512016-09-06 20:57:50 +00001531 ModuleSpec module_spec(executable_sp->GetFileSpec(), other);
Frederic Rissacbf0052019-04-23 20:17:04 +00001532 FileSpecList search_paths = GetExecutableSearchPaths();
Zachary Turner97206d52017-05-12 04:51:55 +00001533 Status error = ModuleList::GetSharedModule(module_spec, executable_sp,
Jonas Devlieghered3607752019-07-19 00:56:26 +00001534 &search_paths, nullptr, nullptr);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001535
1536 if (!error.Fail() && executable_sp) {
Jonas Devliegheref9a07e92018-09-20 09:09:05 +00001537 SetExecutableModule(executable_sp, eLoadDependentsYes);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001538 return true;
1539 }
1540 }
1541 return false;
Greg Claytondb598232011-01-07 01:57:07 +00001542}
1543
Kate Stoneb9c1b512016-09-06 20:57:50 +00001544bool Target::MergeArchitecture(const ArchSpec &arch_spec) {
Jason Molendadf9f7962018-10-23 23:45:56 +00001545 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_TARGET));
Kate Stoneb9c1b512016-09-06 20:57:50 +00001546 if (arch_spec.IsValid()) {
Pavel Labath13e37d42017-10-25 21:05:31 +00001547 if (m_arch.GetSpec().IsCompatibleMatch(arch_spec)) {
Adrian Prantl05097242018-04-30 16:49:04 +00001548 // The current target arch is compatible with "arch_spec", see if we can
1549 // improve our current architecture using bits from "arch_spec"
Greg Claytonc749eb82011-07-11 05:12:02 +00001550
Jonas Devlieghere63e5fb72019-07-24 17:56:10 +00001551 LLDB_LOGF(log,
1552 "Target::MergeArchitecture target has arch %s, merging with "
1553 "arch %s",
1554 m_arch.GetSpec().GetTriple().getTriple().c_str(),
1555 arch_spec.GetTriple().getTriple().c_str());
Jason Molendadf9f7962018-10-23 23:45:56 +00001556
Kate Stoneb9c1b512016-09-06 20:57:50 +00001557 // Merge bits from arch_spec into "merged_arch" and set our architecture
Pavel Labath13e37d42017-10-25 21:05:31 +00001558 ArchSpec merged_arch(m_arch.GetSpec());
Kate Stoneb9c1b512016-09-06 20:57:50 +00001559 merged_arch.MergeFrom(arch_spec);
1560 return SetArchitecture(merged_arch);
1561 } else {
1562 // The new architecture is different, we just need to replace it
1563 return SetArchitecture(arch_spec);
Greg Claytondda4f7b2010-06-30 23:03:03 +00001564 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001565 }
1566 return false;
1567}
Greg Claytonc749eb82011-07-11 05:12:02 +00001568
Jason Molenda1724a172019-04-08 23:03:02 +00001569void Target::NotifyWillClearList(const ModuleList &module_list) {}
Kate Stoneb9c1b512016-09-06 20:57:50 +00001570
Jason Molenda1724a172019-04-08 23:03:02 +00001571void Target::NotifyModuleAdded(const ModuleList &module_list,
Jonas Devlieghered3607752019-07-19 00:56:26 +00001572 const ModuleSP &module_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001573 // A module is being added to this target for the first time
1574 if (m_valid) {
1575 ModuleList my_module_list;
1576 my_module_list.Append(module_sp);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001577 ModulesDidLoad(my_module_list);
1578 }
1579}
1580
Jason Molenda1724a172019-04-08 23:03:02 +00001581void Target::NotifyModuleRemoved(const ModuleList &module_list,
Jonas Devlieghered3607752019-07-19 00:56:26 +00001582 const ModuleSP &module_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001583 // A module is being removed from this target.
1584 if (m_valid) {
1585 ModuleList my_module_list;
1586 my_module_list.Append(module_sp);
1587 ModulesDidUnload(my_module_list, false);
1588 }
1589}
1590
Jason Molenda1724a172019-04-08 23:03:02 +00001591void Target::NotifyModuleUpdated(const ModuleList &module_list,
Jonas Devlieghered3607752019-07-19 00:56:26 +00001592 const ModuleSP &old_module_sp,
1593 const ModuleSP &new_module_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001594 // A module is replacing an already added module
1595 if (m_valid) {
1596 m_breakpoint_list.UpdateBreakpointsWhenModuleIsReplaced(old_module_sp,
1597 new_module_sp);
1598 m_internal_breakpoint_list.UpdateBreakpointsWhenModuleIsReplaced(
1599 old_module_sp, new_module_sp);
1600 }
1601}
1602
Jason Molenda1724a172019-04-08 23:03:02 +00001603void Target::NotifyModulesRemoved(lldb_private::ModuleList &module_list) {
Jonas Devlieghered3607752019-07-19 00:56:26 +00001604 ModulesDidUnload(module_list, false);
Jason Molenda1724a172019-04-08 23:03:02 +00001605}
1606
Kate Stoneb9c1b512016-09-06 20:57:50 +00001607void Target::ModulesDidLoad(ModuleList &module_list) {
Jason Molendaa38b8c82019-04-22 22:42:29 +00001608 const size_t num_images = module_list.GetSize();
1609 if (m_valid && num_images) {
Jason Molenda1724a172019-04-08 23:03:02 +00001610 for (size_t idx = 0; idx < num_images; ++idx) {
Jason Molendaa38b8c82019-04-22 22:42:29 +00001611 ModuleSP module_sp(module_list.GetModuleAtIndex(idx));
Jason Molenda1724a172019-04-08 23:03:02 +00001612 LoadScriptingResourceForModule(module_sp, this);
1613 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001614 m_breakpoint_list.UpdateBreakpoints(module_list, true, false);
1615 m_internal_breakpoint_list.UpdateBreakpoints(module_list, true, false);
1616 if (m_process_sp) {
1617 m_process_sp->ModulesDidLoad(module_list);
1618 }
1619 BroadcastEvent(eBroadcastBitModulesLoaded,
1620 new TargetEventData(this->shared_from_this(), module_list));
1621 }
1622}
1623
1624void Target::SymbolsDidLoad(ModuleList &module_list) {
1625 if (m_valid && module_list.GetSize()) {
1626 if (m_process_sp) {
Alex Langfordb978f722019-06-03 23:12:11 +00001627 for (LanguageRuntime *runtime : m_process_sp->GetLanguageRuntimes()) {
1628 runtime->SymbolsDidLoad(module_list);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001629 }
1630 }
1631
1632 m_breakpoint_list.UpdateBreakpoints(module_list, true, false);
1633 m_internal_breakpoint_list.UpdateBreakpoints(module_list, true, false);
1634 BroadcastEvent(eBroadcastBitSymbolsLoaded,
1635 new TargetEventData(this->shared_from_this(), module_list));
1636 }
1637}
1638
1639void Target::ModulesDidUnload(ModuleList &module_list, bool delete_locations) {
1640 if (m_valid && module_list.GetSize()) {
1641 UnloadModuleSections(module_list);
1642 m_breakpoint_list.UpdateBreakpoints(module_list, false, delete_locations);
1643 m_internal_breakpoint_list.UpdateBreakpoints(module_list, false,
1644 delete_locations);
1645 BroadcastEvent(eBroadcastBitModulesUnloaded,
1646 new TargetEventData(this->shared_from_this(), module_list));
1647 }
1648}
1649
1650bool Target::ModuleIsExcludedForUnconstrainedSearches(
1651 const FileSpec &module_file_spec) {
1652 if (GetBreakpointsConsultPlatformAvoidList()) {
1653 ModuleList matchingModules;
1654 ModuleSpec module_spec(module_file_spec);
1655 size_t num_modules = GetImages().FindModules(module_spec, matchingModules);
1656
1657 // If there is more than one module for this file spec, only return true if
1658 // ALL the modules are on the
1659 // black list.
1660 if (num_modules > 0) {
1661 for (size_t i = 0; i < num_modules; i++) {
1662 if (!ModuleIsExcludedForUnconstrainedSearches(
1663 matchingModules.GetModuleAtIndex(i)))
1664 return false;
1665 }
1666 return true;
1667 }
1668 }
1669 return false;
1670}
1671
1672bool Target::ModuleIsExcludedForUnconstrainedSearches(
1673 const lldb::ModuleSP &module_sp) {
1674 if (GetBreakpointsConsultPlatformAvoidList()) {
1675 if (m_platform_sp)
1676 return m_platform_sp->ModuleIsExcludedForUnconstrainedSearches(*this,
1677 module_sp);
1678 }
1679 return false;
1680}
1681
1682size_t Target::ReadMemoryFromFileCache(const Address &addr, void *dst,
Zachary Turner97206d52017-05-12 04:51:55 +00001683 size_t dst_len, Status &error) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001684 SectionSP section_sp(addr.GetSection());
1685 if (section_sp) {
1686 // If the contents of this section are encrypted, the on-disk file is
1687 // unusable. Read only from live memory.
1688 if (section_sp->IsEncrypted()) {
1689 error.SetErrorString("section is encrypted");
1690 return 0;
1691 }
1692 ModuleSP module_sp(section_sp->GetModule());
1693 if (module_sp) {
1694 ObjectFile *objfile = section_sp->GetModule()->GetObjectFile();
1695 if (objfile) {
1696 size_t bytes_read = objfile->ReadSectionData(
1697 section_sp.get(), addr.GetOffset(), dst, dst_len);
Greg Claytondb598232011-01-07 01:57:07 +00001698 if (bytes_read > 0)
Kate Stoneb9c1b512016-09-06 20:57:50 +00001699 return bytes_read;
Greg Claytondda4f7b2010-06-30 23:03:03 +00001700 else
Kate Stoneb9c1b512016-09-06 20:57:50 +00001701 error.SetErrorStringWithFormat("error reading data from section %s",
1702 section_sp->GetName().GetCString());
1703 } else
1704 error.SetErrorString("address isn't from a object file");
1705 } else
1706 error.SetErrorString("address isn't in a module");
1707 } else
1708 error.SetErrorString("address doesn't contain a section that points to a "
1709 "section in a object file");
1710
1711 return 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001712}
1713
Kate Stoneb9c1b512016-09-06 20:57:50 +00001714size_t Target::ReadMemory(const Address &addr, bool prefer_file_cache,
Zachary Turner97206d52017-05-12 04:51:55 +00001715 void *dst, size_t dst_len, Status &error,
Kate Stoneb9c1b512016-09-06 20:57:50 +00001716 lldb::addr_t *load_addr_ptr) {
1717 error.Clear();
1718
Adrian Prantl05097242018-04-30 16:49:04 +00001719 // if we end up reading this from process memory, we will fill this with the
1720 // actual load address
Kate Stoneb9c1b512016-09-06 20:57:50 +00001721 if (load_addr_ptr)
1722 *load_addr_ptr = LLDB_INVALID_ADDRESS;
1723
1724 size_t bytes_read = 0;
1725
1726 addr_t load_addr = LLDB_INVALID_ADDRESS;
1727 addr_t file_addr = LLDB_INVALID_ADDRESS;
1728 Address resolved_addr;
1729 if (!addr.IsSectionOffset()) {
1730 SectionLoadList &section_load_list = GetSectionLoadList();
1731 if (section_load_list.IsEmpty()) {
Adrian Prantl05097242018-04-30 16:49:04 +00001732 // No sections are loaded, so we must assume we are not running yet and
1733 // anything we are given is a file address.
Kate Stoneb9c1b512016-09-06 20:57:50 +00001734 file_addr = addr.GetOffset(); // "addr" doesn't have a section, so its
1735 // offset is the file address
1736 m_images.ResolveFileAddress(file_addr, resolved_addr);
1737 } else {
Adrian Prantl05097242018-04-30 16:49:04 +00001738 // We have at least one section loaded. This can be because we have
1739 // manually loaded some sections with "target modules load ..." or
1740 // because we have have a live process that has sections loaded through
1741 // the dynamic loader
Kate Stoneb9c1b512016-09-06 20:57:50 +00001742 load_addr = addr.GetOffset(); // "addr" doesn't have a section, so its
1743 // offset is the load address
1744 section_load_list.ResolveLoadAddress(load_addr, resolved_addr);
1745 }
1746 }
1747 if (!resolved_addr.IsValid())
1748 resolved_addr = addr;
1749
1750 if (prefer_file_cache) {
1751 bytes_read = ReadMemoryFromFileCache(resolved_addr, dst, dst_len, error);
1752 if (bytes_read > 0)
1753 return bytes_read;
1754 }
1755
1756 if (ProcessIsValid()) {
1757 if (load_addr == LLDB_INVALID_ADDRESS)
1758 load_addr = resolved_addr.GetLoadAddress(this);
1759
1760 if (load_addr == LLDB_INVALID_ADDRESS) {
1761 ModuleSP addr_module_sp(resolved_addr.GetModule());
1762 if (addr_module_sp && addr_module_sp->GetFileSpec())
Zachary Turner827d5d72016-12-16 04:27:00 +00001763 error.SetErrorStringWithFormatv(
1764 "{0:F}[{1:x+}] can't be resolved, {0:F} is not currently loaded",
1765 addr_module_sp->GetFileSpec(), resolved_addr.GetFileAddress());
Kate Stoneb9c1b512016-09-06 20:57:50 +00001766 else
1767 error.SetErrorStringWithFormat("0x%" PRIx64 " can't be resolved",
1768 resolved_addr.GetFileAddress());
1769 } else {
1770 bytes_read = m_process_sp->ReadMemory(load_addr, dst, dst_len, error);
1771 if (bytes_read != dst_len) {
1772 if (error.Success()) {
1773 if (bytes_read == 0)
1774 error.SetErrorStringWithFormat(
1775 "read memory from 0x%" PRIx64 " failed", load_addr);
1776 else
1777 error.SetErrorStringWithFormat(
1778 "only %" PRIu64 " of %" PRIu64
1779 " bytes were read from memory at 0x%" PRIx64,
1780 (uint64_t)bytes_read, (uint64_t)dst_len, load_addr);
1781 }
1782 }
1783 if (bytes_read) {
1784 if (load_addr_ptr)
1785 *load_addr_ptr = load_addr;
1786 return bytes_read;
1787 }
Adrian Prantl05097242018-04-30 16:49:04 +00001788 // If the address is not section offset we have an address that doesn't
1789 // resolve to any address in any currently loaded shared libraries and we
1790 // failed to read memory so there isn't anything more we can do. If it is
1791 // section offset, we might be able to read cached memory from the object
1792 // file.
Kate Stoneb9c1b512016-09-06 20:57:50 +00001793 if (!resolved_addr.IsSectionOffset())
1794 return 0;
1795 }
1796 }
1797
1798 if (!prefer_file_cache && resolved_addr.IsSectionOffset()) {
Adrian Prantl05097242018-04-30 16:49:04 +00001799 // If we didn't already try and read from the object file cache, then try
1800 // it after failing to read from the process.
Kate Stoneb9c1b512016-09-06 20:57:50 +00001801 return ReadMemoryFromFileCache(resolved_addr, dst, dst_len, error);
1802 }
1803 return 0;
1804}
1805
1806size_t Target::ReadCStringFromMemory(const Address &addr, std::string &out_str,
Zachary Turner97206d52017-05-12 04:51:55 +00001807 Status &error) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001808 char buf[256];
1809 out_str.clear();
1810 addr_t curr_addr = addr.GetLoadAddress(this);
1811 Address address(addr);
Jonas Devlieghere09ad8c82019-05-24 00:44:33 +00001812 while (true) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001813 size_t length = ReadCStringFromMemory(address, buf, sizeof(buf), error);
1814 if (length == 0)
1815 break;
1816 out_str.append(buf, length);
Adrian Prantl05097242018-04-30 16:49:04 +00001817 // If we got "length - 1" bytes, we didn't get the whole C string, we need
1818 // to read some more characters
Kate Stoneb9c1b512016-09-06 20:57:50 +00001819 if (length == sizeof(buf) - 1)
1820 curr_addr += length;
1821 else
1822 break;
1823 address = Address(curr_addr);
1824 }
1825 return out_str.size();
1826}
1827
1828size_t Target::ReadCStringFromMemory(const Address &addr, char *dst,
Zachary Turner97206d52017-05-12 04:51:55 +00001829 size_t dst_max_len, Status &result_error) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001830 size_t total_cstr_len = 0;
1831 if (dst && dst_max_len) {
1832 result_error.Clear();
1833 // NULL out everything just to be safe
1834 memset(dst, 0, dst_max_len);
Zachary Turner97206d52017-05-12 04:51:55 +00001835 Status error;
Enrico Granata6b4ddc62013-01-21 19:20:50 +00001836 addr_t curr_addr = addr.GetLoadAddress(this);
1837 Address address(addr);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001838
Adrian Prantl05097242018-04-30 16:49:04 +00001839 // We could call m_process_sp->GetMemoryCacheLineSize() but I don't think
1840 // this really needs to be tied to the memory cache subsystem's cache line
1841 // size, so leave this as a fixed constant.
Kate Stoneb9c1b512016-09-06 20:57:50 +00001842 const size_t cache_line_size = 512;
1843
1844 size_t bytes_left = dst_max_len - 1;
1845 char *curr_dst = dst;
1846
1847 while (bytes_left > 0) {
1848 addr_t cache_line_bytes_left =
1849 cache_line_size - (curr_addr % cache_line_size);
1850 addr_t bytes_to_read =
1851 std::min<addr_t>(bytes_left, cache_line_bytes_left);
1852 size_t bytes_read =
1853 ReadMemory(address, false, curr_dst, bytes_to_read, error);
1854
1855 if (bytes_read == 0) {
1856 result_error = error;
1857 dst[total_cstr_len] = '\0';
1858 break;
1859 }
1860 const size_t len = strlen(curr_dst);
1861
1862 total_cstr_len += len;
1863
1864 if (len < bytes_to_read)
1865 break;
1866
1867 curr_dst += bytes_read;
1868 curr_addr += bytes_read;
1869 bytes_left -= bytes_read;
1870 address = Address(curr_addr);
Enrico Granata6b4ddc62013-01-21 19:20:50 +00001871 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001872 } else {
1873 if (dst == nullptr)
1874 result_error.SetErrorString("invalid arguments");
Enrico Granata6b4ddc62013-01-21 19:20:50 +00001875 else
Kate Stoneb9c1b512016-09-06 20:57:50 +00001876 result_error.Clear();
1877 }
1878 return total_cstr_len;
Enrico Granata6b4ddc62013-01-21 19:20:50 +00001879}
1880
Kate Stoneb9c1b512016-09-06 20:57:50 +00001881size_t Target::ReadScalarIntegerFromMemory(const Address &addr,
1882 bool prefer_file_cache,
1883 uint32_t byte_size, bool is_signed,
Zachary Turner97206d52017-05-12 04:51:55 +00001884 Scalar &scalar, Status &error) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001885 uint64_t uval;
1886
1887 if (byte_size <= sizeof(uval)) {
1888 size_t bytes_read =
1889 ReadMemory(addr, prefer_file_cache, &uval, byte_size, error);
1890 if (bytes_read == byte_size) {
Pavel Labath13e37d42017-10-25 21:05:31 +00001891 DataExtractor data(&uval, sizeof(uval), m_arch.GetSpec().GetByteOrder(),
1892 m_arch.GetSpec().GetAddressByteSize());
Kate Stoneb9c1b512016-09-06 20:57:50 +00001893 lldb::offset_t offset = 0;
1894 if (byte_size <= 4)
1895 scalar = data.GetMaxU32(&offset, byte_size);
1896 else
1897 scalar = data.GetMaxU64(&offset, byte_size);
1898
1899 if (is_signed)
1900 scalar.SignExtend(byte_size * 8);
1901 return bytes_read;
1902 }
1903 } else {
1904 error.SetErrorStringWithFormat(
1905 "byte size of %u is too large for integer scalar type", byte_size);
1906 }
1907 return 0;
1908}
1909
1910uint64_t Target::ReadUnsignedIntegerFromMemory(const Address &addr,
1911 bool prefer_file_cache,
1912 size_t integer_byte_size,
1913 uint64_t fail_value,
Zachary Turner97206d52017-05-12 04:51:55 +00001914 Status &error) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001915 Scalar scalar;
1916 if (ReadScalarIntegerFromMemory(addr, prefer_file_cache, integer_byte_size,
1917 false, scalar, error))
1918 return scalar.ULongLong(fail_value);
1919 return fail_value;
1920}
1921
1922bool Target::ReadPointerFromMemory(const Address &addr, bool prefer_file_cache,
Zachary Turner97206d52017-05-12 04:51:55 +00001923 Status &error, Address &pointer_addr) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001924 Scalar scalar;
1925 if (ReadScalarIntegerFromMemory(addr, prefer_file_cache,
Jonas Devlieghered3607752019-07-19 00:56:26 +00001926 m_arch.GetSpec().GetAddressByteSize(), false,
1927 scalar, error)) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001928 addr_t pointer_vm_addr = scalar.ULongLong(LLDB_INVALID_ADDRESS);
1929 if (pointer_vm_addr != LLDB_INVALID_ADDRESS) {
1930 SectionLoadList &section_load_list = GetSectionLoadList();
1931 if (section_load_list.IsEmpty()) {
Adrian Prantl05097242018-04-30 16:49:04 +00001932 // No sections are loaded, so we must assume we are not running yet and
1933 // anything we are given is a file address.
Kate Stoneb9c1b512016-09-06 20:57:50 +00001934 m_images.ResolveFileAddress(pointer_vm_addr, pointer_addr);
1935 } else {
Adrian Prantl05097242018-04-30 16:49:04 +00001936 // We have at least one section loaded. This can be because we have
1937 // manually loaded some sections with "target modules load ..." or
1938 // because we have have a live process that has sections loaded through
1939 // the dynamic loader
Kate Stoneb9c1b512016-09-06 20:57:50 +00001940 section_load_list.ResolveLoadAddress(pointer_vm_addr, pointer_addr);
1941 }
Adrian Prantl05097242018-04-30 16:49:04 +00001942 // We weren't able to resolve the pointer value, so just return an
1943 // address with no section
Kate Stoneb9c1b512016-09-06 20:57:50 +00001944 if (!pointer_addr.IsValid())
1945 pointer_addr.SetOffset(pointer_vm_addr);
1946 return true;
1947 }
1948 }
1949 return false;
1950}
1951
Jason Molenda1724a172019-04-08 23:03:02 +00001952ModuleSP Target::GetOrCreateModule(const ModuleSpec &module_spec, bool notify,
1953 Status *error_ptr) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001954 ModuleSP module_sp;
1955
Zachary Turner97206d52017-05-12 04:51:55 +00001956 Status error;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001957
1958 // First see if we already have this module in our module list. If we do,
Adrian Prantl05097242018-04-30 16:49:04 +00001959 // then we're done, we don't need to consult the shared modules list. But
1960 // only do this if we are passed a UUID.
Kate Stoneb9c1b512016-09-06 20:57:50 +00001961
1962 if (module_spec.GetUUID().IsValid())
1963 module_sp = m_images.FindFirstModule(module_spec);
1964
1965 if (!module_sp) {
1966 ModuleSP old_module_sp; // This will get filled in if we have a new version
1967 // of the library
1968 bool did_create_module = false;
Frederic Rissacbf0052019-04-23 20:17:04 +00001969 FileSpecList search_paths = GetExecutableSearchPaths();
Kate Stoneb9c1b512016-09-06 20:57:50 +00001970 // If there are image search path entries, try to use them first to acquire
1971 // a suitable image.
1972 if (m_image_search_paths.GetSize()) {
1973 ModuleSpec transformed_spec(module_spec);
1974 if (m_image_search_paths.RemapPath(
1975 module_spec.GetFileSpec().GetDirectory(),
1976 transformed_spec.GetFileSpec().GetDirectory())) {
1977 transformed_spec.GetFileSpec().GetFilename() =
1978 module_spec.GetFileSpec().GetFilename();
1979 error = ModuleList::GetSharedModule(transformed_spec, module_sp,
Jonas Devlieghered3607752019-07-19 00:56:26 +00001980 &search_paths, &old_module_sp,
1981 &did_create_module);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001982 }
1983 }
1984
1985 if (!module_sp) {
1986 // If we have a UUID, we can check our global shared module list in case
1987 // we already have it. If we don't have a valid UUID, then we can't since
1988 // the path in "module_spec" will be a platform path, and we will need to
1989 // let the platform find that file. For example, we could be asking for
1990 // "/usr/lib/dyld" and if we do not have a UUID, we don't want to pick
1991 // the local copy of "/usr/lib/dyld" since our platform could be a remote
1992 // platform that has its own "/usr/lib/dyld" in an SDK or in a local file
1993 // cache.
1994 if (module_spec.GetUUID().IsValid()) {
1995 // We have a UUID, it is OK to check the global module list...
Jonas Devlieghered3607752019-07-19 00:56:26 +00001996 error =
1997 ModuleList::GetSharedModule(module_spec, module_sp, &search_paths,
1998 &old_module_sp, &did_create_module);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001999 }
2000
2001 if (!module_sp) {
2002 // The platform is responsible for finding and caching an appropriate
2003 // module in the shared module cache.
2004 if (m_platform_sp) {
2005 error = m_platform_sp->GetSharedModule(
Jonas Devlieghered3607752019-07-19 00:56:26 +00002006 module_spec, m_process_sp.get(), module_sp, &search_paths,
2007 &old_module_sp, &did_create_module);
Kate Stoneb9c1b512016-09-06 20:57:50 +00002008 } else {
2009 error.SetErrorString("no platform is currently set");
Greg Claytond16e1e52011-07-12 17:06:17 +00002010 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00002011 }
Greg Claytond16e1e52011-07-12 17:06:17 +00002012 }
Greg Claytond16e1e52011-07-12 17:06:17 +00002013
Kate Stoneb9c1b512016-09-06 20:57:50 +00002014 // We found a module that wasn't in our target list. Let's make sure that
Adrian Prantl05097242018-04-30 16:49:04 +00002015 // there wasn't an equivalent module in the list already, and if there was,
2016 // let's remove it.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002017 if (module_sp) {
2018 ObjectFile *objfile = module_sp->GetObjectFile();
2019 if (objfile) {
2020 switch (objfile->GetType()) {
2021 case ObjectFile::eTypeCoreFile: /// A core file that has a checkpoint of
2022 /// a program's execution state
2023 case ObjectFile::eTypeExecutable: /// A normal executable
2024 case ObjectFile::eTypeDynamicLinker: /// The platform's dynamic linker
2025 /// executable
2026 case ObjectFile::eTypeObjectFile: /// An intermediate object file
2027 case ObjectFile::eTypeSharedLibrary: /// A shared library that can be
2028 /// used during execution
2029 break;
2030 case ObjectFile::eTypeDebugInfo: /// An object file that contains only
2031 /// debug information
2032 if (error_ptr)
2033 error_ptr->SetErrorString("debug info files aren't valid target "
2034 "modules, please specify an executable");
2035 return ModuleSP();
2036 case ObjectFile::eTypeStubLibrary: /// A library that can be linked
2037 /// against but not used for
2038 /// execution
2039 if (error_ptr)
2040 error_ptr->SetErrorString("stub libraries aren't valid target "
2041 "modules, please specify an executable");
2042 return ModuleSP();
2043 default:
2044 if (error_ptr)
2045 error_ptr->SetErrorString(
2046 "unsupported file type, please specify an executable");
2047 return ModuleSP();
Greg Claytond16e1e52011-07-12 17:06:17 +00002048 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00002049 // GetSharedModule is not guaranteed to find the old shared module, for
Adrian Prantl05097242018-04-30 16:49:04 +00002050 // instance in the common case where you pass in the UUID, it is only
2051 // going to find the one module matching the UUID. In fact, it has no
2052 // good way to know what the "old module" relevant to this target is,
2053 // since there might be many copies of a module with this file spec in
2054 // various running debug sessions, but only one of them will belong to
2055 // this target. So let's remove the UUID from the module list, and look
2056 // in the target's module list. Only do this if there is SOMETHING else
2057 // in the module spec...
Kate Stoneb9c1b512016-09-06 20:57:50 +00002058 if (!old_module_sp) {
2059 if (module_spec.GetUUID().IsValid() &&
2060 !module_spec.GetFileSpec().GetFilename().IsEmpty() &&
2061 !module_spec.GetFileSpec().GetDirectory().IsEmpty()) {
2062 ModuleSpec module_spec_copy(module_spec.GetFileSpec());
2063 module_spec_copy.GetUUID().Clear();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002064
Kate Stoneb9c1b512016-09-06 20:57:50 +00002065 ModuleList found_modules;
2066 size_t num_found =
2067 m_images.FindModules(module_spec_copy, found_modules);
2068 if (num_found == 1) {
2069 old_module_sp = found_modules.GetModuleAtIndex(0);
Jim Ingham4a94c912012-05-17 18:38:42 +00002070 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00002071 }
Greg Claytonb69bb2e2012-04-27 00:58:27 +00002072 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002073
Jim Ingham7fca8c02017-04-28 00:51:06 +00002074 // Preload symbols outside of any lock, so hopefully we can do this for
2075 // each library in parallel.
2076 if (GetPreloadSymbols())
2077 module_sp->PreloadSymbols();
2078
Jonas Devlieghered3607752019-07-19 00:56:26 +00002079 if (old_module_sp && m_images.GetIndexForModule(old_module_sp.get()) !=
2080 LLDB_INVALID_INDEX32) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002081 m_images.ReplaceModule(old_module_sp, module_sp);
2082 Module *old_module_ptr = old_module_sp.get();
2083 old_module_sp.reset();
2084 ModuleList::RemoveSharedModuleIfOrphaned(old_module_ptr);
Jason Molenda1724a172019-04-08 23:03:02 +00002085 } else {
2086 m_images.Append(module_sp, notify);
2087 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00002088 } else
2089 module_sp.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002090 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00002091 }
2092 if (error_ptr)
2093 *error_ptr = error;
2094 return module_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002095}
2096
Kate Stoneb9c1b512016-09-06 20:57:50 +00002097TargetSP Target::CalculateTarget() { return shared_from_this(); }
2098
2099ProcessSP Target::CalculateProcess() { return m_process_sp; }
2100
2101ThreadSP Target::CalculateThread() { return ThreadSP(); }
2102
2103StackFrameSP Target::CalculateStackFrame() { return StackFrameSP(); }
2104
2105void Target::CalculateExecutionContext(ExecutionContext &exe_ctx) {
2106 exe_ctx.Clear();
2107 exe_ctx.SetTargetPtr(this);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002108}
2109
Kate Stoneb9c1b512016-09-06 20:57:50 +00002110PathMappingList &Target::GetImageSearchPathList() {
2111 return m_image_search_paths;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002112}
2113
Kate Stoneb9c1b512016-09-06 20:57:50 +00002114void Target::ImageSearchPathsChanged(const PathMappingList &path_list,
2115 void *baton) {
2116 Target *target = (Target *)baton;
2117 ModuleSP exe_module_sp(target->GetExecutableModule());
2118 if (exe_module_sp)
Jonas Devliegheref9a07e92018-09-20 09:09:05 +00002119 target->SetExecutableModule(exe_module_sp, eLoadDependentsYes);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002120}
2121
Alex Langford0e252e32019-07-30 22:12:34 +00002122llvm::Expected<TypeSystem &>
2123Target::GetScratchTypeSystemForLanguage(lldb::LanguageType language,
2124 bool create_on_demand) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002125 if (!m_valid)
Alex Langford0e252e32019-07-30 22:12:34 +00002126 return llvm::make_error<llvm::StringError>("Invalid Target",
2127 llvm::inconvertibleErrorCode());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002128
Kate Stoneb9c1b512016-09-06 20:57:50 +00002129 if (language == eLanguageTypeMipsAssembler // GNU AS and LLVM use it for all
2130 // assembly code
2131 || language == eLanguageTypeUnknown) {
2132 std::set<lldb::LanguageType> languages_for_types;
2133 std::set<lldb::LanguageType> languages_for_expressions;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002134
Kate Stoneb9c1b512016-09-06 20:57:50 +00002135 Language::GetLanguagesSupportingTypeSystems(languages_for_types,
2136 languages_for_expressions);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002137
Kate Stoneb9c1b512016-09-06 20:57:50 +00002138 if (languages_for_expressions.count(eLanguageTypeC)) {
2139 language = eLanguageTypeC; // LLDB's default. Override by setting the
2140 // target language.
2141 } else {
2142 if (languages_for_expressions.empty()) {
Alex Langford0e252e32019-07-30 22:12:34 +00002143 return llvm::make_error<llvm::StringError>(
2144 "No expression support for any languages",
2145 llvm::inconvertibleErrorCode());
Kate Stoneb9c1b512016-09-06 20:57:50 +00002146 } else {
2147 language = *languages_for_expressions.begin();
2148 }
Sean Callanana994b0b2015-10-02 18:40:30 +00002149 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00002150 }
Sean Callananb92bd752015-10-01 16:28:02 +00002151
Kate Stoneb9c1b512016-09-06 20:57:50 +00002152 return m_scratch_type_system_map.GetTypeSystemForLanguage(language, this,
2153 create_on_demand);
Sean Callananb92bd752015-10-01 16:28:02 +00002154}
2155
Alex Langford70402bf2019-07-31 20:47:38 +00002156std::vector<TypeSystem *> Target::GetScratchTypeSystems(bool create_on_demand) {
2157 if (!m_valid)
2158 return {};
2159
2160 std::vector<TypeSystem *> scratch_type_systems;
2161
2162 std::set<lldb::LanguageType> languages_for_types;
2163 std::set<lldb::LanguageType> languages_for_expressions;
2164
2165 Language::GetLanguagesSupportingTypeSystems(languages_for_types,
2166 languages_for_expressions);
2167
2168 for (auto lang : languages_for_expressions) {
2169 auto type_system_or_err =
2170 GetScratchTypeSystemForLanguage(lang, create_on_demand);
2171 if (!type_system_or_err)
2172 LLDB_LOG_ERROR(lldb_private::GetLogIfAnyCategoriesSet(LIBLLDB_LOG_TARGET),
2173 type_system_or_err.takeError(),
2174 "Language '{}' has expression support but no scratch type "
2175 "system available",
2176 Language::GetNameForLanguageType(lang));
2177 else
2178 scratch_type_systems.emplace_back(&type_system_or_err.get());
2179 }
2180
2181 return scratch_type_systems;
2182}
2183
Sean Callananb92bd752015-10-01 16:28:02 +00002184PersistentExpressionState *
Kate Stoneb9c1b512016-09-06 20:57:50 +00002185Target::GetPersistentExpressionStateForLanguage(lldb::LanguageType language) {
Alex Langford0e252e32019-07-30 22:12:34 +00002186 auto type_system_or_err = GetScratchTypeSystemForLanguage(language, true);
Kate Stoneb9c1b512016-09-06 20:57:50 +00002187
Alex Langford0e252e32019-07-30 22:12:34 +00002188 if (auto err = type_system_or_err.takeError()) {
2189 LLDB_LOG_ERROR(lldb_private::GetLogIfAnyCategoriesSet(LIBLLDB_LOG_TARGET),
2190 std::move(err),
2191 "Unable to get persistent expression state for language {}",
2192 Language::GetNameForLanguageType(language));
Kate Stoneb9c1b512016-09-06 20:57:50 +00002193 return nullptr;
2194 }
Alex Langford0e252e32019-07-30 22:12:34 +00002195
2196 return type_system_or_err->GetPersistentExpressionState();
Jim Ingham151c0322015-09-15 21:13:50 +00002197}
2198
Kate Stoneb9c1b512016-09-06 20:57:50 +00002199UserExpression *Target::GetUserExpressionForLanguage(
Zachary Turnerc5d7df92016-11-08 04:52:16 +00002200 llvm::StringRef expr, llvm::StringRef prefix, lldb::LanguageType language,
Kate Stoneb9c1b512016-09-06 20:57:50 +00002201 Expression::ResultType desired_type,
Jonas Devlieghered3607752019-07-19 00:56:26 +00002202 const EvaluateExpressionOptions &options, ValueObject *ctx_obj,
2203 Status &error) {
Alex Langford0e252e32019-07-30 22:12:34 +00002204 auto type_system_or_err = GetScratchTypeSystemForLanguage(language);
2205 if (auto err = type_system_or_err.takeError()) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002206 error.SetErrorStringWithFormat(
2207 "Could not find type system for language %s: %s",
2208 Language::GetNameForLanguageType(language),
Alex Langford0e252e32019-07-30 22:12:34 +00002209 llvm::toString(std::move(err)).c_str());
Kate Stoneb9c1b512016-09-06 20:57:50 +00002210 return nullptr;
2211 }
2212
Alex Langford0e252e32019-07-30 22:12:34 +00002213 auto *user_expr = type_system_or_err->GetUserExpression(
2214 expr, prefix, language, desired_type, options, ctx_obj);
Kate Stoneb9c1b512016-09-06 20:57:50 +00002215 if (!user_expr)
2216 error.SetErrorStringWithFormat(
2217 "Could not create an expression for language %s",
2218 Language::GetNameForLanguageType(language));
2219
2220 return user_expr;
Jim Ingham151c0322015-09-15 21:13:50 +00002221}
2222
Kate Stoneb9c1b512016-09-06 20:57:50 +00002223FunctionCaller *Target::GetFunctionCallerForLanguage(
2224 lldb::LanguageType language, const CompilerType &return_type,
2225 const Address &function_address, const ValueList &arg_value_list,
Zachary Turner97206d52017-05-12 04:51:55 +00002226 const char *name, Status &error) {
Alex Langford0e252e32019-07-30 22:12:34 +00002227 auto type_system_or_err = GetScratchTypeSystemForLanguage(language);
2228 if (auto err = type_system_or_err.takeError()) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002229 error.SetErrorStringWithFormat(
2230 "Could not find type system for language %s: %s",
2231 Language::GetNameForLanguageType(language),
Alex Langford0e252e32019-07-30 22:12:34 +00002232 llvm::toString(std::move(err)).c_str());
2233 return nullptr;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002234 }
2235
Alex Langford0e252e32019-07-30 22:12:34 +00002236 auto *persistent_fn = type_system_or_err->GetFunctionCaller(
2237 return_type, function_address, arg_value_list, name);
Kate Stoneb9c1b512016-09-06 20:57:50 +00002238 if (!persistent_fn)
2239 error.SetErrorStringWithFormat(
2240 "Could not create an expression for language %s",
2241 Language::GetNameForLanguageType(language));
2242
2243 return persistent_fn;
Jim Ingham151c0322015-09-15 21:13:50 +00002244}
2245
2246UtilityFunction *
Kate Stoneb9c1b512016-09-06 20:57:50 +00002247Target::GetUtilityFunctionForLanguage(const char *text,
2248 lldb::LanguageType language,
Zachary Turner97206d52017-05-12 04:51:55 +00002249 const char *name, Status &error) {
Alex Langford0e252e32019-07-30 22:12:34 +00002250 auto type_system_or_err = GetScratchTypeSystemForLanguage(language);
Kate Stoneb9c1b512016-09-06 20:57:50 +00002251
Alex Langford0e252e32019-07-30 22:12:34 +00002252 if (auto err = type_system_or_err.takeError()) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002253 error.SetErrorStringWithFormat(
2254 "Could not find type system for language %s: %s",
2255 Language::GetNameForLanguageType(language),
Alex Langford0e252e32019-07-30 22:12:34 +00002256 llvm::toString(std::move(err)).c_str());
2257 return nullptr;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002258 }
2259
Alex Langford0e252e32019-07-30 22:12:34 +00002260 auto *utility_fn = type_system_or_err->GetUtilityFunction(text, name);
Kate Stoneb9c1b512016-09-06 20:57:50 +00002261 if (!utility_fn)
2262 error.SetErrorStringWithFormat(
2263 "Could not create an expression for language %s",
2264 Language::GetNameForLanguageType(language));
2265
2266 return utility_fn;
Jim Ingham151c0322015-09-15 21:13:50 +00002267}
2268
Kate Stoneb9c1b512016-09-06 20:57:50 +00002269ClangASTContext *Target::GetScratchClangASTContext(bool create_on_demand) {
Alex Langford0e252e32019-07-30 22:12:34 +00002270 if (!m_valid)
2271 return nullptr;
2272
2273 auto type_system_or_err =
2274 GetScratchTypeSystemForLanguage(eLanguageTypeC, create_on_demand);
2275 if (auto err = type_system_or_err.takeError()) {
2276 LLDB_LOG_ERROR(lldb_private::GetLogIfAnyCategoriesSet(LIBLLDB_LOG_TARGET),
2277 std::move(err), "Couldn't get scratch ClangASTContext");
2278 return nullptr;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002279 }
Alex Langford0e252e32019-07-30 22:12:34 +00002280 return llvm::dyn_cast<ClangASTContext>(&type_system_or_err.get());
Kate Stoneb9c1b512016-09-06 20:57:50 +00002281}
2282
2283ClangASTImporterSP Target::GetClangASTImporter() {
2284 if (m_valid) {
2285 if (!m_ast_importer_sp) {
Jonas Devlieghere796ac802019-02-11 23:13:08 +00002286 m_ast_importer_sp = std::make_shared<ClangASTImporter>();
Sean Callanan4bf80d52011-11-15 22:27:19 +00002287 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00002288 return m_ast_importer_sp;
2289 }
2290 return ClangASTImporterSP();
Sean Callananb92bd752015-10-01 16:28:02 +00002291}
2292
Kate Stoneb9c1b512016-09-06 20:57:50 +00002293void Target::SettingsInitialize() { Process::SettingsInitialize(); }
2294
2295void Target::SettingsTerminate() { Process::SettingsTerminate(); }
2296
2297FileSpecList Target::GetDefaultExecutableSearchPaths() {
2298 TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
2299 if (properties_sp)
2300 return properties_sp->GetExecutableSearchPaths();
2301 return FileSpecList();
Sean Callanan686b2312011-11-16 18:20:47 +00002302}
2303
Kate Stoneb9c1b512016-09-06 20:57:50 +00002304FileSpecList Target::GetDefaultDebugFileSearchPaths() {
2305 TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
2306 if (properties_sp)
2307 return properties_sp->GetDebugFileSearchPaths();
2308 return FileSpecList();
Greg Clayton99d0faf2010-11-18 23:32:35 +00002309}
Caroline Ticedaccaa92010-09-20 20:44:43 +00002310
Kate Stoneb9c1b512016-09-06 20:57:50 +00002311ArchSpec Target::GetDefaultArchitecture() {
2312 TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
2313 if (properties_sp)
2314 return properties_sp->GetDefaultArchitecture();
2315 return ArchSpec();
Greg Claytonc859e2d2012-02-13 23:10:39 +00002316}
2317
Kate Stoneb9c1b512016-09-06 20:57:50 +00002318void Target::SetDefaultArchitecture(const ArchSpec &arch) {
2319 TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
2320 if (properties_sp) {
Jonas Devlieghereb2a9cf72019-07-22 23:48:01 +00002321 LLDB_LOG(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_TARGET),
2322 "Target::SetDefaultArchitecture setting target's "
Jonas Devlieghereeaedc5e2019-07-23 17:03:37 +00002323 "default architecture to {0} ({1})",
2324 arch.GetArchitectureName(), arch.GetTriple().getTriple());
Kate Stoneb9c1b512016-09-06 20:57:50 +00002325 return properties_sp->SetDefaultArchitecture(arch);
2326 }
Michael Sartaina7499c92013-07-01 19:45:50 +00002327}
2328
Kate Stoneb9c1b512016-09-06 20:57:50 +00002329Target *Target::GetTargetFromContexts(const ExecutionContext *exe_ctx_ptr,
2330 const SymbolContext *sc_ptr) {
2331 // The target can either exist in the "process" of ExecutionContext, or in
2332 // the "target_sp" member of SymbolContext. This accessor helper function
2333 // will get the target from one of these locations.
2334
2335 Target *target = nullptr;
2336 if (sc_ptr != nullptr)
2337 target = sc_ptr->target_sp.get();
2338 if (target == nullptr && exe_ctx_ptr)
2339 target = exe_ctx_ptr->GetTargetPtr();
2340 return target;
Sean Callanan85054342015-04-03 15:39:47 +00002341}
2342
Kate Stoneb9c1b512016-09-06 20:57:50 +00002343ExpressionResults Target::EvaluateExpression(
Zachary Turnerc5d7df92016-11-08 04:52:16 +00002344 llvm::StringRef expr, ExecutionContextScope *exe_scope,
Kate Stoneb9c1b512016-09-06 20:57:50 +00002345 lldb::ValueObjectSP &result_valobj_sp,
Aleksandr Urakov40624a02019-02-05 09:14:36 +00002346 const EvaluateExpressionOptions &options, std::string *fixed_expression,
2347 ValueObject *ctx_obj) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002348 result_valobj_sp.reset();
Caroline Ticedaccaa92010-09-20 20:44:43 +00002349
Kate Stoneb9c1b512016-09-06 20:57:50 +00002350 ExpressionResults execution_results = eExpressionSetupError;
Caroline Ticedaccaa92010-09-20 20:44:43 +00002351
Zachary Turnerc5d7df92016-11-08 04:52:16 +00002352 if (expr.empty())
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00002353 return execution_results;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002354
Tatyana Krasnukhaf62e23d2019-06-10 21:13:37 +00002355 // We shouldn't run stop hooks in expressions.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002356 bool old_suppress_value = m_suppress_stop_hooks;
2357 m_suppress_stop_hooks = true;
Tatyana Krasnukhaf62e23d2019-06-10 21:13:37 +00002358 auto on_exit = llvm::make_scope_exit([this, old_suppress_value]() {
Jonas Devlieghered3607752019-07-19 00:56:26 +00002359 m_suppress_stop_hooks = old_suppress_value;
2360 });
Kate Stoneb9c1b512016-09-06 20:57:50 +00002361
2362 ExecutionContext exe_ctx;
2363
2364 if (exe_scope) {
2365 exe_scope->CalculateExecutionContext(exe_ctx);
2366 } else if (m_process_sp) {
2367 m_process_sp->CalculateExecutionContext(exe_ctx);
2368 } else {
2369 CalculateExecutionContext(exe_ctx);
2370 }
2371
Adrian Prantl05097242018-04-30 16:49:04 +00002372 // Make sure we aren't just trying to see the value of a persistent variable
2373 // (something like "$0")
Kate Stoneb9c1b512016-09-06 20:57:50 +00002374 // Only check for persistent variables the expression starts with a '$'
Alex Langford0e252e32019-07-30 22:12:34 +00002375 lldb::ExpressionVariableSP persistent_var_sp;
2376 if (expr[0] == '$') {
2377 auto type_system_or_err =
2378 GetScratchTypeSystemForLanguage(eLanguageTypeC);
2379 if (auto err = type_system_or_err.takeError()) {
2380 LLDB_LOG_ERROR(lldb_private::GetLogIfAnyCategoriesSet(LIBLLDB_LOG_TARGET),
2381 std::move(err), "Unable to get scratch type system");
2382 } else {
2383 persistent_var_sp =
2384 type_system_or_err->GetPersistentExpressionState()->GetVariable(expr);
2385 }
2386 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00002387 if (persistent_var_sp) {
2388 result_valobj_sp = persistent_var_sp->GetValueObject();
2389 execution_results = eExpressionCompleted;
2390 } else {
Pavel Labath50251fc2017-12-21 10:54:30 +00002391 llvm::StringRef prefix = GetExpressionPrefixContents();
Zachary Turner97206d52017-05-12 04:51:55 +00002392 Status error;
Alex Langford81dbc022019-03-05 03:33:34 +00002393 execution_results =
2394 UserExpression::Evaluate(exe_ctx, options, expr, prefix,
2395 result_valobj_sp, error, fixed_expression,
2396 nullptr, // Module
2397 ctx_obj);
Kate Stoneb9c1b512016-09-06 20:57:50 +00002398 }
2399
Kate Stoneb9c1b512016-09-06 20:57:50 +00002400 return execution_results;
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00002401}
2402
Jonas Devlieghered3607752019-07-19 00:56:26 +00002403lldb::ExpressionVariableSP Target::GetPersistentVariable(ConstString name) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002404 lldb::ExpressionVariableSP variable_sp;
2405 m_scratch_type_system_map.ForEach(
Zachary Turner3bc714b2017-03-02 00:05:25 +00002406 [name, &variable_sp](TypeSystem *type_system) -> bool {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002407 if (PersistentExpressionState *persistent_state =
2408 type_system->GetPersistentExpressionState()) {
2409 variable_sp = persistent_state->GetVariable(name);
Greg Clayton5beec212015-10-08 21:04:34 +00002410
Kate Stoneb9c1b512016-09-06 20:57:50 +00002411 if (variable_sp)
2412 return false; // Stop iterating the ForEach
Sean Callanan8f1f9a12015-09-30 19:57:57 +00002413 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00002414 return true; // Keep iterating the ForEach
2415 });
2416 return variable_sp;
Zachary Turner32abc6e2015-03-03 19:23:09 +00002417}
2418
Adrian Prantl0e4c4822019-03-06 21:22:25 +00002419lldb::addr_t Target::GetPersistentSymbol(ConstString name) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002420 lldb::addr_t address = LLDB_INVALID_ADDRESS;
2421
2422 m_scratch_type_system_map.ForEach(
Zachary Turner3bc714b2017-03-02 00:05:25 +00002423 [name, &address](TypeSystem *type_system) -> bool {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002424 if (PersistentExpressionState *persistent_state =
2425 type_system->GetPersistentExpressionState()) {
2426 address = persistent_state->LookupSymbol(name);
2427 if (address != LLDB_INVALID_ADDRESS)
2428 return false; // Stop iterating the ForEach
Sean Callananb92bd752015-10-01 16:28:02 +00002429 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00002430 return true; // Keep iterating the ForEach
2431 });
2432 return address;
Sean Callananb92bd752015-10-01 16:28:02 +00002433}
2434
Jonas Devlieghere0288c262019-07-19 00:52:08 +00002435llvm::Expected<lldb_private::Address> Target::GetEntryPointAddress() {
Jason Molenda956761a2019-07-18 20:55:24 +00002436 Module *exe_module = GetExecutableModulePointer();
Jonas Devlieghere0288c262019-07-19 00:52:08 +00002437 llvm::Error error = llvm::Error::success();
2438 assert(!error); // Check the success value when assertions are enabled.
Jason Molenda956761a2019-07-18 20:55:24 +00002439
2440 if (!exe_module || !exe_module->GetObjectFile()) {
Jonas Devlieghere0288c262019-07-19 00:52:08 +00002441 error = llvm::make_error<llvm::StringError>("No primary executable found",
2442 llvm::inconvertibleErrorCode());
Jason Molenda956761a2019-07-18 20:55:24 +00002443 } else {
Jonas Devlieghere0288c262019-07-19 00:52:08 +00002444 Address entry_addr = exe_module->GetObjectFile()->GetEntryPointAddress();
2445 if (entry_addr.IsValid())
2446 return entry_addr;
2447
2448 error = llvm::make_error<llvm::StringError>(
2449 "Could not find entry point address for executable module \"" +
2450 exe_module->GetFileSpec().GetFilename().GetStringRef() + "\"",
2451 llvm::inconvertibleErrorCode());
Jason Molenda956761a2019-07-18 20:55:24 +00002452 }
2453
Jonas Devlieghered3607752019-07-19 00:56:26 +00002454 const ModuleList &modules = GetImages();
2455 const size_t num_images = modules.GetSize();
2456 for (size_t idx = 0; idx < num_images; ++idx) {
2457 ModuleSP module_sp(modules.GetModuleAtIndex(idx));
2458 if (!module_sp || !module_sp->GetObjectFile())
2459 continue;
Jonas Devlieghere0288c262019-07-19 00:52:08 +00002460
Jonas Devlieghered3607752019-07-19 00:56:26 +00002461 Address entry_addr = module_sp->GetObjectFile()->GetEntryPointAddress();
2462 if (entry_addr.IsValid()) {
2463 // Discard the error.
2464 llvm::consumeError(std::move(error));
2465 return entry_addr;
Jason Molenda956761a2019-07-18 20:55:24 +00002466 }
2467 }
2468
Jonas Devlieghere0288c262019-07-19 00:52:08 +00002469 return std::move(error);
Jason Molenda956761a2019-07-18 20:55:24 +00002470}
2471
Kate Stoneb9c1b512016-09-06 20:57:50 +00002472lldb::addr_t Target::GetCallableLoadAddress(lldb::addr_t load_addr,
2473 AddressClass addr_class) const {
Tatyana Krasnukha7aa9e7b2018-09-21 18:56:44 +00002474 auto arch_plugin = GetArchitecturePlugin();
Jonas Devlieghered3607752019-07-19 00:56:26 +00002475 return arch_plugin
2476 ? arch_plugin->GetCallableLoadAddress(load_addr, addr_class)
2477 : load_addr;
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002478}
2479
Kate Stoneb9c1b512016-09-06 20:57:50 +00002480lldb::addr_t Target::GetOpcodeLoadAddress(lldb::addr_t load_addr,
2481 AddressClass addr_class) const {
Tatyana Krasnukha7aa9e7b2018-09-21 18:56:44 +00002482 auto arch_plugin = GetArchitecturePlugin();
Jonas Devlieghered3607752019-07-19 00:56:26 +00002483 return arch_plugin ? arch_plugin->GetOpcodeLoadAddress(load_addr, addr_class)
2484 : load_addr;
Bhushan D. Attarde7f3daed2015-08-26 06:04:54 +00002485}
2486
Kate Stoneb9c1b512016-09-06 20:57:50 +00002487lldb::addr_t Target::GetBreakableLoadAddress(lldb::addr_t addr) {
Tatyana Krasnukha7aa9e7b2018-09-21 18:56:44 +00002488 auto arch_plugin = GetArchitecturePlugin();
Jonas Devlieghered3607752019-07-19 00:56:26 +00002489 return arch_plugin ? arch_plugin->GetBreakableLoadAddress(addr, *this) : addr;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002490}
2491
2492SourceManager &Target::GetSourceManager() {
Jonas Devlieghered5b44032019-02-13 06:25:41 +00002493 if (!m_source_manager_up)
2494 m_source_manager_up.reset(new SourceManager(shared_from_this()));
2495 return *m_source_manager_up;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002496}
2497
2498ClangModulesDeclVendor *Target::GetClangModulesDeclVendor() {
2499 static std::mutex s_clang_modules_decl_vendor_mutex; // If this is contended
2500 // we can make it
2501 // per-target
2502
2503 {
2504 std::lock_guard<std::mutex> guard(s_clang_modules_decl_vendor_mutex);
2505
Jonas Devlieghered5b44032019-02-13 06:25:41 +00002506 if (!m_clang_modules_decl_vendor_up) {
2507 m_clang_modules_decl_vendor_up.reset(
Kate Stoneb9c1b512016-09-06 20:57:50 +00002508 ClangModulesDeclVendor::Create(*this));
2509 }
2510 }
2511
Jonas Devlieghered5b44032019-02-13 06:25:41 +00002512 return m_clang_modules_decl_vendor_up.get();
Kate Stoneb9c1b512016-09-06 20:57:50 +00002513}
2514
2515Target::StopHookSP Target::CreateStopHook() {
2516 lldb::user_id_t new_uid = ++m_stop_hook_next_id;
2517 Target::StopHookSP stop_hook_sp(new StopHook(shared_from_this(), new_uid));
2518 m_stop_hooks[new_uid] = stop_hook_sp;
2519 return stop_hook_sp;
2520}
2521
2522bool Target::RemoveStopHookByID(lldb::user_id_t user_id) {
2523 size_t num_removed = m_stop_hooks.erase(user_id);
2524 return (num_removed != 0);
2525}
2526
2527void Target::RemoveAllStopHooks() { m_stop_hooks.clear(); }
2528
2529Target::StopHookSP Target::GetStopHookByID(lldb::user_id_t user_id) {
2530 StopHookSP found_hook;
2531
2532 StopHookCollection::iterator specified_hook_iter;
2533 specified_hook_iter = m_stop_hooks.find(user_id);
2534 if (specified_hook_iter != m_stop_hooks.end())
2535 found_hook = (*specified_hook_iter).second;
2536 return found_hook;
2537}
2538
2539bool Target::SetStopHookActiveStateByID(lldb::user_id_t user_id,
2540 bool active_state) {
2541 StopHookCollection::iterator specified_hook_iter;
2542 specified_hook_iter = m_stop_hooks.find(user_id);
2543 if (specified_hook_iter == m_stop_hooks.end())
2544 return false;
2545
2546 (*specified_hook_iter).second->SetIsActive(active_state);
2547 return true;
2548}
2549
2550void Target::SetAllStopHooksActiveState(bool active_state) {
2551 StopHookCollection::iterator pos, end = m_stop_hooks.end();
2552 for (pos = m_stop_hooks.begin(); pos != end; pos++) {
2553 (*pos).second->SetIsActive(active_state);
2554 }
2555}
2556
2557void Target::RunStopHooks() {
2558 if (m_suppress_stop_hooks)
2559 return;
2560
2561 if (!m_process_sp)
2562 return;
Jonas Devlieghered3607752019-07-19 00:56:26 +00002563
Jim Ingham45816d62017-12-05 02:34:05 +00002564 // Somebody might have restarted the process:
2565 if (m_process_sp->GetState() != eStateStopped)
2566 return;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002567
2568 // <rdar://problem/12027563> make sure we check that we are not stopped
Adrian Prantl05097242018-04-30 16:49:04 +00002569 // because of us running a user expression since in that case we do not want
2570 // to run the stop-hooks
Kate Stoneb9c1b512016-09-06 20:57:50 +00002571 if (m_process_sp->GetModIDRef().IsLastResumeForUserExpression())
2572 return;
2573
2574 if (m_stop_hooks.empty())
2575 return;
2576
2577 StopHookCollection::iterator pos, end = m_stop_hooks.end();
2578
Jim Ingham3139fc92019-03-01 18:13:38 +00002579 // If there aren't any active stop hooks, don't bother either.
2580 // Also see if any of the active hooks want to auto-continue.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002581 bool any_active_hooks = false;
Jim Ingham3139fc92019-03-01 18:13:38 +00002582 bool auto_continue = false;
2583 for (auto hook : m_stop_hooks) {
2584 if (hook.second->IsActive()) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002585 any_active_hooks = true;
Jim Ingham3139fc92019-03-01 18:13:38 +00002586 auto_continue |= hook.second->GetAutoContinue();
Kate Stoneb9c1b512016-09-06 20:57:50 +00002587 }
2588 }
2589 if (!any_active_hooks)
2590 return;
2591
2592 CommandReturnObject result;
2593
2594 std::vector<ExecutionContext> exc_ctx_with_reasons;
2595 std::vector<SymbolContext> sym_ctx_with_reasons;
2596
2597 ThreadList &cur_threadlist = m_process_sp->GetThreadList();
2598 size_t num_threads = cur_threadlist.GetSize();
2599 for (size_t i = 0; i < num_threads; i++) {
2600 lldb::ThreadSP cur_thread_sp = cur_threadlist.GetThreadAtIndex(i);
2601 if (cur_thread_sp->ThreadStoppedForAReason()) {
2602 lldb::StackFrameSP cur_frame_sp = cur_thread_sp->GetStackFrameAtIndex(0);
2603 exc_ctx_with_reasons.push_back(ExecutionContext(
2604 m_process_sp.get(), cur_thread_sp.get(), cur_frame_sp.get()));
2605 sym_ctx_with_reasons.push_back(
2606 cur_frame_sp->GetSymbolContext(eSymbolContextEverything));
2607 }
2608 }
2609
2610 // If no threads stopped for a reason, don't run the stop-hooks.
2611 size_t num_exe_ctx = exc_ctx_with_reasons.size();
2612 if (num_exe_ctx == 0)
2613 return;
2614
2615 result.SetImmediateOutputStream(m_debugger.GetAsyncOutputStream());
2616 result.SetImmediateErrorStream(m_debugger.GetAsyncErrorStream());
2617
2618 bool keep_going = true;
2619 bool hooks_ran = false;
2620 bool print_hook_header = (m_stop_hooks.size() != 1);
2621 bool print_thread_header = (num_exe_ctx != 1);
Jim Ingham3139fc92019-03-01 18:13:38 +00002622 bool did_restart = false;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002623
2624 for (pos = m_stop_hooks.begin(); keep_going && pos != end; pos++) {
2625 // result.Clear();
2626 StopHookSP cur_hook_sp = (*pos).second;
2627 if (!cur_hook_sp->IsActive())
2628 continue;
2629
2630 bool any_thread_matched = false;
2631 for (size_t i = 0; keep_going && i < num_exe_ctx; i++) {
2632 if ((cur_hook_sp->GetSpecifier() == nullptr ||
2633 cur_hook_sp->GetSpecifier()->SymbolContextMatches(
2634 sym_ctx_with_reasons[i])) &&
2635 (cur_hook_sp->GetThreadSpecifier() == nullptr ||
2636 cur_hook_sp->GetThreadSpecifier()->ThreadPassesBasicTests(
2637 exc_ctx_with_reasons[i].GetThreadRef()))) {
2638 if (!hooks_ran) {
2639 hooks_ran = true;
2640 }
2641 if (print_hook_header && !any_thread_matched) {
2642 const char *cmd =
2643 (cur_hook_sp->GetCommands().GetSize() == 1
2644 ? cur_hook_sp->GetCommands().GetStringAtIndex(0)
2645 : nullptr);
2646 if (cmd)
2647 result.AppendMessageWithFormat("\n- Hook %" PRIu64 " (%s)\n",
2648 cur_hook_sp->GetID(), cmd);
2649 else
2650 result.AppendMessageWithFormat("\n- Hook %" PRIu64 "\n",
2651 cur_hook_sp->GetID());
2652 any_thread_matched = true;
2653 }
2654
2655 if (print_thread_header)
2656 result.AppendMessageWithFormat(
2657 "-- Thread %d\n",
2658 exc_ctx_with_reasons[i].GetThreadPtr()->GetIndexID());
2659
2660 CommandInterpreterRunOptions options;
2661 options.SetStopOnContinue(true);
2662 options.SetStopOnError(true);
2663 options.SetEchoCommands(false);
2664 options.SetPrintResults(true);
Jonas Devliegherec0b48ab2019-05-08 01:23:47 +00002665 options.SetPrintErrors(true);
Kate Stoneb9c1b512016-09-06 20:57:50 +00002666 options.SetAddToHistory(false);
2667
Jim Ingham3139fc92019-03-01 18:13:38 +00002668 // Force Async:
2669 bool old_async = GetDebugger().GetAsyncExecution();
2670 GetDebugger().SetAsyncExecution(true);
Kate Stoneb9c1b512016-09-06 20:57:50 +00002671 GetDebugger().GetCommandInterpreter().HandleCommands(
2672 cur_hook_sp->GetCommands(), &exc_ctx_with_reasons[i], options,
2673 result);
Jim Ingham3139fc92019-03-01 18:13:38 +00002674 GetDebugger().SetAsyncExecution(old_async);
Kate Stoneb9c1b512016-09-06 20:57:50 +00002675 // If the command started the target going again, we should bag out of
2676 // running the stop hooks.
2677 if ((result.GetStatus() == eReturnStatusSuccessContinuingNoResult) ||
2678 (result.GetStatus() == eReturnStatusSuccessContinuingResult)) {
Jim Ingham45816d62017-12-05 02:34:05 +00002679 // But only complain if there were more stop hooks to do:
2680 StopHookCollection::iterator tmp = pos;
2681 if (++tmp != end)
Jonas Devlieghered3607752019-07-19 00:56:26 +00002682 result.AppendMessageWithFormat(
2683 "\nAborting stop hooks, hook %" PRIu64
2684 " set the program running.\n"
2685 " Consider using '-G true' to make "
2686 "stop hooks auto-continue.\n",
2687 cur_hook_sp->GetID());
Kate Stoneb9c1b512016-09-06 20:57:50 +00002688 keep_going = false;
Jim Ingham3139fc92019-03-01 18:13:38 +00002689 did_restart = true;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002690 }
2691 }
2692 }
2693 }
Jim Ingham3139fc92019-03-01 18:13:38 +00002694 // Finally, if auto-continue was requested, do it now:
2695 if (!did_restart && auto_continue)
2696 m_process_sp->PrivateResume();
Kate Stoneb9c1b512016-09-06 20:57:50 +00002697
2698 result.GetImmediateOutputStream()->Flush();
2699 result.GetImmediateErrorStream()->Flush();
2700}
2701
2702const TargetPropertiesSP &Target::GetGlobalProperties() {
2703 // NOTE: intentional leak so we don't crash if global destructor chain gets
2704 // called as other threads still use the result of this function
Pavel Labath5f05ea82016-10-19 15:12:45 +00002705 static TargetPropertiesSP *g_settings_sp_ptr =
2706 new TargetPropertiesSP(new TargetProperties(nullptr));
Kate Stoneb9c1b512016-09-06 20:57:50 +00002707 return *g_settings_sp_ptr;
2708}
2709
Zachary Turner97206d52017-05-12 04:51:55 +00002710Status Target::Install(ProcessLaunchInfo *launch_info) {
2711 Status error;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002712 PlatformSP platform_sp(GetPlatform());
2713 if (platform_sp) {
2714 if (platform_sp->IsRemote()) {
2715 if (platform_sp->IsConnected()) {
2716 // Install all files that have an install path, and always install the
2717 // main executable when connected to a remote platform
2718 const ModuleList &modules = GetImages();
2719 const size_t num_images = modules.GetSize();
2720 for (size_t idx = 0; idx < num_images; ++idx) {
2721 ModuleSP module_sp(modules.GetModuleAtIndex(idx));
2722 if (module_sp) {
2723 const bool is_main_executable = module_sp == GetExecutableModule();
2724 FileSpec local_file(module_sp->GetFileSpec());
2725 if (local_file) {
2726 FileSpec remote_file(module_sp->GetRemoteInstallFileSpec());
2727 if (!remote_file) {
2728 if (is_main_executable) // TODO: add setting for always
2729 // installing main executable???
2730 {
2731 // Always install the main executable
2732 remote_file = platform_sp->GetRemoteWorkingDirectory();
2733 remote_file.AppendPathComponent(
2734 module_sp->GetFileSpec().GetFilename().GetCString());
2735 }
2736 }
2737 if (remote_file) {
2738 error = platform_sp->Install(local_file, remote_file);
2739 if (error.Success()) {
2740 module_sp->SetPlatformFileSpec(remote_file);
2741 if (is_main_executable) {
2742 platform_sp->SetFilePermissions(remote_file, 0700);
2743 if (launch_info)
2744 launch_info->SetExecutableFile(remote_file, false);
2745 }
2746 } else
2747 break;
2748 }
2749 }
2750 }
2751 }
2752 }
2753 }
2754 }
2755 return error;
2756}
2757
2758bool Target::ResolveLoadAddress(addr_t load_addr, Address &so_addr,
2759 uint32_t stop_id) {
2760 return m_section_load_history.ResolveLoadAddress(stop_id, load_addr, so_addr);
2761}
2762
2763bool Target::ResolveFileAddress(lldb::addr_t file_addr,
2764 Address &resolved_addr) {
2765 return m_images.ResolveFileAddress(file_addr, resolved_addr);
2766}
2767
2768bool Target::SetSectionLoadAddress(const SectionSP &section_sp,
2769 addr_t new_section_load_addr,
2770 bool warn_multiple) {
2771 const addr_t old_section_load_addr =
2772 m_section_load_history.GetSectionLoadAddress(
2773 SectionLoadHistory::eStopIDNow, section_sp);
2774 if (old_section_load_addr != new_section_load_addr) {
2775 uint32_t stop_id = 0;
2776 ProcessSP process_sp(GetProcessSP());
2777 if (process_sp)
2778 stop_id = process_sp->GetStopID();
Greg Claytonb09c5382013-12-13 17:20:18 +00002779 else
Kate Stoneb9c1b512016-09-06 20:57:50 +00002780 stop_id = m_section_load_history.GetLastStopID();
2781 if (m_section_load_history.SetSectionLoadAddress(
2782 stop_id, section_sp, new_section_load_addr, warn_multiple))
2783 return true; // Return true if the section load address was changed...
2784 }
2785 return false; // Return false to indicate nothing changed
2786}
Todd Fialaac33cc92014-10-09 01:02:08 +00002787
Kate Stoneb9c1b512016-09-06 20:57:50 +00002788size_t Target::UnloadModuleSections(const ModuleList &module_list) {
2789 size_t section_unload_count = 0;
2790 size_t num_modules = module_list.GetSize();
2791 for (size_t i = 0; i < num_modules; ++i) {
2792 section_unload_count +=
2793 UnloadModuleSections(module_list.GetModuleAtIndex(i));
2794 }
2795 return section_unload_count;
2796}
Todd Fiala015d8182014-07-22 23:41:36 +00002797
Kate Stoneb9c1b512016-09-06 20:57:50 +00002798size_t Target::UnloadModuleSections(const lldb::ModuleSP &module_sp) {
2799 uint32_t stop_id = 0;
2800 ProcessSP process_sp(GetProcessSP());
2801 if (process_sp)
2802 stop_id = process_sp->GetStopID();
2803 else
2804 stop_id = m_section_load_history.GetLastStopID();
2805 SectionList *sections = module_sp->GetSectionList();
2806 size_t section_unload_count = 0;
2807 if (sections) {
2808 const uint32_t num_sections = sections->GetNumSections(0);
2809 for (uint32_t i = 0; i < num_sections; ++i) {
2810 section_unload_count += m_section_load_history.SetSectionUnloaded(
2811 stop_id, sections->GetSectionAtIndex(i));
Greg Claytonb09c5382013-12-13 17:20:18 +00002812 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00002813 }
2814 return section_unload_count;
2815}
2816
2817bool Target::SetSectionUnloaded(const lldb::SectionSP &section_sp) {
2818 uint32_t stop_id = 0;
2819 ProcessSP process_sp(GetProcessSP());
2820 if (process_sp)
2821 stop_id = process_sp->GetStopID();
2822 else
2823 stop_id = m_section_load_history.GetLastStopID();
2824 return m_section_load_history.SetSectionUnloaded(stop_id, section_sp);
2825}
2826
2827bool Target::SetSectionUnloaded(const lldb::SectionSP &section_sp,
2828 addr_t load_addr) {
2829 uint32_t stop_id = 0;
2830 ProcessSP process_sp(GetProcessSP());
2831 if (process_sp)
2832 stop_id = process_sp->GetStopID();
2833 else
2834 stop_id = m_section_load_history.GetLastStopID();
2835 return m_section_load_history.SetSectionUnloaded(stop_id, section_sp,
2836 load_addr);
2837}
2838
2839void Target::ClearAllLoadedSections() { m_section_load_history.Clear(); }
2840
Zachary Turner97206d52017-05-12 04:51:55 +00002841Status Target::Launch(ProcessLaunchInfo &launch_info, Stream *stream) {
2842 Status error;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002843 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_TARGET));
2844
Jonas Devlieghere63e5fb72019-07-24 17:56:10 +00002845 LLDB_LOGF(log, "Target::%s() called for %s", __FUNCTION__,
2846 launch_info.GetExecutableFile().GetPath().c_str());
Kate Stoneb9c1b512016-09-06 20:57:50 +00002847
2848 StateType state = eStateInvalid;
2849
2850 // Scope to temporarily get the process state in case someone has manually
2851 // remotely connected already to a process and we can skip the platform
2852 // launching.
2853 {
2854 ProcessSP process_sp(GetProcessSP());
2855
2856 if (process_sp) {
2857 state = process_sp->GetState();
Jonas Devlieghere63e5fb72019-07-24 17:56:10 +00002858 LLDB_LOGF(log,
2859 "Target::%s the process exists, and its current state is %s",
2860 __FUNCTION__, StateAsCString(state));
Kate Stoneb9c1b512016-09-06 20:57:50 +00002861 } else {
Jonas Devlieghere63e5fb72019-07-24 17:56:10 +00002862 LLDB_LOGF(log, "Target::%s the process instance doesn't currently exist.",
2863 __FUNCTION__);
Kate Stoneb9c1b512016-09-06 20:57:50 +00002864 }
2865 }
2866
2867 launch_info.GetFlags().Set(eLaunchFlagDebug);
2868
2869 // Get the value of synchronous execution here. If you wait till after you
Adrian Prantl05097242018-04-30 16:49:04 +00002870 // have started to run, then you could have hit a breakpoint, whose command
2871 // might switch the value, and then you'll pick up that incorrect value.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002872 Debugger &debugger = GetDebugger();
2873 const bool synchronous_execution =
2874 debugger.GetCommandInterpreter().GetSynchronous();
2875
2876 PlatformSP platform_sp(GetPlatform());
2877
Pavel Labath8e55dde2019-01-08 11:55:19 +00002878 FinalizeFileActions(launch_info);
Kate Stoneb9c1b512016-09-06 20:57:50 +00002879
2880 if (state == eStateConnected) {
2881 if (launch_info.GetFlags().Test(eLaunchFlagLaunchInTTY)) {
2882 error.SetErrorString(
2883 "can't launch in tty when launching through a remote connection");
2884 return error;
2885 }
2886 }
2887
2888 if (!launch_info.GetArchitecture().IsValid())
2889 launch_info.GetArchitecture() = GetArchitecture();
2890
2891 // If we're not already connected to the process, and if we have a platform
2892 // that can launch a process for debugging, go ahead and do that here.
2893 if (state != eStateConnected && platform_sp &&
2894 platform_sp->CanDebugProcess()) {
Jonas Devlieghere63e5fb72019-07-24 17:56:10 +00002895 LLDB_LOGF(log, "Target::%s asking the platform to debug the process",
2896 __FUNCTION__);
Kate Stoneb9c1b512016-09-06 20:57:50 +00002897
Jim Ingham362d0222018-12-18 01:49:02 +00002898 // If there was a previous process, delete it before we make the new one.
2899 // One subtle point, we delete the process before we release the reference
2900 // to m_process_sp. That way even if we are the last owner, the process
2901 // will get Finalized before it gets destroyed.
2902 DeleteCurrentProcess();
Jonas Devlieghered3607752019-07-19 00:56:26 +00002903
Kate Stoneb9c1b512016-09-06 20:57:50 +00002904 m_process_sp =
2905 GetPlatform()->DebugProcess(launch_info, debugger, this, error);
2906
Kate Stoneb9c1b512016-09-06 20:57:50 +00002907 } else {
Jonas Devlieghere63e5fb72019-07-24 17:56:10 +00002908 LLDB_LOGF(log,
2909 "Target::%s the platform doesn't know how to debug a "
2910 "process, getting a process plugin to do this for us.",
2911 __FUNCTION__);
Kate Stoneb9c1b512016-09-06 20:57:50 +00002912
2913 if (state == eStateConnected) {
2914 assert(m_process_sp);
2915 } else {
2916 // Use a Process plugin to construct the process.
2917 const char *plugin_name = launch_info.GetProcessPluginName();
Pavel Labathcb8c6992019-01-07 10:59:57 +00002918 CreateProcess(launch_info.GetListener(), plugin_name, nullptr);
Greg Claytonb09c5382013-12-13 17:20:18 +00002919 }
2920
Kate Stoneb9c1b512016-09-06 20:57:50 +00002921 // Since we didn't have a platform launch the process, launch it here.
2922 if (m_process_sp)
2923 error = m_process_sp->Launch(launch_info);
2924 }
2925
2926 if (!m_process_sp) {
Greg Claytonb09c5382013-12-13 17:20:18 +00002927 if (error.Success())
Kate Stoneb9c1b512016-09-06 20:57:50 +00002928 error.SetErrorString("failed to launch or debug process");
Greg Claytonb09c5382013-12-13 17:20:18 +00002929 return error;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002930 }
2931
2932 if (error.Success()) {
2933 if (synchronous_execution ||
2934 !launch_info.GetFlags().Test(eLaunchFlagStopAtEntry)) {
2935 ListenerSP hijack_listener_sp(launch_info.GetHijackListener());
2936 if (!hijack_listener_sp) {
2937 hijack_listener_sp =
2938 Listener::MakeListener("lldb.Target.Launch.hijack");
2939 launch_info.SetHijackListener(hijack_listener_sp);
2940 m_process_sp->HijackProcessEvents(hijack_listener_sp);
2941 }
2942
2943 StateType state = m_process_sp->WaitForProcessToStop(
Pavel Labathe3e21cf2016-11-30 11:56:32 +00002944 llvm::None, nullptr, false, hijack_listener_sp, nullptr);
Kate Stoneb9c1b512016-09-06 20:57:50 +00002945
2946 if (state == eStateStopped) {
2947 if (!launch_info.GetFlags().Test(eLaunchFlagStopAtEntry)) {
2948 if (synchronous_execution) {
Jonas Devlieghered3607752019-07-19 00:56:26 +00002949 // Now we have handled the stop-from-attach, and we are just
2950 // switching to a synchronous resume. So we should switch to the
2951 // SyncResume hijacker.
Jim Ingham3139fc92019-03-01 18:13:38 +00002952 m_process_sp->RestoreProcessEvents();
2953 m_process_sp->ResumeSynchronous(stream);
Kate Stoneb9c1b512016-09-06 20:57:50 +00002954 } else {
2955 m_process_sp->RestoreProcessEvents();
2956 error = m_process_sp->PrivateResume();
2957 }
2958 if (!error.Success()) {
Zachary Turner97206d52017-05-12 04:51:55 +00002959 Status error2;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002960 error2.SetErrorStringWithFormat(
2961 "process resume at entry point failed: %s", error.AsCString());
2962 error = error2;
2963 }
2964 }
2965 } else if (state == eStateExited) {
2966 bool with_shell = !!launch_info.GetShell();
2967 const int exit_status = m_process_sp->GetExitStatus();
2968 const char *exit_desc = m_process_sp->GetExitDescription();
2969#define LAUNCH_SHELL_MESSAGE \
2970 "\n'r' and 'run' are aliases that default to launching through a " \
2971 "shell.\nTry launching without going through a shell by using 'process " \
2972 "launch'."
2973 if (exit_desc && exit_desc[0]) {
2974 if (with_shell)
2975 error.SetErrorStringWithFormat(
2976 "process exited with status %i (%s)" LAUNCH_SHELL_MESSAGE,
2977 exit_status, exit_desc);
2978 else
2979 error.SetErrorStringWithFormat("process exited with status %i (%s)",
2980 exit_status, exit_desc);
2981 } else {
2982 if (with_shell)
2983 error.SetErrorStringWithFormat(
2984 "process exited with status %i" LAUNCH_SHELL_MESSAGE,
2985 exit_status);
2986 else
2987 error.SetErrorStringWithFormat("process exited with status %i",
2988 exit_status);
2989 }
2990 } else {
2991 error.SetErrorStringWithFormat(
2992 "initial process state wasn't stopped: %s", StateAsCString(state));
2993 }
2994 }
2995 m_process_sp->RestoreProcessEvents();
2996 } else {
Zachary Turner97206d52017-05-12 04:51:55 +00002997 Status error2;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002998 error2.SetErrorStringWithFormat("process launch failed: %s",
2999 error.AsCString());
3000 error = error2;
3001 }
3002 return error;
Greg Claytonb09c5382013-12-13 17:20:18 +00003003}
Oleksiy Vyalov37386142015-02-10 22:49:57 +00003004
Zachary Turner97206d52017-05-12 04:51:55 +00003005Status Target::Attach(ProcessAttachInfo &attach_info, Stream *stream) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00003006 auto state = eStateInvalid;
3007 auto process_sp = GetProcessSP();
3008 if (process_sp) {
3009 state = process_sp->GetState();
3010 if (process_sp->IsAlive() && state != eStateConnected) {
3011 if (state == eStateAttaching)
Zachary Turner97206d52017-05-12 04:51:55 +00003012 return Status("process attach is in progress");
3013 return Status("a process is already being debugged");
Oleksiy Vyalov37386142015-02-10 22:49:57 +00003014 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00003015 }
Oleksiy Vyalov37386142015-02-10 22:49:57 +00003016
Kate Stoneb9c1b512016-09-06 20:57:50 +00003017 const ModuleSP old_exec_module_sp = GetExecutableModule();
Oleksiy Vyalov37386142015-02-10 22:49:57 +00003018
Adrian Prantl05097242018-04-30 16:49:04 +00003019 // If no process info was specified, then use the target executable name as
3020 // the process to attach to by default
Kate Stoneb9c1b512016-09-06 20:57:50 +00003021 if (!attach_info.ProcessInfoSpecified()) {
3022 if (old_exec_module_sp)
3023 attach_info.GetExecutableFile().GetFilename() =
3024 old_exec_module_sp->GetPlatformFileSpec().GetFilename();
Oleksiy Vyalov37386142015-02-10 22:49:57 +00003025
Kate Stoneb9c1b512016-09-06 20:57:50 +00003026 if (!attach_info.ProcessInfoSpecified()) {
Zachary Turner97206d52017-05-12 04:51:55 +00003027 return Status("no process specified, create a target with a file, or "
3028 "specify the --pid or --name");
Oleksiy Vyalov37386142015-02-10 22:49:57 +00003029 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00003030 }
Oleksiy Vyalov37386142015-02-10 22:49:57 +00003031
Kate Stoneb9c1b512016-09-06 20:57:50 +00003032 const auto platform_sp =
3033 GetDebugger().GetPlatformList().GetSelectedPlatform();
3034 ListenerSP hijack_listener_sp;
3035 const bool async = attach_info.GetAsync();
3036 if (!async) {
3037 hijack_listener_sp =
3038 Listener::MakeListener("lldb.Target.Attach.attach.hijack");
3039 attach_info.SetHijackListener(hijack_listener_sp);
3040 }
Oleksiy Vyalov37386142015-02-10 22:49:57 +00003041
Zachary Turner97206d52017-05-12 04:51:55 +00003042 Status error;
Kate Stoneb9c1b512016-09-06 20:57:50 +00003043 if (state != eStateConnected && platform_sp != nullptr &&
3044 platform_sp->CanDebugProcess()) {
3045 SetPlatform(platform_sp);
3046 process_sp = platform_sp->Attach(attach_info, GetDebugger(), this, error);
3047 } else {
3048 if (state != eStateConnected) {
3049 const char *plugin_name = attach_info.GetProcessPluginName();
3050 process_sp =
3051 CreateProcess(attach_info.GetListenerForProcess(GetDebugger()),
3052 plugin_name, nullptr);
3053 if (process_sp == nullptr) {
3054 error.SetErrorStringWithFormat(
3055 "failed to create process using plugin %s",
3056 (plugin_name) ? plugin_name : "null");
3057 return error;
3058 }
Oleksiy Vyalov37386142015-02-10 22:49:57 +00003059 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00003060 if (hijack_listener_sp)
3061 process_sp->HijackProcessEvents(hijack_listener_sp);
3062 error = process_sp->Attach(attach_info);
3063 }
Oleksiy Vyalov37386142015-02-10 22:49:57 +00003064
Kate Stoneb9c1b512016-09-06 20:57:50 +00003065 if (error.Success() && process_sp) {
3066 if (async) {
3067 process_sp->RestoreProcessEvents();
3068 } else {
3069 state = process_sp->WaitForProcessToStop(
Pavel Labathe3e21cf2016-11-30 11:56:32 +00003070 llvm::None, nullptr, false, attach_info.GetHijackListener(), stream);
Kate Stoneb9c1b512016-09-06 20:57:50 +00003071 process_sp->RestoreProcessEvents();
3072
3073 if (state != eStateStopped) {
3074 const char *exit_desc = process_sp->GetExitDescription();
3075 if (exit_desc)
3076 error.SetErrorStringWithFormat("%s", exit_desc);
Greg Claytone75e5d82015-10-20 00:14:20 +00003077 else
Kate Stoneb9c1b512016-09-06 20:57:50 +00003078 error.SetErrorString(
3079 "process did not stop (no such process or permission problem?)");
3080 process_sp->Destroy(false);
3081 }
Oleksiy Vyalov37386142015-02-10 22:49:57 +00003082 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00003083 }
3084 return error;
Oleksiy Vyalov37386142015-02-10 22:49:57 +00003085}
3086
Pavel Labath8e55dde2019-01-08 11:55:19 +00003087void Target::FinalizeFileActions(ProcessLaunchInfo &info) {
3088 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
3089
3090 // Finalize the file actions, and if none were given, default to opening up a
3091 // pseudo terminal
3092 PlatformSP platform_sp = GetPlatform();
3093 const bool default_to_use_pty =
3094 m_platform_sp ? m_platform_sp->IsHost() : false;
3095 LLDB_LOG(
3096 log,
3097 "have platform={0}, platform_sp->IsHost()={1}, default_to_use_pty={2}",
3098 bool(platform_sp),
3099 platform_sp ? (platform_sp->IsHost() ? "true" : "false") : "n/a",
3100 default_to_use_pty);
3101
3102 // If nothing for stdin or stdout or stderr was specified, then check the
3103 // process for any default settings that were set with "settings set"
3104 if (info.GetFileActionForFD(STDIN_FILENO) == nullptr ||
3105 info.GetFileActionForFD(STDOUT_FILENO) == nullptr ||
3106 info.GetFileActionForFD(STDERR_FILENO) == nullptr) {
3107 LLDB_LOG(log, "at least one of stdin/stdout/stderr was not set, evaluating "
3108 "default handling");
3109
3110 if (info.GetFlags().Test(eLaunchFlagLaunchInTTY)) {
3111 // Do nothing, if we are launching in a remote terminal no file actions
3112 // should be done at all.
3113 return;
3114 }
3115
3116 if (info.GetFlags().Test(eLaunchFlagDisableSTDIO)) {
3117 LLDB_LOG(log, "eLaunchFlagDisableSTDIO set, adding suppression action "
3118 "for stdin, stdout and stderr");
3119 info.AppendSuppressFileAction(STDIN_FILENO, true, false);
3120 info.AppendSuppressFileAction(STDOUT_FILENO, false, true);
3121 info.AppendSuppressFileAction(STDERR_FILENO, false, true);
3122 } else {
3123 // Check for any values that might have gotten set with any of: (lldb)
3124 // settings set target.input-path (lldb) settings set target.output-path
3125 // (lldb) settings set target.error-path
3126 FileSpec in_file_spec;
3127 FileSpec out_file_spec;
3128 FileSpec err_file_spec;
3129 // Only override with the target settings if we don't already have an
3130 // action for in, out or error
3131 if (info.GetFileActionForFD(STDIN_FILENO) == nullptr)
3132 in_file_spec = GetStandardInputPath();
3133 if (info.GetFileActionForFD(STDOUT_FILENO) == nullptr)
3134 out_file_spec = GetStandardOutputPath();
3135 if (info.GetFileActionForFD(STDERR_FILENO) == nullptr)
3136 err_file_spec = GetStandardErrorPath();
3137
3138 LLDB_LOG(log, "target stdin='{0}', target stdout='{1}', stderr='{1}'",
3139 in_file_spec, out_file_spec, err_file_spec);
3140
3141 if (in_file_spec) {
3142 info.AppendOpenFileAction(STDIN_FILENO, in_file_spec, true, false);
3143 LLDB_LOG(log, "appended stdin open file action for {0}", in_file_spec);
3144 }
3145
3146 if (out_file_spec) {
3147 info.AppendOpenFileAction(STDOUT_FILENO, out_file_spec, false, true);
3148 LLDB_LOG(log, "appended stdout open file action for {0}",
3149 out_file_spec);
3150 }
3151
3152 if (err_file_spec) {
3153 info.AppendOpenFileAction(STDERR_FILENO, err_file_spec, false, true);
3154 LLDB_LOG(log, "appended stderr open file action for {0}",
3155 err_file_spec);
3156 }
3157
3158 if (default_to_use_pty &&
3159 (!in_file_spec || !out_file_spec || !err_file_spec)) {
3160 llvm::Error Err = info.SetUpPtyRedirection();
3161 LLDB_LOG_ERROR(log, std::move(Err), "SetUpPtyRedirection failed: {0}");
3162 }
3163 }
3164 }
3165}
3166
Greg Claytonfbb76342013-11-20 21:07:01 +00003167// Target::StopHook
Kate Stoneb9c1b512016-09-06 20:57:50 +00003168Target::StopHook::StopHook(lldb::TargetSP target_sp, lldb::user_id_t uid)
3169 : UserID(uid), m_target_sp(target_sp), m_commands(), m_specifier_sp(),
Jim Ingham3139fc92019-03-01 18:13:38 +00003170 m_thread_spec_up() {}
Kate Stoneb9c1b512016-09-06 20:57:50 +00003171
3172Target::StopHook::StopHook(const StopHook &rhs)
3173 : UserID(rhs.GetID()), m_target_sp(rhs.m_target_sp),
3174 m_commands(rhs.m_commands), m_specifier_sp(rhs.m_specifier_sp),
Jim Ingham3139fc92019-03-01 18:13:38 +00003175 m_thread_spec_up(), m_active(rhs.m_active),
3176 m_auto_continue(rhs.m_auto_continue) {
Jonas Devlieghered5b44032019-02-13 06:25:41 +00003177 if (rhs.m_thread_spec_up)
3178 m_thread_spec_up.reset(new ThreadSpec(*rhs.m_thread_spec_up));
Jim Ingham9575d842011-03-11 03:53:59 +00003179}
3180
Eugene Zelenko8f30a652015-10-23 18:39:37 +00003181Target::StopHook::~StopHook() = default;
Jim Ingham9575d842011-03-11 03:53:59 +00003182
Kate Stoneb9c1b512016-09-06 20:57:50 +00003183void Target::StopHook::SetSpecifier(SymbolContextSpecifier *specifier) {
3184 m_specifier_sp.reset(specifier);
Zachary Turner32abc6e2015-03-03 19:23:09 +00003185}
3186
Kate Stoneb9c1b512016-09-06 20:57:50 +00003187void Target::StopHook::SetThreadSpecifier(ThreadSpec *specifier) {
Jonas Devlieghered5b44032019-02-13 06:25:41 +00003188 m_thread_spec_up.reset(specifier);
Jim Ingham9575d842011-03-11 03:53:59 +00003189}
Jim Ingham9575d842011-03-11 03:53:59 +00003190
Kate Stoneb9c1b512016-09-06 20:57:50 +00003191void Target::StopHook::GetDescription(Stream *s,
3192 lldb::DescriptionLevel level) const {
3193 int indent_level = s->GetIndentLevel();
Jim Ingham9575d842011-03-11 03:53:59 +00003194
Kate Stoneb9c1b512016-09-06 20:57:50 +00003195 s->SetIndentLevel(indent_level + 2);
3196
3197 s->Printf("Hook: %" PRIu64 "\n", GetID());
3198 if (m_active)
3199 s->Indent("State: enabled\n");
3200 else
3201 s->Indent("State: disabled\n");
3202
Jim Ingham3139fc92019-03-01 18:13:38 +00003203 if (m_auto_continue)
3204 s->Indent("AutoContinue on\n");
3205
Kate Stoneb9c1b512016-09-06 20:57:50 +00003206 if (m_specifier_sp) {
3207 s->Indent();
3208 s->PutCString("Specifier:\n");
3209 s->SetIndentLevel(indent_level + 4);
3210 m_specifier_sp->GetDescription(s, level);
Jim Ingham9575d842011-03-11 03:53:59 +00003211 s->SetIndentLevel(indent_level + 2);
Kate Stoneb9c1b512016-09-06 20:57:50 +00003212 }
Jim Ingham9575d842011-03-11 03:53:59 +00003213
Jonas Devlieghered5b44032019-02-13 06:25:41 +00003214 if (m_thread_spec_up) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00003215 StreamString tmp;
3216 s->Indent("Thread:\n");
Jonas Devlieghered5b44032019-02-13 06:25:41 +00003217 m_thread_spec_up->GetDescription(&tmp, level);
Kate Stoneb9c1b512016-09-06 20:57:50 +00003218 s->SetIndentLevel(indent_level + 4);
Zachary Turnerc1564272016-11-16 21:15:24 +00003219 s->Indent(tmp.GetString());
Kate Stoneb9c1b512016-09-06 20:57:50 +00003220 s->PutCString("\n");
3221 s->SetIndentLevel(indent_level + 2);
3222 }
Jim Ingham9575d842011-03-11 03:53:59 +00003223
Kate Stoneb9c1b512016-09-06 20:57:50 +00003224 s->Indent("Commands: \n");
3225 s->SetIndentLevel(indent_level + 4);
3226 uint32_t num_commands = m_commands.GetSize();
3227 for (uint32_t i = 0; i < num_commands; i++) {
3228 s->Indent(m_commands.GetStringAtIndex(i));
3229 s->PutCString("\n");
3230 }
3231 s->SetIndentLevel(indent_level);
Jim Ingham9575d842011-03-11 03:53:59 +00003232}
3233
Tatyana Krasnukha8fe53c492018-09-26 18:50:19 +00003234static constexpr OptionEnumValueElement g_dynamic_value_types[] = {
Jonas Devliegheree063ecc2019-08-02 00:18:44 +00003235 {
3236 eNoDynamicValues,
3237 "no-dynamic-values",
3238 "Don't calculate the dynamic type of values",
3239 },
3240 {
3241 eDynamicCanRunTarget,
3242 "run-target",
3243 "Calculate the dynamic type of values "
3244 "even if you have to run the target.",
3245 },
3246 {
3247 eDynamicDontRunTarget,
3248 "no-run-target",
3249 "Calculate the dynamic type of values, but don't run the target.",
3250 },
3251};
Caroline Ticedaccaa92010-09-20 20:44:43 +00003252
Tatyana Krasnukha8fe53c492018-09-26 18:50:19 +00003253OptionEnumValues lldb_private::GetDynamicValueTypes() {
3254 return OptionEnumValues(g_dynamic_value_types);
3255}
3256
3257static constexpr OptionEnumValueElement g_inline_breakpoint_enums[] = {
Jonas Devliegheree063ecc2019-08-02 00:18:44 +00003258 {
3259 eInlineBreakpointsNever,
3260 "never",
3261 "Never look for inline breakpoint locations (fastest). This setting "
3262 "should only be used if you know that no inlining occurs in your"
3263 "programs.",
3264 },
3265 {
3266 eInlineBreakpointsHeaders,
3267 "headers",
3268 "Only check for inline breakpoint locations when setting breakpoints "
3269 "in header files, but not when setting breakpoint in implementation "
3270 "source files (default).",
3271 },
3272 {
3273 eInlineBreakpointsAlways,
3274 "always",
3275 "Always look for inline breakpoint locations when setting file and "
3276 "line breakpoints (slower but most accurate).",
3277 },
3278};
Greg Clayton1f746072012-08-29 21:13:06 +00003279
Fangrui Songefe8e7e2019-05-14 08:55:50 +00003280enum x86DisassemblyFlavor {
Kate Stoneb9c1b512016-09-06 20:57:50 +00003281 eX86DisFlavorDefault,
3282 eX86DisFlavorIntel,
3283 eX86DisFlavorATT
Fangrui Songefe8e7e2019-05-14 08:55:50 +00003284};
Jim Ingham0f063ba2013-03-02 00:26:47 +00003285
Tatyana Krasnukha8fe53c492018-09-26 18:50:19 +00003286static constexpr OptionEnumValueElement g_x86_dis_flavor_value_types[] = {
Jonas Devliegheree063ecc2019-08-02 00:18:44 +00003287 {
3288 eX86DisFlavorDefault,
3289 "default",
3290 "Disassembler default (currently att).",
3291 },
3292 {
3293 eX86DisFlavorIntel,
3294 "intel",
3295 "Intel disassembler flavor.",
3296 },
3297 {
3298 eX86DisFlavorATT,
3299 "att",
3300 "AT&T disassembler flavor.",
3301 },
3302};
Kate Stoneb9c1b512016-09-06 20:57:50 +00003303
Tatyana Krasnukha8fe53c492018-09-26 18:50:19 +00003304static constexpr OptionEnumValueElement g_hex_immediate_style_values[] = {
Jonas Devliegheree063ecc2019-08-02 00:18:44 +00003305 {
3306 Disassembler::eHexStyleC,
3307 "c",
3308 "C-style (0xffff).",
3309 },
3310 {
3311 Disassembler::eHexStyleAsm,
3312 "asm",
3313 "Asm-style (0ffffh).",
3314 },
3315};
Kate Stoneb9c1b512016-09-06 20:57:50 +00003316
Tatyana Krasnukha8fe53c492018-09-26 18:50:19 +00003317static constexpr OptionEnumValueElement g_load_script_from_sym_file_values[] = {
Jonas Devliegheree063ecc2019-08-02 00:18:44 +00003318 {
3319 eLoadScriptFromSymFileTrue,
3320 "true",
3321 "Load debug scripts inside symbol files",
3322 },
3323 {
3324 eLoadScriptFromSymFileFalse,
3325 "false",
3326 "Do not load debug scripts inside symbol files.",
3327 },
3328 {
3329 eLoadScriptFromSymFileWarn,
3330 "warn",
3331 "Warn about debug scripts inside symbol files but do not load them.",
3332 },
3333};
Kate Stoneb9c1b512016-09-06 20:57:50 +00003334
Jonas Devliegheree063ecc2019-08-02 00:18:44 +00003335static constexpr OptionEnumValueElement g_load_cwd_lldbinit_values[] = {
3336 {
3337 eLoadCWDlldbinitTrue,
3338 "true",
3339 "Load .lldbinit files from current directory",
3340 },
3341 {
3342 eLoadCWDlldbinitFalse,
3343 "false",
3344 "Do not load .lldbinit files from current directory",
3345 },
3346 {
3347 eLoadCWDlldbinitWarn,
3348 "warn",
3349 "Warn about loading .lldbinit files from current directory",
3350 },
3351};
Kate Stoneb9c1b512016-09-06 20:57:50 +00003352
Tatyana Krasnukha8fe53c492018-09-26 18:50:19 +00003353static constexpr OptionEnumValueElement g_memory_module_load_level_values[] = {
Jonas Devliegheree063ecc2019-08-02 00:18:44 +00003354 {
3355 eMemoryModuleLoadLevelMinimal,
3356 "minimal",
3357 "Load minimal information when loading modules from memory. Currently "
3358 "this setting loads sections only.",
3359 },
3360 {
3361 eMemoryModuleLoadLevelPartial,
3362 "partial",
3363 "Load partial information when loading modules from memory. Currently "
3364 "this setting loads sections and function bounds.",
3365 },
3366 {
3367 eMemoryModuleLoadLevelComplete,
3368 "complete",
3369 "Load complete information when loading modules from memory. Currently "
3370 "this setting loads sections and all symbols.",
3371 },
3372};
Kate Stoneb9c1b512016-09-06 20:57:50 +00003373
Jonas Devlieghere971f9ca2019-07-25 21:36:37 +00003374#define LLDB_PROPERTIES_target
Jordan Rupprecht6a253d32019-07-29 17:22:10 +00003375#include "TargetProperties.inc"
Kate Stoneb9c1b512016-09-06 20:57:50 +00003376
3377enum {
Jonas Devlieghere971f9ca2019-07-25 21:36:37 +00003378#define LLDB_PROPERTIES_target
Jordan Rupprecht6a253d32019-07-29 17:22:10 +00003379#include "TargetPropertiesEnum.inc"
Jonas Devliegheree103ae92018-11-15 01:18:15 +00003380 ePropertyExperimental,
Jim Ingham0f063ba2013-03-02 00:26:47 +00003381};
3382
Kate Stoneb9c1b512016-09-06 20:57:50 +00003383class TargetOptionValueProperties : public OptionValueProperties {
Greg Clayton67cc0632012-08-22 17:17:09 +00003384public:
Adrian Prantl0e4c4822019-03-06 21:22:25 +00003385 TargetOptionValueProperties(ConstString name)
Kate Stoneb9c1b512016-09-06 20:57:50 +00003386 : OptionValueProperties(name), m_target(nullptr), m_got_host_env(false) {}
Caroline Ticedaccaa92010-09-20 20:44:43 +00003387
Kate Stoneb9c1b512016-09-06 20:57:50 +00003388 // This constructor is used when creating TargetOptionValueProperties when it
3389 // is part of a new lldb_private::Target instance. It will copy all current
3390 // global property values as needed
3391 TargetOptionValueProperties(Target *target,
3392 const TargetPropertiesSP &target_properties_sp)
3393 : OptionValueProperties(*target_properties_sp->GetValueProperties()),
3394 m_target(target), m_got_host_env(false) {}
Greg Clayton67cc0632012-08-22 17:17:09 +00003395
Kate Stoneb9c1b512016-09-06 20:57:50 +00003396 const Property *GetPropertyAtIndex(const ExecutionContext *exe_ctx,
3397 bool will_modify,
3398 uint32_t idx) const override {
3399 // When getting the value for a key from the target options, we will always
Adrian Prantl05097242018-04-30 16:49:04 +00003400 // try and grab the setting from the current target if there is one. Else
3401 // we just use the one from this instance.
Kate Stoneb9c1b512016-09-06 20:57:50 +00003402 if (idx == ePropertyEnvVars)
3403 GetHostEnvironmentIfNeeded();
3404
3405 if (exe_ctx) {
3406 Target *target = exe_ctx->GetTargetPtr();
3407 if (target) {
3408 TargetOptionValueProperties *target_properties =
3409 static_cast<TargetOptionValueProperties *>(
3410 target->GetValueProperties().get());
3411 if (this != target_properties)
3412 return target_properties->ProtectedGetPropertyAtIndex(idx);
3413 }
Greg Clayton67cc0632012-08-22 17:17:09 +00003414 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00003415 return ProtectedGetPropertyAtIndex(idx);
3416 }
3417
3418 lldb::TargetSP GetTargetSP() { return m_target->shared_from_this(); }
3419
Greg Clayton67cc0632012-08-22 17:17:09 +00003420protected:
Kate Stoneb9c1b512016-09-06 20:57:50 +00003421 void GetHostEnvironmentIfNeeded() const {
3422 if (!m_got_host_env) {
3423 if (m_target) {
3424 m_got_host_env = true;
3425 const uint32_t idx = ePropertyInheritEnv;
3426 if (GetPropertyAtIndexAsBoolean(
Jonas Devliegherea8ea5952019-07-29 16:41:30 +00003427 nullptr, idx, g_target_properties[idx].default_uint_value != 0)) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00003428 PlatformSP platform_sp(m_target->GetPlatform());
3429 if (platform_sp) {
Pavel Labath62930e52018-01-10 11:57:31 +00003430 Environment env = platform_sp->GetEnvironment();
3431 OptionValueDictionary *env_dict =
3432 GetPropertyAtIndexAsOptionValueDictionary(nullptr,
3433 ePropertyEnvVars);
3434 if (env_dict) {
3435 const bool can_replace = false;
3436 for (const auto &KV : env) {
3437 // Don't allow existing keys to be replaced with ones we get
3438 // from the platform environment
3439 env_dict->SetValueForKey(
3440 ConstString(KV.first()),
3441 OptionValueSP(new OptionValueString(KV.second.c_str())),
3442 can_replace);
Kate Stoneb9c1b512016-09-06 20:57:50 +00003443 }
Greg Clayton67cc0632012-08-22 17:17:09 +00003444 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00003445 }
Greg Clayton67cc0632012-08-22 17:17:09 +00003446 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00003447 }
Greg Clayton67cc0632012-08-22 17:17:09 +00003448 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00003449 }
3450 Target *m_target;
3451 mutable bool m_got_host_env;
Greg Clayton67cc0632012-08-22 17:17:09 +00003452};
3453
Greg Claytonfbb76342013-11-20 21:07:01 +00003454// TargetProperties
Jonas Devlieghere971f9ca2019-07-25 21:36:37 +00003455#define LLDB_PROPERTIES_experimental
Jordan Rupprecht6a253d32019-07-29 17:22:10 +00003456#include "TargetProperties.inc"
Jim Inghambed67792016-07-07 18:25:48 +00003457
Jonas Devlieghere971f9ca2019-07-25 21:36:37 +00003458enum {
3459#define LLDB_PROPERTIES_experimental
Jordan Rupprecht6a253d32019-07-29 17:22:10 +00003460#include "TargetPropertiesEnum.inc"
Jonas Devlieghere971f9ca2019-07-25 21:36:37 +00003461};
Jim Inghambed67792016-07-07 18:25:48 +00003462
Kate Stoneb9c1b512016-09-06 20:57:50 +00003463class TargetExperimentalOptionValueProperties : public OptionValueProperties {
Jim Inghambed67792016-07-07 18:25:48 +00003464public:
Kate Stoneb9c1b512016-09-06 20:57:50 +00003465 TargetExperimentalOptionValueProperties()
3466 : OptionValueProperties(
3467 ConstString(Properties::GetExperimentalSettingsName())) {}
Jim Inghambed67792016-07-07 18:25:48 +00003468};
3469
Kate Stoneb9c1b512016-09-06 20:57:50 +00003470TargetExperimentalProperties::TargetExperimentalProperties()
3471 : Properties(OptionValuePropertiesSP(
3472 new TargetExperimentalOptionValueProperties())) {
3473 m_collection_sp->Initialize(g_experimental_properties);
Jim Inghambed67792016-07-07 18:25:48 +00003474}
3475
Jim Inghambed67792016-07-07 18:25:48 +00003476// TargetProperties
Kate Stoneb9c1b512016-09-06 20:57:50 +00003477TargetProperties::TargetProperties(Target *target)
3478 : Properties(), m_launch_info() {
3479 if (target) {
Jonas Devlieghere796ac802019-02-11 23:13:08 +00003480 m_collection_sp = std::make_shared<TargetOptionValueProperties>(
3481 target, Target::GetGlobalProperties());
Ilia K8f37ca52015-02-13 14:31:06 +00003482
Adrian Prantl05097242018-04-30 16:49:04 +00003483 // Set callbacks to update launch_info whenever "settins set" updated any
3484 // of these properties
Kate Stoneb9c1b512016-09-06 20:57:50 +00003485 m_collection_sp->SetValueChangedCallback(
3486 ePropertyArg0, TargetProperties::Arg0ValueChangedCallback, this);
3487 m_collection_sp->SetValueChangedCallback(
3488 ePropertyRunArgs, TargetProperties::RunArgsValueChangedCallback, this);
3489 m_collection_sp->SetValueChangedCallback(
3490 ePropertyEnvVars, TargetProperties::EnvVarsValueChangedCallback, this);
3491 m_collection_sp->SetValueChangedCallback(
3492 ePropertyInputPath, TargetProperties::InputPathValueChangedCallback,
3493 this);
3494 m_collection_sp->SetValueChangedCallback(
3495 ePropertyOutputPath, TargetProperties::OutputPathValueChangedCallback,
3496 this);
3497 m_collection_sp->SetValueChangedCallback(
3498 ePropertyErrorPath, TargetProperties::ErrorPathValueChangedCallback,
3499 this);
3500 m_collection_sp->SetValueChangedCallback(
3501 ePropertyDetachOnError,
3502 TargetProperties::DetachOnErrorValueChangedCallback, this);
3503 m_collection_sp->SetValueChangedCallback(
3504 ePropertyDisableASLR, TargetProperties::DisableASLRValueChangedCallback,
3505 this);
3506 m_collection_sp->SetValueChangedCallback(
3507 ePropertyDisableSTDIO,
3508 TargetProperties::DisableSTDIOValueChangedCallback, this);
Jim Inghambed67792016-07-07 18:25:48 +00003509
Kate Stoneb9c1b512016-09-06 20:57:50 +00003510 m_experimental_properties_up.reset(new TargetExperimentalProperties());
3511 m_collection_sp->AppendProperty(
3512 ConstString(Properties::GetExperimentalSettingsName()),
3513 ConstString("Experimental settings - setting these won't produce "
3514 "errors if the setting is not present."),
3515 true, m_experimental_properties_up->GetValueProperties());
Jim Inghambed67792016-07-07 18:25:48 +00003516
Kate Stoneb9c1b512016-09-06 20:57:50 +00003517 // Update m_launch_info once it was created
3518 Arg0ValueChangedCallback(this, nullptr);
3519 RunArgsValueChangedCallback(this, nullptr);
3520 // EnvVarsValueChangedCallback(this, nullptr); // FIXME: cause segfault in
3521 // Target::GetPlatform()
3522 InputPathValueChangedCallback(this, nullptr);
3523 OutputPathValueChangedCallback(this, nullptr);
3524 ErrorPathValueChangedCallback(this, nullptr);
3525 DetachOnErrorValueChangedCallback(this, nullptr);
3526 DisableASLRValueChangedCallback(this, nullptr);
3527 DisableSTDIOValueChangedCallback(this, nullptr);
3528 } else {
Jonas Devlieghere796ac802019-02-11 23:13:08 +00003529 m_collection_sp =
3530 std::make_shared<TargetOptionValueProperties>(ConstString("target"));
Jonas Devliegherea8ea5952019-07-29 16:41:30 +00003531 m_collection_sp->Initialize(g_target_properties);
Kate Stoneb9c1b512016-09-06 20:57:50 +00003532 m_experimental_properties_up.reset(new TargetExperimentalProperties());
3533 m_collection_sp->AppendProperty(
3534 ConstString(Properties::GetExperimentalSettingsName()),
3535 ConstString("Experimental settings - setting these won't produce "
3536 "errors if the setting is not present."),
3537 true, m_experimental_properties_up->GetValueProperties());
3538 m_collection_sp->AppendProperty(
3539 ConstString("process"), ConstString("Settings specific to processes."),
3540 true, Process::GetGlobalProperties()->GetValueProperties());
3541 }
Caroline Ticedaccaa92010-09-20 20:44:43 +00003542}
3543
Eugene Zelenko8f30a652015-10-23 18:39:37 +00003544TargetProperties::~TargetProperties() = default;
3545
Kate Stoneb9c1b512016-09-06 20:57:50 +00003546bool TargetProperties::GetInjectLocalVariables(
3547 ExecutionContext *exe_ctx) const {
3548 const Property *exp_property = m_collection_sp->GetPropertyAtIndex(
3549 exe_ctx, false, ePropertyExperimental);
3550 OptionValueProperties *exp_values =
3551 exp_property->GetValue()->GetAsProperties();
3552 if (exp_values)
3553 return exp_values->GetPropertyAtIndexAsBoolean(
3554 exe_ctx, ePropertyInjectLocalVars, true);
3555 else
3556 return true;
Jim Inghambed67792016-07-07 18:25:48 +00003557}
3558
Kate Stoneb9c1b512016-09-06 20:57:50 +00003559void TargetProperties::SetInjectLocalVariables(ExecutionContext *exe_ctx,
3560 bool b) {
3561 const Property *exp_property =
3562 m_collection_sp->GetPropertyAtIndex(exe_ctx, true, ePropertyExperimental);
3563 OptionValueProperties *exp_values =
3564 exp_property->GetValue()->GetAsProperties();
3565 if (exp_values)
3566 exp_values->SetPropertyAtIndexAsBoolean(exe_ctx, ePropertyInjectLocalVars,
3567 true);
Jim Inghambed67792016-07-07 18:25:48 +00003568}
3569
Sean Callanan68e44232017-09-28 20:20:25 +00003570bool TargetProperties::GetUseModernTypeLookup() const {
3571 const Property *exp_property = m_collection_sp->GetPropertyAtIndex(
3572 nullptr, false, ePropertyExperimental);
3573 OptionValueProperties *exp_values =
3574 exp_property->GetValue()->GetAsProperties();
3575 if (exp_values)
3576 return exp_values->GetPropertyAtIndexAsBoolean(
3577 nullptr, ePropertyUseModernTypeLookup, true);
3578 else
3579 return true;
3580}
3581
Kate Stoneb9c1b512016-09-06 20:57:50 +00003582ArchSpec TargetProperties::GetDefaultArchitecture() const {
3583 OptionValueArch *value = m_collection_sp->GetPropertyAtIndexAsOptionValueArch(
3584 nullptr, ePropertyDefaultArch);
3585 if (value)
3586 return value->GetCurrentValue();
3587 return ArchSpec();
Greg Clayton67cc0632012-08-22 17:17:09 +00003588}
3589
Kate Stoneb9c1b512016-09-06 20:57:50 +00003590void TargetProperties::SetDefaultArchitecture(const ArchSpec &arch) {
3591 OptionValueArch *value = m_collection_sp->GetPropertyAtIndexAsOptionValueArch(
3592 nullptr, ePropertyDefaultArch);
3593 if (value)
3594 return value->SetCurrentValue(arch, true);
Greg Clayton67cc0632012-08-22 17:17:09 +00003595}
3596
Kate Stoneb9c1b512016-09-06 20:57:50 +00003597bool TargetProperties::GetMoveToNearestCode() const {
3598 const uint32_t idx = ePropertyMoveToNearestCode;
3599 return m_collection_sp->GetPropertyAtIndexAsBoolean(
Jonas Devliegherea8ea5952019-07-29 16:41:30 +00003600 nullptr, idx, g_target_properties[idx].default_uint_value != 0);
Ilia K055ad9b2015-05-18 13:41:01 +00003601}
3602
Kate Stoneb9c1b512016-09-06 20:57:50 +00003603lldb::DynamicValueType TargetProperties::GetPreferDynamicValue() const {
3604 const uint32_t idx = ePropertyPreferDynamic;
3605 return (lldb::DynamicValueType)
3606 m_collection_sp->GetPropertyAtIndexAsEnumeration(
Jonas Devliegherea8ea5952019-07-29 16:41:30 +00003607 nullptr, idx, g_target_properties[idx].default_uint_value);
Greg Clayton67cc0632012-08-22 17:17:09 +00003608}
3609
Kate Stoneb9c1b512016-09-06 20:57:50 +00003610bool TargetProperties::SetPreferDynamicValue(lldb::DynamicValueType d) {
3611 const uint32_t idx = ePropertyPreferDynamic;
3612 return m_collection_sp->SetPropertyAtIndexAsEnumeration(nullptr, idx, d);
Greg Clayton15484402015-05-15 18:40:24 +00003613}
3614
Jim Ingham7fca8c02017-04-28 00:51:06 +00003615bool TargetProperties::GetPreloadSymbols() const {
3616 const uint32_t idx = ePropertyPreloadSymbols;
3617 return m_collection_sp->GetPropertyAtIndexAsBoolean(
Jonas Devliegherea8ea5952019-07-29 16:41:30 +00003618 nullptr, idx, g_target_properties[idx].default_uint_value != 0);
Jim Ingham7fca8c02017-04-28 00:51:06 +00003619}
3620
3621void TargetProperties::SetPreloadSymbols(bool b) {
3622 const uint32_t idx = ePropertyPreloadSymbols;
3623 m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b);
3624}
3625
Kate Stoneb9c1b512016-09-06 20:57:50 +00003626bool TargetProperties::GetDisableASLR() const {
3627 const uint32_t idx = ePropertyDisableASLR;
3628 return m_collection_sp->GetPropertyAtIndexAsBoolean(
Jonas Devliegherea8ea5952019-07-29 16:41:30 +00003629 nullptr, idx, g_target_properties[idx].default_uint_value != 0);
Greg Clayton67cc0632012-08-22 17:17:09 +00003630}
3631
Kate Stoneb9c1b512016-09-06 20:57:50 +00003632void TargetProperties::SetDisableASLR(bool b) {
3633 const uint32_t idx = ePropertyDisableASLR;
3634 m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b);
Greg Clayton67cc0632012-08-22 17:17:09 +00003635}
3636
Kate Stoneb9c1b512016-09-06 20:57:50 +00003637bool TargetProperties::GetDetachOnError() const {
3638 const uint32_t idx = ePropertyDetachOnError;
3639 return m_collection_sp->GetPropertyAtIndexAsBoolean(
Jonas Devliegherea8ea5952019-07-29 16:41:30 +00003640 nullptr, idx, g_target_properties[idx].default_uint_value != 0);
Jim Ingham106d0282014-06-25 02:32:56 +00003641}
3642
Kate Stoneb9c1b512016-09-06 20:57:50 +00003643void TargetProperties::SetDetachOnError(bool b) {
3644 const uint32_t idx = ePropertyDetachOnError;
3645 m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b);
Jim Ingham106d0282014-06-25 02:32:56 +00003646}
3647
Kate Stoneb9c1b512016-09-06 20:57:50 +00003648bool TargetProperties::GetDisableSTDIO() const {
3649 const uint32_t idx = ePropertyDisableSTDIO;
3650 return m_collection_sp->GetPropertyAtIndexAsBoolean(
Jonas Devliegherea8ea5952019-07-29 16:41:30 +00003651 nullptr, idx, g_target_properties[idx].default_uint_value != 0);
Greg Clayton67cc0632012-08-22 17:17:09 +00003652}
3653
Kate Stoneb9c1b512016-09-06 20:57:50 +00003654void TargetProperties::SetDisableSTDIO(bool b) {
3655 const uint32_t idx = ePropertyDisableSTDIO;
3656 m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b);
Greg Clayton67cc0632012-08-22 17:17:09 +00003657}
3658
Kate Stoneb9c1b512016-09-06 20:57:50 +00003659const char *TargetProperties::GetDisassemblyFlavor() const {
3660 const uint32_t idx = ePropertyDisassemblyFlavor;
3661 const char *return_value;
3662
3663 x86DisassemblyFlavor flavor_value =
3664 (x86DisassemblyFlavor)m_collection_sp->GetPropertyAtIndexAsEnumeration(
Jonas Devliegherea8ea5952019-07-29 16:41:30 +00003665 nullptr, idx, g_target_properties[idx].default_uint_value);
Kate Stoneb9c1b512016-09-06 20:57:50 +00003666 return_value = g_x86_dis_flavor_value_types[flavor_value].string_value;
3667 return return_value;
Jim Ingham0f063ba2013-03-02 00:26:47 +00003668}
3669
Kate Stoneb9c1b512016-09-06 20:57:50 +00003670InlineStrategy TargetProperties::GetInlineStrategy() const {
3671 const uint32_t idx = ePropertyInlineStrategy;
3672 return (InlineStrategy)m_collection_sp->GetPropertyAtIndexAsEnumeration(
Jonas Devliegherea8ea5952019-07-29 16:41:30 +00003673 nullptr, idx, g_target_properties[idx].default_uint_value);
Greg Clayton1f746072012-08-29 21:13:06 +00003674}
3675
Zachary Turner31d97a52016-11-17 18:08:12 +00003676llvm::StringRef TargetProperties::GetArg0() const {
Kate Stoneb9c1b512016-09-06 20:57:50 +00003677 const uint32_t idx = ePropertyArg0;
Jonas Devlieghered3607752019-07-19 00:56:26 +00003678 return m_collection_sp->GetPropertyAtIndexAsString(nullptr, idx,
3679 llvm::StringRef());
Greg Clayton45392552012-10-17 22:57:12 +00003680}
3681
Zachary Turner31d97a52016-11-17 18:08:12 +00003682void TargetProperties::SetArg0(llvm::StringRef arg) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00003683 const uint32_t idx = ePropertyArg0;
Jonas Devlieghered3607752019-07-19 00:56:26 +00003684 m_collection_sp->SetPropertyAtIndexAsString(nullptr, idx, arg);
Kate Stoneb9c1b512016-09-06 20:57:50 +00003685 m_launch_info.SetArg0(arg);
Greg Clayton45392552012-10-17 22:57:12 +00003686}
3687
Kate Stoneb9c1b512016-09-06 20:57:50 +00003688bool TargetProperties::GetRunArguments(Args &args) const {
3689 const uint32_t idx = ePropertyRunArgs;
3690 return m_collection_sp->GetPropertyAtIndexAsArgs(nullptr, idx, args);
Greg Clayton67cc0632012-08-22 17:17:09 +00003691}
3692
Kate Stoneb9c1b512016-09-06 20:57:50 +00003693void TargetProperties::SetRunArguments(const Args &args) {
3694 const uint32_t idx = ePropertyRunArgs;
3695 m_collection_sp->SetPropertyAtIndexFromArgs(nullptr, idx, args);
3696 m_launch_info.GetArguments() = args;
Greg Clayton67cc0632012-08-22 17:17:09 +00003697}
3698
Pavel Labath62930e52018-01-10 11:57:31 +00003699Environment TargetProperties::GetEnvironment() const {
3700 // TODO: Get rid of the Args intermediate step
3701 Args env;
Kate Stoneb9c1b512016-09-06 20:57:50 +00003702 const uint32_t idx = ePropertyEnvVars;
Pavel Labath62930e52018-01-10 11:57:31 +00003703 m_collection_sp->GetPropertyAtIndexAsArgs(nullptr, idx, env);
3704 return Environment(env);
Greg Clayton67cc0632012-08-22 17:17:09 +00003705}
3706
Pavel Labath62930e52018-01-10 11:57:31 +00003707void TargetProperties::SetEnvironment(Environment env) {
3708 // TODO: Get rid of the Args intermediate step
Kate Stoneb9c1b512016-09-06 20:57:50 +00003709 const uint32_t idx = ePropertyEnvVars;
Pavel Labath62930e52018-01-10 11:57:31 +00003710 m_collection_sp->SetPropertyAtIndexFromArgs(nullptr, idx, Args(env));
3711 m_launch_info.GetEnvironment() = std::move(env);
Ilia K8f37ca52015-02-13 14:31:06 +00003712}
3713
Kate Stoneb9c1b512016-09-06 20:57:50 +00003714bool TargetProperties::GetSkipPrologue() const {
3715 const uint32_t idx = ePropertySkipPrologue;
3716 return m_collection_sp->GetPropertyAtIndexAsBoolean(
Jonas Devliegherea8ea5952019-07-29 16:41:30 +00003717 nullptr, idx, g_target_properties[idx].default_uint_value != 0);
Greg Clayton67cc0632012-08-22 17:17:09 +00003718}
3719
Kate Stoneb9c1b512016-09-06 20:57:50 +00003720PathMappingList &TargetProperties::GetSourcePathMap() const {
3721 const uint32_t idx = ePropertySourceMap;
3722 OptionValuePathMappings *option_value =
3723 m_collection_sp->GetPropertyAtIndexAsOptionValuePathMappings(nullptr,
3724 false, idx);
3725 assert(option_value);
3726 return option_value->GetCurrentValue();
Greg Clayton67cc0632012-08-22 17:17:09 +00003727}
3728
Jonas Devlieghered3607752019-07-19 00:56:26 +00003729void TargetProperties::AppendExecutableSearchPaths(const FileSpec &dir) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00003730 const uint32_t idx = ePropertyExecutableSearchPaths;
3731 OptionValueFileSpecList *option_value =
3732 m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList(nullptr,
3733 false, idx);
3734 assert(option_value);
Frederic Rissacbf0052019-04-23 20:17:04 +00003735 option_value->AppendCurrentValue(dir);
Greg Clayton67cc0632012-08-22 17:17:09 +00003736}
3737
Frederic Rissacbf0052019-04-23 20:17:04 +00003738FileSpecList TargetProperties::GetExecutableSearchPaths() {
3739 const uint32_t idx = ePropertyExecutableSearchPaths;
3740 const OptionValueFileSpecList *option_value =
Kate Stoneb9c1b512016-09-06 20:57:50 +00003741 m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList(nullptr,
3742 false, idx);
3743 assert(option_value);
3744 return option_value->GetCurrentValue();
Michael Sartaina7499c92013-07-01 19:45:50 +00003745}
3746
Frederic Rissacbf0052019-04-23 20:17:04 +00003747FileSpecList TargetProperties::GetDebugFileSearchPaths() {
3748 const uint32_t idx = ePropertyDebugFileSearchPaths;
3749 const OptionValueFileSpecList *option_value =
3750 m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList(nullptr,
3751 false, idx);
3752 assert(option_value);
3753 return option_value->GetCurrentValue();
3754}
3755
3756FileSpecList TargetProperties::GetClangModuleSearchPaths() {
Kate Stoneb9c1b512016-09-06 20:57:50 +00003757 const uint32_t idx = ePropertyClangModuleSearchPaths;
Frederic Rissacbf0052019-04-23 20:17:04 +00003758 const OptionValueFileSpecList *option_value =
Kate Stoneb9c1b512016-09-06 20:57:50 +00003759 m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList(nullptr,
3760 false, idx);
3761 assert(option_value);
3762 return option_value->GetCurrentValue();
Sean Callanan85054342015-04-03 15:39:47 +00003763}
3764
Kate Stoneb9c1b512016-09-06 20:57:50 +00003765bool TargetProperties::GetEnableAutoImportClangModules() const {
3766 const uint32_t idx = ePropertyAutoImportClangModules;
3767 return m_collection_sp->GetPropertyAtIndexAsBoolean(
Jonas Devliegherea8ea5952019-07-29 16:41:30 +00003768 nullptr, idx, g_target_properties[idx].default_uint_value != 0);
Sean Callananf0c5aeb2015-04-20 16:31:29 +00003769}
3770
Raphael Isemann6c0bbfc2019-03-12 17:09:33 +00003771bool TargetProperties::GetEnableImportStdModule() const {
3772 const uint32_t idx = ePropertyImportStdModule;
3773 return m_collection_sp->GetPropertyAtIndexAsBoolean(
Jonas Devliegherea8ea5952019-07-29 16:41:30 +00003774 nullptr, idx, g_target_properties[idx].default_uint_value != 0);
Raphael Isemann6c0bbfc2019-03-12 17:09:33 +00003775}
3776
Kate Stoneb9c1b512016-09-06 20:57:50 +00003777bool TargetProperties::GetEnableAutoApplyFixIts() const {
3778 const uint32_t idx = ePropertyAutoApplyFixIts;
3779 return m_collection_sp->GetPropertyAtIndexAsBoolean(
Jonas Devliegherea8ea5952019-07-29 16:41:30 +00003780 nullptr, idx, g_target_properties[idx].default_uint_value != 0);
Jim Inghama1e541b2016-03-25 01:57:14 +00003781}
3782
Kate Stoneb9c1b512016-09-06 20:57:50 +00003783bool TargetProperties::GetEnableNotifyAboutFixIts() const {
3784 const uint32_t idx = ePropertyNotifyAboutFixIts;
3785 return m_collection_sp->GetPropertyAtIndexAsBoolean(
Jonas Devliegherea8ea5952019-07-29 16:41:30 +00003786 nullptr, idx, g_target_properties[idx].default_uint_value != 0);
Jim Inghame5ee6f02016-03-29 22:00:08 +00003787}
3788
Sean Callanan5deb06e2016-09-26 20:18:51 +00003789bool TargetProperties::GetEnableSaveObjects() const {
3790 const uint32_t idx = ePropertySaveObjects;
3791 return m_collection_sp->GetPropertyAtIndexAsBoolean(
Jonas Devliegherea8ea5952019-07-29 16:41:30 +00003792 nullptr, idx, g_target_properties[idx].default_uint_value != 0);
Sean Callanan5deb06e2016-09-26 20:18:51 +00003793}
3794
Kate Stoneb9c1b512016-09-06 20:57:50 +00003795bool TargetProperties::GetEnableSyntheticValue() const {
3796 const uint32_t idx = ePropertyEnableSynthetic;
3797 return m_collection_sp->GetPropertyAtIndexAsBoolean(
Jonas Devliegherea8ea5952019-07-29 16:41:30 +00003798 nullptr, idx, g_target_properties[idx].default_uint_value != 0);
Greg Clayton67cc0632012-08-22 17:17:09 +00003799}
3800
Kate Stoneb9c1b512016-09-06 20:57:50 +00003801uint32_t TargetProperties::GetMaximumNumberOfChildrenToDisplay() const {
3802 const uint32_t idx = ePropertyMaxChildrenCount;
3803 return m_collection_sp->GetPropertyAtIndexAsSInt64(
Jonas Devliegherea8ea5952019-07-29 16:41:30 +00003804 nullptr, idx, g_target_properties[idx].default_uint_value);
Greg Clayton67cc0632012-08-22 17:17:09 +00003805}
3806
Kate Stoneb9c1b512016-09-06 20:57:50 +00003807uint32_t TargetProperties::GetMaximumSizeOfStringSummary() const {
3808 const uint32_t idx = ePropertyMaxSummaryLength;
3809 return m_collection_sp->GetPropertyAtIndexAsSInt64(
Jonas Devliegherea8ea5952019-07-29 16:41:30 +00003810 nullptr, idx, g_target_properties[idx].default_uint_value);
Greg Clayton67cc0632012-08-22 17:17:09 +00003811}
3812
Kate Stoneb9c1b512016-09-06 20:57:50 +00003813uint32_t TargetProperties::GetMaximumMemReadSize() const {
3814 const uint32_t idx = ePropertyMaxMemReadSize;
3815 return m_collection_sp->GetPropertyAtIndexAsSInt64(
Jonas Devliegherea8ea5952019-07-29 16:41:30 +00003816 nullptr, idx, g_target_properties[idx].default_uint_value);
Enrico Granatad325bf92013-06-04 22:54:16 +00003817}
3818
Kate Stoneb9c1b512016-09-06 20:57:50 +00003819FileSpec TargetProperties::GetStandardInputPath() const {
3820 const uint32_t idx = ePropertyInputPath;
3821 return m_collection_sp->GetPropertyAtIndexAsFileSpec(nullptr, idx);
Greg Clayton67cc0632012-08-22 17:17:09 +00003822}
3823
Zachary Turner27a5c2b2016-09-23 22:11:51 +00003824void TargetProperties::SetStandardInputPath(llvm::StringRef path) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00003825 const uint32_t idx = ePropertyInputPath;
Zachary Turner27a5c2b2016-09-23 22:11:51 +00003826 m_collection_sp->SetPropertyAtIndexAsString(nullptr, idx, path);
Greg Clayton67cc0632012-08-22 17:17:09 +00003827}
3828
Kate Stoneb9c1b512016-09-06 20:57:50 +00003829FileSpec TargetProperties::GetStandardOutputPath() const {
3830 const uint32_t idx = ePropertyOutputPath;
3831 return m_collection_sp->GetPropertyAtIndexAsFileSpec(nullptr, idx);
Greg Clayton67cc0632012-08-22 17:17:09 +00003832}
3833
Zachary Turner27a5c2b2016-09-23 22:11:51 +00003834void TargetProperties::SetStandardOutputPath(llvm::StringRef path) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00003835 const uint32_t idx = ePropertyOutputPath;
Zachary Turner27a5c2b2016-09-23 22:11:51 +00003836 m_collection_sp->SetPropertyAtIndexAsString(nullptr, idx, path);
Greg Clayton67cc0632012-08-22 17:17:09 +00003837}
3838
Kate Stoneb9c1b512016-09-06 20:57:50 +00003839FileSpec TargetProperties::GetStandardErrorPath() const {
3840 const uint32_t idx = ePropertyErrorPath;
3841 return m_collection_sp->GetPropertyAtIndexAsFileSpec(nullptr, idx);
Greg Clayton67cc0632012-08-22 17:17:09 +00003842}
3843
Zachary Turner27a5c2b2016-09-23 22:11:51 +00003844void TargetProperties::SetStandardErrorPath(llvm::StringRef path) {
3845 const uint32_t idx = ePropertyErrorPath;
3846 m_collection_sp->SetPropertyAtIndexAsString(nullptr, idx, path);
3847}
3848
Kate Stoneb9c1b512016-09-06 20:57:50 +00003849LanguageType TargetProperties::GetLanguage() const {
3850 OptionValueLanguage *value =
3851 m_collection_sp->GetPropertyAtIndexAsOptionValueLanguage(
3852 nullptr, ePropertyLanguage);
3853 if (value)
3854 return value->GetCurrentValue();
3855 return LanguageType();
Dawn Perchik23b1dec2015-07-21 22:05:07 +00003856}
3857
Pavel Labath50251fc2017-12-21 10:54:30 +00003858llvm::StringRef TargetProperties::GetExpressionPrefixContents() {
Kate Stoneb9c1b512016-09-06 20:57:50 +00003859 const uint32_t idx = ePropertyExprPrefix;
3860 OptionValueFileSpec *file =
3861 m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpec(nullptr, false,
3862 idx);
3863 if (file) {
Pavel Labath50251fc2017-12-21 10:54:30 +00003864 DataBufferSP data_sp(file->GetFileContents());
Kate Stoneb9c1b512016-09-06 20:57:50 +00003865 if (data_sp)
Pavel Labath50251fc2017-12-21 10:54:30 +00003866 return llvm::StringRef(
3867 reinterpret_cast<const char *>(data_sp->GetBytes()),
3868 data_sp->GetByteSize());
Kate Stoneb9c1b512016-09-06 20:57:50 +00003869 }
Pavel Labath50251fc2017-12-21 10:54:30 +00003870 return "";
Greg Clayton6920b522012-08-22 18:39:03 +00003871}
3872
Kate Stoneb9c1b512016-09-06 20:57:50 +00003873bool TargetProperties::GetBreakpointsConsultPlatformAvoidList() {
3874 const uint32_t idx = ePropertyBreakpointUseAvoidList;
3875 return m_collection_sp->GetPropertyAtIndexAsBoolean(
Jonas Devliegherea8ea5952019-07-29 16:41:30 +00003876 nullptr, idx, g_target_properties[idx].default_uint_value != 0);
Greg Clayton67cc0632012-08-22 17:17:09 +00003877}
3878
Kate Stoneb9c1b512016-09-06 20:57:50 +00003879bool TargetProperties::GetUseHexImmediates() const {
3880 const uint32_t idx = ePropertyUseHexImmediates;
3881 return m_collection_sp->GetPropertyAtIndexAsBoolean(
Jonas Devliegherea8ea5952019-07-29 16:41:30 +00003882 nullptr, idx, g_target_properties[idx].default_uint_value != 0);
Daniel Malead79ae052013-08-07 21:54:09 +00003883}
3884
Kate Stoneb9c1b512016-09-06 20:57:50 +00003885bool TargetProperties::GetUseFastStepping() const {
3886 const uint32_t idx = ePropertyUseFastStepping;
3887 return m_collection_sp->GetPropertyAtIndexAsBoolean(
Jonas Devliegherea8ea5952019-07-29 16:41:30 +00003888 nullptr, idx, g_target_properties[idx].default_uint_value != 0);
Jim Ingham17d023f2013-03-13 17:58:04 +00003889}
3890
Kate Stoneb9c1b512016-09-06 20:57:50 +00003891bool TargetProperties::GetDisplayExpressionsInCrashlogs() const {
3892 const uint32_t idx = ePropertyDisplayExpressionsInCrashlogs;
3893 return m_collection_sp->GetPropertyAtIndexAsBoolean(
Jonas Devliegherea8ea5952019-07-29 16:41:30 +00003894 nullptr, idx, g_target_properties[idx].default_uint_value != 0);
Greg Claytonfb6621e2013-12-06 21:59:52 +00003895}
3896
Kate Stoneb9c1b512016-09-06 20:57:50 +00003897LoadScriptFromSymFile TargetProperties::GetLoadScriptFromSymbolFile() const {
3898 const uint32_t idx = ePropertyLoadScriptFromSymbolFile;
3899 return (LoadScriptFromSymFile)
3900 m_collection_sp->GetPropertyAtIndexAsEnumeration(
Jonas Devliegherea8ea5952019-07-29 16:41:30 +00003901 nullptr, idx, g_target_properties[idx].default_uint_value);
Enrico Granata2ea43cd2013-05-13 17:03:52 +00003902}
3903
Kate Stoneb9c1b512016-09-06 20:57:50 +00003904LoadCWDlldbinitFile TargetProperties::GetLoadCWDlldbinitFile() const {
3905 const uint32_t idx = ePropertyLoadCWDlldbinitFile;
3906 return (LoadCWDlldbinitFile)m_collection_sp->GetPropertyAtIndexAsEnumeration(
Jonas Devliegherea8ea5952019-07-29 16:41:30 +00003907 nullptr, idx, g_target_properties[idx].default_uint_value);
Jason Molenda878ae012016-02-19 00:05:17 +00003908}
3909
Kate Stoneb9c1b512016-09-06 20:57:50 +00003910Disassembler::HexImmediateStyle TargetProperties::GetHexImmediateStyle() const {
3911 const uint32_t idx = ePropertyHexImmediateStyle;
3912 return (Disassembler::HexImmediateStyle)
3913 m_collection_sp->GetPropertyAtIndexAsEnumeration(
Jonas Devliegherea8ea5952019-07-29 16:41:30 +00003914 nullptr, idx, g_target_properties[idx].default_uint_value);
Daniel Malead79ae052013-08-07 21:54:09 +00003915}
3916
Kate Stoneb9c1b512016-09-06 20:57:50 +00003917MemoryModuleLoadLevel TargetProperties::GetMemoryModuleLoadLevel() const {
3918 const uint32_t idx = ePropertyMemoryModuleLoadLevel;
3919 return (MemoryModuleLoadLevel)
3920 m_collection_sp->GetPropertyAtIndexAsEnumeration(
Jonas Devliegherea8ea5952019-07-29 16:41:30 +00003921 nullptr, idx, g_target_properties[idx].default_uint_value);
Greg Claytonfd814c52013-08-13 01:42:25 +00003922}
3923
Kate Stoneb9c1b512016-09-06 20:57:50 +00003924bool TargetProperties::GetUserSpecifiedTrapHandlerNames(Args &args) const {
3925 const uint32_t idx = ePropertyTrapHandlerNames;
3926 return m_collection_sp->GetPropertyAtIndexAsArgs(nullptr, idx, args);
Jason Molendaa4bea722014-02-14 05:06:49 +00003927}
Greg Claytonfd814c52013-08-13 01:42:25 +00003928
Kate Stoneb9c1b512016-09-06 20:57:50 +00003929void TargetProperties::SetUserSpecifiedTrapHandlerNames(const Args &args) {
3930 const uint32_t idx = ePropertyTrapHandlerNames;
3931 m_collection_sp->SetPropertyAtIndexFromArgs(nullptr, idx, args);
Jason Molendaa4bea722014-02-14 05:06:49 +00003932}
Greg Clayton67cc0632012-08-22 17:17:09 +00003933
Kate Stoneb9c1b512016-09-06 20:57:50 +00003934bool TargetProperties::GetDisplayRuntimeSupportValues() const {
3935 const uint32_t idx = ePropertyDisplayRuntimeSupportValues;
3936 return m_collection_sp->GetPropertyAtIndexAsBoolean(nullptr, idx, false);
Enrico Granata560558e2015-02-11 02:35:39 +00003937}
3938
Kate Stoneb9c1b512016-09-06 20:57:50 +00003939void TargetProperties::SetDisplayRuntimeSupportValues(bool b) {
3940 const uint32_t idx = ePropertyDisplayRuntimeSupportValues;
3941 m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b);
Enrico Granata560558e2015-02-11 02:35:39 +00003942}
3943
Kuba Mracek4c7f5d52018-12-20 23:38:19 +00003944bool TargetProperties::GetDisplayRecognizedArguments() const {
3945 const uint32_t idx = ePropertyDisplayRecognizedArguments;
3946 return m_collection_sp->GetPropertyAtIndexAsBoolean(nullptr, idx, false);
3947}
3948
3949void TargetProperties::SetDisplayRecognizedArguments(bool b) {
3950 const uint32_t idx = ePropertyDisplayRecognizedArguments;
3951 m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b);
3952}
3953
Kate Stoneb9c1b512016-09-06 20:57:50 +00003954bool TargetProperties::GetNonStopModeEnabled() const {
3955 const uint32_t idx = ePropertyNonStopModeEnabled;
3956 return m_collection_sp->GetPropertyAtIndexAsBoolean(nullptr, idx, false);
Ewan Crawford78baa192015-05-13 09:18:18 +00003957}
3958
Kate Stoneb9c1b512016-09-06 20:57:50 +00003959void TargetProperties::SetNonStopModeEnabled(bool b) {
3960 const uint32_t idx = ePropertyNonStopModeEnabled;
3961 m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b);
Ewan Crawfordaa7eda72015-06-24 15:14:26 +00003962}
3963
Kate Stoneb9c1b512016-09-06 20:57:50 +00003964const ProcessLaunchInfo &TargetProperties::GetProcessLaunchInfo() {
3965 m_launch_info.SetArg0(GetArg0()); // FIXME: Arg0 callback doesn't work
3966 return m_launch_info;
Ilia K8f37ca52015-02-13 14:31:06 +00003967}
3968
Kate Stoneb9c1b512016-09-06 20:57:50 +00003969void TargetProperties::SetProcessLaunchInfo(
3970 const ProcessLaunchInfo &launch_info) {
3971 m_launch_info = launch_info;
3972 SetArg0(launch_info.GetArg0());
3973 SetRunArguments(launch_info.GetArguments());
Pavel Labath62930e52018-01-10 11:57:31 +00003974 SetEnvironment(launch_info.GetEnvironment());
Kate Stoneb9c1b512016-09-06 20:57:50 +00003975 const FileAction *input_file_action =
3976 launch_info.GetFileActionForFD(STDIN_FILENO);
3977 if (input_file_action) {
Zachary Turner27a5c2b2016-09-23 22:11:51 +00003978 SetStandardInputPath(input_file_action->GetPath());
Kate Stoneb9c1b512016-09-06 20:57:50 +00003979 }
3980 const FileAction *output_file_action =
3981 launch_info.GetFileActionForFD(STDOUT_FILENO);
3982 if (output_file_action) {
Zachary Turner27a5c2b2016-09-23 22:11:51 +00003983 SetStandardOutputPath(output_file_action->GetPath());
Kate Stoneb9c1b512016-09-06 20:57:50 +00003984 }
3985 const FileAction *error_file_action =
3986 launch_info.GetFileActionForFD(STDERR_FILENO);
3987 if (error_file_action) {
Zachary Turner27a5c2b2016-09-23 22:11:51 +00003988 SetStandardErrorPath(error_file_action->GetPath());
Kate Stoneb9c1b512016-09-06 20:57:50 +00003989 }
3990 SetDetachOnError(launch_info.GetFlags().Test(lldb::eLaunchFlagDetachOnError));
3991 SetDisableASLR(launch_info.GetFlags().Test(lldb::eLaunchFlagDisableASLR));
3992 SetDisableSTDIO(launch_info.GetFlags().Test(lldb::eLaunchFlagDisableSTDIO));
Ilia K8f37ca52015-02-13 14:31:06 +00003993}
3994
Jonas Devliegheree103ae92018-11-15 01:18:15 +00003995bool TargetProperties::GetRequireHardwareBreakpoints() const {
3996 const uint32_t idx = ePropertyRequireHardwareBreakpoints;
3997 return m_collection_sp->GetPropertyAtIndexAsBoolean(
Jonas Devliegherea8ea5952019-07-29 16:41:30 +00003998 nullptr, idx, g_target_properties[idx].default_uint_value != 0);
Jonas Devliegheree103ae92018-11-15 01:18:15 +00003999}
4000
4001void TargetProperties::SetRequireHardwareBreakpoints(bool b) {
4002 const uint32_t idx = ePropertyRequireHardwareBreakpoints;
4003 m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b);
4004}
4005
Kate Stoneb9c1b512016-09-06 20:57:50 +00004006void TargetProperties::Arg0ValueChangedCallback(void *target_property_ptr,
4007 OptionValue *) {
4008 TargetProperties *this_ =
4009 reinterpret_cast<TargetProperties *>(target_property_ptr);
4010 this_->m_launch_info.SetArg0(this_->GetArg0());
Ilia K8f37ca52015-02-13 14:31:06 +00004011}
4012
Kate Stoneb9c1b512016-09-06 20:57:50 +00004013void TargetProperties::RunArgsValueChangedCallback(void *target_property_ptr,
4014 OptionValue *) {
4015 TargetProperties *this_ =
4016 reinterpret_cast<TargetProperties *>(target_property_ptr);
4017 Args args;
4018 if (this_->GetRunArguments(args))
4019 this_->m_launch_info.GetArguments() = args;
Ilia K8f37ca52015-02-13 14:31:06 +00004020}
4021
Kate Stoneb9c1b512016-09-06 20:57:50 +00004022void TargetProperties::EnvVarsValueChangedCallback(void *target_property_ptr,
4023 OptionValue *) {
4024 TargetProperties *this_ =
4025 reinterpret_cast<TargetProperties *>(target_property_ptr);
Pavel Labath62930e52018-01-10 11:57:31 +00004026 this_->m_launch_info.GetEnvironment() = this_->GetEnvironment();
Ilia K8f37ca52015-02-13 14:31:06 +00004027}
4028
Kate Stoneb9c1b512016-09-06 20:57:50 +00004029void TargetProperties::InputPathValueChangedCallback(void *target_property_ptr,
4030 OptionValue *) {
4031 TargetProperties *this_ =
4032 reinterpret_cast<TargetProperties *>(target_property_ptr);
4033 this_->m_launch_info.AppendOpenFileAction(
4034 STDIN_FILENO, this_->GetStandardInputPath(), true, false);
Ilia K8f37ca52015-02-13 14:31:06 +00004035}
4036
Kate Stoneb9c1b512016-09-06 20:57:50 +00004037void TargetProperties::OutputPathValueChangedCallback(void *target_property_ptr,
4038 OptionValue *) {
4039 TargetProperties *this_ =
4040 reinterpret_cast<TargetProperties *>(target_property_ptr);
4041 this_->m_launch_info.AppendOpenFileAction(
4042 STDOUT_FILENO, this_->GetStandardOutputPath(), false, true);
Ilia K8f37ca52015-02-13 14:31:06 +00004043}
4044
Kate Stoneb9c1b512016-09-06 20:57:50 +00004045void TargetProperties::ErrorPathValueChangedCallback(void *target_property_ptr,
4046 OptionValue *) {
4047 TargetProperties *this_ =
4048 reinterpret_cast<TargetProperties *>(target_property_ptr);
4049 this_->m_launch_info.AppendOpenFileAction(
4050 STDERR_FILENO, this_->GetStandardErrorPath(), false, true);
Ilia K8f37ca52015-02-13 14:31:06 +00004051}
4052
Kate Stoneb9c1b512016-09-06 20:57:50 +00004053void TargetProperties::DetachOnErrorValueChangedCallback(
4054 void *target_property_ptr, OptionValue *) {
4055 TargetProperties *this_ =
4056 reinterpret_cast<TargetProperties *>(target_property_ptr);
4057 if (this_->GetDetachOnError())
4058 this_->m_launch_info.GetFlags().Set(lldb::eLaunchFlagDetachOnError);
4059 else
4060 this_->m_launch_info.GetFlags().Clear(lldb::eLaunchFlagDetachOnError);
Ilia K8f37ca52015-02-13 14:31:06 +00004061}
4062
Kate Stoneb9c1b512016-09-06 20:57:50 +00004063void TargetProperties::DisableASLRValueChangedCallback(
4064 void *target_property_ptr, OptionValue *) {
4065 TargetProperties *this_ =
4066 reinterpret_cast<TargetProperties *>(target_property_ptr);
4067 if (this_->GetDisableASLR())
4068 this_->m_launch_info.GetFlags().Set(lldb::eLaunchFlagDisableASLR);
4069 else
4070 this_->m_launch_info.GetFlags().Clear(lldb::eLaunchFlagDisableASLR);
Ilia K8f37ca52015-02-13 14:31:06 +00004071}
4072
Kate Stoneb9c1b512016-09-06 20:57:50 +00004073void TargetProperties::DisableSTDIOValueChangedCallback(
4074 void *target_property_ptr, OptionValue *) {
4075 TargetProperties *this_ =
4076 reinterpret_cast<TargetProperties *>(target_property_ptr);
4077 if (this_->GetDisableSTDIO())
4078 this_->m_launch_info.GetFlags().Set(lldb::eLaunchFlagDisableSTDIO);
4079 else
4080 this_->m_launch_info.GetFlags().Clear(lldb::eLaunchFlagDisableSTDIO);
Ilia K8f37ca52015-02-13 14:31:06 +00004081}
Ilia Keb2c19a2015-03-10 21:59:55 +00004082
Ilia Keb2c19a2015-03-10 21:59:55 +00004083// Target::TargetEventData
Ilia Keb2c19a2015-03-10 21:59:55 +00004084
Kate Stoneb9c1b512016-09-06 20:57:50 +00004085Target::TargetEventData::TargetEventData(const lldb::TargetSP &target_sp)
4086 : EventData(), m_target_sp(target_sp), m_module_list() {}
Ilia Keb2c19a2015-03-10 21:59:55 +00004087
Kate Stoneb9c1b512016-09-06 20:57:50 +00004088Target::TargetEventData::TargetEventData(const lldb::TargetSP &target_sp,
4089 const ModuleList &module_list)
4090 : EventData(), m_target_sp(target_sp), m_module_list(module_list) {}
Ilia Keb2c19a2015-03-10 21:59:55 +00004091
Eugene Zelenko8f30a652015-10-23 18:39:37 +00004092Target::TargetEventData::~TargetEventData() = default;
Ilia Keb2c19a2015-03-10 21:59:55 +00004093
Adrian Prantl0e4c4822019-03-06 21:22:25 +00004094ConstString Target::TargetEventData::GetFlavorString() {
Kate Stoneb9c1b512016-09-06 20:57:50 +00004095 static ConstString g_flavor("Target::TargetEventData");
4096 return g_flavor;
Ilia Keb2c19a2015-03-10 21:59:55 +00004097}
4098
Kate Stoneb9c1b512016-09-06 20:57:50 +00004099void Target::TargetEventData::Dump(Stream *s) const {
4100 for (size_t i = 0; i < m_module_list.GetSize(); ++i) {
4101 if (i != 0)
4102 *s << ", ";
4103 m_module_list.GetModuleAtIndex(i)->GetDescription(
4104 s, lldb::eDescriptionLevelBrief);
4105 }
Ilia Keb2c19a2015-03-10 21:59:55 +00004106}
4107
4108const Target::TargetEventData *
Kate Stoneb9c1b512016-09-06 20:57:50 +00004109Target::TargetEventData::GetEventDataFromEvent(const Event *event_ptr) {
4110 if (event_ptr) {
4111 const EventData *event_data = event_ptr->GetData();
4112 if (event_data &&
4113 event_data->GetFlavor() == TargetEventData::GetFlavorString())
4114 return static_cast<const TargetEventData *>(event_ptr->GetData());
4115 }
4116 return nullptr;
Ilia Keb2c19a2015-03-10 21:59:55 +00004117}
4118
Kate Stoneb9c1b512016-09-06 20:57:50 +00004119TargetSP Target::TargetEventData::GetTargetFromEvent(const Event *event_ptr) {
4120 TargetSP target_sp;
4121 const TargetEventData *event_data = GetEventDataFromEvent(event_ptr);
4122 if (event_data)
4123 target_sp = event_data->m_target_sp;
4124 return target_sp;
Ilia Keb2c19a2015-03-10 21:59:55 +00004125}
4126
4127ModuleList
Kate Stoneb9c1b512016-09-06 20:57:50 +00004128Target::TargetEventData::GetModuleListFromEvent(const Event *event_ptr) {
4129 ModuleList module_list;
4130 const TargetEventData *event_data = GetEventDataFromEvent(event_ptr);
4131 if (event_data)
4132 module_list = event_data->m_module_list;
4133 return module_list;
Ilia Keb2c19a2015-03-10 21:59:55 +00004134}