Implement function and type creation, add text to blog in compiler series
This commit is contained in:
parent
70793d6ac3
commit
c44128315d
|
@ -22,6 +22,7 @@ llvm_map_components_to_libnames(LLVM_LIBS core x86asmparser x86codegen)
|
||||||
# Create compiler executable
|
# Create compiler executable
|
||||||
add_executable(compiler
|
add_executable(compiler
|
||||||
ast.cpp ast.hpp definition.cpp
|
ast.cpp ast.hpp definition.cpp
|
||||||
|
llvm_context.cpp llvm_context.hpp
|
||||||
type_env.cpp type_env.hpp
|
type_env.cpp type_env.hpp
|
||||||
env.cpp env.hpp
|
env.cpp env.hpp
|
||||||
type.cpp type.hpp
|
type.cpp type.hpp
|
||||||
|
|
|
@ -1,18 +1,88 @@
|
||||||
#include "llvm_context.hpp"
|
#include "llvm_context.hpp"
|
||||||
#include <llvm/IR/DerivedTypes.h>
|
#include <llvm/IR/DerivedTypes.h>
|
||||||
|
|
||||||
|
using namespace llvm;
|
||||||
|
|
||||||
void llvm_state::create_types() {
|
void llvm_state::create_types() {
|
||||||
stack_type = llvm::StructType::create(ctx, "stack");
|
stack_type = StructType::create(ctx, "stack");
|
||||||
tag_type = llvm::IntegerType::getInt8Ty(ctx);
|
stack_ptr_type = PointerType::getUnqual(stack_type);
|
||||||
struct_types["node_base"] = llvm::StructType::create(ctx, "node_base");
|
tag_type = IntegerType::getInt8Ty(ctx);
|
||||||
struct_types["node_app"] = llvm::StructType::create(ctx, "node_app");
|
struct_types["node_base"] = StructType::create(ctx, "node_base");
|
||||||
struct_types["node_num"] = llvm::StructType::create(ctx, "node_num");
|
struct_types["node_app"] = StructType::create(ctx, "node_app");
|
||||||
struct_types["node_global"] = llvm::StructType::create(ctx, "node_global");
|
struct_types["node_num"] = StructType::create(ctx, "node_num");
|
||||||
struct_types["node_ind"] = llvm::StructType::create(ctx, "node_ind");
|
struct_types["node_global"] = StructType::create(ctx, "node_global");
|
||||||
struct_types["node_data"] = llvm::StructType::create(ctx, "node_data");
|
struct_types["node_ind"] = StructType::create(ctx, "node_ind");
|
||||||
node_ptr_type = llvm::PointerType::getUnqual(struct_types.at("node_base"));
|
struct_types["node_data"] = StructType::create(ctx, "node_data");
|
||||||
|
node_ptr_type = PointerType::getUnqual(struct_types.at("node_base"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void llvm_state::create_functions() {
|
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
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,7 @@ struct llvm_state {
|
||||||
std::map<std::string, llvm::StructType*> struct_types;
|
std::map<std::string, llvm::StructType*> struct_types;
|
||||||
|
|
||||||
llvm::StructType* stack_type;
|
llvm::StructType* stack_type;
|
||||||
|
llvm::PointerType* stack_ptr_type;
|
||||||
llvm::PointerType* node_ptr_type;
|
llvm::PointerType* node_ptr_type;
|
||||||
llvm::IntegerType* tag_type;
|
llvm::IntegerType* tag_type;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user