Veröffentlichung des LLVM 12.0-Compiler-Sets

Nach sechs Monaten Entwicklungszeit wurde die Veröffentlichung des LLVM 12.0-Projekts vorgestellt – ein GCC-kompatibles Toolkit (Compiler, Optimierer und Codegeneratoren), das Programme in Zwischenbitcode von RISC-ähnlichen virtuellen Anweisungen kompiliert (eine virtuelle Maschine auf niedriger Ebene mit a mehrstufiges Optimierungssystem). Der generierte Pseudocode kann direkt zum Zeitpunkt der Programmausführung mit einem JIT-Compiler in Maschinenanweisungen umgewandelt werden.

Verbesserungen in Clang 12.0:

  • Die Unterstützung für die im C++20-Standard vorgeschlagenen Attribute „wahrscheinlich“ und „unwahrscheinlich“ wurde implementiert und standardmäßig aktiviert, sodass der Optimierer über die Wahrscheinlichkeit der Auslösung des bedingten Konstrukts informiert werden kann (z. B. „[[wahrscheinlich ]] if (random > 0) {“).
  • Unterstützung für AMD Zen 3 (-march=znver3), Intel Alder Lake (-march=alderlake) und Intel Sapphire Rapids (-march=sapphirerapids) Prozessoren hinzugefügt.
  • Unterstützung für „-march=x86-64-v[234]“-Flags hinzugefügt, um x86-64-Architekturebenen auszuwählen (v2 – deckt die Erweiterungen SSE4.2, SSSE3, POPCNT und CMPXCHG16B ab; v3 – AVX2 und MOVBE; v4 – AVX-512 ).
  • Unterstützung für die Prozessoren Arm Cortex-A78C (cortex-a78c), Arm Cortex-R82 (cortex-r82), Arm Neoverse V1 (neoverse-v1), Arm Neoverse N2 (neoverse-n2) und Fujitsu A64FX (a64fx) hinzugefügt. Um beispielsweise Optimierungen für Neoverse-V1-CPUs zu ermöglichen, können Sie „-mcpu=neoverse-v1“ angeben.
  • Für die AArch64-Architektur wurden neue Compiler-Flags „-moutline-atomics“ und „-mno-outline-atomics“ hinzugefügt, um Hilfsfunktionen für atomare Operationen wie „__aarch64_cas8_relax“ zu aktivieren oder zu deaktivieren. Solche Funktionen erkennen zur Laufzeit, ob LSE-Unterstützung (Large System Extensions) verfügbar ist, und verwenden die bereitgestellten atomaren Prozessoranweisungen oder greifen zur Synchronisierung auf LL/SC-Anweisungen (Load-Link/Store-Conditional) zurück.
  • Option „-fbinutils-version“ hinzugefügt, um die Zielversion der Binutils-Suite auszuwählen, um Kompatibilität mit älterem Linker- und Assembler-Verhalten zu gewährleisten.
  • Wenn für ausführbare ELF-Dateien das Flag „-gz“ angegeben ist, ist die Komprimierung von Debugging-Informationen mithilfe der zlib-Bibliothek standardmäßig aktiviert (gz=zlib). Das Verknüpfen der resultierenden Objektdateien erfordert lld oder GNU binutils 2.26+. Um die Kompatibilität mit älteren Versionen von Binutils wiederherzustellen, können Sie „-gz=zlib-gnu“ angeben.
  • Der „this“-Zeiger wird jetzt mit Nicht-Null- und Dereferenzierbar(N)-Prüfungen verarbeitet. Um das Nicht-Null-Attribut zu entfernen, wenn Sie NULL-Werte verwenden müssen, können Sie die Option „-fdelete-null-pointer-checks“ verwenden.
  • Auf der Linux-Plattform ist der Modus „-fasynchronous-unwind-tables“ für die AArch64- und PowerPC-Architekturen aktiviert, um Unwind-Aufruftabellen zu generieren, wie in GCC.
  • In „#pragma clang loop vectorize_width“ wurde die Möglichkeit hinzugefügt, die Optionen „fixed“ (Standard) und „scalable“ anzugeben, um die Vektorisierungsmethode auszuwählen. Der „skalierbare“ Modus ist unabhängig von der Vektorlänge experimentell und kann auf Hardware verwendet werden, die skalierbare Vektorisierung unterstützt.
  • Verbesserte Unterstützung für die Windows-Plattform: Offizielle Binärassemblys für Windows auf Arm64-Systemen wurden vorbereitet, einschließlich des Clang-Compilers, des LLD-Linkers und der Compiler-RT-Laufzeitbibliotheken. Beim Erstellen für MinGW-Zielplattformen wird das Suffix .exe hinzugefügt, auch beim Cross-Compilieren.
  • Die mit der Unterstützung von OpenCL, OpenMP und CUDA verbundenen Funktionen wurden erweitert. Optionen „-cl-std=CL3.0“ und „-cl-std=CL1.0“ hinzugefügt, um Makrooptionen für OpenCL 3.0 und OpenCL 1.0 auszuwählen. Diagnosetools wurden erweitert.
  • Unterstützung für die in einigen x86-basierten Prozessoren implementierten HRESET-, UINTR- und AVXVNNI-Anweisungen hinzugefügt.
  • Auf x86-Systemen ist die Unterstützung für die Option „-mtune=“ aktiviert, wodurch ausgewählte Mikroarchitekturoptimierungen unabhängig vom Wert „-march=“ aktiviert werden.
  • Der statische Analysator hat die Verarbeitung einiger POSIX-Funktionen verbessert und die Ermittlung des Ergebnisses bedingter Operationen bei mehreren symbolischen Werten im Vergleich deutlich verbessert. Neue Prüfungen wurden hinzugefügt: fuchia.HandleChecker (definiert Handles in Strukturen), webkit.UncountedLambdaCapturesChecker Webkit und alpha.webkit.UncountedLocalVarsChecker (berücksichtigt die Besonderheiten der Arbeit mit Zeigern im WebKit-Engine-Code).
  • In Ausdrücken, die im Kontext von Konstanten verwendet werden, ist die Verwendung der integrierten Funktionen __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateright*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __bit_scan_reverse, __bsrd, __bsrq, __bswap, __bswapd, __bswap64, __ zulässig b swapq , _castf*, __rol* und __ror*.
  • Dem Dienstprogramm clang-format wurde eine BitFieldColonSpacing-Option hinzugefügt, um den Abstand um Bezeichner, Spalten und Felddefinitionen auszuwählen.
  • Der clangd-Caching-Server (Clang Server) auf der Linux-Plattform hat den Speicherverbrauch im Langzeitbetrieb erheblich reduziert (es werden periodische Aufrufe von malloc_trim bereitgestellt, um freie Speicherseiten an das Betriebssystem zurückzugeben).

Wichtige Neuerungen in LLVM 12.0:

  • Die Unterstützung für das in Python geschriebene Build-Tool llvm-build wurde eingestellt und stattdessen ist das Projekt vollständig auf die Verwendung des CMake-Build-Systems umgestiegen.
  • Im Backend für die AArch64-Architektur wurde die Unterstützung für die Windows-Plattform verbessert: Die korrekte Generierung der Assembler-Ausgabe für Ziel-Windows-Systeme wurde sichergestellt, die Generierung von Daten bei Unwind-Aufrufen wurde optimiert (die Größe dieser Daten wurde um 60 reduziert). %), die Möglichkeit, Abwicklungsdaten mithilfe von Assembler zu erstellen, wurde den Anweisungen .seh_* hinzugefügt.
  • Das Backend für die PowerPC-Architektur bietet neue Optimierungen für Schleifen und Inline-Bereitstellung, erweiterte Unterstützung für Power10-Prozessoren, zusätzliche Unterstützung für MMA-Anweisungen zur Matrixmanipulation und verbesserte Unterstützung für das AIX-Betriebssystem.
  • Das x86-Backend bietet Unterstützung für AMD Zen 3-, Intel Alder Lake- und Intel Sapphire Rapids-Prozessoren sowie HRESET-, UINTR- und AVXVNNI-Prozessoranweisungen. Unterstützung für MPX (Memory Protection Extensions) zur Überprüfung von Zeigern, um sicherzustellen, dass Speichergrenzen nicht mehr unterstützt werden (diese Technologie ist nicht weit verbreitet und wurde bereits aus GCC und Clang entfernt). Dem Assembler wurde Unterstützung für die Präfixe {disp32} und {disp8} sowie die Suffixe .d32 und .d8 hinzugefügt, um die Größe von Operandenoffsets und -sprüngen zu steuern. Neues Attribut „tune-cpu“ hinzugefügt, um die Einbeziehung mikroarchitektonischer Optimierungen zu steuern.
  • Ein neuer Modus „-fsanitize=unsigned-shift-base“ wurde dem Integer-Problemdetektor (Integer Sanitizer, „-fsanitize=integer“) hinzugefügt, um Überläufe von vorzeichenlosen Ganzzahlen nach einer Bitverschiebung nach links zu erkennen.
  • In verschiedenen Detektoren (asan, cfi, lsan, msan, tsan, ubsan sanitizer) wurde Unterstützung für Linux-Distributionen mit der Standard-Musl-Bibliothek hinzugefügt.
  • Die Fähigkeiten des LLD-Linkers wurden erweitert. Verbesserte Unterstützung für das ELF-Format, einschließlich der hinzugefügten Optionen „--dependency-file“, „-error-handling-script“, „-lto-pseudo-probe-for-profiling“, „-no-lto-whole-program -Sichtbarkeit“ Verbesserte MinGW-Unterstützung. Für das Mach-O-Format (macOS) wurden Unterstützung für arm64-, arm- und i386-Architekturen, Link-Time-Optimierungen (LTO) und Stack-Unwinding für die Ausnahmebehandlung implementiert.
  • Libc++ implementiert neue Funktionen des C++20-Standards und hat mit der Entwicklung von Funktionen der C++2b-Spezifikation begonnen. Unterstützung für das Erstellen mit deaktivierter Lokalisierungsunterstützung („-DLIBCXX_ENABLE_LOCALIZATION=OFF“) und Geräten zum Generieren von Pseudozufallszahlen („-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF“) hinzugefügt.

Source: opennet.ru

Kommentar hinzufügen