Κυκλοφορία της σουίτας μεταγλωττιστή LLVM 12.0

Μετά από έξι μήνες ανάπτυξης, παρουσιάστηκε η κυκλοφορία του έργου LLVM 12.0 - μια εργαλειοθήκη συμβατή με το GCC (μεταγλωττιστές, βελτιστοποιητές και γεννήτριες κώδικα) που μεταγλωττίζει προγράμματα σε ενδιάμεσο bitcode εικονικών οδηγιών τύπου RISC (μια εικονική μηχανή χαμηλού επιπέδου με σύστημα βελτιστοποίησης πολλαπλών επιπέδων). Ο ψευδοκώδικας που δημιουργείται μπορεί να μετατραπεί χρησιμοποιώντας έναν μεταγλωττιστή JIT σε οδηγίες μηχανής απευθείας τη στιγμή της εκτέλεσης του προγράμματος.

Βελτιώσεις στο Clang 12.0:

  • Η υποστήριξη για τα χαρακτηριστικά "πιθανόν" και "απίθανο" που προτείνονται στο πρότυπο C++20 έχει εφαρμοστεί και ενεργοποιηθεί από προεπιλογή, επιτρέποντας στον βελτιστοποιητή να ενημερώνεται σχετικά με την πιθανότητα ενεργοποίησης της υπό όρους κατασκευής (για παράδειγμα, "[[πιθανόν ]] εάν (τυχαία > 0) {“).
  • Προστέθηκε υποστήριξη για επεξεργαστές AMD Zen 3 (-march=znver3), Intel Alder Lake (-march=alderlake) και Intel Sapphire Rapids (-march=sapphirerapids).
  • Προστέθηκε υποστήριξη για σημαίες "-march=x86-64-v[234]" για επιλογή επιπέδων αρχιτεκτονικής x86-64 (v2 - καλύπτει επεκτάσεις SSE4.2, SSSE3, POPCNT και CMPXCHG16B; v3 - AVX2 και MOVBE; v4 - AVX-512 ) .
  • Προστέθηκε υποστήριξη για επεξεργαστές Arm Cortex-A78C (cortex-a78c), Arm Cortex-R82 (cortex-r82), Arm Neoverse V1 (neoverse-v1), Arm Neoverse N2 (neoverse-n2) και Fujitsu A64FX (a64fx). Για παράδειγμα, για να ενεργοποιήσετε τις βελτιστοποιήσεις για CPU Neoverse-V1, μπορείτε να καθορίσετε "-mcpu=neoverse-v1".
  • Για την αρχιτεκτονική AArch64, έχουν προστεθεί νέες σημαίες μεταγλωττιστή "-moutline-atomics" και "-mno-outline-atomics" για την ενεργοποίηση ή απενεργοποίηση των βοηθητικών λειτουργιών ατομικής λειτουργίας, όπως "__aarch64_cas8_relax". Τέτοιες λειτουργίες εντοπίζουν κατά το χρόνο εκτέλεσης εάν είναι διαθέσιμη η υποστήριξη LSE (Μεγάλες Επεκτάσεις Συστήματος) και χρησιμοποιούν τις παρεχόμενες οδηγίες ατομικού επεξεργαστή ή επιστρέφουν στη χρήση οδηγιών LL/SC (Load-link/store-conditional) για συγχρονισμό.
  • Προστέθηκε η επιλογή "-fbinutils-version" για την επιλογή της στοχευόμενης έκδοσης της σουίτας binutils για συμβατότητα με παλαιότερη συμπεριφορά σύνδεσης και συναρμολόγησης.
  • Για εκτελέσιμα αρχεία ELF, όταν έχει καθοριστεί η σημαία "-gz", η συμπίεση των πληροφοριών εντοπισμού σφαλμάτων χρησιμοποιώντας τη βιβλιοθήκη zlib είναι ενεργοποιημένη από προεπιλογή (gz=zlib). Η σύνδεση των αρχείων αντικειμένων που προκύπτουν απαιτεί lld ή GNU binutils 2.26+. Για να επαναφέρετε τη συμβατότητα με παλαιότερες εκδόσεις των binutils, μπορείτε να καθορίσετε "-gz=zlib-gnu".
  • Ο δείκτης 'αυτός' υποβάλλεται πλέον σε επεξεργασία με μη μηδενικούς και μη παραπομπούς (N) ελέγχους. Για να καταργήσετε το χαρακτηριστικό nonnull όταν χρειάζεται να χρησιμοποιήσετε τιμές NULL, μπορείτε να χρησιμοποιήσετε την επιλογή "-fdelete-null-pointer-checks".
  • Στην πλατφόρμα Linux, η λειτουργία "-fasynchronous-unwind-tables" είναι ενεργοποιημένη για τις αρχιτεκτονικές AArch64 και PowerPC για τη δημιουργία πινάκων κλήσεων ξετύλιξης, όπως στο GCC.
  • Στο "#pragma clang loop vectorize_width" προστέθηκε η δυνατότητα καθορισμού των επιλογών "fixed" (προεπιλογή) και "scalable" για την επιλογή της μεθόδου vectorization. Η "κλιμακούμενη" λειτουργία, ανεξάρτητα από το μήκος του διανύσματος, είναι πειραματική και μπορεί να χρησιμοποιηθεί σε υλικό που υποστηρίζει κλιμακούμενη διανυσματοποίηση.
  • Βελτιωμένη υποστήριξη για την πλατφόρμα Windows: Έχουν ετοιμαστεί επίσημες δυαδικές συναρμολογήσεις για Windows σε συστήματα Arm64, συμπεριλαμβανομένων των βιβλιοθηκών Clang compiler, LLD linker και compiler-rt runtime. Κατά τη δημιουργία για πλατφόρμες στόχου MinGW, προστίθεται το επίθημα .exe, ακόμη και κατά τη διασταυρούμενη μεταγλώττιση.
  • Οι δυνατότητες που σχετίζονται με την υποστήριξη για OpenCL, OpenMP και CUDA έχουν επεκταθεί. Προστέθηκαν οι επιλογές "-cl-std=CL3.0" και "-cl-std=CL1.0" για την επιλογή μακροεντολών για OpenCL 3.0 και OpenCL 1.0. Τα διαγνωστικά εργαλεία έχουν επεκταθεί.
  • Προστέθηκε υποστήριξη για τις οδηγίες HRESET, UINTR και AVXVNNI που υλοποιούνται σε ορισμένους επεξεργαστές που βασίζονται σε x86.
  • Σε συστήματα x86, η υποστήριξη για την επιλογή "-mtune=" είναι ενεργοποιημένη, επιτρέποντας επιλεγμένες μικροαρχιτεκτονικές βελτιστοποιήσεις ανεξάρτητα από την τιμή "-march=".
  • Ο στατικός αναλυτής έχει βελτιώσει την επεξεργασία ορισμένων συναρτήσεων POSIX και έχει βελτιώσει σημαντικά τον προσδιορισμό του αποτελέσματος των πράξεων υπό όρους όταν υπάρχουν πολλές συμβολικές τιμές στη σύγκριση. Προστέθηκαν νέοι έλεγχοι: fuchia.HandleChecker (καθορίζει λαβές σε δομές), webkit.UncountedLambdaCapturesChecker webkit και alpha.webkit.UncountedLocalVarsChecker (λαμβάνει υπόψη τις ιδιαιτερότητες της εργασίας με δείκτες στον κώδικα μηχανής WebKit).
  • Στις εκφράσεις που χρησιμοποιούνται στο πλαίσιο των σταθερών, η χρήση των ενσωματωμένων συναρτήσεων __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateright*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __bit_scan_reverse, __bit_scan_reverse, _bsd_scan_reverse, _bsd _ επιτρέπεται bswapq , _castf*, __rol* και __ror*.
  • Προστέθηκε μια επιλογή BitFieldColonSpacing στο βοηθητικό πρόγραμμα clang-format για να επιλέξετε το διάστημα γύρω από αναγνωριστικά, στήλες και ορισμούς πεδίων.
  • Ο διακομιστής clangd caching (Clang Server) στην πλατφόρμα Linux έχει μειώσει σημαντικά την κατανάλωση μνήμης κατά τη μακροχρόνια λειτουργία (παρέχονται περιοδικές κλήσεις προς malloc_trim για την επιστροφή σελίδων ελεύθερης μνήμης στο λειτουργικό σύστημα).

Βασικές καινοτομίες στο LLVM 12.0:

  • Η υποστήριξη για το εργαλείο δημιουργίας llvm-build γραμμένο σε Python έχει διακοπεί και, αντί αυτού, το έργο έχει αλλάξει εντελώς στη χρήση του συστήματος δημιουργίας CMake.
  • Στο backend για την αρχιτεκτονική AArch64, η υποστήριξη για την πλατφόρμα Windows έχει βελτιωθεί: έχει εξασφαλιστεί η σωστή παραγωγή εξόδου assembler για συστήματα Windows-στόχων, η παραγωγή δεδομένων για κλήσεις ξετυλίγματος έχει βελτιστοποιηθεί (το μέγεθος τέτοιων δεδομένων έχει μειωθεί κατά 60 %), η δυνατότητα δημιουργίας δεδομένων ξετύλιξης με χρήση assembler έχει προστεθεί στις οδηγίες .seh_*.
  • Το backend για την αρχιτεκτονική PowerPC διαθέτει νέες βελτιστοποιήσεις για βρόχους και ενσωματωμένη ανάπτυξη, εκτεταμένη υποστήριξη για επεξεργαστές Power10, πρόσθετη υποστήριξη για οδηγίες MMA για χειρισμό matrix και βελτιωμένη υποστήριξη για το λειτουργικό σύστημα AIX.
  • Το backend x86 προσθέτει υποστήριξη για επεξεργαστές AMD Zen 3, Intel Alder Lake και Intel Sapphire Rapids, καθώς και οδηγίες επεξεργαστών HRESET, UINTR και AVXVNNI. Υποστήριξη για MPX (Επεκτάσεις Προστασίας Μνήμης) για έλεγχο των δεικτών για να διασφαλιστεί ότι τα όρια της μνήμης δεν υποστηρίζονται πλέον (αυτή η τεχνολογία δεν είναι ευρέως διαδεδομένη και έχει ήδη αφαιρεθεί από το GCC και το clang). Προστέθηκε υποστήριξη στο assembler για τα προθέματα {disp32} και {disp8} και τα επιθήματα .d32 και .d8 για τον έλεγχο του μεγέθους των μετατοπίσεων και των πηδημάτων τελεστών. Προστέθηκε ένα νέο χαρακτηριστικό "tune-cpu" για τον έλεγχο της συμπερίληψης μικροαρχιτεκτονικών βελτιστοποιήσεων.
  • Ένας νέος τρόπος λειτουργίας "-fsanitize=unsigned-shift-base" προστέθηκε στον ανιχνευτή προβλημάτων ακέραιων αριθμών (ακέραιος απολυμαντικός αριθμός, "-fsanitize=ακέραιος") για την ανίχνευση υπερχείλισης ανυπόγραφων ακεραίων μετά από λίγη μετατόπιση προς τα αριστερά.
  • Σε διάφορους ανιχνευτές (asan, cfi, lsan, msan, tsan, ubsan sanitizer) έχει προστεθεί υποστήριξη για διανομές Linux με την τυπική βιβλιοθήκη Musl.
  • Οι δυνατότητες του συνδετήρα LLD έχουν επεκταθεί. Βελτιωμένη υποστήριξη για τη μορφή ELF, συμπεριλαμβανομένων των προστιθέμενων επιλογών "--dependency-file", "-error-handling-script", "-lto-pseudo-probe-for-profiling", "-no-lto-whole-program" -ορατότητα" " Βελτιωμένη υποστήριξη MinGW. Για τη μορφή Mach-O (macOS), έχει εφαρμοστεί υποστήριξη για αρχιτεκτονικές arm64, arm και i386, βελτιστοποιήσεις χρόνου σύνδεσης (LTO) και ξετύλιγμα στοίβας για χειρισμό εξαιρέσεων.
  • Το Libc++ εφαρμόζει νέα χαρακτηριστικά του προτύπου C++20 και έχει ξεκινήσει την ανάπτυξη χαρακτηριστικών της προδιαγραφής C++2b. Προστέθηκε υποστήριξη για δημιουργία με απενεργοποίηση υποστήριξη τοπικής προσαρμογής (“-DLIBCXX_ENABLE_LOCALIZATION=OFF”) και συσκευές για τη δημιουργία ψευδοτυχαίων αριθμών (“-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF”).

Πηγή: opennet.ru

Προσθέστε ένα σχόλιο