לאחר שישה חודשים של פיתוח, הוצגה השחרור של פרויקט LLVM 13.0 - ערכת כלים תואמת GCC (מהדרים, אופטימיזציה ומחוללי קוד) המרכיבה תוכניות לקוד ביניים של הוראות וירטואליות דמויות RISC (מכונה וירטואלית ברמה נמוכה עם מערכת אופטימיזציה מרובת רמות). ניתן להמיר את הפסאודוקוד שנוצר באמצעות מהדר JIT להוראות מכונה ישירות בזמן ביצוע התוכנית.
שיפורים ב-Clang 13.0:
- הטמיעה תמיכה בקריאות זנב מובטחות (קריאה לתתי שגרה ממש בסוף פונקציה, יצירת רקורסיית זנב אם תת-השגרה קוראת לעצמה). תמיכה בשיחות זנב מובטחות מסופקת על ידי התכונה "[[clang::musttail]]" ב-C++ ו-"__attribute__((musttail))" ב-C, המשמשת בהצהרת "החזרה". התכונה מאפשרת לך ליישם אופטימיזציות על ידי פריסת קוד באיטרציה שטוחה כדי לחסוך בצריכת מחסנית.
- הצהרות "שימוש" ותוספות clang מספקות תמיכה להגדרת תכונות בסגנון C++11 באמצעות הפורמט "[[]]".
- הוסיף את הדגל "-Wreserved-identifier" כדי להציג אזהרה כאשר אתה מציין מזהים שמורים בקוד המשתמש.
- נוספו דגלים "-Wunused-but-set-parameter" ו-"-Wunused-but-set-variable" כדי להציג אזהרה אם פרמטר או משתנה מוגדר אך לא נעשה בו שימוש.
- נוסף דגל "-Wnull-pointer-subtraction" כדי להנפיק אזהרה אם הקוד עשוי להציג התנהגות לא מוגדרת עקב השימוש במצביע null בפעולות חיסור.
- הוסיף את הדגל "-fstack-usage" כדי ליצור עבור כל קובץ קוד קובץ ".su" נוסף המכיל מידע על גודל ה-stack frames עבור כל פונקציה שהוגדרה בקובץ המעובד.
- סוג פלט חדש נוסף לנתח הסטטי - "sarif-html", שמוביל להפקת דוחות בו זמנית בפורמטים HTML ו- Sarif. נוסף בדיקת allocClassWithName חדשה. בעת ציון האפשרות "-analyzer-display-progress", זמן הניתוח של כל פונקציה מוצג. מנתח המצביעים החכם (alpha.cplusplus.SmartPtr) כמעט מוכן.
- היכולות הקשורות לתמיכה ב-OpenCL הורחבו. נוספה תמיכה בהרחבות חדשות cl_khr_integer_dot_product, cl_khr_extended_bit_ops, __cl_clang_bitfields ו-__cl_clang_non_portable_kernel_param_types. היישום של מפרט OpenCL 3.0 נמשך. עבור C, מפרט OpenCL 1.2 משמש כברירת מחדל, אלא אם נבחרה גרסה אחרת במפורש. עבור C++, נוספה תמיכה בקבצים עם הסיומת ".clcpp".
- הוטמעה תמיכה בהנחיות לשינוי לולאה ("#pragma omp unrol" ו-"#pragma omp tile") המוגדרות במפרט OpenMP 5.1.
- נוספו אפשרויות לכלי השירות בפורמט clang: SpacesInLineCommentPrefix כדי להגדיר את מספר הרווחים לפני הערות, IndentAccessModifiers, LambdaBodyIndentation ו-PPIndentWidth כדי לשלוט ביישור של ערכים, ביטויי lambda והנחיות קדם-מעבד. הורחבו האפשרויות למיון ספירת קובצי הכותרות (SortIncludes). נוספה תמיכה בעיצוב קבצי JSON.
- חלק גדול של צ'קים חדשים נוספו ל-linter clang-klang.
חידושים מרכזיים ב-LLVM 13.0:
- נוספה האפשרות "-ehcontguard" לשימוש בטכנולוגיית CET (Windows טכנולוגיית אכיפת זרימת בקרה) כדי להגן מפני ביצוע פרצות שנבנו באמצעות טכניקות תכנות מונחה החזרה (ROP) בשלב טיפול בחריגים.
- פרויקט debuginfo-test שונה ל-cross-project-tests והוא נועד לבחון רכיבים מפרויקטים שונים, לא מוגבל למידע באגים.
- מערכת ההרכבה מספקת תמיכה לבניית מספר הפצות, למשל, אחת עם כלי עזר, והשנייה עם ספריות למפתחים.
- בקצה האחורי של ארכיטקטורת AArch64, תמיכה בהרחבות Armv9-A RME (Realm Management Extension) ו-SME (Scalable Matrix Extension) מיושמת ב-assembler.
- תמיכה ב-ISA V68/HVX נוספה לקצה האחורי של ארכיטקטורת ה-Hexagon.
- ה-x86 backend יש תמיכה משופרת עבור מעבדי AMD Zen 3.
- נוספה תמיכה עבור GFX1013 RDNA2 APU לקצה האחורי של AMDGPU.
- Libc++ ממשיכה ליישם תכונות חדשות של תקני C++20 ו-C++2b, כולל השלמת ספריית ה"מושגים". עבור הפלטפורמה Windows נוספה תמיכה עבור std::filesystem המבוסס על MinGW. קבצי הכותרת הופרדו. , ו נוספה אפשרות הבנייה LIBCXX_ENABLE_INCOMPLETE_FEATURES כדי להשבית קבצי כותרת עם פונקציונליות לא שלמה.
- הורחבו היכולות של מקשר ה-LLD, במסגרתו מיושמת תמיכה במעבדי Big-endian Aarch64, וה-backend של Mach-O הובא למצב המאפשר קישור בין תוכניות רגילות. כללו שיפורים הדרושים לקישור Glibc באמצעות LLD.
- כלי השירות llvm-mca (Machine Code Analyzer) הוסיפה תמיכה במעבדים המבצעים הוראות לפי הסדר (צינור על-סקלארי לפי הסדר), כגון ARM Cortex-A55.
- מאתר הבאגים LLDB עבור פלטפורמת AArch64 מספק תמיכה מלאה עבור אימות מצביע, MTE (MemTag, הרחבת תיוג זיכרון) ואוגרי SVE. נוספו פקודות המאפשרות לאגד תגיות לכל פעולת הקצאת זיכרון ולארגן בדיקה של המצביע בעת גישה לזיכרון, אשר חייב להיות משויך לתג הנכון.
- מאתר הבאגים LLDB והחזית לשפת Fortran - Flang נוספו למכלולים הבינאריים שנוצרו על ידי הפרויקט.
מקור: OpenNet.ru
