Die meisten Compiler verwenden getrennte Übersetzung: der Compiler übersetzt jede Quelldatei eines Programms zu jeweils einer Objektdatei, die Maschinencode enthält. Anschließend verbindet der Linker die Objektdateien zum ausführbaren Programm. Dadurch können große Programme, die aus vielen Dateien bestehen, effizient übersetzt werden, da die Kompilierungsvorgänge parallel ablaufen können. Außerdem müssen bei Änderungen am Quelltext nur die betroffenen Dateien neu übersetzt werden. Für die Codequalität hat dieses Vorgehen aber Nachteile: der Compiler kann zur Optimierung immer nur Wissen aus einer Datei verwenden, da er nie das gesamte Programm sieht. Dies verhindert beispielsweise das Inlining einer Funktion aus Datei A in eine Funktion aus Datei B.
Link Time Optimization (LTO) vermeidet diese Probleme. Bei Verwendung von LTO speichert der Compiler in den Objektdateien keinen Maschinencode, sondern eine frühere Darstellung aus dem Kompilierungsvorgang, z.B. den Compiler-Zwischencode. Der Linker bekommt nun Zwischencode aus mehreren Übersetzungseinheiten und ruft wieder den Compiler auf, um Maschinencode für das gesamte Programm zu erzeugen. Der entscheidende Unterschied ist, dass der Compiler nun das gesamte Programm auf einmal sieht, wodurch sich deutlich mehr Möglichkeiten für die Optimierung ergeben. Außerdem ist zumindest prinzipiell die gemeinsame Optimierung von Code aus verschiedenen Eingabesprachen möglich. Allerdings sind die Zwischensprachprogramme, die dem Compiler dann vorliegen, teilweise so groß, dass Skalierungsprobleme in den bestehenden Optimierungsphasen auftreten.
GCC und clang/LLVM unterstützen LTO bereits über die Compiler-Option -flto. In dieser Arbeit soll nun Unterstützung für LTO in den am Lehrstuhl entwickelten C-Compiler cparser eingebaut werden, der auf der graphbasierten Zwischensprache FIRM basiert. LibFIRM enthält bereits Funktionalität zur (De-)Serialisierung von FIRM-Graphen, die dazu genutzt werden kann, die Zwischendarstellung der einzelnen Übersetzungseinheiten in Objektdateien zu speichern und später wieder zu laden. Im Folgenden soll ein Linker-Plugin für den gold-Linker entwickelt werden, das die FIRM-Graphen aus verschiedenen Objektdateien kombiniert und mit Hilfe von libFIRM den tatsächlichen Maschinencode erzeugt. Abschließend soll der LTO-Modus getestet und idealerweise die Skalierbarkeit der Optimierungen in FIRM mit Hilfe großer Eingabeprogramme untersucht werden.
Aufgabe:
- Sie implementieren Unterstützung von LTO in cparser/libFirm.
- Sie entwickeln ein Linker-Plugin zur Kombination mehrerer Zwischensprachprogramme und anschließender Erzeugung von Maschinencode.
- Sie testen die korrekte Funktion Ihrer Erweiterung mit Hilfe einer zur Verfügung gestellten Testsuite.
- Sie evaluieren Ihre Erweiterung mit zur Verfügung gestellten Programmen und untersuchen, ob sich die Codequalität verbessert hat bzw. Skalierungsprobleme aufgetreten sind.
Voraussetzungen:
- Programmierkenntnisse in C/C++ vorteilhaft
- Erfahrung mit libFIRM (z.B. aus Compilerpraktikum) vorteilhaft, aber nicht notwendig
- Interesse an Compilerinterna und des Kompilierungsprozesses (Kompilierung, Assemblieren, Linken)
Literatur:
- FIRM
- libFIRM
- LLVM Link Time Optimization: Design and Implementation
- Link-Time Optimization in GCC: Requirements and High-Level Design
- Linktime optimization in GCC - Brief History
- The LLVM gold plugin
Veröffentlichungen
Veröffentlichung |
Implementation and Evaluation of Link Time Optimization with libFirm |
Betreuer
Ehemalige Studenten |
---|
Mark Weinreuter |
Ehemalige Mitarbeiter |
---|
Dr.-Ing. Manuel Mohr |