
Summary: We sometimes need to write to the object file we've mapped into memory, generally to apply relocations to debug info sections. We've had that ability before, but with the introduction of DataBufferLLVM, we have lost it, as the underlying llvm class (MemoryBuffer) only supports read-only mappings. This switches DataBufferLLVM to use the new llvm::WritableMemoryBuffer class as a back-end, as this one guarantees to return a writable buffer. This removes the need for the "Private" flag to the DataBufferLLVM creation functions, as it was really used to mean "writable". The LLVM function also does not have the NullTerminate flag, so I've modified our clients to not require this feature and removed that flag as well. Reviewers: zturner, clayborg, jingham Subscribers: emaste, aprantl, arichardson, krytarowski, lldb-commits Differential Revision: https://reviews.llvm.org/D40079 llvm-svn: 321255
69 lines
2.1 KiB
C++
69 lines
2.1 KiB
C++
//===--- DataBufferLLVM.cpp -------------------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "lldb/Utility/DataBufferLLVM.h"
|
|
|
|
#include "llvm/ADT/Twine.h"
|
|
#include "llvm/Support/FileSystem.h"
|
|
#include "llvm/Support/MemoryBuffer.h"
|
|
|
|
#include <assert.h> // for assert
|
|
#include <type_traits> // for move
|
|
|
|
using namespace lldb_private;
|
|
|
|
DataBufferLLVM::DataBufferLLVM(
|
|
std::unique_ptr<llvm::WritableMemoryBuffer> MemBuffer)
|
|
: Buffer(std::move(MemBuffer)) {
|
|
assert(Buffer != nullptr &&
|
|
"Cannot construct a DataBufferLLVM with a null buffer");
|
|
}
|
|
|
|
DataBufferLLVM::~DataBufferLLVM() {}
|
|
|
|
std::shared_ptr<DataBufferLLVM>
|
|
DataBufferLLVM::CreateSliceFromPath(const llvm::Twine &Path, uint64_t Size,
|
|
uint64_t Offset) {
|
|
// If the file resides non-locally, pass the volatile flag so that we don't
|
|
// mmap it.
|
|
bool IsVolatile = !llvm::sys::fs::is_local(Path);
|
|
|
|
auto Buffer =
|
|
llvm::WritableMemoryBuffer::getFileSlice(Path, Size, Offset, IsVolatile);
|
|
if (!Buffer)
|
|
return nullptr;
|
|
return std::shared_ptr<DataBufferLLVM>(
|
|
new DataBufferLLVM(std::move(*Buffer)));
|
|
}
|
|
|
|
std::shared_ptr<DataBufferLLVM>
|
|
DataBufferLLVM::CreateFromPath(const llvm::Twine &Path) {
|
|
// If the file resides non-locally, pass the volatile flag so that we don't
|
|
// mmap it.
|
|
bool IsVolatile = !llvm::sys::fs::is_local(Path);
|
|
|
|
auto Buffer = llvm::WritableMemoryBuffer::getFile(Path, -1, IsVolatile);
|
|
if (!Buffer)
|
|
return nullptr;
|
|
return std::shared_ptr<DataBufferLLVM>(
|
|
new DataBufferLLVM(std::move(*Buffer)));
|
|
}
|
|
|
|
uint8_t *DataBufferLLVM::GetBytes() {
|
|
return reinterpret_cast<uint8_t *>(Buffer->getBufferStart());
|
|
}
|
|
|
|
const uint8_t *DataBufferLLVM::GetBytes() const {
|
|
return reinterpret_cast<const uint8_t *>(Buffer->getBufferStart());
|
|
}
|
|
|
|
lldb::offset_t DataBufferLLVM::GetByteSize() const {
|
|
return Buffer->getBufferSize();
|
|
}
|