#Llvm -Analyse und Transformationspässe
Dieses Projekt verwendet Clang und LLVM, um den C ++ - Quellcode zu analysieren und zu transformieren.
Clang ist ein vorderes Ende von LLVM und erstellt C ++ in IR. Die Zwischendarstellung ist weitaus einfacher als C ++, sodass es einfacher zu analysieren und zu transformieren.
LLVM verfügt über eine Vielzahl von Bibliotheken, mit denen IR analysiert und transformiert werden kann. Anweisungen für eine Analyse oder eine Transformation werden als Pass bezeichnet.
Videodemo der Pässe
Done See BelowDone See BelowLLVM und Clang müssen die Pässe zusammenstellen und anwenden. CMake ist erforderlich, um LLVM und Klang zu bauen.
Clang wird verwendet, um C ++ in Bytecode LLVM zu kompilieren, um eine Analyse -Pass -Übergabe des StaticCount -Durchgangs durch jede Anweisung in der ByeTecode durchzuführen und ausdrucken, welcher Typ es ist. Es verwendet auch LLVM, um die zertifikatischen Statistiken im Auge zu behalten, die es am Ende der Analyse ausdruckt.
Bevor Sie diesem Handbuch folgen, sollten Sie LLVM heruntergeladen und erstellt haben.
Dieses Projekt und dieses Leitfaden wurden mit macOS durchgeführt.
Um einen Pass auf einen C -Code anzuwenden, gibt es eine Reihe von Schritten, die angeklagt werden müssen, sie sind wie folgt.
<LLVM_Source_Directory>/lib/Transforms .StaticCount aus dem geklonten Repository in das oben aufgeführte Verzeichnis.Transforms sollte eine Reihe von Verzeichnissen und nur eine Datei CMakeLists.txt vorhanden sein.CMakeLists.txt und fügen Sie die Zeilen add_subdirectory(StaticCount) hinzu.<LLVM_Build_Directory> und führen Sie cmake --build . Dies wird alle LLVM aufbauen, einschließlich des PASS, den wir gerade hinzugefügt haben.HeapTimeTestProgram -Verzeichnis innerhalb des geklonten Repositorys.clang -O0 -emit-llvm -c main.cpp -o bctest.bc aus. Mit Clang werden unsere C ++ -Datei zu Bytecode kompilieren, mit der LLVM arbeiten kann.opt -load <LLVM_Build_Directory>/lib/llvmstaticcount.dylib -StaticCount -stats< bctest.bc > /dev/null Die gedruckten Aussagen sind ein Ergebnis der statischen Analyse unter Verwendung von LLVM.
Hinweis - Dies ist nicht die vollständige Ausgabe des Pass. Es wird so reduziert, dass die obigen Befehle sichtbar sind.
Problem? Bitte kontaktieren Sie mich.
Clang wird verwendet, um C ++ in Bytecode LLVM zu kompilieren, um eine Analyse -Pass -Übergabe des DynCount -Durchgangs durch jeden Basisblock im ByeTecode zu kompilieren und einen Anruf in eine Laufzeitbibliothek hinzugefügt. Die Funktionen in der Bibliothek sind nur Ausgaben für diesen Meilenstein.
Zuerst wird der Pass genau wie der erste zusammengestellt. Als nächstes kompilieren wir das Testprogramm in Bytecode. Danach wird die Laufzeitbibliothek in Bytecode zusammengestellt. Diese beiden Bytecode -Dateien werden dann mit LLVM mit einer einzelnen Bytecode -Datei verknüpft. Danach wird der Pass angewendet, im Gegensatz zum ersten Pass wird zu diesem Zeitpunkt keine Ausgabe geben. Da dies ein dynamischer Pass ist, erhalten wir die Ergebnisse zur Laufzeit. Schließlich führen wir das Programm aus und erzielen unser Ergebnis. Bei jedem Inokence mehrerer grundlegender Blocktypen werden Ausgabe von Ausgaben ausgegeben.
Bevor Sie diesem Handbuch folgen, sollten Sie LLVM heruntergeladen und erstellt haben.
Dieses Projekt und dieses Leitfaden wurden mit macOS durchgeführt.
Um einen Pass auf C -Code anzuwenden, gibt es eine Reihe von Schritten, die angespannt werden müssen, sie sind wie folgt.
<LLVM_Source_Directory>/lib/Transforms .DynCount aus dem geklonten Repository in das oben aufgeführte Verzeichnis.Transforms sollte eine Reihe von Verzeichnissen und nur eine Datei CMakeLists.txt vorhanden sein.CMakeLists.txt und fügen Sie die Zeilen add_subdirectory(DynCount) hinzu.<LLVM_Build_Directory> und führen Sie cmake --build . Dies wird alle LLVM aufbauen, einschließlich des PASS, den wir gerade hinzugefügt haben.SmallTestProgram -Verzeichnis im klonierten Repository.clang -O0 -emit-llvm -c smallProgram.c -o sp.bc aus. Mit Clang können unsere C -Datei zu Bytecode kompilieren, mit der LLVM arbeiten kann.clang -O0 -emit-llvm -c print -o p.bc aus. Mit Clang werden unsere Laufzeitbibliothek zu Bytecode kompiliert, die mit dem oben zusammengestellten Programm verknüpft werden kann.llvm-link p.bc sp.bc -S -o smallprogramandprint.bc Dies verknüpft unser Programm, das analysiert werden soll, und in unserer Laufzeitbibliothek.opt -load <LLVM_Build_Directory>/lib/llvmDynCount.dylib -DynCount <smallprogramandprint.bc> instrumentedprogram.bclli instrumentedprogram.bc aus, sodass das instrumentierte Programm so ausgeführt wird, dass wir das Ergebnis des Pass sehen können. 
Hinweis - Dies ist nicht die vollständige Ausgabe des Pass. Es wird so reduziert, dass die obigen Befehle sichtbar sind.
Problem? Bitte kontaktieren Sie mich.