mirror of https://github.com/tbklang/tlang.git
Working code emitter and doing some code gen with it too
This commit is contained in:
parent
2d46eb4458
commit
ff9890437d
|
@ -2,6 +2,10 @@ module compiler.codegen.emit.core;
|
||||||
|
|
||||||
import compiler.symbols.data;
|
import compiler.symbols.data;
|
||||||
import compiler.typecheck.core;
|
import compiler.typecheck.core;
|
||||||
|
import std.container.slist : SList;
|
||||||
|
import compiler.codegen.instruction;
|
||||||
|
import std.stdio;
|
||||||
|
import std.file;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO: Perhaps have an interface that can emit(Context/Parent, Statement)
|
* TODO: Perhaps have an interface that can emit(Context/Parent, Statement)
|
||||||
|
@ -11,11 +15,21 @@ import compiler.typecheck.core;
|
||||||
|
|
||||||
public abstract class CodeEmitter
|
public abstract class CodeEmitter
|
||||||
{
|
{
|
||||||
private TypeChecker typeChecker;
|
protected TypeChecker typeChecker;
|
||||||
|
|
||||||
this(TypeChecker typeChecker)
|
/**
|
||||||
|
* The code queue
|
||||||
|
*/
|
||||||
|
protected SList!(Instruction) codeQueue;
|
||||||
|
alias instructions = codeQueue;
|
||||||
|
|
||||||
|
protected File file;
|
||||||
|
|
||||||
|
this(TypeChecker typeChecker, File file)
|
||||||
{
|
{
|
||||||
this.typeChecker = typeChecker;
|
this.typeChecker = typeChecker;
|
||||||
|
codeQueue = typeChecker.getCodeQueue();
|
||||||
|
this.file = file;
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract void emit();
|
public abstract void emit();
|
||||||
|
|
|
@ -2,16 +2,117 @@ module compiler.codegen.emit.dgen;
|
||||||
|
|
||||||
import compiler.codegen.emit.core : CodeEmitter;
|
import compiler.codegen.emit.core : CodeEmitter;
|
||||||
import compiler.typecheck.core;
|
import compiler.typecheck.core;
|
||||||
|
import std.container.slist : SList;
|
||||||
|
import compiler.codegen.instruction;
|
||||||
|
import std.stdio;
|
||||||
|
import std.file;
|
||||||
|
|
||||||
|
|
||||||
public final class DCodeEmitter : CodeEmitter
|
public final class DCodeEmitter : CodeEmitter
|
||||||
{
|
{
|
||||||
this(TypeChecker typeChecker)
|
this(TypeChecker typeChecker, File file)
|
||||||
{
|
{
|
||||||
super(typeChecker);
|
super(typeChecker, file);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO: We will need state as to where we are etc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
private ulong pushCount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RSP value before we started (needed for proper D exit/restore/main()-unwind)
|
||||||
|
*
|
||||||
|
* R15 (Richard 15) <- never use this register besides here and `restoreDInfo()`
|
||||||
|
*/
|
||||||
|
private void saveDInfo()
|
||||||
|
{
|
||||||
|
file.writeln(`
|
||||||
|
asm
|
||||||
|
{
|
||||||
|
mov R15, RSP;
|
||||||
|
}
|
||||||
|
`);
|
||||||
|
}
|
||||||
|
private void restoreDInfo()
|
||||||
|
{
|
||||||
|
file.writeln(`
|
||||||
|
asm
|
||||||
|
{
|
||||||
|
mov RSP, R15;
|
||||||
|
}
|
||||||
|
`);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void emit()
|
public override void emit()
|
||||||
{
|
{
|
||||||
|
/* Emit initial struccture */
|
||||||
|
emitIninitailModule();
|
||||||
|
|
||||||
|
/* Save D info */
|
||||||
|
saveDInfo();
|
||||||
|
|
||||||
/* TODO: Implement me */
|
/* TODO: Implement me */
|
||||||
|
foreach(Instruction instruction; instructions)
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* compiler.codegen.instruction.VariableDeclaration
|
||||||
|
*/
|
||||||
|
if(cast(VariableDeclaration)instruction)
|
||||||
|
{
|
||||||
|
VariableDeclaration varDecInstr = cast(compiler.codegen.instruction.VariableDeclaration)instruction;
|
||||||
|
|
||||||
|
file.writeln(`asm
|
||||||
|
{
|
||||||
|
sub RSP, 4;
|
||||||
|
mov dword ptr [RSP], 69;
|
||||||
|
}
|
||||||
|
`);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* TODO: We need to build map of stakc positions, maybe not */
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* compiler.codegen.instruction.VariableAssignmentInstr
|
||||||
|
*/
|
||||||
|
else if(cast(VariableAssignmentInstr)instruction)
|
||||||
|
{
|
||||||
|
VariableAssignmentInstr varAssInstr = cast(compiler.codegen.instruction.VariableAssignmentInstr)instruction;
|
||||||
|
|
||||||
|
/* Recursively descend soon */
|
||||||
|
|
||||||
|
// writeln("int "~varDecInstr.varName~";");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Restore D info */
|
||||||
|
restoreDInfo();
|
||||||
|
|
||||||
|
/* Close the module */
|
||||||
|
closeModule();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void emitIninitailModule()
|
||||||
|
{
|
||||||
|
/* TODO: Maybe emit as d name */
|
||||||
|
file.writeln("module "~typeChecker.getModule().getName()~";");
|
||||||
|
file.writeln("void main()");
|
||||||
|
file.writeln("{");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void closeModule()
|
||||||
|
{
|
||||||
|
/* Restore for D exit */
|
||||||
|
|
||||||
|
file.writeln(`
|
||||||
|
int h = -1;
|
||||||
|
h = *((&h)-4);
|
||||||
|
import std.stdio;
|
||||||
|
writeln(h);
|
||||||
|
`);
|
||||||
|
file.writeln("}");
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -70,8 +70,16 @@ void beginCompilation(string[] sourceFiles)
|
||||||
TypeChecker typeChecker = new TypeChecker(modulle);
|
TypeChecker typeChecker = new TypeChecker(modulle);
|
||||||
typeChecker.beginCheck();
|
typeChecker.beginCheck();
|
||||||
|
|
||||||
CodeEmitter emitter = new DCodeEmitter(typeChecker);
|
|
||||||
|
File outFile;
|
||||||
|
outFile.open("test.d", "w");
|
||||||
|
CodeEmitter emitter = new DCodeEmitter(typeChecker, outFile);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
emitter.emit();
|
emitter.emit();
|
||||||
|
outFile.close();
|
||||||
|
|
||||||
}
|
}
|
||||||
// catch(CollidingNameException e)
|
// catch(CollidingNameException e)
|
||||||
// {
|
// {
|
||||||
|
|
Loading…
Reference in New Issue