This patch removes the ability to instantiate the LLDB FileSystem class with a FileCollector. It keeps the ability to collect files, but uses the FileCollectorFileSystem to do that transparently. Because the two are intertwined, this patch also removes the finalization logic which copied the files over out of process.
135 lines
4.1 KiB
C++
135 lines
4.1 KiB
C++
//===-- SystemInitializerCommon.cpp ---------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "lldb/Initialization/SystemInitializerCommon.h"
|
|
|
|
#include "Plugins/Process/gdb-remote/ProcessGDBRemoteLog.h"
|
|
#include "lldb/Host/FileSystem.h"
|
|
#include "lldb/Host/Host.h"
|
|
#include "lldb/Host/Socket.h"
|
|
#include "lldb/Utility/LLDBLog.h"
|
|
#include "lldb/Utility/ReproducerProvider.h"
|
|
#include "lldb/Utility/Timer.h"
|
|
#include "lldb/Version/Version.h"
|
|
|
|
#if defined(__linux__) || defined(__FreeBSD__) || defined(__NetBSD__)
|
|
#include "Plugins/Process/POSIX/ProcessPOSIXLog.h"
|
|
#endif
|
|
|
|
#if defined(_WIN32)
|
|
#include "Plugins/Process/Windows/Common/ProcessWindowsLog.h"
|
|
#include "lldb/Host/windows/windows.h"
|
|
#include <crtdbg.h>
|
|
#endif
|
|
|
|
#include "llvm/Support/TargetSelect.h"
|
|
|
|
#include <string>
|
|
|
|
using namespace lldb_private;
|
|
using namespace lldb_private::repro;
|
|
|
|
SystemInitializerCommon::SystemInitializerCommon(
|
|
HostInfo::SharedLibraryDirectoryHelper *helper)
|
|
: m_shlib_dir_helper(helper) {}
|
|
|
|
SystemInitializerCommon::~SystemInitializerCommon() = default;
|
|
|
|
/// Initialize the FileSystem based on the current reproducer mode.
|
|
static llvm::Error InitializeFileSystem() {
|
|
auto &r = repro::Reproducer::Instance();
|
|
|
|
if (repro::Generator *g = r.GetGenerator()) {
|
|
repro::VersionProvider &vp = g->GetOrCreate<repro::VersionProvider>();
|
|
vp.SetVersion(lldb_private::GetVersion());
|
|
|
|
repro::FileProvider &fp = g->GetOrCreate<repro::FileProvider>();
|
|
|
|
FileSystem::Initialize(llvm::FileCollector::createCollectorVFS(
|
|
llvm::vfs::getRealFileSystem(), fp.GetFileCollector()));
|
|
|
|
fp.RecordInterestingDirectory(
|
|
g->GetOrCreate<repro::WorkingDirectoryProvider>().GetDirectory());
|
|
fp.RecordInterestingDirectory(
|
|
g->GetOrCreate<repro::HomeDirectoryProvider>().GetDirectory());
|
|
|
|
return llvm::Error::success();
|
|
}
|
|
|
|
FileSystem::Initialize();
|
|
return llvm::Error::success();
|
|
}
|
|
|
|
llvm::Error SystemInitializerCommon::Initialize() {
|
|
#if defined(_WIN32)
|
|
const char *disable_crash_dialog_var = getenv("LLDB_DISABLE_CRASH_DIALOG");
|
|
if (disable_crash_dialog_var &&
|
|
llvm::StringRef(disable_crash_dialog_var).equals_insensitive("true")) {
|
|
// This will prevent Windows from displaying a dialog box requiring user
|
|
// interaction when
|
|
// LLDB crashes. This is mostly useful when automating LLDB, for example
|
|
// via the test
|
|
// suite, so that a crash in LLDB does not prevent completion of the test
|
|
// suite.
|
|
::SetErrorMode(GetErrorMode() | SEM_FAILCRITICALERRORS |
|
|
SEM_NOGPFAULTERRORBOX);
|
|
|
|
_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
|
|
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
|
|
_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
|
|
_CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);
|
|
_CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR);
|
|
_CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR);
|
|
}
|
|
#endif
|
|
|
|
// If the reproducer wasn't initialized before, we can safely assume it's
|
|
// off.
|
|
if (!Reproducer::Initialized()) {
|
|
if (auto e = Reproducer::Initialize(ReproducerMode::Off, llvm::None))
|
|
return e;
|
|
}
|
|
|
|
if (auto e = InitializeFileSystem())
|
|
return e;
|
|
|
|
InitializeLldbChannel();
|
|
HostInfo::Initialize(m_shlib_dir_helper);
|
|
|
|
llvm::Error error = Socket::Initialize();
|
|
if (error)
|
|
return error;
|
|
|
|
LLDB_SCOPED_TIMER();
|
|
|
|
process_gdb_remote::ProcessGDBRemoteLog::Initialize();
|
|
|
|
#if defined(__linux__) || defined(__FreeBSD__) || defined(__NetBSD__)
|
|
ProcessPOSIXLog::Initialize();
|
|
#endif
|
|
#if defined(_WIN32)
|
|
ProcessWindowsLog::Initialize();
|
|
#endif
|
|
|
|
return llvm::Error::success();
|
|
}
|
|
|
|
void SystemInitializerCommon::Terminate() {
|
|
LLDB_SCOPED_TIMER();
|
|
|
|
#if defined(_WIN32)
|
|
ProcessWindowsLog::Terminate();
|
|
#endif
|
|
|
|
Socket::Terminate();
|
|
HostInfo::Terminate();
|
|
Log::DisableAllLogChannels();
|
|
FileSystem::Terminate();
|
|
Reproducer::Terminate();
|
|
}
|