
Modify OpenOptions enum to open the future path into synchronizing vFile:open bits with GDB. Currently, LLDB and GDB use different flag models effectively making it impossible to match bits. Notably, LLDB uses two bits to indicate read and write status, and uses union of both for read/write. GDB uses a value of 0 for read-only, 1 for write-only and 2 for read/write. In order to future-proof the code for the GDB variant: 1. Add a distinct eOpenOptionReadWrite constant to be used instead of (eOpenOptionRead | eOpenOptionWrite) when R/W access is required. 2. Rename eOpenOptionRead and eOpenOptionWrite to eOpenOptionReadOnly and eOpenOptionWriteOnly respectively, to make it clear that they do not mean to be combined and require update to all call sites. 3. Use the intersection of all three flags when matching against the three possible values. This commit does not change the actual bits used by LLDB. Differential Revision: https://reviews.llvm.org/D106984
54 lines
1.8 KiB
C++
54 lines
1.8 KiB
C++
//===-- StreamFile.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/Core/StreamFile.h"
|
|
#include "lldb/Host/FileSystem.h"
|
|
#include "lldb/Utility/Log.h"
|
|
|
|
#include <cstdio>
|
|
|
|
using namespace lldb;
|
|
using namespace lldb_private;
|
|
|
|
StreamFile::StreamFile(uint32_t flags, uint32_t addr_size, ByteOrder byte_order)
|
|
: Stream(flags, addr_size, byte_order) {
|
|
m_file_sp = std::make_shared<File>();
|
|
}
|
|
|
|
StreamFile::StreamFile(int fd, bool transfer_ownership) : Stream() {
|
|
m_file_sp = std::make_shared<NativeFile>(fd, File::eOpenOptionWriteOnly,
|
|
transfer_ownership);
|
|
}
|
|
|
|
StreamFile::StreamFile(FILE *fh, bool transfer_ownership) : Stream() {
|
|
m_file_sp = std::make_shared<NativeFile>(fh, transfer_ownership);
|
|
}
|
|
|
|
StreamFile::StreamFile(const char *path, File::OpenOptions options,
|
|
uint32_t permissions)
|
|
: Stream() {
|
|
auto file = FileSystem::Instance().Open(FileSpec(path), options, permissions);
|
|
if (file)
|
|
m_file_sp = std::move(file.get());
|
|
else {
|
|
// TODO refactor this so the error gets popagated up instead of logged here.
|
|
LLDB_LOG_ERROR(GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST), file.takeError(),
|
|
"Cannot open {1}: {0}", path);
|
|
m_file_sp = std::make_shared<File>();
|
|
}
|
|
}
|
|
|
|
StreamFile::~StreamFile() = default;
|
|
|
|
void StreamFile::Flush() { m_file_sp->Flush(); }
|
|
|
|
size_t StreamFile::WriteImpl(const void *s, size_t length) {
|
|
m_file_sp->Write(s, length);
|
|
return length;
|
|
}
|