summaryrefslogtreecommitdiff
path: root/src/compiler/code-generator.c
diff options
context:
space:
mode:
authorA404M <ahmadmahmoudiprogrammer@gmail.com>2025-01-30 04:50:11 +0330
committerA404M <ahmadmahmoudiprogrammer@gmail.com>2025-01-30 04:50:11 +0330
commite6122f465cd8b8eebcc2657321cf7cf5732408a8 (patch)
tree127d56cab08e99b0999c909db98a417656bf001f /src/compiler/code-generator.c
parent6441d6ace4b3ebdc04e3e7fee212830f783eecb0 (diff)
added global variables (not constants)
Diffstat (limited to 'src/compiler/code-generator.c')
-rw-r--r--src/compiler/code-generator.c64
1 files changed, 53 insertions, 11 deletions
diff --git a/src/compiler/code-generator.c b/src/compiler/code-generator.c
index 4c0becb..b084995 100644
--- a/src/compiler/code-generator.c
+++ b/src/compiler/code-generator.c
@@ -2,6 +2,7 @@
#include "compiler/ast-tree.h"
#include "utils/log.h"
#include "utils/memory.h"
+#include "utils/string.h"
#include <assert.h>
#include <stdint.h>
#include <stdio.h>
@@ -13,6 +14,10 @@ void codeGeneratorDelete(CodeGeneratorCodes *code) {
CodeGeneratorCode current = code->codes[i];
switch (current.instruction) {
case CODE_GENERATOR_INSTRUCTION_PRINT_U64:
+ case CODE_GENERATOR_INSTRUCTION_DEF_VAR64: {
+ CodeGeneratorOperand *metadata = current.metadata;
+ free(metadata);
+ }
case CODE_GENERATOR_INSTRUCTION_RET:
continue;
case CODE_GENERATOR_INSTRUCTION_CALL: {
@@ -78,6 +83,14 @@ CodeGeneratorCodes *codeGenerator(AstTreeRoot *astTreeRoot) {
}
continue;
case AST_TREE_TOKEN_VALUE_U64:
+ if (!variable->isConst) {
+ CodeGeneratorOperand value =
+ u64ToString((AstTreeU64)variable->value->metadata);
+ generateCodePushCode(
+ codes,
+ createGenerateCode(variable->name_begin, variable->name_end,
+ CODE_GENERATOR_INSTRUCTION_DEF_VAR64, value));
+ }
continue;
case AST_TREE_TOKEN_TYPE_TYPE:
case AST_TREE_TOKEN_TYPE_FUNCTION:
@@ -86,6 +99,7 @@ CodeGeneratorCodes *codeGenerator(AstTreeRoot *astTreeRoot) {
case AST_TREE_TOKEN_KEYWORD_PRINT_U64:
case AST_TREE_TOKEN_FUNCTION_CALL:
case AST_TREE_TOKEN_TYPE_U64:
+ case AST_TREE_TOKEN_VARIABLE_DEFINE:
case AST_TREE_TOKEN_NONE:
break;
}
@@ -128,24 +142,39 @@ bool codeGeneratorAstTreeFunction(char *label_begin, char *label_end,
case AST_TREE_TOKEN_KEYWORD_PRINT_U64: {
AstTreeSingleChild *metadata = tree.metadata;
if (metadata->token == AST_TREE_TOKEN_VALUE_U64) {
- CodeGeneratorOperandU64 value = (AstTreeU64)metadata->metadata;
+ CodeGeneratorOperand value =
+ u64ToString((AstTreeU64)metadata->metadata);
generateCodePushCode(
- codes, createGenerateCode(label_begin, label_end,
- CODE_GENERATOR_INSTRUCTION_PRINT_U64,
- (void *)value));
+ codes,
+ createGenerateCode(label_begin, label_end,
+ CODE_GENERATOR_INSTRUCTION_PRINT_U64, value));
} else if (metadata->token == AST_TREE_TOKEN_VARIABLE) {
AstTreeVariable *variable = metadata->metadata;
- CodeGeneratorOperandU64 value = (AstTreeU64)variable->value->metadata;
- generateCodePushCode(
- codes, createGenerateCode(label_begin, label_end,
- CODE_GENERATOR_INSTRUCTION_PRINT_U64,
- (void *)value));
+ if (variable->isConst) {
+ CodeGeneratorOperand value =
+ u64ToString((AstTreeU64)variable->value->metadata);
+ generateCodePushCode(
+ codes, createGenerateCode(label_begin, label_end,
+ CODE_GENERATOR_INSTRUCTION_PRINT_U64,
+ (void *)value));
+ } else {
+ char *name = a404m_malloc(
+ (variable->name_end - variable->name_begin + 1) * sizeof(*name));
+ strncpy(name, variable->name_begin,
+ variable->name_end - variable->name_begin);
+ name[variable->name_end - variable->name_begin] = '\0';
+ generateCodePushCode(
+ codes,
+ createGenerateCode(label_begin, label_end,
+ CODE_GENERATOR_INSTRUCTION_PRINT_U64, name));
+ }
} else {
printLog("Not implemented yet");
exit(1);
}
}
goto OK;
+ case AST_TREE_TOKEN_VARIABLE_DEFINE:
case AST_TREE_TOKEN_VALUE_U64:
case AST_TREE_TOKEN_VARIABLE:
case AST_TREE_TOKEN_FUNCTION:
@@ -207,9 +236,13 @@ char *codeGeneratorToFlatASM(const CodeGeneratorCodes *codes) {
switch (code.instruction) {
case CODE_GENERATOR_INSTRUCTION_PRINT_U64: {
- CodeGeneratorOperandU64 metadata = (CodeGeneratorOperandU64)code.metadata;
+ CodeGeneratorOperand metadata = (CodeGeneratorOperand)code.metadata;
char *inst;
- asprintf(&inst, "mov rdi,%lu\ncall print_u64\n", (uint64_t)metadata);
+ if ('0' <= metadata[0] && metadata[0] <= '9') {
+ asprintf(&inst, "mov rdi,%s\ncall print_u64\n", metadata);
+ } else {
+ asprintf(&inst, "mov rdi,[%s]\ncall print_u64\n", metadata);
+ }
codeGeneratorAppendFlatASMCommand(&fasm, &fasm_size, &fasm_inserted, inst,
strlen(inst));
free(inst);
@@ -233,6 +266,15 @@ char *codeGeneratorToFlatASM(const CodeGeneratorCodes *codes) {
strlen(INST));
}
continue;
+ case CODE_GENERATOR_INSTRUCTION_DEF_VAR64: {
+ CodeGeneratorOperand metadata = (CodeGeneratorOperand)code.metadata;
+ char *inst;
+ asprintf(&inst, "db %s\n", metadata);
+ codeGeneratorAppendFlatASMCommand(&fasm, &fasm_size, &fasm_inserted, inst,
+ strlen(inst));
+ free(inst);
+ }
+ continue;
}
printLog("Bad instruction %d", code.instruction);
}