summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorA404M <ahmadmahmoudiprogrammer@gmail.com>2025-02-03 09:14:51 +0330
committerA404M <ahmadmahmoudiprogrammer@gmail.com>2025-02-03 09:14:51 +0330
commit160da58b3f49b9c295551f81d41a106ff7f6546e (patch)
tree657a99e6cae7e69e2d21a38679253797bf108ce8
parent6b5e8fbb13552ecb78f8e348578861e9409d11f1 (diff)
make mov and def more dynamic
-rw-r--r--src/compiler/ast-tree.c34
-rw-r--r--src/compiler/ast-tree.h2
-rw-r--r--src/compiler/code-generator.c76
-rw-r--r--src/compiler/code-generator.h18
4 files changed, 71 insertions, 59 deletions
diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c
index c9b719c..7bb9f8f 100644
--- a/src/compiler/ast-tree.c
+++ b/src/compiler/ast-tree.c
@@ -1180,7 +1180,15 @@ bool setTypesVariable(AstTree *tree) {
}
bool setTypesOperatorAssign(AstTree *tree) {
- return setTypesAstInfix(tree->metadata);
+ AstTreeInfix *infix = tree->metadata;
+ if (!setTypesAstInfix(infix)) {
+ return true;
+ } else if (!typeIsEqual(&infix->leftType, &infix->rightType)) {
+ printLog("Type mismatch");
+ return false;
+ } else {
+ return true;
+ }
}
bool setTypesAstVariable(AstTreeVariable *variable) {
@@ -1211,11 +1219,6 @@ bool setTypesAstInfix(AstTreeInfix *infix) {
AstTree *lType = makeTypeOf(&infix->left);
AstTree *rType = makeTypeOf(&infix->right);
- if (!typeIsEqual(lType, rType)) {
- printLog("Type mismatch");
- return false;
- }
-
infix->leftType = *lType;
infix->rightType = *rType;
@@ -1313,3 +1316,22 @@ bool astTreeCleanAstVariable(AstTreeVariable *variable) {
return true;
}
+
+size_t astTreeTypeSize(AstTree tree) {
+ switch (tree.token) {
+ case AST_TREE_TOKEN_TYPE_U64:
+ return 8;
+ case AST_TREE_TOKEN_FUNCTION:
+ case AST_TREE_TOKEN_KEYWORD_PRINT_U64:
+ case AST_TREE_TOKEN_TYPE_TYPE:
+ case AST_TREE_TOKEN_TYPE_FUNCTION:
+ case AST_TREE_TOKEN_TYPE_VOID:
+ case AST_TREE_TOKEN_FUNCTION_CALL:
+ case AST_TREE_TOKEN_VARIABLE:
+ case AST_TREE_TOKEN_VARIABLE_DEFINE:
+ case AST_TREE_TOKEN_VALUE_U64:
+ case AST_TREE_TOKEN_OPERATOR_ASSIGN:
+ case AST_TREE_TOKEN_NONE:
+ }
+ UNREACHABLE;
+}
diff --git a/src/compiler/ast-tree.h b/src/compiler/ast-tree.h
index 645ef5f..1aada03 100644
--- a/src/compiler/ast-tree.h
+++ b/src/compiler/ast-tree.h
@@ -162,3 +162,5 @@ bool astTreeClean(AstTree *tree);
bool astTreeCleanFunction(AstTree *tree);
bool astTreeCleanVariable(AstTree *tree);
bool astTreeCleanAstVariable(AstTreeVariable *variable);
+
+size_t astTreeTypeSize(AstTree tree);
diff --git a/src/compiler/code-generator.c b/src/compiler/code-generator.c
index 905f408..b1c5604 100644
--- a/src/compiler/code-generator.c
+++ b/src/compiler/code-generator.c
@@ -31,8 +31,8 @@ void codeGeneratorDelete(CodeGeneratorCodes *code) {
free(metadata);
}
continue;
- case CODE_GENERATOR_INSTRUCTION_MOV_64: {
- CodeGeneratorDoubleOperand *metadata = current.metadata;
+ case CODE_GENERATOR_INSTRUCTION_MOV: {
+ CodeGeneratorMov *metadata = current.metadata;
codeGeneratorOperandDestroy(metadata->op0);
codeGeneratorOperandDestroy(metadata->op1);
free(metadata);
@@ -42,13 +42,7 @@ void codeGeneratorDelete(CodeGeneratorCodes *code) {
UNREACHABLE;
}
for (size_t i = 0; i < code->defines_size; ++i) {
- CodeGeneratorDefine current = code->defines[i];
- switch (current.type) {
- case CODE_GENERATOR_TYPE_64:
- codeGeneratorOperandDestroy(current.operand);
- continue;
- }
- UNREACHABLE;
+ codeGeneratorOperandDestroy(code->defines[i].operand);
}
free(code->codes);
free(code);
@@ -132,12 +126,12 @@ CodeGeneratorCode createGenerateCode(char *label_begin, char *label_end,
CodeGeneratorDefine createGenerateDefine(char *label_begin, char *label_end,
CodeGeneratorOperand operand,
- CodeGeneratorType type) {
+ size_t bytes) {
CodeGeneratorDefine define = {
.label_begin = label_begin,
.label_end = label_end,
.operand = operand,
- .type = type,
+ .bytes = bytes,
};
return define;
}
@@ -198,10 +192,10 @@ CodeGeneratorCodes *codeGenerator(AstTreeRoot *astTreeRoot) {
if (!variable->isConst) {
CodeGeneratorOperand value = makeCodeGeneratorOperand(
(void *)(uint64_t)(AstTreeU64)variable->value->metadata, false);
- generateCodePushDefine(codes,
- createGenerateDefine(variable->name_begin,
- variable->name_end, value,
- CODE_GENERATOR_TYPE_64));
+ generateCodePushDefine(
+ codes,
+ createGenerateDefine(variable->name_begin, variable->name_end,
+ value, astTreeTypeSize(*variable->type)));
}
continue;
case AST_TREE_TOKEN_TYPE_TYPE:
@@ -293,25 +287,22 @@ bool codeGeneratorAstTreeFunction(char *label_begin, char *label_end,
if (infix->left.token != AST_TREE_TOKEN_VARIABLE) {
printLog("Not implemented yet");
exit(1);
- } else if (infix->leftType.token != AST_TREE_TOKEN_TYPE_U64) {
- printLog("Not implemented yet");
- exit(1);
}
- CodeGeneratorDoubleOperand *operands = a404m_malloc(sizeof(*operands));
+ CodeGeneratorMov *operands = a404m_malloc(sizeof(*operands));
CodeGeneratorOperand *op0 =
newCodeGeneratorOperandFromAstTree(infix->left);
CodeGeneratorOperand *op1 =
newCodeGeneratorOperandFromAstTree(infix->right);
operands->op0 = *op0;
operands->op1 = *op1;
+ operands->bytes = astTreeTypeSize(infix->leftType);
free(op0);
free(op1);
- generateCodePushCode(codes,
- createGenerateCode(label_begin, label_end,
- CODE_GENERATOR_INSTRUCTION_MOV_64,
- operands));
+ generateCodePushCode(
+ codes, createGenerateCode(label_begin, label_end,
+ CODE_GENERATOR_INSTRUCTION_MOV, operands));
}
goto OK;
case AST_TREE_TOKEN_VARIABLE_DEFINE:
@@ -430,11 +421,12 @@ char *codeGeneratorToFlatASM(const CodeGeneratorCodes *codes) {
free(inst);
}
continue;
- case CODE_GENERATOR_INSTRUCTION_MOV_64: {
- CodeGeneratorDoubleOperand *metadata = code.metadata;
+ case CODE_GENERATOR_INSTRUCTION_MOV: {
+ CodeGeneratorMov *metadata = code.metadata;
char *inst;
if (metadata->op0.isReference) {
- asprintf(&inst, "mov64 [%s],", metadata->op0.value.reference);
+ asprintf(&inst, "mov%ld [%s],", metadata->bytes * 8,
+ metadata->op0.value.reference);
} else {
UNREACHABLE;
}
@@ -461,26 +453,20 @@ char *codeGeneratorToFlatASM(const CodeGeneratorCodes *codes) {
for (size_t i = 0; i < codes->defines_size; ++i) {
const CodeGeneratorDefine define = codes->defines[i];
- switch (define.type) {
- case CODE_GENERATOR_TYPE_64:
- CodeGeneratorOperand operand = define.operand;
- char *inst;
- if (operand.isReference) {
- asprintf(&inst, "def64 %.*s, [%s]\n",
- (int)(define.label_end - define.label_begin),
- define.label_begin, operand.value.reference);
- } else {
- asprintf(&inst, "def64 %.*s, %lu\n",
- (int)(define.label_end - define.label_begin),
- define.label_begin, operand.value.value);
- }
- codeGeneratorAppendFlatASMCommand(&fasm, &fasm_size, &fasm_inserted, inst,
- strlen(inst));
- free(inst);
-
- continue;
+ CodeGeneratorOperand operand = define.operand;
+ char *inst;
+ if (operand.isReference) {
+ asprintf(&inst, "def%ld %.*s, [%s]\n", define.bytes * 8,
+ (int)(define.label_end - define.label_begin), define.label_begin,
+ operand.value.reference);
+ } else {
+ asprintf(&inst, "def%ld %.*s, %lu\n", define.bytes * 8,
+ (int)(define.label_end - define.label_begin), define.label_begin,
+ operand.value.value);
}
- UNREACHABLE;
+ codeGeneratorAppendFlatASMCommand(&fasm, &fasm_size, &fasm_inserted, inst,
+ strlen(inst));
+ free(inst);
}
fasm[fasm_inserted] = '\0';
diff --git a/src/compiler/code-generator.h b/src/compiler/code-generator.h
index 0c388b9..3399ee3 100644
--- a/src/compiler/code-generator.h
+++ b/src/compiler/code-generator.h
@@ -9,13 +9,9 @@ typedef enum CodeGeneratorInstruction : uint8_t {
CODE_GENERATOR_INSTRUCTION_CALL,
CODE_GENERATOR_INSTRUCTION_RET,
CODE_GENERATOR_INSTRUCTION_DEF_VAR64,
- CODE_GENERATOR_INSTRUCTION_MOV_64,
+ CODE_GENERATOR_INSTRUCTION_MOV,
} CodeGeneratorInstruction;
-typedef enum CodeGeneratorType : uint8_t {
- CODE_GENERATOR_TYPE_64,
-} CodeGeneratorType;
-
typedef struct CodeGeneratorCode {
char *label_begin;
char *label_end;
@@ -41,11 +37,17 @@ typedef struct CodeGeneratorDoubleOperand {
CodeGeneratorOperand op1;
} CodeGeneratorDoubleOperand;
+typedef struct CodeGeneratorMov {
+ CodeGeneratorOperand op0;
+ CodeGeneratorOperand op1;
+ size_t bytes;
+} CodeGeneratorMov;
+
typedef struct CodeGeneratorDefine {
char *label_begin;
char *label_end;
CodeGeneratorOperand operand;
- CodeGeneratorType type;
+ size_t bytes;
} CodeGeneratorDefine;
typedef struct CodeGeneratorCodes {
@@ -68,8 +70,8 @@ CodeGeneratorCode createGenerateCode(char *label_begin, char *label_end,
void *metadata);
CodeGeneratorDefine createGenerateDefine(char *label_begin, char *label_end,
- CodeGeneratorOperand operand,
- CodeGeneratorType type);
+ CodeGeneratorOperand operand,
+ size_t bytes);
CodeGeneratorCode *newGenerateCode(char *label_begin, char *label_end,
CodeGeneratorInstruction instruction);