diff options
author | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-01-31 02:46:16 +0330 |
---|---|---|
committer | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-01-31 02:46:16 +0330 |
commit | 5a6f4613ab19a9c4bc9ead53da410d7ab9ff5837 (patch) | |
tree | 64053302ea59ac69fb830b3efad6a721cdd1e9b3 /src/compiler/code-generator.h | |
parent | ce253ec2ae45879b331d9b9f77f786b78fbfcf2e (diff) |
make stuff more organized and safer
Diffstat (limited to 'src/compiler/code-generator.h')
-rw-r--r-- | src/compiler/code-generator.h | 32 |
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); |