Nach sechs Monaten Entwicklung wurde die Version 12.0 des LLVM-Projekts veröffentlicht â ein GCC-kompatibles Toolset (Compiler, Optimierer und Codegeneratoren), das Programme in einen Zwischen-Bitcode fĂŒr RISC-Ă€hnliche virtuelle Anweisungen kompiliert (eine niedrigstufige virtuelle Maschine mit einem mehrstufigen Optimierungssystem). Der generierte Pseudocode kann mithilfe eines JIT-Compilers wĂ€hrend der ProgrammausfĂŒhrung direkt in Maschinenanweisungen umgewandelt werden.
Verbesserungen in Clang 12.0:
- Die UnterstĂŒtzung fĂŒr die im C++20-Standard vorgeschlagenen Attribute "likely" und "unlikely" wurde implementiert und ist standardmĂ€Ăig aktiviert. Diese Attribute informieren den Optimierer ĂŒber die Wahrscheinlichkeit, dass eine Bedingung zutrifft (z. B. "[[likely]] if (random > 0) {").
- UnterstĂŒtzung fĂŒr AMD Zen 3-Prozessoren (-march=znver3), Intel Alder Lake (-march=alderlake) und Intel Sapphire Rapids (-march=sapphirerapids) wurde hinzugefĂŒgt.
- Flags wie "-march=x86-64-v[234]" zur Auswahl der Architekturversionen x86-64 wurden implementiert (v2 â umfasst die Erweiterungen SSE4.2, SSSE3, POPCNT und CMPXCHG16B; v3 â AVX2 und MOVBE; v4 â AVX-512).
- UnterstĂŒtzung fĂŒr Arm Cortex-A78C (cortex-a78c), Arm Cortex-R82 (cortex-r82), Arm Neoverse V1 (neoverse-v1), Arm Neoverse N2 (neoverse-n2) und Fujitsu A64FX (a64fx) wurde hinzugefĂŒgt. Um beispielsweise Optimierungen fĂŒr die CPU Neoverse-V1 zu aktivieren, kann â-mcpu=neoverse-v1â angegeben werden.
- Neue Compiler-Flags â-moutline-atomicsâ und â-mno-outline-atomicsâ wurden fĂŒr die AArch64-Architektur hinzugefĂŒgt, um Hilfsfunktionen fĂŒr atomare Operationen wie â__aarch64_cas8_relaxâ ein- und auszuschalten. Diese Funktionen bestimmen zur Laufzeit die VerfĂŒgbarkeit der LSE (Large System Extensions) und verwenden die bereitgestellten atomaren Prozessoranweisungen oder fallen auf LL/SC (Load-link/store-conditional) zur Synchronisation zurĂŒck.
- Die Option â-fbinutils-versionâ wurde hinzugefĂŒgt, um die Zielversion des Binutils-Satzes auszuwĂ€hlen, um die KompatibilitĂ€t mit dem alten Verhalten des Linkers und Assembler sicherzustellen.
- FĂŒr ELF ausfĂŒhrbare Dateien ist bei Angabe der Option â-gzâ standardmĂ€Ăig die Kompression von Debug-Informationen mit der zlib-Bibliothek aktiviert (gz=zlib). Zum Verlinken der resultierenden Objektdateien wird lld oder GNU Binutils 2.26+ benötigt. Um die KompatibilitĂ€t mit Ă€lteren Versionen von Binutils wiederherzustellen, kann â-gz=zlib-gnuâ angegeben werden.
- Der Zeiger âthisâ wird jetzt mit Nonnull- und DereferenzierbarkeitsprĂŒfungen (N) verarbeitet. Um das Attribut Nonnull zu entfernen, wenn NULL-Werte verwendet werden sollen, kann die Option â-fdelete-null-pointer-checksâ verwendet werden.
- Auf der Linux-Plattform fĂŒr die Architekturen AArch64 und PowerPC ist der Modus â-fasynchronous-unwind-tablesâ aktiviert, um âentrollteâ (unwind) Aufruftabellen wie in GCC zu generieren.
- In â#pragma clang loop vectorize_widthâ wurde die Möglichkeit hinzugefĂŒgt, die Optionen âfixedâ (Standard) und âscalableâ zur Auswahl der Vektorisierungsmethode anzugeben. Der Modus âscalableâ, der von der Vektor-LĂ€nge unabhĂ€ngig ist, ist experimentell und kann auf Hardware mit UnterstĂŒtzung fĂŒr skalierbare Vektorisierung verwendet werden.
- Verbesserte UnterstĂŒtzung fĂŒr Windows-Plattformen: Offizielle BinĂ€rversionen fĂŒr Windows auf Arm64-Systemen wurden bereitgestellt, einschlieĂlich des Clang-Compilers, des LLD-Linkers und der Laufzeitbibliotheken compiler-rt. Bei der Erstellung fĂŒr Zielplattformen von MinGW wird die Erweiterung .exe hinzugefĂŒgt, selbst bei der Kreuzkompilierung.
- Erweiterte Funktionen in Bezug auf UnterstĂŒtzung fĂŒr OpenCL, OpenMP und CUDA. Die Optionen â-cl-std=CL3.0â und â-cl-std=CL1.0â wurden hinzugefĂŒgt, um Makrovarianten fĂŒr OpenCL 3.0 und OpenCL 1.0 auszuwĂ€hlen. Die Diagnosetools wurden erweitert.
- UnterstĂŒtzung fĂŒr die Instruktionen HRESET, UINTR und AVXVNNI hinzugefĂŒgt, die in einigen Prozessoren auf Basis der x86-Architektur implementiert sind.
- Auf x86-Systemen wurde die UnterstĂŒtzung fĂŒr die Option â-mtune=<cpu>â aktiviert, die ausgewĂ€hlte mikroarchitektonische Optimierungen aktiviert, unabhĂ€ngig vom Wert von â-march=<cpu>â.
- Im statischen Analysator wurde die Verarbeitung bestimmter POSIX-Funktionen verbessert, und die Bestimmung der Ergebnisse bedingter Operationen bei Vergleichen mehrerer Zeichenwerte wurde erheblich optimiert. Neue PrĂŒfungen wurden hinzugefĂŒgt: fuchia.HandleChecker (bestimmt Deskriptoren in Strukturen), webkit.UncountedLambdaCapturesChecker sowie alpha.webkit.UncountedLocalVarsChecker (berĂŒcksichtigen die Besonderheiten des Umgangs mit Zeigern im WebKit-Engine-Code).
- In AusdrĂŒcken, die im Kontext von Konstanten verwendet werden, ist die Verwendung von eingebauten Funktionen wie __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateright*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __bit_scan_reverse, __bsrd, __bsrq, __bswap, __bswapd, __bswap64, __bswapq, _castf*, __rol* und __ror* erlaubt.
- Im Tool clang-format wurde die Option BitFieldColonSpacing hinzugefĂŒgt, um die Platzierung von Leerzeichen um Identifikatoren, Spalten und Felddefinitionen zu wĂ€hlen.
- Im Cache-Manager Server wurde der Speicherverbrauch von clangd (Clang Server) auf der Linux-Plattform bei lĂ€ngerer Nutzung erheblich reduziert (es erfolgt eine regelmĂ€Ăige AusfĂŒhrung von malloc_trim, um freie Speicherseiten an das Betriebssystem zurĂŒckzugeben).
Die Hauptneuerungen in LLVM 12.0:
- Die UnterstĂŒtzung fĂŒr das in Python geschriebene Build-Tool llvm-build wurde eingestellt. Stattdessen hat das Projekt vollstĂ€ndig auf das Build-System CMake umgestellt.
- Im Backend fĂŒr die Architektur AArch64 wurde die UnterstĂŒtzung fĂŒr Windows verbessert: die korrekte Generierung des Assemblerausgangs fĂŒr Zielsysteme mit Windows wurde sichergestellt, die Erstellung von Unwind-Daten fĂŒr Funktionsaufrufe wurde optimiert (die GröĂe dieser Daten wurde um 60 % reduziert), und es wurde die Möglichkeit hinzugefĂŒgt, Unwind-Daten mit den Assembler-Direktiven .seh_* zu erstellen.
- Im Backend fĂŒr die Architektur PowerPC wurden neue Optimierungen fĂŒr Schleifen und Inline-Entfaltung implementiert, die UnterstĂŒtzung fĂŒr die Power10-Prozessoren erweitert und die UnterstĂŒtzung fĂŒr MMA-Befehle zur Manipulation mit Matrizen verbessert. Zudem wurde die UnterstĂŒtzung fĂŒr das Betriebssystem AIX optimiert.
- Im Backend fĂŒr die x86-Architektur wurde die UnterstĂŒtzung fĂŒr AMD Zen 3-, Intel Alder Lake- und Intel Sapphire Rapids-Prozessoren sowie fĂŒr die Prozessoranweisungen HRESET, UINTR und AVXVNNI hinzugefĂŒgt. Die UnterstĂŒtzung fĂŒr die MPX (Memory Protection Extensions) zur ĂberprĂŒfung von Zeigern auf die Einhaltung der Speichergrenzen wurde eingestellt (diese Technologie hat sich nicht verbreitet und wurde bereits aus GCC und Clang entfernt). Im Assembler wurden die UnterstĂŒtzung fĂŒr die PrĂ€fixe {disp32} und {disp8} sowie die Suffixe .d32 und .d8 hinzugefĂŒgt, um die GröĂe der Operanden- und Sprungoffsets zu steuern. Ein neuer Attribut âtune-cpuâ wurde hinzugefĂŒgt, um die Aktivierung mikroarchitektonischer Optimierungen zu steuern.
- Im Problem-Detektor fĂŒr ganze Zahlen (integer sanitizer, â-fsanitize=integerâ) wurde ein neuer Modus â-fsanitize=unsigned-shift-baseâ hinzugefĂŒgt, um ĂberlĂ€ufe von vorzeichenlosen Ganzzahlen nach einem Links-Shift zu erkennen.
- In verschiedenen Detektoren (asan, cfi, lsan, msan, tsan, ubsan sanitizer) wurde die UnterstĂŒtzung fĂŒr Linux-Distributionen mit der Standardbibliothek Musl hinzugefĂŒgt.
- Die Möglichkeiten des LLD-Linkers wurden erweitert. Die UnterstĂŒtzung des ELF-Formats wurde verbessert, einschlieĂlich der Optionen ââdependency-fileâ, ââerror-handling-scriptâ, ââlto-pseudo-probe-for-profilingâ und ââno-lto-whole-program-visibilityâ. Die UnterstĂŒtzung fĂŒr MinGW wurde optimiert. FĂŒr das Mach-O-Format (macOS) wurde die UnterstĂŒtzung fĂŒr die Architekturen arm64, arm und i386 implementiert, ebenso wie Optimierungen wĂ€hrend der Bindung (LTO) und das Entrollen des Stacks bei der Ausnahmebehandlung.
- In Libc++ wurden neue Funktionen des C++20-Standards implementiert und die Entwicklung von Funktionen der Spezifikation C++2b eingeleitet. Es wurde die UnterstĂŒtzung fĂŒr den Bau ohne LokalisierungsunterstĂŒtzung (â-DLIBCXX_ENABLE_LOCALIZATION=OFFâ) und fĂŒr GerĂ€te zur Erzeugung pseudozufĂ€lliger Zahlen (â-DLIBCXX_ENABLE_RANDOM_DEVICE=OFFâ) hinzugefĂŒgt.
Quelle: opennet.ru
