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