1 //===-- PluginManager.cpp -------------------------------------------------===// 2 // 3 // 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 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "lldb/Core/PluginManager.h" 10 11 #include "lldb/Core/Debugger.h" 12 #include "lldb/Host/FileSystem.h" 13 #include "lldb/Host/HostInfo.h" 14 #include "lldb/Interpreter/OptionValueProperties.h" 15 #include "lldb/Symbol/SaveCoreOptions.h" 16 #include "lldb/Target/Process.h" 17 #include "lldb/Utility/FileSpec.h" 18 #include "lldb/Utility/Status.h" 19 #include "lldb/Utility/StringList.h" 20 #include "llvm/ADT/StringRef.h" 21 #include "llvm/Support/DynamicLibrary.h" 22 #include "llvm/Support/FileSystem.h" 23 #include "llvm/Support/raw_ostream.h" 24 #include <cassert> 25 #include <map> 26 #include <memory> 27 #include <mutex> 28 #include <string> 29 #include <utility> 30 #include <vector> 31 #if defined(_WIN32) 32 #include "lldb/Host/windows/PosixApi.h" 33 #endif 34 35 using namespace lldb; 36 using namespace lldb_private; 37 38 typedef bool (*PluginInitCallback)(); 39 typedef void (*PluginTermCallback)(); 40 41 struct PluginInfo { 42 PluginInfo() = default; 43 44 llvm::sys::DynamicLibrary library; 45 PluginInitCallback plugin_init_callback = nullptr; 46 PluginTermCallback plugin_term_callback = nullptr; 47 }; 48 49 typedef std::map<FileSpec, PluginInfo> PluginTerminateMap; 50 51 static std::recursive_mutex &GetPluginMapMutex() { 52 static std::recursive_mutex g_plugin_map_mutex; 53 return g_plugin_map_mutex; 54 } 55 56 static PluginTerminateMap &GetPluginMap() { 57 static PluginTerminateMap g_plugin_map; 58 return g_plugin_map; 59 } 60 61 static bool PluginIsLoaded(const FileSpec &plugin_file_spec) { 62 std::lock_guard<std::recursive_mutex> guard(GetPluginMapMutex()); 63 PluginTerminateMap &plugin_map = GetPluginMap(); 64 return plugin_map.find(plugin_file_spec) != plugin_map.end(); 65 } 66 67 static void SetPluginInfo(const FileSpec &plugin_file_spec, 68 const PluginInfo &plugin_info) { 69 std::lock_guard<std::recursive_mutex> guard(GetPluginMapMutex()); 70 PluginTerminateMap &plugin_map = GetPluginMap(); 71 assert(plugin_map.find(plugin_file_spec) == plugin_map.end()); 72 plugin_map[plugin_file_spec] = plugin_info; 73 } 74 75 template <typename FPtrTy> static FPtrTy CastToFPtr(void *VPtr) { 76 return reinterpret_cast<FPtrTy>(VPtr); 77 } 78 79 static FileSystem::EnumerateDirectoryResult 80 LoadPluginCallback(void *baton, llvm::sys::fs::file_type ft, 81 llvm::StringRef path) { 82 Status error; 83 84 namespace fs = llvm::sys::fs; 85 // If we have a regular file, a symbolic link or unknown file type, try and 86 // process the file. We must handle unknown as sometimes the directory 87 // enumeration might be enumerating a file system that doesn't have correct 88 // file type information. 89 if (ft == fs::file_type::regular_file || ft == fs::file_type::symlink_file || 90 ft == fs::file_type::type_unknown) { 91 FileSpec plugin_file_spec(path); 92 FileSystem::Instance().Resolve(plugin_file_spec); 93 94 if (PluginIsLoaded(plugin_file_spec)) 95 return FileSystem::eEnumerateDirectoryResultNext; 96 else { 97 PluginInfo plugin_info; 98 99 std::string pluginLoadError; 100 plugin_info.library = llvm::sys::DynamicLibrary::getPermanentLibrary( 101 plugin_file_spec.GetPath().c_str(), &pluginLoadError); 102 if (plugin_info.library.isValid()) { 103 bool success = false; 104 plugin_info.plugin_init_callback = CastToFPtr<PluginInitCallback>( 105 plugin_info.library.getAddressOfSymbol("LLDBPluginInitialize")); 106 if (plugin_info.plugin_init_callback) { 107 // Call the plug-in "bool LLDBPluginInitialize(void)" function 108 success = plugin_info.plugin_init_callback(); 109 } 110 111 if (success) { 112 // It is ok for the "LLDBPluginTerminate" symbol to be nullptr 113 plugin_info.plugin_term_callback = CastToFPtr<PluginTermCallback>( 114 plugin_info.library.getAddressOfSymbol("LLDBPluginTerminate")); 115 } else { 116 // The initialize function returned FALSE which means the plug-in 117 // might not be compatible, or might be too new or too old, or might 118 // not want to run on this machine. Set it to a default-constructed 119 // instance to invalidate it. 120 plugin_info = PluginInfo(); 121 } 122 123 // Regardless of success or failure, cache the plug-in load in our 124 // plug-in info so we don't try to load it again and again. 125 SetPluginInfo(plugin_file_spec, plugin_info); 126 127 return FileSystem::eEnumerateDirectoryResultNext; 128 } 129 } 130 } 131 132 if (ft == fs::file_type::directory_file || 133 ft == fs::file_type::symlink_file || ft == fs::file_type::type_unknown) { 134 // Try and recurse into anything that a directory or symbolic link. We must 135 // also do this for unknown as sometimes the directory enumeration might be 136 // enumerating a file system that doesn't have correct file type 137 // information. 138 return FileSystem::eEnumerateDirectoryResultEnter; 139 } 140 141 return FileSystem::eEnumerateDirectoryResultNext; 142 } 143 144 void PluginManager::Initialize() { 145 const bool find_directories = true; 146 const bool find_files = true; 147 const bool find_other = true; 148 char dir_path[PATH_MAX]; 149 if (FileSpec dir_spec = HostInfo::GetSystemPluginDir()) { 150 if (FileSystem::Instance().Exists(dir_spec) && 151 dir_spec.GetPath(dir_path, sizeof(dir_path))) { 152 FileSystem::Instance().EnumerateDirectory(dir_path, find_directories, 153 find_files, find_other, 154 LoadPluginCallback, nullptr); 155 } 156 } 157 158 if (FileSpec dir_spec = HostInfo::GetUserPluginDir()) { 159 if (FileSystem::Instance().Exists(dir_spec) && 160 dir_spec.GetPath(dir_path, sizeof(dir_path))) { 161 FileSystem::Instance().EnumerateDirectory(dir_path, find_directories, 162 find_files, find_other, 163 LoadPluginCallback, nullptr); 164 } 165 } 166 } 167 168 void PluginManager::Terminate() { 169 std::lock_guard<std::recursive_mutex> guard(GetPluginMapMutex()); 170 PluginTerminateMap &plugin_map = GetPluginMap(); 171 172 PluginTerminateMap::const_iterator pos, end = plugin_map.end(); 173 for (pos = plugin_map.begin(); pos != end; ++pos) { 174 // Call the plug-in "void LLDBPluginTerminate (void)" function if there is 175 // one (if the symbol was not nullptr). 176 if (pos->second.library.isValid()) { 177 if (pos->second.plugin_term_callback) 178 pos->second.plugin_term_callback(); 179 } 180 } 181 plugin_map.clear(); 182 } 183 184 template <typename Callback> struct PluginInstance { 185 typedef Callback CallbackType; 186 187 PluginInstance() = default; 188 PluginInstance(llvm::StringRef name, llvm::StringRef description, 189 Callback create_callback, 190 DebuggerInitializeCallback debugger_init_callback = nullptr) 191 : name(name), description(description), create_callback(create_callback), 192 debugger_init_callback(debugger_init_callback) {} 193 194 llvm::StringRef name; 195 llvm::StringRef description; 196 Callback create_callback; 197 DebuggerInitializeCallback debugger_init_callback; 198 }; 199 200 template <typename Instance> class PluginInstances { 201 public: 202 template <typename... Args> 203 bool RegisterPlugin(llvm::StringRef name, llvm::StringRef description, 204 typename Instance::CallbackType callback, 205 Args &&...args) { 206 if (!callback) 207 return false; 208 assert(!name.empty()); 209 Instance instance = 210 Instance(name, description, callback, std::forward<Args>(args)...); 211 m_instances.push_back(instance); 212 return false; 213 } 214 215 bool UnregisterPlugin(typename Instance::CallbackType callback) { 216 if (!callback) 217 return false; 218 auto pos = m_instances.begin(); 219 auto end = m_instances.end(); 220 for (; pos != end; ++pos) { 221 if (pos->create_callback == callback) { 222 m_instances.erase(pos); 223 return true; 224 } 225 } 226 return false; 227 } 228 229 typename Instance::CallbackType GetCallbackAtIndex(uint32_t idx) { 230 if (Instance *instance = GetInstanceAtIndex(idx)) 231 return instance->create_callback; 232 return nullptr; 233 } 234 235 llvm::StringRef GetDescriptionAtIndex(uint32_t idx) { 236 if (Instance *instance = GetInstanceAtIndex(idx)) 237 return instance->description; 238 return ""; 239 } 240 241 llvm::StringRef GetNameAtIndex(uint32_t idx) { 242 if (Instance *instance = GetInstanceAtIndex(idx)) 243 return instance->name; 244 return ""; 245 } 246 247 typename Instance::CallbackType GetCallbackForName(llvm::StringRef name) { 248 if (name.empty()) 249 return nullptr; 250 for (auto &instance : m_instances) { 251 if (name == instance.name) 252 return instance.create_callback; 253 } 254 return nullptr; 255 } 256 257 void PerformDebuggerCallback(Debugger &debugger) { 258 for (auto &instance : m_instances) { 259 if (instance.debugger_init_callback) 260 instance.debugger_init_callback(debugger); 261 } 262 } 263 264 const std::vector<Instance> &GetInstances() const { return m_instances; } 265 std::vector<Instance> &GetInstances() { return m_instances; } 266 267 Instance *GetInstanceAtIndex(uint32_t idx) { 268 if (idx < m_instances.size()) 269 return &m_instances[idx]; 270 return nullptr; 271 } 272 273 private: 274 std::vector<Instance> m_instances; 275 }; 276 277 #pragma mark ABI 278 279 typedef PluginInstance<ABICreateInstance> ABIInstance; 280 typedef PluginInstances<ABIInstance> ABIInstances; 281 282 static ABIInstances &GetABIInstances() { 283 static ABIInstances g_instances; 284 return g_instances; 285 } 286 287 bool PluginManager::RegisterPlugin(llvm::StringRef name, 288 llvm::StringRef description, 289 ABICreateInstance create_callback) { 290 return GetABIInstances().RegisterPlugin(name, description, create_callback); 291 } 292 293 bool PluginManager::UnregisterPlugin(ABICreateInstance create_callback) { 294 return GetABIInstances().UnregisterPlugin(create_callback); 295 } 296 297 ABICreateInstance PluginManager::GetABICreateCallbackAtIndex(uint32_t idx) { 298 return GetABIInstances().GetCallbackAtIndex(idx); 299 } 300 301 #pragma mark Architecture 302 303 typedef PluginInstance<ArchitectureCreateInstance> ArchitectureInstance; 304 typedef std::vector<ArchitectureInstance> ArchitectureInstances; 305 306 static ArchitectureInstances &GetArchitectureInstances() { 307 static ArchitectureInstances g_instances; 308 return g_instances; 309 } 310 311 void PluginManager::RegisterPlugin(llvm::StringRef name, 312 llvm::StringRef description, 313 ArchitectureCreateInstance create_callback) { 314 GetArchitectureInstances().push_back({name, description, create_callback}); 315 } 316 317 void PluginManager::UnregisterPlugin( 318 ArchitectureCreateInstance create_callback) { 319 auto &instances = GetArchitectureInstances(); 320 321 for (auto pos = instances.begin(), end = instances.end(); pos != end; ++pos) { 322 if (pos->create_callback == create_callback) { 323 instances.erase(pos); 324 return; 325 } 326 } 327 llvm_unreachable("Plugin not found"); 328 } 329 330 std::unique_ptr<Architecture> 331 PluginManager::CreateArchitectureInstance(const ArchSpec &arch) { 332 for (const auto &instances : GetArchitectureInstances()) { 333 if (auto plugin_up = instances.create_callback(arch)) 334 return plugin_up; 335 } 336 return nullptr; 337 } 338 339 #pragma mark Disassembler 340 341 typedef PluginInstance<DisassemblerCreateInstance> DisassemblerInstance; 342 typedef PluginInstances<DisassemblerInstance> DisassemblerInstances; 343 344 static DisassemblerInstances &GetDisassemblerInstances() { 345 static DisassemblerInstances g_instances; 346 return g_instances; 347 } 348 349 bool PluginManager::RegisterPlugin(llvm::StringRef name, 350 llvm::StringRef description, 351 DisassemblerCreateInstance create_callback) { 352 return GetDisassemblerInstances().RegisterPlugin(name, description, 353 create_callback); 354 } 355 356 bool PluginManager::UnregisterPlugin( 357 DisassemblerCreateInstance create_callback) { 358 return GetDisassemblerInstances().UnregisterPlugin(create_callback); 359 } 360 361 DisassemblerCreateInstance 362 PluginManager::GetDisassemblerCreateCallbackAtIndex(uint32_t idx) { 363 return GetDisassemblerInstances().GetCallbackAtIndex(idx); 364 } 365 366 DisassemblerCreateInstance 367 PluginManager::GetDisassemblerCreateCallbackForPluginName( 368 llvm::StringRef name) { 369 return GetDisassemblerInstances().GetCallbackForName(name); 370 } 371 372 #pragma mark DynamicLoader 373 374 typedef PluginInstance<DynamicLoaderCreateInstance> DynamicLoaderInstance; 375 typedef PluginInstances<DynamicLoaderInstance> DynamicLoaderInstances; 376 377 static DynamicLoaderInstances &GetDynamicLoaderInstances() { 378 static DynamicLoaderInstances g_instances; 379 return g_instances; 380 } 381 382 bool PluginManager::RegisterPlugin( 383 llvm::StringRef name, llvm::StringRef description, 384 DynamicLoaderCreateInstance create_callback, 385 DebuggerInitializeCallback debugger_init_callback) { 386 return GetDynamicLoaderInstances().RegisterPlugin( 387 name, description, create_callback, debugger_init_callback); 388 } 389 390 bool PluginManager::UnregisterPlugin( 391 DynamicLoaderCreateInstance create_callback) { 392 return GetDynamicLoaderInstances().UnregisterPlugin(create_callback); 393 } 394 395 DynamicLoaderCreateInstance 396 PluginManager::GetDynamicLoaderCreateCallbackAtIndex(uint32_t idx) { 397 return GetDynamicLoaderInstances().GetCallbackAtIndex(idx); 398 } 399 400 DynamicLoaderCreateInstance 401 PluginManager::GetDynamicLoaderCreateCallbackForPluginName( 402 llvm::StringRef name) { 403 return GetDynamicLoaderInstances().GetCallbackForName(name); 404 } 405 406 #pragma mark JITLoader 407 408 typedef PluginInstance<JITLoaderCreateInstance> JITLoaderInstance; 409 typedef PluginInstances<JITLoaderInstance> JITLoaderInstances; 410 411 static JITLoaderInstances &GetJITLoaderInstances() { 412 static JITLoaderInstances g_instances; 413 return g_instances; 414 } 415 416 bool PluginManager::RegisterPlugin( 417 llvm::StringRef name, llvm::StringRef description, 418 JITLoaderCreateInstance create_callback, 419 DebuggerInitializeCallback debugger_init_callback) { 420 return GetJITLoaderInstances().RegisterPlugin( 421 name, description, create_callback, debugger_init_callback); 422 } 423 424 bool PluginManager::UnregisterPlugin(JITLoaderCreateInstance create_callback) { 425 return GetJITLoaderInstances().UnregisterPlugin(create_callback); 426 } 427 428 JITLoaderCreateInstance 429 PluginManager::GetJITLoaderCreateCallbackAtIndex(uint32_t idx) { 430 return GetJITLoaderInstances().GetCallbackAtIndex(idx); 431 } 432 433 #pragma mark EmulateInstruction 434 435 typedef PluginInstance<EmulateInstructionCreateInstance> 436 EmulateInstructionInstance; 437 typedef PluginInstances<EmulateInstructionInstance> EmulateInstructionInstances; 438 439 static EmulateInstructionInstances &GetEmulateInstructionInstances() { 440 static EmulateInstructionInstances g_instances; 441 return g_instances; 442 } 443 444 bool PluginManager::RegisterPlugin( 445 llvm::StringRef name, llvm::StringRef description, 446 EmulateInstructionCreateInstance create_callback) { 447 return GetEmulateInstructionInstances().RegisterPlugin(name, description, 448 create_callback); 449 } 450 451 bool PluginManager::UnregisterPlugin( 452 EmulateInstructionCreateInstance create_callback) { 453 return GetEmulateInstructionInstances().UnregisterPlugin(create_callback); 454 } 455 456 EmulateInstructionCreateInstance 457 PluginManager::GetEmulateInstructionCreateCallbackAtIndex(uint32_t idx) { 458 return GetEmulateInstructionInstances().GetCallbackAtIndex(idx); 459 } 460 461 EmulateInstructionCreateInstance 462 PluginManager::GetEmulateInstructionCreateCallbackForPluginName( 463 llvm::StringRef name) { 464 return GetEmulateInstructionInstances().GetCallbackForName(name); 465 } 466 467 #pragma mark OperatingSystem 468 469 typedef PluginInstance<OperatingSystemCreateInstance> OperatingSystemInstance; 470 typedef PluginInstances<OperatingSystemInstance> OperatingSystemInstances; 471 472 static OperatingSystemInstances &GetOperatingSystemInstances() { 473 static OperatingSystemInstances g_instances; 474 return g_instances; 475 } 476 477 bool PluginManager::RegisterPlugin( 478 llvm::StringRef name, llvm::StringRef description, 479 OperatingSystemCreateInstance create_callback, 480 DebuggerInitializeCallback debugger_init_callback) { 481 return GetOperatingSystemInstances().RegisterPlugin( 482 name, description, create_callback, debugger_init_callback); 483 } 484 485 bool PluginManager::UnregisterPlugin( 486 OperatingSystemCreateInstance create_callback) { 487 return GetOperatingSystemInstances().UnregisterPlugin(create_callback); 488 } 489 490 OperatingSystemCreateInstance 491 PluginManager::GetOperatingSystemCreateCallbackAtIndex(uint32_t idx) { 492 return GetOperatingSystemInstances().GetCallbackAtIndex(idx); 493 } 494 495 OperatingSystemCreateInstance 496 PluginManager::GetOperatingSystemCreateCallbackForPluginName( 497 llvm::StringRef name) { 498 return GetOperatingSystemInstances().GetCallbackForName(name); 499 } 500 501 #pragma mark Language 502 503 typedef PluginInstance<LanguageCreateInstance> LanguageInstance; 504 typedef PluginInstances<LanguageInstance> LanguageInstances; 505 506 static LanguageInstances &GetLanguageInstances() { 507 static LanguageInstances g_instances; 508 return g_instances; 509 } 510 511 bool PluginManager::RegisterPlugin(llvm::StringRef name, 512 llvm::StringRef description, 513 LanguageCreateInstance create_callback) { 514 return GetLanguageInstances().RegisterPlugin(name, description, 515 create_callback); 516 } 517 518 bool PluginManager::UnregisterPlugin(LanguageCreateInstance create_callback) { 519 return GetLanguageInstances().UnregisterPlugin(create_callback); 520 } 521 522 LanguageCreateInstance 523 PluginManager::GetLanguageCreateCallbackAtIndex(uint32_t idx) { 524 return GetLanguageInstances().GetCallbackAtIndex(idx); 525 } 526 527 #pragma mark LanguageRuntime 528 529 struct LanguageRuntimeInstance 530 : public PluginInstance<LanguageRuntimeCreateInstance> { 531 LanguageRuntimeInstance( 532 llvm::StringRef name, llvm::StringRef description, 533 CallbackType create_callback, 534 DebuggerInitializeCallback debugger_init_callback, 535 LanguageRuntimeGetCommandObject command_callback, 536 LanguageRuntimeGetExceptionPrecondition precondition_callback) 537 : PluginInstance<LanguageRuntimeCreateInstance>( 538 name, description, create_callback, debugger_init_callback), 539 command_callback(command_callback), 540 precondition_callback(precondition_callback) {} 541 542 LanguageRuntimeGetCommandObject command_callback; 543 LanguageRuntimeGetExceptionPrecondition precondition_callback; 544 }; 545 546 typedef PluginInstances<LanguageRuntimeInstance> LanguageRuntimeInstances; 547 548 static LanguageRuntimeInstances &GetLanguageRuntimeInstances() { 549 static LanguageRuntimeInstances g_instances; 550 return g_instances; 551 } 552 553 bool PluginManager::RegisterPlugin( 554 llvm::StringRef name, llvm::StringRef description, 555 LanguageRuntimeCreateInstance create_callback, 556 LanguageRuntimeGetCommandObject command_callback, 557 LanguageRuntimeGetExceptionPrecondition precondition_callback) { 558 return GetLanguageRuntimeInstances().RegisterPlugin( 559 name, description, create_callback, nullptr, command_callback, 560 precondition_callback); 561 } 562 563 bool PluginManager::UnregisterPlugin( 564 LanguageRuntimeCreateInstance create_callback) { 565 return GetLanguageRuntimeInstances().UnregisterPlugin(create_callback); 566 } 567 568 LanguageRuntimeCreateInstance 569 PluginManager::GetLanguageRuntimeCreateCallbackAtIndex(uint32_t idx) { 570 return GetLanguageRuntimeInstances().GetCallbackAtIndex(idx); 571 } 572 573 LanguageRuntimeGetCommandObject 574 PluginManager::GetLanguageRuntimeGetCommandObjectAtIndex(uint32_t idx) { 575 const auto &instances = GetLanguageRuntimeInstances().GetInstances(); 576 if (idx < instances.size()) 577 return instances[idx].command_callback; 578 return nullptr; 579 } 580 581 LanguageRuntimeGetExceptionPrecondition 582 PluginManager::GetLanguageRuntimeGetExceptionPreconditionAtIndex(uint32_t idx) { 583 const auto &instances = GetLanguageRuntimeInstances().GetInstances(); 584 if (idx < instances.size()) 585 return instances[idx].precondition_callback; 586 return nullptr; 587 } 588 589 #pragma mark SystemRuntime 590 591 typedef PluginInstance<SystemRuntimeCreateInstance> SystemRuntimeInstance; 592 typedef PluginInstances<SystemRuntimeInstance> SystemRuntimeInstances; 593 594 static SystemRuntimeInstances &GetSystemRuntimeInstances() { 595 static SystemRuntimeInstances g_instances; 596 return g_instances; 597 } 598 599 bool PluginManager::RegisterPlugin( 600 llvm::StringRef name, llvm::StringRef description, 601 SystemRuntimeCreateInstance create_callback) { 602 return GetSystemRuntimeInstances().RegisterPlugin(name, description, 603 create_callback); 604 } 605 606 bool PluginManager::UnregisterPlugin( 607 SystemRuntimeCreateInstance create_callback) { 608 return GetSystemRuntimeInstances().UnregisterPlugin(create_callback); 609 } 610 611 SystemRuntimeCreateInstance 612 PluginManager::GetSystemRuntimeCreateCallbackAtIndex(uint32_t idx) { 613 return GetSystemRuntimeInstances().GetCallbackAtIndex(idx); 614 } 615 616 #pragma mark ObjectFile 617 618 struct ObjectFileInstance : public PluginInstance<ObjectFileCreateInstance> { 619 ObjectFileInstance( 620 llvm::StringRef name, llvm::StringRef description, 621 CallbackType create_callback, 622 ObjectFileCreateMemoryInstance create_memory_callback, 623 ObjectFileGetModuleSpecifications get_module_specifications, 624 ObjectFileSaveCore save_core, 625 DebuggerInitializeCallback debugger_init_callback) 626 : PluginInstance<ObjectFileCreateInstance>( 627 name, description, create_callback, debugger_init_callback), 628 create_memory_callback(create_memory_callback), 629 get_module_specifications(get_module_specifications), 630 save_core(save_core) {} 631 632 ObjectFileCreateMemoryInstance create_memory_callback; 633 ObjectFileGetModuleSpecifications get_module_specifications; 634 ObjectFileSaveCore save_core; 635 }; 636 typedef PluginInstances<ObjectFileInstance> ObjectFileInstances; 637 638 static ObjectFileInstances &GetObjectFileInstances() { 639 static ObjectFileInstances g_instances; 640 return g_instances; 641 } 642 643 bool PluginManager::IsRegisteredObjectFilePluginName(llvm::StringRef name) { 644 if (name.empty()) 645 return false; 646 647 const auto &instances = GetObjectFileInstances().GetInstances(); 648 for (auto &instance : instances) { 649 if (instance.name == name) 650 return true; 651 } 652 return false; 653 } 654 655 bool PluginManager::RegisterPlugin( 656 llvm::StringRef name, llvm::StringRef description, 657 ObjectFileCreateInstance create_callback, 658 ObjectFileCreateMemoryInstance create_memory_callback, 659 ObjectFileGetModuleSpecifications get_module_specifications, 660 ObjectFileSaveCore save_core, 661 DebuggerInitializeCallback debugger_init_callback) { 662 return GetObjectFileInstances().RegisterPlugin( 663 name, description, create_callback, create_memory_callback, 664 get_module_specifications, save_core, debugger_init_callback); 665 } 666 667 bool PluginManager::UnregisterPlugin(ObjectFileCreateInstance create_callback) { 668 return GetObjectFileInstances().UnregisterPlugin(create_callback); 669 } 670 671 ObjectFileCreateInstance 672 PluginManager::GetObjectFileCreateCallbackAtIndex(uint32_t idx) { 673 return GetObjectFileInstances().GetCallbackAtIndex(idx); 674 } 675 676 ObjectFileCreateMemoryInstance 677 PluginManager::GetObjectFileCreateMemoryCallbackAtIndex(uint32_t idx) { 678 const auto &instances = GetObjectFileInstances().GetInstances(); 679 if (idx < instances.size()) 680 return instances[idx].create_memory_callback; 681 return nullptr; 682 } 683 684 ObjectFileGetModuleSpecifications 685 PluginManager::GetObjectFileGetModuleSpecificationsCallbackAtIndex( 686 uint32_t idx) { 687 const auto &instances = GetObjectFileInstances().GetInstances(); 688 if (idx < instances.size()) 689 return instances[idx].get_module_specifications; 690 return nullptr; 691 } 692 693 ObjectFileCreateMemoryInstance 694 PluginManager::GetObjectFileCreateMemoryCallbackForPluginName( 695 llvm::StringRef name) { 696 const auto &instances = GetObjectFileInstances().GetInstances(); 697 for (auto &instance : instances) { 698 if (instance.name == name) 699 return instance.create_memory_callback; 700 } 701 return nullptr; 702 } 703 704 Status PluginManager::SaveCore(const lldb::ProcessSP &process_sp, 705 lldb_private::SaveCoreOptions &options) { 706 Status error; 707 if (!options.GetOutputFile()) { 708 error = Status::FromErrorString("No output file specified"); 709 return error; 710 } 711 712 if (!process_sp) { 713 error = Status::FromErrorString("Invalid process"); 714 return error; 715 } 716 717 error = options.EnsureValidConfiguration(process_sp); 718 if (error.Fail()) 719 return error; 720 721 if (!options.GetPluginName().has_value()) { 722 // Try saving core directly from the process plugin first. 723 llvm::Expected<bool> ret = 724 process_sp->SaveCore(options.GetOutputFile()->GetPath()); 725 if (!ret) 726 return Status(ret.takeError()); 727 if (ret.get()) 728 return Status(); 729 } 730 731 // Fall back to object plugins. 732 const auto &plugin_name = options.GetPluginName().value_or(""); 733 auto &instances = GetObjectFileInstances().GetInstances(); 734 for (auto &instance : instances) { 735 if (plugin_name.empty() || instance.name == plugin_name) { 736 if (instance.save_core && instance.save_core(process_sp, options, error)) 737 return error; 738 } 739 } 740 741 // Check to see if any of the object file plugins tried and failed to save. 742 // If none ran, set the error message. 743 if (error.Success()) 744 error = Status::FromErrorString( 745 "no ObjectFile plugins were able to save a core for this process"); 746 return error; 747 } 748 749 #pragma mark ObjectContainer 750 751 struct ObjectContainerInstance 752 : public PluginInstance<ObjectContainerCreateInstance> { 753 ObjectContainerInstance( 754 llvm::StringRef name, llvm::StringRef description, 755 CallbackType create_callback, 756 ObjectContainerCreateMemoryInstance create_memory_callback, 757 ObjectFileGetModuleSpecifications get_module_specifications) 758 : PluginInstance<ObjectContainerCreateInstance>(name, description, 759 create_callback), 760 create_memory_callback(create_memory_callback), 761 get_module_specifications(get_module_specifications) {} 762 763 ObjectContainerCreateMemoryInstance create_memory_callback; 764 ObjectFileGetModuleSpecifications get_module_specifications; 765 }; 766 typedef PluginInstances<ObjectContainerInstance> ObjectContainerInstances; 767 768 static ObjectContainerInstances &GetObjectContainerInstances() { 769 static ObjectContainerInstances g_instances; 770 return g_instances; 771 } 772 773 bool PluginManager::RegisterPlugin( 774 llvm::StringRef name, llvm::StringRef description, 775 ObjectContainerCreateInstance create_callback, 776 ObjectFileGetModuleSpecifications get_module_specifications, 777 ObjectContainerCreateMemoryInstance create_memory_callback) { 778 return GetObjectContainerInstances().RegisterPlugin( 779 name, description, create_callback, create_memory_callback, 780 get_module_specifications); 781 } 782 783 bool PluginManager::UnregisterPlugin( 784 ObjectContainerCreateInstance create_callback) { 785 return GetObjectContainerInstances().UnregisterPlugin(create_callback); 786 } 787 788 ObjectContainerCreateInstance 789 PluginManager::GetObjectContainerCreateCallbackAtIndex(uint32_t idx) { 790 return GetObjectContainerInstances().GetCallbackAtIndex(idx); 791 } 792 793 ObjectContainerCreateMemoryInstance 794 PluginManager::GetObjectContainerCreateMemoryCallbackAtIndex(uint32_t idx) { 795 const auto &instances = GetObjectContainerInstances().GetInstances(); 796 if (idx < instances.size()) 797 return instances[idx].create_memory_callback; 798 return nullptr; 799 } 800 801 ObjectFileGetModuleSpecifications 802 PluginManager::GetObjectContainerGetModuleSpecificationsCallbackAtIndex( 803 uint32_t idx) { 804 const auto &instances = GetObjectContainerInstances().GetInstances(); 805 if (idx < instances.size()) 806 return instances[idx].get_module_specifications; 807 return nullptr; 808 } 809 810 #pragma mark Platform 811 812 typedef PluginInstance<PlatformCreateInstance> PlatformInstance; 813 typedef PluginInstances<PlatformInstance> PlatformInstances; 814 815 static PlatformInstances &GetPlatformInstances() { 816 static PlatformInstances g_platform_instances; 817 return g_platform_instances; 818 } 819 820 bool PluginManager::RegisterPlugin( 821 llvm::StringRef name, llvm::StringRef description, 822 PlatformCreateInstance create_callback, 823 DebuggerInitializeCallback debugger_init_callback) { 824 return GetPlatformInstances().RegisterPlugin( 825 name, description, create_callback, debugger_init_callback); 826 } 827 828 bool PluginManager::UnregisterPlugin(PlatformCreateInstance create_callback) { 829 return GetPlatformInstances().UnregisterPlugin(create_callback); 830 } 831 832 llvm::StringRef PluginManager::GetPlatformPluginNameAtIndex(uint32_t idx) { 833 return GetPlatformInstances().GetNameAtIndex(idx); 834 } 835 836 llvm::StringRef 837 PluginManager::GetPlatformPluginDescriptionAtIndex(uint32_t idx) { 838 return GetPlatformInstances().GetDescriptionAtIndex(idx); 839 } 840 841 PlatformCreateInstance 842 PluginManager::GetPlatformCreateCallbackAtIndex(uint32_t idx) { 843 return GetPlatformInstances().GetCallbackAtIndex(idx); 844 } 845 846 PlatformCreateInstance 847 PluginManager::GetPlatformCreateCallbackForPluginName(llvm::StringRef name) { 848 return GetPlatformInstances().GetCallbackForName(name); 849 } 850 851 void PluginManager::AutoCompletePlatformName(llvm::StringRef name, 852 CompletionRequest &request) { 853 for (const auto &instance : GetPlatformInstances().GetInstances()) { 854 if (instance.name.starts_with(name)) 855 request.AddCompletion(instance.name); 856 } 857 } 858 859 #pragma mark Process 860 861 typedef PluginInstance<ProcessCreateInstance> ProcessInstance; 862 typedef PluginInstances<ProcessInstance> ProcessInstances; 863 864 static ProcessInstances &GetProcessInstances() { 865 static ProcessInstances g_instances; 866 return g_instances; 867 } 868 869 bool PluginManager::RegisterPlugin( 870 llvm::StringRef name, llvm::StringRef description, 871 ProcessCreateInstance create_callback, 872 DebuggerInitializeCallback debugger_init_callback) { 873 return GetProcessInstances().RegisterPlugin( 874 name, description, create_callback, debugger_init_callback); 875 } 876 877 bool PluginManager::UnregisterPlugin(ProcessCreateInstance create_callback) { 878 return GetProcessInstances().UnregisterPlugin(create_callback); 879 } 880 881 llvm::StringRef PluginManager::GetProcessPluginNameAtIndex(uint32_t idx) { 882 return GetProcessInstances().GetNameAtIndex(idx); 883 } 884 885 llvm::StringRef PluginManager::GetProcessPluginDescriptionAtIndex(uint32_t idx) { 886 return GetProcessInstances().GetDescriptionAtIndex(idx); 887 } 888 889 ProcessCreateInstance 890 PluginManager::GetProcessCreateCallbackAtIndex(uint32_t idx) { 891 return GetProcessInstances().GetCallbackAtIndex(idx); 892 } 893 894 ProcessCreateInstance 895 PluginManager::GetProcessCreateCallbackForPluginName(llvm::StringRef name) { 896 return GetProcessInstances().GetCallbackForName(name); 897 } 898 899 void PluginManager::AutoCompleteProcessName(llvm::StringRef name, 900 CompletionRequest &request) { 901 for (const auto &instance : GetProcessInstances().GetInstances()) { 902 if (instance.name.starts_with(name)) 903 request.AddCompletion(instance.name, instance.description); 904 } 905 } 906 907 #pragma mark RegisterTypeBuilder 908 909 struct RegisterTypeBuilderInstance 910 : public PluginInstance<RegisterTypeBuilderCreateInstance> { 911 RegisterTypeBuilderInstance(llvm::StringRef name, llvm::StringRef description, 912 CallbackType create_callback) 913 : PluginInstance<RegisterTypeBuilderCreateInstance>(name, description, 914 create_callback) {} 915 }; 916 917 typedef PluginInstances<RegisterTypeBuilderInstance> 918 RegisterTypeBuilderInstances; 919 920 static RegisterTypeBuilderInstances &GetRegisterTypeBuilderInstances() { 921 static RegisterTypeBuilderInstances g_instances; 922 return g_instances; 923 } 924 925 bool PluginManager::RegisterPlugin( 926 llvm::StringRef name, llvm::StringRef description, 927 RegisterTypeBuilderCreateInstance create_callback) { 928 return GetRegisterTypeBuilderInstances().RegisterPlugin(name, description, 929 create_callback); 930 } 931 932 bool PluginManager::UnregisterPlugin( 933 RegisterTypeBuilderCreateInstance create_callback) { 934 return GetRegisterTypeBuilderInstances().UnregisterPlugin(create_callback); 935 } 936 937 lldb::RegisterTypeBuilderSP 938 PluginManager::GetRegisterTypeBuilder(Target &target) { 939 const auto &instances = GetRegisterTypeBuilderInstances().GetInstances(); 940 // We assume that RegisterTypeBuilderClang is the only instance of this plugin 941 // type and is always present. 942 assert(instances.size()); 943 return instances[0].create_callback(target); 944 } 945 946 #pragma mark ScriptInterpreter 947 948 struct ScriptInterpreterInstance 949 : public PluginInstance<ScriptInterpreterCreateInstance> { 950 ScriptInterpreterInstance(llvm::StringRef name, llvm::StringRef description, 951 CallbackType create_callback, 952 lldb::ScriptLanguage language) 953 : PluginInstance<ScriptInterpreterCreateInstance>(name, description, 954 create_callback), 955 language(language) {} 956 957 lldb::ScriptLanguage language = lldb::eScriptLanguageNone; 958 }; 959 960 typedef PluginInstances<ScriptInterpreterInstance> ScriptInterpreterInstances; 961 962 static ScriptInterpreterInstances &GetScriptInterpreterInstances() { 963 static ScriptInterpreterInstances g_instances; 964 return g_instances; 965 } 966 967 bool PluginManager::RegisterPlugin( 968 llvm::StringRef name, llvm::StringRef description, 969 lldb::ScriptLanguage script_language, 970 ScriptInterpreterCreateInstance create_callback) { 971 return GetScriptInterpreterInstances().RegisterPlugin( 972 name, description, create_callback, script_language); 973 } 974 975 bool PluginManager::UnregisterPlugin( 976 ScriptInterpreterCreateInstance create_callback) { 977 return GetScriptInterpreterInstances().UnregisterPlugin(create_callback); 978 } 979 980 ScriptInterpreterCreateInstance 981 PluginManager::GetScriptInterpreterCreateCallbackAtIndex(uint32_t idx) { 982 return GetScriptInterpreterInstances().GetCallbackAtIndex(idx); 983 } 984 985 lldb::ScriptInterpreterSP 986 PluginManager::GetScriptInterpreterForLanguage(lldb::ScriptLanguage script_lang, 987 Debugger &debugger) { 988 const auto &instances = GetScriptInterpreterInstances().GetInstances(); 989 ScriptInterpreterCreateInstance none_instance = nullptr; 990 for (const auto &instance : instances) { 991 if (instance.language == lldb::eScriptLanguageNone) 992 none_instance = instance.create_callback; 993 994 if (script_lang == instance.language) 995 return instance.create_callback(debugger); 996 } 997 998 // If we didn't find one, return the ScriptInterpreter for the null language. 999 assert(none_instance != nullptr); 1000 return none_instance(debugger); 1001 } 1002 1003 #pragma mark StructuredDataPlugin 1004 1005 struct StructuredDataPluginInstance 1006 : public PluginInstance<StructuredDataPluginCreateInstance> { 1007 StructuredDataPluginInstance( 1008 llvm::StringRef name, llvm::StringRef description, 1009 CallbackType create_callback, 1010 DebuggerInitializeCallback debugger_init_callback, 1011 StructuredDataFilterLaunchInfo filter_callback) 1012 : PluginInstance<StructuredDataPluginCreateInstance>( 1013 name, description, create_callback, debugger_init_callback), 1014 filter_callback(filter_callback) {} 1015 1016 StructuredDataFilterLaunchInfo filter_callback = nullptr; 1017 }; 1018 1019 typedef PluginInstances<StructuredDataPluginInstance> 1020 StructuredDataPluginInstances; 1021 1022 static StructuredDataPluginInstances &GetStructuredDataPluginInstances() { 1023 static StructuredDataPluginInstances g_instances; 1024 return g_instances; 1025 } 1026 1027 bool PluginManager::RegisterPlugin( 1028 llvm::StringRef name, llvm::StringRef description, 1029 StructuredDataPluginCreateInstance create_callback, 1030 DebuggerInitializeCallback debugger_init_callback, 1031 StructuredDataFilterLaunchInfo filter_callback) { 1032 return GetStructuredDataPluginInstances().RegisterPlugin( 1033 name, description, create_callback, debugger_init_callback, 1034 filter_callback); 1035 } 1036 1037 bool PluginManager::UnregisterPlugin( 1038 StructuredDataPluginCreateInstance create_callback) { 1039 return GetStructuredDataPluginInstances().UnregisterPlugin(create_callback); 1040 } 1041 1042 StructuredDataPluginCreateInstance 1043 PluginManager::GetStructuredDataPluginCreateCallbackAtIndex(uint32_t idx) { 1044 return GetStructuredDataPluginInstances().GetCallbackAtIndex(idx); 1045 } 1046 1047 StructuredDataFilterLaunchInfo 1048 PluginManager::GetStructuredDataFilterCallbackAtIndex( 1049 uint32_t idx, bool &iteration_complete) { 1050 const auto &instances = GetStructuredDataPluginInstances().GetInstances(); 1051 if (idx < instances.size()) { 1052 iteration_complete = false; 1053 return instances[idx].filter_callback; 1054 } else { 1055 iteration_complete = true; 1056 } 1057 return nullptr; 1058 } 1059 1060 #pragma mark SymbolFile 1061 1062 typedef PluginInstance<SymbolFileCreateInstance> SymbolFileInstance; 1063 typedef PluginInstances<SymbolFileInstance> SymbolFileInstances; 1064 1065 static SymbolFileInstances &GetSymbolFileInstances() { 1066 static SymbolFileInstances g_instances; 1067 return g_instances; 1068 } 1069 1070 bool PluginManager::RegisterPlugin( 1071 llvm::StringRef name, llvm::StringRef description, 1072 SymbolFileCreateInstance create_callback, 1073 DebuggerInitializeCallback debugger_init_callback) { 1074 return GetSymbolFileInstances().RegisterPlugin( 1075 name, description, create_callback, debugger_init_callback); 1076 } 1077 1078 bool PluginManager::UnregisterPlugin(SymbolFileCreateInstance create_callback) { 1079 return GetSymbolFileInstances().UnregisterPlugin(create_callback); 1080 } 1081 1082 SymbolFileCreateInstance 1083 PluginManager::GetSymbolFileCreateCallbackAtIndex(uint32_t idx) { 1084 return GetSymbolFileInstances().GetCallbackAtIndex(idx); 1085 } 1086 1087 #pragma mark SymbolVendor 1088 1089 typedef PluginInstance<SymbolVendorCreateInstance> SymbolVendorInstance; 1090 typedef PluginInstances<SymbolVendorInstance> SymbolVendorInstances; 1091 1092 static SymbolVendorInstances &GetSymbolVendorInstances() { 1093 static SymbolVendorInstances g_instances; 1094 return g_instances; 1095 } 1096 1097 bool PluginManager::RegisterPlugin(llvm::StringRef name, 1098 llvm::StringRef description, 1099 SymbolVendorCreateInstance create_callback) { 1100 return GetSymbolVendorInstances().RegisterPlugin(name, description, 1101 create_callback); 1102 } 1103 1104 bool PluginManager::UnregisterPlugin( 1105 SymbolVendorCreateInstance create_callback) { 1106 return GetSymbolVendorInstances().UnregisterPlugin(create_callback); 1107 } 1108 1109 SymbolVendorCreateInstance 1110 PluginManager::GetSymbolVendorCreateCallbackAtIndex(uint32_t idx) { 1111 return GetSymbolVendorInstances().GetCallbackAtIndex(idx); 1112 } 1113 1114 #pragma mark SymbolLocator 1115 1116 struct SymbolLocatorInstance 1117 : public PluginInstance<SymbolLocatorCreateInstance> { 1118 SymbolLocatorInstance( 1119 llvm::StringRef name, llvm::StringRef description, 1120 CallbackType create_callback, 1121 SymbolLocatorLocateExecutableObjectFile locate_executable_object_file, 1122 SymbolLocatorLocateExecutableSymbolFile locate_executable_symbol_file, 1123 SymbolLocatorDownloadObjectAndSymbolFile download_object_symbol_file, 1124 SymbolLocatorFindSymbolFileInBundle find_symbol_file_in_bundle, 1125 DebuggerInitializeCallback debugger_init_callback) 1126 : PluginInstance<SymbolLocatorCreateInstance>( 1127 name, description, create_callback, debugger_init_callback), 1128 locate_executable_object_file(locate_executable_object_file), 1129 locate_executable_symbol_file(locate_executable_symbol_file), 1130 download_object_symbol_file(download_object_symbol_file), 1131 find_symbol_file_in_bundle(find_symbol_file_in_bundle) {} 1132 1133 SymbolLocatorLocateExecutableObjectFile locate_executable_object_file; 1134 SymbolLocatorLocateExecutableSymbolFile locate_executable_symbol_file; 1135 SymbolLocatorDownloadObjectAndSymbolFile download_object_symbol_file; 1136 SymbolLocatorFindSymbolFileInBundle find_symbol_file_in_bundle; 1137 }; 1138 typedef PluginInstances<SymbolLocatorInstance> SymbolLocatorInstances; 1139 1140 static SymbolLocatorInstances &GetSymbolLocatorInstances() { 1141 static SymbolLocatorInstances g_instances; 1142 return g_instances; 1143 } 1144 1145 bool PluginManager::RegisterPlugin( 1146 llvm::StringRef name, llvm::StringRef description, 1147 SymbolLocatorCreateInstance create_callback, 1148 SymbolLocatorLocateExecutableObjectFile locate_executable_object_file, 1149 SymbolLocatorLocateExecutableSymbolFile locate_executable_symbol_file, 1150 SymbolLocatorDownloadObjectAndSymbolFile download_object_symbol_file, 1151 SymbolLocatorFindSymbolFileInBundle find_symbol_file_in_bundle, 1152 DebuggerInitializeCallback debugger_init_callback) { 1153 return GetSymbolLocatorInstances().RegisterPlugin( 1154 name, description, create_callback, locate_executable_object_file, 1155 locate_executable_symbol_file, download_object_symbol_file, 1156 find_symbol_file_in_bundle, debugger_init_callback); 1157 } 1158 1159 bool PluginManager::UnregisterPlugin( 1160 SymbolLocatorCreateInstance create_callback) { 1161 return GetSymbolLocatorInstances().UnregisterPlugin(create_callback); 1162 } 1163 1164 SymbolLocatorCreateInstance 1165 PluginManager::GetSymbolLocatorCreateCallbackAtIndex(uint32_t idx) { 1166 return GetSymbolLocatorInstances().GetCallbackAtIndex(idx); 1167 } 1168 1169 ModuleSpec 1170 PluginManager::LocateExecutableObjectFile(const ModuleSpec &module_spec) { 1171 auto &instances = GetSymbolLocatorInstances().GetInstances(); 1172 for (auto &instance : instances) { 1173 if (instance.locate_executable_object_file) { 1174 std::optional<ModuleSpec> result = 1175 instance.locate_executable_object_file(module_spec); 1176 if (result) 1177 return *result; 1178 } 1179 } 1180 return {}; 1181 } 1182 1183 FileSpec PluginManager::LocateExecutableSymbolFile( 1184 const ModuleSpec &module_spec, const FileSpecList &default_search_paths) { 1185 auto &instances = GetSymbolLocatorInstances().GetInstances(); 1186 for (auto &instance : instances) { 1187 if (instance.locate_executable_symbol_file) { 1188 std::optional<FileSpec> result = instance.locate_executable_symbol_file( 1189 module_spec, default_search_paths); 1190 if (result) 1191 return *result; 1192 } 1193 } 1194 return {}; 1195 } 1196 1197 bool PluginManager::DownloadObjectAndSymbolFile(ModuleSpec &module_spec, 1198 Status &error, 1199 bool force_lookup, 1200 bool copy_executable) { 1201 auto &instances = GetSymbolLocatorInstances().GetInstances(); 1202 for (auto &instance : instances) { 1203 if (instance.download_object_symbol_file) { 1204 if (instance.download_object_symbol_file(module_spec, error, force_lookup, 1205 copy_executable)) 1206 return true; 1207 } 1208 } 1209 return false; 1210 } 1211 1212 FileSpec PluginManager::FindSymbolFileInBundle(const FileSpec &symfile_bundle, 1213 const UUID *uuid, 1214 const ArchSpec *arch) { 1215 auto &instances = GetSymbolLocatorInstances().GetInstances(); 1216 for (auto &instance : instances) { 1217 if (instance.find_symbol_file_in_bundle) { 1218 std::optional<FileSpec> result = 1219 instance.find_symbol_file_in_bundle(symfile_bundle, uuid, arch); 1220 if (result) 1221 return *result; 1222 } 1223 } 1224 return {}; 1225 } 1226 1227 #pragma mark Trace 1228 1229 struct TraceInstance 1230 : public PluginInstance<TraceCreateInstanceFromBundle> { 1231 TraceInstance( 1232 llvm::StringRef name, llvm::StringRef description, 1233 CallbackType create_callback_from_bundle, 1234 TraceCreateInstanceForLiveProcess create_callback_for_live_process, 1235 llvm::StringRef schema, DebuggerInitializeCallback debugger_init_callback) 1236 : PluginInstance<TraceCreateInstanceFromBundle>( 1237 name, description, create_callback_from_bundle, 1238 debugger_init_callback), 1239 schema(schema), 1240 create_callback_for_live_process(create_callback_for_live_process) {} 1241 1242 llvm::StringRef schema; 1243 TraceCreateInstanceForLiveProcess create_callback_for_live_process; 1244 }; 1245 1246 typedef PluginInstances<TraceInstance> TraceInstances; 1247 1248 static TraceInstances &GetTracePluginInstances() { 1249 static TraceInstances g_instances; 1250 return g_instances; 1251 } 1252 1253 bool PluginManager::RegisterPlugin( 1254 llvm::StringRef name, llvm::StringRef description, 1255 TraceCreateInstanceFromBundle create_callback_from_bundle, 1256 TraceCreateInstanceForLiveProcess create_callback_for_live_process, 1257 llvm::StringRef schema, DebuggerInitializeCallback debugger_init_callback) { 1258 return GetTracePluginInstances().RegisterPlugin( 1259 name, description, create_callback_from_bundle, 1260 create_callback_for_live_process, schema, debugger_init_callback); 1261 } 1262 1263 bool PluginManager::UnregisterPlugin( 1264 TraceCreateInstanceFromBundle create_callback_from_bundle) { 1265 return GetTracePluginInstances().UnregisterPlugin( 1266 create_callback_from_bundle); 1267 } 1268 1269 TraceCreateInstanceFromBundle 1270 PluginManager::GetTraceCreateCallback(llvm::StringRef plugin_name) { 1271 return GetTracePluginInstances().GetCallbackForName(plugin_name); 1272 } 1273 1274 TraceCreateInstanceForLiveProcess 1275 PluginManager::GetTraceCreateCallbackForLiveProcess(llvm::StringRef plugin_name) { 1276 for (const TraceInstance &instance : GetTracePluginInstances().GetInstances()) 1277 if (instance.name == plugin_name) 1278 return instance.create_callback_for_live_process; 1279 return nullptr; 1280 } 1281 1282 llvm::StringRef PluginManager::GetTraceSchema(llvm::StringRef plugin_name) { 1283 for (const TraceInstance &instance : GetTracePluginInstances().GetInstances()) 1284 if (instance.name == plugin_name) 1285 return instance.schema; 1286 return llvm::StringRef(); 1287 } 1288 1289 llvm::StringRef PluginManager::GetTraceSchema(size_t index) { 1290 if (TraceInstance *instance = 1291 GetTracePluginInstances().GetInstanceAtIndex(index)) 1292 return instance->schema; 1293 return llvm::StringRef(); 1294 } 1295 1296 #pragma mark TraceExporter 1297 1298 struct TraceExporterInstance 1299 : public PluginInstance<TraceExporterCreateInstance> { 1300 TraceExporterInstance( 1301 llvm::StringRef name, llvm::StringRef description, 1302 TraceExporterCreateInstance create_instance, 1303 ThreadTraceExportCommandCreator create_thread_trace_export_command) 1304 : PluginInstance<TraceExporterCreateInstance>(name, description, 1305 create_instance), 1306 create_thread_trace_export_command(create_thread_trace_export_command) { 1307 } 1308 1309 ThreadTraceExportCommandCreator create_thread_trace_export_command; 1310 }; 1311 1312 typedef PluginInstances<TraceExporterInstance> TraceExporterInstances; 1313 1314 static TraceExporterInstances &GetTraceExporterInstances() { 1315 static TraceExporterInstances g_instances; 1316 return g_instances; 1317 } 1318 1319 bool PluginManager::RegisterPlugin( 1320 llvm::StringRef name, llvm::StringRef description, 1321 TraceExporterCreateInstance create_callback, 1322 ThreadTraceExportCommandCreator create_thread_trace_export_command) { 1323 return GetTraceExporterInstances().RegisterPlugin( 1324 name, description, create_callback, create_thread_trace_export_command); 1325 } 1326 1327 TraceExporterCreateInstance 1328 PluginManager::GetTraceExporterCreateCallback(llvm::StringRef plugin_name) { 1329 return GetTraceExporterInstances().GetCallbackForName(plugin_name); 1330 } 1331 1332 bool PluginManager::UnregisterPlugin( 1333 TraceExporterCreateInstance create_callback) { 1334 return GetTraceExporterInstances().UnregisterPlugin(create_callback); 1335 } 1336 1337 ThreadTraceExportCommandCreator 1338 PluginManager::GetThreadTraceExportCommandCreatorAtIndex(uint32_t index) { 1339 if (TraceExporterInstance *instance = 1340 GetTraceExporterInstances().GetInstanceAtIndex(index)) 1341 return instance->create_thread_trace_export_command; 1342 return nullptr; 1343 } 1344 1345 llvm::StringRef 1346 PluginManager::GetTraceExporterPluginNameAtIndex(uint32_t index) { 1347 return GetTraceExporterInstances().GetNameAtIndex(index); 1348 } 1349 1350 #pragma mark UnwindAssembly 1351 1352 typedef PluginInstance<UnwindAssemblyCreateInstance> UnwindAssemblyInstance; 1353 typedef PluginInstances<UnwindAssemblyInstance> UnwindAssemblyInstances; 1354 1355 static UnwindAssemblyInstances &GetUnwindAssemblyInstances() { 1356 static UnwindAssemblyInstances g_instances; 1357 return g_instances; 1358 } 1359 1360 bool PluginManager::RegisterPlugin( 1361 llvm::StringRef name, llvm::StringRef description, 1362 UnwindAssemblyCreateInstance create_callback) { 1363 return GetUnwindAssemblyInstances().RegisterPlugin(name, description, 1364 create_callback); 1365 } 1366 1367 bool PluginManager::UnregisterPlugin( 1368 UnwindAssemblyCreateInstance create_callback) { 1369 return GetUnwindAssemblyInstances().UnregisterPlugin(create_callback); 1370 } 1371 1372 UnwindAssemblyCreateInstance 1373 PluginManager::GetUnwindAssemblyCreateCallbackAtIndex(uint32_t idx) { 1374 return GetUnwindAssemblyInstances().GetCallbackAtIndex(idx); 1375 } 1376 1377 #pragma mark MemoryHistory 1378 1379 typedef PluginInstance<MemoryHistoryCreateInstance> MemoryHistoryInstance; 1380 typedef PluginInstances<MemoryHistoryInstance> MemoryHistoryInstances; 1381 1382 static MemoryHistoryInstances &GetMemoryHistoryInstances() { 1383 static MemoryHistoryInstances g_instances; 1384 return g_instances; 1385 } 1386 1387 bool PluginManager::RegisterPlugin( 1388 llvm::StringRef name, llvm::StringRef description, 1389 MemoryHistoryCreateInstance create_callback) { 1390 return GetMemoryHistoryInstances().RegisterPlugin(name, description, 1391 create_callback); 1392 } 1393 1394 bool PluginManager::UnregisterPlugin( 1395 MemoryHistoryCreateInstance create_callback) { 1396 return GetMemoryHistoryInstances().UnregisterPlugin(create_callback); 1397 } 1398 1399 MemoryHistoryCreateInstance 1400 PluginManager::GetMemoryHistoryCreateCallbackAtIndex(uint32_t idx) { 1401 return GetMemoryHistoryInstances().GetCallbackAtIndex(idx); 1402 } 1403 1404 #pragma mark InstrumentationRuntime 1405 1406 struct InstrumentationRuntimeInstance 1407 : public PluginInstance<InstrumentationRuntimeCreateInstance> { 1408 InstrumentationRuntimeInstance( 1409 llvm::StringRef name, llvm::StringRef description, 1410 CallbackType create_callback, 1411 InstrumentationRuntimeGetType get_type_callback) 1412 : PluginInstance<InstrumentationRuntimeCreateInstance>(name, description, 1413 create_callback), 1414 get_type_callback(get_type_callback) {} 1415 1416 InstrumentationRuntimeGetType get_type_callback = nullptr; 1417 }; 1418 1419 typedef PluginInstances<InstrumentationRuntimeInstance> 1420 InstrumentationRuntimeInstances; 1421 1422 static InstrumentationRuntimeInstances &GetInstrumentationRuntimeInstances() { 1423 static InstrumentationRuntimeInstances g_instances; 1424 return g_instances; 1425 } 1426 1427 bool PluginManager::RegisterPlugin( 1428 llvm::StringRef name, llvm::StringRef description, 1429 InstrumentationRuntimeCreateInstance create_callback, 1430 InstrumentationRuntimeGetType get_type_callback) { 1431 return GetInstrumentationRuntimeInstances().RegisterPlugin( 1432 name, description, create_callback, get_type_callback); 1433 } 1434 1435 bool PluginManager::UnregisterPlugin( 1436 InstrumentationRuntimeCreateInstance create_callback) { 1437 return GetInstrumentationRuntimeInstances().UnregisterPlugin(create_callback); 1438 } 1439 1440 InstrumentationRuntimeGetType 1441 PluginManager::GetInstrumentationRuntimeGetTypeCallbackAtIndex(uint32_t idx) { 1442 const auto &instances = GetInstrumentationRuntimeInstances().GetInstances(); 1443 if (idx < instances.size()) 1444 return instances[idx].get_type_callback; 1445 return nullptr; 1446 } 1447 1448 InstrumentationRuntimeCreateInstance 1449 PluginManager::GetInstrumentationRuntimeCreateCallbackAtIndex(uint32_t idx) { 1450 return GetInstrumentationRuntimeInstances().GetCallbackAtIndex(idx); 1451 } 1452 1453 #pragma mark TypeSystem 1454 1455 struct TypeSystemInstance : public PluginInstance<TypeSystemCreateInstance> { 1456 TypeSystemInstance(llvm::StringRef name, llvm::StringRef description, 1457 CallbackType create_callback, 1458 LanguageSet supported_languages_for_types, 1459 LanguageSet supported_languages_for_expressions) 1460 : PluginInstance<TypeSystemCreateInstance>(name, description, 1461 create_callback), 1462 supported_languages_for_types(supported_languages_for_types), 1463 supported_languages_for_expressions( 1464 supported_languages_for_expressions) {} 1465 1466 LanguageSet supported_languages_for_types; 1467 LanguageSet supported_languages_for_expressions; 1468 }; 1469 1470 typedef PluginInstances<TypeSystemInstance> TypeSystemInstances; 1471 1472 static TypeSystemInstances &GetTypeSystemInstances() { 1473 static TypeSystemInstances g_instances; 1474 return g_instances; 1475 } 1476 1477 bool PluginManager::RegisterPlugin( 1478 llvm::StringRef name, llvm::StringRef description, 1479 TypeSystemCreateInstance create_callback, 1480 LanguageSet supported_languages_for_types, 1481 LanguageSet supported_languages_for_expressions) { 1482 return GetTypeSystemInstances().RegisterPlugin( 1483 name, description, create_callback, supported_languages_for_types, 1484 supported_languages_for_expressions); 1485 } 1486 1487 bool PluginManager::UnregisterPlugin(TypeSystemCreateInstance create_callback) { 1488 return GetTypeSystemInstances().UnregisterPlugin(create_callback); 1489 } 1490 1491 TypeSystemCreateInstance 1492 PluginManager::GetTypeSystemCreateCallbackAtIndex(uint32_t idx) { 1493 return GetTypeSystemInstances().GetCallbackAtIndex(idx); 1494 } 1495 1496 LanguageSet PluginManager::GetAllTypeSystemSupportedLanguagesForTypes() { 1497 const auto &instances = GetTypeSystemInstances().GetInstances(); 1498 LanguageSet all; 1499 for (unsigned i = 0; i < instances.size(); ++i) 1500 all.bitvector |= instances[i].supported_languages_for_types.bitvector; 1501 return all; 1502 } 1503 1504 LanguageSet PluginManager::GetAllTypeSystemSupportedLanguagesForExpressions() { 1505 const auto &instances = GetTypeSystemInstances().GetInstances(); 1506 LanguageSet all; 1507 for (unsigned i = 0; i < instances.size(); ++i) 1508 all.bitvector |= instances[i].supported_languages_for_expressions.bitvector; 1509 return all; 1510 } 1511 1512 #pragma mark ScriptedInterfaces 1513 1514 struct ScriptedInterfaceInstance 1515 : public PluginInstance<ScriptedInterfaceCreateInstance> { 1516 ScriptedInterfaceInstance(llvm::StringRef name, llvm::StringRef description, 1517 ScriptedInterfaceCreateInstance create_callback, 1518 lldb::ScriptLanguage language, 1519 ScriptedInterfaceUsages usages) 1520 : PluginInstance<ScriptedInterfaceCreateInstance>(name, description, 1521 create_callback), 1522 language(language), usages(usages) {} 1523 1524 lldb::ScriptLanguage language; 1525 ScriptedInterfaceUsages usages; 1526 }; 1527 1528 typedef PluginInstances<ScriptedInterfaceInstance> ScriptedInterfaceInstances; 1529 1530 static ScriptedInterfaceInstances &GetScriptedInterfaceInstances() { 1531 static ScriptedInterfaceInstances g_instances; 1532 return g_instances; 1533 } 1534 1535 bool PluginManager::RegisterPlugin( 1536 llvm::StringRef name, llvm::StringRef description, 1537 ScriptedInterfaceCreateInstance create_callback, 1538 lldb::ScriptLanguage language, ScriptedInterfaceUsages usages) { 1539 return GetScriptedInterfaceInstances().RegisterPlugin( 1540 name, description, create_callback, language, usages); 1541 } 1542 1543 bool PluginManager::UnregisterPlugin( 1544 ScriptedInterfaceCreateInstance create_callback) { 1545 return GetScriptedInterfaceInstances().UnregisterPlugin(create_callback); 1546 } 1547 1548 uint32_t PluginManager::GetNumScriptedInterfaces() { 1549 return GetScriptedInterfaceInstances().GetInstances().size(); 1550 } 1551 1552 llvm::StringRef PluginManager::GetScriptedInterfaceNameAtIndex(uint32_t index) { 1553 return GetScriptedInterfaceInstances().GetNameAtIndex(index); 1554 } 1555 1556 llvm::StringRef 1557 PluginManager::GetScriptedInterfaceDescriptionAtIndex(uint32_t index) { 1558 return GetScriptedInterfaceInstances().GetDescriptionAtIndex(index); 1559 } 1560 1561 lldb::ScriptLanguage 1562 PluginManager::GetScriptedInterfaceLanguageAtIndex(uint32_t idx) { 1563 const auto &instances = GetScriptedInterfaceInstances().GetInstances(); 1564 return idx < instances.size() ? instances[idx].language 1565 : ScriptLanguage::eScriptLanguageNone; 1566 } 1567 1568 ScriptedInterfaceUsages 1569 PluginManager::GetScriptedInterfaceUsagesAtIndex(uint32_t idx) { 1570 const auto &instances = GetScriptedInterfaceInstances().GetInstances(); 1571 if (idx >= instances.size()) 1572 return {}; 1573 return instances[idx].usages; 1574 } 1575 1576 #pragma mark REPL 1577 1578 struct REPLInstance : public PluginInstance<REPLCreateInstance> { 1579 REPLInstance(llvm::StringRef name, llvm::StringRef description, 1580 CallbackType create_callback, LanguageSet supported_languages) 1581 : PluginInstance<REPLCreateInstance>(name, description, create_callback), 1582 supported_languages(supported_languages) {} 1583 1584 LanguageSet supported_languages; 1585 }; 1586 1587 typedef PluginInstances<REPLInstance> REPLInstances; 1588 1589 static REPLInstances &GetREPLInstances() { 1590 static REPLInstances g_instances; 1591 return g_instances; 1592 } 1593 1594 bool PluginManager::RegisterPlugin(llvm::StringRef name, llvm::StringRef description, 1595 REPLCreateInstance create_callback, 1596 LanguageSet supported_languages) { 1597 return GetREPLInstances().RegisterPlugin(name, description, create_callback, 1598 supported_languages); 1599 } 1600 1601 bool PluginManager::UnregisterPlugin(REPLCreateInstance create_callback) { 1602 return GetREPLInstances().UnregisterPlugin(create_callback); 1603 } 1604 1605 REPLCreateInstance PluginManager::GetREPLCreateCallbackAtIndex(uint32_t idx) { 1606 return GetREPLInstances().GetCallbackAtIndex(idx); 1607 } 1608 1609 LanguageSet PluginManager::GetREPLSupportedLanguagesAtIndex(uint32_t idx) { 1610 const auto &instances = GetREPLInstances().GetInstances(); 1611 return idx < instances.size() ? instances[idx].supported_languages 1612 : LanguageSet(); 1613 } 1614 1615 LanguageSet PluginManager::GetREPLAllTypeSystemSupportedLanguages() { 1616 const auto &instances = GetREPLInstances().GetInstances(); 1617 LanguageSet all; 1618 for (unsigned i = 0; i < instances.size(); ++i) 1619 all.bitvector |= instances[i].supported_languages.bitvector; 1620 return all; 1621 } 1622 1623 #pragma mark PluginManager 1624 1625 void PluginManager::DebuggerInitialize(Debugger &debugger) { 1626 GetDynamicLoaderInstances().PerformDebuggerCallback(debugger); 1627 GetJITLoaderInstances().PerformDebuggerCallback(debugger); 1628 GetObjectFileInstances().PerformDebuggerCallback(debugger); 1629 GetPlatformInstances().PerformDebuggerCallback(debugger); 1630 GetProcessInstances().PerformDebuggerCallback(debugger); 1631 GetSymbolFileInstances().PerformDebuggerCallback(debugger); 1632 GetSymbolLocatorInstances().PerformDebuggerCallback(debugger); 1633 GetOperatingSystemInstances().PerformDebuggerCallback(debugger); 1634 GetStructuredDataPluginInstances().PerformDebuggerCallback(debugger); 1635 GetTracePluginInstances().PerformDebuggerCallback(debugger); 1636 GetScriptedInterfaceInstances().PerformDebuggerCallback(debugger); 1637 } 1638 1639 // This is the preferred new way to register plugin specific settings. e.g. 1640 // This will put a plugin's settings under e.g. 1641 // "plugin.<plugin_type_name>.<plugin_type_desc>.SETTINGNAME". 1642 static lldb::OptionValuePropertiesSP 1643 GetDebuggerPropertyForPlugins(Debugger &debugger, llvm::StringRef plugin_type_name, 1644 llvm::StringRef plugin_type_desc, 1645 bool can_create) { 1646 lldb::OptionValuePropertiesSP parent_properties_sp( 1647 debugger.GetValueProperties()); 1648 if (parent_properties_sp) { 1649 static constexpr llvm::StringLiteral g_property_name("plugin"); 1650 1651 OptionValuePropertiesSP plugin_properties_sp = 1652 parent_properties_sp->GetSubProperty(nullptr, g_property_name); 1653 if (!plugin_properties_sp && can_create) { 1654 plugin_properties_sp = 1655 std::make_shared<OptionValueProperties>(g_property_name); 1656 parent_properties_sp->AppendProperty(g_property_name, 1657 "Settings specify to plugins.", true, 1658 plugin_properties_sp); 1659 } 1660 1661 if (plugin_properties_sp) { 1662 lldb::OptionValuePropertiesSP plugin_type_properties_sp = 1663 plugin_properties_sp->GetSubProperty(nullptr, plugin_type_name); 1664 if (!plugin_type_properties_sp && can_create) { 1665 plugin_type_properties_sp = 1666 std::make_shared<OptionValueProperties>(plugin_type_name); 1667 plugin_properties_sp->AppendProperty(plugin_type_name, plugin_type_desc, 1668 true, plugin_type_properties_sp); 1669 } 1670 return plugin_type_properties_sp; 1671 } 1672 } 1673 return lldb::OptionValuePropertiesSP(); 1674 } 1675 1676 // This is deprecated way to register plugin specific settings. e.g. 1677 // "<plugin_type_name>.plugin.<plugin_type_desc>.SETTINGNAME" and Platform 1678 // generic settings would be under "platform.SETTINGNAME". 1679 static lldb::OptionValuePropertiesSP GetDebuggerPropertyForPluginsOldStyle( 1680 Debugger &debugger, llvm::StringRef plugin_type_name, 1681 llvm::StringRef plugin_type_desc, bool can_create) { 1682 static constexpr llvm::StringLiteral g_property_name("plugin"); 1683 lldb::OptionValuePropertiesSP parent_properties_sp( 1684 debugger.GetValueProperties()); 1685 if (parent_properties_sp) { 1686 OptionValuePropertiesSP plugin_properties_sp = 1687 parent_properties_sp->GetSubProperty(nullptr, plugin_type_name); 1688 if (!plugin_properties_sp && can_create) { 1689 plugin_properties_sp = 1690 std::make_shared<OptionValueProperties>(plugin_type_name); 1691 parent_properties_sp->AppendProperty(plugin_type_name, plugin_type_desc, 1692 true, plugin_properties_sp); 1693 } 1694 1695 if (plugin_properties_sp) { 1696 lldb::OptionValuePropertiesSP plugin_type_properties_sp = 1697 plugin_properties_sp->GetSubProperty(nullptr, g_property_name); 1698 if (!plugin_type_properties_sp && can_create) { 1699 plugin_type_properties_sp = 1700 std::make_shared<OptionValueProperties>(g_property_name); 1701 plugin_properties_sp->AppendProperty(g_property_name, 1702 "Settings specific to plugins", 1703 true, plugin_type_properties_sp); 1704 } 1705 return plugin_type_properties_sp; 1706 } 1707 } 1708 return lldb::OptionValuePropertiesSP(); 1709 } 1710 1711 namespace { 1712 1713 typedef lldb::OptionValuePropertiesSP 1714 GetDebuggerPropertyForPluginsPtr(Debugger &, llvm::StringRef, llvm::StringRef, 1715 bool can_create); 1716 } 1717 1718 static lldb::OptionValuePropertiesSP 1719 GetSettingForPlugin(Debugger &debugger, llvm::StringRef setting_name, 1720 llvm::StringRef plugin_type_name, 1721 GetDebuggerPropertyForPluginsPtr get_debugger_property = 1722 GetDebuggerPropertyForPlugins) { 1723 lldb::OptionValuePropertiesSP properties_sp; 1724 lldb::OptionValuePropertiesSP plugin_type_properties_sp(get_debugger_property( 1725 debugger, plugin_type_name, 1726 "", // not creating to so we don't need the description 1727 false)); 1728 if (plugin_type_properties_sp) 1729 properties_sp = 1730 plugin_type_properties_sp->GetSubProperty(nullptr, setting_name); 1731 return properties_sp; 1732 } 1733 1734 static bool 1735 CreateSettingForPlugin(Debugger &debugger, llvm::StringRef plugin_type_name, 1736 llvm::StringRef plugin_type_desc, 1737 const lldb::OptionValuePropertiesSP &properties_sp, 1738 llvm::StringRef description, bool is_global_property, 1739 GetDebuggerPropertyForPluginsPtr get_debugger_property = 1740 GetDebuggerPropertyForPlugins) { 1741 if (properties_sp) { 1742 lldb::OptionValuePropertiesSP plugin_type_properties_sp( 1743 get_debugger_property(debugger, plugin_type_name, plugin_type_desc, 1744 true)); 1745 if (plugin_type_properties_sp) { 1746 plugin_type_properties_sp->AppendProperty(properties_sp->GetName(), 1747 description, is_global_property, 1748 properties_sp); 1749 return true; 1750 } 1751 } 1752 return false; 1753 } 1754 1755 static constexpr llvm::StringLiteral kDynamicLoaderPluginName("dynamic-loader"); 1756 static constexpr llvm::StringLiteral kPlatformPluginName("platform"); 1757 static constexpr llvm::StringLiteral kProcessPluginName("process"); 1758 static constexpr llvm::StringLiteral kTracePluginName("trace"); 1759 static constexpr llvm::StringLiteral kObjectFilePluginName("object-file"); 1760 static constexpr llvm::StringLiteral kSymbolFilePluginName("symbol-file"); 1761 static constexpr llvm::StringLiteral kSymbolLocatorPluginName("symbol-locator"); 1762 static constexpr llvm::StringLiteral kJITLoaderPluginName("jit-loader"); 1763 static constexpr llvm::StringLiteral 1764 kStructuredDataPluginName("structured-data"); 1765 1766 lldb::OptionValuePropertiesSP 1767 PluginManager::GetSettingForDynamicLoaderPlugin(Debugger &debugger, 1768 llvm::StringRef setting_name) { 1769 return GetSettingForPlugin(debugger, setting_name, kDynamicLoaderPluginName); 1770 } 1771 1772 bool PluginManager::CreateSettingForDynamicLoaderPlugin( 1773 Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp, 1774 llvm::StringRef description, bool is_global_property) { 1775 return CreateSettingForPlugin(debugger, kDynamicLoaderPluginName, 1776 "Settings for dynamic loader plug-ins", 1777 properties_sp, description, is_global_property); 1778 } 1779 1780 lldb::OptionValuePropertiesSP 1781 PluginManager::GetSettingForPlatformPlugin(Debugger &debugger, 1782 llvm::StringRef setting_name) { 1783 return GetSettingForPlugin(debugger, setting_name, kPlatformPluginName, 1784 GetDebuggerPropertyForPluginsOldStyle); 1785 } 1786 1787 bool PluginManager::CreateSettingForPlatformPlugin( 1788 Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp, 1789 llvm::StringRef description, bool is_global_property) { 1790 return CreateSettingForPlugin(debugger, kPlatformPluginName, 1791 "Settings for platform plug-ins", properties_sp, 1792 description, is_global_property, 1793 GetDebuggerPropertyForPluginsOldStyle); 1794 } 1795 1796 lldb::OptionValuePropertiesSP 1797 PluginManager::GetSettingForProcessPlugin(Debugger &debugger, 1798 llvm::StringRef setting_name) { 1799 return GetSettingForPlugin(debugger, setting_name, kProcessPluginName); 1800 } 1801 1802 bool PluginManager::CreateSettingForProcessPlugin( 1803 Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp, 1804 llvm::StringRef description, bool is_global_property) { 1805 return CreateSettingForPlugin(debugger, kProcessPluginName, 1806 "Settings for process plug-ins", properties_sp, 1807 description, is_global_property); 1808 } 1809 1810 lldb::OptionValuePropertiesSP 1811 PluginManager::GetSettingForSymbolLocatorPlugin(Debugger &debugger, 1812 llvm::StringRef setting_name) { 1813 return GetSettingForPlugin(debugger, setting_name, kSymbolLocatorPluginName); 1814 } 1815 1816 bool PluginManager::CreateSettingForSymbolLocatorPlugin( 1817 Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp, 1818 llvm::StringRef description, bool is_global_property) { 1819 return CreateSettingForPlugin(debugger, kSymbolLocatorPluginName, 1820 "Settings for symbol locator plug-ins", 1821 properties_sp, description, is_global_property); 1822 } 1823 1824 bool PluginManager::CreateSettingForTracePlugin( 1825 Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp, 1826 llvm::StringRef description, bool is_global_property) { 1827 return CreateSettingForPlugin(debugger, kTracePluginName, 1828 "Settings for trace plug-ins", properties_sp, 1829 description, is_global_property); 1830 } 1831 1832 lldb::OptionValuePropertiesSP 1833 PluginManager::GetSettingForObjectFilePlugin(Debugger &debugger, 1834 llvm::StringRef setting_name) { 1835 return GetSettingForPlugin(debugger, setting_name, kObjectFilePluginName); 1836 } 1837 1838 bool PluginManager::CreateSettingForObjectFilePlugin( 1839 Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp, 1840 llvm::StringRef description, bool is_global_property) { 1841 return CreateSettingForPlugin(debugger, kObjectFilePluginName, 1842 "Settings for object file plug-ins", 1843 properties_sp, description, is_global_property); 1844 } 1845 1846 lldb::OptionValuePropertiesSP 1847 PluginManager::GetSettingForSymbolFilePlugin(Debugger &debugger, 1848 llvm::StringRef setting_name) { 1849 return GetSettingForPlugin(debugger, setting_name, kSymbolFilePluginName); 1850 } 1851 1852 bool PluginManager::CreateSettingForSymbolFilePlugin( 1853 Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp, 1854 llvm::StringRef description, bool is_global_property) { 1855 return CreateSettingForPlugin(debugger, kSymbolFilePluginName, 1856 "Settings for symbol file plug-ins", 1857 properties_sp, description, is_global_property); 1858 } 1859 1860 lldb::OptionValuePropertiesSP 1861 PluginManager::GetSettingForJITLoaderPlugin(Debugger &debugger, 1862 llvm::StringRef setting_name) { 1863 return GetSettingForPlugin(debugger, setting_name, kJITLoaderPluginName); 1864 } 1865 1866 bool PluginManager::CreateSettingForJITLoaderPlugin( 1867 Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp, 1868 llvm::StringRef description, bool is_global_property) { 1869 return CreateSettingForPlugin(debugger, kJITLoaderPluginName, 1870 "Settings for JIT loader plug-ins", 1871 properties_sp, description, is_global_property); 1872 } 1873 1874 static const char *kOperatingSystemPluginName("os"); 1875 1876 lldb::OptionValuePropertiesSP 1877 PluginManager::GetSettingForOperatingSystemPlugin(Debugger &debugger, 1878 llvm::StringRef setting_name) { 1879 lldb::OptionValuePropertiesSP properties_sp; 1880 lldb::OptionValuePropertiesSP plugin_type_properties_sp( 1881 GetDebuggerPropertyForPlugins( 1882 debugger, kOperatingSystemPluginName, 1883 "", // not creating to so we don't need the description 1884 false)); 1885 if (plugin_type_properties_sp) 1886 properties_sp = 1887 plugin_type_properties_sp->GetSubProperty(nullptr, setting_name); 1888 return properties_sp; 1889 } 1890 1891 bool PluginManager::CreateSettingForOperatingSystemPlugin( 1892 Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp, 1893 llvm::StringRef description, bool is_global_property) { 1894 if (properties_sp) { 1895 lldb::OptionValuePropertiesSP plugin_type_properties_sp( 1896 GetDebuggerPropertyForPlugins(debugger, kOperatingSystemPluginName, 1897 "Settings for operating system plug-ins", 1898 true)); 1899 if (plugin_type_properties_sp) { 1900 plugin_type_properties_sp->AppendProperty(properties_sp->GetName(), 1901 description, is_global_property, 1902 properties_sp); 1903 return true; 1904 } 1905 } 1906 return false; 1907 } 1908 1909 lldb::OptionValuePropertiesSP 1910 PluginManager::GetSettingForStructuredDataPlugin(Debugger &debugger, 1911 llvm::StringRef setting_name) { 1912 return GetSettingForPlugin(debugger, setting_name, kStructuredDataPluginName); 1913 } 1914 1915 bool PluginManager::CreateSettingForStructuredDataPlugin( 1916 Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp, 1917 llvm::StringRef description, bool is_global_property) { 1918 return CreateSettingForPlugin(debugger, kStructuredDataPluginName, 1919 "Settings for structured data plug-ins", 1920 properties_sp, description, is_global_property); 1921 } 1922