Wie würden Sie wiederverwenden Implementierungen C Opcode wenn eine JIT mit LLVM zu schreiben?
-
21-08-2019 - |
Frage
In den llvm Tutorials und Beispiele, die Compiler-Ausgänge LLVM IR durch Anrufe wie diese machen
return Builder.CreateAdd(L, R, "addtmp");
aber viele Dolmetscher werden wie folgt geschrieben:
switch (opcode) {
case ADD:
result = L + R;
break;
...
Wie würden Sie jeden dieser Code-Schnipsel extrahieren einen JIT mit LLVM zu machen, ohne jede Opcode in LLVM IR neu zu implementieren?
Lösung
Okay, zuerst alle Ihre Code-Schnipsel nehmen und sie in ihre eigenen Funktionen Refactoring. So Ihr Code geht an:
void addOpcode(uint32_t *result, uint32_t L, uint32_t R) {
*result = L + R;
}
switch (opcode) {
case ADD:
addOpcode(&result, L, R);
break;
....
Okay, also, nachdem Sie diese Ihre Dolmetscher tun sollte noch laufen. Nun nehmen alle neuen Funktionen und legen Sie sie in einer eigenen Datei. Nun kompilieren Sie die Datei entweder llvm-gcc oder Klirren verwenden und anstelle der Erzeugung von nativen Code kompiliert es die "CPP" Backend (-march -cpp). Das wird erzeugen C ++ Code, der die Byte-Code für die Übersetzungseinheit instanziiert. Sie können Optionen festlegen, es auf bestimmte Funktionen zu beschränken, etc. Sie wahrscheinlich „-cppgen Modul“.
verwenden möchten Ihr Dolmetscher Schleife zusammenkleben Aufrufe an den generierten C ++ Code zurück, anstatt direkt den ursprünglichen Code ausgeführt wird, dann gibt sie auf einige Optimierer und einen nativen Codegenerator. Gratz auf der JIT ;-) Sie können ein Beispiel dafür in ein paar LLVM Projekte, wie die vm_ops in