#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; }