2016-08-16 1 views
2

Wenn ich versuche, ohne zu definieren RegisterClass Instanzen in TableGen Datei einen LLVM-Backend zu bauen, wirft es die folgenden Fehler:Wie schreibe ich ein LLVM-Backend für Stack-Maschine?

error:No 'RegisterClass' subclasses defined 

Wie eine Stapelmaschine Ziel für LLVM definieren (dh, dass die Register nicht verwendet)

+0

[Verwandte Frage] (http://stackoverflow.com/questions/6203323/llvm-backend-for-stack-based-machine) – KolesnichenkoDS

Antwort

2

Tun Sie es einfach nicht. LLVM DAG wurde speziell für die Registermaschinen entwickelt und ist für die Zusammenstellung einer Stapelmaschine von geringem Wert. Sie benötigen stattdessen ein benutzerdefiniertes Back-End.

Ein Ansatz war ich für ein ähnliches Problem mit (LLVM IR -> Stack weichen Kern auf einem FPGA) folgt:

1) Aus SSA (reg2mem)

2) Bauen Sie sich ein Zwischen Baum Repräsentation (dh alle Single-Use-Registerzuweisungen in Bäume quetschen, wenn es die Reihenfolge erlaubt). Dies ist der größte Optimierungsengpass, je weniger Registerzuordnungen Sie hinterlassen, desto besser.

3) "Registerzuweisung" für die verbleibenden Register, die alle als Stack-allokierte Variablen dargestellt werden (hoffe, dass Ihre Stack-Maschine ISA dies zulässt).

4) Übersetzen Sie den Baum direkt, ohne irgendeine Anweisung Auswahl (Sie können es auf LLVM IR-Ebene statt mit intrinsics und einem benutzerdefinierten instcombine pass).

EDIT: Es ist nicht einfach, dies mit dem DAG-basierten Backend zu tun, es sollte nie so verwendet werden.

Die nächste Sache, über die ich nachdenken kann, ist die Verwendung des DAG-Backends, um einen Zwischenregister-Maschinencode zu erzeugen, und dann einen Post-Processing-Durchlauf zu verwenden, um die Befehle nach Möglichkeit neu zu ordnen und sonst den Stack zugewiesenen Variablen zu injizieren. D.h., sie repräsentieren jeden der Stapelmaschinenbefehle als einen Pseudobefehl mit 1 oder 2 Registerargumenten und 1 Registerergebnis.

+0

Vielen Dank für Ihre Antwort, aber mein Ziel ist es zu entdecken, ob es ohne möglich ist benutzerdefiniertes Backend schreiben Also, wenn Sie ** irgendeine ** Möglichkeit wissen, dies zu tun - schreiben Sie bitte ein Update auf Ihre Antwort. – KolesnichenkoDS

+0

Ich lerne immer noch LLVM und es ist mir nicht klar, warum DAG schlecht für Stack-basierte Maschine ist. Docs sagen, dass SelectionDAG wie folgt aussieht: '(fadd: f32 (fmul: f32 (fadd: f32 W, X), Y), Z)' - genau wie lisp;) Es scheint also nicht schwer zu übersetzen -basierter Maschinencode – KolesnichenkoDS

+0

Und zum Beispiel X86 ** ist ** stack-basiert, denn wie ich verstehe, wenn die Anzahl der Argumente ist mehr als die Anzahl der Register, Argumente werden auf Stapel übergeben. Also, wenn mein Verständnis richtig ist, sollte ich einfach vermeiden, Argumente an Register zu übergeben und das direkt an den Stack weiterzugeben. Jetzt habe ich ein Register erstellt, das ich nicht benutze, und das Backend funktioniert nicht (weil es noch unvollständig ist), aber ich sehe kein großes Problem. – KolesnichenkoDS

Verwandte Themen