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