Μετά από έξι μήνες ανάπτυξης, κυκλοφόρησε η έκδοση LLVM 22.1.0. Αναπτύσσει εργαλεία (μεταγλωττιστές, βελτιστοποιητές και γεννήτριες κώδικα) που μεταγλωττίζουν προγράμματα σε ενδιάμεσο bitcode εικονικών εντολών τύπου RISC (μια εικονική μηχανή χαμηλού επιπέδου με σύστημα βελτιστοποίησης πολλαπλών επιπέδων). Ο παραγόμενος ψευδοκώδικας μπορεί να μετατραπεί σε κώδικα μηχανής για μια δεδομένη πλατφόρμα-στόχο ή να χρησιμοποιηθεί από έναν μεταγλωττιστή just-in-time (JIT) για τη δημιουργία εντολών μηχανής απευθείας κατά την εκτέλεση του προγράμματος. Με βάση τις τεχνολογίες LLVM, το έργο αναπτύσσει τον μεταγλωττιστή Clang, υποστηρίζοντας τις γλώσσες προγραμματισμού C, C++ και Objective-C. Ξεκινώντας με τον κλάδο 18.x, το έργο άλλαξε σε ένα νέο σχήμα αρίθμησης εκδόσεων, σύμφωνα με το οποίο η έκδοση 0 ("N.0") χρησιμοποιείται κατά την ανάπτυξη και η πρώτη σταθερή έκδοση αριθμείται ως "N.1".
Οι βελτιώσεις στο Clang 22 περιλαμβάνουν:
- Προστέθηκε υποστήριξη για διακριτικά κατανομής μνήμης (Allocation Tokens) για την επισήμανση λειτουργιών κατανομής μνήμης που εκτελούνται χρησιμοποιώντας συναρτήσεις όπως το malloc με ένα μοναδικό αναγνωριστικό. Τα διακριτικά κατανομής επιτρέπουν τη δομή πληροφοριών σωρού, απλοποιώντας την ανίχνευση διαρροής μνήμης και επιτρέποντας την ομαδοποίηση αντικειμένων με βάση τον σκοπό ή τα μοτίβα τροποποίησης (π.χ., διαχωρίζοντας τα "θερμά" από τα "κρύα" δεδομένα). Για να τα ενεργοποιήσετε, χρησιμοποιήστε τη σημαία "-fsanitize=alloc-token".
- Χαρακτηριστικά που σχετίζονται με τη γλώσσα C:
- Έχει υλοποιηθεί ένα προσχέδιο προδιαγραφής που ορίζει τον μηχανισμό αναβολής εκτέλεσης "defer", επιτρέποντας την εκτέλεση ενεργειών όταν τερματιστεί το τρέχον πεδίο εφαρμογής. Έχει προστεθεί η σημαία "-fdefer-ts" για να ενεργοποιηθεί η υποστήριξη "defer".
- Η ενσωματωμένη συνάρτηση __builtin_stack_address() έχει προστεθεί, αντικατοπτρίζοντας την παρόμοια συνάρτηση στο GCC. Αυτή η συνάρτηση επιστρέφει τη διεύθυνση στοίβας διαχωρίζοντας την περιοχή στοίβας της τρέχουσας συνάρτησης που κάλεσε την __builtin_stack_address() και τις επόμενες συναρτήσεις που καλεί.
- Δυνατότητες που αναπτύσσονται για το μελλοντικό πρότυπο C2y:
- Προστέθηκε υποστήριξη για επώνυμες επαναλήψεις (named loops), η οποία σας επιτρέπει να αντιστοιχίζετε ονόματα σε επαναλήψεις και εντολές switch, οι οποίες μπορούν να καθοριστούν σε εντολές break και continue για να ορίσετε ρητά τη επαναληψη από την οποία θα γίνει η έξοδος. outer: for (int i = 0; i < IK; ++ i) { for (int j = 0; j < JK; ++ j) { continue; // μετάβαση στο CONT1 continue outer; // μετάβαση στο CONT2 // CONT1 } // CONT2 }
- Η υλοποίηση της ενσωματωμένης μακροεντολής "__COUNTER__", η οποία έχει σχεδιαστεί για τη δημιουργία μοναδικών ονομάτων αναγνωριστικών, έχει επεκταθεί και συμπεριληφθεί στο πρότυπο. Έχει οριστεί όριο 2147483647 κλήσεων σε αυτήν τη μακροεντολή. Η υπέρβαση αυτού του ορίου θα δημιουργήσει σφάλμα.
- Αφαιρέθηκε η προειδοποίηση (-Wstatic-in-line) κατά τη χρήση στατικών συναρτήσεων ή μεταβλητών μέσα σε συναρτήσεις που δηλώνονται ως "extern inline".
- Δυνατότητες που ορίζονται στο πρότυπο C23 C:
- Το αρχείο κεφαλίδας float.h υποστηρίζει πλέον τις μακροεντολές FLT_SNAN, DBL_SNAN και LDBL_SNAN, οι οποίες υλοποιούν τιμές NaN με σηματοδότηση (προκαλώντας εξαίρεση όταν χρησιμοποιούνται σε αριθμητικές πράξεις) για τους τύπους float, double και long double.
- Διορθώθηκε ένα σφάλμα όπου διαφορετικοί ανώνυμοι τύποι αντιμετωπίζονταν ως συμβατοί εντός της ίδιας μονάδας μετάφρασης, εάν είχαν τα ίδια πεδία.
- Η σημαία "-MG" που χρησιμοποιείται για την αγνόηση των ελλειπουσών αρχείων κεφαλίδας κατά τη σάρωση εξαρτήσεων έχει επεκταθεί στις οδηγίες "#embed" και πλέον καταστέλλει το σφάλμα "το αρχείο δεν βρέθηκε" όταν λείπει ένα αρχείο που καθορίζεται σε μια οδηγία "#embed".
- Χαρακτηριστικά που σχετίζονται με την C++:
- Έχει προστεθεί η δυνατότητα χρήσης δομημένων συνδέσεων στο περιβάλλον "constexpr", όπως αναπτύχθηκε στην προδιαγραφή C++2c (C++26). Αυτό σημαίνει ότι οι αναφορές σε σταθερές εκφράσεις μπορούν πλέον να είναι οι ίδιες σταθερές εκφράσεις. Η υποστήριξη εφαρμόζεται για πίνακες και απλές δομές (οι πλειάδες δεν υποστηρίζονται ακόμη). constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
- Όπως απαιτείται από το πρότυπο C++20, οι περιορισμοί μετατρέπονται πλέον σε τυποποιημένη μορφή πριν ελεγχθούν, επιτρέποντας ακριβέστερα διαγνωστικά μηνύματα και σωστό χειρισμό σφαλμάτων αντικατάστασης σε ορίσματα προτύπων που χρησιμοποιούνται μόνο σε concept-ids.
- Προστέθηκε μια οικογένεια ενσωματωμένων συναρτήσεων "__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship" για να διαπιστωθεί εάν οι τελεστές σύγκρισης "<", ">", "<=" και ">=" συντέθηκαν από τον τελεστή "<=>".
- Η παράμετρος "-Wincompatible-pointer-types" έχει αλλάξει ώστε να εμφανίζει σφάλμα αντί για προειδοποίηση. Για να επιστρέψετε στην προηγούμενη συμπεριφορά, χρησιμοποιήστε την επιλογή "-Wno-error=incompatible-pointer-types".
- Προστέθηκαν οι ενσωματωμένες συναρτήσεις __builtin_bswapg, __builtin_elementwise_ldexp, __builtin_elementwise_fshl, __builtin_elementwise_fshr, __builtin_elementwise_minnumnum, __builtin_elementwise_maxnumnum, __builtin_masked_load, __builtin_masked_expand_load, __builtin_masked_store, __builtin_masked_compress_store, __builtin_masked_gather, __builtin_masked_scatter και __builtin_dedup_pack. Για παράδειγμα, το builtin_dedup_pack σάς επιτρέπει να καταργήσετε διπλότυπα από μια λίστα τύπων: χρησιμοποιώντας το MyTypeList = TypeList<__builtin_dedup_pack …>; // ο τύπος που προκύπτει θα είναι TypeList
- Κατά την ανίχνευση σφαλμάτων σε απροσδιόριστη συμπεριφορά με το UBSan (-fsanitize=undefined -fsanitize-trap=undefined), οι πληροφορίες αιτίας σφάλματος περιλαμβάνονται πλέον στις πληροφορίες εντοπισμού σφαλμάτων που δημιουργούνται. Η σημαία "-fsanitize-debug-trap-reasons" έχει προστεθεί για να καθορίσει το επίπεδο λεπτομέρειας στις πληροφορίες σφάλματος. Μπορεί να οριστεί σε "basic" για γενικές περιγραφές (π.χ., "Integer addition overflowed") και σε "detailed" για να συμπεριλάβει λεπτομερείς πληροφορίες (π.χ., "signed integer addition overflow in 'a + b'").
- Προστέθηκαν νέες σημαίες μεταγλωττιστή:
- "-f[no-]sanitize-debug-trap-reasons" για να ελέγχετε εάν οι λόγοι παγίδευσης εξαιρέσεων ενσωματώνονται στις πληροφορίες εντοπισμού σφαλμάτων κατά τη μεταγλώττιση με τη λειτουργία "-fsanitize-trap".
- "-fsanitize=alloc-token", "-falloc-token-max", "-fsanitize-alloc-token-fast-abi" και "-fsanitize-alloc-token-extended" για τη διαχείριση των διακριτικών εκχώρησης μνήμης.
- "-fmatrix-memory-layout" για τον έλεγχο της διάταξης μνήμης των τύπων πινάκων (π.χ. column-major για column-major, row-major για row-major).
- Οι συναρτήσεις έχουν πλέον ένα χαρακτηριστικό "malloc_span", παρόμοιο με το χαρακτηριστικό malloc αλλά εφαρμόσιμο σε συναρτήσεις που επιστρέφουν δομές τύπου span που περιέχουν έναν δείκτη και ένα πεδίο με μέγεθος ή έναν δείκτη στο τέλος του μπλοκ.
- Προστέθηκε το χαρακτηριστικό "modular_format" για να επιλέγεται δυναμικά η απαιτούμενη στατικά συνδεδεμένη υλοποίηση της συνάρτησης printf κατά τη στιγμή της σύνδεσης.
- Τα εργαλεία διαγνωστικής και στατικής ανάλυσης έχουν επεκταθεί, έχουν προστεθεί νέοι έλεγχοι (αρκετές δεκάδες βελτιώσεις που σχετίζονται με τη διάγνωση).
- Έχουν προστεθεί επιπλέον intrinsic στοιχεία για τις επεκτάσεις SSE, AVX και AVX512 στο backend του X86. Έχουν προστεθεί λειτουργίες δημιουργίας για CPU Intel που βασίζονται στις μικροαρχιτεκτονικές Wildcat Lake (-march=wildcatlake) και Nova Lake (-march=novalake).
- Το backend του AArch64 υποστηρίζει πλέον τους επεξεργαστές Ampere Computing Ampere1C (ampere1c), Arm C1-Nano (c1-nano), Arm C1-Pro (c1-pro), Arm C1-Premium (c1-premium) και Arm C1-Ultra (c1-ultra). Έχουν προστεθεί επιπλέον ενσωματωμένες συναρτήσεις για τις εντολές FCVTZ[US], FCVTN[US], FCVTM[US], FCVTP[US] και FCVTA[US]. Η υποστήριξη Function Multi-Versioning (FMV) έχει σταθεροποιηθεί. Οι χρήστες μπορούν πλέον να παρακάμψουν την προτεραιότητα διαφορετικών εκδόσεων συναρτήσεων.
- Προστέθηκε υποστήριξη για την αρχιτεκτονική LoongArch32 (LA32R, LA32S).
- Βελτιωμένα backends για αρχιτεκτονικές ARM, AMDGPU, RISC-V, LoongArch64, MIPS, WebAssembly και PowerPC.
Πηγή: opennet.ru
