summaryrefslogtreecommitdiff
path: root/src/compiler/code-generator.h
diff options
context:
space:
mode:
authorA404M <ahmadmahmoudiprogrammer@gmail.com>2025-01-31 02:46:16 +0330
committerA404M <ahmadmahmoudiprogrammer@gmail.com>2025-01-31 02:46:16 +0330
commit5a6f4613ab19a9c4bc9ead53da410d7ab9ff5837 (patch)
tree64053302ea59ac69fb830b3efad6a721cdd1e9b3 /src/compiler/code-generator.h
parentce253ec2ae45879b331d9b9f77f786b78fbfcf2e (diff)
make stuff more organized and safer
Diffstat (limited to 'src/compiler/code-generator.h')
-rw-r--r--src/compiler/code-generator.h32
1 files changed, 28 insertions, 4 deletions
diff --git a/src/compiler/code-generator.h b/src/compiler/code-generator.h
index ac47e76..0c388b9 100644
--- a/src/compiler/code-generator.h
+++ b/src/compiler/code-generator.h
@@ -9,9 +9,13 @@ typedef enum CodeGeneratorInstruction : uint8_t {
CODE_GENERATOR_INSTRUCTION_CALL,
CODE_GENERATOR_INSTRUCTION_RET,
CODE_GENERATOR_INSTRUCTION_DEF_VAR64,
- CODE_GENERATOR_INSTRUCTION_MOV_U64,
+ CODE_GENERATOR_INSTRUCTION_MOV_64,
} CodeGeneratorInstruction;
+typedef enum CodeGeneratorType : uint8_t {
+ CODE_GENERATOR_TYPE_64,
+} CodeGeneratorType;
+
typedef struct CodeGeneratorCode {
char *label_begin;
char *label_end;
@@ -25,7 +29,10 @@ typedef struct CodeGeneratorCall {
} CodeGeneratorCall;
typedef struct CodeGeneratorOperand {
- char *value;
+ union {
+ uint64_t value;
+ char *reference;
+ } value;
bool isReference;
} CodeGeneratorOperand;
@@ -34,25 +41,42 @@ typedef struct CodeGeneratorDoubleOperand {
CodeGeneratorOperand op1;
} CodeGeneratorDoubleOperand;
+typedef struct CodeGeneratorDefine {
+ char *label_begin;
+ char *label_end;
+ CodeGeneratorOperand operand;
+ CodeGeneratorType type;
+} CodeGeneratorDefine;
+
typedef struct CodeGeneratorCodes {
CodeGeneratorCode *codes;
size_t codes_size;
+ CodeGeneratorDefine *defines;
+ size_t defines_size;
} CodeGeneratorCodes;
+void codeGeneratorOperandDestroy(CodeGeneratorOperand operand);
void codeGeneratorDelete(CodeGeneratorCodes *code);
-CodeGeneratorOperand *newCodeGeneratorOperand(char *value, bool isReference);
+CodeGeneratorOperand *newCodeGeneratorOperand(void *value, bool isReference);
+CodeGeneratorOperand makeCodeGeneratorOperand(void *value, bool isReference);
-CodeGeneratorOperand *makeCodeGeneratorOperand(AstTree tree);
+CodeGeneratorOperand *newCodeGeneratorOperandFromAstTree(AstTree tree);
CodeGeneratorCode createGenerateCode(char *label_begin, char *label_end,
CodeGeneratorInstruction instruction,
void *metadata);
+CodeGeneratorDefine createGenerateDefine(char *label_begin, char *label_end,
+ CodeGeneratorOperand operand,
+ CodeGeneratorType type);
+
CodeGeneratorCode *newGenerateCode(char *label_begin, char *label_end,
CodeGeneratorInstruction instruction);
void generateCodePushCode(CodeGeneratorCodes *codes, CodeGeneratorCode code);
+void generateCodePushDefine(CodeGeneratorCodes *codes,
+ CodeGeneratorDefine define);
CodeGeneratorCodes *codeGenerator(AstTreeRoot *astTreeRoot);