15ffd83dbSDimitry Andric //===-- SystemInitializerFull.cpp -----------------------------------------===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric 90b57cec5SDimitry Andric #include "SystemInitializerFull.h" 100b57cec5SDimitry Andric #include "lldb/API/SBCommandInterpreter.h" 110b57cec5SDimitry Andric #include "lldb/Core/Debugger.h" 125ffd83dbSDimitry Andric #include "lldb/Core/PluginManager.h" 135ffd83dbSDimitry Andric #include "lldb/Host/Config.h" 140b57cec5SDimitry Andric #include "lldb/Host/Host.h" 150b57cec5SDimitry Andric #include "lldb/Initialization/SystemInitializerCommon.h" 160b57cec5SDimitry Andric #include "lldb/Interpreter/CommandInterpreter.h" 17e8d8bef9SDimitry Andric #include "lldb/Target/ProcessTrace.h" 180b57cec5SDimitry Andric #include "lldb/Utility/Timer.h" 19fe6060f1SDimitry Andric #include "llvm/Support/CommandLine.h" 200b57cec5SDimitry Andric #include "llvm/Support/TargetSelect.h" 210b57cec5SDimitry Andric 220b57cec5SDimitry Andric #pragma clang diagnostic push 230b57cec5SDimitry Andric #pragma clang diagnostic ignored "-Wglobal-constructors" 240b57cec5SDimitry Andric #include "llvm/ExecutionEngine/MCJIT.h" 250b57cec5SDimitry Andric #pragma clang diagnostic pop 260b57cec5SDimitry Andric 270b57cec5SDimitry Andric #include <string> 280b57cec5SDimitry Andric 295ffd83dbSDimitry Andric #define LLDB_PLUGIN(p) LLDB_PLUGIN_DECLARE(p) 305ffd83dbSDimitry Andric #include "Plugins/Plugins.def" 315ffd83dbSDimitry Andric 32fe6060f1SDimitry Andric #if LLDB_ENABLE_PYTHON 33fe6060f1SDimitry Andric #include "Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.h" 34fe6060f1SDimitry Andric 35fe6060f1SDimitry Andric constexpr lldb_private::HostInfo::SharedLibraryDirectoryHelper 36fe6060f1SDimitry Andric *g_shlib_dir_helper = 37fe6060f1SDimitry Andric lldb_private::ScriptInterpreterPython::SharedLibraryDirectoryHelper; 38fe6060f1SDimitry Andric 39fe6060f1SDimitry Andric #else 40fe6060f1SDimitry Andric constexpr lldb_private::HostInfo::SharedLibraryDirectoryHelper 4104eeddc0SDimitry Andric *g_shlib_dir_helper = nullptr; 42fe6060f1SDimitry Andric #endif 43fe6060f1SDimitry Andric 440b57cec5SDimitry Andric using namespace lldb_private; 450b57cec5SDimitry Andric SystemInitializerFull()46fe6060f1SDimitry AndricSystemInitializerFull::SystemInitializerFull() 47fe6060f1SDimitry Andric : SystemInitializerCommon(g_shlib_dir_helper) {} 485ffd83dbSDimitry Andric SystemInitializerFull::~SystemInitializerFull() = default; 499dba64beSDimitry Andric Initialize()500b57cec5SDimitry Andricllvm::Error SystemInitializerFull::Initialize() { 51e8d8bef9SDimitry Andric llvm::Error error = SystemInitializerCommon::Initialize(); 520eae32dcSDimitry Andric if (error) 53e8d8bef9SDimitry Andric return error; 540b57cec5SDimitry Andric 550b57cec5SDimitry Andric // Initialize LLVM and Clang 560b57cec5SDimitry Andric llvm::InitializeAllTargets(); 570b57cec5SDimitry Andric llvm::InitializeAllAsmPrinters(); 580b57cec5SDimitry Andric llvm::InitializeAllTargetMCs(); 590b57cec5SDimitry Andric llvm::InitializeAllDisassemblers(); 60fe6060f1SDimitry Andric // Initialize the command line parser in LLVM. This usually isn't necessary 61fe6060f1SDimitry Andric // as we aren't dealing with command line options here, but otherwise some 62fe6060f1SDimitry Andric // other code in Clang/LLVM might be tempted to call this function from a 63fe6060f1SDimitry Andric // different thread later on which won't work (as the function isn't 64fe6060f1SDimitry Andric // thread-safe). 65fe6060f1SDimitry Andric const char *arg0 = "lldb"; 66fe6060f1SDimitry Andric llvm::cl::ParseCommandLineOptions(1, &arg0); 670b57cec5SDimitry Andric 685ffd83dbSDimitry Andric #define LLDB_PLUGIN(p) LLDB_PLUGIN_INITIALIZE(p); 695ffd83dbSDimitry Andric #include "Plugins/Plugins.def" 700b57cec5SDimitry Andric 710b57cec5SDimitry Andric // Scan for any system or user LLDB plug-ins 720b57cec5SDimitry Andric PluginManager::Initialize(); 730b57cec5SDimitry Andric 740b57cec5SDimitry Andric // The process settings need to know about installed plug-ins, so the 755ffd83dbSDimitry Andric // Settings must be initialized AFTER PluginManager::Initialize is called. 760b57cec5SDimitry Andric Debugger::SettingsInitialize(); 770b57cec5SDimitry Andric 78*fe013be4SDimitry Andric // Use the Debugger's LLDBAssert callback. 79*fe013be4SDimitry Andric SetLLDBAssertCallback(Debugger::AssertCallback); 80*fe013be4SDimitry Andric 810b57cec5SDimitry Andric return llvm::Error::success(); 820b57cec5SDimitry Andric } 830b57cec5SDimitry Andric Terminate()840b57cec5SDimitry Andricvoid SystemInitializerFull::Terminate() { 850b57cec5SDimitry Andric Debugger::SettingsTerminate(); 860b57cec5SDimitry Andric 87e8d8bef9SDimitry Andric // Terminate plug-ins in core LLDB 88e8d8bef9SDimitry Andric ProcessTrace::Terminate(); 89e8d8bef9SDimitry Andric 900b57cec5SDimitry Andric // Terminate and unload and loaded system or user LLDB plug-ins 910b57cec5SDimitry Andric PluginManager::Terminate(); 920b57cec5SDimitry Andric 935ffd83dbSDimitry Andric #define LLDB_PLUGIN(p) LLDB_PLUGIN_TERMINATE(p); 945ffd83dbSDimitry Andric #include "Plugins/Plugins.def" 950b57cec5SDimitry Andric 960b57cec5SDimitry Andric // Now shutdown the common parts, in reverse order. 970b57cec5SDimitry Andric SystemInitializerCommon::Terminate(); 980b57cec5SDimitry Andric } 99