summaryrefslogtreecommitdiff
path: root/src/compiler
diff options
context:
space:
mode:
authorA404M <ahmadmahmoudiprogrammer@gmail.com>2025-02-06 10:34:20 +0330
committerA404M <ahmadmahmoudiprogrammer@gmail.com>2025-02-06 10:34:20 +0330
commitb89bec88a56b81d3524ed082db9796ef3169b060 (patch)
tree1be62c1568328066640f1fdd6737c17607df0df4 /src/compiler
parentf5f8e53b9d4c7ad2bd635a0b2273cd2fa90ff8b4 (diff)
prepairing to have better functions
fix bug
Diffstat (limited to 'src/compiler')
-rw-r--r--src/compiler/code-generator.c85
-rw-r--r--src/compiler/code-generator.h15
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,