1e6e2bb38SZachary Turner //===-- SystemInitializerCommon.cpp -----------------------------*- C++ -*-===//
2e6e2bb38SZachary Turner //
3e6e2bb38SZachary Turner //                     The LLVM Compiler Infrastructure
4e6e2bb38SZachary Turner //
5e6e2bb38SZachary Turner // This file is distributed under the University of Illinois Open Source
6e6e2bb38SZachary Turner // License. See LICENSE.TXT for details.
7e6e2bb38SZachary Turner //
8e6e2bb38SZachary Turner //===----------------------------------------------------------------------===//
9e6e2bb38SZachary Turner 
10e6e2bb38SZachary Turner #include "lldb/Initialization/SystemInitializerCommon.h"
11e6e2bb38SZachary Turner 
12e6e2bb38SZachary Turner #include "lldb/Host/Host.h"
13e6e2bb38SZachary Turner #include "lldb/Host/HostInfo.h"
14e6e2bb38SZachary Turner #include "lldb/Core/Log.h"
15e6e2bb38SZachary Turner #include "lldb/Core/Timer.h"
16d8c338d4STamas Berghammer #include "Plugins/Instruction/ARM/EmulateInstructionARM.h"
17794a4d5aSBhushan D. Attarde #include "Plugins/Instruction/MIPS/EmulateInstructionMIPS.h"
18cdc22a88SMohit K. Bhakkad #include "Plugins/Instruction/MIPS64/EmulateInstructionMIPS64.h"
19e6e2bb38SZachary Turner #include "Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.h"
20e6e2bb38SZachary Turner #include "Plugins/ObjectContainer/Universal-Mach-O/ObjectContainerUniversalMachO.h"
21e6e2bb38SZachary Turner #include "Plugins/ObjectFile/ELF/ObjectFileELF.h"
22e6e2bb38SZachary Turner #include "Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h"
23e6e2bb38SZachary Turner #include "Plugins/Process/gdb-remote/ProcessGDBRemoteLog.h"
24e6e2bb38SZachary Turner 
25e6e2bb38SZachary Turner #if defined(__APPLE__)
26e6e2bb38SZachary Turner #include "Plugins/ObjectFile/Mach-O/ObjectFileMachO.h"
27e6e2bb38SZachary Turner #endif
28e6e2bb38SZachary Turner 
29e6e2bb38SZachary Turner #if defined(__linux__)
30e6e2bb38SZachary Turner #include "Plugins/Process/POSIX/ProcessPOSIXLog.h"
31e6e2bb38SZachary Turner #endif
32e6e2bb38SZachary Turner 
33e6e2bb38SZachary Turner #if defined(_MSC_VER)
3418a9135dSAdrian McCarthy #include "Plugins/Process/Windows/Common/ProcessWindowsLog.h"
3574e08ca0SZachary Turner #include "lldb/Host/windows/windows.h"
36e6e2bb38SZachary Turner #endif
37e6e2bb38SZachary Turner 
38e6e2bb38SZachary Turner #include "llvm/Support/TargetSelect.h"
39e6e2bb38SZachary Turner 
40e6e2bb38SZachary Turner #include <string>
41e6e2bb38SZachary Turner 
42e6e2bb38SZachary Turner using namespace lldb_private;
43e6e2bb38SZachary Turner 
44e6e2bb38SZachary Turner static void
45e6e2bb38SZachary Turner fatal_error_handler(void *user_data, const std::string &reason, bool gen_crash_diag)
46e6e2bb38SZachary Turner {
47e6e2bb38SZachary Turner     Host::SetCrashDescription(reason.c_str());
48e6e2bb38SZachary Turner     ::abort();
49e6e2bb38SZachary Turner }
50e6e2bb38SZachary Turner 
51e6e2bb38SZachary Turner SystemInitializerCommon::SystemInitializerCommon()
52e6e2bb38SZachary Turner {
53e6e2bb38SZachary Turner }
54e6e2bb38SZachary Turner 
55e6e2bb38SZachary Turner SystemInitializerCommon::~SystemInitializerCommon()
56e6e2bb38SZachary Turner {
57e6e2bb38SZachary Turner }
58e6e2bb38SZachary Turner 
59e6e2bb38SZachary Turner void
60e6e2bb38SZachary Turner SystemInitializerCommon::Initialize()
61e6e2bb38SZachary Turner {
62e6e2bb38SZachary Turner #if defined(_MSC_VER)
63e6e2bb38SZachary Turner     const char *disable_crash_dialog_var = getenv("LLDB_DISABLE_CRASH_DIALOG");
64e6e2bb38SZachary Turner     if (disable_crash_dialog_var && llvm::StringRef(disable_crash_dialog_var).equals_lower("true"))
65e6e2bb38SZachary Turner     {
66e6e2bb38SZachary Turner         // This will prevent Windows from displaying a dialog box requiring user interaction when
67e6e2bb38SZachary Turner         // LLDB crashes.  This is mostly useful when automating LLDB, for example via the test
68e6e2bb38SZachary Turner         // suite, so that a crash in LLDB does not prevent completion of the test suite.
69e6e2bb38SZachary Turner         ::SetErrorMode(GetErrorMode() | SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
70e6e2bb38SZachary Turner 
71e6e2bb38SZachary Turner         _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
72e6e2bb38SZachary Turner         _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
73e6e2bb38SZachary Turner         _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
74e6e2bb38SZachary Turner         _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);
75e6e2bb38SZachary Turner         _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR);
76e6e2bb38SZachary Turner         _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR);
77e6e2bb38SZachary Turner     }
78e6e2bb38SZachary Turner #endif
79e6e2bb38SZachary Turner 
80e6e2bb38SZachary Turner     Log::Initialize();
81e6e2bb38SZachary Turner     HostInfo::Initialize();
82e6e2bb38SZachary Turner     Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
83e6e2bb38SZachary Turner 
84e6e2bb38SZachary Turner     llvm::install_fatal_error_handler(fatal_error_handler, 0);
85e6e2bb38SZachary Turner 
86e6e2bb38SZachary Turner     process_gdb_remote::ProcessGDBRemoteLog::Initialize();
87e6e2bb38SZachary Turner 
88e6e2bb38SZachary Turner     // Initialize plug-ins
89e6e2bb38SZachary Turner     ObjectContainerBSDArchive::Initialize();
90e6e2bb38SZachary Turner     ObjectFileELF::Initialize();
91e6e2bb38SZachary Turner     ObjectFilePECOFF::Initialize();
92e6e2bb38SZachary Turner 
93d8c338d4STamas Berghammer     EmulateInstructionARM::Initialize();
94794a4d5aSBhushan D. Attarde     EmulateInstructionMIPS::Initialize();
95cdc22a88SMohit K. Bhakkad     EmulateInstructionMIPS64::Initialize();
96d8c338d4STamas Berghammer 
97e6e2bb38SZachary Turner     //----------------------------------------------------------------------
98e6e2bb38SZachary Turner     // Apple/Darwin hosted plugins
99e6e2bb38SZachary Turner     //----------------------------------------------------------------------
100e6e2bb38SZachary Turner     ObjectContainerUniversalMachO::Initialize();
101e6e2bb38SZachary Turner 
102e6e2bb38SZachary Turner 
103e6e2bb38SZachary Turner #if defined(__APPLE__)
104e6e2bb38SZachary Turner     ObjectFileMachO::Initialize();
105e6e2bb38SZachary Turner #endif
106e6e2bb38SZachary Turner #if defined(__linux__)
107e6e2bb38SZachary Turner     static ConstString g_linux_log_name("linux");
108e6e2bb38SZachary Turner     ProcessPOSIXLog::Initialize(g_linux_log_name);
109e6e2bb38SZachary Turner #endif
11042b33806SAdrian McCarthy #if defined(_MSC_VER)
11142b33806SAdrian McCarthy     ProcessWindowsLog::Initialize();
11242b33806SAdrian McCarthy #endif
113e6e2bb38SZachary Turner }
114e6e2bb38SZachary Turner 
115e6e2bb38SZachary Turner void
116e6e2bb38SZachary Turner SystemInitializerCommon::Terminate()
117e6e2bb38SZachary Turner {
118e6e2bb38SZachary Turner     Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
119e6e2bb38SZachary Turner     ObjectContainerBSDArchive::Terminate();
120e6e2bb38SZachary Turner     ObjectFileELF::Terminate();
121e6e2bb38SZachary Turner     ObjectFilePECOFF::Terminate();
122e6e2bb38SZachary Turner 
123d8c338d4STamas Berghammer     EmulateInstructionARM::Terminate();
124794a4d5aSBhushan D. Attarde     EmulateInstructionMIPS::Terminate();
125cdc22a88SMohit K. Bhakkad     EmulateInstructionMIPS64::Terminate();
126d8c338d4STamas Berghammer 
127*f1763537SPavel Labath     ObjectContainerUniversalMachO::Terminate();
128e6e2bb38SZachary Turner #if defined(__APPLE__)
129e6e2bb38SZachary Turner     ObjectFileMachO::Terminate();
130e6e2bb38SZachary Turner #endif
131e6e2bb38SZachary Turner 
13223a4df27SHafiz Abid Qadeer #if defined(_MSC_VER)
133610e5291SZachary Turner     ProcessWindowsLog::Terminate();
134610e5291SZachary Turner #endif
135610e5291SZachary Turner 
13641331afaSZachary Turner     HostInfo::Terminate();
137e6e2bb38SZachary Turner     Log::Terminate();
138e6e2bb38SZachary Turner }
139