[Object] Modify OwningBinary's interface to separate inspection from ownership.

The getBinary and getBuffer method now return ordinary pointers of appropriate
const-ness. Ownership is transferred by calling takeBinary(), which returns a
pair of the Binary and a MemoryBuffer.

llvm-svn: 221003
This commit is contained in:
Lang Hames 2014-10-31 21:37:49 +00:00
parent fca26da446
commit f04de6ec48
6 changed files with 29 additions and 22 deletions

View File

@ -139,9 +139,10 @@ public:
OwningBinary(OwningBinary<T>&& Other); OwningBinary(OwningBinary<T>&& Other);
OwningBinary<T> &operator=(OwningBinary<T> &&Other); OwningBinary<T> &operator=(OwningBinary<T> &&Other);
std::unique_ptr<T> &getBinary(); std::pair<std::unique_ptr<T>, std::unique_ptr<MemoryBuffer>> takeBinary();
const std::unique_ptr<T> &getBinary() const;
std::unique_ptr<MemoryBuffer> &getBuffer(); T* getBinary();
const T* getBinary() const;
}; };
template <typename T> template <typename T>
@ -162,18 +163,18 @@ OwningBinary<T> &OwningBinary<T>::operator=(OwningBinary &&Other) {
return *this; return *this;
} }
template <typename T> std::unique_ptr<T> &OwningBinary<T>::getBinary() { template <typename T>
return Bin; std::pair<std::unique_ptr<T>, std::unique_ptr<MemoryBuffer>>
OwningBinary<T>::takeBinary() {
return std::make_pair(std::move(Bin), std::move(Buf));
} }
template <typename T> template <typename T> T* OwningBinary<T>::getBinary() {
const std::unique_ptr<T> &OwningBinary<T>::getBinary() const { return Bin.get();
return Bin;
} }
template <typename T> template <typename T> const T* OwningBinary<T>::getBinary() const {
std::unique_ptr<MemoryBuffer> &OwningBinary<T>::getBuffer() { return Bin.get();
return Buf;
} }
ErrorOr<OwningBinary<Binary>> createBinary(StringRef Path); ErrorOr<OwningBinary<Binary>> createBinary(StringRef Path);

View File

@ -109,8 +109,11 @@ void MCJIT::addObjectFile(std::unique_ptr<object::ObjectFile> Obj) {
} }
void MCJIT::addObjectFile(object::OwningBinary<object::ObjectFile> Obj) { void MCJIT::addObjectFile(object::OwningBinary<object::ObjectFile> Obj) {
addObjectFile(std::move(Obj.getBinary())); std::unique_ptr<object::ObjectFile> ObjFile;
Buffers.push_back(std::move(Obj.getBuffer())); std::unique_ptr<MemoryBuffer> MemBuf;
std::tie(ObjFile, MemBuf) = Obj.takeBinary();
addObjectFile(std::move(ObjFile));
Buffers.push_back(std::move(MemBuf));
} }
void MCJIT::addArchive(object::OwningBinary<object::Archive> A) { void MCJIT::addArchive(object::OwningBinary<object::Archive> A) {
@ -290,7 +293,7 @@ uint64_t MCJIT::getSymbolAddress(const std::string &Name,
return Addr; return Addr;
for (object::OwningBinary<object::Archive> &OB : Archives) { for (object::OwningBinary<object::Archive> &OB : Archives) {
object::Archive *A = OB.getBinary().get(); object::Archive *A = OB.getBinary();
// Look for our symbols in each Archive // Look for our symbols in each Archive
object::Archive::child_iterator ChildIt = A->findSym(Name); object::Archive::child_iterator ChildIt = A->findSym(Name);
if (ChildIt != A->child_end()) { if (ChildIt != A->child_end()) {

View File

@ -485,7 +485,7 @@ ObjectFileCoverageMappingReader::ObjectFileCoverageMappingReader(
} }
std::error_code ObjectFileCoverageMappingReader::readHeader() { std::error_code ObjectFileCoverageMappingReader::readHeader() {
ObjectFile *OF = Object.getBinary().get(); const ObjectFile *OF = Object.getBinary();
if (!OF) if (!OF)
return getError(); return getError();
auto BytesInAddress = OF->getBytesInAddress(); auto BytesInAddress = OF->getBytesInAddress();

View File

@ -41,7 +41,7 @@ int convertForTestingMain(int argc, const char *argv[]) {
errs() << "error: " << Err.message() << "\n"; errs() << "error: " << Err.message() << "\n";
return 1; return 1;
} }
ObjectFile *OF = ObjErr.get().getBinary().get(); ObjectFile *OF = ObjErr.get().getBinary();
auto BytesInAddress = OF->getBytesInAddress(); auto BytesInAddress = OF->getBytesInAddress();
if (BytesInAddress != 8) { if (BytesInAddress != 8) {
errs() << "error: 64 bit binary expected\n"; errs() << "error: 64 bit binary expected\n";

View File

@ -326,7 +326,7 @@ ObjectFile *LLVMSymbolizer::lookUpDsymFile(const std::string &ExePath,
if (EC != errc::no_such_file_or_directory && !error(EC)) { if (EC != errc::no_such_file_or_directory && !error(EC)) {
OwningBinary<Binary> B = std::move(BinaryOrErr.get()); OwningBinary<Binary> B = std::move(BinaryOrErr.get());
ObjectFile *DbgObj = ObjectFile *DbgObj =
getObjectFileFromBinary(B.getBinary().get(), ArchName); getObjectFileFromBinary(B.getBinary(), ArchName);
const MachOObjectFile *MachDbgObj = const MachOObjectFile *MachDbgObj =
dyn_cast<const MachOObjectFile>(DbgObj); dyn_cast<const MachOObjectFile>(DbgObj);
if (!MachDbgObj) continue; if (!MachDbgObj) continue;
@ -350,7 +350,7 @@ LLVMSymbolizer::getOrCreateObjects(const std::string &Path,
ErrorOr<OwningBinary<Binary>> BinaryOrErr = createBinary(Path); ErrorOr<OwningBinary<Binary>> BinaryOrErr = createBinary(Path);
if (!error(BinaryOrErr.getError())) { if (!error(BinaryOrErr.getError())) {
OwningBinary<Binary> &B = BinaryOrErr.get(); OwningBinary<Binary> &B = BinaryOrErr.get();
Obj = getObjectFileFromBinary(B.getBinary().get(), ArchName); Obj = getObjectFileFromBinary(B.getBinary(), ArchName);
if (!Obj) { if (!Obj) {
ObjectPair Res = std::make_pair(nullptr, nullptr); ObjectPair Res = std::make_pair(nullptr, nullptr);
ObjectPairForPathArch[std::make_pair(Path, ArchName)] = Res; ObjectPairForPathArch[std::make_pair(Path, ArchName)] = Res;
@ -369,7 +369,7 @@ LLVMSymbolizer::getOrCreateObjects(const std::string &Path,
BinaryOrErr = createBinary(DebugBinaryPath); BinaryOrErr = createBinary(DebugBinaryPath);
if (!error(BinaryOrErr.getError())) { if (!error(BinaryOrErr.getError())) {
OwningBinary<Binary> B = std::move(BinaryOrErr.get()); OwningBinary<Binary> B = std::move(BinaryOrErr.get());
DbgObj = getObjectFileFromBinary(B.getBinary().get(), ArchName); DbgObj = getObjectFileFromBinary(B.getBinary(), ArchName);
addOwningBinary(std::move(B)); addOwningBinary(std::move(B));
} }
} }

View File

@ -81,9 +81,12 @@ private:
// Owns all the parsed binaries and object files. // Owns all the parsed binaries and object files.
SmallVector<std::unique_ptr<Binary>, 4> ParsedBinariesAndObjects; SmallVector<std::unique_ptr<Binary>, 4> ParsedBinariesAndObjects;
SmallVector<std::unique_ptr<MemoryBuffer>, 4> MemoryBuffers; SmallVector<std::unique_ptr<MemoryBuffer>, 4> MemoryBuffers;
void addOwningBinary(OwningBinary<Binary> Bin) { void addOwningBinary(OwningBinary<Binary> OwningBin) {
ParsedBinariesAndObjects.push_back(std::move(Bin.getBinary())); std::unique_ptr<Binary> Bin;
MemoryBuffers.push_back(std::move(Bin.getBuffer())); std::unique_ptr<MemoryBuffer> MemBuf;
std::tie(Bin, MemBuf) = OwningBin.takeBinary();
ParsedBinariesAndObjects.push_back(std::move(Bin));
MemoryBuffers.push_back(std::move(MemBuf));
} }
// Owns module info objects. // Owns module info objects.