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" 17bb894b97SJonas Devlieghere #include "lldb/Utility/ReproducerProvider.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 5473af341bSJonas Devlieghere // Set the current working directory form the reproducer. 5573af341bSJonas Devlieghere llvm::Expected<std::string> working_dir = 5673af341bSJonas Devlieghere repro::GetDirectoryFrom<WorkingDirectoryProvider>(loader); 5773af341bSJonas Devlieghere if (!working_dir) 5873af341bSJonas Devlieghere return working_dir.takeError(); 59ed17b6f6SJonas Devlieghere if (std::error_code ec = FileSystem::Instance() 60ed17b6f6SJonas Devlieghere .GetVirtualFileSystem() 6173af341bSJonas Devlieghere ->setCurrentWorkingDirectory(*working_dir)) { 62ed17b6f6SJonas Devlieghere return llvm::errorCodeToError(ec); 63ed17b6f6SJonas Devlieghere } 64ed17b6f6SJonas Devlieghere 6573af341bSJonas Devlieghere // Set the home directory from the reproducer. 6673af341bSJonas Devlieghere llvm::Expected<std::string> home_dir = 6773af341bSJonas Devlieghere repro::GetDirectoryFrom<HomeDirectoryProvider>(loader); 6873af341bSJonas Devlieghere if (!home_dir) 6973af341bSJonas Devlieghere return home_dir.takeError(); 7073af341bSJonas Devlieghere FileSystem::Instance().SetHomeDirectory(*home_dir); 7173af341bSJonas Devlieghere 72ed17b6f6SJonas Devlieghere return llvm::Error::success(); 73ed17b6f6SJonas Devlieghere } 74ed17b6f6SJonas Devlieghere 75ed17b6f6SJonas Devlieghere if (repro::Generator *g = r.GetGenerator()) { 76ed17b6f6SJonas Devlieghere repro::VersionProvider &vp = g->GetOrCreate<repro::VersionProvider>(); 77ed17b6f6SJonas Devlieghere vp.SetVersion(lldb_private::GetVersion()); 78ed17b6f6SJonas Devlieghere 79ed17b6f6SJonas Devlieghere repro::FileProvider &fp = g->GetOrCreate<repro::FileProvider>(); 80ed17b6f6SJonas Devlieghere FileSystem::Initialize(fp.GetFileCollector()); 81ed17b6f6SJonas Devlieghere 82*426fa35bSJonas Devlieghere fp.RecordInterestingDirectory( 83*426fa35bSJonas Devlieghere g->GetOrCreate<repro::WorkingDirectoryProvider>().GetDirectory()); 84*426fa35bSJonas Devlieghere fp.RecordInterestingDirectory( 85*426fa35bSJonas Devlieghere g->GetOrCreate<repro::HomeDirectoryProvider>().GetDirectory()); 86ed17b6f6SJonas Devlieghere 87ed17b6f6SJonas Devlieghere return llvm::Error::success(); 88ed17b6f6SJonas Devlieghere } 89ed17b6f6SJonas Devlieghere 90ed17b6f6SJonas Devlieghere FileSystem::Initialize(); 91ed17b6f6SJonas Devlieghere return llvm::Error::success(); 92ed17b6f6SJonas Devlieghere } 93ed17b6f6SJonas Devlieghere 94936c6242SJonas Devlieghere llvm::Error SystemInitializerCommon::Initialize() { 95d179ce99SSaleem Abdulrasool #if defined(_WIN32) 96e6e2bb38SZachary Turner const char *disable_crash_dialog_var = getenv("LLDB_DISABLE_CRASH_DIALOG"); 97b9c1b51eSKate Stone if (disable_crash_dialog_var && 98b9c1b51eSKate Stone llvm::StringRef(disable_crash_dialog_var).equals_lower("true")) { 99b9c1b51eSKate Stone // This will prevent Windows from displaying a dialog box requiring user 100b9c1b51eSKate Stone // interaction when 101b9c1b51eSKate Stone // LLDB crashes. This is mostly useful when automating LLDB, for example 102b9c1b51eSKate Stone // via the test 103b9c1b51eSKate Stone // suite, so that a crash in LLDB does not prevent completion of the test 104b9c1b51eSKate Stone // suite. 105b9c1b51eSKate Stone ::SetErrorMode(GetErrorMode() | SEM_FAILCRITICALERRORS | 106b9c1b51eSKate Stone SEM_NOGPFAULTERRORBOX); 107e6e2bb38SZachary Turner 108e6e2bb38SZachary Turner _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG); 109e6e2bb38SZachary Turner _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG); 110e6e2bb38SZachary Turner _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG); 111e6e2bb38SZachary Turner _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR); 112e6e2bb38SZachary Turner _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR); 113e6e2bb38SZachary Turner _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR); 114e6e2bb38SZachary Turner } 115e6e2bb38SZachary Turner #endif 116e6e2bb38SZachary Turner 117936c6242SJonas Devlieghere // If the reproducer wasn't initialized before, we can safely assume it's 118936c6242SJonas Devlieghere // off. 119936c6242SJonas Devlieghere if (!Reproducer::Initialized()) { 120936c6242SJonas Devlieghere if (auto e = Reproducer::Initialize(ReproducerMode::Off, llvm::None)) 12115eacd74SJonas Devlieghere return e; 122936c6242SJonas Devlieghere } 12315eacd74SJonas Devlieghere 124ed17b6f6SJonas Devlieghere if (auto e = InitializeFileSystem()) 12546575176SJonas Devlieghere return e; 12646575176SJonas Devlieghere 127d813309eSPavel Labath Log::Initialize(); 128e6e2bb38SZachary Turner HostInfo::Initialize(); 129f8a74c18SAaron Smith 130f8a74c18SAaron Smith llvm::Error error = Socket::Initialize(); 131f8a74c18SAaron Smith if (error) 132f8a74c18SAaron Smith return error; 133f8a74c18SAaron Smith 134f9d16476SPavel Labath static Timer::Category func_cat(LLVM_PRETTY_FUNCTION); 135f9d16476SPavel Labath Timer scoped_timer(func_cat, LLVM_PRETTY_FUNCTION); 136e6e2bb38SZachary Turner 137e6e2bb38SZachary Turner process_gdb_remote::ProcessGDBRemoteLog::Initialize(); 138e6e2bb38SZachary Turner 139a87101d6SKamil Rytarowski #if defined(__linux__) || defined(__FreeBSD__) || defined(__NetBSD__) 140c29f7ff3SPavel Labath ProcessPOSIXLog::Initialize(); 141e6e2bb38SZachary Turner #endif 142d179ce99SSaleem Abdulrasool #if defined(_WIN32) 14342b33806SAdrian McCarthy ProcessWindowsLog::Initialize(); 14442b33806SAdrian McCarthy #endif 14515eacd74SJonas Devlieghere 14615eacd74SJonas Devlieghere return llvm::Error::success(); 147e6e2bb38SZachary Turner } 148e6e2bb38SZachary Turner 149b9c1b51eSKate Stone void SystemInitializerCommon::Terminate() { 150f9d16476SPavel Labath static Timer::Category func_cat(LLVM_PRETTY_FUNCTION); 151f9d16476SPavel Labath Timer scoped_timer(func_cat, LLVM_PRETTY_FUNCTION); 152e6e2bb38SZachary Turner 153d179ce99SSaleem Abdulrasool #if defined(_WIN32) 154610e5291SZachary Turner ProcessWindowsLog::Terminate(); 155610e5291SZachary Turner #endif 156610e5291SZachary Turner 157f8a74c18SAaron Smith Socket::Terminate(); 15841331afaSZachary Turner HostInfo::Terminate(); 159775588c0SPavel Labath Log::DisableAllLogChannels(); 16046376966SJonas Devlieghere FileSystem::Terminate(); 16115eacd74SJonas Devlieghere Reproducer::Terminate(); 162e6e2bb38SZachary Turner } 163