Wydanie zestawu kompilatorów LLVM 11.0

Po sześciu miesiącach rozwoju przedstawione wydanie projektu LLVM 11.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.

Kluczową zmianą w nowej wersji było dodanie Kołnierz, nakładka dla języka Fortran. Flang obsługuje Fortran 2018, OpenMP 4.5 i OpenACC 3.0, jednak rozwój projektu nie został jeszcze ukończony, a front-end ogranicza się do parsowania kodu i sprawdzania poprawności. Generowanie kodu pośredniego LLVM nie jest jeszcze obsługiwane, a w celu wygenerowania plików wykonywalnych generowany jest kod kanoniczny i przekazywany do zewnętrznego kompilatora języka Fortran.

Improvements w Clangu 11.0:

  • Dodano możliwość przywrócenia abstrakcyjnego drzewa składni (AST) w przypadku uszkodzonego kodu C++, który może pomóc w diagnozowaniu błędów i dostarcza dodatkowych informacji zewnętrznym narzędziom, takim jak clang-tidy i clangd. Ta funkcja jest domyślnie włączona dla kodu C++ i jest kontrolowana za pomocą opcji „-Xclang -f[no-]recovery-ast”.
  • Dodano nowe tryby diagnostyczne:
    • „-Wpointer-to-int-cast” to grupa ostrzeżeń dotyczących rzutowania wskaźników na typ całkowity int, który nie uwzględnia wszystkich możliwych wartości.
    • „-Wuninitialized-const-reference” - ostrzeżenie o przekazywaniu niezainicjowanych zmiennych w parametrach funkcji akceptujących argumenty referencyjne z atrybutem „const”.
    • "-Wimplicit-const-int-float-conversion" - domyślnie włączone ostrzeżenie o niejawnej konwersji stałej rzeczywistej na typ całkowity.
  • Dla platformy ARM dostępne są funkcje C wbudowane w kompilator (Istota), zastąpione wydajnymi instrukcjami wektorowymi Arm v8.1-M MVE i CDE. Dostępne funkcje są zdefiniowane w plikach nagłówkowych arm_mve.h i arm_cde.h.
  • обавлен zestaw rozszerzonych typów całkowitych _ExtInt(N), pozwalający na tworzenie typów, które nie są wielokrotnościami potęgi dwójki, które mogą być efektywnie przetwarzane na FPGA/HLS. na przykład, _ExtInt(7) definiuje typ całkowity składający się z 7 bitów.
  • Dodano makra definiujące obsługę wbudowanych funkcji C w oparciu o instrukcje ARM SVE (Scalable Vector Extension):
    __ARM_FEATURE_SVE, __ARM_FEATURE_SVE_BF16,
    __ARM_FEATURE_SVE_MATMUL_FP32, __ARM_FEATURE_SVE_MATMUL_FP64,
    __ARM_FEATURE_SVE_MATMUL_INT8,
    __ARM_FEATURE_SVE2, __ARM_FEATURE_SVE2_AES,
    __ARM_FEATURE_SVE2_BITPERM,
    __ARM_FEATURE_SVE2_SHA3,
    __ARM_FEATURE_SVE2_SM4. Na przykład makro __ARM_FEATURE_SVE jest definiowane podczas generowania kodu AArch64 poprzez ustawienie opcji wiersza poleceń „-march=armv8-a+sve”.

  • Flaga „-O” jest teraz identyfikowana z trybem optymalizacji „-O1” zamiast „-O2”.
  • Dodano nowe flagi kompilatora:
    • "-fstack-clash-protection" - włącza ochronę przed przecięcia stosu i sterty.
    • "-ffp-exception-behavior={ignore,maytrap,strict}" - pozwala wybrać tryb obsługi wyjątków dla liczb zmiennoprzecinkowych.
    • "-ffp-model={precise,strict,fast}" - Upraszcza dostęp do szeregu wyspecjalizowanych opcji dla liczb zmiennoprzecinkowych.
    • „-fpch-codegen” i „-fpch-debuginfo”, aby wygenerować prekompilowany nagłówek (PCH) z oddzielnymi plikami obiektowymi dla kodu i informacji o debugowaniu.
    • „-fsanitize-coverage-allowlist” i „-fsanitize-coverage-blocklist” do sprawdzania białych i czarnych list testowania zasięgu.
    • „-mtls-size={12,24,32,48}”, aby wybrać rozmiar TLS (lokalnego magazynu wątków).
    • „-menable-experimental-extension”, aby umożliwić eksperymentalne rozszerzenia RISC-V.
  • Domyślnym trybem dla C jest „-fno-common”, który pozwala na bardziej efektywny dostęp do zmiennych globalnych na niektórych platformach.
  • Domyślna pamięć podręczna modułu została przeniesiona z /tmp do katalogu ~/.cache. Aby to zastąpić, możesz użyć flagi „-fmodules-cache-path=”.
  • Domyślny standard języka C został zaktualizowany z gnu11 do gnu17.
  • Dodano wstępną obsługę rozszerzenia GNU C”asm wbudowany» aby dodać wkładki asemblera. Rozszerzenie jest nadal analizowane, ale nie jest w żaden sposób przetwarzane.
  • Rozszerzono możliwości związane z obsługą OpenCL i CUDA. Dodano obsługę diagnostyki bloków OpenCL 2.0 i zaimplementowano nowe funkcje OpenMP 5.0.
  • Dodano opcję IndentExternBlock do narzędzia formatu clang w celu wyrównania w blokach extern „C” i extern „C++”.
  • Analizator statyczny usprawnił obsługę dziedziczonych konstruktorów w języku C++. Dodano nowe kontrole alpha.core.C11Lock i alpha.fuchsia.Lock do sprawdzania blokad, alpha.security.cert.pos.34c do wykrywania niebezpiecznego użycia putenv, webkit.NoUncountedMemberChecker i webkit.RefCntblBaseVirtualDtor do wykrywania problemów z niezliczonymi typami, alfa .cplusplus .SmartPtr do sprawdzania dereferencji inteligentnego wskaźnika o wartości zerowej.
  • W linterze - schludnie dodany duża część nowych czeków.
  • Serwer buforujący clangd (Clang Server) poprawił wydajność i dodał nowe możliwości diagnostyczne.

Głównym innowacje LLVM 11.0:

  • System kompilacji został przełączony na używanie Pythona 3. Jeśli Python 3 nie jest dostępny, możliwe jest przywrócenie używania Pythona 2.
  • Frontend z kompilatorem dla języka Go (llgo) jest wyłączony z wydania, które może zostać w przyszłości zrestrukturyzowane.
  • Atrybut funkcji wektorowej-abi-wariantu został dodany do reprezentacji pośredniej (IR) w celu opisania mapowania pomiędzy funkcjami skalarnymi i wektorowymi w celu wektoryzacji wywołań. Z llvm::VectorType istnieją dwa oddzielne typy wektorów llvm::FixedVectorType i llvm::ScalableVectorType.
  • Rozgałęzianie w oparciu o wartości udef i przekazywanie wartości undef do standardowych funkcji bibliotecznych uznawane jest za zachowanie niezdefiniowane. W
    memset/memcpy/memmove pozwala na przekazywanie wskaźników undef, ale jeśli parametr o rozmiarze wynosi zero.

  • LLJIT dodał obsługę wykonywania inicjalizacji statycznych za pomocą metod LLJIT::initialize i LLJIT::deinitialize. Zaimplementowano możliwość dodawania bibliotek statycznych do JITDylib przy użyciu klasy StaticLibraryDefinitionGenerator. Dodano API C dla ORCv2 (API do budowania kompilatorów JIT).
  • Do backendu architektury AArch64 dodano obsługę procesorów Cortex-A34, Cortex-A77, Cortex-A78 i Cortex-X1. Zaimplementowano rozszerzenia ARMv8.2-BF16 (BFloat16) i ARMv8.6-A, w tym RMv8.6-ECV (Enhanced Counter Virtualization), ARMv8.6-FGT (Fine Grained Traps), ARMv8.6-AMU (wirtualizacja monitorów aktywności) i ARMv8.0-DGH (wskazówka dotycząca gromadzenia danych). Zapewniona jest możliwość generowania kodu dla wbudowanych funkcji-powiązań z instrukcjami wektorowymi SVE.
  • Do backendu architektury ARM dodano obsługę procesorów Cortex-M55, Cortex-A77, Cortex-A78 i Cortex-X1. Zaimplementowano rozszerzenia
    Mnożenie macierzy Armv8.6-A i RMv8.2-AA32BF16 BFloat16.

  • Do backendu architektury PowerPC dodano obsługę generowania kodu dla procesorów POWER10. Rozszerzono optymalizację pętli i poprawiono obsługę zmiennoprzecinkową.
  • Zaplecze architektury RISC-V umożliwia akceptację poprawek obsługujących eksperymentalne rozszerzone zestawy instrukcji, które nie zostały jeszcze oficjalnie zatwierdzone.
  • Backend dla architektury AVR został przeniesiony z kategorii eksperymentalnej do wersji stabilnej, zawartej w podstawowej dystrybucji.
  • Backend dla architektury x86 obsługuje instrukcje Intel AMX i TSXLDTRK. Dodano ochronę przed atakami LVI (Load Value Injection), a także implementuje ogólny mechanizm tłumienia skutków ubocznych wykonywania spekulatywnego w celu blokowania ataków spowodowanych spekulatywnym wykonywaniem operacji na procesorze.
  • W backendie architektury SystemZ dodano obsługę MemorySanitizer i LeakSanitizer.
  • Dodano obsługę pliku nagłówkowego ze stałymi matematycznymi do Libc++ .
  • Rozszerzony Możliwości łącznika LLD. Ulepszona obsługa formatu ELF, w tym dodane opcje „--lto-emit-asm”, „--lto-whole-program-visibility”, „-print-archive-stats”, „-shuffle-sections”, „ -thinlto- pojedynczy moduł", "-unique", "-rosegment", "-threads=N". Dodano opcję „--time-trace” umożliwiającą zapisanie śledzenia w pliku, który można następnie przeanalizować za pomocą interfejsu chrome://tracing w przeglądarce Chrome.

Źródło: opennet.ru

Dodaj komentarz