1dda28197Spatrick //===-- SystemInitializerFull.cpp -----------------------------------------===// 2061da546Spatrick // 3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information. 5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6061da546Spatrick // 7061da546Spatrick //===----------------------------------------------------------------------===// 8061da546Spatrick 9061da546Spatrick #include "SystemInitializerFull.h" 10061da546Spatrick #include "lldb/API/SBCommandInterpreter.h" 11061da546Spatrick #include "lldb/Core/Debugger.h" 12dda28197Spatrick #include "lldb/Core/PluginManager.h" 13dda28197Spatrick #include "lldb/Host/Config.h" 14061da546Spatrick #include "lldb/Host/Host.h" 15061da546Spatrick #include "lldb/Initialization/SystemInitializerCommon.h" 16061da546Spatrick #include "lldb/Interpreter/CommandInterpreter.h" 17be691f3bSpatrick #include "lldb/Target/ProcessTrace.h" 18061da546Spatrick #include "lldb/Utility/Timer.h" 19be691f3bSpatrick #include "llvm/Support/CommandLine.h" 20061da546Spatrick #include "llvm/Support/TargetSelect.h" 21061da546Spatrick 22061da546Spatrick #pragma clang diagnostic push 23061da546Spatrick #pragma clang diagnostic ignored "-Wglobal-constructors" 24061da546Spatrick #include "llvm/ExecutionEngine/MCJIT.h" 25061da546Spatrick #pragma clang diagnostic pop 26061da546Spatrick 27061da546Spatrick #include <string> 28061da546Spatrick 29dda28197Spatrick #define LLDB_PLUGIN(p) LLDB_PLUGIN_DECLARE(p) 30dda28197Spatrick #include "Plugins/Plugins.def" 31dda28197Spatrick 32be691f3bSpatrick #if LLDB_ENABLE_PYTHON 33be691f3bSpatrick #include "Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.h" 34be691f3bSpatrick 35be691f3bSpatrick constexpr lldb_private::HostInfo::SharedLibraryDirectoryHelper 36be691f3bSpatrick *g_shlib_dir_helper = 37be691f3bSpatrick lldb_private::ScriptInterpreterPython::SharedLibraryDirectoryHelper; 38be691f3bSpatrick 39be691f3bSpatrick #else 40be691f3bSpatrick constexpr lldb_private::HostInfo::SharedLibraryDirectoryHelper 41*f6aab3d8Srobert *g_shlib_dir_helper = nullptr; 42be691f3bSpatrick #endif 43be691f3bSpatrick 44061da546Spatrick using namespace lldb_private; 45061da546Spatrick SystemInitializerFull()46be691f3bSpatrickSystemInitializerFull::SystemInitializerFull() 47be691f3bSpatrick : SystemInitializerCommon(g_shlib_dir_helper) {} 48dda28197Spatrick SystemInitializerFull::~SystemInitializerFull() = default; 49061da546Spatrick Initialize()50061da546Spatrickllvm::Error SystemInitializerFull::Initialize() { 51be691f3bSpatrick llvm::Error error = SystemInitializerCommon::Initialize(); 52*f6aab3d8Srobert if (error) 53be691f3bSpatrick return error; 54061da546Spatrick 55061da546Spatrick // Initialize LLVM and Clang 56061da546Spatrick llvm::InitializeAllTargets(); 57061da546Spatrick llvm::InitializeAllAsmPrinters(); 58061da546Spatrick llvm::InitializeAllTargetMCs(); 59061da546Spatrick llvm::InitializeAllDisassemblers(); 60be691f3bSpatrick // Initialize the command line parser in LLVM. This usually isn't necessary 61be691f3bSpatrick // as we aren't dealing with command line options here, but otherwise some 62be691f3bSpatrick // other code in Clang/LLVM might be tempted to call this function from a 63be691f3bSpatrick // different thread later on which won't work (as the function isn't 64be691f3bSpatrick // thread-safe). 65be691f3bSpatrick const char *arg0 = "lldb"; 66be691f3bSpatrick llvm::cl::ParseCommandLineOptions(1, &arg0); 67061da546Spatrick 68dda28197Spatrick #define LLDB_PLUGIN(p) LLDB_PLUGIN_INITIALIZE(p); 69dda28197Spatrick #include "Plugins/Plugins.def" 70061da546Spatrick 71be691f3bSpatrick // Initialize plug-ins in core LLDB 72be691f3bSpatrick ProcessTrace::Initialize(); 73be691f3bSpatrick 74061da546Spatrick // Scan for any system or user LLDB plug-ins 75061da546Spatrick PluginManager::Initialize(); 76061da546Spatrick 77061da546Spatrick // The process settings need to know about installed plug-ins, so the 78dda28197Spatrick // Settings must be initialized AFTER PluginManager::Initialize is called. 79061da546Spatrick Debugger::SettingsInitialize(); 80061da546Spatrick 81061da546Spatrick return llvm::Error::success(); 82061da546Spatrick } 83061da546Spatrick Terminate()84061da546Spatrickvoid SystemInitializerFull::Terminate() { 85061da546Spatrick Debugger::SettingsTerminate(); 86061da546Spatrick 87be691f3bSpatrick // Terminate plug-ins in core LLDB 88be691f3bSpatrick ProcessTrace::Terminate(); 89be691f3bSpatrick 90061da546Spatrick // Terminate and unload and loaded system or user LLDB plug-ins 91061da546Spatrick PluginManager::Terminate(); 92061da546Spatrick 93dda28197Spatrick #define LLDB_PLUGIN(p) LLDB_PLUGIN_TERMINATE(p); 94dda28197Spatrick #include "Plugins/Plugins.def" 95061da546Spatrick 96061da546Spatrick // Now shutdown the common parts, in reverse order. 97061da546Spatrick SystemInitializerCommon::Terminate(); 98061da546Spatrick } 99