Compiler-Duo: Viele Verbesserungen für Clang 17 und LLVM 17

Neben einer Fülle an Details und Korrekturen verstärkt die neue Compiler-Generation von Clang und LLVM 17 die Sprachen C++20, C++23 und C++26.

In Pocket speichern vorlesen Druckansicht 14 Kommentare lesen
C++ Code

(Bild: mki / heise online)

Lesezeit: 4 Min.
Von
  • Wolf Hosbach

Das Entwickler-Team der Compiler-Infrastruktur LLVM und Clang hat turnusgemäß im Halbjahresrhythmus für beide die Version 17.0.1 veröffentlicht. 17.0.0 entfiel, da gegenüber 17.0.0-rc noch eine kleine Fehlerkorrektur erforderlich war. Die Neuerungen und Korrekturen von Version 17 betreffen insbesondere Details, diese aber im Kern der beiden Systeme ebenso wie in fast allen Plattformen und angebundenen Sprachen.

Nach dem Wechsel auf C++17 im Frühjahr hat Clang die Nachfolger C++20, C++23 und C++2c (C++26) weiter ausgebaut. Bei C++20 unterstützt das Frontend die angekündigten Co-Routinen vollständig auf allen Plattformen, abgesehen von Windows, wo Probleme in der Stabilität und dem ABI (Application Binary Interface) auftreten. Bei C++23 kennt Clang nun die Option -std=c++23 und bei C++26 -std=c++2c sowie -std=gnu++2c. Für alle C++-Varianten hat das Frontend die Code-Generierung für -O0-Aufrufe zu std::forward_like verbessert, ähnlich wie zu std::move,std::forward und ähnlichen. Clang behandelt diese als Compiler-Interna anstatt die Definition aus der Standardbibliothek zu instanziieren.

Eine Vielzahl an Schaltern, mit denen die Programmiererinnen und Programmierer den Compiler-Prozess steuern, sind hinzugekommen oder entfallen. Neben der Ablösung von -std=c++2b ist zum Beispiel -fdouble-square-bracket-attributes obsolet. Mit dem neuen Schalter -fcaret-diagnostics-max-lines= kontrollieren Entwicklerinnen und Entwickler die maximale Anzahl an ausgegebenen Code-Zeilen für eine Caret-Diagnose. Beim Stichwort Diagnosen – dort gibt es ebenfalls Neuerungen: Etwa warnt das Clang-Team bei C++20, vor dem Einsatz von Capture von this durch =, da es offiziell überholt ist.

Für folgende Plattformen ergeben sich Änderungen, mit denen sich die Programmiererinnen und Entwickler gegebenenfalls vertraut machen sollten: Aarch64, Aix, Amdgpu, ARM, AVR, Cuda/Hip, Loongarch, Risc-V, Webassembly, PowerPC und x86. Hinzu kommt eine Fülle an Bugfixes in allen Bereichen.

Das LLVM-Team weist eigens auf Änderungen hin, die zu Problemen gegenüber den vorherigen Versionen führen können und die Entwicklerinnen und Programmierer im Auge behalten sollten. Bei C++ sucht Clang beispielsweise für Co-Routinen nun nicht mehr nach coroutine_traits im Namensraum std::experimental, sondern nur noch nach std::coroutine_traits. Weitere explizite Warnungen formuliert das Team für C und ABIs.

Am Backend hat sich ebenfalls einiges getan: Mit LLVM 17 erhöhen die Maintainer die Anforderung für den Build des Backends selbst auf mindestens CMake 3.20.0. Auf der IR-Schicht ignoriert LLVM 17 nun Typed- und Opaqued-Pointers. Instruktionen, die den angesprochenen Typ im Speicher kennen sollen, müssen das Typen-Argument selbst enthalten. Auch LLVMContextSetOpaquePointers in der C-API entfällt.

Eingefügt hat das Compiler-Team hingegen das nofpclass-Attribut, das mehr Optimierungen bei speziellen Gleitkomma-Vergleichen ermöglicht. In der Infrastruktur des Compiler-Backends hat das Entwickler-Team die veraltete Optimization Pipeline (PassManagerBuilder.h) durch die neue Passmanager-API ersetzt. Neu ist ferner eine FatLTO-Pipeline, mit der Entwickler Objektdateien erzeugen, die aus Maschinen- und LTO-Bitecode bestehen. Details finden sie in der FatLTO-Dokumentation.

An den LLVM-Tools haben die Maintainer ebenfalls signifikante Änderungen vorgenommen, beispielsweise ist der Json-Output von llvm-readobj und llvm-readelf nun korrekter und klarer. Plattformneuigkeiten im Backend gibt es für Aarch64, Amdgpu, ARM, Loongarch, PowerPC, Risc-V, Webassembly, x86. Für alle Plattformen entfallen die Python-Bindings.

Weitere Informationen zu allen Details und Bugfixes lesen Interessenten in den Change Logs von LLVM und Clang.

(who)