Το LLVM 15.0 έρχεται με βελτιώσεις για διαφορετικά backend, μεγαλύτερη υποστήριξη και πολλά άλλα

Το LLVM 15 εφαρμόζει βελτιώσεις υποστήριξης

Το LLVM 15.0 περιλαμβάνει επίσης μια σειρά από ενδιαφέρουσες ενημερώσεις στο C/C++.

Μετά από έξι μήνες ανάπτυξης, Ανακοινώθηκε η κυκλοφορία του έργου LLVM 15.0, στην οποία έχουν γίνει πολλές σημαντικές αλλαγές, καθώς και πρόσθετη υποστήριξη για νέους επεξεργαστές, αρχιτεκτονικές και άλλα.

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

Ο ψευδοκώδικας που δημιουργείται μπορεί να μετατραπεί από τον μεταγλωττιστή JIT σε οδηγίες μηχανής ακριβώς τη στιγμή της εκτέλεσης του προγράμματος.

Σημαντικά νέα χαρακτηριστικά του LLVM 15.0

Σε αυτή τη νέα έκδοση που παρουσιάζεται, επισημαίνεται ότι το υποστήριξη για επεξεργαστές Cortex-M85, καθώς και για τις αρχιτεκτονικές Armv9-A, Armv9.1-A και Armv9.2-A, επεκτάσεις Armv8.1-M PACBTI-M.

Μια άλλη αλλαγή που ξεχωρίζει είναι ότι πρόσθεσε ένα πειραματικό σύστημα υποστήριξης DirectX ότι υποστηρίζει μορφή DXIL (DirectX Intermediate Language) που χρησιμοποιείται για σκίαστρους DirectX. Το backend ενεργοποιείται μέσω της επιλογής δημιουργίας "-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX".

Το libc++ συνεχίζει να εφαρμόζει νέες δυνατότητες των προτύπων C++20 και C++2b, συμπεριλαμβανομένης της ολοκλήρωσης της εφαρμογής της βιβλιοθήκης «μορφοποίησης» και της προτεινόμενης πειραματικής έκδοσης της βιβλιοθήκης «περιοχών».

Για το κομμάτι των αλλαγών που σχετίζεται με το Clang 15.0 αναφέρεται ότι προστέθηκε πειραματική υποστήριξη για γλώσσα τύπου C HLSL (High-Level Shading Language), η οποία χρησιμοποιείται για τη σύνταξη shaders που ξεκινούν με το DirectX 9, καθώς και για τη μετάφραση των shaders HLSL σε δυαδική μορφή DXIL (DirectX Intermediate Language) συμβατή με DirectX 12, καθώς και τη μορφή SPIR -V που χρησιμοποιείται από τη Vulkan. Στο μέλλον, σχέδιο για την υλοποίηση υποστήριξης για τη μορφή DXBC (DirectX Bytecode) που χρησιμοποιείται στο DirectX 9-11. Η υλοποίηση παρέχεται από τη Microsoft και βασίζεται στον DirectX Shader Compiler, που κυκλοφόρησε το 2017, που δημιουργήθηκε με βάση το LLVM 3.7.

Αναφέρεται επίσης ότι συνεχίζει με το εργάζονται για την υποστήριξη των μελλοντικών προτύπων C2X και C++23. Υλοποιήθηκε για τη γλώσσα C: το χαρακτηριστικό noreturn, οι λέξεις-κλειδιά false και true, ο τύπος _BitInt(N) για ακέραιους αριθμούς δεδομένου βάθους bit, οι μακροεντολές *_WIDTH, το πρόθεμα u8 για χαρακτήρες UTF-8.

Εκτός από αυτό, έχει εφαρμοστεί για C++: συγχώνευση λειτουργικών μονάδων, Απομόνωση ABI των μελών συνάρτησης, διατεταγμένη δυναμική αρχικοποίηση μη τοπικών μεταβλητών στη μονάδα, πολυδιάστατους τελεστές ευρετηρίου, auto(x), μη κυριολεκτικές μεταβλητές, goto και ετικέτες σε συναρτήσεις που δηλώνονται ως constexpr, οριοθετημένες ακολουθίες διαφυγής, ονομασμένοι χαρακτήρες διαφυγής.

Για συστήματα που βασίζονται στην αρχιτεκτονική x86, προστέθηκε σημαία "-fzero-call-used-regs", που παρέχει μηδενισμό όλων των καταχωρητών CPU που χρησιμοποιούνται στη συνάρτηση πριν επιστρέψει τον έλεγχο από τη συνάρτηση. αυτή την επιλογή προστατεύει από διαρροή δεδομένων των λειτουργιών και να μειώσει τον αριθμό των μπλοκ κατάλληλων για τη δημιουργία συσκευών ROP (Return Oriented Programming) σε exploits κατά περίπου 20%.

Έχει εφαρμοστεί τυχαιοποίηση θέσης στη μνήμη των δομών για κώδικα C, γεγονός που περιπλέκει την εξαγωγή δεδομένων από τις δομές σε περίπτωση εκμετάλλευσης τρωτών σημείων. Η τυχαιοποίηση ενεργοποιείται και απενεργοποιείται με τα χαρακτηριστικά randomize_layout και no_randomize_layout και απαιτεί τη σήμανση "-frandomize-layout-seed" ή "-frandomize-layout-seed-file" για να διασφαλιστούν επαναλαμβανόμενες εκδόσεις.

Από τις άλλες αλλαγές που ξεχωρίζουν:

  • Διευρυμένες δυνατότητες που σχετίζονται με την υποστήριξη OpenCL και OpenMP. Προστέθηκε υποστήριξη για την επέκταση OpenCL cl_khr_subgroup_rotate.
  • Βελτιωμένα backend για αρχιτεκτονικές x86, PowerPC και RISC-V.
    Βελτιωμένες δυνατότητες σύνδεσης LLD και εντοπισμού σφαλμάτων LLDB.
  • Προστέθηκε σημαία "-fstrict-flex-arrays=" » με το οποίο μπορείτε να ελέγξετε τα όρια ενός στοιχείου μαλακού πίνακα σε δομές (Soft Array Members, ένας πίνακας αορίστου μεγέθους στο τέλος της δομής).
  • Προστέθηκε η επιλογή "-warray-parameter" για προειδοποίηση σχετικά με παρακάμπτουσες συναρτήσεις με αναντιστοιχίες δηλώσεων ορίσματος που σχετίζονται με πίνακες σταθερού και μεταβλητού μήκους.
  • Βελτιωμένη συμβατότητα με MSVC.
  • Προστέθηκε υποστήριξη για τη συνάρτηση #pragma και το "#pragma alloc_text" που παρέχονται στο MSVC.
  • Προστέθηκε υποστήριξη για σημαίες /JMC και /JMC συμβατές με MSVC.
  • Προστέθηκε η σημαία "-m[no-]rdpru" για τον έλεγχο της χρήσης της εντολής RDPRU, που υποστηρίζεται από επεξεργαστές AMD Zen2.
  • Προστέθηκε η σημαία "-mfunction-return=thunk-extern" για προστασία από την ευπάθεια RETBLEED, η οποία λειτουργεί προσθέτοντας μια ακολουθία εντολών που αποκλείει τη συμμετοχή του κερδοσκοπικού μηχανισμού εκτέλεσης για έμμεσα άλματα.

Τελικά Εάν ενδιαφέρεστε να μάθετε περισσότερα γι 'αυτό, μπορείτε να ελέγξετε τις λεπτομέρειες στο παρακάτω σύνδεσμο.


Προσθήκη ως προτιμώμενης πηγής