]> git.lizzy.rs Git - rust.git/commitdiff
rustllvm: Don't require null terminators in files
authorAlex Crichton <alex@alexcrichton.com>
Fri, 18 Jul 2014 14:07:15 +0000 (07:07 -0700)
committerAlex Crichton <alex@alexcrichton.com>
Thu, 24 Jul 2014 18:31:28 +0000 (11:31 -0700)
Apparently the default getFile implementation for a memory buffer in LLVM ends
up requiring a null terminator at the end of the file. This isn't true a good
bit of the time apparently on OSX. There have been a number of failed
nightly/snapshot builds recently with this strange assertion.

This modifies the calls to MemoryBuffer::getFile to explicitly not ask for a
null terminator.

src/rustllvm/RustWrapper.cpp

index a4437ea7c7b49f6aac87222962fe4a6c4ffa7020..e28a78b1ee729194ee2209aea562db5e3d3ea9a2 100644 (file)
@@ -31,16 +31,30 @@ using namespace llvm::object;
 
 static char *LastError;
 
+#if LLVM_VERSION_MINOR >= 5
+extern "C" LLVMMemoryBufferRef
+LLVMRustCreateMemoryBufferWithContentsOfFile(const char *Path) {
+  ErrorOr<std::unique_ptr<MemoryBuffer>> buf_or = MemoryBuffer::getFile(Path,
+                                                                        -1,
+                                                                        false);
+  if (!buf_or) {
+      LLVMRustSetLastError(buf_or.getError().message().c_str());
+      return nullptr;
+  }
+  return wrap(buf_or.get().release());
+}
+#else
 extern "C" LLVMMemoryBufferRef
 LLVMRustCreateMemoryBufferWithContentsOfFile(const char *Path) {
-  LLVMMemoryBufferRef MemBuf = NULL;
-  char *err = NULL;
-  LLVMCreateMemoryBufferWithContentsOfFile(Path, &MemBuf, &err);
-  if (err != NULL) {
-    LLVMRustSetLastError(err);
+  OwningPtr<MemoryBuffer> buf;
+  error_code err = MemoryBuffer::getFile(Path, buf, -1, false);
+  if (err) {
+      LLVMRustSetLastError(err.message().c_str());
+      return NULL;
   }
-  return MemBuf;
+  return wrap(buf.take());
 }
+#endif
 
 extern "C" char *LLVMRustGetLastError(void) {
   char *ret = LastError;
@@ -658,10 +672,12 @@ LLVMRustLinkInExternalBitcode(LLVMModuleRef dst, char *bc, size_t len) {
 #if LLVM_VERSION_MINOR >= 5
 extern "C" void*
 LLVMRustOpenArchive(char *path) {
-    ErrorOr<std::unique_ptr<MemoryBuffer>> buf_or = MemoryBuffer::getFile(path);
+    ErrorOr<std::unique_ptr<MemoryBuffer>> buf_or = MemoryBuffer::getFile(path,
+                                                                          -1,
+                                                                          false);
     if (!buf_or) {
         LLVMRustSetLastError(buf_or.getError().message().c_str());
-        return NULL;
+        return nullptr;
     }
 
     std::error_code err;
@@ -676,7 +692,7 @@ LLVMRustOpenArchive(char *path) {
 extern "C" void*
 LLVMRustOpenArchive(char *path) {
     OwningPtr<MemoryBuffer> buf;
-    error_code err = MemoryBuffer::getFile(path, buf);
+    error_code err = MemoryBuffer::getFile(path, buf, -1, false);
     if (err) {
         LLVMRustSetLastError(err.message().c_str());
         return NULL;