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?
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.
Module
reader
auf dem Bitcode 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.
Tags und Links llvm llvm-ir static-analysis lto