summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/compiler/code-generator.c85
-rw-r--r--src/compiler/code-generator.h15
-rw-r--r--src/main.c2
-rw-r--r--stdlib/main.asm3
-rw-r--r--test/main.felan2
5 files changed, 91 insertions, 16 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,
diff --git a/src/main.c b/src/main.c
index c1439ca..cd63515 100644
--- a/src/main.c
+++ b/src/main.c
@@ -44,7 +44,7 @@ static int runWithPrint(const char *filePath, const char *outFilePath) {
codeGeneratorDelete(codes);
free(code);
- printf("%s", fasm);
+ puts(fasm);
if (codeGeneratorFlatASMExec(outFilePath, fasm)) {
free(fasm);
diff --git a/stdlib/main.asm b/stdlib/main.asm
index ac8bcea..0733e1c 100644
--- a/stdlib/main.asm
+++ b/stdlib/main.asm
@@ -79,8 +79,9 @@ macro funCall id, name {
segment readable executable
entry _start
-; rax = the number
+; rdi = the number
print_u64:
+ mov rax,rdi
mov rcx, rsp
mov rbx, 10
diff --git a/test/main.felan b/test/main.felan
index ef82130..6ee5abf 100644
--- a/test/main.felan
+++ b/test/main.felan
@@ -7,7 +7,7 @@ main :: () -> void {
};
a := 1;
-b := 124;
+b := 3;
fun :: ()->void {
print_u64 a;