1*e6e2bb38SZachary Turner //===-- SystemInitializerCommon.cpp -----------------------------*- C++ -*-===//
2*e6e2bb38SZachary Turner //
3*e6e2bb38SZachary Turner //                     The LLVM Compiler Infrastructure
4*e6e2bb38SZachary Turner //
5*e6e2bb38SZachary Turner // This file is distributed under the University of Illinois Open Source
6*e6e2bb38SZachary Turner // License. See LICENSE.TXT for details.
7*e6e2bb38SZachary Turner //
8*e6e2bb38SZachary Turner //===----------------------------------------------------------------------===//
9*e6e2bb38SZachary Turner 
10*e6e2bb38SZachary Turner #include "lldb/Initialization/SystemInitializerCommon.h"
11*e6e2bb38SZachary Turner 
12*e6e2bb38SZachary Turner #include "lldb/Host/Host.h"
13*e6e2bb38SZachary Turner #include "lldb/Host/HostInfo.h"
14*e6e2bb38SZachary Turner #include "lldb/Core/Log.h"
15*e6e2bb38SZachary Turner #include "lldb/Core/Timer.h"
16*e6e2bb38SZachary Turner #include "lldb/Interpreter/ScriptInterpreterPython.h"
17*e6e2bb38SZachary Turner 
18*e6e2bb38SZachary Turner #include "Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.h"
19*e6e2bb38SZachary Turner #include "Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.h"
20*e6e2bb38SZachary Turner #include "Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.h"
21*e6e2bb38SZachary Turner #include "Plugins/ObjectContainer/Universal-Mach-O/ObjectContainerUniversalMachO.h"
22*e6e2bb38SZachary Turner #include "Plugins/ObjectFile/ELF/ObjectFileELF.h"
23*e6e2bb38SZachary Turner #include "Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h"
24*e6e2bb38SZachary Turner #include "Plugins/OperatingSystem/Python/OperatingSystemPython.h"
25*e6e2bb38SZachary Turner #include "Plugins/Platform/Android/PlatformAndroid.h"
26*e6e2bb38SZachary Turner #include "Plugins/Platform/FreeBSD/PlatformFreeBSD.h"
27*e6e2bb38SZachary Turner #include "Plugins/Platform/Kalimba/PlatformKalimba.h"
28*e6e2bb38SZachary Turner #include "Plugins/Platform/Linux/PlatformLinux.h"
29*e6e2bb38SZachary Turner #include "Plugins/Platform/MacOSX/PlatformiOSSimulator.h"
30*e6e2bb38SZachary Turner #include "Plugins/Platform/MacOSX/PlatformMacOSX.h"
31*e6e2bb38SZachary Turner #include "Plugins/Platform/MacOSX/PlatformRemoteiOS.h"
32*e6e2bb38SZachary Turner #include "Plugins/Platform/Windows/PlatformWindows.h"
33*e6e2bb38SZachary Turner #include "Plugins/Process/gdb-remote/ProcessGDBRemoteLog.h"
34*e6e2bb38SZachary Turner 
35*e6e2bb38SZachary Turner #if defined(__APPLE__)
36*e6e2bb38SZachary Turner #include "Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.h"
37*e6e2bb38SZachary Turner #include "Plugins/ObjectFile/Mach-O/ObjectFileMachO.h"
38*e6e2bb38SZachary Turner #include "Plugins/Platform/MacOSX/PlatformDarwinKernel.h"
39*e6e2bb38SZachary Turner #endif
40*e6e2bb38SZachary Turner 
41*e6e2bb38SZachary Turner #if defined(__linux__)
42*e6e2bb38SZachary Turner #include "Plugins/Process/Linux/ProcessLinux.h"
43*e6e2bb38SZachary Turner #include "Plugins/Process/POSIX/ProcessPOSIXLog.h"
44*e6e2bb38SZachary Turner #endif
45*e6e2bb38SZachary Turner 
46*e6e2bb38SZachary Turner #if defined(_MSC_VER)
47*e6e2bb38SZachary Turner #include "lldb/Host/windows/windows.h"
48*e6e2bb38SZachary Turner #endif
49*e6e2bb38SZachary Turner 
50*e6e2bb38SZachary Turner #include "llvm/Support/TargetSelect.h"
51*e6e2bb38SZachary Turner 
52*e6e2bb38SZachary Turner #include <string>
53*e6e2bb38SZachary Turner 
54*e6e2bb38SZachary Turner using namespace lldb_private;
55*e6e2bb38SZachary Turner 
56*e6e2bb38SZachary Turner static void
57*e6e2bb38SZachary Turner fatal_error_handler(void *user_data, const std::string &reason, bool gen_crash_diag)
58*e6e2bb38SZachary Turner {
59*e6e2bb38SZachary Turner     Host::SetCrashDescription(reason.c_str());
60*e6e2bb38SZachary Turner     ::abort();
61*e6e2bb38SZachary Turner }
62*e6e2bb38SZachary Turner 
63*e6e2bb38SZachary Turner SystemInitializerCommon::SystemInitializerCommon()
64*e6e2bb38SZachary Turner {
65*e6e2bb38SZachary Turner }
66*e6e2bb38SZachary Turner 
67*e6e2bb38SZachary Turner SystemInitializerCommon::~SystemInitializerCommon()
68*e6e2bb38SZachary Turner {
69*e6e2bb38SZachary Turner }
70*e6e2bb38SZachary Turner 
71*e6e2bb38SZachary Turner void
72*e6e2bb38SZachary Turner SystemInitializerCommon::Initialize()
73*e6e2bb38SZachary Turner {
74*e6e2bb38SZachary Turner #if defined(_MSC_VER)
75*e6e2bb38SZachary Turner     const char *disable_crash_dialog_var = getenv("LLDB_DISABLE_CRASH_DIALOG");
76*e6e2bb38SZachary Turner     if (disable_crash_dialog_var && llvm::StringRef(disable_crash_dialog_var).equals_lower("true"))
77*e6e2bb38SZachary Turner     {
78*e6e2bb38SZachary Turner         // This will prevent Windows from displaying a dialog box requiring user interaction when
79*e6e2bb38SZachary Turner         // LLDB crashes.  This is mostly useful when automating LLDB, for example via the test
80*e6e2bb38SZachary Turner         // suite, so that a crash in LLDB does not prevent completion of the test suite.
81*e6e2bb38SZachary Turner         ::SetErrorMode(GetErrorMode() | SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
82*e6e2bb38SZachary Turner 
83*e6e2bb38SZachary Turner         _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
84*e6e2bb38SZachary Turner         _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
85*e6e2bb38SZachary Turner         _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
86*e6e2bb38SZachary Turner         _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);
87*e6e2bb38SZachary Turner         _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR);
88*e6e2bb38SZachary Turner         _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR);
89*e6e2bb38SZachary Turner     }
90*e6e2bb38SZachary Turner #endif
91*e6e2bb38SZachary Turner 
92*e6e2bb38SZachary Turner     Log::Initialize();
93*e6e2bb38SZachary Turner     HostInfo::Initialize();
94*e6e2bb38SZachary Turner     Timer::Initialize();
95*e6e2bb38SZachary Turner     Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
96*e6e2bb38SZachary Turner 
97*e6e2bb38SZachary Turner     llvm::install_fatal_error_handler(fatal_error_handler, 0);
98*e6e2bb38SZachary Turner 
99*e6e2bb38SZachary Turner     process_gdb_remote::ProcessGDBRemoteLog::Initialize();
100*e6e2bb38SZachary Turner 
101*e6e2bb38SZachary Turner     // Initialize plug-ins
102*e6e2bb38SZachary Turner     ObjectContainerBSDArchive::Initialize();
103*e6e2bb38SZachary Turner     ObjectFileELF::Initialize();
104*e6e2bb38SZachary Turner     ObjectFilePECOFF::Initialize();
105*e6e2bb38SZachary Turner     DynamicLoaderPOSIXDYLD::Initialize();
106*e6e2bb38SZachary Turner     PlatformFreeBSD::Initialize();
107*e6e2bb38SZachary Turner     platform_linux::PlatformLinux::Initialize();
108*e6e2bb38SZachary Turner     PlatformWindows::Initialize();
109*e6e2bb38SZachary Turner     PlatformKalimba::Initialize();
110*e6e2bb38SZachary Turner     platform_android::PlatformAndroid::Initialize();
111*e6e2bb38SZachary Turner 
112*e6e2bb38SZachary Turner     //----------------------------------------------------------------------
113*e6e2bb38SZachary Turner     // Apple/Darwin hosted plugins
114*e6e2bb38SZachary Turner     //----------------------------------------------------------------------
115*e6e2bb38SZachary Turner     DynamicLoaderMacOSXDYLD::Initialize();
116*e6e2bb38SZachary Turner     ObjectContainerUniversalMachO::Initialize();
117*e6e2bb38SZachary Turner 
118*e6e2bb38SZachary Turner     PlatformRemoteiOS::Initialize();
119*e6e2bb38SZachary Turner     PlatformMacOSX::Initialize();
120*e6e2bb38SZachary Turner     PlatformiOSSimulator::Initialize();
121*e6e2bb38SZachary Turner 
122*e6e2bb38SZachary Turner #if defined(__APPLE__)
123*e6e2bb38SZachary Turner     DynamicLoaderDarwinKernel::Initialize();
124*e6e2bb38SZachary Turner     PlatformDarwinKernel::Initialize();
125*e6e2bb38SZachary Turner     ObjectFileMachO::Initialize();
126*e6e2bb38SZachary Turner #endif
127*e6e2bb38SZachary Turner #if defined(__linux__)
128*e6e2bb38SZachary Turner     static ConstString g_linux_log_name("linux");
129*e6e2bb38SZachary Turner     ProcessPOSIXLog::Initialize(g_linux_log_name);
130*e6e2bb38SZachary Turner #endif
131*e6e2bb38SZachary Turner #ifndef LLDB_DISABLE_PYTHON
132*e6e2bb38SZachary Turner     ScriptInterpreterPython::InitializePrivate();
133*e6e2bb38SZachary Turner     OperatingSystemPython::Initialize();
134*e6e2bb38SZachary Turner #endif
135*e6e2bb38SZachary Turner }
136*e6e2bb38SZachary Turner 
137*e6e2bb38SZachary Turner void
138*e6e2bb38SZachary Turner SystemInitializerCommon::Terminate()
139*e6e2bb38SZachary Turner {
140*e6e2bb38SZachary Turner     Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
141*e6e2bb38SZachary Turner     ObjectContainerBSDArchive::Terminate();
142*e6e2bb38SZachary Turner     ObjectFileELF::Terminate();
143*e6e2bb38SZachary Turner     ObjectFilePECOFF::Terminate();
144*e6e2bb38SZachary Turner     DynamicLoaderPOSIXDYLD::Terminate();
145*e6e2bb38SZachary Turner     PlatformFreeBSD::Terminate();
146*e6e2bb38SZachary Turner     platform_linux::PlatformLinux::Terminate();
147*e6e2bb38SZachary Turner     PlatformWindows::Terminate();
148*e6e2bb38SZachary Turner     PlatformKalimba::Terminate();
149*e6e2bb38SZachary Turner     platform_android::PlatformAndroid::Terminate();
150*e6e2bb38SZachary Turner     DynamicLoaderMacOSXDYLD::Terminate();
151*e6e2bb38SZachary Turner     ObjectContainerUniversalMachO::Terminate();
152*e6e2bb38SZachary Turner     PlatformMacOSX::Terminate();
153*e6e2bb38SZachary Turner     PlatformRemoteiOS::Terminate();
154*e6e2bb38SZachary Turner     PlatformiOSSimulator::Terminate();
155*e6e2bb38SZachary Turner 
156*e6e2bb38SZachary Turner #if defined(__APPLE__)
157*e6e2bb38SZachary Turner     DynamicLoaderDarwinKernel::Terminate();
158*e6e2bb38SZachary Turner     ObjectFileMachO::Terminate();
159*e6e2bb38SZachary Turner     PlatformDarwinKernel::Terminate();
160*e6e2bb38SZachary Turner #endif
161*e6e2bb38SZachary Turner 
162*e6e2bb38SZachary Turner #ifndef LLDB_DISABLE_PYTHON
163*e6e2bb38SZachary Turner     OperatingSystemPython::Terminate();
164*e6e2bb38SZachary Turner #endif
165*e6e2bb38SZachary Turner 
166*e6e2bb38SZachary Turner     Log::Terminate();
167*e6e2bb38SZachary Turner }
168