Έκδοση της σουίτας μεταγλωττιστή GCC 12

Μετά από ένα χρόνο ανάπτυξης, κυκλοφόρησε η δωρεάν σουίτα μεταγλωττιστών GCC 12.1, η πρώτη σημαντική έκδοση στον νέο κλάδο GCC 12.x. Σύμφωνα με το νέο σχήμα αρίθμησης εκδόσεων, η έκδοση 12.0 χρησιμοποιήθηκε στη διαδικασία ανάπτυξης και λίγο πριν την κυκλοφορία του GCC 12.1, ο κλάδος GCC 13.0 είχε ήδη διακλαδωθεί, βάσει του οποίου η επόμενη σημαντική έκδοση, το GCC 13.1, θα να σχηματιστεί. Στις 23 Μαΐου, το έργο θα γιορτάσει τα 35 χρόνια από τη δημιουργία της πρώτης έκδοσης του GCC.

Βασικές αλλαγές:

  • Προστέθηκε υποστήριξη για τη μορφή εντοπισμού σφαλμάτων CTF (Compact Type Format), η οποία παρέχει συμπαγή αποθήκευση πληροφοριών σχετικά με τύπους C, συνδέσεις μεταξύ συναρτήσεων και σύμβολα εντοπισμού σφαλμάτων. Όταν ενσωματώνεται σε αντικείμενα ELF, η μορφή επιτρέπει τη χρήση πινάκων χαρακτήρων EFL για την αποφυγή διπλών δεδομένων.
  • Η υποστήριξη για τη μορφή αποθήκευσης πληροφοριών εντοπισμού σφαλμάτων "STABS", που δημιουργήθηκε τη δεκαετία του 1980, έχει καταργηθεί.
  • Συνεχίζονται οι εργασίες για την επέκταση της υποστήριξης για μελλοντικά πρότυπα C2X και C++23 για τις γλώσσες C και C++. Για παράδειγμα, έχει προστεθεί υποστήριξη για την έκφραση "if consteval". επιτρέπεται η χρήση auto σε ορίσματα συνάρτησης ("f(auto(g()))"); Η χρήση μη κυριολεκτικών μεταβλητών, goto και ετικετών επιτρέπεται σε συναρτήσεις που δηλώνονται ως constexpr. προστέθηκε υποστήριξη για τελεστή τελεστών πολυδιάστατου ευρετηρίου[]. στο εάν, για και διακόπτη, οι δυνατότητες των μπλοκ αρχικοποίησης έχουν επεκταθεί ("for (χρησιμοποιώντας T = int; T e : v)").
  • Η C++ Standard Library έχει βελτιωμένη υποστήριξη για τις πειραματικές ενότητες των προτύπων C++20 και C++23. Προστέθηκε υποστήριξη για std::move_only_function, , std::basic_string::resize_and_overwrite, , και std::invoke_r. Επιτρέπεται η χρήση std::unique_ptr, std::vector, std::basic_string, std::optional και std::variant στις συναρτήσεις constexpr.
  • Το frontend Fortran παρέχει πλήρη υποστήριξη για την προδιαγραφή TS 29113, η οποία περιγράφει τις δυνατότητες διασφάλισης φορητότητας μεταξύ του κώδικα Fortran και C.
  • Προστέθηκε υποστήριξη για την επέκταση __builtin_shufflector(vec1, vec2, index1, index2, ...) που είχε προστεθεί προηγουμένως στο Clang, η οποία προσφέρει μία μόνο κλήση για την εκτέλεση κοινών διανυσματικών λειτουργιών τυχαίας αναπαραγωγής και τυχαίας αναπαραγωγής.
  • Όταν χρησιμοποιείτε το επίπεδο βελτιστοποίησης "-O2", η διανυσματοποίηση είναι ενεργοποιημένη από προεπιλογή (οι λειτουργίες -ftree-vectorize και -fvect-cost-model=πολύ φθηνό είναι ενεργοποιημένες). Το πολύ φθηνό μοντέλο επιτρέπει τη διανυσματοποίηση μόνο εάν ο διανυσματικός κώδικας μπορεί να αντικαταστήσει πλήρως τον βαθμωτό κώδικα που διανυσματοποιείται.
  • Προστέθηκε η λειτουργία "-ftrivial-auto-var-init" για να ενεργοποιηθεί η ρητή προετοιμασία των μεταβλητών στη στοίβα για την παρακολούθηση προβλημάτων και τον αποκλεισμό τρωτών σημείων που σχετίζονται με τη χρήση μη αρχικοποιημένων μεταβλητών.
  • Για τις γλώσσες C και C++, μια ενσωματωμένη συνάρτηση __builtin_dynamic_object_size έχει προστεθεί για τον προσδιορισμό του μεγέθους ενός αντικειμένου, συμβατή με μια παρόμοια συνάρτηση από το Clang.
  • Για τις γλώσσες C και C++, έχει προστεθεί υποστήριξη για το χαρακτηριστικό "μη διαθέσιμο" (για παράδειγμα, μπορείτε να επισημάνετε συναρτήσεις που θα δημιουργήσουν σφάλμα εάν προσπαθήσετε να τις χρησιμοποιήσετε).
  • Για γλώσσες C και C++, έχει προστεθεί υποστήριξη για τις οδηγίες προεπεξεργασίας "#elifdef" και "#elifndef".
  • Προστέθηκε η σημαία "-Wbidi-chars" για την εμφάνιση μιας προειδοποίησης εάν οι χαρακτήρες UTF-8 χρησιμοποιούνται λανθασμένα, αλλάζοντας τη σειρά με την οποία εμφανίζεται το αμφίδρομο κείμενο.
  • Προστέθηκε η σημαία "-Warray-compare" για την εμφάνιση μιας προειδοποίησης όταν προσπαθείτε να συγκρίνετε δύο τελεστές που αναφέρονται σε πίνακες.
  • Η εφαρμογή των προτύπων OpenMP 5.0 και 5.1 (Open Multi-Processing), τα οποία ορίζουν το API και τις μεθόδους εφαρμογής παράλληλων μεθόδων προγραμματισμού σε συστήματα πολλαπλών πυρήνων και υβριδικών (CPU+GPU/DSP) με κοινόχρηστη μνήμη και μονάδες διανυσματοποίησης (SIMD). , συνέχισε.
  • Βελτιωμένη εφαρμογή της προδιαγραφής παράλληλου προγραμματισμού OpenACC 2.6, η οποία ορίζει εργαλεία για την εκφόρτωση λειτουργιών σε GPU και εξειδικευμένους επεξεργαστές όπως το NVIDIA PTX.
  • Υποστήριξη για εκτεταμένες οδηγίες Το Intel AVX86-FP512 και ο τύπος _Float16 έχει προστεθεί στο backend δημιουργίας κώδικα για την αρχιτεκτονική x16.
  • Για την αρχιτεκτονική x86, έχει προστεθεί προστασία έναντι τρωτών σημείων στους επεξεργαστές που προκαλούνται από κερδοσκοπική εκτέλεση εντολών μετά από λειτουργίες άνευ όρων άλματος προς τα εμπρός. Το πρόβλημα παρουσιάζεται λόγω της προληπτικής επεξεργασίας των εντολών αμέσως μετά την εντολή διακλάδωσης στη μνήμη (SLS, Straight Line Speculation). Για να ενεργοποιηθεί η προστασία, προτείνεται η επιλογή «-mharden-sls».
  • Προστέθηκε ανίχνευση της χρήσης μη αρχικοποιημένων μεταβλητών στον πειραματικό στατικό αναλυτή. Προστέθηκε αρχική υποστήριξη για την ανάλυση του κώδικα συναρμολόγησης σε ενσωματωμένα ένθετα. Βελτιωμένη παρακολούθηση μνήμης. Ο κώδικας για την επεξεργασία εκφράσεων διακόπτη έχει ξαναγραφεί.
  • Προστέθηκαν 30 νέες κλήσεις στο libgccjit, μια κοινόχρηστη βιβλιοθήκη για την ενσωμάτωση μιας γεννήτριας κώδικα σε άλλες διαδικασίες και τη χρήση της για τη μεταγλώττιση του bytecode JIT σε κώδικα μηχανής.
  • Υποστήριξη για τον μηχανισμό CO-RE (Compile Once - Run Everywhere) έχει προστεθεί στο backend για τη δημιουργία bytecode BPF, ο οποίος σας επιτρέπει να μεταγλωττίσετε τον κώδικα των προγραμμάτων eBPF για τον πυρήνα Linux μόνο μία φορά και να χρησιμοποιήσετε έναν ειδικό καθολικό φορτωτή που προσαρμόζει το φορτωμένο πρόγραμμα στον τρέχοντα πυρήνα και τη μορφή τύπων BPF). Το CO-RE επιλύει το πρόβλημα της φορητότητας των μεταγλωττισμένων προγραμμάτων eBPF, τα οποία προηγουμένως μπορούσαν να χρησιμοποιηθούν μόνο στην έκδοση του πυρήνα για την οποία είχαν μεταγλωττιστεί, καθώς η θέση των στοιχείων στις δομές δεδομένων αλλάζει από έκδοση σε έκδοση.
  • Το backend RISC-V προσθέτει υποστήριξη για νέες επεκτάσεις αρχιτεκτονικής συνόλων εντολών zba, zbb, zbc και zbs, καθώς και επεκτάσεις ISA για διανυσματικές και βαθμωτές κρυπτογραφικές λειτουργίες. Από προεπιλογή, παρέχεται υποστήριξη για την προδιαγραφή RISC-V ISA 20191213. Η σημαία -mtune=thead-c906 έχει προστεθεί για να ενεργοποιηθούν οι βελτιστοποιήσεις για πυρήνες T-HEAD c906.
  • Η υποστήριξη για τον τύπο __int128_t/integer(kind=16) έχει προστεθεί στο backend δημιουργίας κώδικα για τις GPU της AMD που βασίζονται στη μικροαρχιτεκτονική GCN. Είναι δυνατή η χρήση έως και 40 ομάδων εργασίας ανά υπολογιστική μονάδα (CU) και έως 16 μέτωπα εντολών (μέτωπο κύματος, ένα σύνολο νημάτων που εκτελούνται παράλληλα από τη μηχανή SIMD) ανά ομάδα. Προηγουμένως, επιτρεπόταν μόνο ένα άκρο εντολής ανά CU.
  • Το backend NVPTX, που έχει σχεδιαστεί για τη δημιουργία κώδικα χρησιμοποιώντας την αρχιτεκτονική συνόλου εντολών NVIDIA PTX (Parallel Thread Execution), έχει προσθέσει τη δυνατότητα χρήσης των σημαιών "-march", "-mptx" και "-march-map". Υλοποιήθηκε υποστήριξη για PTX ISA sm_53, sm_70, sm_75 και sm_80. Η προεπιλεγμένη αρχιτεκτονική είναι sm_30.
  • Στο backend για επεξεργαστές PowerPC / PowerPC64 / RS6000, οι υλοποιήσεις των ενσωματωμένων λειτουργιών έχουν ξαναγραφτεί. Οι ενσωματωμένες συναρτήσεις __builtin_get_texasr, __builtin_get_texasru, __builtin_get_tfhar, __builtin_get_tfiar, __builtin_set_texasr, __builtin_set_texasru, __builtin_set_tfhar και __builtin_set_tfhar έχουν εγγραφεί_but.
  • Υποστήριξη για Arm Ampere-64 (-mcpu/-mtune ampere1), Arm Cortex-A1 (cortex-a510), Arm Cortex-A510 (cortex-a710) και Arm Cortex-X710 (cortex- x2). Προστέθηκε υποστήριξη για νέες επιλογές αρχιτεκτονικής ARMv2 για χρήση με την επιλογή "-march": armv8-a, armv8.7-a, armv8.8-a. Προστέθηκε υλοποίηση συναρτήσεων C που είναι ενσωματωμένες στον μεταγλωττιστή (Intrinsics) για ατομική φόρτωση και αποθήκευση δεδομένων στη μνήμη, με βάση τη χρήση εκτεταμένων οδηγιών ARM (ls9). Προστέθηκε υποστήριξη για την επιτάχυνση των λειτουργιών memcpy, memmove και memset χρησιμοποιώντας την επέκταση ARM mopsoption.
  • Προστέθηκε μια νέα λειτουργία ελέγχου "-fsanitize=shadow-call-stack" (ShadowCallStack), η οποία είναι προς το παρόν διαθέσιμη μόνο για την αρχιτεκτονική AArch64 και λειτουργεί κατά την κατασκευή κώδικα με την επιλογή "-fixed-r18". Η λειτουργία παρέχει προστασία από την αντικατάσταση της διεύθυνσης επιστροφής από μια συνάρτηση σε περίπτωση υπερχείλισης buffer στη στοίβα. Η ουσία της προστασίας είναι να αποθηκεύσετε τη διεύθυνση επιστροφής σε μια ξεχωριστή στοίβα "σκιάς" μετά τη μεταφορά του ελέγχου σε μια συνάρτηση και την ανάκτηση αυτής της διεύθυνσης πριν την έξοδο από τη συνάρτηση.

Πηγή: opennet.ru

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