From 25564dcda70eefa1359b105a51df198e409f5127 Mon Sep 17 00:00:00 2001 From: Robin Kruppe Date: Tue, 6 Dec 2016 17:37:32 +0100 Subject: [LLVM 4.0] rustllvm archive support Error handling is being transitioned from ErrorOr to Expected which has a different API and requires explicitly handling all errors --- src/rustllvm/ArchiveWrapper.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'src/rustllvm/ArchiveWrapper.cpp') diff --git a/src/rustllvm/ArchiveWrapper.cpp b/src/rustllvm/ArchiveWrapper.cpp index 12cd81ec700..5adb05d6089 100644 --- a/src/rustllvm/ArchiveWrapper.cpp +++ b/src/rustllvm/ArchiveWrapper.cpp @@ -163,9 +163,20 @@ LLVMRustArchiveIteratorFree(LLVMRustArchiveIteratorRef rai) { extern "C" const char* LLVMRustArchiveChildName(LLVMRustArchiveChildConstRef child, size_t *size) { +#if LLVM_VERSION_GE(4, 0) + Expected name_or_err = child->getName(); + if (!name_or_err) { + // rustc_llvm currently doesn't use this error string, but it might be useful + // in the future, and in the mean time this tells LLVM that the error was + // not ignored and that it shouldn't abort the process. + LLVMRustSetLastError(toString(name_or_err.takeError()).c_str()); + return NULL; + } +#else ErrorOr name_or_err = child->getName(); if (name_or_err.getError()) return NULL; +#endif StringRef name = name_or_err.get(); *size = name.size(); return name.data(); @@ -174,11 +185,19 @@ LLVMRustArchiveChildName(LLVMRustArchiveChildConstRef child, size_t *size) { extern "C" const char* LLVMRustArchiveChildData(LLVMRustArchiveChildRef child, size_t *size) { StringRef buf; +#if LLVM_VERSION_GE(4, 0) + Expected buf_or_err = child->getBuffer(); + if (!buf_or_err) { + LLVMRustSetLastError(toString(buf_or_err.takeError()).c_str()); + return NULL; + } +#else ErrorOr buf_or_err = child->getBuffer(); if (buf_or_err.getError()) { LLVMRustSetLastError(buf_or_err.getError().message().c_str()); return NULL; } +#endif buf = buf_or_err.get(); *size = buf.size(); return buf.data(); -- cgit 1.4.1-3-g733a5 From 6222de3ce4fcb59aeb0516305767f0043cc88f1e Mon Sep 17 00:00:00 2001 From: Dylan McKay Date: Sun, 11 Dec 2016 22:42:32 +1300 Subject: [LLVM 4.0] Explicitly call constructor of 'llvm::Error' The implicit constructor has been deleted. We should use Error::success() instead. The constructor in the LLVM headers mentions that "success" should be used instead of the deleted constructor for clarity. --- src/rustllvm/ArchiveWrapper.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/rustllvm/ArchiveWrapper.cpp') diff --git a/src/rustllvm/ArchiveWrapper.cpp b/src/rustllvm/ArchiveWrapper.cpp index 5adb05d6089..c7f426fbfa3 100644 --- a/src/rustllvm/ArchiveWrapper.cpp +++ b/src/rustllvm/ArchiveWrapper.cpp @@ -37,6 +37,8 @@ struct RustArchiveIterator { Archive::child_iterator end; #if LLVM_VERSION_GE(3, 9) Error err; + + RustArchiveIterator() : err(Error::success()) { } #endif }; -- cgit 1.4.1-3-g733a5