Add support for data types.
This commit is contained in:
@@ -110,7 +110,6 @@ namespace lily {
|
||||
llvm::Value* stack = ctx.get_current_function()->arg_begin();
|
||||
llvm::Value* new_node = builder.CreateCall(malloc_node_global_func,
|
||||
{ get_int8_constant(ctx.get_supercombinator_arity(name)), ctx.get_supercombinator_function(name) }, "temp");
|
||||
// TODO get arity
|
||||
builder.CreateCall(stack_push_func, { stack, new_node });
|
||||
}
|
||||
|
||||
@@ -177,14 +176,41 @@ namespace lily {
|
||||
}
|
||||
|
||||
void instruction_pack::gen_llvm(llvm_context& ctx) {
|
||||
|
||||
llvm::Value* stack = ctx.get_current_function()->arg_begin();
|
||||
llvm::Value* packed = builder.CreateCall(pack_func, { stack, get_int8_constant(constructor), get_int32_constant(arity) }, "temp");
|
||||
builder.CreateCall(stack_push_func, { stack, packed });
|
||||
}
|
||||
|
||||
void instruction_split::gen_llvm(llvm_context& ctx) {
|
||||
|
||||
llvm::Value* stack = ctx.get_current_function()->arg_begin();
|
||||
llvm::Value* popped = builder.CreateCall(stack_pop_func, { stack }, "temp");
|
||||
builder.CreateCall(split_func, { stack, popped, get_int32_constant(arity) });
|
||||
}
|
||||
|
||||
void instruction_jump::gen_llvm(llvm_context& ctx) {
|
||||
|
||||
llvm::Value* stack = ctx.get_current_function()->arg_begin();
|
||||
llvm::BasicBlock* safety_block = llvm::BasicBlock::Create(context, "safety", ctx.get_current_function());
|
||||
llvm::Value* top = builder.CreateCall(stack_peek_func, { stack, get_int32_constant(0) }, "temp");
|
||||
llvm::Value* top_data = builder.CreatePointerCast(top, llvm::PointerType::getUnqual(node_data_type), "temp");
|
||||
llvm::Value* top_data_tag_ptr = builder.CreateGEP(top_data, { get_int32_constant(0), get_int32_constant(1) }, "temp");
|
||||
llvm::Value* top_data_tag = builder.CreateLoad(top_data_tag_ptr, "temp");
|
||||
llvm::SwitchInst* swtch = builder.CreateSwitch(top_data_tag, safety_block);
|
||||
|
||||
std::vector<llvm::BasicBlock*> blocks;
|
||||
for(auto& branch : instructions) {
|
||||
llvm::BasicBlock* new_block = llvm::BasicBlock::Create(context, "branch", ctx.get_current_function());
|
||||
builder.SetInsertPoint(new_block);
|
||||
for(auto& i : branch) {
|
||||
i->gen_llvm(ctx);
|
||||
}
|
||||
builder.CreateBr(safety_block);
|
||||
blocks.push_back(new_block);
|
||||
}
|
||||
|
||||
for(auto& pair : const_instructions) {
|
||||
swtch->addCase(get_int8_constant(pair.first), blocks[pair.second]);
|
||||
}
|
||||
|
||||
builder.SetInsertPoint(safety_block);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user