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 Andric SystemInitializerFull::SystemInitializerFull()
47fe6060f1SDimitry Andric     : SystemInitializerCommon(g_shlib_dir_helper) {}
485ffd83dbSDimitry Andric SystemInitializerFull::~SystemInitializerFull() = default;
499dba64beSDimitry Andric 
Initialize()500b57cec5SDimitry Andric llvm::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 Andric void 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