2019-11-02 17:53:15 -07:00
|
|
|
#pragma once
|
|
|
|
#include <llvm/IR/DerivedTypes.h>
|
|
|
|
#include <llvm/IR/Function.h>
|
|
|
|
#include <llvm/IR/LLVMContext.h>
|
|
|
|
#include <llvm/IR/IRBuilder.h>
|
|
|
|
#include <llvm/IR/Module.h>
|
|
|
|
#include <map>
|
|
|
|
|
2019-11-05 00:42:33 -08:00
|
|
|
struct llvm_context {
|
2019-11-06 12:52:42 -08:00
|
|
|
struct custom_function {
|
|
|
|
llvm::Function* function;
|
|
|
|
int32_t arity;
|
|
|
|
};
|
|
|
|
|
|
|
|
using custom_function_ptr = std::unique_ptr<custom_function>;
|
|
|
|
|
2019-11-02 17:53:15 -07:00
|
|
|
llvm::LLVMContext ctx;
|
|
|
|
llvm::IRBuilder<> builder;
|
|
|
|
llvm::Module module;
|
|
|
|
|
2019-11-06 12:52:42 -08:00
|
|
|
std::map<std::string, custom_function_ptr> custom_functions;
|
2019-11-02 17:53:15 -07:00
|
|
|
std::map<std::string, llvm::Function*> functions;
|
|
|
|
std::map<std::string, llvm::StructType*> struct_types;
|
|
|
|
|
|
|
|
llvm::StructType* stack_type;
|
2019-11-04 18:25:54 -08:00
|
|
|
llvm::PointerType* stack_ptr_type;
|
2019-11-02 17:53:15 -07:00
|
|
|
llvm::PointerType* node_ptr_type;
|
|
|
|
llvm::IntegerType* tag_type;
|
2019-11-05 00:42:33 -08:00
|
|
|
llvm::FunctionType* function_type;
|
2019-11-02 17:53:15 -07:00
|
|
|
|
2019-11-05 00:42:33 -08:00
|
|
|
llvm_context()
|
2019-11-02 17:53:15 -07:00
|
|
|
: builder(ctx), module("bloglang", ctx) {
|
|
|
|
create_types();
|
|
|
|
create_functions();
|
|
|
|
}
|
|
|
|
|
|
|
|
void create_types();
|
|
|
|
void create_functions();
|
2019-11-05 00:42:33 -08:00
|
|
|
|
2019-11-06 12:52:42 -08:00
|
|
|
llvm::ConstantInt* create_i8(int8_t);
|
|
|
|
llvm::ConstantInt* create_i32(int32_t);
|
|
|
|
llvm::ConstantInt* create_size(size_t);
|
2019-11-05 00:42:33 -08:00
|
|
|
|
|
|
|
llvm::Value* create_pop(llvm::Function*);
|
|
|
|
llvm::Value* create_peek(llvm::Function*, llvm::Value*);
|
|
|
|
void create_push(llvm::Function*, llvm::Value*);
|
|
|
|
void create_popn(llvm::Function*, llvm::Value*);
|
|
|
|
void create_update(llvm::Function*, llvm::Value*);
|
|
|
|
void create_pack(llvm::Function*, llvm::Value*, llvm::Value*);
|
|
|
|
void create_split(llvm::Function*, llvm::Value*);
|
|
|
|
void create_slide(llvm::Function*, llvm::Value*);
|
|
|
|
void create_alloc(llvm::Function*, llvm::Value*);
|
|
|
|
|
|
|
|
llvm::Value* create_eval(llvm::Value*);
|
|
|
|
|
|
|
|
llvm::Value* unwrap_num(llvm::Value*);
|
|
|
|
llvm::Value* create_num(llvm::Value*);
|
|
|
|
|
2019-11-06 12:52:42 -08:00
|
|
|
llvm::Value* unwrap_data_tag(llvm::Value*);
|
|
|
|
|
2019-11-05 00:42:33 -08:00
|
|
|
llvm::Value* create_global(llvm::Value*, llvm::Value*);
|
|
|
|
|
|
|
|
llvm::Value* create_app(llvm::Value*, llvm::Value*);
|
2019-11-06 12:52:42 -08:00
|
|
|
|
|
|
|
llvm::Function* create_custom_function(std::string name, int32_t arity);
|
2019-11-02 17:53:15 -07:00
|
|
|
};
|