2016-03-31 15 views
0

Ich versuche, LLVM API-Code zu generieren, der IR-Code regenerieren kann, der in es eingegeben wird. Wie ich über verschiedene Fragen wie this question entdecken es an einem gewissen Punkt möglich war, die folgendes zu erreichen dieses Ziel zu tun:Wie generiere ich LLVM API-Code über IR-Code, in aktuellen Versionen?

clang++ -S -O0 -emit-llvm MyFile.cpp -o MyIR.ll 
llc -march=cpp MyIR.ll -o MyIR_Maker.cpp 

aber ich die folgende Fehlermeldung erhalten: llc: Fehler: ungültiges Ziel ‚CPP‘. Weitere Untersuchungen sagen mir, dass the same issue occurred in früheren Versionen von LLVM, wenn das c-Backend in Version 3.1 entfernt wurde. Ich verwende jedoch cpp, dies führt mich zu der Annahme, dass das cpp-Backend aus irgendeinem Grund nicht in meiner Version von llvm existiert.

Also wirklich, was ich von hier wissen möchte ist: Wenn meine Analyse soweit richtig ist, wie aktiviere ich das cpp-Backend oder sonst bekomme ich mein llc in einen Zustand, in dem ich es so verwenden kann, wie ich es wünsche? Natürlich, wenn ich falsch liege oder wenn es einen anderen Weg gibt, werde ich dafür offen sein.

Die Version, mit der wir arbeiten, ist LLVM 3.6, diese wurde über brew unter OS X installiert. Vielen Dank im Voraus.

Edit: This question wurde als möglicherweise ähnliche Frage hingewiesen. Diese Frage wurde jedoch im spezifischen Kontext von LLVM 3.2 gestellt, wobei meins die aktuelle Situation in Version 3.6 betrifft, da es möglicherweise zu diesem Zeitpunkt eine echte Lösung geben könnte. Die einzige Antwort auf diese Frage verweist auf eine allgemeine externe Ressource und erklärt nicht sehr genau, was die tatsächliche Lösung ist.

+1

der c-Backend und der CPP-Backend sind sehr unterschiedlich entfernt worden war; und während der erstere entfernt wurde, wird letzterer immer noch unterstützt, nur nicht standardmäßig gebaut. Ich denke, diese Frage ist ein Duplikat von [Generiere LLVM C++ - API-Code als Backend] (http://stackoverflow.com/questions/14751403/generate-llvm-c-api-code-as-backend), der erklären sollte, wie Erstellen Sie LLVM, um dieses Back-End zu integrieren. – Oak

+0

@Oak Dann wäre vielleicht eine bessere Frage, wie kann ich das C++ - Backend aktivieren? Die Antwort auf diese Frage scheint nur auf eine generische Seite zum Erstellen von LLVM und ein Out-of-Context-Zitat zu zeigen, was IMO nicht sehr klar ist. Auch wenn ich erwähnte, dass ich meine LLVM-Binärdateien über Homebrew installiere, ist es implizit, dass ich das C++ - Backend nicht aktivieren kann, während ich die Homebrew-Version verwende? –

+0

Ich denke, Sie müssen LLVM selbst kompilieren, anstatt vorhandene Binärdateien zu verwenden, ja. Es tut mir leid, aber ich habe keine detailliertere Antwort als die, die mit dieser Frage verknüpft ist. – Oak

Antwort

0

Es scheint den richtigen Weg, um den CPP-Backend zu ermöglichen, ist die LLVM Quelle herunterladen und es selbst zu bauen, ist hier, wie dieser Prozess für mich gearbeitet:

  • Go to this page und die Version finden Sie verwenden mögen herunterladen, den entsprechenden Link mit dem Titel „LLVM Quellcode“
  • die Datei
  • Öffnen Sie den Zeilenbefehl Extract
  • cd zu dem Ordner, den Sie gerade extrahiert haben, sollte es das Format „llvm-xxxsrc“ sein, wo x. xx ist Ihre Versionsnummer
  • mkdir build
  • cd build
  • brew install cmake (wenn Sie nicht bereits cmake)
  • cmake -G Xcode .. (Dies erzeugt ein Xcode-Projekt, das LLVM bauen können)
  • open LLVM.xcodeproj
  • Wenn Beim Öffnen von Xcode wird eine Aufforderung angezeigt, klicken Sie auf "Schemata automatisch erstellen"
  • Warten Sie, bis Xcode die Indexierung beendet hat, dies wird eine Weile dauern.
  • Führen Sie das Xcode-Projekt aus, um LLVM zu kompilieren, dies wird auch eine Weile dauern.
  • Sobald dies erfolgt ist, werden alle generierten llvm CLI-Tools in Ihrem "build" -Ordner in einem Verzeichnis mit dem Namen Debug/bin abgelegt.
  • Platzieren Sie diesen Ordner wo immer Sie möchten und exportieren Sie ihn in Ihren Pfad.

Jetzt sollten Sie in der Lage sein, Befehle zu folgenden soll wie erwartet funktionieren, die Sie verwenden eine entsprechende Version von Klirren unter der Annahme, und Ihr Weg einen anderen Satz der llvm Binärdateien nicht enthalten:

clang++ -S -O0 -emit-llvm MyFile.cpp -o MyIR.ll 
llc -march=cpp MyIR.ll -o MyIR_Maker.cpp 
0

Wie in Generate LLVM C++ API code as backend erwähnt, diese Funktionalität (-march=cpp) erscheint von LLVM etwa Mai 2016.

+0

Diese Frage stammt aus Mai 2016 und erwähnt die in der Frage verwendete Version von LLVM. Ich denke, das könnte besser als Kommentar sein? –