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

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

Οι νέες δυνατότητες στο LLVM 10.0 περιλαμβάνουν υποστήριξη για C++ Concepts, δεν εκτελεί πλέον το Clang ως ξεχωριστή διαδικασία, υποστήριξη για ελέγχους CFG (control flow guard) για Windows και υποστήριξη για νέες δυνατότητες CPU.

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

  • Προστέθηκε υποστήριξη για "έννοιες", μια επέκταση προτύπου C++ που θα συμπεριληφθεί στο επόμενο πρότυπο, με την κωδική ονομασία C++2a (ενεργοποιημένη από τη σημαία -std=c++2a).
    Οι έννοιες σάς επιτρέπουν να ορίσετε ένα σύνολο απαιτήσεων παραμέτρων προτύπου που, κατά το χρόνο μεταγλώττισης, περιορίζουν το σύνολο των ορισμάτων που μπορούν να γίνουν δεκτά ως παράμετροι προτύπου. Οι έννοιες μπορούν να χρησιμοποιηθούν για την αποφυγή λογικών ασυνεπειών μεταξύ των ιδιοτήτων των τύπων δεδομένων που χρησιμοποιούνται στο πρότυπο και των ιδιοτήτων τύπου δεδομένων των παραμέτρων εισόδου.

    πρότυπο
    έννοια EqualityComparable = απαιτεί(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Από προεπιλογή, η εκκίνηση μιας ξεχωριστής διαδικασίας ("clang -cc1") στην οποία εκτελείται η μεταγλώττιση διακόπτεται. Η μεταγλώττιση γίνεται τώρα στην κύρια διαδικασία και η επιλογή "-fno-integrated-cc1" μπορεί να χρησιμοποιηθεί για την επαναφορά της παλιάς συμπεριφοράς.
  • Νέοι διαγνωστικοί τρόποι:
    • Τα "-Wc99-designator" και "-Wreorder-init-list" προειδοποιούν κατά της χρήσης αρχικοποιητών C99 σε λειτουργία C++ σε περιπτώσεις όπου είναι σωστοί στο C99 αλλά όχι στη C++20.
    • "-Wsizeof-array-div" - συλλαμβάνει καταστάσεις όπως "int arr[10]; …sizeof(arr) / sizeof(short)…” (θα πρέπει να είναι “sizeof(arr) / sizeof(int)”).
    • "-Wxor-used-as-po" - προειδοποιεί για τη χρήση δομών, όπως η χρήση του τελεστή "^" (xor) σε πράξεις που μπορεί να συγχέονται με την εκθετικότητα (2^16).
    • "-Wfinal-dtor-non-final-class" - προειδοποιεί για κλάσεις που δεν επισημαίνονται με τον προσδιοριστή "final", αλλά έχουν έναν καταστροφέα με το χαρακτηριστικό "final".
    • Το "-Wtautological-bitwise-compare" είναι μια ομάδα προειδοποιήσεων για τη διάγνωση ταυτολογικών συγκρίσεων μεταξύ μιας λειτουργίας bitwise και μιας σταθεράς και για τον εντοπισμό συγκρίσεων πάντα αληθών στις οποίες η λειτουργία bitwise OR εφαρμόζεται σε έναν μη αρνητικό αριθμό.
    • Το "-Wbitwise-conditional-parentheses" προειδοποιεί για προβλήματα κατά την ανάμειξη των λογικών τελεστών AND (&) και OR (|) με τον τελεστή υπό όρους (?:).
    • Το "-Wmisleading-indentation" είναι ένα ανάλογο της ομώνυμης επιταγής από το GCC, το οποίο προειδοποιεί για εκφράσεις με εσοχή σαν να αποτελούν μέρος ενός μπλοκ if/else/for/while, αλλά στην πραγματικότητα δεν περιλαμβάνονται σε αυτό το μπλοκ .
    • Όταν προσδιορίζετε το "-Wextra", ο έλεγχος "-Wdeprecated-copy" είναι ενεργοποιημένος, προειδοποιώντας για τη χρήση κατασκευαστών
      "μετακίνηση" και "αντιγραφή" σε τάξεις με ρητό ορισμό καταστροφέα.

    • Οι έλεγχοι "-Wtautological-overlap-compare", "-Wsizeof-pointer-div", "-Wtautological-compare", "-Wrange-loop-analysis" έχουν επεκταθεί.
    • Οι έλεγχοι "-Wbitwise-op-parentheses" και "-Wlogical-op-parentheses" είναι απενεργοποιημένοι από προεπιλογή.
  • Στον κώδικα C και C++, οι αριθμητικές πράξεις δείκτη επιτρέπονται μόνο σε πίνακες. Το Undefined Behavior Sanitizer στη λειτουργία "-fsanitize=pointer-overflow" συλλαμβάνει πλέον περιπτώσεις όπως η προσθήκη μιας μη μηδενικής μετατόπισης σε έναν μηδενικό δείκτη ή η δημιουργία ενός μηδενικού δείκτη κατά την αφαίρεση ενός ακέραιου από έναν μη μηδενικό δείκτη.
  • Η λειτουργία "-fsanitize=implicit-conversion" (Implicit Conversion Sanitizer) είναι προσαρμοσμένη για να εντοπίζει προβλήματα με λειτουργίες αύξησης και μείωσης για τύπους με μέγεθος bit μικρότερο από αυτό του τύπου "int".
  • Όταν επιλέγετε αρχιτεκτονικές στόχου x86 "-march=skylake-avx512", "-march=icelake-client", "-march=icelake-server", "-march=cascadelake" και "-march=cooperlake" από προεπιλογή σε διανυσματοποιημένη Ο κώδικας έχει σταματήσει να χρησιμοποιεί καταχωρητές zmm 512-bit, εκτός από την άμεση ένδειξη τους στον πηγαίο κώδικα. Ο λόγος είναι ότι η συχνότητα της CPU μειώνεται όταν εκτελούνται λειτουργίες 512 bit, κάτι που μπορεί να επηρεάσει αρνητικά τη συνολική απόδοση. Για να αλλάξετε τη νέα συμπεριφορά, παρέχεται η επιλογή "-mprefer-vector-width=512".
  • Η συμπεριφορά της σημαίας "-flax-vector-conversions" είναι παρόμοια με του GCC: απαγορεύονται οι σιωπηρές μετατροπές bit διανυσμάτων μεταξύ ακεραίων και διανυσμάτων κινητής υποδιαστολής. Για την εξάλειψη αυτού του περιορισμού, προτείνεται η χρήση της σημαίας
    "-flax-vector-conversions=all" που είναι η προεπιλογή.

  • Βελτιωμένη υποστήριξη για επεξεργαστές MIPS της οικογένειας Octeon. Προστέθηκε το "octeon+" στη λίστα των έγκυρων τύπων CPU.
  • Κατά τη συναρμολόγηση σε ενδιάμεσο κώδικα WebAssembly, καλείται αυτόματα το wasm-opt optimizer, εάν είναι διαθέσιμο στο σύστημα.
  • Για συστήματα που βασίζονται στην αρχιτεκτονική RISC-V, επιτρέπεται η χρήση καταχωρητών που αποθηκεύουν τιμές κινητής υποδιαστολής σε μπλοκ υπό όρους ενσωματωμένων ενθέτων συναρμολογητή.
  • Προστέθηκαν νέες σημαίες μεταγλωττιστή: "-fgnuc-version" για να ορίσετε την τιμή έκδοσης για "__GNUC__" και παρόμοιες μακροεντολές. "-fmacro-prefix-map=OLD=NEW" για να αντικαταστήσετε το πρόθεμα καταλόγου OLD με NEW σε μακροεντολές όπως "__FILE__". "-fpatchable-function-entry=N[,M]" για τη δημιουργία ορισμένου αριθμού εντολών NOP πριν και μετά το σημείο εισόδου της συνάρτησης. Για το RISC-V
    πρόσθεσε υποστήριξη για τις σημαίες "-fixed-xX", "-mcmodel=medany" και "-mcmodel=medlow".

  • Προστέθηκε υποστήριξη για το χαρακτηριστικό "__attribute__((target("branch-protection=..."))), το αποτέλεσμα του οποίου είναι παρόμοιο με την επιλογή -κλαδιά-προστασία.
  • Στην πλατφόρμα των Windows, κατά τον καθορισμό της σημαίας «-cfguard», εφαρμόζεται η αντικατάσταση των ελέγχων ακεραιότητας ροής εκτέλεσης (Control Flow Guard) για έμμεσες κλήσεις συναρτήσεων. Για να απενεργοποιήσετε την αντικατάσταση επιταγών, μπορείτε να χρησιμοποιήσετε τη σημαία "-cfguard-nochecks" ή τον τροποποιητή "__declspec(guard(nocf))".
  • Η συμπεριφορά του χαρακτηριστικού gnu_inline είναι παρόμοια με του GCC σε περιπτώσεις που χρησιμοποιείται χωρίς την "εξωτερική" λέξη-κλειδί.
  • Οι δυνατότητες που σχετίζονται με την υποστήριξη OpenCL και CUDA έχουν επεκταθεί. Προστέθηκε υποστήριξη για νέες δυνατότητες OpenMP 5.0.
  • Μια τυπική επιλογή έχει προστεθεί στο βοηθητικό πρόγραμμα clang-format, το οποίο σας επιτρέπει να προσδιορίσετε την έκδοση του προτύπου C++ που χρησιμοποιείται κατά την ανάλυση και τη μορφοποίηση κώδικα (Τελευταία, Αυτόματο, c++03, c++11, c++14, c++17, c++20).
  • Προστέθηκαν νέοι έλεγχοι στον στατικό αναλυτή: alpha.cplusplus.PlacementΝέο για να προσδιορίσετε εάν υπάρχει επαρκής αποθηκευτικός χώρος, φούξια.HandleChecker για τον εντοπισμό διαρροών που σχετίζονται με χειριστές Fuchsia, security.insecureAPI.decodeValueOfObjCType για ανίχνευση πιθανών υπερχείλισης buffer κατά τη χρήση του [NSCodefCType] :at:] .
  • Το Undefined Behavior Sanitizer (UBSan) έχει επεκτείνει τους ελέγχους υπερχείλισης δείκτη για να συλλάβει την εφαρμογή μη μηδενικών μετατοπίσεων σε δείκτες NULL ή την προκύπτουσα προσθήκη μετατόπισης δείκτη NULL.
  • Σε λίντερ χτύπησε-τακτοποιημένο προστέθηκε ένα μεγάλο μέρος νέων επιταγών.

Ο κύριος καινοτομίες LLVM 10.0:

  • Στο πλαίσιο Αποδίδων Προστέθηκαν νέες διαδικαστικές βελτιστοποιήσεις και αναλυτές. Προβλέπεται η κατάσταση 19 διαφορετικών ιδιοτήτων, συμπεριλαμβανομένων 12 ιδιοτήτων 12 LLVM IR και 7 αφηρημένων χαρακτηριστικών όπως η ζωντανότητα.
  • Προστέθηκαν νέες μαθηματικές συναρτήσεις μήτρας ενσωματωμένες στον μεταγλωττιστή (Intrinsics), οι οποίες αντικαθίστανται από αποτελεσματικές διανυσματικές εντολές κατά τη μεταγλώττιση.
  • Έχουν γίνει πολυάριθμες βελτιώσεις στα backend για τις αρχιτεκτονικές X86, AArch64, ARM, SystemZ, MIPS, AMDGPU και PowerPC. Προστέθηκε υποστήριξη CPU
    Cortex-A65, Cortex-A65AE, Neoverse E1 και Neoverse N1. Για το ARMv8.1-M, ​​η διαδικασία δημιουργίας κώδικα έχει βελτιστοποιηθεί (για παράδειγμα, έχει εμφανιστεί υποστήριξη για βρόχους με ελάχιστη επιβάρυνση) και έχει προστεθεί υποστήριξη για αυτόματη διανυσματοποίηση χρησιμοποιώντας την επέκταση MVE. Βελτιωμένη υποστήριξη CPU MIPS Octeon. Για το PowerPC, η διανυσματοποίηση μαθηματικών υπορουτίνων με χρήση της βιβλιοθήκης MASSV (Mathematical Acceleration SubSystem) είναι ενεργοποιημένη, η δημιουργία κώδικα βελτιώνεται και η πρόσβαση στη μνήμη από βρόχους έχει βελτιστοποιηθεί. Για το x86, ο χειρισμός των διανυσματικών τύπων v2i32, v4i16, v2i16, v8i8, v4i8 και v2i8 έχει αλλάξει.

  • Βελτιωμένη δημιουργία κώδικα για WebAssembly. Προστέθηκε υποστήριξη για οδηγίες TLS (Thread-Local Storage) και atomic.fence. Η υποστήριξη SIMD έχει επεκταθεί σημαντικά. Τα αρχεία αντικειμένων WebAssembly έχουν πλέον τη δυνατότητα να χρησιμοποιούν υπογραφές συναρτήσεων πολλαπλών τιμών.
  • Ο αναλυτής χρησιμοποιείται κατά την επεξεργασία βρόχων MemorySSA, το οποίο σας επιτρέπει να ορίζετε εξαρτήσεις μεταξύ διαφορετικών λειτουργιών μνήμης. Το MemorySSA μπορεί να μειώσει το χρόνο μεταγλώττισης και εκτέλεσης ή μπορεί να χρησιμοποιηθεί αντί του AliasSetTracker χωρίς απώλεια απόδοσης.
  • Το πρόγραμμα εντοπισμού σφαλμάτων LLDB έχει βελτιώσει σημαντικά την υποστήριξη για τη μορφή DWARF v5. Βελτιωμένη υποστήριξη για την κατασκευή με MinGW
    και πρόσθεσε την αρχική δυνατότητα εντοπισμού σφαλμάτων εκτελέσιμων Windows για αρχιτεκτονικές ARM και ARM64. Προστέθηκαν περιγραφές των επιλογών που προσφέρονται κατά την αυτόματη συμπλήρωση της εισαγωγής πατώντας tab.

  • Αναπτυγμένος Δυνατότητες σύνδεσης LLD. Βελτιωμένη υποστήριξη για τη μορφή ELF, συμπεριλαμβανομένης της εξασφάλισης πλήρους συμβατότητας των προτύπων glob με τη σύνδεση GNU, προσθήκη υποστήριξης για συμπιεσμένες ενότητες εντοπισμού σφαλμάτων ".zdebug", προσθήκη της ιδιότητας PT_GNU_PROPERTY για τον ορισμό της ενότητας .note.gnu.property (μπορεί να χρησιμοποιηθεί στο μέλλον πυρήνες Linux),
    Έχουν εφαρμοστεί οι λειτουργίες «-z ​​noseparate-code», «-z ξεχωριστός-code» και «-z ξεχωριστά-loadable-segments». Βελτιωμένη υποστήριξη για MinGW και WebAssembly.

Πηγή: opennet.ru

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