LLVM 15.0 מגיע עם שיפורים עבור backends שונים, תמיכה רבה יותר ועוד

LLVM 15 מיישם שיפורים בתמיכה

LLVM 15.0 כולל גם מספר עדכונים מעניינים ל-C/C++.

לאחר שישה חודשים של פיתוח, הוכרזה מהדורת פרויקט LLVM 15.0, בו נעשו הרבה שינויים גדולים, כמו גם תמיכה נוספת במעבדים, ארכיטקטורות חדשות ועוד.

למי שלא מכיר את LLVM, אתה צריך לדעת שזה הוא מהדר תואם GCC (מהדרים, אופטימיזרים ומחוללי קוד) שמרכיב תוכניות לקוד ביניים של הוראה וירטואלית דמוית 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. הקצה האחורי מופעל באמצעות אפשרות הבנייה "-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX".

libc++ ממשיכה ליישם תכונות חדשות של תקני C++20 ו-C++2b, כולל השלמת היישום של ספריית "פורמט" והגרסה הניסיונית המוצעת של ספריית "טווחים".

לגבי חלק השינויים הקשורים ל-Clang 15.0 מוזכר כי הוסיפה תמיכה ניסיונית עבור HLSL בשפה דמוית C (High-Level Shading Language), המשמשת לכתיבת הצללות החל מ-DirectX 9, וכן לתרגום הצללות HLSL לפורמט בינארי תואם DXIL (DirectX Intermediate Language), כמו גם פורמט SPIR -V המשמש את Vulkan. בעתיד, מתכננים ליישם תמיכה בפורמט DXBC (DirectX Bytecode) בשימוש ב-DirectX 9-11. המימוש מסופק על ידי מיקרוסופט ומבוסס על ה-DirectX Shader Compiler, שיצא ב-2017, שנבנה על בסיס LLVM 3.7.

מוזכר גם שזה ממשיך עם ה פועלים לתמיכה בתקני C2X ו-C++23 עתידיים. מיושם עבור שפת C: תכונת noreturn, מילות המפתח false ו-true, סוג _BitInt(N) עבור מספרים שלמים של עומק סיביות נתון, פקודות המאקרו *_WIDTH, הקידומת u8 לתווי UTF-8.

בנוסף לזה, יושם עבור C++: מיזוג מודול, בידוד ABI של חברי פונקציה, אתחול דינמי מסודר של משתנים לא מקומיים במודול, מפעילי אינדקס רב מימדיים, auto(x), משתנים לא מילוליים, goto ותוויות בפונקציות המוצהרות כ-constexpr, רצפי בריחה מופרדים, תווי בריחה בשם.

למערכות המבוססות על הארכיטקטורה x86, הוסיף דגל "-fzero-call-used-regs", אשר מספק אפס של כל אוגרי ה-CPU המשמשים בפונקציה לפני החזרת השליטה מהפונקציה. אפשרות זו מגן מפני דליפת נתונים של פונקציות וצמצם את מספר הבלוקים המתאימים ליצירת התקני ROP (Return Oriented Programming) בניצול בכ-20%.

הוטמעה אקראית של מיקום זיכרון של המבנים לקוד C, מה שמקשה על חילוץ הנתונים מהמבנים במקרה של ניצול נקודות תורפה. האקראיות מופעלת ומכבה עם המאפיינים randomize_layout ו-no_randomize_layout, ומחייבת את ה-Seed להגדיר עם הדגל "-randomize-layout-seed" או "-randomize-layout-seed-file" כדי להבטיח בנייה שניתנת לחזרה.

משאר השינויים הבולטים:

  • יכולות מורחבות הקשורות לתמיכה ב-OpenCL ו-OpenMP. נוספה תמיכה בסיומת OpenCL cl_khr_subgroup_rotate.
  • קצה אחורי משופר עבור ארכיטקטורות 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, הפועלת על ידי הוספת רצף של הוראות שלא כולל השתתפות של מנגנון הביצוע הספקולטיבי לקפיצות עקיפות.

בסופו של דבר אם אתה מעוניין לדעת יותר על כך, אתה יכול לבדוק את הפרטים ב הקישור הבא.


הוסף כמקור מועדף