Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
93388a3
Add code_generator.h
primenumber Dec 27, 2015
bf4598c
add declarations in header
primenumber Dec 29, 2015
6ca8663
add code_generator/statements.c
primenumber Dec 29, 2015
ae0d6d4
add code_generator/translation_unit.c
primenumber Dec 29, 2015
b5c4fd0
add parameter_type.c
primenumber Dec 29, 2015
33baf49
write build_block
primenumber Dec 29, 2015
68f951e
fix Makefile
primenumber Dec 29, 2015
fc3c975
move get_type and prototype declarations
primenumber Dec 29, 2015
e88361d
add header
primenumber Dec 29, 2015
43021f3
add header
primenumber Dec 29, 2015
6ccb665
fix code
primenumber Dec 29, 2015
222d70e
add prototype declaration
primenumber Dec 29, 2015
edbefa9
add expression.c
primenumber Dec 29, 2015
bdbf732
add parameter variable_set
primenumber Dec 29, 2015
3c0641b
add variable_set.*
primenumber Dec 29, 2015
3b419e3
rename function
primenumber Dec 29, 2015
a0117f8
fix for modified signature of build_block
primenumber Dec 29, 2015
fbbe734
add name.c
primenumber Dec 29, 2015
f54e92f
implement trivial build_expression_*
primenumber Dec 29, 2015
043a5cf
rename ParameterTypeRef to TypeVectorRef
primenumber Dec 29, 2015
60dcb98
declare ValueVectorRef
primenumber Dec 29, 2015
2e67ed8
rename ParameterTypeFunc to TypeVectorFunc
primenumber Dec 29, 2015
e631a0f
define ValueVectorFunc
primenumber Dec 29, 2015
e5f8d4c
rename ParameterTypeRef to TypeVectorRef
primenumber Dec 29, 2015
1a13a49
implement build_expression_function_call
primenumber Dec 29, 2015
f135aae
move point to define TypeVectorRef functions
primenumber Dec 29, 2015
4f7de1f
add value.c
primenumber Dec 29, 2015
8cbeafb
add get_arguments
primenumber Dec 29, 2015
b7bec65
fix for modified signature of get_arguments
primenumber Dec 29, 2015
3edac50
implement trivial build_expression_*
primenumber Dec 29, 2015
dffc26d
implement build_expression_integer_constant
primenumber Dec 29, 2015
63f407b
add header
primenumber Dec 29, 2015
c847e10
fix to return in build_expression_function_call_expression
primenumber Dec 29, 2015
ee9be4f
add prototype declaration fot get_variable_identifier
primenumber Dec 29, 2015
6ad5407
implement build_expression_identifier
primenumber Dec 29, 2015
7f918ef
implement get_type_declaration_specifier_list
primenumber Dec 29, 2015
e6ea3c8
use iterator
primenumber Dec 29, 2015
e21e897
use iterator
primenumber Dec 29, 2015
eb21889
use iterator
primenumber Dec 29, 2015
924f050
implement build_block_declaration
primenumber Dec 30, 2015
db6df18
use iterator
primenumber Dec 30, 2015
4412d66
rename build_block_type to build_block_with_type
primenumber Dec 30, 2015
2b56568
add pool.*
primenumber Dec 30, 2015
4b8a6ca
implement build_block_with_type
primenumber Dec 30, 2015
49abf5f
implement make_variable
primenumber Dec 30, 2015
d01c774
remove VariableRef, VariableSetRef
primenumber Dec 30, 2015
c30b511
move definition ValueVectorRef, TypeVectorRef
primenumber Dec 30, 2015
096749f
fix headers
primenumber Dec 30, 2015
62e3bc5
implement build_block_with_type_declarator{,_with_initializer}
primenumber Dec 30, 2015
4881c5e
implement make_value
primenumber Dec 30, 2015
391d5a8
implement get_type_with_type
primenumber Dec 31, 2015
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ AST_DIR := ast
AST_SRCS := $(wildcard $(AST_DIR)/*.c)
AST_OBJS := $(AST_SRCS:.c=.o)

CODEGEN_DIR := code_generator
CODEGEN_SRCS := $(wildcard $(CODEGEN_DIR)/*.c)
CODEGEN_OBJS := $(CODEGEN_SRCS:.c=.o)

LEX_SRC := lexer.l
LEX_INTERMEDIATE := lex.yy.c
LEX_TARGET := lex.yy.o
Expand All @@ -23,6 +27,7 @@ YACC := bison
YACC_OPTION := -d
TARGET := kmc89
OBJS += $(AST_OBJS)
OBJS += $(CODEGEN_OBJS)
OBJS += $(LEX_TARGET) $(YACC_TARGET)
CLEAN_OBJS += $(LEX_INTERMEDIATE) $(YACC_INTERMEDIATE)

Expand Down
24 changes: 24 additions & 0 deletions src/code_generator/code_generator.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#ifndef KMC_C89_COMPILER_CODE_GENERATOR_H
#define KMC_C89_COMPILER_CODE_GENERATOR_H

#include <llvm-c/Core.h>
#include "ast.h"
#include "ast/external_definitions.h"
#include "utility.h"
#include "vector.h"
#include "stdstring.h"
#include "variable_set.h"
#include "pool.h"

void translation_unit(LLVMModuleRef module, AstTranslationUnitRef translation_unit);
LLVMTypeRef get_type(AstRef ast);
LLVMTypeRef get_type_with_type(LLVMTypeRef base_type, AstRef ast);
TypeVectorRef get_parameter_types(AstRef ast);
LLVMTypeRef get_function_type(AstFunctionDefinitionRef function_definition);
AstTokenRef get_name(AstRef ast);
ValueVectorRef get_arguments(ValueVectorRef variable_set, AstArgumentExpressionListRef ast);
void build_block(LLVMModuleRef module, LLVMBuilderRef builder, ValueVectorRef variable_set, AstRef ast);
LLVMValueRef build_expression(LLVMModuleRef module, LLVMBuilderRef builder, ValueVectorRef variable_set, AstRef ast);
LLVMValueRef make_value(LLVMModuleRef module, LLVMBuilderRef builder, ValueVectorRef variable_set, LLVMTypeRef type, AstRef ast);

#endif /* KMC_C89_COMPILER_CODE_GENERATOR_H */
213 changes: 213 additions & 0 deletions src/code_generator/expression.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,213 @@
#include "code_generator.h"
#include "variable_set.h"
#include "ast/lexical_elements_impl.h"
#include "ast/expressions_impl.h"
#include "ast/is_method.h"
#include "ast/get_method.h"
#include "ast/ast_impl.h"

LLVMValueRef build_expression_expression(
LLVMModuleRef module, LLVMBuilderRef builder, ValueVectorRef variable_set,
AstExpressionRef expression) {
return build_expression(module, builder, variable_set, expression->expression);
}

LLVMValueRef build_expression_comma_expression(
LLVMModuleRef module, LLVMBuilderRef builder, ValueVectorRef variable_set,
AstCommaExpressionRef comma_expression) {
build_expression(module, builder, variable_set, comma_expression->expression);
return build_expression(module, builder, variable_set, comma_expression->expression);
}

LLVMValueRef build_expression_assignment_expression(
LLVMModuleRef module, LLVMBuilderRef builder, ValueVectorRef variable_set,
AstAssignmentExpressionRef expression) {
return build_expression(module, builder, variable_set, expression->expression);
}

LLVMValueRef build_expression_basic_assignment_expression(
LLVMModuleRef module, LLVMBuilderRef builder, ValueVectorRef variable_set,
AstBasicAssignmentExpressionRef expression) {
LLVMValueRef rhs = build_expression(module, builder, variable_set, expression->assignment);
return LLVMBuildStore(builder, rhs, get_variable(variable_set, expression->unary));
}

LLVMValueRef build_expression_conditional_expression(
LLVMModuleRef module, LLVMBuilderRef builder, ValueVectorRef variable_set,
AstConditionalExpressionRef expression) {
return build_expression(module, builder, variable_set, expression->expression);
}

LLVMValueRef build_expression_logical_or_expression(
LLVMModuleRef module, LLVMBuilderRef builder, ValueVectorRef variable_set,
AstLogicalOrExpressionRef expression) {
return build_expression(module, builder, variable_set, expression->expression);
}

LLVMValueRef build_expression_logical_and_expression(
LLVMModuleRef module, LLVMBuilderRef builder, ValueVectorRef variable_set,
AstLogicalAndExpressionRef expression) {
return build_expression(module, builder, variable_set, expression->expression);
}

LLVMValueRef build_expression_bitwise_or_expression(
LLVMModuleRef module, LLVMBuilderRef builder, ValueVectorRef variable_set,
AstBitwiseOrExpressionRef expression) {
return build_expression(module, builder, variable_set, expression->expression);
}

LLVMValueRef build_expression_bitwise_xor_expression(
LLVMModuleRef module, LLVMBuilderRef builder, ValueVectorRef variable_set,
AstBitwiseXorExpressionRef expression) {
return build_expression(module, builder, variable_set, expression->expression);
}

LLVMValueRef build_expression_bitwise_and_expression(
LLVMModuleRef module, LLVMBuilderRef builder, ValueVectorRef variable_set,
AstBitwiseAndExpressionRef expression) {
return build_expression(module, builder, variable_set, expression->expression);
}

LLVMValueRef build_expression_equality_expression(
LLVMModuleRef module, LLVMBuilderRef builder, ValueVectorRef variable_set,
AstEqualityExpressionRef expression) {
return build_expression(module, builder, variable_set, expression->expression);
}

LLVMValueRef build_expression_relarional_expression(
LLVMModuleRef module, LLVMBuilderRef builder, ValueVectorRef variable_set,
AstRelationalExpressionRef expression) {
return build_expression(module, builder, variable_set, expression->expression);
}

LLVMValueRef build_expression_shift_expression(
LLVMModuleRef module, LLVMBuilderRef builder, ValueVectorRef variable_set,
AstShiftExpressionRef expression) {
return build_expression(module, builder, variable_set, expression->expression);
}

LLVMValueRef build_expression_additive_expression(
LLVMModuleRef module, LLVMBuilderRef builder, ValueVectorRef variable_set,
AstAdditiveExpressionRef expression) {
return build_expression(module, builder, variable_set, expression->expression);
}

LLVMValueRef build_expression_multiplicative_expression(
LLVMModuleRef module, LLVMBuilderRef builder, ValueVectorRef variable_set,
AstMultiplicativeExpressionRef expression) {
return build_expression(module, builder, variable_set, expression->expression);
}

LLVMValueRef build_expression_cast_expression(
LLVMModuleRef module, LLVMBuilderRef builder, ValueVectorRef variable_set,
AstCastExpressionRef cast) {
return build_expression(module, builder, variable_set, cast->cast);
}

LLVMValueRef build_expression_unary_expression(
LLVMModuleRef module, LLVMBuilderRef builder, ValueVectorRef variable_set,
AstUnaryExpressionRef unary) {
return build_expression(module, builder, variable_set, unary->unary);
}

LLVMValueRef build_expression_function_call_expression(
LLVMModuleRef module, LLVMBuilderRef builder, ValueVectorRef variable_set,
AstFunctionCallExpressionRef function_call) {
AstTokenRef function_name = get_name(function_call->function);
LLVMValueRef function = LLVMGetNamedFunction(module, string_data(function_name));
LLVMTypeRef function_type = LLVMGetElementType(LLVMTypeOf(function));
int parameter_count = LLVMCountParamTypes(function_type);
ValueVectorRef argument_vec =
get_arguments(
variable_set,
ast_get_argument_expression_list(function_call->argument_list));
int argument_count = ValueVectorFunc(size)(argument_vec);
if (parameter_count != argument_count) return NULL;
return LLVMBuildCall(builder, function, ValueVectorFunc(data)(argument_vec),
ValueVectorFunc(size)(argument_vec), string_data(function_name));
}

LLVMValueRef build_expression_postfix_expression(
LLVMModuleRef module, LLVMBuilderRef builder, ValueVectorRef variable_set,
AstPostfixExpressionRef postfix) {
return build_expression(module, builder, variable_set, postfix->postfix);
}

LLVMValueRef build_expression_primary_expression(
LLVMModuleRef module, LLVMBuilderRef builder, ValueVectorRef variable_set,
AstPrimaryExpressionRef primary) {
return build_expression(module, builder, variable_set, primary->primary_expression);
}

LLVMValueRef build_expression_constant(
LLVMModuleRef module, LLVMBuilderRef builder, ValueVectorRef variable_set,
AstConstantRef constant) {
return build_expression(module, builder, variable_set, constant->constant);
}

LLVMValueRef build_expression_integer_constant(
LLVMModuleRef module, LLVMBuilderRef builder, ValueVectorRef variable_set,
AstIntegerConstantRef constant) {
return LLVMConstIntOfString(
LLVMInt32Type(), string_data(ast_get_token(constant->token)), 10);
}

LLVMValueRef build_expression_identifier(
LLVMModuleRef module, LLVMBuilderRef builder, ValueVectorRef variable_set,
AstIdentifierRef identifier) {
return get_variable_identifier(variable_set, identifier);
}

LLVMValueRef build_expression(
LLVMModuleRef module, LLVMBuilderRef builder, ValueVectorRef variable_set, AstRef ast) {
switch (ast->tag) {
case AST_EXPRESSION:
return build_expression_expression(module, builder, variable_set, ast_get_expression(ast));
case AST_COMMA_EXPRESSION:
return build_expression_comma_expression(module, builder, variable_set, ast_get_comma_expression(ast));
case AST_ASSIGNMENT_EXPRESSION:
return build_expression_assignment_expression(module, builder, variable_set, ast_get_assignment_expression(ast));
case AST_BASIC_ASSIGNMENT_EXPRESSION:
return build_expression_basic_assignment_expression(module, builder, variable_set, ast_get_basic_assignment_expression(ast));
case AST_CONDITIONAL_EXPRESSION:
return build_expression_conditional_expression(module, builder, variable_set, ast_get_conditional_expression(ast));
case AST_LOGICAL_OR_EXPRESSION:
return build_expression_logical_or_expression(module, builder, variable_set, ast_get_logical_or_expression(ast));
case AST_LOGICAL_AND_EXPRESSION:
return build_expression_logical_and_expression(module, builder, variable_set, ast_get_logical_and_expression(ast));
case AST_BITWISE_OR_EXPRESSION:
return build_expression_bitwise_or_expression(module, builder, variable_set, ast_get_bitwise_or_expression(ast));
case AST_BITWISE_XOR_EXPRESSION:
return build_expression_bitwise_xor_expression(module, builder, variable_set, ast_get_bitwise_xor_expression(ast));
case AST_BITWISE_AND_EXPRESSION:
return build_expression_bitwise_and_expression(module, builder, variable_set, ast_get_bitwise_and_expression(ast));
case AST_EQUALITY_EXPRESSION:
return build_expression_equality_expression(module, builder, variable_set, ast_get_equality_expression(ast));
case AST_RELATIONAL_EXPRESSION:
return build_expression_relarional_expression(module, builder, variable_set, ast_get_relational_expression(ast));
case AST_SHIFT_EXPRESSION:
return build_expression_shift_expression(module, builder, variable_set, ast_get_shift_expression(ast));
case AST_ADDITIVE_EXPRESSION:
return build_expression_additive_expression(module, builder, variable_set, ast_get_additive_expression(ast));
case AST_MULTIPLICATIVE_EXPRESSION:
return build_expression_multiplicative_expression(module, builder, variable_set, ast_get_multiplicative_expression(ast));
case AST_CAST_EXPRESSION:
return build_expression_cast_expression(module, builder, variable_set, ast_get_cast_expression(ast));
case AST_UNARY_EXPRESSION:
return build_expression_unary_expression(module, builder, variable_set, ast_get_unary_expression(ast));
case AST_POSTFIX_EXPRESSION:
return build_expression_postfix_expression(module, builder, variable_set, ast_get_postfix_expression(ast));
case AST_FUNCTION_CALL_EXPRESSION:
return build_expression_function_call_expression(module, builder, variable_set, ast_get_function_call_expression(ast));
case AST_PRIMARY_EXPRESSION:
return build_expression_primary_expression(module, builder, variable_set, ast_get_primary_expression(ast));
case AST_CONSTANT:
return build_expression_constant(module, builder, variable_set, ast_get_constant(ast));
case AST_INTEGER_CONSTANT:
return build_expression_integer_constant(module, builder, variable_set, ast_get_integer_constant(ast));
case AST_IDENTIFIER:
return build_expression_identifier(module, builder, variable_set, ast_get_identifier(ast));
default:;
}
return NULL;
}
38 changes: 38 additions & 0 deletions src/code_generator/name.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
#include "code_generator.h"
#include "stdstring.h"
#include "ast/lexical_elements_impl.h"
#include "ast/expressions_impl.h"
#include "ast/is_method.h"
#include "ast/get_method.h"
#include "ast/ast_impl.h"

AstTokenRef get_name_identifier(AstIdentifierRef identifier) {
return ast_get_token(identifier->token);
}

AstTokenRef get_name_primary_expression(AstPrimaryExpressionRef primary) {
return get_name(primary->primary_expression);
}

AstTokenRef get_name_postfix_expression(AstPostfixExpressionRef postfix) {
return get_name(postfix->postfix);
}

AstTokenRef get_name_unary_expression(AstUnaryExpressionRef unary) {
return get_name(unary->unary);
}

AstTokenRef get_name(AstRef ast) {
switch (ast->tag) {
case AST_IDENTIFIER:
return get_name_identifier(ast_get_identifier(ast));
case AST_PRIMARY_EXPRESSION:
return get_name_primary_expression(ast_get_primary_expression(ast));
case AST_POSTFIX_EXPRESSION:
return get_name_postfix_expression(ast_get_postfix_expression(ast));
case AST_UNARY_EXPRESSION:
return get_name_unary_expression(ast_get_unary_expression(ast));
default:
return NULL;
}
}
58 changes: 58 additions & 0 deletions src/code_generator/parameter_type.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
#include "code_generator.h"
#include "ast/declarations_impl.h"
#include "ast/is_method.h"
#include "ast/get_method.h"
#include "ast/ast_impl.h"

TypeVectorRef get_parameter_types_declarator(AstDeclaratorRef declarator) {
return get_parameter_types(declarator->direct_declarator);
}

TypeVectorRef get_parameter_types_direct_declarator(AstDirectDeclaratorRef direct_declarator) {
return get_parameter_types(direct_declarator->direct_declarator);
}

TypeVectorRef get_parameter_types_function_declarator(AstFunctionDeclaratorRef function_declarator) {
return get_parameter_types(function_declarator->parameter_type_list);
}

TypeVectorRef get_parameter_types_parameter_type_list(AstParameterTypeListRef parameter_type_list) {
return get_parameter_types(parameter_type_list->parameter_type_list);
}

TypeVectorRef get_parameter_types_parameter_list(AstParameterListRef parameter_list) {
AstVectorRef parameter_vector = parameter_list->parameter_declaration_vector;
TypeVectorRef parameter_types = TypeVectorFunc(ctor)(NULL);
int i;
for (i = 0; i < (int)AST_VECTOR_FUNC(size)(parameter_vector); i++) {
AstParameterDeclarationRef parameter_declaration =
ast_get_parameter_declaration(AST_VECTOR_FUNC(at)(parameter_vector, i));
if (ast_is_parameter_concrete_declaration(
parameter_declaration->parameter_declaration)) {
AstParameterConcreteDeclarationRef parameter_concrete_declaration =
ast_get_parameter_concrete_declaration(parameter_declaration->parameter_declaration);
TypeVectorFunc(push_back)(parameter_types,
get_type(parameter_concrete_declaration->declaration_specifier_list));
} else {
return NULL;
}
}
return parameter_types;
}

TypeVectorRef get_parameter_types(AstRef ast) {
switch (ast->tag) {
case AST_DECLARATOR:
return get_parameter_types_declarator(ast_get_declarator(ast));
case AST_DIRECT_DECLARATOR:
return get_parameter_types_direct_declarator(ast_get_direct_declarator(ast));
case AST_FUNCTION_DECLARATOR:
return get_parameter_types_function_declarator(ast_get_function_declarator(ast));
case AST_PARAMETER_TYPE_LIST:
return get_parameter_types_parameter_type_list(ast_get_parameter_type_list(ast));
case AST_PARAMETER_LIST:
return get_parameter_types_parameter_list(ast_get_parameter_list(ast));
default:
return NULL;
}
}
21 changes: 21 additions & 0 deletions src/code_generator/pool.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#include "pool.h"
#include "vector_impl.h"
#include <assert.h>

static MemoryPoolRef g_codegen_pool = NULL;

void codegen_pool_ctor(void) {
assert(!g_codegen_pool);
g_codegen_pool = memory_pool_ctor(CODEGEN_POOL_CHUNK_SIZE);
}

void codegen_pool_dtor(void) {
memory_pool_dtor(&g_codegen_pool);
}

MemoryPoolRef codegen_pool(void) {
return g_codegen_pool;
}

DEFINE_VECTOR(LLVMTypeRef)
DEFINE_VECTOR(LLVMValueRef)
Loading