Gebäude V8 mit Clang und emittieren LLVM IR

8

Ich versuche, die V8-Javascript-Engine mit Clang zu erstellen und eine .ll -Datei (en) auszugeben. Ich versuche, die Informationen hier und hier , um dies zu tun. Wenn ich jedoch make versuche, schlägt es fehl und sagt "Keine Regel, um ein Ziel zu machen". Ich bin verloren. Ich habe gerade versucht, v8.cc zu kompilieren, aber das scheitert einfach total. Ich stelle mir vor, dass ich versuche, -emit-llvm zu erzwingen, indem ich es als Compiler einfüge, aber ich bin mir nicht sicher.

%Vor%

... (bündle mehr CXX-Aufrufe, volle Ausgabe hier ) ...

%Vor%

BEARBEITEN:

Makefile: Ссылка

EDIT2:

Im Folgenden wird v8 ohne Fehler erstellt, aber offensichtlich wird kein IR ausgegeben.

%Vor%     
PitaJ 18.07.2014, 05:23
quelle

1 Antwort

10

C- und C ++ - Compiler haben im Allgemeinen vier Stufen:

  1. Vorverarbeitung
  2. Kompiliere Quelle zu Assembler
  3. Assembler zu binären Objektdateien zusammenstellen
  4. Verknüpfen Sie mehrere Objektdateien, um eine ausführbare Datei, eine gemeinsam genutzte Bibliothek oder eine statische Bibliothek zu erstellen

Im Fall von Clang ist Stufe 2 eine Art von Split: Zuerst LLVM IR erzeugen und dann für die Zielarchitektur zusammensetzen.

clang und gcc haben beide dieselben Befehlszeilenoptionen, um zu steuern, welche Stufe ausgeführt wird:

  • -E führt nur die Präprozessorstufe
  • aus
  • -S führt Preprocess- und Compile-Phase aus und gibt Assembly-Dateien aus
  • -c führt Vorverarbeitungs-, Kompilierungs- und Assembly-Schritte aus und erzeugt eine .o-Objektdatei
  • Wenn Sie keine dieser Optionen angeben, wird auch eine Verknüpfung erstellt, um eine ausführbare Datei (oder, abhängig von anderen Optionen, eine statische oder gemeinsam genutzte Bibliothek) zu erstellen.

Die Option -emit-llvm wirkt sich nur auf die Kompilierungsstufe aus und muss zusammen mit der Option -S verwendet werden. Das Hinzufügen dieser Optionen bedeutet, dass beim Aufruf des Compilers eine einzelne Datei erzeugt wird, die LLVM IR enthält. Der Standard-Ausgabedateiname ist derselbe wie der Eingabedateiname, jedoch mit der Erweiterung .ll.

Das gyp-Tool erstellt das Projekt nicht wirklich. Es erzeugt vielmehr eine Menge Makefiles, die den eigentlichen Build erstellen. Diese Makefiles enthalten Regeln zum Erstellen eines Dateityps aus einer anderen Datei. Die Hauptregeln sind:

  1. Produzieren Sie .o-Dateien aus .cpp-Eingabedateien (entspricht den obigen Stufen 1-3 für jede CPP-Datei)
  2. Produzieren Sie statische (.a) & / / dynamische (.so) Bibliotheksdateien aus den Objektdateien

Die Umgebungsvariablen, die Sie geändert haben, wirken sich auf die in diesen Regeln verwendeten Befehle aus. Insbesondere gibt die Variable CXX den Befehl an, der für die erste oben genannte Regel verwendet wurde.

Eine weitere zu beachtende Sache ist, dass die Makefile-Regel für die Kompilierung die -o -Option zu dem Befehl hinzufügt, der den Ausgabedateinamen außer Kraft setzt. Wenn Sie diese Regel mit der von Ihnen angegebenen CXX-Umgebungsvariableneinstellung ausführen, werden tatsächlich LLVM-IR-Dateien erzeugt, die jedoch .o anstelle von .ll.

benannt werden

Die Probleme treten auf, wenn make zur nächsten Stufe kommt und versucht, .a oder .so Dateien aus diesen Objektdateien zu machen - da es sich nicht wirklich um Objektdateien handelt, sondern um LLVM IR-Dateien.

Aber die gute Nachricht ist, dass Sie nach Ihrer eigenen Frage sowieso nur die LLVM-IR-Dateien haben wollen. Bis es zum Scheitern kommt, hat es diese bereits produziert. Der einzige Haken ist, dass sie mit .o anstelle von .ll benannt sind, aber hey, du kannst sie einfach umbenennen.

Wenn Sie möchten, dass der Build sauber bis zum Ende fortfährt, können Sie die Produktion von Bibliotheksdateien unterdrücken, indem Sie die Befehle zum Verknüpfen und Archivieren auf "true" ändern, was nichts bewirkt:

%Vor%

Wie gesagt, am Ende des Builds haben Sie eine .o-Datei für jede der .cpp-Dateien - die Dateinamen werden während der Kompilierung gedruckt. Dies sind tatsächlich LLVM IR-Dateien. Sie können sie umbenennen mit:

%Vor%     
harmic 22.07.2014, 11:15
quelle

Tags und Links