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

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

Τα νέα χαρακτηριστικά του LLVM 9.0 περιλαμβάνουν την αφαίρεση της ετικέτας πειραματικής σχεδίασης από την πλατφόρμα στόχου RISC-V, την υποστήριξη C++ για OpenCL, τη δυνατότητα διαχωρισμού ενός προγράμματος σε μέρη δυναμικά φορτωμένα σε LLD και την υλοποίηση του "ASM GOTO", που χρησιμοποιείται στον κώδικα του πυρήνα του Linux. Το libc++ πρόσθεσε υποστήριξη για το WASI (Διασύνδεση συστήματος WebAssembly) και το LLD πρόσθεσε αρχική υποστήριξη για τη δυναμική σύνδεση WebAssembly.

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

  • Προστέθηκε εφαρμογή της ειδικής έκφρασης για το ΣΣΚ "ASM GOTO", το οποίο σας επιτρέπει να μετακινηθείτε από ένα ενσωματωμένο μπλοκ assembler σε μια ετικέτα σε κώδικα C. Αυτή η δυνατότητα απαιτείται για τη δημιουργία του πυρήνα Linux στη λειτουργία "CONFIG_JUMP_LABEL=y" χρησιμοποιώντας Clang σε συστήματα με αρχιτεκτονική x86_64. Λαμβάνοντας υπόψη τις αλλαγές που προστέθηκαν σε προηγούμενες εκδόσεις, ο πυρήνας Linux μπορεί τώρα να κατασκευαστεί σε Clang για την αρχιτεκτονική x86_64 (προηγουμένως υποστηριζόταν μόνο το κτίριο για τις αρχιτεκτονικές arm, aarch64, ppc32, ppc64le και mips). Επιπλέον, τα έργα Android και ChromeOS έχουν ήδη μετατραπεί ώστε να χρησιμοποιούν το Clang για τη δημιουργία πυρήνα και η Google δοκιμάζει το Clang ως την κύρια πλατφόρμα για τη δημιουργία πυρήνων για τα συστήματα Linux παραγωγής της. Στο μέλλον, άλλα στοιχεία LLVM μπορούν να χρησιμοποιηθούν στη διαδικασία δημιουργίας πυρήνα, συμπεριλαμβανομένων των LLD, llvm-objcopy, llvm-ar, llvm-nm και llvm-objdump.
  • Προστέθηκε πειραματική υποστήριξη για τη χρήση C++17 στο OpenCL. Τα συγκεκριμένα χαρακτηριστικά περιλαμβάνουν υποστήριξη για χαρακτηριστικά χώρου διευθύνσεων, αποκλεισμό μετατροπής χώρου διευθύνσεων ανά τελεστή casting τύπου, παροχή διανυσματικών τύπων όπως στο OpenCL για C, παρουσία συγκεκριμένων τύπων OpenCL για εικόνες, συμβάντα, κανάλια κ.λπ.
  • Προστέθηκαν νέες σημαίες μεταγλωττιστή "-ftime-trace" και "-ftime-trace-granularity=N" για τη δημιουργία αναφοράς σχετικά με το χρόνο εκτέλεσης διαφόρων σταδίων του frontend (ανάλυση, αρχικοποίηση) και του backend (στάδια βελτιστοποίησης). Η αναφορά αποθηκεύεται σε μορφή json, συμβατή με το chrome://tracing και το speedscope.app.
  • Προστέθηκε η επεξεργασία του προσδιοριστή «__declspec(κατανομέας)» και η δημιουργία συνοδευτικών πληροφοριών εντοπισμού σφαλμάτων που σας επιτρέπουν να παρακολουθείτε την κατανάλωση μνήμης στο περιβάλλον του Visual Studio.
  • Για τη γλώσσα C, έχει προστεθεί υποστήριξη για τη μακροεντολή "__FILE_NAME__", η οποία μοιάζει με τη μακροεντολή "__FILE__", αλλά περιλαμβάνει μόνο το όνομα του αρχείου χωρίς την πλήρη διαδρομή.
  • Η C++ έχει επεκτείνει την υποστήριξη για χαρακτηριστικά χώρου διευθύνσεων για να καλύψει διάφορες δυνατότητες της C++, συμπεριλαμβανομένων των μοτίβων παραμέτρων και ορισμάτων, τύπων αναφοράς, συμπερασμάτων τύπου επιστροφής, αντικειμένων, συναρτήσεων που δημιουργούνται αυτόματα, ενσωματωμένους τελεστές και άλλα.
  • Οι δυνατότητες που σχετίζονται με την υποστήριξη για OpenCL, OpenMP και CUDA έχουν επεκταθεί. Αυτό περιλαμβάνει αρχική υποστήριξη για σιωπηρή συμπερίληψη ενσωματωμένων λειτουργιών OpenCL (έχει προστεθεί η σημαία "-fdeclare-opencl-builtins"), η επέκταση cl_arm_integer_dot_product έχει εφαρμοστεί και τα διαγνωστικά εργαλεία έχουν επεκταθεί.
  • Η εργασία του στατικού αναλυτή έχει βελτιωθεί και έχει προστεθεί τεκμηρίωση για την εκτέλεση στατικής ανάλυσης. Προστέθηκαν σημαίες για την εμφάνιση διαθέσιμων μονάδων ελέγχου και υποστηριζόμενες επιλογές ("-analyzer-checker[-option]-help", "-analyzer-checker[-option]-help-alpha" και "-analyzer-checker[-option]-help " -προγραμματιστής"). Προστέθηκε η σημαία "-analyzer-werror" για να αντιμετωπίζονται οι προειδοποιήσεις ως σφάλματα.
    Προστέθηκαν νέες λειτουργίες επαλήθευσης:

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling για τον εντοπισμό μη ασφαλών πρακτικών για εργασία με buffer.
    • osx.MIGChecker για αναζήτηση παραβιάσεων των κανόνων κλήσης MIG (Mach Interface Generator).
    • optin.osx.OSObjectCStyleCast για να βρει λανθασμένες μετατροπές αντικειμένων libkern XNU.
    • apiModeling.llvm με ένα σύνολο λειτουργιών ελέγχου μοντελοποίησης για τον εντοπισμό σφαλμάτων στη βάση κώδικα LLVM.
    • Σταθεροποιημένος κώδικας για τον έλεγχο μη αρχικοποιημένων αντικειμένων C++ (UninitializedObject στο πακέτο optin.cplusplus).
  • Το βοηθητικό πρόγραμμα clang-format έχει προσθέσει υποστήριξη για τη μορφοποίηση κώδικα στη γλώσσα C# και παρέχει υποστήριξη για το στυλ μορφοποίησης κώδικα που χρησιμοποιείται από τη Microsoft.
  • Το clang-cl, μια εναλλακτική διεπαφή γραμμής εντολών που παρέχει συμβατότητα σε επίπεδο επιλογής με τον μεταγλωττιστή cl.exe που περιλαμβάνεται στο Visual Studio, έχει προσθέσει ευρετικές μεθόδους για να αντιμετωπίζει τα ανύπαρκτα αρχεία ως επιλογές γραμμής εντολών και να εμφανίζει μια αντίστοιχη προειδοποίηση (για παράδειγμα, κατά την εκτέλεση του "clang-cl /diagnostic :caret /c test.cc");
  • Ένα μεγάλο μέρος νέων επιταγών έχει προστεθεί στο linter clang-tidy, συμπεριλαμβανομένων των πρόσθετων ελέγχων ειδικά για το OpenMP API.
  • Αναπτυγμένος δυνατότητες διακομιστή χτύπησε (Clang Server), στον οποίο η λειτουργία δημιουργίας ευρετηρίου φόντου είναι ενεργοποιημένη από προεπιλογή, έχει προστεθεί υποστήριξη για ενέργειες με βάση τα συμφραζόμενα με κώδικα (ανάκτηση μεταβλητής, επέκταση ορισμών αυτόματων και μακροεντολών, μετατροπή συμβολοσειρών διαφυγής σε συμβολοσειρές χωρίς διαφυγή), δυνατότητα εμφάνισης προειδοποιήσεις από το Clang-tidy, διευρυμένα διαγνωστικά σφαλμάτων σε αρχεία κεφαλίδας και πρόσθεσαν τη δυνατότητα εμφάνισης πληροφοριών σχετικά με την ιεραρχία τύπων.

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

  • Μια πειραματική δυνατότητα κατάτμησης έχει προστεθεί στη σύνδεση LLD, η οποία σας επιτρέπει να χωρίσετε ένα πρόγραμμα σε πολλά μέρη, καθένα από τα οποία βρίσκεται σε ξεχωριστό αρχείο ELF. Αυτή η δυνατότητα σάς επιτρέπει να εκκινήσετε το κύριο μέρος του προγράμματος, το οποίο θα φορτώσει άλλα στοιχεία όπως απαιτείται κατά τη λειτουργία (για παράδειγμα, μπορείτε να διαχωρίσετε το ενσωματωμένο πρόγραμμα προβολής PDF σε ένα ξεχωριστό αρχείο, το οποίο θα φορτωθεί μόνο όταν ο χρήστης ανοίξει το PDF αρχείο).

    Συνδετήρας LLD έφερε σε κατάσταση κατάλληλη για σύνδεση του πυρήνα Linux για αρχιτεκτονικές arm32_7, arm64, ppc64le και x86_64.
    Νέες επιλογές "-" (έξοδος σε stdout), "-[no-]allow-shlib-undefined", "-undefined-glob", "-nmagic", "-omagic", "-dependent-library", " - z ifunc-noplt" και "-z common-page-size". Για την αρχιτεκτονική AArch64, έχει προστεθεί υποστήριξη για οδηγίες BTI (Branch Target Indicator) και PAC (Pointer Authentication Code). Η υποστήριξη για πλατφόρμες MIPS, RISC-V και PowerPC έχει βελτιωθεί σημαντικά. Προστέθηκε αρχική υποστήριξη για δυναμική σύνδεση για WebAssembly.

  • Στο libc++ εφαρμόστηκε συναρτήσεις ssize, std::is_constant_evaluated, std::midpoint και std::lerp, οι μέθοδοι "front" και "back" έχουν προστεθεί στο std::span, χαρακτηριστικά των τύπων std::is_unbounded_array και std::is_bounded_array έχουν προστεθεί , οι δυνατότητες std έχουν επεκταθεί: :atomic. Η υποστήριξη για το GCC 4.9 έχει διακοπεί (μπορεί να χρησιμοποιηθεί με το GCC 5.1 και νεότερες εκδόσεις). Προστέθηκε υποστήριξη ΗΜΟΥΝ (Διασύνδεση συστήματος WebAssembly, μια διεπαφή για τη χρήση του WebAssembly εκτός του προγράμματος περιήγησης).
  • Έχουν προστεθεί νέες βελτιστοποιήσεις. Ενεργοποιήθηκε η μετατροπή κλήσεων memcmp σε bcmp σε ορισμένες περιπτώσεις. Εφαρμοσμένη παράλειψη ελέγχου εύρους για πίνακες μετάβασης στους οποίους τα κάτω μπλοκ διακόπτη δεν είναι προσβάσιμα ή όταν δεν χρησιμοποιούνται οδηγίες, για παράδειγμα, κατά την κλήση συναρτήσεων τύπου void.
  • Το backend για την αρχιτεκτονική RISC-V έχει σταθεροποιηθεί, το οποίο δεν είναι πλέον τοποθετημένο ως πειραματικό και είναι κατασκευασμένο από προεπιλογή. Παρέχει πλήρη υποστήριξη δημιουργίας κώδικα για παραλλαγές σετ εντολών RV32I και RV64I με επεκτάσεις MAFDC.
  • Έχουν γίνει πολυάριθμες βελτιώσεις στα backend για τις αρχιτεκτονικές X86, AArch64, ARM, SystemZ, MIPS, AMDGPU και PowerPC. Για παράδειγμα, για την αρχιτεκτονική
    Το AArch64 πρόσθεσε υποστήριξη για οδηγίες SVE2 (Scalable Vector Extension 2) και MTE (Memory Tagging Extensions), ενώ στο backend του ARM προστέθηκε υποστήριξη για την αρχιτεκτονική Armv8.1-M και την επέκταση MVE (M-Profile Vector Extension). Η υποστήριξη για την αρχιτεκτονική GFX10 (Navi) έχει προστεθεί στο backend AMDGPU, οι δυνατότητες κλήσης λειτουργιών είναι ενεργοποιημένες από προεπιλογή και ενεργοποιείται ένα συνδυασμένο πάσο DPP (Δεδομένα-Parallel Primitives).

  • Το πρόγραμμα εντοπισμού σφαλμάτων LLDB έχει πλέον χρωματική επισήμανση για backtraces και πρόσθετη υποστήριξη για τα μπλοκ DWARF4 debug_types και DWARF5 debug_info.
  • Η υποστήριξη για αντικείμενα και εκτελέσιμα αρχεία σε μορφή COFF έχει προστεθεί στα βοηθητικά προγράμματα llvm-objcopy και llvm-strip.

Πηγή: opennet.ru

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