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

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

Σημαντικές βελτιώσεις στο Clang 15.0:

  • Για συστήματα που βασίζονται στην αρχιτεκτονική x86, έχει προστεθεί η σημαία "-fzero-call-used-regs", η οποία διασφαλίζει ότι όλοι οι καταχωρητές CPU που χρησιμοποιούνται στη συνάρτηση μηδενίζονται πριν επιστρέψουν τον έλεγχο από τη συνάρτηση. Αυτή η επιλογή σάς επιτρέπει να προστατεύσετε από διαρροή πληροφοριών από λειτουργίες και να μειώσετε τον αριθμό των μπλοκ κατάλληλων για τη δημιουργία gadget ROP (Return-Oriented Programming) σε exploits κατά περίπου 20%.
  • Έχει εφαρμοστεί τυχαιοποίηση της τοποθέτησης δομών στη μνήμη για κώδικα C, γεγονός που περιπλέκει την εξαγωγή δεδομένων από δομές σε περίπτωση εκμετάλλευσης τρωτών σημείων. Η τυχαιοποίηση ενεργοποιείται και απενεργοποιείται χρησιμοποιώντας τα χαρακτηριστικά randomize_layout και no_randomize_layout και απαιτεί τον ορισμό μιας σειράς με τη σημαία "-frandomize-layout-seed" ή "-frandomize-layout-seed-file".
  • Προστέθηκε η σημαία "-fstrict-flex-arrays=", με την οποία μπορείτε να ελέγξετε τα όρια για το στοιχείο ευέλικτου πίνακα σε δομές (Flexible Array Members, ένας πίνακας αορίστου μεγέθους στο τέλος της δομής). Όταν οριστεί στο 0 (προεπιλογή), το τελευταίο στοιχείο της δομής με πίνακα επεξεργάζεται πάντα ως ευέλικτο πίνακα, 1 - μόνο τα μεγέθη [], [0] και [1] επεξεργάζονται ως ευέλικτο πίνακα, 2 - μόνο μεγέθη Τα [] και [0] επεξεργάζονται σαν ένας ευέλικτος πίνακας.
  • Προστέθηκε πειραματική υποστήριξη για τη γλώσσα τύπου C HLSL (High-Level Shader Language), που χρησιμοποιείται στο DirectX για τη σύνταξη shader.
  • Προστέθηκε η παράμετρος "-Warray-παράμετρος" για προειδοποίηση σχετικά με παρακάμπτουσες συναρτήσεις με δηλώσεις μη συμβατών ορισμών που σχετίζονται με πίνακες σταθερού και μεταβλητού μήκους.
  • Βελτιωμένη συμβατότητα με MSVC. Προστέθηκε υποστήριξη για τη "#pragma function" (καθοδηγεί τον μεταγλωττιστή να δημιουργήσει μια κλήση συνάρτησης αντί για ενσωματωμένη επέκταση) και "#pragma alloc_text" (καθορίζει το όνομα της ενότητας με τον κωδικό συνάρτησης) που παρέχονται στο MSVC. Προστέθηκε υποστήριξη για σημαίες /JMC και /JMC συμβατές με MSVC.
  • Συνεχίζονται οι εργασίες για την υποστήριξη των μελλοντικών προτύπων C2X και C++23. Για τη γλώσσα C, υλοποιούνται τα εξής: το χαρακτηριστικό noreturn, οι λέξεις-κλειδιά false και true, ο τύπος _BitInt(N) για ακέραιους αριθμούς δεδομένου βάθους bit, *_WIDTH μακροεντολές, το πρόθεμα u8 για κωδικοποιημένους χαρακτήρες UTF-8.

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

  • Οι δυνατότητες που σχετίζονται με την υποστήριξη OpenCL και OpenMP έχουν επεκταθεί. Προστέθηκε υποστήριξη για την επέκταση OpenCL cl_khr_subgroup_rotate.
  • Για την αρχιτεκτονική x86, έχει προστεθεί προστασία έναντι τρωτών σημείων στους επεξεργαστές που προκαλούνται από κερδοσκοπική εκτέλεση εντολών μετά από λειτουργίες άνευ όρων άλματος προς τα εμπρός. Το πρόβλημα παρουσιάζεται λόγω της προληπτικής επεξεργασίας των εντολών αμέσως μετά την εντολή διακλάδωσης στη μνήμη (SLS, Straight Line Speculation). Για να ενεργοποιήσετε την προστασία, προτείνεται η επιλογή "-mharden-sls=[none|all|return|indirect-jmp]".
  • Για πλατφόρμες που υποστηρίζουν την επέκταση SSE2, έχει προστεθεί ο τύπος _Float16, ο οποίος προσομοιώνεται χρησιμοποιώντας τον τύπο float σε περίπτωση έλλειψης υποστήριξης για οδηγίες AVX512-FP16.
  • Προστέθηκε η σημαία "-m[no-]rdpru" για τον έλεγχο της χρήσης της εντολής RDPRU, που υποστηρίζεται ξεκινώντας από επεξεργαστές AMD Zen2.
  • Προστέθηκε η σημαία "-mfunction-return=thunk-extern" για προστασία από την ευπάθεια RETBLEED, η οποία λειτουργεί προσθέτοντας μια ακολουθία εντολών που αποκλείει τη συμμετοχή του μηχανισμού κερδοσκοπικής εκτέλεσης για έμμεσους κλάδους.

Βασικές καινοτομίες στο LLVM 15.0:

  • Προστέθηκε υποστήριξη για αρχιτεκτονικές Cortex-M85 CPU, Armv9-A, Armv9.1-A και Armv9.2-A, επεκτάσεις Armv8.1-M PACBTI-M.
  • Προστέθηκε ένα πειραματικό backend για το DirectX που υποστηρίζει τη μορφή DXIL (DirectX Intermediate Language) που χρησιμοποιείται για τους shaders DirectX. Το backend ενεργοποιείται καθορίζοντας την παράμετρο "-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX" κατά τη συναρμολόγηση.
  • Το Libc++ συνεχίζει να εφαρμόζει νέες δυνατότητες των προτύπων C++20 και C++2b, συμπεριλαμβανομένης της ολοκλήρωσης της υλοποίησης της βιβλιοθήκης «format» και της προτεινόμενης πειραματικής έκδοσης της βιβλιοθήκης «ranges».
  • Βελτιωμένα backend για αρχιτεκτονικές x86, PowerPC και RISC-V.
  • Οι δυνατότητες του συνδετήρα LLD και του προγράμματος εντοπισμού σφαλμάτων LLDB έχουν βελτιωθεί.

Πηγή: opennet.ru

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