53 lines
1.6 KiB
C
53 lines
1.6 KiB
C
|
|
#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;
|
||
|
|
}
|