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

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

Η βασική αλλαγή στη νέα κυκλοφορία ήταν η συμπερίληψη του φλάντζα, frontend για τη γλώσσα Fortran. Το Flang υποστηρίζει Fortran 2018, OpenMP 4.5 και OpenACC 3.0, αλλά η ανάπτυξη του έργου δεν έχει ακόμη ολοκληρωθεί και το μπροστινό μέρος περιορίζεται στην ανάλυση κώδικα και τον έλεγχο της ορθότητας. Η δημιουργία ενδιάμεσου κώδικα LLVM δεν υποστηρίζεται ακόμη και για τη δημιουργία εκτελέσιμων αρχείων, δημιουργείται κανονικός κώδικας και μεταβιβάζεται σε έναν εξωτερικό μεταγλωττιστή Fortran.

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

  • Προστέθηκε η δυνατότητα επαναφοράς του αφηρημένου δέντρου σύνταξης (AST) για κατεστραμμένο κώδικα C++, ο οποίος μπορεί να χρησιμοποιηθεί για τη διάγνωση σφαλμάτων και παρέχει πρόσθετες πληροφορίες σε εξωτερικά βοηθητικά προγράμματα, όπως clang-tidy και clangd. Η δυνατότητα είναι ενεργοποιημένη από προεπιλογή για τον κώδικα C++ και ελέγχεται μέσω των επιλογών "-Xclang -f[no-]recovery-ast".
  • Προστέθηκαν νέες διαγνωστικές λειτουργίες:
    • Το "-Wpointer-to-int-cast" είναι μια ομάδα προειδοποιήσεων σχετικά με τη μετάδοση δεικτών σε έναν ακέραιο τύπο int που δεν περιλαμβάνει όλες τις πιθανές τιμές.
    • "-Wuniitialized-const-reference" - προειδοποίηση σχετικά με τη μεταβίβαση μη αρχικοποιημένων μεταβλητών σε παραμέτρους συνάρτησης που δέχονται ορίσματα αναφοράς με το χαρακτηριστικό "const".
    • "-Wimplicit-const-int-float-conversion" - ενεργοποιημένη από προεπιλογή προειδοποίηση σχετικά με την σιωπηρή μετατροπή μιας πραγματικής σταθεράς σε έναν ακέραιο τύπο.
  • Για την πλατφόρμα ARM, παρέχονται λειτουργίες C που είναι ενσωματωμένες στον μεταγλωττιστή (Intrinsics), αντικαταστάθηκε από αποτελεσματικές διανυσματικές οδηγίες Arm v8.1-M MVE και CDE. Οι διαθέσιμες λειτουργίες ορίζονται στα αρχεία κεφαλίδας arm_mve.h και arm_cde.h.
  • Προστέθηκε ένα σύνολο εκτεταμένων τύπων ακεραίων _ExtInt(N), που σας επιτρέπει να δημιουργείτε τύπους που δεν είναι πολλαπλάσια των δυνάμεων του δύο, οι οποίοι μπορούν να επεξεργαστούν αποτελεσματικά σε FPGA/HLS. Για παράδειγμα, _ExtInt(7) ορίζει έναν ακέραιο τύπο που αποτελείται από 7 bit.
  • Προστέθηκαν μακροεντολές που ορίζουν την υποστήριξη για ενσωματωμένες λειτουργίες C με βάση τις οδηγίες ARM SVE (Scalable Vector Extension):
    __ARM_FEATURE_SVE, __ARM_FEATURE_SVE_BF16,
    __ARM_FEATURE_SVE_MATMUL_FP32, __ARM_FEATURE_SVE_MATMUL_FP64,
    __ARM_FEATURE_SVE_MATMUL_INT8,
    __ARM_FEATURE_SVE2, __ARM_FEATURE_SVE2_AES,
    __ARM_FEATURE_SVE2_BITPERM,
    __ARM_FEATURE_SVE2_SHA3,
    __ARM_FEATURE_SVE2_SM4. Για παράδειγμα, η μακροεντολή __ARM_FEATURE_SVE ορίζεται κατά τη δημιουργία κώδικα AArch64 ορίζοντας την επιλογή γραμμής εντολών "-march=armv8-a+sve".

  • Η σημαία "-O" ταυτίζεται τώρα με τη λειτουργία βελτιστοποίησης "-O1" αντί για "-O2".
  • Προστέθηκαν νέες σημαίες μεταγλωττιστή:
    • "-fstack-clash-protection" - επιτρέπει την προστασία από διασταυρώσεις στοίβας και σωρού.
    • "-ffp-exception-behavior={ignore,maytrap,strict}" - σας επιτρέπει να επιλέξετε τη λειτουργία χειριστή εξαιρέσεων για αριθμούς κινητής υποδιαστολής.
    • "-ffp-model={precise,strict,fast}" - Απλοποιεί την πρόσβαση σε μια σειρά εξειδικευμένων επιλογών για αριθμούς κινητής υποδιαστολής.
    • "-fpch-codegen" και "-fpch-debuginfo" για τη δημιουργία μιας προμεταγλωττισμένης κεφαλίδας (PCH) με ξεχωριστά αρχεία αντικειμένων για κώδικα και πληροφορίες εντοπισμού σφαλμάτων.
    • "-fsanitize-coverage-allowlist" και "-fsanitize-coverage-blocklist" για έλεγχο λευκών και μαύρων λιστών δοκιμής κάλυψης.
    • "-mtls-size={12,24,32,48}" για να επιλέξετε το μέγεθος TLS (νήμα-τοπικός χώρος αποθήκευσης).
    • "-menable-experimental-extension" για ενεργοποίηση πειραματικών επεκτάσεων RISC-V.
  • Η προεπιλεγμένη λειτουργία για το C είναι "-fno-common", η οποία επιτρέπει πιο αποτελεσματική πρόσβαση σε καθολικές μεταβλητές σε ορισμένες πλατφόρμες.
  • Η προεπιλεγμένη κρυφή μνήμη της μονάδας έχει μετακινηθεί από το /tmp στον κατάλογο ~/.cache. Για παράκαμψη, μπορείτε να χρησιμοποιήσετε τη σημαία “-fmodules-cache-path=”.
  • Το προεπιλεγμένο πρότυπο γλώσσας C έχει ενημερωθεί από gnu11 σε gnu17.
  • Προστέθηκε προκαταρκτική υποστήριξη για την επέκταση GNU C "asm inline» για να προσθέσετε ένθετα συναρμολογητή. Η επέκταση βρίσκεται ακόμη υπό ανάλυση, αλλά δεν επεξεργάζεται με κανέναν τρόπο.
  • Οι δυνατότητες που σχετίζονται με την υποστήριξη OpenCL και CUDA έχουν επεκταθεί. Προστέθηκε υποστήριξη για διαγνωστικά μπλοκ OpenCL 2.0 και εφαρμόστηκαν νέες δυνατότητες OpenMP 5.0.
  • Προστέθηκε η επιλογή IndentExternBlock στο βοηθητικό πρόγραμμα μορφοποίησης clang για ευθυγράμμιση εντός των εξωτερικών μπλοκ "C" και των εξωτερικών "C++".
  • Ο στατικός αναλυτής έχει βελτιωμένο χειρισμό των κληρονομικών κατασκευαστών στη C++. Προστέθηκαν νέοι έλεγχοι alpha.core.C11Lock και alpha.fuchsia.Lock για έλεγχο για κλειδαριές, alpha.security.cert.pos.34c για ανίχνευση μη ασφαλούς χρήσης putenv, webkit.NoUncountedMemberChecker και webkit.RefCntblBaseVirtualDtor για εντοπισμό προβλημάτων με μη καταμέτρηση .cplusplus .SmartPtr για έλεγχο μηδενικής μη αναφοράς έξυπνου δείκτη.
  • Σε λίντερ χτύπησε-τακτοποιημένο προστέθηκε ένα μεγάλο μέρος νέων επιταγών.
  • Ο διακομιστής clangd caching (Clang Server) έχει βελτιωμένη απόδοση και πρόσθεσε νέες διαγνωστικές δυνατότητες.

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

  • Το σύστημα κατασκευής έχει αλλάξει σε χρήση Python 3. Εάν η Python 3 δεν είναι διαθέσιμη, είναι δυνατή η επαναφορά στη χρήση Python 2.
  • Η διεπαφή με τον μεταγλωττιστή για τη γλώσσα Go (llgo) εξαιρείται από την έκδοση, η οποία ενδέχεται να αναδιαρθρωθεί στο μέλλον.
  • Το χαρακτηριστικό vector-function-abi-variant προστέθηκε στην ενδιάμεση αναπαράσταση (IR) για να περιγράψει την αντιστοίχιση μεταξύ βαθμωτών και διανυσματικών συναρτήσεων για τη διανυσματοποίηση κλήσεων. Από το llvm::VectorType υπάρχουν δύο ξεχωριστοί τύποι διανυσμάτων llvm::FixedVectorType και llvm::ScalableVectorType.
  • Η διακλάδωση με βάση τις τιμές udef και η μεταβίβαση τιμών undef σε τυπικές λειτουργίες βιβλιοθήκης αναγνωρίζεται ως απροσδιόριστη συμπεριφορά. ΣΕ
    Το memset/memcpy/memmove επιτρέπει τη μετάδοση δεικτών undef, αλλά αν η παράμετρος με μέγεθος είναι μηδέν.

  • Το LLJIT έχει προσθέσει υποστήριξη για την εκτέλεση στατικών αρχικοποιήσεων μέσω των μεθόδων LLJIT::initialize και LLJIT::deinitialize. Έχει υλοποιηθεί η δυνατότητα προσθήκης στατικών βιβλιοθηκών στο JITDylib χρησιμοποιώντας την κλάση StaticLibraryDefinitionGenerator. Προστέθηκε C API για ORCv2 (API για τη δημιουργία μεταγλωττιστών JIT).
  • Η υποστήριξη για επεξεργαστές Cortex-A64, Cortex-A34, Cortex-A77 και Cortex-X78 έχει προστεθεί στο backend για την αρχιτεκτονική AArch1. Εφαρμοσμένες επεκτάσεις ARMv8.2-BF16 (BFloat16) και ARMv8.6-A, συμπεριλαμβανομένων των επεκτάσεων RMv8.6-ECV (Βελτιωμένη εικονικοποίηση μετρητή), ARMv8.6-FGT (Fine Grained Traps), ARMv8.6-AMU (εικονικοποίηση Activity Monitors) και ARMv8.0-DGH (Υπόδειξη συλλογής δεδομένων). Παρέχεται η δυνατότητα δημιουργίας κώδικα για ενσωματωμένες συναρτήσεις-δεσμεύσεις σε διανυσματικές οδηγίες SVE.
  • Η υποστήριξη για επεξεργαστές Cortex-M55, Cortex-A77, Cortex-A78 και Cortex-X1 έχει προστεθεί στο backend για την αρχιτεκτονική ARM. Εφαρμόστηκαν επεκτάσεις
    Armv8.6-A Matrix Multiply και RMv8.2-AA32BF16 BFloat16.

  • Η υποστήριξη για τη δημιουργία κώδικα για επεξεργαστές POWER10 έχει προστεθεί στο backend για την αρχιτεκτονική PowerPC. Οι βελτιστοποιήσεις βρόχου έχουν επεκταθεί και η υποστήριξη κινητής υποδιαστολής έχει βελτιωθεί.
  • Το backend για την αρχιτεκτονική RISC-V επιτρέπει την αποδοχή ενημερώσεων κώδικα που υποστηρίζουν πειραματικά εκτεταμένα σύνολα εντολών που δεν έχουν ακόμη εγκριθεί επίσημα.
  • Το backend για την αρχιτεκτονική AVR έχει μεταφερθεί από την πειραματική κατηγορία σε σταθερό, που περιλαμβάνεται στη βασική διανομή.
  • Το backend για την αρχιτεκτονική x86 υποστηρίζει οδηγίες Intel AMX και TSXLDTRK. Προστέθηκε προστασία από επιθέσεις HVAC (Load Value Injection), και εφαρμόζει επίσης έναν γενικό μηχανισμό καταστολής παρενεργειών κερδοσκοπικής εκτέλεσης για τον αποκλεισμό επιθέσεων που προκαλούνται από κερδοσκοπική εκτέλεση λειτουργιών στη CPU.
  • Στο backend για την αρχιτεκτονική SystemZ, έχει προστεθεί υποστήριξη για MemorySanitizer και LeakSanitizer.
  • Προστέθηκε υποστήριξη για αρχείο κεφαλίδας με μαθηματικές σταθερές στο Libc++ .
  • Αναπτυγμένος Δυνατότητες σύνδεσης LLD. Βελτιωμένη υποστήριξη για τη μορφή ELF, συμπεριλαμβανομένων των προστιθέμενων επιλογών "--lto-emit-asm", "--lto-hole-program-visibility", "-print-archive-stats", "-shuffle-sections", " -thinlto- single-module", "-unique", "-rosegment", "-threads=N". Προστέθηκε η επιλογή "--time-trace" για αποθήκευση του ίχνους σε ένα αρχείο, το οποίο στη συνέχεια μπορεί να αναλυθεί μέσω της διεπαφής chrome://tracing στο Chrome.

Πηγή: opennet.ru

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