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