Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

generate llvm global variables for most literal_pointer_val calls #3876

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
switch to llvm-managed global variables, load and save them in dump.c
  • Loading branch information
vtjnash committed Jul 30, 2013
commit 6feb249edce6850a4751b1bff6ae35d34e8d4ef7
30 changes: 22 additions & 8 deletions src/cgutils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,16 +48,30 @@ static Value *literal_pointer_val(void *p, Type *t)
#endif
}

static std::map<void*, Value*> jl_value_to_llvm;

DLLEXPORT extern "C" const char *jl_get_llvm_gv(jl_value_t *p)
{
std::map<void*, Value*>::iterator it;
it = jl_value_to_llvm.find(p);
if (it == jl_value_to_llvm.end())
return NULL;
return it->second->getName().data();
}

static Value *julia_to_gv(const char *cname, jl_value_t *addr)
{
const GlobalValue *gv = jl_ExecutionEngine->getGlobalValueAtAddress(addr);
if (gv != NULL)
return (Value*)gv;
gv = new GlobalVariable(*jl_Module, jl_value_llvmt,
false, GlobalVariable::ExternalLinkage, //TODO: can we determine is-const?
NULL, cname);
jl_ExecutionEngine->addGlobalMapping(gv,addr);
return (Value*)gv;
std::map<void*, Value*>::iterator it;
it = jl_value_to_llvm.find(addr);
if (it != jl_value_to_llvm.end())
return builder.CreateLoad(it->second);
GlobalValue *gv = new GlobalVariable(*jl_Module, jl_pvalue_llvmt,
false, GlobalVariable::ExternalLinkage,
ConstantPointerNull::get((PointerType*)jl_pvalue_llvmt), cname);
jl_value_t **p = (jl_value_t**)jl_ExecutionEngine->getPointerToGlobal(gv);
*p = addr;
jl_value_to_llvm[addr] = gv;
return builder.CreateLoad(gv);
}

static Value *julia_to_gv(jl_value_t *addr)
Expand Down
92 changes: 58 additions & 34 deletions src/dump.c
Original file line number Diff line number Diff line change
Expand Up @@ -350,49 +350,58 @@ static void jl_serialize_value_(ios_t *s, jl_value_t *v)
*(int64_t*)data >= S32_MIN && *(int64_t*)data <= S32_MAX) {
writetag(s, (jl_value_t*)SmallInt64_tag);
write_int32(s, (int32_t)*(int64_t*)data);
return;
}
if (t == jl_int32_type) {
else if (t == jl_int32_type) {
writetag(s, (jl_value_t*)Int32_tag);
write_int32(s, (int32_t)*(int32_t*)data);
return;
}
if ((jl_value_t*)t == jl_idtable_type)
writetag(s, (jl_value_t*)IdTable_tag);
else
writetag(s, (jl_value_t*)jl_datatype_type);
jl_serialize_value(s, t);
size_t nf = jl_tuple_len(t->names);
if (nf == 0 && jl_datatype_size(t)>0) {
if (t->name == jl_pointer_type->name) {
write_int32(s, 0);
else {
if ((jl_value_t*)t == jl_idtable_type)
writetag(s, (jl_value_t*)IdTable_tag);
else
writetag(s, (jl_value_t*)jl_datatype_type);
jl_serialize_value(s, t);
size_t nf = jl_tuple_len(t->names);
if (nf == 0 && jl_datatype_size(t)>0) {
if (t->name == jl_pointer_type->name) {
write_int32(s, 0);
#ifdef _P64
write_int32(s, 0);
write_int32(s, 0);
#endif
}
else {
ios_write(s, data, jl_datatype_size(t));
}
}
else {
ios_write(s, data, jl_datatype_size(t));
}
}
else {
if ((jl_value_t*)t == jl_idtable_type) {
jl_array_t *data = (jl_array_t*)jl_get_nth_field(v, 0);
jl_value_t **d = (jl_value_t**)data->data;
for(size_t i=0; i < jl_array_len(data); i+=2) {
if (d[i+1] != NULL) {
jl_serialize_value(s, d[i+1]);
jl_serialize_value(s, d[i]);
if ((jl_value_t*)t == jl_idtable_type) {
jl_array_t *data = (jl_array_t*)jl_get_nth_field(v, 0);
jl_value_t **d = (jl_value_t**)data->data;
for(size_t i=0; i < jl_array_len(data); i+=2) {
if (d[i+1] != NULL) {
jl_serialize_value(s, d[i+1]);
jl_serialize_value(s, d[i]);
}
}
jl_serialize_value(s, NULL);
}
jl_serialize_value(s, NULL);
}
else {
for(size_t i=0; i < nf; i++) {
jl_serialize_value(s, jl_get_nth_field(v, i));
else {
for(size_t i=0; i < nf; i++) {
jl_serialize_value(s, jl_get_nth_field(v, i));
}
}
}
}
}
const char *gvname = jl_get_llvm_gv(v);
if (gvname != NULL) {
int32_t gvname_len = strlen(gvname);
write_int32(s, gvname_len);
ios_write(s, gvname, gvname_len);
}
else {
write_int32(s, 0);
}
}

// --- deserialize ---
Expand Down Expand Up @@ -470,7 +479,8 @@ static jl_value_t *jl_deserialize_datatype(ios_t *s, int pos)
}

jl_array_t *jl_eqtable_put(jl_array_t *h, void *key, void *val);

#include <stdio.h>
static jl_value_t *jl_deserialize_value_(ios_t *s, int pos, jl_value_t *vtag);
static jl_value_t *jl_deserialize_value(ios_t *s)
{
int pos = ios_pos(s);
Expand All @@ -495,7 +505,24 @@ static jl_value_t *jl_deserialize_value(ios_t *s)
if (tag >= VALUE_TAGS) {
return vtag;
}

else if (vtag == (jl_value_t*)LiteralVal_tag) {
return jl_cellref(tree_literal_values, read_uint16(s));
}
jl_value_t *v = jl_deserialize_value_(s, pos, vtag);
int32_t gvname_len = read_int32(s);
if (gvname_len > 0) {
char *gvname = alloca(gvname_len+1);
memset(gvname, 0, gvname_len+1);
ios_read(s, gvname, gvname_len);
gvname[gvname_len] = 0;
const char *old = jl_get_llvm_gv(v);
if (!old || strcmp(old,gvname)) {
//*((jl_value_t**)jl_dlsym_e((uv_lib_t*)sysimg_handle, const_cast<char*>(cname))) = addr;
}
}
return v;
}
static jl_value_t *jl_deserialize_value_(ios_t *s, int pos, jl_value_t *vtag) {
int usetable = (tree_literal_values == NULL);

size_t i;
Expand Down Expand Up @@ -564,9 +591,6 @@ static jl_value_t *jl_deserialize_value(ios_t *s)
}
return (jl_value_t*)e;
}
else if (vtag == (jl_value_t*)LiteralVal_tag) {
return jl_cellref(tree_literal_values, read_uint16(s));
}
else if (vtag == (jl_value_t*)jl_tvar_type) {
jl_tvar_t *tv = (jl_tvar_t*)newobj((jl_value_t*)jl_tvar_type, 4);
if (usetable)
Expand Down
1 change: 1 addition & 0 deletions src/julia.h
Original file line number Diff line number Diff line change
Expand Up @@ -873,6 +873,7 @@ void jl_init_serializer(void);

DLLEXPORT void jl_save_system_image(char *fname);
DLLEXPORT void jl_restore_system_image(char *fname);
DLLEXPORT const char *jl_get_llvm_gv(jl_value_t *p);

// front end interface
DLLEXPORT jl_value_t *jl_parse_input_line(const char *str);
Expand Down