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"
14b9c1b51eSKate Stone #include "lldb/Host/HostInfo.h"
15f8a74c18SAaron Smith #include "lldb/Host/Socket.h"
166f9e6901SZachary Turner #include "lldb/Utility/Log.h"
1715eacd74SJonas Devlieghere #include "lldb/Utility/Reproducer.h"
1838d0632eSPavel Labath #include "lldb/Utility/Timer.h"
19c2e2df7fSJonas Devlieghere #include "lldb/lldb-private.h"
20e6e2bb38SZachary Turner 
21a87101d6SKamil Rytarowski #if defined(__linux__) || defined(__FreeBSD__) || defined(__NetBSD__)
22e6e2bb38SZachary Turner #include "Plugins/Process/POSIX/ProcessPOSIXLog.h"
23e6e2bb38SZachary Turner #endif
24e6e2bb38SZachary Turner 
25d179ce99SSaleem Abdulrasool #if defined(_WIN32)
2618a9135dSAdrian McCarthy #include "Plugins/Process/Windows/Common/ProcessWindowsLog.h"
2774e08ca0SZachary Turner #include "lldb/Host/windows/windows.h"
28a63417feSHaibo Huang #include <crtdbg.h>
29e6e2bb38SZachary Turner #endif
30e6e2bb38SZachary Turner 
31e6e2bb38SZachary Turner #include "llvm/Support/TargetSelect.h"
32e6e2bb38SZachary Turner 
33e6e2bb38SZachary Turner #include <string>
34e6e2bb38SZachary Turner 
35e6e2bb38SZachary Turner using namespace lldb_private;
3615eacd74SJonas Devlieghere using namespace lldb_private::repro;
37e6e2bb38SZachary Turner 
38b9c1b51eSKate Stone SystemInitializerCommon::SystemInitializerCommon() {}
39e6e2bb38SZachary Turner 
40b9c1b51eSKate Stone SystemInitializerCommon::~SystemInitializerCommon() {}
41e6e2bb38SZachary Turner 
42ed17b6f6SJonas Devlieghere /// Initialize the FileSystem based on the current reproducer mode.
43ed17b6f6SJonas Devlieghere static llvm::Error InitializeFileSystem() {
44ed17b6f6SJonas Devlieghere   auto &r = repro::Reproducer::Instance();
45ed17b6f6SJonas Devlieghere   if (repro::Loader *loader = r.GetLoader()) {
46ed17b6f6SJonas Devlieghere     FileSpec vfs_mapping = loader->GetFile<FileProvider::Info>();
47ed17b6f6SJonas Devlieghere     if (vfs_mapping) {
48ed17b6f6SJonas Devlieghere       if (llvm::Error e = FileSystem::Initialize(vfs_mapping))
49ed17b6f6SJonas Devlieghere         return e;
50ed17b6f6SJonas Devlieghere     } else {
51ed17b6f6SJonas Devlieghere       FileSystem::Initialize();
52ed17b6f6SJonas Devlieghere     }
53ed17b6f6SJonas Devlieghere 
54ed17b6f6SJonas Devlieghere     llvm::Expected<std::string> cwd =
55ed17b6f6SJonas Devlieghere         loader->LoadBuffer<WorkingDirectoryProvider>();
56ed17b6f6SJonas Devlieghere     if (!cwd)
57ed17b6f6SJonas Devlieghere       return cwd.takeError();
58ed17b6f6SJonas Devlieghere 
59ed17b6f6SJonas Devlieghere     llvm::StringRef working_dir = llvm::StringRef(*cwd).rtrim();
60ed17b6f6SJonas Devlieghere     if (std::error_code ec = FileSystem::Instance()
61ed17b6f6SJonas Devlieghere                                  .GetVirtualFileSystem()
62ed17b6f6SJonas Devlieghere                                  ->setCurrentWorkingDirectory(working_dir)) {
63ed17b6f6SJonas Devlieghere       return llvm::errorCodeToError(ec);
64ed17b6f6SJonas Devlieghere     }
65ed17b6f6SJonas Devlieghere 
66ed17b6f6SJonas Devlieghere     return llvm::Error::success();
67ed17b6f6SJonas Devlieghere   }
68ed17b6f6SJonas Devlieghere 
69ed17b6f6SJonas Devlieghere   if (repro::Generator *g = r.GetGenerator()) {
70ed17b6f6SJonas Devlieghere     repro::VersionProvider &vp = g->GetOrCreate<repro::VersionProvider>();
71ed17b6f6SJonas Devlieghere     vp.SetVersion(lldb_private::GetVersion());
72ed17b6f6SJonas Devlieghere 
73ed17b6f6SJonas Devlieghere     repro::FileProvider &fp = g->GetOrCreate<repro::FileProvider>();
74ed17b6f6SJonas Devlieghere     FileSystem::Initialize(fp.GetFileCollector());
75ed17b6f6SJonas Devlieghere 
76ed17b6f6SJonas Devlieghere     repro::WorkingDirectoryProvider &wp =
77ed17b6f6SJonas Devlieghere         g->GetOrCreate<repro::WorkingDirectoryProvider>();
78*c90ca0c8SJonas Devlieghere     fp.RecordInterestingDirectory(wp.GetDirectory());
79ed17b6f6SJonas Devlieghere 
80ed17b6f6SJonas Devlieghere     return llvm::Error::success();
81ed17b6f6SJonas Devlieghere   }
82ed17b6f6SJonas Devlieghere 
83ed17b6f6SJonas Devlieghere   FileSystem::Initialize();
84ed17b6f6SJonas Devlieghere   return llvm::Error::success();
85ed17b6f6SJonas Devlieghere }
86ed17b6f6SJonas Devlieghere 
87936c6242SJonas Devlieghere llvm::Error SystemInitializerCommon::Initialize() {
88d179ce99SSaleem Abdulrasool #if defined(_WIN32)
89e6e2bb38SZachary Turner   const char *disable_crash_dialog_var = getenv("LLDB_DISABLE_CRASH_DIALOG");
90b9c1b51eSKate Stone   if (disable_crash_dialog_var &&
91b9c1b51eSKate Stone       llvm::StringRef(disable_crash_dialog_var).equals_lower("true")) {
92b9c1b51eSKate Stone     // This will prevent Windows from displaying a dialog box requiring user
93b9c1b51eSKate Stone     // interaction when
94b9c1b51eSKate Stone     // LLDB crashes.  This is mostly useful when automating LLDB, for example
95b9c1b51eSKate Stone     // via the test
96b9c1b51eSKate Stone     // suite, so that a crash in LLDB does not prevent completion of the test
97b9c1b51eSKate Stone     // suite.
98b9c1b51eSKate Stone     ::SetErrorMode(GetErrorMode() | SEM_FAILCRITICALERRORS |
99b9c1b51eSKate Stone                    SEM_NOGPFAULTERRORBOX);
100e6e2bb38SZachary Turner 
101e6e2bb38SZachary Turner     _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
102e6e2bb38SZachary Turner     _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
103e6e2bb38SZachary Turner     _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
104e6e2bb38SZachary Turner     _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);
105e6e2bb38SZachary Turner     _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR);
106e6e2bb38SZachary Turner     _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR);
107e6e2bb38SZachary Turner   }
108e6e2bb38SZachary Turner #endif
109e6e2bb38SZachary Turner 
110936c6242SJonas Devlieghere   // If the reproducer wasn't initialized before, we can safely assume it's
111936c6242SJonas Devlieghere   // off.
112936c6242SJonas Devlieghere   if (!Reproducer::Initialized()) {
113936c6242SJonas Devlieghere     if (auto e = Reproducer::Initialize(ReproducerMode::Off, llvm::None))
11415eacd74SJonas Devlieghere       return e;
115936c6242SJonas Devlieghere   }
11615eacd74SJonas Devlieghere 
117ed17b6f6SJonas Devlieghere   if (auto e = InitializeFileSystem())
11846575176SJonas Devlieghere     return e;
11946575176SJonas Devlieghere 
120d813309eSPavel Labath   Log::Initialize();
121e6e2bb38SZachary Turner   HostInfo::Initialize();
122f8a74c18SAaron Smith 
123f8a74c18SAaron Smith   llvm::Error error = Socket::Initialize();
124f8a74c18SAaron Smith   if (error)
125f8a74c18SAaron Smith     return error;
126f8a74c18SAaron Smith 
127f9d16476SPavel Labath   static Timer::Category func_cat(LLVM_PRETTY_FUNCTION);
128f9d16476SPavel Labath   Timer scoped_timer(func_cat, LLVM_PRETTY_FUNCTION);
129e6e2bb38SZachary Turner 
130e6e2bb38SZachary Turner   process_gdb_remote::ProcessGDBRemoteLog::Initialize();
131e6e2bb38SZachary Turner 
132a87101d6SKamil Rytarowski #if defined(__linux__) || defined(__FreeBSD__) || defined(__NetBSD__)
133c29f7ff3SPavel Labath   ProcessPOSIXLog::Initialize();
134e6e2bb38SZachary Turner #endif
135d179ce99SSaleem Abdulrasool #if defined(_WIN32)
13642b33806SAdrian McCarthy   ProcessWindowsLog::Initialize();
13742b33806SAdrian McCarthy #endif
13815eacd74SJonas Devlieghere 
13915eacd74SJonas Devlieghere   return llvm::Error::success();
140e6e2bb38SZachary Turner }
141e6e2bb38SZachary Turner 
142b9c1b51eSKate Stone void SystemInitializerCommon::Terminate() {
143f9d16476SPavel Labath   static Timer::Category func_cat(LLVM_PRETTY_FUNCTION);
144f9d16476SPavel Labath   Timer scoped_timer(func_cat, LLVM_PRETTY_FUNCTION);
145e6e2bb38SZachary Turner 
146d179ce99SSaleem Abdulrasool #if defined(_WIN32)
147610e5291SZachary Turner   ProcessWindowsLog::Terminate();
148610e5291SZachary Turner #endif
149610e5291SZachary Turner 
150f8a74c18SAaron Smith   Socket::Terminate();
15141331afaSZachary Turner   HostInfo::Terminate();
152775588c0SPavel Labath   Log::DisableAllLogChannels();
15346376966SJonas Devlieghere   FileSystem::Terminate();
15415eacd74SJonas Devlieghere   Reproducer::Terminate();
155e6e2bb38SZachary Turner }
156