1 //===-- SystemInitializerTest.cpp -------------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "SystemInitializerTest.h"
10 #include "lldb/Core/Debugger.h"
11 #include "lldb/Core/PluginManager.h"
12 #include "lldb/Host/Host.h"
13 #include "lldb/Initialization/SystemInitializerCommon.h"
14 #include "lldb/Interpreter/CommandInterpreter.h"
15 #include "lldb/Utility/Timer.h"
16 #include "llvm/Support/TargetSelect.h"
17 
18 #include <string>
19 
20 LLDB_PLUGIN_DECLARE(ABIAArch64)
21 LLDB_PLUGIN_DECLARE(ABIARM)
22 LLDB_PLUGIN_DECLARE(ABIARC)
23 LLDB_PLUGIN_DECLARE(ABIHexagon)
24 LLDB_PLUGIN_DECLARE(ABIMips)
25 LLDB_PLUGIN_DECLARE(ABIPowerPC)
26 LLDB_PLUGIN_DECLARE(ABISystemZ)
27 LLDB_PLUGIN_DECLARE(ABIX86)
28 LLDB_PLUGIN_DECLARE(ObjectFileBreakpad)
29 LLDB_PLUGIN_DECLARE(ObjectFileELF)
30 LLDB_PLUGIN_DECLARE(ObjectFileJIT)
31 LLDB_PLUGIN_DECLARE(ObjectFileMachO)
32 LLDB_PLUGIN_DECLARE(ObjectFilePECOFF)
33 LLDB_PLUGIN_DECLARE(ObjectFileWasm)
34 LLDB_PLUGIN_DECLARE(ObjectContainerBSDArchive)
35 LLDB_PLUGIN_DECLARE(ObjectContainerMachOArchive)
36 LLDB_PLUGIN_DECLARE(ScriptInterpreterNone)
37 LLDB_PLUGIN_DECLARE(PlatformFreeBSD)
38 LLDB_PLUGIN_DECLARE(PlatformLinux)
39 LLDB_PLUGIN_DECLARE(PlatformNetBSD)
40 LLDB_PLUGIN_DECLARE(PlatformOpenBSD)
41 LLDB_PLUGIN_DECLARE(PlatformWindows)
42 LLDB_PLUGIN_DECLARE(PlatformAndroid)
43 LLDB_PLUGIN_DECLARE(PlatformMacOSX)
44 LLDB_PLUGIN_DECLARE(TypeSystemClang)
45 LLDB_PLUGIN_DECLARE(ArchitectureArm)
46 LLDB_PLUGIN_DECLARE(ArchitectureMips)
47 LLDB_PLUGIN_DECLARE(ArchitecturePPC64)
48 LLDB_PLUGIN_DECLARE(DisassemblerLLVMC)
49 LLDB_PLUGIN_DECLARE(JITLoaderGDB)
50 LLDB_PLUGIN_DECLARE(ProcessElfCore)
51 LLDB_PLUGIN_DECLARE(ProcessMachCore)
52 LLDB_PLUGIN_DECLARE(ProcessMinidump)
53 LLDB_PLUGIN_DECLARE(MemoryHistoryASan)
54 LLDB_PLUGIN_DECLARE(InstrumentationRuntimeASan)
55 LLDB_PLUGIN_DECLARE(InstrumentationRuntimeTSan)
56 LLDB_PLUGIN_DECLARE(InstrumentationRuntimeUBSan)
57 LLDB_PLUGIN_DECLARE(InstrumentationRuntimeMainThreadChecker)
58 LLDB_PLUGIN_DECLARE(SymbolVendorELF)
59 LLDB_PLUGIN_DECLARE(SymbolFileBreakpad)
60 LLDB_PLUGIN_DECLARE(SymbolFileDWARF)
61 LLDB_PLUGIN_DECLARE(SymbolFilePDB)
62 LLDB_PLUGIN_DECLARE(SymbolFileSymtab)
63 LLDB_PLUGIN_DECLARE(SymbolVendorWasm)
64 LLDB_PLUGIN_DECLARE(UnwindAssemblyInstEmulation)
65 LLDB_PLUGIN_DECLARE(UnwindAssemblyX86)
66 LLDB_PLUGIN_DECLARE(InstructionARM)
67 LLDB_PLUGIN_DECLARE(InstructionARM64)
68 LLDB_PLUGIN_DECLARE(InstructionMIPS)
69 LLDB_PLUGIN_DECLARE(InstructionMIPS64)
70 LLDB_PLUGIN_DECLARE(InstructionPPC64)
71 LLDB_PLUGIN_DECLARE(CXXItaniumABI)
72 LLDB_PLUGIN_DECLARE(AppleObjCRuntime)
73 LLDB_PLUGIN_DECLARE(SystemRuntimeMacOSX)
74 LLDB_PLUGIN_DECLARE(RenderScriptRuntime)
75 LLDB_PLUGIN_DECLARE(CPlusPlusLanguage)
76 LLDB_PLUGIN_DECLARE(ObjCLanguage)
77 LLDB_PLUGIN_DECLARE(ObjCPlusPlusLanguage)
78 #if defined(_WIN32)
79 LLDB_PLUGIN_DECLARE(ProcessWindowsCommon)
80 #endif
81 #if defined(__FreeBSD__)
82 LLDB_PLUGIN_DECLARE(ProcessFreeBSD)
83 #endif
84 #if defined(__APPLE__)
85 LLDB_PLUGIN_DECLARE(SymbolVendorMacOSX)
86 LLDB_PLUGIN_DECLARE(ProcessMacOSXKernel)
87 LLDB_PLUGIN_DECLARE(DynamicLoaderDarwinKernel)
88 #endif
89 LLDB_PLUGIN_DECLARE(StructuredDataDarwinLog)
90 LLDB_PLUGIN_DECLARE(PlatformGDB)
91 LLDB_PLUGIN_DECLARE(ProcessGDBRemote)
92 LLDB_PLUGIN_DECLARE(DynamicLoaderHexagonDYLD)
93 LLDB_PLUGIN_DECLARE(DynamicLoaderMacOSXDYLD)
94 LLDB_PLUGIN_DECLARE(DynamicLoaderPosixDYLD)
95 LLDB_PLUGIN_DECLARE(DynamicLoaderStatic)
96 LLDB_PLUGIN_DECLARE(DynamicLoaderWasmDYLD)
97 LLDB_PLUGIN_DECLARE(DynamicLoaderWindowsDYLD)
98 
99 using namespace lldb_private;
100 
101 SystemInitializerTest::SystemInitializerTest() {}
102 
103 SystemInitializerTest::~SystemInitializerTest() {}
104 
105 #define LLDB_PROCESS_AArch64(op) op(ABIAArch64);
106 #define LLDB_PROCESS_ARM(op) op(ABIARM);
107 #define LLDB_PROCESS_ARC(op) op(ABIARC);
108 #define LLDB_PROCESS_Hexagon(op) op(ABIHexagon);
109 #define LLDB_PROCESS_Mips(op) op(ABIMips);
110 #define LLDB_PROCESS_PowerPC(op) op(ABIPowerPC);
111 #define LLDB_PROCESS_SystemZ(op) op(ABISystemZ);
112 #define LLDB_PROCESS_X86(op) op(ABIX86);
113 
114 #define LLDB_PROCESS_AMDGPU(op)
115 #define LLDB_PROCESS_AVR(op)
116 #define LLDB_PROCESS_BPF(op)
117 #define LLDB_PROCESS_Lanai(op)
118 #define LLDB_PROCESS_MSP430(op)
119 #define LLDB_PROCESS_NVPTX(op)
120 #define LLDB_PROCESS_RISCV(op)
121 #define LLDB_PROCESS_Sparc(op)
122 #define LLDB_PROCESS_WebAssembly(op)
123 #define LLDB_PROCESS_XCore(op)
124 
125 llvm::Error SystemInitializerTest::Initialize() {
126   if (auto e = SystemInitializerCommon::Initialize())
127     return e;
128 
129   LLDB_PLUGIN_INITIALIZE(ObjectFileBreakpad);
130   LLDB_PLUGIN_INITIALIZE(ObjectFileELF);
131   LLDB_PLUGIN_INITIALIZE(ObjectFileJIT);
132   LLDB_PLUGIN_INITIALIZE(ObjectFileMachO);
133   LLDB_PLUGIN_INITIALIZE(ObjectFilePECOFF);
134   LLDB_PLUGIN_INITIALIZE(ObjectFileWasm);
135 
136   LLDB_PLUGIN_INITIALIZE(ObjectContainerBSDArchive);
137   LLDB_PLUGIN_INITIALIZE(ObjectContainerMachOArchive);
138 
139   LLDB_PLUGIN_INITIALIZE(ScriptInterpreterNone);
140 
141   LLDB_PLUGIN_INITIALIZE(PlatformFreeBSD);
142   LLDB_PLUGIN_INITIALIZE(PlatformLinux);
143   LLDB_PLUGIN_INITIALIZE(PlatformNetBSD);
144   LLDB_PLUGIN_INITIALIZE(PlatformOpenBSD);
145   LLDB_PLUGIN_INITIALIZE(PlatformWindows);
146   LLDB_PLUGIN_INITIALIZE(PlatformAndroid);
147   LLDB_PLUGIN_INITIALIZE(PlatformMacOSX);
148 
149   // Initialize LLVM and Clang
150   llvm::InitializeAllTargets();
151   llvm::InitializeAllAsmPrinters();
152   llvm::InitializeAllTargetMCs();
153   llvm::InitializeAllDisassemblers();
154 
155   LLDB_PLUGIN_INITIALIZE(TypeSystemClang);
156 
157 #define LLVM_TARGET(t) LLDB_PROCESS_##t(LLDB_PLUGIN_INITIALIZE)
158 #include "llvm/Config/Targets.def"
159 
160   LLDB_PLUGIN_INITIALIZE(ArchitectureArm);
161   LLDB_PLUGIN_INITIALIZE(ArchitectureMips);
162   LLDB_PLUGIN_INITIALIZE(ArchitecturePPC64);
163 
164   LLDB_PLUGIN_INITIALIZE(DisassemblerLLVMC);
165 
166   LLDB_PLUGIN_INITIALIZE(JITLoaderGDB);
167   LLDB_PLUGIN_INITIALIZE(ProcessElfCore);
168   LLDB_PLUGIN_INITIALIZE(ProcessMachCore);
169   LLDB_PLUGIN_INITIALIZE(ProcessMinidump);
170   LLDB_PLUGIN_INITIALIZE(MemoryHistoryASan);
171   LLDB_PLUGIN_INITIALIZE(InstrumentationRuntimeASan);
172   LLDB_PLUGIN_INITIALIZE(InstrumentationRuntimeTSan);
173   LLDB_PLUGIN_INITIALIZE(InstrumentationRuntimeUBSan);
174   LLDB_PLUGIN_INITIALIZE(InstrumentationRuntimeMainThreadChecker);
175 
176   LLDB_PLUGIN_INITIALIZE(SymbolVendorELF);
177   LLDB_PLUGIN_INITIALIZE(SymbolFileBreakpad);
178   LLDB_PLUGIN_INITIALIZE(SymbolFileDWARF);
179   LLDB_PLUGIN_INITIALIZE(SymbolFilePDB);
180   LLDB_PLUGIN_INITIALIZE(SymbolFileSymtab);
181   LLDB_PLUGIN_INITIALIZE(SymbolVendorWasm);
182   LLDB_PLUGIN_INITIALIZE(UnwindAssemblyInstEmulation);
183   LLDB_PLUGIN_INITIALIZE(UnwindAssemblyX86);
184 
185   LLDB_PLUGIN_INITIALIZE(InstructionARM);
186   LLDB_PLUGIN_INITIALIZE(InstructionARM64);
187   LLDB_PLUGIN_INITIALIZE(InstructionMIPS);
188   LLDB_PLUGIN_INITIALIZE(InstructionMIPS64);
189   LLDB_PLUGIN_INITIALIZE(InstructionPPC64);
190 
191   LLDB_PLUGIN_INITIALIZE(CXXItaniumABI);
192   LLDB_PLUGIN_INITIALIZE(AppleObjCRuntime);
193   LLDB_PLUGIN_INITIALIZE(SystemRuntimeMacOSX);
194   LLDB_PLUGIN_INITIALIZE(RenderScriptRuntime);
195 
196   LLDB_PLUGIN_INITIALIZE(CPlusPlusLanguage);
197   LLDB_PLUGIN_INITIALIZE(ObjCLanguage);
198   LLDB_PLUGIN_INITIALIZE(ObjCPlusPlusLanguage);
199 
200 #if defined(_WIN32)
201   LLDB_PLUGIN_INITIALIZE(ProcessWindowsCommon);
202 #endif
203 #if defined(__FreeBSD__)
204   LLDB_PLUGIN_INITIALIZE(ProcessFreeBSD);
205 #endif
206 #if defined(__APPLE__)
207   LLDB_PLUGIN_INITIALIZE(SymbolVendorMacOSX);
208   LLDB_PLUGIN_INITIALIZE(ProcessMacOSXKernel);
209   LLDB_PLUGIN_INITIALIZE(DynamicLoaderDarwinKernel);
210 #endif
211 
212   // This plugin is valid on any host that talks to a Darwin remote. It
213   // shouldn't be limited to __APPLE__.
214   LLDB_PLUGIN_INITIALIZE(StructuredDataDarwinLog);
215 
216   // Platform agnostic plugins
217   LLDB_PLUGIN_INITIALIZE(PlatformGDB);
218 
219   LLDB_PLUGIN_INITIALIZE(ProcessGDBRemote);
220   LLDB_PLUGIN_INITIALIZE(DynamicLoaderHexagonDYLD);
221   LLDB_PLUGIN_INITIALIZE(DynamicLoaderMacOSXDYLD);
222   LLDB_PLUGIN_INITIALIZE(DynamicLoaderPosixDYLD);
223   LLDB_PLUGIN_INITIALIZE(DynamicLoaderWasmDYLD); // Before DynamicLoaderStatic.
224   LLDB_PLUGIN_INITIALIZE(DynamicLoaderStatic);
225   LLDB_PLUGIN_INITIALIZE(DynamicLoaderWindowsDYLD);
226 
227   // Scan for any system or user LLDB plug-ins
228   PluginManager::Initialize();
229 
230   // The process settings need to know about installed plug-ins, so the
231   // Settings must be initialized
232   // AFTER PluginManager::Initialize is called.
233 
234   Debugger::SettingsInitialize();
235 
236   return llvm::Error::success();
237 }
238 
239 void SystemInitializerTest::Terminate() {
240   static Timer::Category func_cat(LLVM_PRETTY_FUNCTION);
241   Timer scoped_timer(func_cat, LLVM_PRETTY_FUNCTION);
242 
243   Debugger::SettingsTerminate();
244 
245   // Terminate and unload and loaded system or user LLDB plug-ins
246   PluginManager::Terminate();
247 
248   LLDB_PLUGIN_TERMINATE(TypeSystemClang);
249 
250   LLDB_PLUGIN_TERMINATE(ArchitectureArm);
251   LLDB_PLUGIN_TERMINATE(ArchitectureMips);
252   LLDB_PLUGIN_TERMINATE(ArchitecturePPC64);
253 
254 #define LLVM_TARGET(t) LLDB_PROCESS_##t(LLDB_PLUGIN_TERMINATE)
255 #include "llvm/Config/Targets.def"
256 
257   LLDB_PLUGIN_TERMINATE(DisassemblerLLVMC);
258 
259   LLDB_PLUGIN_TERMINATE(JITLoaderGDB);
260   LLDB_PLUGIN_TERMINATE(ProcessElfCore);
261   LLDB_PLUGIN_TERMINATE(ProcessMachCore);
262   LLDB_PLUGIN_TERMINATE(ProcessMinidump);
263   LLDB_PLUGIN_TERMINATE(MemoryHistoryASan);
264 
265   LLDB_PLUGIN_TERMINATE(InstrumentationRuntimeASan);
266   LLDB_PLUGIN_TERMINATE(InstrumentationRuntimeTSan);
267   LLDB_PLUGIN_TERMINATE(InstrumentationRuntimeUBSan);
268   LLDB_PLUGIN_TERMINATE(InstrumentationRuntimeMainThreadChecker);
269 
270   LLDB_PLUGIN_TERMINATE(SymbolVendorWasm);
271   LLDB_PLUGIN_TERMINATE(SymbolVendorELF);
272   LLDB_PLUGIN_TERMINATE(SymbolFileBreakpad);
273   LLDB_PLUGIN_TERMINATE(SymbolFileDWARF);
274   LLDB_PLUGIN_TERMINATE(SymbolFilePDB);
275   LLDB_PLUGIN_TERMINATE(SymbolFileSymtab);
276   LLDB_PLUGIN_TERMINATE(UnwindAssemblyX86);
277   LLDB_PLUGIN_TERMINATE(UnwindAssemblyInstEmulation);
278 
279   LLDB_PLUGIN_TERMINATE(InstructionARM);
280   LLDB_PLUGIN_TERMINATE(InstructionARM64);
281   LLDB_PLUGIN_TERMINATE(InstructionMIPS);
282   LLDB_PLUGIN_TERMINATE(InstructionMIPS64);
283   LLDB_PLUGIN_TERMINATE(InstructionPPC64);
284 
285   LLDB_PLUGIN_TERMINATE(CXXItaniumABI);
286   LLDB_PLUGIN_TERMINATE(AppleObjCRuntime);
287   LLDB_PLUGIN_TERMINATE(SystemRuntimeMacOSX);
288   LLDB_PLUGIN_TERMINATE(RenderScriptRuntime);
289 
290   LLDB_PLUGIN_TERMINATE(CPlusPlusLanguage);
291   LLDB_PLUGIN_TERMINATE(ObjCLanguage);
292   LLDB_PLUGIN_TERMINATE(ObjCPlusPlusLanguage);
293 
294 #if defined(__APPLE__)
295   LLDB_PLUGIN_TERMINATE(DynamicLoaderDarwinKernel);
296   LLDB_PLUGIN_TERMINATE(ProcessMacOSXKernel);
297   LLDB_PLUGIN_TERMINATE(SymbolVendorMacOSX);
298 #endif
299 
300 #if defined(__FreeBSD__)
301   LLDB_PLUGIN_TERMINATE(ProcessFreeBSD);
302 #endif
303   Debugger::SettingsTerminate();
304 
305   LLDB_PLUGIN_TERMINATE(PlatformGDB);
306   LLDB_PLUGIN_TERMINATE(ProcessGDBRemote);
307   LLDB_PLUGIN_TERMINATE(StructuredDataDarwinLog);
308 
309   LLDB_PLUGIN_TERMINATE(DynamicLoaderHexagonDYLD);
310   LLDB_PLUGIN_TERMINATE(DynamicLoaderMacOSXDYLD);
311   LLDB_PLUGIN_TERMINATE(DynamicLoaderPosixDYLD);
312   LLDB_PLUGIN_TERMINATE(DynamicLoaderWasmDYLD);
313   LLDB_PLUGIN_TERMINATE(DynamicLoaderStatic);
314   LLDB_PLUGIN_TERMINATE(DynamicLoaderWindowsDYLD);
315 
316   LLDB_PLUGIN_TERMINATE(PlatformFreeBSD);
317   LLDB_PLUGIN_TERMINATE(PlatformLinux);
318   LLDB_PLUGIN_TERMINATE(PlatformNetBSD);
319   LLDB_PLUGIN_TERMINATE(PlatformOpenBSD);
320   LLDB_PLUGIN_TERMINATE(PlatformWindows);
321   LLDB_PLUGIN_TERMINATE(PlatformAndroid);
322   LLDB_PLUGIN_TERMINATE(PlatformMacOSX);
323 
324   LLDB_PLUGIN_TERMINATE(ObjectFileBreakpad);
325   LLDB_PLUGIN_TERMINATE(ObjectFileELF);
326   LLDB_PLUGIN_TERMINATE(ObjectFileJIT);
327   LLDB_PLUGIN_TERMINATE(ObjectFileMachO);
328   LLDB_PLUGIN_TERMINATE(ObjectFilePECOFF);
329   LLDB_PLUGIN_TERMINATE(ObjectFileWasm);
330 
331   LLDB_PLUGIN_TERMINATE(ObjectContainerBSDArchive);
332   LLDB_PLUGIN_TERMINATE(ObjectContainerMachOArchive);
333 
334   LLDB_PLUGIN_TERMINATE(ScriptInterpreterNone);
335 
336   // Now shutdown the common parts, in reverse order.
337   SystemInitializerCommon::Terminate();
338 }
339