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?

War es hilfreich?

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

scroll top