1e6e2bb38SZachary Turner //===-- SystemInitializerCommon.cpp -----------------------------*- C++ -*-===//
2e6e2bb38SZachary Turner //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e6e2bb38SZachary Turner //
7e6e2bb38SZachary Turner //===----------------------------------------------------------------------===//
8e6e2bb38SZachary Turner 
9e6e2bb38SZachary Turner #include "lldb/Initialization/SystemInitializerCommon.h"
10e6e2bb38SZachary Turner 
11d8c338d4STamas Berghammer #include "Plugins/Instruction/ARM/EmulateInstructionARM.h"
12794a4d5aSBhushan D. Attarde #include "Plugins/Instruction/MIPS/EmulateInstructionMIPS.h"
13cdc22a88SMohit K. Bhakkad #include "Plugins/Instruction/MIPS64/EmulateInstructionMIPS64.h"
14e6e2bb38SZachary Turner #include "Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.h"
15e6e2bb38SZachary Turner #include "Plugins/ObjectContainer/Universal-Mach-O/ObjectContainerUniversalMachO.h"
16e6e2bb38SZachary Turner #include "Plugins/Process/gdb-remote/ProcessGDBRemoteLog.h"
1746376966SJonas Devlieghere #include "lldb/Host/FileSystem.h"
18b9c1b51eSKate Stone #include "lldb/Host/Host.h"
19b9c1b51eSKate Stone #include "lldb/Host/HostInfo.h"
20*f8a74c18SAaron Smith #include "lldb/Host/Socket.h"
216f9e6901SZachary Turner #include "lldb/Utility/Log.h"
2215eacd74SJonas Devlieghere #include "lldb/Utility/Reproducer.h"
2338d0632eSPavel Labath #include "lldb/Utility/Timer.h"
24e6e2bb38SZachary Turner 
25a87101d6SKamil Rytarowski #if defined(__linux__) || defined(__FreeBSD__) || defined(__NetBSD__)
26e6e2bb38SZachary Turner #include "Plugins/Process/POSIX/ProcessPOSIXLog.h"
27e6e2bb38SZachary Turner #endif
28e6e2bb38SZachary Turner 
29e6e2bb38SZachary Turner #if defined(_MSC_VER)
3018a9135dSAdrian McCarthy #include "Plugins/Process/Windows/Common/ProcessWindowsLog.h"
3174e08ca0SZachary Turner #include "lldb/Host/windows/windows.h"
32e6e2bb38SZachary Turner #endif
33e6e2bb38SZachary Turner 
34e6e2bb38SZachary Turner #include "llvm/Support/TargetSelect.h"
35e6e2bb38SZachary Turner 
36e6e2bb38SZachary Turner #include <string>
37e6e2bb38SZachary Turner 
38e6e2bb38SZachary Turner using namespace lldb_private;
3915eacd74SJonas Devlieghere using namespace lldb_private::repro;
40e6e2bb38SZachary Turner 
41b9c1b51eSKate Stone SystemInitializerCommon::SystemInitializerCommon() {}
42e6e2bb38SZachary Turner 
43b9c1b51eSKate Stone SystemInitializerCommon::~SystemInitializerCommon() {}
44e6e2bb38SZachary Turner 
45936c6242SJonas Devlieghere llvm::Error SystemInitializerCommon::Initialize() {
46e6e2bb38SZachary Turner #if defined(_MSC_VER)
47e6e2bb38SZachary Turner   const char *disable_crash_dialog_var = getenv("LLDB_DISABLE_CRASH_DIALOG");
48b9c1b51eSKate Stone   if (disable_crash_dialog_var &&
49b9c1b51eSKate Stone       llvm::StringRef(disable_crash_dialog_var).equals_lower("true")) {
50b9c1b51eSKate Stone     // This will prevent Windows from displaying a dialog box requiring user
51b9c1b51eSKate Stone     // interaction when
52b9c1b51eSKate Stone     // LLDB crashes.  This is mostly useful when automating LLDB, for example
53b9c1b51eSKate Stone     // via the test
54b9c1b51eSKate Stone     // suite, so that a crash in LLDB does not prevent completion of the test
55b9c1b51eSKate Stone     // suite.
56b9c1b51eSKate Stone     ::SetErrorMode(GetErrorMode() | SEM_FAILCRITICALERRORS |
57b9c1b51eSKate Stone                    SEM_NOGPFAULTERRORBOX);
58e6e2bb38SZachary Turner 
59e6e2bb38SZachary Turner     _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
60e6e2bb38SZachary Turner     _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
61e6e2bb38SZachary Turner     _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
62e6e2bb38SZachary Turner     _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);
63e6e2bb38SZachary Turner     _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR);
64e6e2bb38SZachary Turner     _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR);
65e6e2bb38SZachary Turner   }
66e6e2bb38SZachary Turner #endif
67e6e2bb38SZachary Turner 
68936c6242SJonas Devlieghere   // If the reproducer wasn't initialized before, we can safely assume it's
69936c6242SJonas Devlieghere   // off.
70936c6242SJonas Devlieghere   if (!Reproducer::Initialized()) {
71936c6242SJonas Devlieghere     if (auto e = Reproducer::Initialize(ReproducerMode::Off, llvm::None))
7215eacd74SJonas Devlieghere       return e;
73936c6242SJonas Devlieghere   }
7415eacd74SJonas Devlieghere 
7546575176SJonas Devlieghere   // Initialize the file system.
7646575176SJonas Devlieghere   auto &r = repro::Reproducer::Instance();
7746575176SJonas Devlieghere   if (repro::Loader *loader = r.GetLoader()) {
7846575176SJonas Devlieghere     FileSpec vfs_mapping = loader->GetFile<FileInfo>();
7946575176SJonas Devlieghere     if (vfs_mapping) {
8046575176SJonas Devlieghere       if (llvm::Error e = FileSystem::Initialize(vfs_mapping))
8146575176SJonas Devlieghere         return e;
8246575176SJonas Devlieghere     } else {
8346376966SJonas Devlieghere       FileSystem::Initialize();
8446575176SJonas Devlieghere     }
8546575176SJonas Devlieghere   } else if (repro::Generator *g = r.GetGenerator()) {
8646575176SJonas Devlieghere     repro::FileProvider &fp = g->GetOrCreate<repro::FileProvider>();
8746575176SJonas Devlieghere     FileSystem::Initialize(fp.GetFileCollector());
8846575176SJonas Devlieghere   } else {
8946575176SJonas Devlieghere     FileSystem::Initialize();
9046575176SJonas Devlieghere   }
9146575176SJonas Devlieghere 
92d813309eSPavel Labath   Log::Initialize();
93e6e2bb38SZachary Turner   HostInfo::Initialize();
94*f8a74c18SAaron Smith 
95*f8a74c18SAaron Smith   llvm::Error error = Socket::Initialize();
96*f8a74c18SAaron Smith   if (error)
97*f8a74c18SAaron Smith     return error;
98*f8a74c18SAaron Smith 
99f9d16476SPavel Labath   static Timer::Category func_cat(LLVM_PRETTY_FUNCTION);
100f9d16476SPavel Labath   Timer scoped_timer(func_cat, LLVM_PRETTY_FUNCTION);
101e6e2bb38SZachary Turner 
102e6e2bb38SZachary Turner   process_gdb_remote::ProcessGDBRemoteLog::Initialize();
103e6e2bb38SZachary Turner 
104e6e2bb38SZachary Turner   // Initialize plug-ins
105e6e2bb38SZachary Turner   ObjectContainerBSDArchive::Initialize();
106e6e2bb38SZachary Turner 
107d8c338d4STamas Berghammer   EmulateInstructionARM::Initialize();
108794a4d5aSBhushan D. Attarde   EmulateInstructionMIPS::Initialize();
109cdc22a88SMohit K. Bhakkad   EmulateInstructionMIPS64::Initialize();
110d8c338d4STamas Berghammer 
111e6e2bb38SZachary Turner   //----------------------------------------------------------------------
112e6e2bb38SZachary Turner   // Apple/Darwin hosted plugins
113e6e2bb38SZachary Turner   //----------------------------------------------------------------------
114e6e2bb38SZachary Turner   ObjectContainerUniversalMachO::Initialize();
115e6e2bb38SZachary Turner 
116a87101d6SKamil Rytarowski #if defined(__linux__) || defined(__FreeBSD__) || defined(__NetBSD__)
117c29f7ff3SPavel Labath   ProcessPOSIXLog::Initialize();
118e6e2bb38SZachary Turner #endif
11942b33806SAdrian McCarthy #if defined(_MSC_VER)
12042b33806SAdrian McCarthy   ProcessWindowsLog::Initialize();
12142b33806SAdrian McCarthy #endif
12215eacd74SJonas Devlieghere 
12315eacd74SJonas Devlieghere   return llvm::Error::success();
124e6e2bb38SZachary Turner }
125e6e2bb38SZachary Turner 
126b9c1b51eSKate Stone void SystemInitializerCommon::Terminate() {
127f9d16476SPavel Labath   static Timer::Category func_cat(LLVM_PRETTY_FUNCTION);
128f9d16476SPavel Labath   Timer scoped_timer(func_cat, LLVM_PRETTY_FUNCTION);
129e6e2bb38SZachary Turner   ObjectContainerBSDArchive::Terminate();
130e6e2bb38SZachary Turner 
131d8c338d4STamas Berghammer   EmulateInstructionARM::Terminate();
132794a4d5aSBhushan D. Attarde   EmulateInstructionMIPS::Terminate();
133cdc22a88SMohit K. Bhakkad   EmulateInstructionMIPS64::Terminate();
134d8c338d4STamas Berghammer 
135f1763537SPavel Labath   ObjectContainerUniversalMachO::Terminate();
136e6e2bb38SZachary Turner 
13723a4df27SHafiz Abid Qadeer #if defined(_MSC_VER)
138610e5291SZachary Turner   ProcessWindowsLog::Terminate();
139610e5291SZachary Turner #endif
140610e5291SZachary Turner 
141*f8a74c18SAaron Smith   Socket::Terminate();
14241331afaSZachary Turner   HostInfo::Terminate();
143775588c0SPavel Labath   Log::DisableAllLogChannels();
14446376966SJonas Devlieghere   FileSystem::Terminate();
14515eacd74SJonas Devlieghere   Reproducer::Terminate();
146e6e2bb38SZachary Turner }
147