#LLVM تحليل وتحويل تمريرات
يستخدم هذا المشروع Clang و LLVM لتحليل وتحويل رمز المصدر C ++.
Clang عبارة عن واجهة أمامية لـ LLVM ، ويقوم بتجميع C ++ في الأشعة تحت الحمراء. التمثيل الوسيط أبسط بكثير ثم C ++ ، مما يسهل التحليل والتحويل.
لدى LLVM مجموعة متنوعة من المكتبات التي يمكن استخدامها لتحليل وتحويل الأشعة تحت الحمراء. تسمى تعليمات للتحليل أو التحول تمريرة.
عرض فيديو للمرور
Done See BelowDone See Belowمطلوب LLVM و Clang لتجميع وتطبيق التمريرات. Cmake مطلوب لبناء LLVM و Clang.
يتم استخدام Clang لتجميع C ++ إلى Bytecode LLVM لتثبيت تحليل تمرير تمريرة StaticCount يمر كل تعليمات في رمز byetecode ويطبع نوعه. كما أنه يستخدم LLVM لتتبع إحصائيات الشهادة التي تطبعها في نهاية التحليل.
قبل اتباع هذا الدليل ، يجب أن تكون قد قمت بتنزيل LLVM وبناءها.
تم إجراء هذا المشروع والدليل باستخدام MacOS.
من أجل تطبيق تمريرة على بعض رمز C ، هناك عدد من الخطوات التي يجب معالجتها ، فهي كما يلي.
<LLVM_Source_Directory>/lib/Transforms .StaticCount من المستودع المستنسخ في الدليل المذكور أعلاه.Transforms ، يجب أن يكون هناك عدد من الدليل وملف واحد فقط CMakeLists.txt .CMakeLists.txt وأضف الخط add_subdirectory(StaticCount) .<LLVM_Build_Directory> وقم بتشغيل cmake --build . سيؤدي ذلك إلى بناء كل LLVM بما في ذلك الممر الذي أضفناه للتو.HeapTimeTestProgram داخل المستودع المستنسخ.clang -O0 -emit-llvm -c main.cpp -o bctest.bc هذا يستخدم clang لتجميع ملف c ++ الخاص بنا إلى bytecode التي يمكن أن تعمل معها.opt -load <LLVM_Build_Directory>/lib/llvmstaticcount.dylib -StaticCount -stats< bctest.bc > /dev/null الإحصاءات المطبوعة هي نتيجة للتحليل الثابت باستخدام LLVM.
ملاحظة - هذا ليس هو الإخراج الكامل للمرور. يتم تقليله بحيث تكون الأوامر أعلاه مرئية.
مشكلة؟ الرجاء الاتصال بي.
يتم استخدام Clang لتجميع C ++ إلى Bytecode LLVM لتثبيت تحليل تمرير تمريرة DynCount يمر عبر كل كتلة أساسية في رمز byetecode ويضيف مكالمة إلى مكتبة وقت التشغيل. الوظائف في المكتبة هي فقط الإخراج الإخراج لهذا المعلم.
أولاً يتم تجميع التمريرة تمامًا مثل الأول ، بعد ذلك نقوم بتجميع برنامج الاختبار في Bytecode. بعد ذلك يتم تجميع مكتبة وقت التشغيل في Bytecode. ثم يتم ربط ملفين Bytecode هذا بملف bytecode واحد باستخدام LLVM. بعد ذلك يتم تطبيق الممر ، على عكس الممر الأول ، لن يكون هناك إخراج في تلك المرحلة. نظرًا لأن هذا تمريرة ديناميكية سنحصل على النتائج في وقت التشغيل. أخيرًا ، نقوم بتشغيل البرنامج ونحصل على نتائجنا ، سيكون هناك إحصائيات الإخراج في كل أوصف من عدة أنواع مختلفة من الكتلة الأساسية.
قبل اتباع هذا الدليل ، يجب أن تكون قد قمت بتنزيل LLVM وبناءها.
تم إجراء هذا المشروع والدليل باستخدام MacOS.
من أجل تطبيق تمريرة على رمز C ، هناك عدد من الخطوات التي يجب معالجتها ، فهي على النحو التالي.
<LLVM_Source_Directory>/lib/Transforms .DynCount من المستودع المستنسخ في الدليل المذكور أعلاه.Transforms ، يجب أن يكون هناك عدد من الدليل وملف واحد فقط CMakeLists.txt .CMakeLists.txt وأضف الخط add_subdirectory(DynCount) .<LLVM_Build_Directory> وقم بتشغيل cmake --build . سيؤدي ذلك إلى بناء كل LLVM بما في ذلك الممر الذي أضفناه للتو.SmallTestProgram داخل المستودع المستنسخ.clang -O0 -emit-llvm -c smallProgram.c -o sp.bc هذا يستخدم clang لتجميع ملف c الخاص بنا إلى bytecode التي يمكن أن تعمل معها.clang -O0 -emit-llvm -c print -o p.bc هذا يستخدم Clang لتجميع مكتبة وقت التشغيل الخاصة بنا وصولاً إلى Bytecode والتي يمكن ربطها بالبرنامج الذي جمعناه أعلاه.llvm-link p.bc sp.bc -S -o smallprogramandprint.bc يربط برنامجنا لتحليله ومكتبة وقت التشغيل.opt -load <LLVM_Build_Directory>/lib/llvmDynCount.dylib -DynCount <smallprogramandprint.bc> instrumentedprogram.bc هذا يطبق النجاح على البرنامج ، مما يعدل bytecode مع المكالمات إلى مكتبة وقت التشغيل التي ربطنا بها.lli instrumentedprogram.bc هذا يدير البرنامج المعمول به حتى نتمكن من رؤية نتيجة التمريرة. 
ملاحظة - هذا ليس هو الإخراج الكامل للمرور. يتم تقليله بحيث تكون الأوامر أعلاه مرئية.
مشكلة؟ الرجاء الاتصال بي.