generators set up

This commit is contained in:
2026-08-04 11:30:30 +10:00
parent 9eab7ffbda
commit 6de562b7c3
9 changed files with 162 additions and 10 deletions

View File

@@ -0,0 +1,53 @@
#include "generator.h"
GravityTargetArch gravityNewTargetArch(const char* name) {
GravityTargetArch targetArch = malloc(sizeof(struct GravityOpaqueTargetArch));
if (targetArch == NULL) return targetArch;
StringBuffer* outputBuff = malloc(sizeof(StringBuffer));
if (outputBuff == NULL) {
free(targetArch);
return NULL;
}
initStringBuff(outputBuff);
targetArch->outputBuffer = outputBuff;
targetArch->name = strdup(name);
return targetArch;
}
void gravityTargetEmitInst(GravityTargetArch arch, GravityInstruction inst) {
switch (inst.opcode) {
case GravityOpcodeIntConst: arch->emitIntConst(arch, inst.operands[0]); break;
case GravityOpcodeRet: arch->emitRet(arch, inst.operands[0]); break;
default: assert(false);
}
}
void gravityTargetEmitBlock(GravityTargetArch arch, GravityBlock block) {
arch->emitBlock(arch, block);
for (unsigned int i = 0; i < block->instructions.count; i++) {
gravityTargetEmitInst(arch, *get(block->instructions, i));
}
}
void gravityTargetEmitFunction(GravityTargetArch arch, GravityFunction function) {
arch->currentFunction = function;
arch->emitFunction(arch, function);
for (unsigned int i = 0; i < function->blocks.count; i++) {
gravityTargetEmitBlock(arch, *get(function->blocks, i));
}
}
char* gravityTargetEmitModule(GravityTargetArch arch, GravityModule module) {
for (unsigned int i = 0; i < module->functions.count; i++) {
gravityTargetEmitFunction(arch, *get(module->functions, i));
}
return arch->outputBuffer->data;
}