Skip to content

Commit

Permalink
generate llvm global variables for most literal_pointer_val calls
Browse files Browse the repository at this point in the history
  • Loading branch information
vtjnash committed Jul 30, 2013
1 parent 1a17b64 commit c32820b
Show file tree
Hide file tree
Showing 5 changed files with 74 additions and 19 deletions.
2 changes: 1 addition & 1 deletion src/ccall.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -715,7 +715,7 @@ static Value *emit_ccall(jl_value_t **args, size_t nargs, jl_codectx_t *ctx)
builder.CreateCall2(jlputs_func,
builder.CreateGEP(stringConst(msg.str()),
ArrayRef<Value*>(zeros)),
literal_pointer_val(JL_STDERR));
literal_pointer_val(JL_STDERR,T_pint8));
}

// emit arguments
Expand Down
65 changes: 61 additions & 4 deletions src/cgutils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,14 +48,69 @@ static Value *literal_pointer_val(void *p, Type *t)
#endif
}

static Value *literal_pointer_val(jl_value_t *p)
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;
}

static Value *julia_to_gv(jl_value_t *addr)
{
return literal_pointer_val(p, jl_pvalue_llvmt);
return julia_to_gv("jl_global#", addr);
}

static Value *julia_to_gv(jl_sym_t *name, jl_module_t *mod, jl_value_t *addr) {
size_t len = strlen(name->name)+1;
jl_module_t *parent = mod, *prev = NULL;
while (parent != NULL && parent != prev) {
len += strlen(parent->name->name)+1;
prev = parent;
parent = parent->parent;
}
char *fullname = (char*)alloca(len);
len -= strlen(name->name)+1;
strcpy(fullname+len,name->name);
parent = mod;
prev = NULL;
while (parent != NULL && parent != prev) {
size_t part = strlen(parent->name->name)+1;
strcpy(fullname+len-part,parent->name->name);
fullname[len-1] = '.';
len -= part;
prev = parent;
parent = parent->parent;
}
return julia_to_gv(fullname, addr);
}
static Value *julia_to_gv(jl_datatype_t *addr) {
return julia_to_gv(addr->name->name, addr->name->module, (jl_value_t*)addr);
}
static Value *julia_to_gv(jl_lambda_info_t *linfo, jl_value_t *addr) {
if (linfo != NULL)
return julia_to_gv(linfo->name, linfo->module, addr);
return julia_to_gv(addr);
}
static Value *julia_to_gv(jl_function_t *addr) {
return julia_to_gv(addr->linfo, (jl_value_t*)addr);
}

static Value *literal_pointer_val(void *p)
static Value *literal_pointer_val(jl_value_t *p)
{
return literal_pointer_val(p, T_pint8);
if (p == NULL)
return literal_pointer_val((void*)NULL, jl_pvalue_llvmt);
if (jl_is_datatype(p))
return julia_to_gv((jl_datatype_t*)p);
if (jl_is_func(p))
return julia_to_gv((jl_function_t*)p);
if (jl_is_lambda_info(p))
return julia_to_gv((jl_lambda_info_t*)p, p);
return julia_to_gv(p);
}

// --- mapping between julia and llvm types ---
Expand Down Expand Up @@ -846,3 +901,5 @@ static void emit_cpointercheck(Value *x, const std::string &msg,
ctx->f->getBasicBlockList().push_back(passBB);
builder.SetInsertPoint(passBB);
}


22 changes: 11 additions & 11 deletions src/codegen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1373,8 +1373,8 @@ static Value *emit_known_call(jl_value_t *ff, jl_value_t **args, size_t nargs,
#else
builder.CreateStore(literal_pointer_val((jl_value_t*)jl_tuple_type),
emit_nthptr_addr(tup, (size_t)0));
builder.CreateStore(literal_pointer_val((jl_value_t*)nargs),
emit_nthptr_addr(tup, (size_t)1));
builder.CreateStore(ConstantInt::get(T_size, nargs),
builder.CreateBitCast(emit_nthptr_addr(tup, (size_t)1), T_psize));
#endif
#ifdef OVERLAP_TUPLE_LEN
size_t offs = 1;
Expand Down Expand Up @@ -1733,7 +1733,7 @@ static Value *global_binding_pointer(jl_module_t *m, jl_sym_t *s,
if (assign || b==NULL)
b = jl_get_binding_wr(m, s);
if (pbnd) *pbnd = b;
return literal_pointer_val(&b->value, jl_ppvalue_llvmt);
return emit_nthptr_addr(literal_pointer_val((jl_value_t*)b), offsetof(jl_binding_t,value)/sizeof(size_t));
}

// yields a jl_value_t** giving the binding location of a variable
Expand Down Expand Up @@ -1853,7 +1853,7 @@ static void emit_assignment(jl_value_t *l, jl_value_t *r, jl_codectx_t *ctx)
if (bnd) {
rval = boxed(emit_expr(r, ctx, true));
builder.CreateCall2(jlcheckassign_func,
literal_pointer_val((void*)bnd),
literal_pointer_val((jl_value_t*)bnd),
rval);
}
else {
Expand Down Expand Up @@ -1956,7 +1956,7 @@ static Value *emit_expr(jl_value_t *expr, jl_codectx_t *ctx, bool isboxed,
jl_binding_t *b = jl_get_binding(mod, var);
if (b == NULL)
b = jl_get_binding_wr(mod, var);
Value *bp = literal_pointer_val(&b->value, jl_ppvalue_llvmt);
Value *bp = emit_nthptr_addr(literal_pointer_val((jl_value_t*)b), offsetof(jl_binding_t,value)/sizeof(size_t));
if ((b->constp && b->value!=NULL) ||
(etype!=(jl_value_t*)jl_any_type &&
!jl_subtype((jl_value_t*)jl_undef_type, etype, 0))) {
Expand Down Expand Up @@ -2063,7 +2063,7 @@ static Value *emit_expr(jl_value_t *expr, jl_codectx_t *ctx, bool isboxed,
else {
if (is_global((jl_sym_t*)mn, ctx)) {
bnd = jl_get_binding_for_method_def(ctx->module, (jl_sym_t*)mn);
bp = literal_pointer_val(&bnd->value, jl_ppvalue_llvmt);
bp = emit_nthptr_addr(literal_pointer_val((jl_value_t*)bnd), offsetof(jl_binding_t,value)/sizeof(size_t));
}
else {
bp = var_binding_pointer((jl_sym_t*)mn, &bnd, false, ctx);
Expand All @@ -2075,7 +2075,7 @@ static Value *emit_expr(jl_value_t *expr, jl_codectx_t *ctx, bool isboxed,
make_gcroot(a2, ctx);
Value *a3 = boxed(emit_expr(args[3], ctx));
make_gcroot(a3, ctx);
Value *mdargs[6] = { name, bp, literal_pointer_val((void*)bnd),
Value *mdargs[6] = { name, bp, literal_pointer_val((jl_value_t*)bnd),
a1, a2, a3 };
ctx->argDepth = last_depth;
return builder.CreateCall(jlmethod_func, ArrayRef<Value*>(&mdargs[0], 6));
Expand All @@ -2086,7 +2086,7 @@ static Value *emit_expr(jl_value_t *expr, jl_codectx_t *ctx, bool isboxed,
(void)var_binding_pointer(sym, &bnd, true, ctx);
if (bnd) {
builder.CreateCall(jldeclareconst_func,
literal_pointer_val((void*)bnd));
literal_pointer_val((jl_value_t*)bnd));
}
}

Expand Down Expand Up @@ -3198,7 +3198,7 @@ static void init_julia_llvm_env(Module *m)
(void*)&jl_type_error_rt);

std::vector<Type *> args_2ptrs(0);
args_2ptrs.push_back(T_pint8);
args_2ptrs.push_back(jl_pvalue_llvmt);
args_2ptrs.push_back(jl_pvalue_llvmt);
jlcheckassign_func =
Function::Create(FunctionType::get(T_void, args_2ptrs, false),
Expand All @@ -3208,7 +3208,7 @@ static void init_julia_llvm_env(Module *m)
(void*)&jl_checked_assignment);

std::vector<Type *> args_1ptr(0);
args_1ptr.push_back(T_pint8);
args_1ptr.push_back(jl_pvalue_llvmt);
jldeclareconst_func =
Function::Create(FunctionType::get(T_void, args_1ptr, false),
Function::ExternalLinkage,
Expand Down Expand Up @@ -3251,7 +3251,7 @@ static void init_julia_llvm_env(Module *m)
std::vector<Type*> mdargs(0);
mdargs.push_back(jl_pvalue_llvmt);
mdargs.push_back(jl_ppvalue_llvmt);
mdargs.push_back(T_pint8);
mdargs.push_back(jl_pvalue_llvmt);
mdargs.push_back(jl_pvalue_llvmt);
mdargs.push_back(jl_pvalue_llvmt);
mdargs.push_back(jl_pvalue_llvmt);
Expand Down
3 changes: 1 addition & 2 deletions src/julia.h
Original file line number Diff line number Diff line change
Expand Up @@ -249,10 +249,9 @@ typedef struct {
} jl_weakref_t;

typedef struct {
// not first-class
JL_DATA_TYPE
jl_sym_t *name;
jl_value_t *value;
jl_value_t *type;

This comment has been minimized.

Copy link
@JeffBezanson

JeffBezanson Jul 30, 2013

Member

Why remove this? We will probably use it eventually.

This comment has been minimized.

Copy link
@JeffBezanson

JeffBezanson Jul 30, 2013

Member

To clarify, this field was supposed to be for storing a declared type for a global.

This comment has been minimized.

Copy link
@vtjnash

vtjnash Jul 30, 2013

Author Member

I was confused and thought the field was related to the type of the jl_binding_t, I'd already reverted this on my local copy

struct _jl_module_t *owner; // for individual imported bindings
unsigned constp:1;
unsigned exportp:1;
Expand Down
1 change: 0 additions & 1 deletion test/file.jl
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,6 @@ function test_monitor(slval)
close(fm)
end

# Commented out the tests below due to issues 3015, 3016 and 3020
test_timeout(0.1)
test_timeout(1)
test_touch(0.1)
Expand Down

0 comments on commit c32820b

Please sign in to comment.