diff --git a/include/gravity/core.h b/include/gravity/core.h index 31e7466..f66115e 100644 --- a/include/gravity/core.h +++ b/include/gravity/core.h @@ -38,7 +38,15 @@ char* gravityFunctionToCStr(GravityFunction function); char* gravityValueToCStr(GravityValue value); void gravityPositionBuilderAtEnd(GravityBuilder builder, GravityBlock block); + +GravityValue gravityNewIntConstant(GravityType intType, int64_t value); + +// instructions GravityValue gravityBuildAlloc(GravityBuilder builder, GravityType type, const char* name); +void gravityBuildStore(GravityBuilder builder, GravityValue pointer, GravityValue value); +GravityValue gravityBuildLoad(GravityBuilder builder, GravityValue pointer, const char* name); +void gravityBuildRet(GravityBuilder builder, GravityValue returnValue); + // ============================ // #endif \ No newline at end of file diff --git a/src/block.c b/src/block.c index b205e00..b744ba8 100644 --- a/src/block.c +++ b/src/block.c @@ -13,11 +13,11 @@ char* gravityBlockToCStr(GravityBlock block) { sbAppend(&buff, "%s", gravityTypeToCStr(block->paramTypes[i])); } } - sbAppend(&buff, "):\n"); + sbAppend(&buff, "):"); for (unsigned int i = 0; i < block->instructions.count; i++) { GravityInstruction inst = *get(block->instructions, i); - sbAppend(&buff, " %s\n", gravityInstructionToCStr(inst)); + sbAppend(&buff, "\n %s", gravityInstructionToCStr(inst)); } return buff.data; diff --git a/src/builder.c b/src/builder.c index dec785b..ab94092 100644 --- a/src/builder.c +++ b/src/builder.c @@ -4,10 +4,16 @@ void gravityBuildInstruction(GravityBuilder builder, GravityOpcode opcode, Gravi assert(builder->currentBlock != NULL); // copy operands list to avoid stack lifetime - GravityValue* operandsCopy = calloc(numOperands, sizeof(GravityValue)); - if (!operandsCopy) - return; - memcpy(operandsCopy, operands, sizeof(GravityValue) * numOperands); + + GravityValue* operandsCopy = NULL; + + if (operands != NULL) { + operandsCopy = calloc(numOperands, sizeof(GravityValue)); + if (!operandsCopy) + return; + memcpy(operandsCopy, operands, sizeof(GravityValue) * numOperands); + } + GravityInstruction newInst = { .opcode = opcode, @@ -41,4 +47,48 @@ GravityValue gravityBuildAlloc(GravityBuilder builder, GravityType type, const c gravityBuildInstruction(builder, GravityOpcodeAlloc, (GravityValue[]){constant}, 1, result); return result; +} + +void gravityBuildStore(GravityBuilder builder, GravityValue pointer, GravityValue value) { + gravityBuildInstruction( + builder, + GravityOpcodeStore, + (GravityValue[]){pointer, value}, + 2, + NULL + ); +} + +GravityValue gravityBuildLoad(GravityBuilder builder, GravityValue pointer, const char* name) { + GravityValue result = gravityNewValue(name, gravityCreatePointerType()); + + gravityBuildInstruction( + builder, + GravityOpcodeLoad, + (GravityValue[]){pointer}, + 1, + result + ); + + return result; +} + +void gravityBuildRet(GravityBuilder builder, GravityValue returnValue) { + if (returnValue != NULL) { + gravityBuildInstruction( + builder, + GravityOpcodeRet, + (GravityValue[]){returnValue}, + 1, + NULL + ); + } else { + gravityBuildInstruction( + builder, + GravityOpcodeRet, + NULL, + 0, + NULL + ); + } } \ No newline at end of file diff --git a/src/builder.h b/src/builder.h index 088b55a..4fee13a 100644 --- a/src/builder.h +++ b/src/builder.h @@ -16,5 +16,8 @@ GravityBuilder gravityCreateBuilder(void); void gravityPositionBuilderAtEnd(GravityBuilder builder, GravityBlock block); GravityValue gravityBuildAlloc(GravityBuilder builder, GravityType type, const char* name); +void gravityBuildStore(GravityBuilder builder, GravityValue pointer, GravityValue value); +GravityValue gravityBuildLoad(GravityBuilder builder, GravityValue pointer, const char* name); +void gravityBuildRet(GravityBuilder builder, GravityValue returnValue); #endif \ No newline at end of file diff --git a/src/instruction.c b/src/instruction.c index 0c0a442..744c74f 100644 --- a/src/instruction.c +++ b/src/instruction.c @@ -5,6 +5,7 @@ char* gravityOpcodeToCStr(GravityOpcode opcode) { case GravityOpcodeAlloc: return "alloc"; case GravityOpcodeStore: return "store"; case GravityOpcodeLoad: return "load"; + case GravityOpcodeRet: return "ret"; default: return "fixme"; } } diff --git a/src/instruction.h b/src/instruction.h index a1e9ee9..e78e2a0 100644 --- a/src/instruction.h +++ b/src/instruction.h @@ -7,7 +7,8 @@ typedef enum { GravityOpcodeAlloc = 0, GravityOpcodeStore, - GravityOpcodeLoad + GravityOpcodeLoad, + GravityOpcodeRet } GravityOpcode; typedef struct { diff --git a/src/value.c b/src/value.c index dcb35b6..dab4ad3 100644 --- a/src/value.c +++ b/src/value.c @@ -84,7 +84,7 @@ GravityValue gravityNewConstant(GravityType type) { return newValue; } -GravityValue newIntConstant(GravityType intType, int64_t value) { +GravityValue gravityNewIntConstant(GravityType intType, int64_t value) { assert(intType->typeKind == GravityIntTypeKind); GravityValue newValue = gravityNewConstant(intType); diff --git a/src/value.h b/src/value.h index 50771b7..458f0c0 100644 --- a/src/value.h +++ b/src/value.h @@ -35,6 +35,6 @@ GravityValue gravityTypeToTypeValue(GravityType type); char* gravityValueToCStr(GravityValue value); GravityValue gravityNewConstant(GravityType type); -GravityValue newIntConstant(GravityType intType, int64_t value); +GravityValue gravityNewIntConstant(GravityType intType, int64_t value); #endif \ No newline at end of file diff --git a/test.c b/test.c index 3e49cc0..a95f7ae 100644 --- a/test.c +++ b/test.c @@ -12,7 +12,13 @@ int main(void) { GravityBlock entryBlock = gravityStartBlock("entry", mainFunc, 0); gravityPositionBuilderAtEnd(builder, entryBlock); - GravityValue something = gravityBuildAlloc(builder, charType, NULL); + GravityValue someVar = gravityBuildAlloc(builder, charType, NULL); + + GravityValue someConstant = gravityNewIntConstant(charType, 123); + gravityBuildStore(builder, someVar, someConstant); + + GravityValue output = gravityBuildLoad(builder, someVar, NULL); + gravityBuildRet(builder, output); printf("%s\n", gravityFunctionToCStr(mainFunc));