From 3b24d67e09ffbfd3ab5ea959db3e4df24d0415c0 Mon Sep 17 00:00:00 2001 From: hatsusato Date: Mon, 13 Jun 2016 02:01:19 +0900 Subject: [PATCH 01/11] Add symbol_table files --- src/code_generator/symbol_table.c | 1 + src/code_generator/symbol_table.h | 4 ++++ src/code_generator/symbol_table_impl.h | 4 ++++ 3 files changed, 9 insertions(+) create mode 100644 src/code_generator/symbol_table.c create mode 100644 src/code_generator/symbol_table.h create mode 100644 src/code_generator/symbol_table_impl.h diff --git a/src/code_generator/symbol_table.c b/src/code_generator/symbol_table.c new file mode 100644 index 00000000..05d7d9e8 --- /dev/null +++ b/src/code_generator/symbol_table.c @@ -0,0 +1 @@ +#include "code_generator/symbol_table.h" diff --git a/src/code_generator/symbol_table.h b/src/code_generator/symbol_table.h new file mode 100644 index 00000000..7acdba8b --- /dev/null +++ b/src/code_generator/symbol_table.h @@ -0,0 +1,4 @@ +#ifndef KMC_C90_COMPILER_CODE_GENERATOR_SYMBOL_TABLE_H +#define KMC_C90_COMPILER_CODE_GENERATOR_SYMBOL_TABLE_H + +#endif /* KMC_C90_COMPILER_CODE_GENERATOR_SYMBOL_TABLE_H */ diff --git a/src/code_generator/symbol_table_impl.h b/src/code_generator/symbol_table_impl.h new file mode 100644 index 00000000..2a5c4332 --- /dev/null +++ b/src/code_generator/symbol_table_impl.h @@ -0,0 +1,4 @@ +#ifndef KMC_C90_COMPILER_CODE_GENERATOR_SYMBOL_TABLE_IMPL_H +#define KMC_C90_COMPILER_CODE_GENERATOR_SYMBOL_TABLE_IMPL_H + +#endif /* KMC_C90_COMPILER_CODE_GENERATOR_SYMBOL_TABLE_IMPL_H */ From f6176b8b601b342ca4a3c06de923c4e78aa8460a Mon Sep 17 00:00:00 2001 From: hatsusato Date: Fri, 17 Jun 2016 10:40:44 +0900 Subject: [PATCH 02/11] Add struct SymbolInfo --- src/code_generator/symbol_table.h | 2 ++ src/code_generator/symbol_table_impl.h | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/src/code_generator/symbol_table.h b/src/code_generator/symbol_table.h index 7acdba8b..2beb8869 100644 --- a/src/code_generator/symbol_table.h +++ b/src/code_generator/symbol_table.h @@ -1,4 +1,6 @@ #ifndef KMC_C90_COMPILER_CODE_GENERATOR_SYMBOL_TABLE_H #define KMC_C90_COMPILER_CODE_GENERATOR_SYMBOL_TABLE_H +typedef struct SymbolInfo* SymbolInfoRef; + #endif /* KMC_C90_COMPILER_CODE_GENERATOR_SYMBOL_TABLE_H */ diff --git a/src/code_generator/symbol_table_impl.h b/src/code_generator/symbol_table_impl.h index 2a5c4332..a394e77a 100644 --- a/src/code_generator/symbol_table_impl.h +++ b/src/code_generator/symbol_table_impl.h @@ -1,4 +1,10 @@ #ifndef KMC_C90_COMPILER_CODE_GENERATOR_SYMBOL_TABLE_IMPL_H #define KMC_C90_COMPILER_CODE_GENERATOR_SYMBOL_TABLE_IMPL_H +struct SymbolInfo { + StringRef name; + LLVMTypeRef type; + LLVMValueRef value; +}; + #endif /* KMC_C90_COMPILER_CODE_GENERATOR_SYMBOL_TABLE_IMPL_H */ From df87309ad91c5917c43cd8030a12c90ac84c0b18 Mon Sep 17 00:00:00 2001 From: hatsusato Date: Fri, 17 Jun 2016 10:49:33 +0900 Subject: [PATCH 03/11] Add struct SymbolBlock --- src/code_generator/symbol_table.h | 1 + src/code_generator/symbol_table_impl.h | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/src/code_generator/symbol_table.h b/src/code_generator/symbol_table.h index 2beb8869..0bc5566c 100644 --- a/src/code_generator/symbol_table.h +++ b/src/code_generator/symbol_table.h @@ -2,5 +2,6 @@ #define KMC_C90_COMPILER_CODE_GENERATOR_SYMBOL_TABLE_H typedef struct SymbolInfo* SymbolInfoRef; +typedef struct SymbolBlock* SymbolBlockRef; #endif /* KMC_C90_COMPILER_CODE_GENERATOR_SYMBOL_TABLE_H */ diff --git a/src/code_generator/symbol_table_impl.h b/src/code_generator/symbol_table_impl.h index a394e77a..8764408a 100644 --- a/src/code_generator/symbol_table_impl.h +++ b/src/code_generator/symbol_table_impl.h @@ -7,4 +7,11 @@ struct SymbolInfo { LLVMValueRef value; }; +DECLARE_VECTOR(SymbolInfoRef); + +struct SymbolBlock { + StringRef name; + VECTORREF(SymbolInfoRef) symbols; +}; + #endif /* KMC_C90_COMPILER_CODE_GENERATOR_SYMBOL_TABLE_IMPL_H */ From abe797234fad97b4d241454a6d270525d8a09fc4 Mon Sep 17 00:00:00 2001 From: hatsusato Date: Fri, 17 Jun 2016 10:52:38 +0900 Subject: [PATCH 04/11] Add struct SymbolTable --- src/code_generator/symbol_table.h | 1 + src/code_generator/symbol_table_impl.h | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/src/code_generator/symbol_table.h b/src/code_generator/symbol_table.h index 0bc5566c..6df341c9 100644 --- a/src/code_generator/symbol_table.h +++ b/src/code_generator/symbol_table.h @@ -3,5 +3,6 @@ typedef struct SymbolInfo* SymbolInfoRef; typedef struct SymbolBlock* SymbolBlockRef; +typedef struct SymbolTable* SymbolTableRef; #endif /* KMC_C90_COMPILER_CODE_GENERATOR_SYMBOL_TABLE_H */ diff --git a/src/code_generator/symbol_table_impl.h b/src/code_generator/symbol_table_impl.h index 8764408a..e39c1750 100644 --- a/src/code_generator/symbol_table_impl.h +++ b/src/code_generator/symbol_table_impl.h @@ -14,4 +14,10 @@ struct SymbolBlock { VECTORREF(SymbolInfoRef) symbols; }; +DECLARE_VECTOR(SymbolBlockRef); + +struct SymbolTable { + VECTORREF(SymbolBlockRef) stack; +}; + #endif /* KMC_C90_COMPILER_CODE_GENERATOR_SYMBOL_TABLE_IMPL_H */ From 767d9e01de356b436d4c1c03d91b9ea4da4fae0b Mon Sep 17 00:00:00 2001 From: hatsusato Date: Fri, 17 Jun 2016 10:57:24 +0900 Subject: [PATCH 05/11] Add DEFINE_VECTOR macro for symbol structures --- src/code_generator/symbol_table.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/code_generator/symbol_table.c b/src/code_generator/symbol_table.c index 05d7d9e8..a5e67d76 100644 --- a/src/code_generator/symbol_table.c +++ b/src/code_generator/symbol_table.c @@ -1 +1,4 @@ #include "code_generator/symbol_table.h" + +DEFINE_VECTOR(SymbolInfoRef) +DEFINE_VECTOR(SymbolBlockRef) From 7820fcb00ae47e68f3f46b78430462a2ac5dd0e7 Mon Sep 17 00:00:00 2001 From: hatsusato Date: Fri, 17 Jun 2016 11:20:05 +0900 Subject: [PATCH 06/11] Fix symbol_table_impl.h Add missing headers --- src/code_generator/symbol_table_impl.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/code_generator/symbol_table_impl.h b/src/code_generator/symbol_table_impl.h index e39c1750..179530d3 100644 --- a/src/code_generator/symbol_table_impl.h +++ b/src/code_generator/symbol_table_impl.h @@ -1,20 +1,24 @@ #ifndef KMC_C90_COMPILER_CODE_GENERATOR_SYMBOL_TABLE_IMPL_H #define KMC_C90_COMPILER_CODE_GENERATOR_SYMBOL_TABLE_IMPL_H +#include +#include "stdstring.h" +#include "vector.h" + struct SymbolInfo { StringRef name; LLVMTypeRef type; LLVMValueRef value; }; -DECLARE_VECTOR(SymbolInfoRef); +DECLARE_VECTOR(SymbolInfoRef) struct SymbolBlock { StringRef name; VECTORREF(SymbolInfoRef) symbols; }; -DECLARE_VECTOR(SymbolBlockRef); +DECLARE_VECTOR(SymbolBlockRef) struct SymbolTable { VECTORREF(SymbolBlockRef) stack; From abfd7bbbfd3ef4665e2d5a7a9fee32c371006b88 Mon Sep 17 00:00:00 2001 From: hatsusato Date: Fri, 17 Jun 2016 11:22:47 +0900 Subject: [PATCH 07/11] Add symbol_info_{ctor,dtor} --- src/code_generator/symbol_table.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/code_generator/symbol_table.c b/src/code_generator/symbol_table.c index a5e67d76..5361034a 100644 --- a/src/code_generator/symbol_table.c +++ b/src/code_generator/symbol_table.c @@ -1,4 +1,23 @@ #include "code_generator/symbol_table.h" +#include "code_generator/symbol_table_impl.h" +#include "stdstring.h" +#include "utility.h" DEFINE_VECTOR(SymbolInfoRef) DEFINE_VECTOR(SymbolBlockRef) + +SymbolInfoRef symbol_info_ctor(StringRef name, LLVMTypeRef type, + LLVMValueRef value) { + const SymbolInfoRef symbol = safe_malloc(struct SymbolInfo); + const StringRef symbol_name = string_ctor(string_data(name), NULL); + symbol->name = symbol_name; + symbol->type = type; + symbol->value = value; + return symbol; +} + +void symbol_info_dtor(SymbolInfoRef* pself) { + assert(pself); + string_dtor(&(*pself)->name); + safe_free(*pself); +} From 3609b4941c137b1f691b7a679e87e33ed33e43d5 Mon Sep 17 00:00:00 2001 From: hatsusato Date: Fri, 17 Jun 2016 11:33:12 +0900 Subject: [PATCH 08/11] Add symbol_block_{ctor,dtor} --- src/code_generator/symbol_table.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/code_generator/symbol_table.c b/src/code_generator/symbol_table.c index 5361034a..e881882b 100644 --- a/src/code_generator/symbol_table.c +++ b/src/code_generator/symbol_table.c @@ -21,3 +21,27 @@ void symbol_info_dtor(SymbolInfoRef* pself) { string_dtor(&(*pself)->name); safe_free(*pself); } + +SymbolBlockRef symbol_block_ctor(StringRef name) { + const SymbolBlockRef block = safe_malloc(struct SymbolBlock); + const StringRef block_name = string_ctor(string_data(name), NULL); + block->name = block_name; + block->symbols = VECTORFUNC(SymbolInfoRef, ctor)(NULL); + return block; +} + +void symbol_block_dtor(SymbolBlockRef* pself) { + assert(pself); + string_dtor(&(*pself)->name); + { + const VECTORREF(SymbolInfoRef) vector = (*pself)->symbols; + SymbolInfoRef* iter = VECTORFUNC(SymbolInfoRef, begin)(vector); + const SymbolInfoRef* const end = VECTORFUNC(SymbolInfoRef, end)(vector); + for (; iter != end; ++iter) { + SymbolInfoRef* const tmp = iter; + symbol_info_dtor(tmp); + } + VECTORFUNC(SymbolInfoRef, dtor)(&(*pself)->symbols); + } + safe_free(*pself); +} From 2e5867c896d77c4a49b45007797a992869fa5776 Mon Sep 17 00:00:00 2001 From: hatsusato Date: Fri, 17 Jun 2016 11:54:36 +0900 Subject: [PATCH 09/11] Add symbol_table_{ctor,dtor} --- src/code_generator/symbol_table.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/code_generator/symbol_table.c b/src/code_generator/symbol_table.c index e881882b..9b6fd036 100644 --- a/src/code_generator/symbol_table.c +++ b/src/code_generator/symbol_table.c @@ -45,3 +45,24 @@ void symbol_block_dtor(SymbolBlockRef* pself) { } safe_free(*pself); } + +SymbolTableRef symbol_table_ctor(void) { + const SymbolTableRef table = safe_malloc(struct SymbolTable); + table->stack = VECTORFUNC(SymbolBlockRef, ctor)(NULL); + return table; +} + +void symbol_table_dtor(SymbolTableRef* pself) { + assert(pself); + { + const VECTORREF(SymbolBlockRef) vector = (*pself)->stack; + SymbolBlockRef* iter = VECTORFUNC(SymbolBlockRef, begin)(vector); + const SymbolBlockRef* const end = VECTORFUNC(SymbolBlockRef, end)(vector); + for (; iter != end; ++iter) { + SymbolBlockRef* const tmp = iter; + symbol_block_dtor(tmp); + } + VECTORFUNC(SymbolBlockRef, dtor)(&(*pself)->stack); + } + safe_free(*pself); +} From b2f30f681d836451dcb179163eefa5c1fac4f9b8 Mon Sep 17 00:00:00 2001 From: hatsusato Date: Fri, 17 Jun 2016 14:01:03 +0900 Subject: [PATCH 10/11] Add global symbol table initializer/filinalizer --- src/code_generator/symbol_table.c | 12 ++++++++++++ src/code_generator/symbol_table.h | 3 +++ 2 files changed, 15 insertions(+) diff --git a/src/code_generator/symbol_table.c b/src/code_generator/symbol_table.c index 9b6fd036..eaa3b834 100644 --- a/src/code_generator/symbol_table.c +++ b/src/code_generator/symbol_table.c @@ -6,6 +6,8 @@ DEFINE_VECTOR(SymbolInfoRef) DEFINE_VECTOR(SymbolBlockRef) +static SymbolTableRef g_symbol_table; + SymbolInfoRef symbol_info_ctor(StringRef name, LLVMTypeRef type, LLVMValueRef value) { const SymbolInfoRef symbol = safe_malloc(struct SymbolInfo); @@ -66,3 +68,13 @@ void symbol_table_dtor(SymbolTableRef* pself) { } safe_free(*pself); } + +void initialize_symbol_table(StringRef name) { + assert(!g_symbol_table); + g_symbol_table = symbol_table_ctor(name); +} + +void finalize_symbol_table(void) { + assert(g_symbol_table); + symbol_table_dtor(&g_symbol_table); +} diff --git a/src/code_generator/symbol_table.h b/src/code_generator/symbol_table.h index 6df341c9..25345a58 100644 --- a/src/code_generator/symbol_table.h +++ b/src/code_generator/symbol_table.h @@ -5,4 +5,7 @@ typedef struct SymbolInfo* SymbolInfoRef; typedef struct SymbolBlock* SymbolBlockRef; typedef struct SymbolTable* SymbolTableRef; +void initialize_symbol_table(StringRef name); +void finalize_symbol_table(void); + #endif /* KMC_C90_COMPILER_CODE_GENERATOR_SYMBOL_TABLE_H */ From b9f9e0afabd9d94e889396120055bd4b3d8657e9 Mon Sep 17 00:00:00 2001 From: hatsusato Date: Fri, 24 Jun 2016 14:52:58 +0900 Subject: [PATCH 11/11] Fix a bug --- src/code_generator/symbol_table.c | 4 ++-- src/code_generator/symbol_table.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/code_generator/symbol_table.c b/src/code_generator/symbol_table.c index eaa3b834..6bab01ac 100644 --- a/src/code_generator/symbol_table.c +++ b/src/code_generator/symbol_table.c @@ -69,9 +69,9 @@ void symbol_table_dtor(SymbolTableRef* pself) { safe_free(*pself); } -void initialize_symbol_table(StringRef name) { +void initialize_symbol_table(void) { assert(!g_symbol_table); - g_symbol_table = symbol_table_ctor(name); + g_symbol_table = symbol_table_ctor(); } void finalize_symbol_table(void) { diff --git a/src/code_generator/symbol_table.h b/src/code_generator/symbol_table.h index 25345a58..ea9fa8e5 100644 --- a/src/code_generator/symbol_table.h +++ b/src/code_generator/symbol_table.h @@ -5,7 +5,7 @@ typedef struct SymbolInfo* SymbolInfoRef; typedef struct SymbolBlock* SymbolBlockRef; typedef struct SymbolTable* SymbolTableRef; -void initialize_symbol_table(StringRef name); +void initialize_symbol_table(void); void finalize_symbol_table(void); #endif /* KMC_C90_COMPILER_CODE_GENERATOR_SYMBOL_TABLE_H */