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()46be691f3bSpatrick SystemInitializerFull::SystemInitializerFull()
47be691f3bSpatrick     : SystemInitializerCommon(g_shlib_dir_helper) {}
48dda28197Spatrick SystemInitializerFull::~SystemInitializerFull() = default;
49061da546Spatrick 
Initialize()50061da546Spatrick llvm::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()84061da546Spatrick void 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