@@ -16,34 +16,38 @@ using namespace llvm;
16
16
using namespace llvm ::sys;
17
17
using namespace llvm ::object;
18
18
19
+ // libmorestack is not used on Windows
20
+ #ifndef _WIN32
21
+ extern " C" void __morestack (void );
22
+
23
+ static void * morestack_addr () {
24
+ return reinterpret_cast <void *>(__morestack);
25
+ }
26
+ #endif
27
+
19
28
class RustJITMemoryManager : public SectionMemoryManager
20
29
{
21
30
typedef SectionMemoryManager Base;
22
31
23
- const void *morestack;
24
-
25
32
public:
26
33
27
- RustJITMemoryManager (const void *morestack_ptr)
28
- : morestack(morestack_ptr)
29
- {}
34
+ RustJITMemoryManager () {}
30
35
31
36
uint64_t getSymbolAddress (const std::string &Name) override
32
37
{
38
+ #ifndef _WIN32
33
39
if (Name == " __morestack" || Name == " ___morestack" )
34
- return reinterpret_cast <uint64_t >(morestack);
40
+ return reinterpret_cast <uint64_t >(__morestack);
41
+ if (Name == " __morestack_addr" || Name == " ___morestack_addr" )
42
+ return reinterpret_cast <uint64_t >(morestack_addr);
43
+ #endif
35
44
36
45
return Base::getSymbolAddress (Name);
37
46
}
38
47
};
39
48
40
49
DEFINE_SIMPLE_CONVERSION_FUNCTIONS (RustJITMemoryManager, LLVMRustJITMemoryManagerRef)
41
50
42
- extern "C" LLVMRustJITMemoryManagerRef LLVMRustCreateJITMemoryManager(void *morestack)
43
- {
44
- return wrap (new RustJITMemoryManager (morestack));
45
- }
46
-
47
51
extern "C" LLVMBool LLVMRustLoadDynamicLibrary(const char *path)
48
52
{
49
53
std::string err;
@@ -60,6 +64,13 @@ extern "C" LLVMBool LLVMRustLoadDynamicLibrary(const char *path)
60
64
extern " C" void LLVMExecutionEngineAddModule (
61
65
LLVMExecutionEngineRef eeref, LLVMModuleRef mref)
62
66
{
67
+ #ifdef _WIN32
68
+ // On Windows, MCJIT must generate ELF objects
69
+ std::string target = getProcessTriple ();
70
+ target += " -elf" ;
71
+ target = Triple::normalize (target);
72
+ unwrap (mref)->setTargetTriple (target);
73
+ #endif
63
74
LLVMAddModule (eeref, mref);
64
75
}
65
76
@@ -74,27 +85,36 @@ extern "C" LLVMBool LLVMExecutionEngineRemoveModule(
74
85
return ee->removeModule (m);
75
86
}
76
87
77
- extern " C" LLVMExecutionEngineRef LLVMBuildExecutionEngine (
78
- LLVMModuleRef mod, LLVMRustJITMemoryManagerRef mref)
88
+ extern " C" LLVMExecutionEngineRef LLVMBuildExecutionEngine (LLVMModuleRef mod)
79
89
{
80
90
// These are necessary for code generation to work properly.
81
91
InitializeNativeTarget ();
82
92
InitializeNativeTargetAsmPrinter ();
83
93
InitializeNativeTargetAsmParser ();
84
94
95
+ #ifdef _WIN32
96
+ // On Windows, MCJIT must generate ELF objects
97
+ std::string target = getProcessTriple ();
98
+ target += " -elf" ;
99
+ target = Triple::normalize (target);
100
+ unwrap (mod)->setTargetTriple (target);
101
+ #endif
102
+
85
103
std::string error_str;
86
104
TargetOptions options;
87
105
88
106
options.JITEmitDebugInfo = true ;
89
107
options.NoFramePointerElim = true ;
90
108
109
+ RustJITMemoryManager *mm = new RustJITMemoryManager;
110
+
91
111
ExecutionEngine *ee =
92
112
#if LLVM_VERSION_MINOR >= 6
93
113
EngineBuilder (std::unique_ptr<Module>(unwrap (mod)))
94
- .setMCJITMemoryManager (std::unique_ptr<RustJITMemoryManager>(unwrap (mref) ))
114
+ .setMCJITMemoryManager (std::unique_ptr<RustJITMemoryManager>(mm ))
95
115
#else
96
116
EngineBuilder (unwrap (mod))
97
- .setMCJITMemoryManager (unwrap (mref) )
117
+ .setMCJITMemoryManager (mm )
98
118
#endif
99
119
.setEngineKind (EngineKind::JIT)
100
120
.setErrorStr (&error_str)
0 commit comments