about summary refs log tree commit diff
path: root/src/rustllvm/ArchiveWrapper.cpp
diff options
context:
space:
mode:
authorJeremy Soller <jackpot51@gmail.com>2016-12-12 14:55:09 -0700
committerJeremy Soller <jackpot51@gmail.com>2016-12-12 14:55:09 -0700
commit7e7775ce7bfc916ce723bd1fdaf4ae54662c6627 (patch)
tree235a9c38e42bacdb671da33bc49ffc8a4aba17a4 /src/rustllvm/ArchiveWrapper.cpp
parentc61baa0fc7a85bd2bcce34aac05ed739261cf037 (diff)
parent6483bdd860fd89fc68846d4cc94c7ae3307a84c1 (diff)
downloadrust-7e7775ce7bfc916ce723bd1fdaf4ae54662c6627.tar.gz
rust-7e7775ce7bfc916ce723bd1fdaf4ae54662c6627.zip
Merge branch 'master' into redox
Diffstat (limited to 'src/rustllvm/ArchiveWrapper.cpp')
-rw-r--r--src/rustllvm/ArchiveWrapper.cpp21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/rustllvm/ArchiveWrapper.cpp b/src/rustllvm/ArchiveWrapper.cpp
index 12cd81ec700..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
 };
 
@@ -163,9 +165,20 @@ LLVMRustArchiveIteratorFree(LLVMRustArchiveIteratorRef rai) {
 
 extern "C" const char*
 LLVMRustArchiveChildName(LLVMRustArchiveChildConstRef child, size_t *size) {
+#if LLVM_VERSION_GE(4, 0)
+    Expected<StringRef> 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<StringRef> 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 +187,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<StringRef> buf_or_err = child->getBuffer();
+    if (!buf_or_err) {
+      LLVMRustSetLastError(toString(buf_or_err.takeError()).c_str());
+      return NULL;
+    }
+#else
     ErrorOr<StringRef> 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();