Wydanie zestawu kompilatorów LLVM 9.0

Po sześciu miesiącach rozwoju przedstawione wydanie projektu LLVM 9.0 — Narzędzia kompatybilne z GCC (kompilatory, optymalizatory i generatory kodu), kompilujące programy do pośredniego kodu bitowego instrukcji wirtualnych typu RISC (maszyna wirtualna niskiego poziomu z wielopoziomowym systemem optymalizacji). Wygenerowany pseudokod można przekonwertować za pomocą kompilatora JIT na instrukcje maszynowe bezpośrednio w momencie wykonywania programu.

Nowe funkcje LLVM 9.0 obejmują usunięcie znacznika projektu eksperymentalnego z docelowej platformy RISC-V, obsługę C++ dla OpenCL, możliwość podziału programu na dynamicznie ładowane części w LLD oraz implementację „asm, muszę", używany w kodzie jądra Linuksa. Biblioteka libc++ dodała obsługę WASI (interfejs systemowy WebAssembly), a LLD dodała wstępną obsługę dynamicznego łączenia zestawu WebAssembly.

Improvements w Clangu 9.0:

  • Dodany implementacja wyrażenia specyficznego dla GCC „asm, muszę„, który pozwala na przejście z wbudowanego bloku asemblera do etykiety w kodzie C. Ta funkcja jest wymagana do zbudowania jądra Linuksa w trybie „CONFIG_JUMP_LABEL=y” przy użyciu Clang na systemach z architekturą x86_64. Biorąc pod uwagę zmiany dodane w poprzednich wydaniach, jądro Linuksa można teraz zbudować w Clang dla architektury x86_64 (wcześniej obsługiwane było tylko budowanie dla architektur arm, aarch64, ppc32, ppc64le i mips). Co więcej, projekty na Androida i ChromeOS zostały już przekonwertowane tak, aby korzystały z Clang do budowania jądra, a Google testuje Clang jako główną platformę do budowania jąder dla swoich produkcyjnych systemów Linux. W przyszłości w procesie budowania jądra będzie można używać innych komponentów LLVM, w tym LLD, llvm-objcopy, llvm-ar, llvm-nm i llvm-objdump;
  • Dodano eksperymentalne wsparcie dla używania C++ 17 w OpenCL. Specyficzne funkcje obejmują obsługę atrybutów przestrzeni adresowej, blokowanie konwersji przestrzeni adresowej przez operatory rzutowania typów, udostępnianie typów wektorowych jak w OpenCL dla C, obecność określonych typów OpenCL dla obrazów, zdarzeń, kanałów itp.
  • Dodano nowe flagi kompilatora „-ftime-trace” i „-ftime-trace-granularity=N” umożliwiające wygenerowanie raportu czasu wykonania różnych etapów frontendu (parsowanie, inicjalizacja) i backendu (etapy optymalizacji). Raport zapisywany jest w formacie json, kompatybilnym z chrome://tracing i speedscope.app;
  • Dodano przetwarzanie specyfikatora „__declspec(allocator)” i generowanie towarzyszących informacji debugowania, które umożliwiają monitorowanie zużycia pamięci w środowisku Visual Studio;
  • Dla języka C dodano obsługę makra „__FILE_NAME__”, które przypomina makro „__FILE__”, ale zawiera jedynie nazwę pliku bez pełnej ścieżki;
  • C++ rozszerzyło obsługę atrybutów przestrzeni adresowej, aby objąć różne funkcje C++, w tym wzorce parametrów i argumentów, typy referencyjne, wnioskowanie o typie zwracanym, obiekty, funkcje generowane automatycznie, wbudowane operatory i nie tylko.
  • Rozszerzone zostały możliwości związane ze wsparciem OpenCL, OpenMP i CUDA. Obejmuje to wstępną obsługę niejawnego włączania wbudowanych funkcji OpenCL (dodano flagę „-fdeclare-opencl-builtins”), zaimplementowano rozszerzenie cl_arm_integer_dot_product i rozszerzono narzędzia diagnostyczne;
  • Usprawniono pracę analizatora statycznego oraz dodano dokumentację dotyczącą wykonywania analiz statycznych. Dodano flagi do wyświetlania dostępnych modułów sprawdzania i obsługiwanych opcji („-analyzer-checker[-opcja]-help”, „-analyzer-checker[-opcja]-help-alpha” i „-analyzer-checker[-opcja]-help ”-deweloper”). Dodano flagę „-analyzer-werror”, aby traktować ostrzeżenia jako błędy.
    Dodano nowe tryby weryfikacji:

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling umożliwiający identyfikację niebezpiecznych praktyk związanych z pracą z buforami;
    • osx.MIGChecker do wyszukiwania naruszeń reguł wywołań MIG (Mach Interface Generator);
    • optin.osx.OSObjectCStyleCast, aby znaleźć nieprawidłowe konwersje obiektów XNU libkern;
    • apiModeling.llvm z zestawem funkcji sprawdzających modelowanie w celu wykrycia błędów w kodzie LLVM;
    • Stabilizowany kod do sprawdzania niezainicjowanych obiektów C++ (UninitializedObject w pakiecie optin.cplusplus);
  • Narzędzie clang-format dodało obsługę formatowania kodu w języku C# i zapewnia obsługę stylu formatowania kodu używanego przez firmę Microsoft;
  • clang-cl, alternatywny interfejs wiersza poleceń, który zapewnia zgodność na poziomie opcji z kompilatorem cl.exe zawartym w programie Visual Studio, dodał heurystyki umożliwiające traktowanie nieistniejących plików jako opcji wiersza poleceń i wyświetlanie odpowiedniego ostrzeżenia (na przykład podczas uruchamiania „clang-cl /diagnostic :caret /c test.cc”);
  • Do systemu linter clang-tidy dodano dużą część nowych kontroli, w tym dodatkowe kontrole specyficzne dla API OpenMP;
  • Rozszerzony możliwości serwera brzęk (Clang Server), w którym domyślnie włączony jest tryb budowania indeksu w tle, dodano obsługę akcji kontekstowych z kodem (pobieranie zmiennych, rozszerzanie definicji auto i makr, konwersja ciągów znaków ze zmianą znaczenia na nieunescape), możliwość wyświetlania ostrzeżenia z Clang-tidy, rozszerzona diagnostyka błędów w plikach nagłówkowych i dodana możliwość wyświetlania informacji o hierarchii typów;

Głównym innowacje LLVM 9.0:

  • Do linkera LLD dodano eksperymentalną funkcję partycjonowania, która umożliwia podzielenie jednego programu na kilka części, z których każda znajduje się w osobnym pliku ELF. Funkcja ta pozwala na uruchomienie głównej części programu, która w miarę potrzeb w trakcie pracy załaduje inne komponenty (można na przykład wydzielić wbudowaną przeglądarkę plików PDF do osobnego pliku, który będzie ładowany dopiero wtedy, gdy użytkownik otworzy plik PDF plik).

    Linker LLD przyniósł do stanu odpowiedniego do połączenia jądra Linuksa dla architektur arm32_7, arm64, ppc64le i x86_64.
    Nowe opcje „-” (wyjście na standardowe wyjście), „-[no-]allow-shlib-undefiniowane”, „-undefiniowane-glob”, „-nmagic”, „-omagic”, „-dependent-library”, „ - z ifunc-noplt” i „-z wspólny rozmiar-strony”. Dla architektury AArch64 dodano obsługę instrukcji BTI (Branch Target Indicator) i PAC (Pointer Authentication Code). Znacząco poprawiono obsługę platform MIPS, RISC-V i PowerPC. Dodano wstępną obsługę dynamicznego łączenia dla WebAssembly;

  • W libc++ wdrożony funkcje ssize, std::is_constant_evaluated, std::midpoint i std::lerp, do std::span dodano metody „front” i „back”, dodano atrybuty typów std::is_unbounded_array i std::is_bounded_array , rozszerzono możliwości std: :atomic. Zakończono obsługę GCC 4.9 (można używać z GCC 5.1 i nowszymi wersjami). Dodano wsparcie CZY BYŁEM (Interfejs systemu WebAssembly, interfejs umożliwiający korzystanie z WebAssembly poza przeglądarką);
  • Dodano nowe optymalizacje. Włączono konwersję wywołań memcmp na bcmp w niektórych sytuacjach. Zaimplementowano pominięcie sprawdzania zasięgu dla tabel skoków, w których dolne bloki przełączników są nieosiągalne lub gdy instrukcje nie są używane, na przykład podczas wywoływania funkcji typu void;
  • Ustabilizowano backend architektury RISC-V, który nie jest już pozycjonowany jako eksperymentalny i jest budowany domyślnie. Zapewnia pełną obsługę generowania kodu dla wariantów zestawu instrukcji RV32I i RV64I z rozszerzeniami MAFDC;
  • Wprowadzono liczne ulepszenia w backendach dla architektur X86, AArch64, ARM, SystemZ, MIPS, AMDGPU i PowerPC. Na przykład o architekturze
    AArch64 dodał obsługę instrukcji SVE2 (Scalable Vector Extension 2) i MTE (Memory Tagging Extensions); w backendie ARM dodano obsługę architektury Armv8.1-M i rozszerzenia MVE (M-Profile Vector Extension). Do backendu AMDGPU dodano obsługę architektury GFX10 (Navi), możliwości wywoływania funkcji są domyślnie włączone i aktywowane jest przejście łączone DPP (Prytywy równoległe do danych).

  • Debuger LLDB ma teraz podświetlanie kolorami śladów wstecznych i dodał obsługę bloków DWARF4 debug_types i DWARF5 debug_info;
  • Do narzędzi llvm-objcopy i llvm-strip dodano obsługę plików obiektowych i wykonywalnych w formacie COFF.

Źródło: opennet.ru

Dodaj komentarz