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(ABIMacOSX_arm64);
21 LLDB_PLUGIN_DECLARE(ABISysV_arm64);
22 LLDB_PLUGIN_DECLARE(ABIMacOSX_arm);
23 LLDB_PLUGIN_DECLARE(ABISysV_arm);
24 LLDB_PLUGIN_DECLARE(ABISysV_arc);
25 LLDB_PLUGIN_DECLARE(ABISysV_hexagon);
26 LLDB_PLUGIN_DECLARE(ABISysV_mips);
27 LLDB_PLUGIN_DECLARE(ABISysV_mips64);
28 LLDB_PLUGIN_DECLARE(ABISysV_ppc);
29 LLDB_PLUGIN_DECLARE(ABISysV_ppc64);
30 LLDB_PLUGIN_DECLARE(ABISysV_s390x);
31 LLDB_PLUGIN_DECLARE(ABIMacOSX_i386);
32 LLDB_PLUGIN_DECLARE(ABISysV_i386);
33 LLDB_PLUGIN_DECLARE(ABISysV_x86_64);
34 LLDB_PLUGIN_DECLARE(ABIWindows_x86_64);
35 LLDB_PLUGIN_DECLARE(ObjectFileBreakpad);
36 LLDB_PLUGIN_DECLARE(ObjectFileELF);
37 LLDB_PLUGIN_DECLARE(ObjectFileMachO);
38 LLDB_PLUGIN_DECLARE(ObjectFilePECOFF);
39 LLDB_PLUGIN_DECLARE(ObjectFileWasm);
40 LLDB_PLUGIN_DECLARE(ObjectContainerBSDArchive);
41 LLDB_PLUGIN_DECLARE(ObjectContainerUniversalMachO);
42 LLDB_PLUGIN_DECLARE(ScriptInterpreterNone);
43 LLDB_PLUGIN_DECLARE(PlatformFreeBSD);
44 LLDB_PLUGIN_DECLARE(PlatformLinux);
45 LLDB_PLUGIN_DECLARE(PlatformNetBSD);
46 LLDB_PLUGIN_DECLARE(PlatformOpenBSD);
47 LLDB_PLUGIN_DECLARE(PlatformWindows);
48 LLDB_PLUGIN_DECLARE(PlatformAndroid);
49 LLDB_PLUGIN_DECLARE(PlatformRemoteiOS);
50 LLDB_PLUGIN_DECLARE(PlatformMacOSX);
51 LLDB_PLUGIN_DECLARE(TypeSystemClang);
52 LLDB_PLUGIN_DECLARE(ArchitectureArm);
53 LLDB_PLUGIN_DECLARE(ArchitectureMips);
54 LLDB_PLUGIN_DECLARE(ArchitecturePPC64);
55 LLDB_PLUGIN_DECLARE(DisassemblerLLVMC);
56 LLDB_PLUGIN_DECLARE(JITLoaderGDB);
57 LLDB_PLUGIN_DECLARE(ProcessElfCore);
58 LLDB_PLUGIN_DECLARE(ProcessMachCore);
59 LLDB_PLUGIN_DECLARE(ProcessMinidump);
60 LLDB_PLUGIN_DECLARE(MemoryHistoryASan);
61 LLDB_PLUGIN_DECLARE(InstrumentationRuntimeASan);
62 LLDB_PLUGIN_DECLARE(InstrumentationRuntimeTSan);
63 LLDB_PLUGIN_DECLARE(InstrumentationRuntimeUBSan);
64 LLDB_PLUGIN_DECLARE(InstrumentationRuntimeMainThreadChecker);
65 LLDB_PLUGIN_DECLARE(SymbolVendorELF);
66 LLDB_PLUGIN_DECLARE(SymbolFileBreakpad);
67 LLDB_PLUGIN_DECLARE(SymbolFileDWARF);
68 LLDB_PLUGIN_DECLARE(SymbolFilePDB);
69 LLDB_PLUGIN_DECLARE(SymbolFileSymtab);
70 LLDB_PLUGIN_DECLARE(SymbolVendorWasm);
71 LLDB_PLUGIN_DECLARE(UnwindAssemblyInstEmulation);
72 LLDB_PLUGIN_DECLARE(UnwindAssembly_x86);
73 LLDB_PLUGIN_DECLARE(EmulateInstructionARM);
74 LLDB_PLUGIN_DECLARE(EmulateInstructionARM64);
75 LLDB_PLUGIN_DECLARE(EmulateInstructionMIPS);
76 LLDB_PLUGIN_DECLARE(EmulateInstructionMIPS64);
77 LLDB_PLUGIN_DECLARE(EmulateInstructionPPC64);
78 LLDB_PLUGIN_DECLARE(SymbolFileDWARFDebugMap);
79 LLDB_PLUGIN_DECLARE(ItaniumABILanguageRuntime);
80 LLDB_PLUGIN_DECLARE(AppleObjCRuntime);
81 LLDB_PLUGIN_DECLARE(SystemRuntimeMacOSX);
82 LLDB_PLUGIN_DECLARE(RenderScriptRuntime);
83 LLDB_PLUGIN_DECLARE(CPlusPlusLanguage);
84 LLDB_PLUGIN_DECLARE(ObjCLanguage);
85 LLDB_PLUGIN_DECLARE(ObjCPlusPlusLanguage);
86 #if defined(_WIN32)
87 LLDB_PLUGIN_DECLARE(ProcessWindows);
88 #endif
89 #if defined(__FreeBSD__)
90 LLDB_PLUGIN_DECLARE(ProcessFreeBSD);
91 #endif
92 #if defined(__APPLE__)
93 LLDB_PLUGIN_DECLARE(SymbolVendorMacOSX);
94 LLDB_PLUGIN_DECLARE(ProcessKDP);
95 LLDB_PLUGIN_DECLARE(DynamicLoaderDarwinKernel);
96 #endif
97 LLDB_PLUGIN_DECLARE(StructuredDataDarwinLog);
98 LLDB_PLUGIN_DECLARE(PlatformRemoteGDBServer);
99 LLDB_PLUGIN_DECLARE(ProcessGDBRemote);
100 LLDB_PLUGIN_DECLARE(DynamicLoaderMacOSXDYLD);
101 LLDB_PLUGIN_DECLARE(DynamicLoaderMacOS);
102 LLDB_PLUGIN_DECLARE(DynamicLoaderPOSIXDYLD);
103 LLDB_PLUGIN_DECLARE(DynamicLoaderStatic);
104 LLDB_PLUGIN_DECLARE(DynamicLoaderWindowsDYLD);
105 
106 using namespace lldb_private;
107 
108 SystemInitializerTest::SystemInitializerTest() {}
109 
110 SystemInitializerTest::~SystemInitializerTest() {}
111 
112 #define LLDB_PROCESS_AArch64(op)                                               \
113   op(ABIMacOSX_arm64);                                                         \
114   op(ABISysV_arm64);
115 #define LLDB_PROCESS_ARM(op)                                                   \
116   op(ABIMacOSX_arm);                                                           \
117   op(ABISysV_arm);
118 #define LLDB_PROCESS_Hexagon(op) op(ABISysV_hexagon);
119 #define LLDB_PROCESS_Mips(op)                                                  \
120   op(ABISysV_mips);                                                            \
121   op(ABISysV_mips64);
122 #define LLDB_PROCESS_PowerPC(op)                                               \
123   op(ABISysV_ppc);                                                             \
124   op(ABISysV_ppc64);
125 #define LLDB_PROCESS_SystemZ(op) op(ABISysV_s390x);
126 #define LLDB_PROCESS_X86(op)                                                   \
127   op(ABIMacOSX_i386);                                                          \
128   op(ABISysV_i386);                                                            \
129   op(ABISysV_x86_64);                                                          \
130   op(ABIWindows_x86_64);
131 
132 #define LLDB_PROCESS_AMDGPU(op)
133 #define LLDB_PROCESS_ARC(op)
134 #define LLDB_PROCESS_AVR(op)
135 #define LLDB_PROCESS_BPF(op)
136 #define LLDB_PROCESS_Lanai(op)
137 #define LLDB_PROCESS_MSP430(op)
138 #define LLDB_PROCESS_NVPTX(op)
139 #define LLDB_PROCESS_RISCV(op)
140 #define LLDB_PROCESS_Sparc(op)
141 #define LLDB_PROCESS_WebAssembly(op)
142 #define LLDB_PROCESS_XCore(op)
143 
144 llvm::Error SystemInitializerTest::Initialize() {
145   if (auto e = SystemInitializerCommon::Initialize())
146     return e;
147 
148   LLDB_PLUGIN_INITIALIZE(ObjectFileBreakpad);
149   LLDB_PLUGIN_INITIALIZE(ObjectFileELF);
150   LLDB_PLUGIN_INITIALIZE(ObjectFileMachO);
151   LLDB_PLUGIN_INITIALIZE(ObjectFilePECOFF);
152   LLDB_PLUGIN_INITIALIZE(ObjectFileWasm);
153 
154   LLDB_PLUGIN_INITIALIZE(ObjectContainerBSDArchive);
155   LLDB_PLUGIN_INITIALIZE(ObjectContainerUniversalMachO);
156 
157   LLDB_PLUGIN_INITIALIZE(ScriptInterpreterNone);
158 
159   LLDB_PLUGIN_INITIALIZE(PlatformFreeBSD);
160   LLDB_PLUGIN_INITIALIZE(PlatformLinux);
161   LLDB_PLUGIN_INITIALIZE(PlatformNetBSD);
162   LLDB_PLUGIN_INITIALIZE(PlatformOpenBSD);
163   LLDB_PLUGIN_INITIALIZE(PlatformWindows);
164   LLDB_PLUGIN_INITIALIZE(PlatformAndroid);
165   LLDB_PLUGIN_INITIALIZE(PlatformRemoteiOS);
166   LLDB_PLUGIN_INITIALIZE(PlatformMacOSX);
167 
168   // Initialize LLVM and Clang
169   llvm::InitializeAllTargets();
170   llvm::InitializeAllAsmPrinters();
171   llvm::InitializeAllTargetMCs();
172   llvm::InitializeAllDisassemblers();
173 
174   LLDB_PLUGIN_INITIALIZE(TypeSystemClang);
175 
176 #define LLVM_TARGET(t) LLDB_PROCESS_##t(LLDB_PLUGIN_INITIALIZE)
177 #include "llvm/Config/Targets.def"
178 
179   LLDB_PLUGIN_INITIALIZE(ArchitectureArm);
180   LLDB_PLUGIN_INITIALIZE(ArchitectureMips);
181   LLDB_PLUGIN_INITIALIZE(ArchitecturePPC64);
182 
183   LLDB_PLUGIN_INITIALIZE(DisassemblerLLVMC);
184 
185   LLDB_PLUGIN_INITIALIZE(JITLoaderGDB);
186   LLDB_PLUGIN_INITIALIZE(ProcessElfCore);
187   LLDB_PLUGIN_INITIALIZE(ProcessMachCore);
188   LLDB_PLUGIN_INITIALIZE(ProcessMinidump);
189   LLDB_PLUGIN_INITIALIZE(MemoryHistoryASan);
190   LLDB_PLUGIN_INITIALIZE(InstrumentationRuntimeASan);
191   LLDB_PLUGIN_INITIALIZE(InstrumentationRuntimeTSan);
192   LLDB_PLUGIN_INITIALIZE(InstrumentationRuntimeUBSan);
193   LLDB_PLUGIN_INITIALIZE(InstrumentationRuntimeMainThreadChecker);
194 
195   LLDB_PLUGIN_INITIALIZE(SymbolVendorELF);
196   LLDB_PLUGIN_INITIALIZE(SymbolFileBreakpad);
197   LLDB_PLUGIN_INITIALIZE(SymbolFileDWARF);
198   LLDB_PLUGIN_INITIALIZE(SymbolFilePDB);
199   LLDB_PLUGIN_INITIALIZE(SymbolFileSymtab);
200   LLDB_PLUGIN_INITIALIZE(SymbolVendorWasm);
201   LLDB_PLUGIN_INITIALIZE(UnwindAssemblyInstEmulation);
202   LLDB_PLUGIN_INITIALIZE(UnwindAssembly_x86);
203 
204   LLDB_PLUGIN_INITIALIZE(EmulateInstructionARM);
205   LLDB_PLUGIN_INITIALIZE(EmulateInstructionARM64);
206   LLDB_PLUGIN_INITIALIZE(EmulateInstructionMIPS);
207   LLDB_PLUGIN_INITIALIZE(EmulateInstructionMIPS64);
208   LLDB_PLUGIN_INITIALIZE(EmulateInstructionPPC64);
209 
210   LLDB_PLUGIN_INITIALIZE(SymbolFileDWARFDebugMap);
211   LLDB_PLUGIN_INITIALIZE(ItaniumABILanguageRuntime);
212   LLDB_PLUGIN_INITIALIZE(AppleObjCRuntime);
213   LLDB_PLUGIN_INITIALIZE(SystemRuntimeMacOSX);
214   LLDB_PLUGIN_INITIALIZE(RenderScriptRuntime);
215 
216   LLDB_PLUGIN_INITIALIZE(CPlusPlusLanguage);
217   LLDB_PLUGIN_INITIALIZE(ObjCLanguage);
218   LLDB_PLUGIN_INITIALIZE(ObjCPlusPlusLanguage);
219 
220 #if defined(_WIN32)
221   LLDB_PLUGIN_INITIALIZE(ProcessWindows);
222 #endif
223 #if defined(__FreeBSD__)
224   LLDB_PLUGIN_INITIALIZE(ProcessFreeBSD);
225 #endif
226 #if defined(__APPLE__)
227   LLDB_PLUGIN_INITIALIZE(SymbolVendorMacOSX);
228   LLDB_PLUGIN_INITIALIZE(ProcessKDP);
229   LLDB_PLUGIN_INITIALIZE(DynamicLoaderDarwinKernel);
230 #endif
231 
232   // This plugin is valid on any host that talks to a Darwin remote. It
233   // shouldn't be limited to __APPLE__.
234   LLDB_PLUGIN_INITIALIZE(StructuredDataDarwinLog);
235 
236   // Platform agnostic plugins
237   LLDB_PLUGIN_INITIALIZE(PlatformRemoteGDBServer);
238 
239   LLDB_PLUGIN_INITIALIZE(ProcessGDBRemote);
240   LLDB_PLUGIN_INITIALIZE(DynamicLoaderMacOSXDYLD);
241   LLDB_PLUGIN_INITIALIZE(DynamicLoaderMacOS);
242   LLDB_PLUGIN_INITIALIZE(DynamicLoaderPOSIXDYLD);
243   LLDB_PLUGIN_INITIALIZE(DynamicLoaderStatic);
244   LLDB_PLUGIN_INITIALIZE(DynamicLoaderWindowsDYLD);
245 
246   // Scan for any system or user LLDB plug-ins
247   PluginManager::Initialize();
248 
249   // The process settings need to know about installed plug-ins, so the
250   // Settings must be initialized
251   // AFTER PluginManager::Initialize is called.
252 
253   Debugger::SettingsInitialize();
254 
255   return llvm::Error::success();
256 }
257 
258 void SystemInitializerTest::Terminate() {
259   static Timer::Category func_cat(LLVM_PRETTY_FUNCTION);
260   Timer scoped_timer(func_cat, LLVM_PRETTY_FUNCTION);
261 
262   Debugger::SettingsTerminate();
263 
264   // Terminate and unload and loaded system or user LLDB plug-ins
265   PluginManager::Terminate();
266 
267   LLDB_PLUGIN_TERMINATE(TypeSystemClang);
268 
269   LLDB_PLUGIN_TERMINATE(ArchitectureArm);
270   LLDB_PLUGIN_TERMINATE(ArchitectureMips);
271   LLDB_PLUGIN_TERMINATE(ArchitecturePPC64);
272 
273 #define LLVM_TARGET(t) LLDB_PROCESS_##t(LLDB_PLUGIN_TERMINATE)
274 #include "llvm/Config/Targets.def"
275 
276   LLDB_PLUGIN_TERMINATE(DisassemblerLLVMC);
277 
278   LLDB_PLUGIN_TERMINATE(JITLoaderGDB);
279   LLDB_PLUGIN_TERMINATE(ProcessElfCore);
280   LLDB_PLUGIN_TERMINATE(ProcessMachCore);
281   LLDB_PLUGIN_TERMINATE(ProcessMinidump);
282   LLDB_PLUGIN_TERMINATE(MemoryHistoryASan);
283 
284   LLDB_PLUGIN_TERMINATE(InstrumentationRuntimeASan);
285   LLDB_PLUGIN_TERMINATE(InstrumentationRuntimeTSan);
286   LLDB_PLUGIN_TERMINATE(InstrumentationRuntimeUBSan);
287   LLDB_PLUGIN_TERMINATE(InstrumentationRuntimeMainThreadChecker);
288 
289   LLDB_PLUGIN_TERMINATE(SymbolVendorWasm);
290   LLDB_PLUGIN_TERMINATE(SymbolVendorELF);
291   LLDB_PLUGIN_TERMINATE(SymbolFileBreakpad);
292   LLDB_PLUGIN_TERMINATE(SymbolFileDWARF);
293   LLDB_PLUGIN_TERMINATE(SymbolFilePDB);
294   LLDB_PLUGIN_TERMINATE(SymbolFileSymtab);
295   LLDB_PLUGIN_TERMINATE(UnwindAssembly_x86);
296   LLDB_PLUGIN_TERMINATE(UnwindAssemblyInstEmulation);
297 
298   LLDB_PLUGIN_TERMINATE(EmulateInstructionARM);
299   LLDB_PLUGIN_TERMINATE(EmulateInstructionARM64);
300   LLDB_PLUGIN_TERMINATE(EmulateInstructionMIPS);
301   LLDB_PLUGIN_TERMINATE(EmulateInstructionMIPS64);
302   LLDB_PLUGIN_TERMINATE(EmulateInstructionPPC64);
303 
304   LLDB_PLUGIN_TERMINATE(SymbolFileDWARFDebugMap);
305   LLDB_PLUGIN_TERMINATE(ItaniumABILanguageRuntime);
306   LLDB_PLUGIN_TERMINATE(AppleObjCRuntime);
307   LLDB_PLUGIN_TERMINATE(SystemRuntimeMacOSX);
308   LLDB_PLUGIN_TERMINATE(RenderScriptRuntime);
309 
310   LLDB_PLUGIN_TERMINATE(CPlusPlusLanguage);
311   LLDB_PLUGIN_TERMINATE(ObjCLanguage);
312   LLDB_PLUGIN_TERMINATE(ObjCPlusPlusLanguage);
313 
314 #if defined(__APPLE__)
315   LLDB_PLUGIN_TERMINATE(DynamicLoaderDarwinKernel);
316   LLDB_PLUGIN_TERMINATE(ProcessKDP);
317   LLDB_PLUGIN_TERMINATE(SymbolVendorMacOSX);
318 #endif
319 
320 #if defined(__FreeBSD__)
321   LLDB_PLUGIN_TERMINATE(ProcessFreeBSD);
322 #endif
323   Debugger::SettingsTerminate();
324 
325   LLDB_PLUGIN_TERMINATE(PlatformRemoteGDBServer);
326   LLDB_PLUGIN_TERMINATE(ProcessGDBRemote);
327   LLDB_PLUGIN_TERMINATE(StructuredDataDarwinLog);
328 
329   LLDB_PLUGIN_TERMINATE(DynamicLoaderMacOSXDYLD);
330   LLDB_PLUGIN_TERMINATE(DynamicLoaderMacOS);
331   LLDB_PLUGIN_TERMINATE(DynamicLoaderPOSIXDYLD);
332   LLDB_PLUGIN_TERMINATE(DynamicLoaderStatic);
333   LLDB_PLUGIN_TERMINATE(DynamicLoaderWindowsDYLD);
334 
335   LLDB_PLUGIN_TERMINATE(PlatformFreeBSD);
336   LLDB_PLUGIN_TERMINATE(PlatformLinux);
337   LLDB_PLUGIN_TERMINATE(PlatformNetBSD);
338   LLDB_PLUGIN_TERMINATE(PlatformOpenBSD);
339   LLDB_PLUGIN_TERMINATE(PlatformWindows);
340   LLDB_PLUGIN_TERMINATE(PlatformAndroid);
341   LLDB_PLUGIN_TERMINATE(PlatformRemoteiOS);
342   LLDB_PLUGIN_TERMINATE(PlatformMacOSX);
343 
344   LLDB_PLUGIN_TERMINATE(ObjectFileBreakpad);
345   LLDB_PLUGIN_TERMINATE(ObjectFileELF);
346   LLDB_PLUGIN_TERMINATE(ObjectFileMachO);
347   LLDB_PLUGIN_TERMINATE(ObjectFilePECOFF);
348   LLDB_PLUGIN_TERMINATE(ObjectFileWasm);
349 
350   LLDB_PLUGIN_TERMINATE(ObjectContainerBSDArchive);
351   LLDB_PLUGIN_TERMINATE(ObjectContainerUniversalMachO);
352 
353   LLDB_PLUGIN_TERMINATE(ScriptInterpreterNone);
354 
355   // Now shutdown the common parts, in reverse order.
356   SystemInitializerCommon::Terminate();
357 }
358