89 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include "llvm_context.hpp"
 | |
| #include <llvm/IR/DerivedTypes.h>
 | |
| 
 | |
| using namespace llvm;
 | |
| 
 | |
| void llvm_state::create_types() {
 | |
|     stack_type = StructType::create(ctx, "stack");
 | |
|     stack_ptr_type = PointerType::getUnqual(stack_type);
 | |
|     tag_type = IntegerType::getInt8Ty(ctx);
 | |
|     struct_types["node_base"] = StructType::create(ctx, "node_base");
 | |
|     struct_types["node_app"] = StructType::create(ctx, "node_app");
 | |
|     struct_types["node_num"] = StructType::create(ctx, "node_num");
 | |
|     struct_types["node_global"] = StructType::create(ctx, "node_global");
 | |
|     struct_types["node_ind"] = StructType::create(ctx, "node_ind");
 | |
|     struct_types["node_data"] = StructType::create(ctx, "node_data");
 | |
|     node_ptr_type = PointerType::getUnqual(struct_types.at("node_base"));
 | |
| }
 | |
| 
 | |
| void llvm_state::create_functions() {
 | |
|     auto void_type = Type::getVoidTy(ctx);
 | |
|     auto sizet_type = IntegerType::getInt64Ty(ctx);
 | |
|     functions["stack_init"] = Function::Create(
 | |
|             FunctionType::get(void_type, { stack_ptr_type }, false),
 | |
|             Function::LinkageTypes::ExternalLinkage,
 | |
|             "stack_init",
 | |
|             &module
 | |
|     );
 | |
|     functions["stack_free"] = Function::Create(
 | |
|             FunctionType::get(void_type, { stack_ptr_type }, false),
 | |
|             Function::LinkageTypes::ExternalLinkage,
 | |
|             "stack_free",
 | |
|             &module
 | |
|     );
 | |
|     functions["stack_push"] = Function::Create(
 | |
|             FunctionType::get(void_type, { stack_ptr_type, node_ptr_type }, false),
 | |
|             Function::LinkageTypes::ExternalLinkage,
 | |
|             "stack_push",
 | |
|             &module
 | |
|     );
 | |
|     functions["stack_pop"] = Function::Create(
 | |
|             FunctionType::get(node_ptr_type, { stack_ptr_type }, false),
 | |
|             Function::LinkageTypes::ExternalLinkage,
 | |
|             "stack_push",
 | |
|             &module
 | |
|     );
 | |
|     functions["stack_peek"] = Function::Create(
 | |
|             FunctionType::get(node_ptr_type, { stack_ptr_type, sizet_type }, false),
 | |
|             Function::LinkageTypes::ExternalLinkage,
 | |
|             "stack_push",
 | |
|             &module
 | |
|     );
 | |
|     functions["stack_popn"] = Function::Create(
 | |
|             FunctionType::get(void_type, { stack_ptr_type, sizet_type }, false),
 | |
|             Function::LinkageTypes::ExternalLinkage,
 | |
|             "stack_push",
 | |
|             &module
 | |
|     );
 | |
|     functions["stack_slide"] = Function::Create(
 | |
|             FunctionType::get(void_type, { stack_ptr_type, sizet_type }, false),
 | |
|             Function::LinkageTypes::ExternalLinkage,
 | |
|             "stack_push",
 | |
|             &module
 | |
|     );
 | |
|     functions["stack_update"] = Function::Create(
 | |
|             FunctionType::get(void_type, { stack_ptr_type, sizet_type }, false),
 | |
|             Function::LinkageTypes::ExternalLinkage,
 | |
|             "stack_push",
 | |
|             &module
 | |
|     );
 | |
|     functions["stack_alloc"] = Function::Create(
 | |
|             FunctionType::get(void_type, { stack_ptr_type, sizet_type }, false),
 | |
|             Function::LinkageTypes::ExternalLinkage,
 | |
|             "stack_push",
 | |
|             &module
 | |
|     );
 | |
|     functions["stack_pack"] = Function::Create(
 | |
|             FunctionType::get(void_type, { stack_ptr_type, sizet_type, tag_type }, false),
 | |
|             Function::LinkageTypes::ExternalLinkage,
 | |
|             "stack_push",
 | |
|             &module
 | |
|     );
 | |
|     functions["stack_split"] = Function::Create(
 | |
|             FunctionType::get(node_ptr_type, { stack_ptr_type, sizet_type }, false),
 | |
|             Function::LinkageTypes::ExternalLinkage,
 | |
|             "stack_push",
 | |
|             &module
 | |
|     );
 | |
| }
 |