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

Μετά από ένα χρόνο ανάπτυξης δημοσιεύθηκε έκδοση ενός δωρεάν συνόλου μεταγλωττιστών GCC 10.1, η πρώτη σημαντική έκδοση στον νέο κλάδο GCC 10.x. Συμφωνώς προς νέο καθεστώς αριθμούς κυκλοφορίας, η έκδοση 10.0 χρησιμοποιήθηκε στη διαδικασία ανάπτυξης και λίγο πριν από την κυκλοφορία του GCC 10.1, ο κλάδος GCC 11.0 είχε ήδη διακλαδωθεί, βάσει του οποίου θα δημιουργηθεί η επόμενη σημαντική έκδοση, το GCC 11.1.

Το GCC 10.1 είναι αξιοσημείωτο για την εφαρμογή πολλών καινοτομιών στη γλώσσα C++ που αναπτύχθηκε για το πρότυπο C++20, βελτιώσεις που σχετίζονται με το μελλοντικό πρότυπο γλώσσας C (C2x), νέες βελτιστοποιήσεις στα backend του μεταγλωττιστή και πειραματική υποστήριξη λειτουργία στατικής ανάλυσης. Επιπλέον, κατά την προετοιμασία ενός νέου υποκαταστήματος, το έργο μετέφερε το αποθετήριο από το SVN στο Git.

Ο κύριος αλλαγές:

  • Προστέθηκε πειραματικός τρόπος στατικής ανάλυσης "-fanalyzer", το οποίο εκτελεί διαδικαστική ανάλυση με ένταση πόρων των διαδρομών εκτέλεσης κώδικα και των ροών δεδομένων σε ένα πρόγραμμα. Η λειτουργία είναι ικανή να ανιχνεύει προβλήματα στο στάδιο της μεταγλώττισης, όπως διπλές κλήσεις στη συνάρτηση free() για μία περιοχή μνήμης, διαρροές περιγραφέα αρχείων, αποαναφορά και διέλευση μηδενικών δεικτών, πρόσβαση σε ελευθερωμένα μπλοκ μνήμης, χρήση μη αρχικοποιημένων τιμών κ.λπ. Η χρήση της νέας λειτουργίας για τον κώδικα OpenSSL έχει ήδη καταστήσει δυνατή την αναγνώριση επικίνδυνη ευπάθεια.
  • Βελτιωμένες διαδικαστικές βελτιστοποιήσεις. Το πάσο IPA-SRA (Interprocedural Scalar Shared Replacement) έχει επανασχεδιαστεί για να λειτουργεί σε χρόνο δέσμευσης και, μεταξύ άλλων, πλέον καταργεί τις υπολογισμένες και επιστρεφόμενες τιμές που δεν χρησιμοποιούνται. Στη λειτουργία βελτιστοποίησης "-O2", η επιλογή "-finline-functions" είναι ενεργοποιημένη, η οποία συντονίζεται εκ νέου για να ευνοήσει τον πιο συμπαγή κώδικα έναντι της απόδοσης εκτέλεσης. Η εργασία του ευρετικού για την ανάπτυξη ενσωματωμένης συνάρτησης έχει επιταχυνθεί. Τα ευρετικά μέσα επέκτασης και κλωνοποίησης συναρτήσεων μπορούν πλέον να χρησιμοποιούν πληροφορίες σχετικά με εύρη τιμών για να προβλέψουν την αποτελεσματικότητα μεμονωμένων μετασχηματισμών. Για τη C++, η ακρίβεια της ανάλυσης ψευδωνύμων βάσει τύπου έχει βελτιωθεί.
  • Ενισχυμένες βελτιστοποιήσεις χρόνου σύνδεσης (LTO). Προστέθηκε νέο εκτελέσιμο αρχείο lto-dump για επαναφορά πληροφοριών σχετικά με αρχεία αντικειμένων με bytecode LTO. Τα παράλληλα περάσματα LTO καθορίζουν αυτόματα τον αριθμό των εργασιών δημιουργίας που εκτελούνται ταυτόχρονα και, εάν δεν μπορούν να προσδιοριστούν, χρησιμοποιούν πληροφορίες σχετικά με τον αριθμό των πυρήνων της CPU ως παράγοντα παραλληλοποίησης. Προστέθηκε η δυνατότητα συμπίεσης bytecode LTO χρησιμοποιώντας τον αλγόριθμο zstd.
  • Ο μηχανισμός βελτιστοποίησης που βασίζεται στα αποτελέσματα του προφίλ κώδικα (PGO - Profile-guided optimization) έχει βελτιωθεί, ο οποίος δημιουργεί βέλτιστο κώδικα με βάση την ανάλυση των χαρακτηριστικών της εκτέλεσης κώδικα. Βελτιωμένη συντήρηση προφίλ κατά τη μεταγλώττιση και διαχωρισμός κώδικα ζεστού/κρύου. Μέσω της επιλογής "-fprofile-values» μπορεί πλέον να παρακολουθεί έως και 4 τιμές προφίλ, για παράδειγμα για έμμεσες κλήσεις και να παρέχει πιο ακριβείς πληροφορίες προφίλ.
  • Προδιαγραφές παράλληλου προγραμματισμού που εφαρμόζονται για τις γλώσσες C, C++ και Fortran OpenACC 2.6, το οποίο ορίζει εργαλεία για εκφόρτωση λειτουργιών σε GPU και εξειδικευμένους επεξεργαστές όπως το NVIDIA PTX. Η εφαρμογή του προτύπου έχει σχεδόν ολοκληρωθεί Ανοίξτε το MP 5.0 (Open Multi-Processing), το οποίο ορίζει το API και τις μεθόδους εφαρμογής παράλληλων μεθόδων προγραμματισμού σε συστήματα πολλαπλών πυρήνων και υβριδικών (CPU+GPU/DSP) με κοινόχρηστη μνήμη και μονάδες διανυσματοποίησης (SIMD). Προστέθηκαν χαρακτηριστικά όπως lastprivate conditionals, scan and loop directives, order and use_device_addr εκφράσεις. Για OpenMP και OpenACC, έχει προστεθεί υποστήριξη για εκφόρτωση λειτουργιών σε GPU τέταρτης γενιάς (Fiji) και πέμπτης γενιάς AMD Radeon (GCN) (VEGA 10/VEGA 20).
  • Για γλώσσες της οικογένειας C, η συνάρτηση «πρόσβαση» έχει προστεθεί για να περιγράψει την πρόσβαση της συνάρτησης σε αντικείμενα που περνούν μέσω αναφοράς ή δείκτη και για να συσχετίσει τέτοια αντικείμενα με ακέραια ορίσματα που περιέχουν πληροφορίες σχετικά με το μέγεθος των αντικειμένων. Για να λειτουργήσει σε συνδυασμό με την "πρόσβαση", το χαρακτηριστικό "type" υλοποιείται για να ανιχνεύσει λανθασμένη πρόσβαση από τις λειτουργίες του χρήστη, για παράδειγμα, όταν γράφετε τιμές σε μια περιοχή εκτός των ορίων του πίνακα. Προστίθεται επίσης το χαρακτηριστικό "symver" για τη συσχέτιση συμβόλων σε ένα αρχείο ELF με συγκεκριμένους αριθμούς έκδοσης.
  • Προστέθηκαν νέες προειδοποιήσεις:
    • "-Wstring-compare" (ενεργοποιημένο με "-Wextra") - προειδοποιεί για την παρουσία παραστάσεων στις οποίες το μηδέν συγκρίνεται με το αποτέλεσμα της κλήσης των συναρτήσεων strcmp και strncmp, το οποίο είναι ισοδύναμο με μια σταθερά λόγω του γεγονότος ότι το μήκος ενός ορίσματος είναι μεγαλύτερο από το μέγεθος του πίνακα στο δεύτερο όρισμα.
    • "-Wzero-length-bounds" (ενεργοποιημένο με "-Warray-bounds") - προειδοποιεί σχετικά με την πρόσβαση σε στοιχεία πίνακα μηδενικού μήκους, κάτι που μπορεί να οδηγήσει σε αντικατάσταση άλλων δεδομένων.
    • Οι προειδοποιήσεις "-Warray-bounds", "-Wformat-overflow", "-Wrestrict", "-Wreturn-local-addr" και "-Wstringop-overflow" έχουν επεκταθεί για να επεκταθεί ο αριθμός των καταστάσεων εκτός ορίων που αντιμετωπίζονται.
  • Εφάρμοσε τη δυνατότητα απευθείας καθορισμού ευρέων χαρακτήρων σε αναγνωριστικά χρησιμοποιώντας την τρέχουσα κωδικοποίηση (UTF-8 από προεπιλογή) αντί για συμβολισμό UCN (\uNNNN ή \UNNNNNNNN). Για παράδειγμα:

    static const int π = 3;
    int get_naïve_pi() {
    επιστροφή π;
    }

  • Για τη γλώσσα C, ένα τμήμα νέων χαρακτηριστικών που αναπτύχθηκαν εντός του προτύπου C2X έχει εφαρμοστεί (ενεργοποιήθηκε με τον καθορισμό -std=c2x και -std=gnu2x): εμφανίστηκε υποστήριξη για τη σύνταξη "[[]]" για τον ορισμό χαρακτηριστικών όπως στο C++ (για παράδειγμα, [[gnu ::const]], [[καταργήθηκε]], [[fallthrough]] και [[maybe_unused]]. Προστέθηκε υποστήριξη για τη σύνταξη "u8" για τον ορισμό σταθερών με χαρακτήρες UTF-8.
    Προστέθηκαν νέες μακροεντολές στο . Προστέθηκαν αντικαταστάσεις "%OB" και "%Ob" στο strftime.

  • Η προεπιλεγμένη λειτουργία για το C είναι "-fno-common", η οποία επιτρέπει πιο αποτελεσματική πρόσβαση σε καθολικές μεταβλητές σε ορισμένες πλατφόρμες.
  • Για την C++, έχουν εφαρμοστεί περίπου 16 αλλαγές και καινοτομίες, που αναπτύχθηκαν στο πρότυπο C++20. Συμπεριλαμβανομένης της προστιθέμενης λέξης-κλειδιού "continit"
    και έχει υλοποιηθεί υποστήριξη για επεκτάσεις προτύπων "έννοιες". Οι έννοιες σάς επιτρέπουν να ορίσετε ένα σύνολο απαιτήσεων παραμέτρων προτύπου που, κατά το χρόνο μεταγλώττισης, περιορίζουν το σύνολο των ορισμάτων που μπορούν να γίνουν δεκτά ως παράμετροι προτύπου. Οι έννοιες μπορούν να χρησιμοποιηθούν για την αποφυγή λογικών ασυνεπειών μεταξύ των ιδιοτήτων των τύπων δεδομένων που χρησιμοποιούνται στο πρότυπο και των ιδιοτήτων τύπου δεδομένων των παραμέτρων εισόδου.

  • Το G++ παρέχει ανίχνευση απροσδιόριστης συμπεριφοράς που προκαλείται από την αλλαγή σταθερών αντικειμένων μέσω του constexpr. Μειωμένη κατανάλωση μνήμης από τον μεταγλωττιστή κατά τον υπολογισμό του constexpr. Προστέθηκαν νέες προειδοποιήσεις "-Wmismatched-tags" και "-Wredundant-tags".
  • Έχουν προταθεί νέες επιλογές γραμμής εντολών:
    • "-fallocation-dce" για να αφαιρέσετε τα περιττά ζεύγη τελεστών "new" και "delete".
    • "-fprofile-partial-training" για να απενεργοποιήσετε τη βελτιστοποίηση μεγέθους για κώδικα που δεν έχει εκτέλεση εκπαίδευσης.
    • "-fprofile-reproducible για τον έλεγχο του επιπέδου αναπαραγωγιμότητας του προφίλ.
    • "-fprofile-prefix-path" για τον καθορισμό του βασικού καταλόγου δημιουργίας προέλευσης που χρησιμοποιείται για ξεχωριστή δημιουργία προφίλ (για "-fprofile-generate=profile_dir" και "-fprofile-use=profile_dir").
  • Στο κείμενο προειδοποίησης για τις αναφερόμενες επιλογές, παρέχονται υπερσύνδεσμοι που σας επιτρέπουν να μεταβείτε στην τεκμηρίωση για αυτές τις επιλογές. Η αντικατάσταση διεύθυνσης URL ελέγχεται χρησιμοποιώντας την επιλογή "-fdiagnostics-urls".
  • Προστέθηκε χειριστής προεπεξεργαστή "__έχει_χτίσει", το οποίο μπορεί να χρησιμοποιηθεί για έλεγχο για ενσωματωμένες λειτουργίες.
  • Προστέθηκε μια νέα ενσωματωμένη συνάρτηση "__builtin_roundeven" με εφαρμογή της λειτουργίας στρογγυλοποίησης που ορίζεται στην προδιαγραφή ISO/IEC TS 18661, παρόμοια με "στρογγυλή", αλλά στρογγυλοποιώντας τμήμα μεγαλύτερο από 0.5 προς τα πάνω (σε μεγαλύτερη τιμή), μικρότερη από 0.5 - κάτω (στο μηδέν) και ίσο με 0.5 - ξεκινώντας από την ισοτιμία του προτελευταίου ψηφίου.
  • Για την αρχιτεκτονική AArch64, προστέθηκε υποστήριξη για την επέκταση SVE2 και βελτιώθηκε η υποστήριξη για SVE (Scalable Vector Extension), συμπεριλαμβανομένης της πρόσθετης υποστήριξης για ενσωματωμένες λειτουργίες και τύπους SVE ACLE και τη χρήση διανυσματικής διαμόρφωσης. Η υποστήριξη για LSE (Μεγάλες Επεκτάσεις Συστήματος) και TME (Επέκταση Μνήμης Συναλλαγών) έχει επεκταθεί. Προστέθηκαν νέες οδηγίες που προτείνονται στα Armv8.5-A και Armv8.6-A, συμπεριλαμβανομένων οδηγιών για δημιουργία τυχαίων αριθμών, στρογγυλοποίηση, δέσμευση ετικετών μνήμης,
    bfloat16 και πολλαπλασιασμός πίνακα. Προστέθηκε υποστήριξη επεξεργαστή
    Arm Cortex-A77,
    Arm Cortex-A76AE,
    Arm Cortex-A65,
    Arm Cortex-A65AE,
    Βραχίονας Cortex-A34 και
    Marvell ThunderX3.

  • Προστέθηκε υποστήριξη για ABI FDPIC (δείκτες λειτουργίας 32-bit) για ARM64. Επανασχεδιασμένη και βελτιστοποιημένη επεξεργασία λειτουργιών ακεραίων 64-bit. Προστέθηκε υποστήριξη CPU
    Arm Cortex-A77,
    Βραχίονας Cortex-A76AE και
    Βραχίονας Cortex-M35P. Διευρυμένη υποστήριξη για οδηγίες επεξεργασίας δεδομένων ACLE, συμπεριλαμβανομένων 32-bit SIMD, πολλαπλασιασμού 16-bit, αριθμητικής κλειδαριάς και άλλων βελτιστοποιήσεων αλγορίθμων DSP. Προστέθηκε πειραματική υποστήριξη για οδηγίες ACLE CDE (Custom Datapath Extension).

  • Σημαντικά βελτιωμένη δημιουργία κώδικα και διανυσματοποίηση στο backend για GPU της AMD που βασίζονται στη μικροαρχιτεκτονική GCN.
  • Προστέθηκε υποστήριξη για συσκευές τύπου XMEGA για αρχιτεκτονική AVR
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmega808, ATmega809, ATmega1608, ATmega1609 3208, ATmega3209, ATmega4808 4809, ATmegaXNUMX και ATmegaXNUMX.

  • Μια νέα επέκταση αρχιτεκτονικής συνόλου εντολών Intel ENQCMD (-menqcmd) προστέθηκε για αρχιτεκτονικές IA-32/x86-64. Προστέθηκε υποστήριξη για επεξεργαστές Intel Cooperlake (-march=cooperlake, περιλαμβάνει την επέκταση AVX512BF16 ISA) και Tigerlake (-march=tigerlake, περιλαμβάνει τις επεκτάσεις MOVDIRI, MOVDIR64B και AVX512VP2INTERSECT ISA).
  • Μια εφαρμογή της HSAIL (Ετερογενής Αρχιτεκτονική Συστήματος Ενδιάμεση Γλώσσα) για ετερογενή υπολογιστικά συστήματα που βασίζονται στην αρχιτεκτονική HSA έχει καταργηθεί και πιθανότατα θα καταργηθεί σε μελλοντική έκδοση.

Πηγή: opennet.ru

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