Start work on chapter 8 code for compilers

This commit is contained in:
Danila Fedorin 2019-11-02 17:53:15 -07:00
parent 67ddba8fc4
commit 6737f57a3d
3 changed files with 60 additions and 0 deletions

View File

@ -1,8 +1,12 @@
cmake_minimum_required(VERSION 3.1) cmake_minimum_required(VERSION 3.1)
project(compiler) project(compiler)
# Find all the required packages
find_package(BISON) find_package(BISON)
find_package(FLEX) find_package(FLEX)
find_package(LLVM REQUIRED CONFIG)
# Set up the flex and bison targets
bison_target(parser bison_target(parser
${CMAKE_CURRENT_SOURCE_DIR}/parser.y ${CMAKE_CURRENT_SOURCE_DIR}/parser.y
${CMAKE_CURRENT_BINARY_DIR}/parser.cpp ${CMAKE_CURRENT_BINARY_DIR}/parser.cpp
@ -12,6 +16,10 @@ flex_target(scanner
${CMAKE_CURRENT_BINARY_DIR}/scanner.cpp) ${CMAKE_CURRENT_BINARY_DIR}/scanner.cpp)
add_flex_bison_dependency(scanner parser) add_flex_bison_dependency(scanner parser)
# Find all the relevant LLVM components
llvm_map_components_to_libnames(LLVM_LIBS core x86asmparser x86codegen)
# Create compiler executable
add_executable(compiler add_executable(compiler
ast.cpp ast.hpp definition.cpp ast.cpp ast.hpp definition.cpp
type_env.cpp type_env.hpp type_env.cpp type_env.hpp
@ -24,5 +32,10 @@ add_executable(compiler
${FLEX_scanner_OUTPUTS} ${FLEX_scanner_OUTPUTS}
main.cpp main.cpp
) )
# Configure compiler executable
target_include_directories(compiler PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) target_include_directories(compiler PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
target_include_directories(compiler PUBLIC ${CMAKE_CURRENT_BINARY_DIR}) target_include_directories(compiler PUBLIC ${CMAKE_CURRENT_BINARY_DIR})
target_include_directories(compiler PUBLIC ${LLVM_DEFINITIONS})
target_compile_definitions(compiler PUBLIC ${LLVM_DEFINITIONS})
target_link_libraries(compiler ${LLVM_LIBS})

18
08/llvm_context.cpp Normal file
View File

@ -0,0 +1,18 @@
#include "llvm_context.hpp"
#include <llvm/IR/DerivedTypes.h>
void llvm_state::create_types() {
stack_type = llvm::StructType::create(ctx, "stack");
tag_type = llvm::IntegerType::getInt8Ty(ctx);
struct_types["node_base"] = llvm::StructType::create(ctx, "node_base");
struct_types["node_app"] = llvm::StructType::create(ctx, "node_app");
struct_types["node_num"] = llvm::StructType::create(ctx, "node_num");
struct_types["node_global"] = llvm::StructType::create(ctx, "node_global");
struct_types["node_ind"] = llvm::StructType::create(ctx, "node_ind");
struct_types["node_data"] = llvm::StructType::create(ctx, "node_data");
node_ptr_type = llvm::PointerType::getUnqual(struct_types.at("node_base"));
}
void llvm_state::create_functions() {
}

29
08/llvm_context.hpp Normal file
View File

@ -0,0 +1,29 @@
#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>
struct llvm_state {
llvm::LLVMContext ctx;
llvm::IRBuilder<> builder;
llvm::Module module;
std::map<std::string, llvm::Function*> functions;
std::map<std::string, llvm::StructType*> struct_types;
llvm::StructType* stack_type;
llvm::PointerType* node_ptr_type;
llvm::IntegerType* tag_type;
llvm_state()
: builder(ctx), module("bloglang", ctx) {
create_types();
create_functions();
}
void create_types();
void create_functions();
};