@@ -23,18 +23,28 @@ using namespace llvm;
2323using namespace llvm ::sys;
2424using namespace llvm ::object;
2525
26- const char *LLVMRustError ;
26+ static char *LastError ;
2727
2828extern " C" LLVMMemoryBufferRef
2929LLVMRustCreateMemoryBufferWithContentsOfFile (const char *Path) {
3030 LLVMMemoryBufferRef MemBuf = NULL ;
31- LLVMCreateMemoryBufferWithContentsOfFile (Path, &MemBuf,
32- const_cast <char **>(&LLVMRustError));
31+ char *err = NULL ;
32+ LLVMCreateMemoryBufferWithContentsOfFile (Path, &MemBuf, &err);
33+ if (err != NULL ) {
34+ LLVMRustSetLastError (err);
35+ }
3336 return MemBuf;
3437}
3538
36- extern " C" const char *LLVMRustGetLastError (void ) {
37- return LLVMRustError;
39+ extern " C" char *LLVMRustGetLastError (void ) {
40+ char *ret = LastError;
41+ LastError = NULL ;
42+ return ret;
43+ }
44+
45+ void LLVMRustSetLastError (const char *err) {
46+ free ((void *) LastError);
47+ LastError = strdup (err);
3848}
3949
4050extern " C" void
@@ -609,14 +619,14 @@ LLVMRustLinkInExternalBitcode(LLVMModuleRef dst, char *bc, size_t len) {
609619 MemoryBuffer* buf = MemoryBuffer::getMemBufferCopy (StringRef (bc, len));
610620 ErrorOr<Module *> Src = llvm::getLazyBitcodeModule (buf, Dst->getContext ());
611621 if (!Src) {
612- LLVMRustError = Src.getError ().message ().c_str ();
622+ LLVMRustSetLastError ( Src.getError ().message ().c_str () );
613623 delete buf;
614624 return false ;
615625 }
616626
617627 std::string Err;
618628 if (Linker::LinkModules (Dst, *Src, Linker::DestroySource, &Err)) {
619- LLVMRustError = Err.c_str ();
629+ LLVMRustSetLastError ( Err.c_str () );
620630 return false ;
621631 }
622632 return true ;
@@ -629,13 +639,13 @@ LLVMRustLinkInExternalBitcode(LLVMModuleRef dst, char *bc, size_t len) {
629639 std::string Err;
630640 Module *Src = llvm::getLazyBitcodeModule (buf, Dst->getContext (), &Err);
631641 if (!Src) {
632- LLVMRustError = Err.c_str ();
642+ LLVMRustSetLastError ( Err.c_str () );
633643 delete buf;
634644 return false ;
635645 }
636646
637647 if (Linker::LinkModules (Dst, Src, Linker::DestroySource, &Err)) {
638- LLVMRustError = Err.c_str ();
648+ LLVMRustSetLastError ( Err.c_str () );
639649 return false ;
640650 }
641651 return true ;
@@ -648,12 +658,12 @@ LLVMRustOpenArchive(char *path) {
648658 std::unique_ptr<MemoryBuffer> buf;
649659 error_code err = MemoryBuffer::getFile (path, buf);
650660 if (err) {
651- LLVMRustError = err.message ().c_str ();
661+ LLVMRustSetLastError ( err.message ().c_str () );
652662 return NULL ;
653663 }
654664 Archive *ret = new Archive (buf.release (), err);
655665 if (err) {
656- LLVMRustError = err.message ().c_str ();
666+ LLVMRustSetLastError ( err.message ().c_str () );
657667 return NULL ;
658668 }
659669 return ret;
@@ -664,12 +674,12 @@ LLVMRustOpenArchive(char *path) {
664674 OwningPtr<MemoryBuffer> buf;
665675 error_code err = MemoryBuffer::getFile (path, buf);
666676 if (err) {
667- LLVMRustError = err.message ().c_str ();
677+ LLVMRustSetLastError ( err.message ().c_str () );
668678 return NULL ;
669679 }
670680 Archive *ret = new Archive (buf.take (), err);
671681 if (err) {
672- LLVMRustError = err.message ().c_str ();
682+ LLVMRustSetLastError ( err.message ().c_str () );
673683 return NULL ;
674684 }
675685 return ret;
0 commit comments