Skip to content

Commit

Permalink
get static compile most of the way to supporting windows
Browse files Browse the repository at this point in the history
  • Loading branch information
vtjnash committed Nov 29, 2013
1 parent f4f4c2f commit f0ec45d
Show file tree
Hide file tree
Showing 6 changed files with 54 additions and 15 deletions.
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ $(BUILD)/$(JL_PRIVATE_LIBDIR)/sys%o: $(BUILD)/$(JL_PRIVATE_LIBDIR)/sys%bc

$(BUILD)/$(JL_PRIVATE_LIBDIR)/sys%$(SHLIB_EXT): $(BUILD)/$(JL_PRIVATE_LIBDIR)/sys%o
$(CXX) -g -shared -fPIC -L$(BUILD)/$(JL_PRIVATE_LIBDIR) -L$(BUILD)/$(JL_LIBDIR) -o $@ $< \
$$([ $(OS) = Darwin ] && echo -Wl,-undefined,dynamic_lookup || echo -Wl,--unresolved-symbols,ignore-all ]) \
$$([ $(OS) = Darwin ] && echo -Wl,-undefined,dynamic_lookup || echo -Wl,--unresolved-symbols,ignore-all ) \
$$([ $(OS) = WINNT ] && echo -ljulia -lssp)

$(BUILD)/$(JL_PRIVATE_LIBDIR)/sys0.bc:
Expand Down
34 changes: 32 additions & 2 deletions src/ccall.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -425,8 +425,16 @@ static Value *emit_cglobal(jl_value_t **args, size_t nargs, jl_codectx_t *ctx)
}
else {
void *symaddr;
if (sym.f_lib != NULL)
if (sym.f_lib != NULL) {
#ifdef _OS_WINDOWS_
if ((intptr_t)sym.f_lib == 1)
symaddr = jl_dlsym_e(jl_exe_handle, sym.f_name);
else if ((intptr_t)sym.f_lib == 2)
symaddr = jl_dlsym_e(jl_dl_handle, sym.f_name);
else
#endif
symaddr = get_library_sym(sym.f_name, sym.f_lib);
}
else
symaddr = sys::DynamicLibrary::SearchForAddressOfSymbol(sym.f_name);
if (imaging_mode) {
Expand All @@ -443,6 +451,13 @@ static Value *emit_cglobal(jl_value_t **args, size_t nargs, jl_codectx_t *ctx)
builder.SetInsertPoint(dlsym_lookup);
Value *libptr;
if (sym.f_lib != NULL) {
#ifdef _OS_WINDOWS_
if ((intptr_t)sym.f_lib == 1)
libptr = jlexe_var;
else if ((intptr_t)sym.f_lib == 2)
libptr = jldll_var;
else
#endif
libptr = builder.CreateCall2(jldlopen_func, builder.CreateGlobalStringPtr(sym.f_lib), ConstantInt::get(T_int32,0));
} else {
libptr = builder.CreateCall2(jldlopen_func, ConstantPointerNull::get((PointerType*)T_pint8), ConstantInt::get(T_int32,0));
Expand Down Expand Up @@ -679,8 +694,16 @@ static Value *emit_ccall(jl_value_t **args, size_t nargs, jl_codectx_t *ctx)
else {
assert(f_name != NULL);
void *symaddr;
if (f_lib != NULL)
if (f_lib != NULL) {
#ifdef _OS_WINDOWS_
if ((intptr_t)f_lib == 1)
symaddr = jl_dlsym_e(jl_exe_handle, f_name);
else if ((intptr_t)f_lib == 2)
symaddr = jl_dlsym_e(jl_dl_handle, f_name);
else
#endif
symaddr = get_library_sym(f_name, f_lib);
}
else
symaddr = sys::DynamicLibrary::SearchForAddressOfSymbol(f_name);
PointerType *funcptype = PointerType::get(functype,0);
Expand All @@ -697,6 +720,13 @@ static Value *emit_ccall(jl_value_t **args, size_t nargs, jl_codectx_t *ctx)
builder.SetInsertPoint(dlsym_lookup);
Value *libptr;
if (f_lib != NULL) {
#ifdef _OS_WINDOWS_
if ((intptr_t)f_lib == 1)
libptr = jlexe_var;
else if ((intptr_t)f_lib == 2)
libptr = jldll_var;
else
#endif
libptr = builder.CreateCall2(jldlopen_func, builder.CreateGlobalStringPtr(f_lib), ConstantInt::get(T_int32,0));
} else {
libptr = builder.CreateCall2(jldlopen_func, ConstantPointerNull::get((PointerType*)T_pint8), ConstantInt::get(T_int32,0));
Expand Down
18 changes: 17 additions & 1 deletion src/codegen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,10 @@ static GlobalVariable *jlovferr_var;
static GlobalVariable *jlinexacterr_var;
static GlobalVariable *jlboundserr_var;
static GlobalVariable *jlstderr_var;
#ifdef _OS_WINDOWS_
static GlobalVariable *jlexe_var;
static GlobalVariable *jldll_var;
#endif

// important functions
static Function *jlnew_func;
Expand Down Expand Up @@ -3272,7 +3276,19 @@ static void init_julia_llvm_env(Module *m)
(void*)&jl_bounds_exception);
jlstderr_var = global_to_llvm("jl_uv_stderr",
(void*)&jl_uv_stderr);

#ifdef _OS_WINDOWS_
jlexe_var =
new GlobalVariable(*jl_Module, T_int8,
true, GlobalVariable::ExternalLinkage,
NULL, "jl_exe_handle");
jl_ExecutionEngine->addGlobalMapping(jlexe_var, (void*)&jl_exe_handle);
jldll_var =
new GlobalVariable(*jl_Module, T_int8,
true, GlobalVariable::ExternalLinkage,
NULL, "jl_dl_handle");
jl_ExecutionEngine->addGlobalMapping(jldll_var, (void*)&jl_dl_handle);
#endif

// Has to be big enough for the biggest LLVM-supported float type
jlfloattemp_var =
new GlobalVariable(*jl_Module, IntegerType::get(jl_LLVMContext,128),
Expand Down
4 changes: 2 additions & 2 deletions src/dlload.c
Original file line number Diff line number Diff line change
Expand Up @@ -184,9 +184,9 @@ void *jl_dlsym(uv_lib_t *handle, char *symbol)
char *jl_dlfind_win32(char *f_name)
{
if (jl_dlsym_e(jl_exe_handle, f_name))
return NULL;
return (char*)1;
if (jl_dlsym_e(jl_dl_handle, f_name))
return NULL;
return (char*)2;
if (jl_dlsym_e(jl_kernel32_handle, f_name))
return "kernel32";
if (jl_dlsym_e(jl_ntdll_handle, f_name))
Expand Down
3 changes: 2 additions & 1 deletion src/julia.h
Original file line number Diff line number Diff line change
Expand Up @@ -430,7 +430,8 @@ extern uv_lib_t *jl_dl_handle;

#if defined(_OS_WINDOWS_)
extern uv_lib_t *jl_ntdll_handle;
extern uv_lib_t *jl_exe_handle;
DLLEXPORT extern uv_lib_t *jl_exe_handle;
DLLEXPORT extern uv_lib_t *jl_dl_handle;
extern uv_lib_t *jl_kernel32_handle;
extern uv_lib_t *jl_crtdll_handle;
extern uv_lib_t *jl_winsock_handle;
Expand Down
8 changes: 0 additions & 8 deletions test.jl

This file was deleted.

0 comments on commit f0ec45d

Please sign in to comment.