180814287SRaphael Isemann //===-- SystemInitializerFull.cpp -----------------------------------------===// 2e6e2bb38SZachary Turner // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6e6e2bb38SZachary Turner // 7e6e2bb38SZachary Turner //===----------------------------------------------------------------------===// 8e6e2bb38SZachary Turner 9d17cd902SAlex Langford #include "SystemInitializerFull.h" 102c1f46dcSZachary Turner #include "lldb/API/SBCommandInterpreter.h" 11e6e2bb38SZachary Turner #include "lldb/Core/Debugger.h" 12fbb4d1e4SJonas Devlieghere #include "lldb/Core/PluginManager.h" 13fbb4d1e4SJonas Devlieghere #include "lldb/Host/Config.h" 14e6e2bb38SZachary Turner #include "lldb/Host/Host.h" 15e6e2bb38SZachary Turner #include "lldb/Initialization/SystemInitializerCommon.h" 162c1f46dcSZachary Turner #include "lldb/Interpreter/CommandInterpreter.h" 178a203bb2SWalter Erquinigo #include "lldb/Target/ProcessTrace.h" 18b31d7879SJonas Devlieghere #include "lldb/Utility/Reproducer.h" 1938d0632eSPavel Labath #include "lldb/Utility/Timer.h" 2018dbe0f9SRaphael Isemann #include "llvm/Support/CommandLine.h" 21e6e2bb38SZachary Turner #include "llvm/Support/TargetSelect.h" 22e6e2bb38SZachary Turner 235a36558cSSaleem Abdulrasool #pragma clang diagnostic push 245a36558cSSaleem Abdulrasool #pragma clang diagnostic ignored "-Wglobal-constructors" 255a36558cSSaleem Abdulrasool #include "llvm/ExecutionEngine/MCJIT.h" 265a36558cSSaleem Abdulrasool #pragma clang diagnostic pop 275a36558cSSaleem Abdulrasool 28e6e2bb38SZachary Turner #include <string> 29e6e2bb38SZachary Turner 302d146aa2SJonas Devlieghere #define LLDB_PLUGIN(p) LLDB_PLUGIN_DECLARE(p) 312d146aa2SJonas Devlieghere #include "Plugins/Plugins.def" 323e70a919SJonas Devlieghere 33004a264fSPavel Labath #if LLDB_ENABLE_PYTHON 34004a264fSPavel Labath #include "Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.h" 35004a264fSPavel Labath 36004a264fSPavel Labath constexpr lldb_private::HostInfo::SharedLibraryDirectoryHelper 37004a264fSPavel Labath *g_shlib_dir_helper = 38004a264fSPavel Labath lldb_private::ScriptInterpreterPython::SharedLibraryDirectoryHelper; 39004a264fSPavel Labath 40004a264fSPavel Labath #else 41004a264fSPavel Labath constexpr lldb_private::HostInfo::SharedLibraryDirectoryHelper 42*b8336280SKazu Hirata *g_shlib_dir_helper = nullptr; 43004a264fSPavel Labath #endif 44004a264fSPavel Labath 45e6e2bb38SZachary Turner using namespace lldb_private; 46e6e2bb38SZachary Turner SystemInitializerFull()47004a264fSPavel LabathSystemInitializerFull::SystemInitializerFull() 48004a264fSPavel Labath : SystemInitializerCommon(g_shlib_dir_helper) {} 49866b7a65SJonas Devlieghere SystemInitializerFull::~SystemInitializerFull() = default; 50e6e2bb38SZachary Turner Initialize()51936c6242SJonas Devliegherellvm::Error SystemInitializerFull::Initialize() { 52b31d7879SJonas Devlieghere llvm::Error error = SystemInitializerCommon::Initialize(); 53fa126069SJonas Devlieghere if (error) 54b31d7879SJonas Devlieghere return error; 55fa3fa5b9SPavel Labath 56e6e2bb38SZachary Turner // Initialize LLVM and Clang 57e6e2bb38SZachary Turner llvm::InitializeAllTargets(); 58e6e2bb38SZachary Turner llvm::InitializeAllAsmPrinters(); 59e6e2bb38SZachary Turner llvm::InitializeAllTargetMCs(); 60e6e2bb38SZachary Turner llvm::InitializeAllDisassemblers(); 6118dbe0f9SRaphael Isemann // Initialize the command line parser in LLVM. This usually isn't necessary 6218dbe0f9SRaphael Isemann // as we aren't dealing with command line options here, but otherwise some 6318dbe0f9SRaphael Isemann // other code in Clang/LLVM might be tempted to call this function from a 6418dbe0f9SRaphael Isemann // different thread later on which won't work (as the function isn't 6518dbe0f9SRaphael Isemann // thread-safe). 6618dbe0f9SRaphael Isemann const char *arg0 = "lldb"; 6718dbe0f9SRaphael Isemann llvm::cl::ParseCommandLineOptions(1, &arg0); 68e6e2bb38SZachary Turner 6980c3ea4eSJonas Devlieghere #define LLDB_PLUGIN(p) LLDB_PLUGIN_INITIALIZE(p); 7080c3ea4eSJonas Devlieghere #include "Plugins/Plugins.def" 7150c9cd95SJonas Devlieghere 728a203bb2SWalter Erquinigo // Initialize plug-ins in core LLDB 738a203bb2SWalter Erquinigo ProcessTrace::Initialize(); 748a203bb2SWalter Erquinigo 7550c9cd95SJonas Devlieghere // Scan for any system or user LLDB plug-ins 76e6e2bb38SZachary Turner PluginManager::Initialize(); 77e6e2bb38SZachary Turner 7805097246SAdrian Prantl // The process settings need to know about installed plug-ins, so the 7980c3ea4eSJonas Devlieghere // Settings must be initialized AFTER PluginManager::Initialize is called. 80e6e2bb38SZachary Turner Debugger::SettingsInitialize(); 8115eacd74SJonas Devlieghere 8215eacd74SJonas Devlieghere return llvm::Error::success(); 83e6e2bb38SZachary Turner } 84e6e2bb38SZachary Turner Terminate()85b9c1b51eSKate Stonevoid SystemInitializerFull::Terminate() { 86e6e2bb38SZachary Turner Debugger::SettingsTerminate(); 87e6e2bb38SZachary Turner 888a203bb2SWalter Erquinigo // Terminate plug-ins in core LLDB 898a203bb2SWalter Erquinigo ProcessTrace::Terminate(); 908a203bb2SWalter Erquinigo 9150c9cd95SJonas Devlieghere // Terminate and unload and loaded system or user LLDB plug-ins 92e6e2bb38SZachary Turner PluginManager::Terminate(); 9356939cb3SGreg Clayton 9480c3ea4eSJonas Devlieghere #define LLDB_PLUGIN(p) LLDB_PLUGIN_TERMINATE(p); 9580c3ea4eSJonas Devlieghere #include "Plugins/Plugins.def" 96fbb4d1e4SJonas Devlieghere 97e6e2bb38SZachary Turner // Now shutdown the common parts, in reverse order. 98e6e2bb38SZachary Turner SystemInitializerCommon::Terminate(); 99e6e2bb38SZachary Turner } 100