Wie schreibt man einen benutzerdefinierten Intermodular-Pass in LLVM?

9

Ich habe einen Standard-Analysepass in LLVM geschrieben, indem ich die FunctionPass -Klasse erweitert habe. Alles scheint einen Sinn zu ergeben.

Nun möchte ich ein paar intermodulare Pässe schreiben, also Pässe, mit denen ich mehr als ein Modul gleichzeitig analysieren kann. Der Zweck eines solchen Durchlaufs besteht darin, einen Aufrufgraphen der gesamten Anwendung zu konstruieren. Der Zweck des anderen solchen Durchlaufs ist, dass ich eine Idee für eine Optimierung habe, die Funktionsaufrufe und ihre Parameter einschließt.

Ich weiß über interprozedurale Pässe in LLVM Bescheid, indem ich die Klasse ModulePass erweitere, aber das erlaubt nur eine Analyse innerhalb eines einzelnen Moduls.

Ich weiß über Link-Zeit-Optimierung (LTO) in LLVM, aber (a) ich bin nicht ganz klar, ob das ist, was ich will und (b) Ich habe keine Beispiele oder Dokumentation gefunden, wie man einen LTO-Pass tatsächlich schreibt.

Wie kann ich einen Intermodular-Pass, d. h. einen Pass, der Zugriff auf alle Module in einer Anwendung hat, in LLVM schreiben?

    
stepthom 12.05.2015, 18:01
quelle

3 Antworten

3

Ich habe einen Weg gefunden, mein Ziel zu erreichen: schreibe ein einfaches Programm, das llvm::parseBitcodeFile() benutzt, um eine Bitcode-Datei einzulesen und ein Module -Objekt zu erstellen, das durchsucht und analysiert werden kann. Es ist nicht ideal, weil es kein Pass ist, der innerhalb des LLVM-Frameworks ausgeführt werden kann. Es ist jedoch ein Weg, um mein Ziel der Analyse mehrerer Module auf einmal zu erreichen.

Für zukünftige Leser, hier ist was ich getan habe.

Erstellen Sie ein einfaches Werkzeug zum Einlesen einer Bitcodedatei und erzeugen Sie ein Module

%Vor%

Kompilieren Sie das Werkzeug

%Vor%

Erstellen Sie eine Bitcode-Datei zum Analysieren

%Vor%

Führen Sie das Tool reader auf dem Bitcode

aus %Vor%     
stepthom 13.05.2015, 13:05
quelle
2

Dies kann mit einem Modulpass erfolgen. Unten ist mein Code, und wenn Sie Hilfe benötigen, können Sie hier suchen.

bar.c

%Vor%

Skeleton.cpp

%Vor%

Ausgabe:

%Vor%

Ausgabe: Wenn Sie die Header-Datei mit bar.c verknüpfen

%Vor%     
user5390668 29.03.2016 17:55
quelle
1

In LTO sind alle Module kombiniert und Sie können das gesamte Programm IR in einem Modul sehen.

Sie müssen einen Modulpass wie einen beliebigen Moduldurchlauf schreiben und ihn der Liste der LTO-Pässe in der Funktion populateLTOPassManager in PassManagerBuilder.cpp hinzufügen. Hier ist das Dokument für PassManagerBuilder: Ссылка

Wenn Sie dies tun, wird Ihr Pass mit anderen LTO-Pässen ausgeführt.

    
Anil Altinay 13.12.2016 01:45
quelle

Tags und Links