180814287SRaphael Isemann //===-- SystemInitializerCommon.cpp ---------------------------------------===//
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 
11e6e2bb38SZachary Turner #include "Plugins/Process/gdb-remote/ProcessGDBRemoteLog.h"
1246376966SJonas Devlieghere #include "lldb/Host/FileSystem.h"
13b9c1b51eSKate Stone #include "lldb/Host/Host.h"
14f8a74c18SAaron Smith #include "lldb/Host/Socket.h"
15c34698a8SPavel Labath #include "lldb/Utility/LLDBLog.h"
16bb894b97SJonas Devlieghere #include "lldb/Utility/ReproducerProvider.h"
1738d0632eSPavel Labath #include "lldb/Utility/Timer.h"
18ccf1469aSJonas Devlieghere #include "lldb/Version/Version.h"
19e6e2bb38SZachary Turner 
20a87101d6SKamil Rytarowski #if defined(__linux__) || defined(__FreeBSD__) || defined(__NetBSD__)
21e6e2bb38SZachary Turner #include "Plugins/Process/POSIX/ProcessPOSIXLog.h"
22e6e2bb38SZachary Turner #endif
23e6e2bb38SZachary Turner 
24d179ce99SSaleem Abdulrasool #if defined(_WIN32)
2518a9135dSAdrian McCarthy #include "Plugins/Process/Windows/Common/ProcessWindowsLog.h"
2674e08ca0SZachary Turner #include "lldb/Host/windows/windows.h"
27a63417feSHaibo Huang #include <crtdbg.h>
28e6e2bb38SZachary Turner #endif
29e6e2bb38SZachary Turner 
30e6e2bb38SZachary Turner #include "llvm/Support/TargetSelect.h"
31e6e2bb38SZachary Turner 
32e6e2bb38SZachary Turner #include <string>
33e6e2bb38SZachary Turner 
34e6e2bb38SZachary Turner using namespace lldb_private;
3515eacd74SJonas Devlieghere using namespace lldb_private::repro;
36e6e2bb38SZachary Turner 
SystemInitializerCommon(HostInfo::SharedLibraryDirectoryHelper * helper)37004a264fSPavel Labath SystemInitializerCommon::SystemInitializerCommon(
38004a264fSPavel Labath     HostInfo::SharedLibraryDirectoryHelper *helper)
39004a264fSPavel Labath     : m_shlib_dir_helper(helper) {}
40e6e2bb38SZachary Turner 
41fd2433e1SJonas Devlieghere SystemInitializerCommon::~SystemInitializerCommon() = default;
42e6e2bb38SZachary Turner 
43ed17b6f6SJonas Devlieghere /// Initialize the FileSystem based on the current reproducer mode.
InitializeFileSystem()44ed17b6f6SJonas Devlieghere static llvm::Error InitializeFileSystem() {
45ed17b6f6SJonas Devlieghere   auto &r = repro::Reproducer::Instance();
46*8b3b66eaSJonas Devlieghere 
47ed17b6f6SJonas Devlieghere   if (repro::Generator *g = r.GetGenerator()) {
48ed17b6f6SJonas Devlieghere     repro::VersionProvider &vp = g->GetOrCreate<repro::VersionProvider>();
49ed17b6f6SJonas Devlieghere     vp.SetVersion(lldb_private::GetVersion());
50ed17b6f6SJonas Devlieghere 
51ed17b6f6SJonas Devlieghere     repro::FileProvider &fp = g->GetOrCreate<repro::FileProvider>();
52*8b3b66eaSJonas Devlieghere 
53*8b3b66eaSJonas Devlieghere     FileSystem::Initialize(llvm::FileCollector::createCollectorVFS(
54*8b3b66eaSJonas Devlieghere         llvm::vfs::getRealFileSystem(), fp.GetFileCollector()));
55ed17b6f6SJonas Devlieghere 
56426fa35bSJonas Devlieghere     fp.RecordInterestingDirectory(
57426fa35bSJonas Devlieghere         g->GetOrCreate<repro::WorkingDirectoryProvider>().GetDirectory());
58426fa35bSJonas Devlieghere     fp.RecordInterestingDirectory(
59426fa35bSJonas Devlieghere         g->GetOrCreate<repro::HomeDirectoryProvider>().GetDirectory());
60ed17b6f6SJonas Devlieghere 
61ed17b6f6SJonas Devlieghere     return llvm::Error::success();
62ed17b6f6SJonas Devlieghere   }
63ed17b6f6SJonas Devlieghere 
64ed17b6f6SJonas Devlieghere   FileSystem::Initialize();
65ed17b6f6SJonas Devlieghere   return llvm::Error::success();
66ed17b6f6SJonas Devlieghere }
67ed17b6f6SJonas Devlieghere 
Initialize()68936c6242SJonas Devlieghere llvm::Error SystemInitializerCommon::Initialize() {
69d179ce99SSaleem Abdulrasool #if defined(_WIN32)
70e6e2bb38SZachary Turner   const char *disable_crash_dialog_var = getenv("LLDB_DISABLE_CRASH_DIALOG");
71b9c1b51eSKate Stone   if (disable_crash_dialog_var &&
72e50f9c41SMartin Storsjö       llvm::StringRef(disable_crash_dialog_var).equals_insensitive("true")) {
73b9c1b51eSKate Stone     // This will prevent Windows from displaying a dialog box requiring user
74b9c1b51eSKate Stone     // interaction when
75b9c1b51eSKate Stone     // LLDB crashes.  This is mostly useful when automating LLDB, for example
76b9c1b51eSKate Stone     // via the test
77b9c1b51eSKate Stone     // suite, so that a crash in LLDB does not prevent completion of the test
78b9c1b51eSKate Stone     // suite.
79b9c1b51eSKate Stone     ::SetErrorMode(GetErrorMode() | SEM_FAILCRITICALERRORS |
80b9c1b51eSKate Stone                    SEM_NOGPFAULTERRORBOX);
81e6e2bb38SZachary Turner 
82e6e2bb38SZachary Turner     _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
83e6e2bb38SZachary Turner     _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
84e6e2bb38SZachary Turner     _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
85e6e2bb38SZachary Turner     _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);
86e6e2bb38SZachary Turner     _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR);
87e6e2bb38SZachary Turner     _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR);
88e6e2bb38SZachary Turner   }
89e6e2bb38SZachary Turner #endif
90e6e2bb38SZachary Turner 
91936c6242SJonas Devlieghere   // If the reproducer wasn't initialized before, we can safely assume it's
92936c6242SJonas Devlieghere   // off.
93936c6242SJonas Devlieghere   if (!Reproducer::Initialized()) {
94936c6242SJonas Devlieghere     if (auto e = Reproducer::Initialize(ReproducerMode::Off, llvm::None))
9515eacd74SJonas Devlieghere       return e;
96936c6242SJonas Devlieghere   }
9715eacd74SJonas Devlieghere 
98ed17b6f6SJonas Devlieghere   if (auto e = InitializeFileSystem())
9946575176SJonas Devlieghere     return e;
10046575176SJonas Devlieghere 
101c34698a8SPavel Labath   InitializeLldbChannel();
102004a264fSPavel Labath   HostInfo::Initialize(m_shlib_dir_helper);
103f8a74c18SAaron Smith 
104f8a74c18SAaron Smith   llvm::Error error = Socket::Initialize();
105f8a74c18SAaron Smith   if (error)
106f8a74c18SAaron Smith     return error;
107f8a74c18SAaron Smith 
1085c1c8443SJonas Devlieghere   LLDB_SCOPED_TIMER();
109e6e2bb38SZachary Turner 
110e6e2bb38SZachary Turner   process_gdb_remote::ProcessGDBRemoteLog::Initialize();
111e6e2bb38SZachary Turner 
112a87101d6SKamil Rytarowski #if defined(__linux__) || defined(__FreeBSD__) || defined(__NetBSD__)
113c29f7ff3SPavel Labath   ProcessPOSIXLog::Initialize();
114e6e2bb38SZachary Turner #endif
115d179ce99SSaleem Abdulrasool #if defined(_WIN32)
11642b33806SAdrian McCarthy   ProcessWindowsLog::Initialize();
11742b33806SAdrian McCarthy #endif
11815eacd74SJonas Devlieghere 
11915eacd74SJonas Devlieghere   return llvm::Error::success();
120e6e2bb38SZachary Turner }
121e6e2bb38SZachary Turner 
Terminate()122b9c1b51eSKate Stone void SystemInitializerCommon::Terminate() {
1235c1c8443SJonas Devlieghere   LLDB_SCOPED_TIMER();
124e6e2bb38SZachary Turner 
125d179ce99SSaleem Abdulrasool #if defined(_WIN32)
126610e5291SZachary Turner   ProcessWindowsLog::Terminate();
127610e5291SZachary Turner #endif
128610e5291SZachary Turner 
129f8a74c18SAaron Smith   Socket::Terminate();
13041331afaSZachary Turner   HostInfo::Terminate();
131775588c0SPavel Labath   Log::DisableAllLogChannels();
13246376966SJonas Devlieghere   FileSystem::Terminate();
13315eacd74SJonas Devlieghere   Reproducer::Terminate();
134e6e2bb38SZachary Turner }
135