diff options
-rw-r--r-- | Makefile | 1 | ||||
-rw-r--r-- | src/compiler/ast-tree.c | 45 | ||||
-rw-r--r-- | src/compiler/ast-tree.h | 15 | ||||
-rw-r--r-- | src/compiler/lexer.c | 4 | ||||
-rw-r--r-- | src/compiler/parser.c | 34 | ||||
-rw-r--r-- | src/compiler/parser.h | 10 | ||||
-rw-r--r-- | src/main.c | 53 | ||||
-rw-r--r-- | src/utils/file.c | 5 | ||||
-rw-r--r-- | src/utils/time.c | 32 | ||||
-rw-r--r-- | src/utils/time.h | 7 |
10 files changed, 141 insertions, 65 deletions
@@ -19,6 +19,7 @@ NC := \033[0m INC_DIRS := $(SRC_DIR) INC_FLAGS := $(addprefix -I,$(INC_DIRS)) +# OP_FLAG := -Ofast OP_FLAG := -O3 # OP_FLAG := -Oz # OP_FLAG := -g diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c index 2201b4a..47b3d54 100644 --- a/src/compiler/ast-tree.c +++ b/src/compiler/ast-tree.c @@ -6,11 +6,13 @@ #include "utils/log.h" #include "utils/memory.h" #include "utils/string.h" +#include "utils/time.h" #include "utils/type.h" #include <stddef.h> #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <time.h> AstTree AST_TREE_TYPE_TYPE = { .token = AST_TREE_TOKEN_TYPE_TYPE, @@ -859,11 +861,13 @@ void astTreeRootsDestroy(AstTreeRoots roots) { AstTree *newAstTree(AstTreeToken token, void *metadata, AstTree *type, char *str_begin, char *str_end) { AstTree *result = a404m_malloc(sizeof(*result)); - result->token = token; - result->metadata = metadata; - result->type = type; - result->str_begin = str_begin; - result->str_end = str_end; + *result = (AstTree){ + .token = token, + .metadata = metadata, + .type = type, + .str_begin = str_begin, + .str_end = str_end, + }; return result; } @@ -1277,13 +1281,20 @@ AstTreeVariables copyAstTreeVariables(AstTreeVariables variables, return result; } -AstTreeRoots makeAstTree(const char *filePath) { +AstTreeRoots makeAstTree(const char *filePath +#ifdef PRINT_STATISTICS + , + struct timespec *lexingTime, + struct timespec *parsingTime +#endif +) { AstTreeRoots roots = { .data = a404m_malloc(0 * sizeof(*roots.data)), .size = 0, }; - if (getAstTreeRoot(strClone(filePath), &roots) == NULL) { + if (getAstTreeRoot(strClone(filePath), &roots, lexingTime, parsingTime) == + NULL) { goto RETURN_ERROR; } @@ -1300,7 +1311,13 @@ RETURN_ERROR: return AST_TREE_ROOTS_ERROR; } -AstTreeRoot *getAstTreeRoot(char *filePath, AstTreeRoots *roots) { +AstTreeRoot *getAstTreeRoot(char *filePath, AstTreeRoots *roots +#ifdef PRINT_STATISTICS + , + struct timespec *lexingTime, + struct timespec *parsingTime +#endif +) { for (size_t i = 0; i < roots->size; ++i) { if (strcmp(roots->data[i]->filePath, filePath) == 0) { free(filePath); @@ -1308,10 +1325,16 @@ AstTreeRoot *getAstTreeRoot(char *filePath, AstTreeRoots *roots) { } } - ParserNode *parserNode = parserFromPath(filePath); + struct timespec start, end; + clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start); + + ParserNode *parserNode = parserFromPath(filePath, lexingTime); if (parserNode == NULL) { goto RETURN_ERROR; } + + clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end); + *parsingTime = time_add(*parsingTime, time_diff(end, start)); AstTreeRoot *root = makeAstRoot(parserNode, filePath); parserNodeDelete(parserNode); if (root == NULL) { @@ -1381,8 +1404,8 @@ AstTreeRoot *getAstTreeRoot(char *filePath, AstTreeRoots *roots) { (imports_size + imports_size / 2 + 1) * sizeof(*root->imports)); } - AstTreeRoot *import = - getAstTreeRoot(joinToPathOf(filePath, str), roots); + AstTreeRoot *import = getAstTreeRoot(joinToPathOf(filePath, str), + roots, lexingTime, parsingTime); free(str); if (import == NULL) { diff --git a/src/compiler/ast-tree.h b/src/compiler/ast-tree.h index 68b8ec6..cb7c301 100644 --- a/src/compiler/ast-tree.h +++ b/src/compiler/ast-tree.h @@ -4,6 +4,7 @@ #include <stddef.h> #include <stdint.h> #include <sys/types.h> +#include <time.h> typedef enum AstTreeToken { AST_TREE_TOKEN_FUNCTION, @@ -284,8 +285,18 @@ AstTreeVariables copyAstTreeVariables(AstTreeVariables variables, AstTreeVariables newVariables[], size_t variables_size); -AstTreeRoots makeAstTree(const char *filePath); -AstTreeRoot *getAstTreeRoot(char *filePath, AstTreeRoots *roots); +AstTreeRoots makeAstTree(const char *filePath +#ifdef PRINT_STATISTICS + , + struct timespec *lexingTime, struct timespec* parsingTime +#endif +); +AstTreeRoot *getAstTreeRoot(char *filePath, AstTreeRoots *roots +#ifdef PRINT_STATISTICS + , + struct timespec *lexingTime, struct timespec *parsingTime +#endif + ); AstTreeRoot *makeAstRoot(ParserNode *parsedRoot, char *filePath); bool pushVariable(AstTreeHelper *helper, AstTreeVariables *variables, diff --git a/src/compiler/lexer.c b/src/compiler/lexer.c index 8cf0cc3..b4e00b3 100644 --- a/src/compiler/lexer.c +++ b/src/compiler/lexer.c @@ -308,7 +308,7 @@ RETURN_SUCCESS: return result; } -void lexerPushClear(LexerNodeArray *array, size_t *array_size, char *iter, +inline __attribute__((always_inline)) void lexerPushClear(LexerNodeArray *array, size_t *array_size, char *iter, char **node_str_begin, LexerToken *node_token, LexerToken token) { switch (*node_token) { @@ -480,7 +480,7 @@ bool isSpace(char c) { } } -extern bool isString(char c) { +bool isString(char c) { switch (c) { case '\'': case '\"': diff --git a/src/compiler/parser.c b/src/compiler/parser.c index 4c67988..32c37c9 100644 --- a/src/compiler/parser.c +++ b/src/compiler/parser.c @@ -5,10 +5,12 @@ #include "utils/log.h" #include "utils/memory.h" #include "utils/string.h" +#include "utils/time.h" #include <stddef.h> #include <stdint.h> #include <stdio.h> #include <stdlib.h> +#include <time.h> const char *PARSER_TOKEN_STRINGS[] = { "PARSER_TOKEN_ROOT", @@ -665,15 +667,24 @@ RETURN_SUCCESS: ParserNode *newParserNode(ParserToken token, char *str_begin, char *str_end, void *metadata, ParserNode *parent) { ParserNode *parserNode = a404m_malloc(sizeof(*parserNode)); - parserNode->token = token; - parserNode->str_begin = str_begin; - parserNode->str_end = str_end; - parserNode->metadata = metadata; - parserNode->parent = parent; + *parserNode = (ParserNode){ + .token = token, + .str_begin = str_begin, + .str_end = str_end, + .metadata = metadata, + .parent = parent, + }; return parserNode; } -ParserNode *parserFromPath(const char *filePath) { +ParserNode *parserFromPath(const char *filePath +#ifdef PRINT_STATISTICS + , + struct timespec *lexingTime +#endif +) { + struct timespec start, end; + clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start); char *code = readWholeFile(filePath); if (code == NULL) { return NULL; @@ -683,6 +694,8 @@ ParserNode *parserFromPath(const char *filePath) { if (lexerNodeArrayIsError(lexed)) { return NULL; } + clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end); + *lexingTime = time_add(*lexingTime, time_diff(end, start)); ParserNode *root = parser(lexed); lexerNodeArrayDestroy(lexed); @@ -740,7 +753,8 @@ bool parserNodeArray(LexerNode *begin, LexerNode *end, ParserNode *parent) { } } */ - if(parsedNodes_size != 0 && parsedNodes_data[parsedNodes_size-1] == pNode){ + if (parsedNodes_size != 0 && + parsedNodes_data[parsedNodes_size - 1] == pNode) { continue; } @@ -1293,7 +1307,7 @@ ParserNode *parserParenthesis(LexerNode *closing, LexerNode *begin, parserNode->str_end = closing->str_end; if (parserNodeArray(opening + 1, closing, parserNode)) { - ParserNodeFunctionCall *metadata = malloc(sizeof(*metadata)); + ParserNodeFunctionCall *metadata = a404m_malloc(sizeof(*metadata)); metadata->function = before; metadata->params = parserNode->metadata; parserNode->metadata = metadata; @@ -1360,7 +1374,7 @@ ParserNode *parserBracketsRight(LexerNode *closing, LexerNode *begin, parserNode->str_end = closing->str_end; if (parserNodeArray(opening + 1, closing, parserNode)) { - ParserNodeBracketMetadata *metadata = malloc(sizeof(*metadata)); + ParserNodeBracketMetadata *metadata = a404m_malloc(sizeof(*metadata)); metadata->operand = before; metadata->params = parserNode->metadata; parserNode->metadata = metadata; @@ -1419,7 +1433,7 @@ ParserNode *parserBracketsLeft(LexerNode *closing, LexerNode *begin, parserNode->str_end = after->str_end; if (parserNodeArray(opening + 1, closing, parserNode)) { - ParserNodeBracketMetadata *metadata = malloc(sizeof(*metadata)); + ParserNodeBracketMetadata *metadata = a404m_malloc(sizeof(*metadata)); metadata->operand = after; metadata->params = parserNode->metadata; parserNode->metadata = metadata; diff --git a/src/compiler/parser.h b/src/compiler/parser.h index 0ee59a6..f37715d 100644 --- a/src/compiler/parser.h +++ b/src/compiler/parser.h @@ -4,6 +4,7 @@ #include "utils/type.h" #include <stddef.h> #include <stdint.h> +#include <time.h> typedef enum ParserToken { PARSER_TOKEN_ROOT, @@ -178,7 +179,12 @@ void parserNodePrint(const ParserNode *node, int indent); #endif void parserNodeDelete(ParserNode *node); -ParserNode *parserFromPath(const char *filePath); +ParserNode *parserFromPath(const char *filePath +#ifdef PRINT_STATISTICS + , + struct timespec *lexingTime +#endif +); ParserNode *parser(LexerNodeArray lexed); bool parserNodeArray(LexerNode *begin, LexerNode *end, ParserNode *parent); @@ -240,4 +246,4 @@ bool isExpression(ParserNode *node); bool isType(ParserNode *node); bool isValue(ParserNode *node); -char escapeChar(char *begin,char *end, bool *success); +char escapeChar(char *begin, char *end, bool *success); @@ -3,54 +3,29 @@ #include "utils/file.h" #include "utils/log.h" #include <stdio.h> -#include <time.h> - -// #define PRINT_COMPILE_TREE -// #define PRINT_STATISTICS #ifdef PRINT_STATISTICS -static struct timespec diff(struct timespec end, struct timespec start) { - struct timespec temp; - if ((end.tv_nsec - start.tv_nsec) < 0) { - temp.tv_sec = end.tv_sec - start.tv_sec - 1; - temp.tv_nsec = 1000000000 + end.tv_nsec - start.tv_nsec; - } else { - temp.tv_sec = end.tv_sec - start.tv_sec; - temp.tv_nsec = end.tv_nsec - start.tv_nsec; - } - return temp; -} - -static struct timespec add(struct timespec left, struct timespec right) { - struct timespec result; - result.tv_nsec = left.tv_nsec + right.tv_nsec; - result.tv_sec = (left.tv_sec + right.tv_sec) + result.tv_nsec / 1000000000; - result.tv_nsec %= 1000000000; - return result; -} - -static void printTime(struct timespec time) { - printf("%02ld:%02ld.%06ldus", time.tv_sec / 60, time.tv_sec % 60, - time.tv_nsec / 1000); -} +#include "utils/time.h" #endif static int run(const char *filePath) { #ifdef PRINT_STATISTICS struct timespec start, end; + struct timespec lexTime = {0}; + struct timespec parseTime = {0}; struct timespec astTime; struct timespec runTime; struct timespec totalTime = {0}; clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start); #endif - AstTreeRoots astTrees = makeAstTree(filePath); + AstTreeRoots astTrees = makeAstTree(filePath, &lexTime, &parseTime); if (astTrees.size == AST_TREE_ROOTS_ERROR.size) { return 1; } #ifdef PRINT_STATISTICS clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end); - astTime = diff(end, start); - totalTime = add(totalTime, astTime); + astTime = time_diff(end, start); + totalTime = time_add(totalTime, astTime); #endif #ifdef PRINT_COMPILE_TREE for (size_t i = 0; i < astTrees.size; ++i) { @@ -70,17 +45,23 @@ static int run(const char *filePath) { astTreeRootsDestroy(astTrees); #ifdef PRINT_STATISTICS clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end); - runTime = diff(end, start); - totalTime = add(totalTime, runTime); + runTime = time_diff(end, start); + totalTime = time_add(totalTime, runTime); #endif #ifdef PRINT_STATISTICS + astTime = time_diff(astTime, parseTime); + parseTime = time_diff(parseTime, lexTime); + printf("\nlexTime: "); + time_print(lexTime); + printf("\nparseTime: "); + time_print(parseTime); printf("\nastTime: "); - printTime(astTime); + time_print(astTime); printf("\nrunTime: "); - printTime(runTime); + time_print(runTime); printf("\ntotal: "); - printTime(totalTime); + time_print(totalTime); printf("\n"); #endif diff --git a/src/utils/file.c b/src/utils/file.c index f14334d..55a438c 100644 --- a/src/utils/file.c +++ b/src/utils/file.c @@ -58,7 +58,7 @@ char *readWholeFile(const char *filePath) { const size_t file_size = ftell(file); fseek(file, 0, SEEK_SET); - char *str = a404m_malloc((file_size + 1) * sizeof(char)); + char *str = a404m_malloc((file_size + 1) * sizeof(*str)); fread(str, file_size, 1, file); str[file_size] = '\0'; @@ -95,7 +95,8 @@ char *joinToPathOf(const char *original, const char *file) { result[result_size++] = '/'; for (size_t i = 0; file[i] != '\0'; ++i) { - if (result_size != 0 && result[result_size-1] == '/' && file[i + 1] == '.') { + if (result_size != 0 && result[result_size - 1] == '/' && + file[i + 1] == '.') { if (file[i + 2] == '/') { i += 2; continue; diff --git a/src/utils/time.c b/src/utils/time.c new file mode 100644 index 0000000..979a2c8 --- /dev/null +++ b/src/utils/time.c @@ -0,0 +1,32 @@ +#include "time.h" + +#include <stdio.h> + +#ifdef PRINT_STATISTICS +struct timespec time_diff(struct timespec end, struct timespec start) { + struct timespec temp; + if ((end.tv_nsec - start.tv_nsec) < 0) { + temp.tv_sec = end.tv_sec - start.tv_sec - 1; + temp.tv_nsec = 1000000000 + end.tv_nsec - start.tv_nsec; + } else { + temp.tv_sec = end.tv_sec - start.tv_sec; + temp.tv_nsec = end.tv_nsec - start.tv_nsec; + } + return temp; +} + +struct timespec time_add(struct timespec left, struct timespec right) { + struct timespec result; + result.tv_nsec = left.tv_nsec + right.tv_nsec; + result.tv_sec = (left.tv_sec + right.tv_sec) + result.tv_nsec / 1000000000; + result.tv_nsec %= 1000000000; + return result; +} + +void time_print(struct timespec time) { + printf("%02ld:%02ld.%06ldus", time.tv_sec / 60, time.tv_sec % 60, + time.tv_nsec / 1000); +} +#endif + + diff --git a/src/utils/time.h b/src/utils/time.h new file mode 100644 index 0000000..6d5f2f6 --- /dev/null +++ b/src/utils/time.h @@ -0,0 +1,7 @@ +#pragma once + +#include <time.h> + +struct timespec time_diff(struct timespec end, struct timespec start); +struct timespec time_add(struct timespec left, struct timespec right); +void time_print(struct timespec time); |