about summary refs log tree commit diff
path: root/src/rustllvm/RustWrapper.cpp
diff options
context:
space:
mode:
authorZack Corr <zack@z0w0.me>2012-08-28 09:51:30 +1000
committerBrian Anderson <banderson@mozilla.com>2012-08-31 16:20:36 -0700
commit795acb73950adf632d1e3fb48ea6104b4d61f3cd (patch)
tree7166836643edb5873508725a03ff95c335b4c4d5 /src/rustllvm/RustWrapper.cpp
parent7993f4820995c9b26d73e8a58bb8f3c0e2e79d47 (diff)
downloadrust-795acb73950adf632d1e3fb48ea6104b4d61f3cd.tar.gz
rust-795acb73950adf632d1e3fb48ea6104b4d61f3cd.zip
jit: Link in __morestack and make it resolvable by JIT
Diffstat (limited to 'src/rustllvm/RustWrapper.cpp')
-rw-r--r--src/rustllvm/RustWrapper.cpp16
1 files changed, 7 insertions, 9 deletions
diff --git a/src/rustllvm/RustWrapper.cpp b/src/rustllvm/RustWrapper.cpp
index 290f9f135e9..796c054e078 100644
--- a/src/rustllvm/RustWrapper.cpp
+++ b/src/rustllvm/RustWrapper.cpp
@@ -49,6 +49,9 @@
 #include <unistd.h>
 #endif
 
+// Does this need to be done, or can it be made to resolve from the main program?
+extern "C" void __morestack(void *args, void *fn_ptr, uintptr_t stack_ptr);
+
 using namespace llvm;
 
 static const char *LLVMRustError;
@@ -269,17 +272,12 @@ void *RustMCJITMemoryManager::getPointerToNamedFunction(const std::string &Name,
   if (Name == "mknod") return (void*)(intptr_t)&mknod;
 #endif
 
+  if (Name == "__morestack") return (void*)(intptr_t)&__morestack;
+
   const char *NameStr = Name.c_str();
   void *Ptr = sys::DynamicLibrary::SearchForAddressOfSymbol(NameStr);
   if (Ptr) return Ptr;
 
-  // If it wasn't found and if it starts with an underscore ('_') character,
-  // try again without the underscore.
-  if (NameStr[0] == '_') {
-    Ptr = sys::DynamicLibrary::SearchForAddressOfSymbol(NameStr+1);
-    if (Ptr) return Ptr;
-  }
-
   if (AbortOnFailure)
     report_fatal_error("Program used external function '" + Name +
                       "' which could not be resolved!");
@@ -309,8 +307,8 @@ LLVMRustPrepareJIT(LLVMPassManagerRef PMR,
   std::string Err;
   TargetOptions Options;
   Options.JITEmitDebugInfo = true;
-  //Options.NoFramePointerElim = true;
-  //Options.EnableSegmentedStacks = EnableSegmentedStacks;
+  Options.NoFramePointerElim = true;
+  Options.EnableSegmentedStacks = EnableSegmentedStacks;
 
   unwrap<PassManager>(PMR)->run(*unwrap(M));