diff options
Diffstat (limited to 'src/compiler')
-rw-r--r-- | src/compiler/code-generator.c | 85 | ||||
-rw-r--r-- | src/compiler/code-generator.h | 15 |
2 files changed, 87 insertions, 13 deletions
diff --git a/src/compiler/code-generator.c b/src/compiler/code-generator.c index cfa7476..6ef6807 100644 --- a/src/compiler/code-generator.c +++ b/src/compiler/code-generator.c @@ -37,6 +37,16 @@ void codeGeneratorDelete(CodeGeneratorCodes *code) { free(metadata); } continue; + case CODE_GENERATOR_INSTRUCTION_FUNCTION_BEGIN: { + CodeGeneratorFunctionBegin *metadata = current.metadata; + free(metadata); + } + continue; + case CODE_GENERATOR_INSTRUCTION_FUNCTION_END: { + CodeGeneratorFunctionEnd *metadata = current.metadata; + free(metadata); + } + continue; } UNREACHABLE; } @@ -74,6 +84,22 @@ CodeGeneratorOperand makeCodeGeneratorOperand(void *value, bool isReference) { return result; } +CodeGeneratorFunctionBegin *newCodeGeneratorFunctionBegin(char *name_begin, + char *name_end) { + CodeGeneratorFunctionBegin *result = a404m_malloc(sizeof(*result)); + result->name_begin = name_begin; + result->name_end = name_end; + return result; +} + +CodeGeneratorFunctionEnd *newCodeGeneratorFunctionEnd(char *name_begin, + char *name_end) { + CodeGeneratorFunctionEnd *result = a404m_malloc(sizeof(*result)); + result->name_begin = name_begin; + result->name_end = name_end; + return result; +} + CodeGeneratorOperand *newCodeGeneratorOperandFromAstTree(AstTree tree) { switch (tree.token) { case AST_TREE_TOKEN_VALUE_U64: @@ -216,11 +242,16 @@ CodeGeneratorCodes *codeGenerator(AstTreeRoot *astTreeRoot) { return codes; } -bool codeGeneratorAstTreeFunction(char *label_begin, char *label_end, +bool codeGeneratorAstTreeFunction(char *name_begin, char *name_end, AstTree astTree, CodeGeneratorCodes *codes) { AstTreeFunction *metadata = astTree.metadata; AstTreeScope scope = metadata->scope; + generateCodePushCode( + codes, + createGenerateCode(NULL, NULL, CODE_GENERATOR_INSTRUCTION_FUNCTION_BEGIN, + newCodeGeneratorFunctionBegin(name_begin, name_end))); + for (size_t i = 0; i < scope.expressions_size; ++i) { AstTree tree = scope.expressions[i]; switch (tree.token) { @@ -239,10 +270,9 @@ bool codeGeneratorAstTreeFunction(char *label_begin, char *label_end, CodeGeneratorCall *callMetadata = a404m_malloc(sizeof(*callMetadata)); callMetadata->label_begin = function_metadata->name_begin; callMetadata->label_end = function_metadata->name_end; - generateCodePushCode(codes, - createGenerateCode(label_begin, label_end, - CODE_GENERATOR_INSTRUCTION_CALL, - callMetadata)); + generateCodePushCode( + codes, createGenerateCode(NULL, NULL, CODE_GENERATOR_INSTRUCTION_CALL, + callMetadata)); } goto OK; case AST_TREE_TOKEN_KEYWORD_PRINT_U64: { @@ -252,8 +282,8 @@ bool codeGeneratorAstTreeFunction(char *label_begin, char *label_end, (void *)(uint64_t)(AstTreeU64)metadata->metadata, false); generateCodePushCode( codes, - createGenerateCode(label_begin, label_end, - CODE_GENERATOR_INSTRUCTION_PRINT_U64, value)); + createGenerateCode(NULL, NULL, CODE_GENERATOR_INSTRUCTION_PRINT_U64, + value)); } else if (metadata->token == AST_TREE_TOKEN_VARIABLE) { AstTreeVariable *variable = metadata->metadata; if (variable->isConst) { @@ -261,7 +291,7 @@ bool codeGeneratorAstTreeFunction(char *label_begin, char *label_end, (void *)(uint64_t)(AstTreeU64)variable->value->metadata, false); generateCodePushCode( codes, - createGenerateCode(label_begin, label_end, + createGenerateCode(NULL, NULL, CODE_GENERATOR_INSTRUCTION_PRINT_U64, value)); } else { char *name = a404m_malloc( @@ -270,7 +300,7 @@ bool codeGeneratorAstTreeFunction(char *label_begin, char *label_end, variable->name_end - variable->name_begin); name[variable->name_end - variable->name_begin] = '\0'; generateCodePushCode( - codes, createGenerateCode(label_begin, label_end, + codes, createGenerateCode(NULL, NULL, CODE_GENERATOR_INSTRUCTION_PRINT_U64, newCodeGeneratorOperand(name, true))); } @@ -300,8 +330,8 @@ bool codeGeneratorAstTreeFunction(char *label_begin, char *label_end, free(op1); generateCodePushCode( - codes, createGenerateCode(label_begin, label_end, - CODE_GENERATOR_INSTRUCTION_MOV, operands)); + codes, createGenerateCode(NULL, NULL, CODE_GENERATOR_INSTRUCTION_MOV, + operands)); } goto OK; case AST_TREE_TOKEN_VARIABLE_DEFINE: @@ -317,13 +347,18 @@ bool codeGeneratorAstTreeFunction(char *label_begin, char *label_end, printLog("Bad token %d", tree.token); return false; OK: - label_begin = NULL; - label_end = NULL; } + generateCodePushCode( + codes, + createGenerateCode(NULL, NULL, CODE_GENERATOR_INSTRUCTION_FUNCTION_END, + newCodeGeneratorFunctionEnd(name_begin, name_end))); + + /* generateCodePushCode(codes, createGenerateCode(label_begin, label_end, CODE_GENERATOR_INSTRUCTION_RET, NULL)); + */ return true; } @@ -429,6 +464,30 @@ char *codeGeneratorToFlatASM(const CodeGeneratorCodes *codes) { free(inst); } continue; + case CODE_GENERATOR_INSTRUCTION_FUNCTION_BEGIN: { + CodeGeneratorFunctionBegin *metadata = code.metadata; + char *inst; + asprintf(&inst, "funBegin %.*s\nfunEntry %.*s\n", + (int)(metadata->name_end - metadata->name_begin), + metadata->name_begin, + (int)(metadata->name_end - metadata->name_begin), + metadata->name_begin); + codeGeneratorAppendFlatASMCommand(&fasm, &fasm_size, &fasm_inserted, inst, + strlen(inst)); + free(inst); + } + continue; + case CODE_GENERATOR_INSTRUCTION_FUNCTION_END: { + CodeGeneratorFunctionEnd *metadata = code.metadata; + char *inst; + asprintf(&inst, "funEnd %.*s\n", + (int)(metadata->name_end - metadata->name_begin), + metadata->name_begin); + codeGeneratorAppendFlatASMCommand(&fasm, &fasm_size, &fasm_inserted, inst, + strlen(inst)); + free(inst); + } + continue; } UNREACHABLE; } diff --git a/src/compiler/code-generator.h b/src/compiler/code-generator.h index dc09386..e4d9cac 100644 --- a/src/compiler/code-generator.h +++ b/src/compiler/code-generator.h @@ -9,6 +9,8 @@ typedef enum CodeGeneratorInstruction : uint8_t { CODE_GENERATOR_INSTRUCTION_CALL, CODE_GENERATOR_INSTRUCTION_RET, CODE_GENERATOR_INSTRUCTION_MOV, + CODE_GENERATOR_INSTRUCTION_FUNCTION_BEGIN, + CODE_GENERATOR_INSTRUCTION_FUNCTION_END, } CodeGeneratorInstruction; typedef struct CodeGeneratorCode { @@ -42,6 +44,16 @@ typedef struct CodeGeneratorMov { size_t bytes; } CodeGeneratorMov; +typedef struct CodeGeneratorFunctionBegin { + char *name_begin; + char *name_end; +} CodeGeneratorFunctionBegin; + +typedef struct CodeGeneratorFunctionEnd { + char *name_begin; + char *name_end; +} CodeGeneratorFunctionEnd; + typedef struct CodeGeneratorDefine { char *label_begin; char *label_end; @@ -62,6 +74,9 @@ void codeGeneratorDelete(CodeGeneratorCodes *code); CodeGeneratorOperand *newCodeGeneratorOperand(void *value, bool isReference); CodeGeneratorOperand makeCodeGeneratorOperand(void *value, bool isReference); +CodeGeneratorFunctionBegin *newCodeGeneratorFunctionBegin(char *name_begin,char *name_end); +CodeGeneratorFunctionEnd *newCodeGeneratorFunctionEnd(char *name_begin,char *name_end); + CodeGeneratorOperand *newCodeGeneratorOperandFromAstTree(AstTree tree); CodeGeneratorCode createGenerateCode(char *label_begin, char *label_end, |