alloc, load, store, and ret are all in the IR

This commit is contained in:
2026-08-03 21:24:29 +10:00
parent 15709b65a6
commit a452c323e1
9 changed files with 79 additions and 10 deletions

View File

@@ -38,7 +38,15 @@ char* gravityFunctionToCStr(GravityFunction function);
char* gravityValueToCStr(GravityValue value); char* gravityValueToCStr(GravityValue value);
void gravityPositionBuilderAtEnd(GravityBuilder builder, GravityBlock block); void gravityPositionBuilderAtEnd(GravityBuilder builder, GravityBlock block);
GravityValue gravityNewIntConstant(GravityType intType, int64_t value);
// instructions
GravityValue gravityBuildAlloc(GravityBuilder builder, GravityType type, const char* name); 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 #endif

View File

@@ -13,11 +13,11 @@ char* gravityBlockToCStr(GravityBlock block) {
sbAppend(&buff, "%s", gravityTypeToCStr(block->paramTypes[i])); sbAppend(&buff, "%s", gravityTypeToCStr(block->paramTypes[i]));
} }
} }
sbAppend(&buff, "):\n"); sbAppend(&buff, "):");
for (unsigned int i = 0; i < block->instructions.count; i++) { for (unsigned int i = 0; i < block->instructions.count; i++) {
GravityInstruction inst = *get(block->instructions, i); GravityInstruction inst = *get(block->instructions, i);
sbAppend(&buff, " %s\n", gravityInstructionToCStr(inst)); sbAppend(&buff, "\n %s", gravityInstructionToCStr(inst));
} }
return buff.data; return buff.data;

View File

@@ -4,10 +4,16 @@ void gravityBuildInstruction(GravityBuilder builder, GravityOpcode opcode, Gravi
assert(builder->currentBlock != NULL); assert(builder->currentBlock != NULL);
// copy operands list to avoid stack lifetime // copy operands list to avoid stack lifetime
GravityValue* operandsCopy = calloc(numOperands, sizeof(GravityValue));
if (!operandsCopy) GravityValue* operandsCopy = NULL;
return;
memcpy(operandsCopy, operands, sizeof(GravityValue) * numOperands); if (operands != NULL) {
operandsCopy = calloc(numOperands, sizeof(GravityValue));
if (!operandsCopy)
return;
memcpy(operandsCopy, operands, sizeof(GravityValue) * numOperands);
}
GravityInstruction newInst = { GravityInstruction newInst = {
.opcode = opcode, .opcode = opcode,
@@ -42,3 +48,47 @@ GravityValue gravityBuildAlloc(GravityBuilder builder, GravityType type, const c
return 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
);
}
}

View File

@@ -16,5 +16,8 @@ GravityBuilder gravityCreateBuilder(void);
void gravityPositionBuilderAtEnd(GravityBuilder builder, GravityBlock block); void gravityPositionBuilderAtEnd(GravityBuilder builder, GravityBlock block);
GravityValue gravityBuildAlloc(GravityBuilder builder, GravityType type, const char* name); 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 #endif

View File

@@ -5,6 +5,7 @@ char* gravityOpcodeToCStr(GravityOpcode opcode) {
case GravityOpcodeAlloc: return "alloc"; case GravityOpcodeAlloc: return "alloc";
case GravityOpcodeStore: return "store"; case GravityOpcodeStore: return "store";
case GravityOpcodeLoad: return "load"; case GravityOpcodeLoad: return "load";
case GravityOpcodeRet: return "ret";
default: return "fixme"; default: return "fixme";
} }
} }

View File

@@ -7,7 +7,8 @@
typedef enum { typedef enum {
GravityOpcodeAlloc = 0, GravityOpcodeAlloc = 0,
GravityOpcodeStore, GravityOpcodeStore,
GravityOpcodeLoad GravityOpcodeLoad,
GravityOpcodeRet
} GravityOpcode; } GravityOpcode;
typedef struct { typedef struct {

View File

@@ -84,7 +84,7 @@ GravityValue gravityNewConstant(GravityType type) {
return newValue; return newValue;
} }
GravityValue newIntConstant(GravityType intType, int64_t value) { GravityValue gravityNewIntConstant(GravityType intType, int64_t value) {
assert(intType->typeKind == GravityIntTypeKind); assert(intType->typeKind == GravityIntTypeKind);
GravityValue newValue = gravityNewConstant(intType); GravityValue newValue = gravityNewConstant(intType);

View File

@@ -35,6 +35,6 @@ GravityValue gravityTypeToTypeValue(GravityType type);
char* gravityValueToCStr(GravityValue value); char* gravityValueToCStr(GravityValue value);
GravityValue gravityNewConstant(GravityType type); GravityValue gravityNewConstant(GravityType type);
GravityValue newIntConstant(GravityType intType, int64_t value); GravityValue gravityNewIntConstant(GravityType intType, int64_t value);
#endif #endif

8
test.c
View File

@@ -12,7 +12,13 @@ int main(void) {
GravityBlock entryBlock = gravityStartBlock("entry", mainFunc, 0); GravityBlock entryBlock = gravityStartBlock("entry", mainFunc, 0);
gravityPositionBuilderAtEnd(builder, entryBlock); 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)); printf("%s\n", gravityFunctionToCStr(mainFunc));