Compiler-Infrastruktur: LLVM 16 vollzieht den Wechsel auf C++17

LLVM wechselt auf C++17 und bereitet auf kommende Standards vor. Die Compiler-Infrastruktur liefert zudem Updates für Backends wie ARM, LoongArch und RISC-V.

In Pocket speichern vorlesen Druckansicht 7 Kommentare lesen
Open Source, Open Access, Open Innovation, Allmende, Coypright, Urheberrecht

(Bild: EFKS/Shutterstock.com)

Lesezeit: 3 Min.
Von
  • Matthias Parbel

Pünktlich im Rahmen des turnusmäßigen Halbjahrestakts ist die Compiler-Infrastruktur LLVM in Version 16 erschienen. Der Clang-Compiler nutzt ab dem aktuellen Release standardmäßig C++17, baut aber auch die Implementierung neuerer Standards – insbesondere C++20 – weiter aus. Ergänzungen und Updates in LLVM 16 finden sich darüber hinaus bei den Backends, vor allem für ARM, LoongArch und RISC-V.

Wie bereits zur Veröffentlichung von LLVM 15 angekündigt, markiert C++17 (gnu++17) ab dem neuen Release den Standard für die Programmiersprachen C++ und ObjC++. Einhergehend mit diesen und weiteren Neuerungen in Clang 16 müssen Entwicklerinnen und Entwickler einige potenzielle Breaking Changes beim Update auf den neuen Compiler beachten. Um etwaige Inkompatibilitäten zu vermeiden, sollten beispielsweise Projekte, die Konfigurationsskripte verwenden, sicherstellen, dass sich die Ergebnisse vor beziehungsweise nach dem Setzen von -Werror=implicit-function-declarations oder -Wimplicit-int nicht ändern, denn deren Warnungen führen jetzt standardmäßig zu einem Fehler in C99, C11 und C17.

Clang erlaubt erstmals auch das Laden mehrerer Konfigurationsdateien. Dabei werden Dateien aus den Standardkonfigurationsverzeichnissen zuerst geladen – sofern nicht die --no-default-config-Option gesetzt ist. Alle weiteren Dateien, die explizit mit dem nun mehrfach einsetzbaren Compiler-Flag --config= versehen sind, werden danach geladen.

Mit Blick auf die zahlreichen Backends liefert LLVM 16 unter anderem Updates für ARM, LoongArch und RISC-V. Während im letzten Major Release die Architekturen ARMv9-A, ARMv9.1-A und ARMv9.2 neu hinzugefügt wurden, entfallen nun die Targets ARMv2, ARMv2A, ARMv3 und ARMv3M, da laut offizieller Begründung, LLVM bisher wohl nie in der Lage war, korrekten Code für diese Architektur-Versionen zu generieren. LoongArch gilt nicht länger als experimentelles Target und muss daher auch nicht mehr explizit für den Build mit dem Befehl LLVM_EXPERIMENTAL_TARGETS_TO_BUILD aktiviert werden. Für RISC-V steht zudem ein neuer User Guide parat, der einen detaillierten Überblick zum Einsatz des Backend und den von LLVM unterstützen RISC-V-Befehlssätzen liefert.

Eine interne Änderung betrifft den LLVM-Zwischencode (Intermediate Representation, IR). Die Funktionsattribute readnone, readonly, writeonly, argmemonly, inaccessiblememonly und inaccessiblemem_or_argmemonly wurden zusammengefasst und durch ein einziges Attribut ersetzt: memory(...). Ein Mapping von den alten auf das neue Attribut ist nun nach dem folgenden beispielhaften Muster möglich: inaccessiblemem_or_argmemonly -> memory(argmem: readwrite, inaccessiblemem: readwrite).

Ein detaillierter Überblick aller Neuerungen und Änderungen lässt sich den jeweiligen Release Notes zu Clang 16 und LLVM 16 entnehmen.

(map)