Veröffentlichung des LLVM 10.0-Compiler-Sets

Nach sechs Monaten Entwicklungszeit eingereicht Projektfreigabe LLVM 10.0 – GCC-kompatible Tools (Compiler, Optimierer und Codegeneratoren), die Programme in Zwischenbitcode von RISC-ähnlichen virtuellen Anweisungen kompilieren (virtuelle Maschine auf niedriger Ebene mit einem mehrstufigen Optimierungssystem). Der generierte Pseudocode kann direkt zum Zeitpunkt der Programmausführung mit einem JIT-Compiler in Maschinenanweisungen umgewandelt werden.

Zu den neuen Funktionen in LLVM 10.0 gehören die Unterstützung von C++-Konzepten, die Ausführung von Clang nicht mehr als separater Prozess, die Unterstützung von CFG-Prüfungen (Control Flow Guard) für Windows und die Unterstützung neuer CPU-Funktionen.

Verbesserungen in Clang 10.0:

  • Unterstützung hinzugefügt für „Konzept", eine C++-Vorlagenerweiterung, die im nächsten Standard mit dem Codenamen C++2a enthalten sein wird (aktiviert durch das Flag -std=c++2a).
    Mit Konzepten können Sie eine Reihe von Vorlagenparameteranforderungen definieren, die zur Kompilierungszeit die Menge der Argumente begrenzen, die als Vorlagenparameter akzeptiert werden können. Mithilfe der Konzepte können logische Inkonsistenzen zwischen den Eigenschaften der in der Vorlage verwendeten Datentypen und den Datentypeigenschaften der Eingabeparameter vermieden werden.

    Vorlage
    Konzept EqualityComparable = erfordert(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Standardmäßig wird der Start eines separaten Prozesses („clang -cc1“), in dem die Kompilierung durchgeführt wird, gestoppt. Die Kompilierung erfolgt nun im Hauptprozess und mit der Option „-fno-integrated-cc1“ kann das alte Verhalten wiederhergestellt werden.
  • Neue Diagnosemodi:
    • „-Wc99-designator“ und „-Wreorder-init-list“ warnen vor der Verwendung von C99-Initialisierern im C++-Modus, wenn sie in C99, aber nicht in C++20 korrekt sind.
    • „-Wsizeof-array-div“ – fängt Situationen wie „int arr[10]; …sizeof(arr) / sizeof(short)…“ (sollte „sizeof(arr) / sizeof(int)“ sein).
    • „-Wxor-used-as-po“ – warnt vor der Verwendung von Konstrukten wie der Verwendung des Operators „^“ (xor) in Operationen, die mit Potenzierung (2^16) verwechselt werden können.
    • „-Wfinal-dtor-non-final-class“ – warnt vor Klassen, die nicht mit dem Spezifizierer „final“ gekennzeichnet sind, aber einen Destruktor mit dem Attribut „final“ haben.
    • „-Wtautological-bitwise-compare“ ist eine Gruppe von Warnungen zur Diagnose tautologischer Vergleiche zwischen einer bitweisen Operation und einer Konstante und zur Identifizierung immer wahrer Vergleiche, bei denen die bitweise ODER-Operation auf eine nicht negative Zahl angewendet wird.
    • „-Wbitwise-conditional-parentheses“ warnt vor Problemen beim Mischen der logischen Operatoren AND (&) und OR (|) mit dem Bedingungsoperator (?:).
    • „-Wmisleading-indentation“ ist ein Analogon der gleichnamigen Prüfung von GCC, die vor eingerückten Ausdrücken warnt, als ob sie Teil eines if/else/for/while-Blocks wären, tatsächlich aber nicht in diesem Block enthalten sind .
    • Bei Angabe von „-Wextra“ ist die Prüfung „-Wdeprecated-copy“ aktiviert, die vor der Verwendung von Konstruktoren warnt
      „move“ und „copy“ in Klassen mit einer expliziten Destruktordefinition.

    • Die Prüfungen „-Wtautological-overlap-compare“, „-Wsizeof-pointer-div“, „-Wtautological-compare“ und „-Wrange-loop-analysis“ wurden erweitert.
    • Die Prüfungen „-Wbitwise-op-parentheses“ und „-Wlogical-op-parentheses“ sind standardmäßig deaktiviert.
  • In C- und C++-Code sind Zeigerarithmetikoperationen nur in Arrays zulässig. Der Sanitizer für undefiniertes Verhalten im Modus „-fsanitize=pointer-overflow“ fängt jetzt Fälle ab, wie das Hinzufügen eines Offsets ungleich Null zu einem Nullzeiger oder das Erstellen eines Nullzeigers beim Subtrahieren einer Ganzzahl von einem Zeiger ungleich Null.
  • Der Modus „-fsanitize=implicit-conversion“ (Implicit Conversion Sanitizer) ist darauf ausgelegt, Probleme mit Inkrementierungs- und Dekrementierungsoperationen für Typen zu identifizieren, deren Bitgröße kleiner als die des Typs „int“ ist.
  • Bei der Auswahl der x86-Zielarchitekturen sind „-march=skylake-avx512“, „-march=icelake-client“, „-march=icelake-server“, „-march=cascadelake“ und „-march=cooperlake“ standardmäßig in vektorisierter Form Der Code verwendet keine 512-Bit-ZMM-Register mehr, mit Ausnahme ihrer direkten Angabe im Quellcode. Der Grund dafür ist, dass die CPU-Frequenz bei der Ausführung von 512-Bit-Operationen abnimmt, was sich negativ auf die Gesamtleistung auswirken kann. Um das neue Verhalten zu ändern, steht die Option „-mprefer-vector-width=512“ zur Verfügung.
  • Das Verhalten des Flags „-flax-vector-conversions“ ähnelt dem von GCC: Implizite Vektorbitkonvertierungen zwischen Ganzzahl- und Gleitkommavektoren sind verboten. Um diese Einschränkung zu beseitigen, wird vorgeschlagen, die Flagge zu verwenden
    „-flax-vector-conversions=all“, was die Standardeinstellung ist.

  • Verbesserte Unterstützung für MIPS-CPUs der Octeon-Familie. „Octeon+“ zur Liste der gültigen CPU-Typen hinzugefügt.
  • Beim Zusammenstellen in WebAssembly-Zwischencode wird der wasm-opt-Optimierer automatisch aufgerufen, sofern im System verfügbar.
  • Bei Systemen, die auf der RISC-V-Architektur basieren, ist die Verwendung von Registern, die Gleitkommawerte speichern, in bedingten Blöcken von Assembler-Inline-Einfügungen zulässig.
  • Neue Compiler-Flags hinzugefügt: „-fgnuc-version“, um den Versionswert für „__GNUC__“ und ähnliche Makros festzulegen; „-fmacro-prefix-map=OLD=NEW“ zum Ersetzen des Verzeichnispräfixes OLD durch NEW in Makros wie „__FILE__“; „-fpatchable-function-entry=N[,M]“, um eine bestimmte Anzahl von NOP-Anweisungen vor und nach dem Funktionseintrittspunkt zu generieren. Für RISC-V
    Unterstützung für die Flags „-ffixed-xX“, „-mcmodel=medany“ und „-mcmodel=medlow“ hinzugefügt.

  • Unterstützung für das Attribut „__attribute__((target(“branch-protection=..."))) hinzugefügt, dessen Wirkung der Option ähnelt -mbranch-protection.
  • Auf der Windows-Plattform wird bei Angabe des Flags „-cfguard“ die Ersetzung indirekter Funktionsaufrufe durch Integritätsprüfungen des Ausführungsflusses (Control Flow Guard) implementiert. Um die Prüfersetzung zu deaktivieren, können Sie das Flag „-cfguard-nochecks“ oder den Modifikator „__declspec(guard(nocf))“ verwenden.
  • Das Verhalten des gnu_inline-Attributs ähnelt dem von GCC, wenn es ohne das Schlüsselwort „extern“ verwendet wird.
  • Die mit der OpenCL- und CUDA-Unterstützung verbundenen Funktionen wurden erweitert. Unterstützung für neue OpenMP 5.0-Funktionen hinzugefügt.
  • Dem Dienstprogramm clang-format wurde eine Standardoption hinzugefügt, mit der Sie die Version des C++-Standards bestimmen können, die beim Parsen und Formatieren von Code verwendet wird (Neueste, Auto, c++03, c++11, c++14, c++17, c++20 ).
  • Dem statischen Analysator wurden neue Prüfungen hinzugefügt: alpha.cplusplus.PlacementNew, um festzustellen, ob ausreichend Speicherplatz vorhanden ist, fuchsia.HandleChecker, um Lecks im Zusammenhang mit Fuchsia-Handlern zu erkennen, security.insecureAPI.decodeValueOfObjCType, um mögliche Pufferüberläufe bei Verwendung von [NSCoder decodeValueOfObjCType :bei:] .
  • Der Undefined Behavior Sanitizer (UBSan) hat seine Zeigerüberlaufprüfungen erweitert, um die Anwendung von Offsets ungleich Null auf NULL-Zeiger oder die daraus resultierende Hinzufügung eines NULL-Zeigeroffsets zu erkennen.
  • Im Linter klirrend aufgeräumt hinzugefügt ein großer Teil der neuen Schecks.

Haupt- Innovationen LLVM 10.0:

  • Zum Rahmen Attributor Neue interprozedurale Optimierungen und Analysatoren wurden hinzugefügt. Der Zustand von 19 verschiedenen Attributen wird vorhergesagt, darunter 12 Attribute, 12 LLVM-IR und 7 abstrakte Attribute wie Lebendigkeit.
  • Neue mathematische Matrixfunktionen hinzugefügt, die in den Compiler integriert sind (Eigenheiten), die beim Kompilieren durch effiziente Vektoranweisungen ersetzt werden.
  • An den Backends für X86-, AArch64-, ARM-, SystemZ-, MIPS-, AMDGPU- und PowerPC-Architekturen wurden zahlreiche Verbesserungen vorgenommen. CPU-Unterstützung hinzugefügt
    Cortex-A65, Cortex-A65AE, Neoverse E1 und Neoverse N1. Für ARMv8.1-M wurde der Codegenerierungsprozess optimiert (z. B. Unterstützung für Schleifen mit minimalem Overhead) und Unterstützung für Autovektorisierung mithilfe der MVE-Erweiterung hinzugefügt. Verbesserte CPU MIPS Octeon-Unterstützung. Für PowerPC ist die Vektorisierung mathematischer Unterprogramme mithilfe der MASSV-Bibliothek (Mathematical Acceleration SubSystem) aktiviert, die Codegenerierung verbessert und der Speicherzugriff aus Schleifen optimiert. Für x86 wurde die Behandlung der Vektortypen v2i32, v4i16, v2i16, v8i8, v4i8 und v2i8 geändert.

  • Verbesserter Codegenerator für WebAssembly. Unterstützung für TLS (Thread-Local Storage) und atomic.fence-Anweisungen hinzugefügt. Die SIMD-Unterstützung wurde deutlich erweitert. WebAssembly-Objektdateien haben jetzt die Möglichkeit, mehrwertige Funktionssignaturen zu verwenden.
  • Der Analysator wird bei der Verarbeitung von Schleifen verwendet SpeicherSSA, mit dem Sie Abhängigkeiten zwischen verschiedenen Speicheroperationen definieren können. MemorySSA kann die Kompilierungs- und Ausführungszeit verkürzen oder ohne Leistungsverlust anstelle von AliasSetTracker verwendet werden.
  • Der LLDB-Debugger hat die Unterstützung für das DWARF v5-Format deutlich verbessert. Verbesserte Unterstützung für das Erstellen mit MinGW
    und die anfängliche Möglichkeit hinzugefügt, ausführbare Windows-Dateien für ARM- und ARM64-Architekturen zu debuggen. Beschreibungen der Optionen hinzugefügt, die beim automatischen Vervollständigen von Eingaben durch Drücken der Tabulatortaste angeboten werden.

  • Erweitert LLD-Linker-Funktionen. Verbesserte Unterstützung für das ELF-Format, einschließlich vollständiger Kompatibilität von Glob-Vorlagen mit dem GNU-Linker, zusätzliche Unterstützung für komprimierte Debug-Abschnitte „.zdebug“ und Hinzufügung der Eigenschaft PT_GNU_PROPERTY zur Definition des Abschnitts .note.gnu.property (kann in zukünftigem Linux verwendet werden). Kerne),
    Die Modi „-z Noseparate-Code“, „-z Separate-Code“ und „-z Separate-Loadable-Segmente“ wurden implementiert. Verbesserte Unterstützung für MinGW und WebAssembly.

Source: opennet.ru

Kommentar hinzufügen