LLVM-IR2VEC(1) LLVM LLVM-IR2VEC(1)

llvm-ir2vec - تولید بردار تعبیه‌شده (Embeddings) از کدهای نمایش میانی LLVM IR

llvm-ir2vec [زیردستور] [گزینه‌ها]

llvm-ir2vec یک ابزار خط فرمانی مستقل برای IR2Vec و MIR2Vec است. این ابزار بردارهای تعبیه‌شده (Embeddings) را برای هر دو کد نمایش میانی LLVM IR و کد میانی ماشین (MIR) تولید می‌کند و از تولید سه‌تایی‌ها (Triplets) برای آموزش واژگان پشتیبانی می‌کند.

این ابزار سه زیردستور اصلی ارائه می‌دهد:

1.
triplets: تولید سه‌تایی‌های عددی در قالب train2id برای آموزش واژگان از کدهای LLVM IR.
2.
entities: تولید فایل‌های نگاشت موجودیت (entity2id.txt) برای آموزش واژگان.
3.
embeddings: تولید بردارهای تعبیه‌شده IR2Vec یا MIR2Vec با استفاده از واژگان آموزش‌دیده در سطوح مختلف دانه‌بندی (دستورالعمل، بلوک پایه یا تابع).

این ابزار از دو حالت کاری پشتیبانی می‌کند:

  • حالت LLVM IR (--mode=llvm): پردازش فایل‌های بیت‌کد LLVM IR و تولید بردارهای تعبیه‌شده IR2Vec
  • حالت Machine IR (--mode=mir): پردازش فایل‌های کد میانی ماشین (.mir) و تولید بردارهای تعبیه‌شده MIR2Vec

این ابزار به منظور تسهیل کاربردهای یادگیری ماشین که با LLVM IR یا کدهای میانی ماشین کار می‌کنند طراحی شده است؛ این کار با تبدیل آن‌ها به نمایش‌های عددی قابل استفاده توسط مدل‌های یادگیری ماشین انجام می‌شود. زیردستور triplets به جای سه‌تایی‌های متنی مستقیماً شناسه‌های عددی تولید می‌کند که جریان کاری آماده‌سازی داده‌های آموزشی را بهینه‌تر می‌سازد.

نکته:

برای اطلاعات در مورد استفاده برنامه‌نویسی از IR2Vec و MIR2Vec در گذرها (Passes) و رابط برنامه‌نویسی C++ در LLVM، به بخش IR2Vec Embeddings در مستندات MLGO مراجعه کنید: https://llvm.org/docs/MLGO.html#ir2vec-embeddings

این ابزار در دو حالت کار می‌کند: حالت LLVM IR و حالت Machine IR. حالت مورد نظر با گزینه --mode انتخاب می‌شود (پیش‌فرض: llvm).

حالت‌های تولید سه‌تایی و نگاشت موجودیت برای آماده‌سازی واژگان و داده‌های آموزشی برای بردارهای تعبیه‌شده گراف دانش استفاده می‌شوند. حالت تولید بردار تعبیه‌شده برای تولید بردارها از LLVM IR با استفاده از واژگان از پیش آموزش‌دیده به کار می‌رود.

واژگان بردار تعبیه‌شده اولیه (Seed Embedding) در IR2Vec روی مجموعه‌ای بزرگ از کدهای LLVM IR با مدل‌سازی روابط بین کدهای عملیاتی (Opcodes)، انواع (Types) و عملوندها (Operands) به عنوان یک گراف دانش آموزش داده شده است. به این منظور، حالت‌های تولید سه‌تایی و نگاشت موجودیت، سه‌تایی‌ها و نگاشت‌های موجودیت را در قالب استاندارد مورد استفاده برای آموزش بردار گراف دانش تولید می‌کنند (برای جزئیات بیشتر به https://github.com/thunlp/OpenKE/tree/OpenKE-PyTorch?tab=readme-ov-file#data-format مراجعه کنید).

برای جزئیات بیشتر در مورد چگونگی استفاده از این دو حالت برای تولید سه‌تایی‌ها و نگاشت‌های موجودیت، فایل llvm/utils/mlgo-utils/IR2Vec/generateTriplets.py را ببینید.

با زیردستور triplets، ابزار llvm-ir2vec کدهای LLVM IR یا Machine IR را تحلیل کرده و سه‌تایی‌های عددی شامل شناسه‌های آپ‌کد و شناسه‌های عملوند را استخراج می‌کند. این سه‌تایی‌ها در قالب استاندارد مورد استفاده برای آموزش بردار گراف دانش تولید می‌شوند. این ابزار شناسه‌های عددی را مستقیماً با استفاده از زیرساخت نگاشت واژگان خروجی می‌دهد و نیاز به پیش‌پردازش تبدیل رشته به شناسه را حذف می‌کند.

نحوه استفاده برای LLVM IR:

llvm-ir2vec triplets --mode=llvm input.bc -o triplets_train2id.txt

نحوه استفاده برای Machine IR:

llvm-ir2vec triplets --mode=mir input.mir -o triplets_train2id.txt

با زیردستور entities، ابزار llvm-ir2vec نگاشت‌های موجودیت پشتیبانی‌شده توسط IR2Vec یا MIR2Vec را در قالب استاندارد مورد استفاده برای آموزش بردار گراف دانش تولید می‌کند. این زیردستور تمام موجودیت‌های پشتیبانی‌شده را همراه با شناسه‌های عددی متناظر آن‌ها خروجی می‌دهد.

برای LLVM IR، موجودیت‌ها شامل آپ‌کدها، انواع و عملوندها هستند. برای Machine IR، موجودیت‌ها شامل آپ‌کدهای ماشین، عملوندهای متداول و کلاس‌های ثبات (هم فیزیکی و هم مجازی) می‌باشند.

نحوه استفاده برای LLVM IR:

llvm-ir2vec entities --mode=llvm -o entity2id.txt

نحوه استفاده برای Machine IR:

llvm-ir2vec entities --mode=mir input.mir -o entity2id.txt

نکته:

برای حالت LLVM IR، نگاشت موجودیت مستقل از معماری مقصد است و نیازی به فایل ورودی ندارد. برای حالت Machine IR، یک فایل ورودی .mir برای تعیین معماری مقصد مورد نیاز است، زیرا نگاشت‌های موجودیت بر اساس مقصد تغییر می‌کنند (معماری‌های مختلف مجموعه‌دستورالعمل‌ها و کلاس‌های ثبات متفاوتی دارند).

با زیردستور embeddings، ابزار llvm-ir2vec از یک واژگان از پیش آموزش‌دیده برای تولید بردارهای تعبیه‌شده عددی برای LLVM IR یا Machine IR در سطوح مختلف دانه‌بندی استفاده می‌کند.

مثال نحوه استفاده برای LLVM IR:

llvm-ir2vec embeddings --mode=llvm --ir2vec-vocab-path=vocab.json --ir2vec-kind=symbolic --level=func input.bc -o embeddings.txt

مثال نحوه استفاده برای Machine IR:

llvm-ir2vec embeddings --mode=mir --mir2vec-vocab-path=vocab.json --level=func input.mir -o embeddings.txt

گزینه‌های عمومی (قابل استفاده در هر دو حالت LLVM IR و Machine IR):

تعیین حالت عملکرد. مقادیر معتبر عبارتند از:
  • llvm - پردازش فایل‌های بیت‌کد LLVM IR (پیش‌فرض)
  • mir - پردازش فایل‌های کد میانی ماشین (.mir)
تعیین نام فایل خروجی. از - برای نوشتن در خروجی استاندارد استفاده کنید (پیش‌فرض).
چاپ خلاصه‌ای از گزینه‌های خط فرمان.

گزینه‌های مختص زیردستورها:

زیردستور embeddings:

<input-file>
فایل ورودی LLVM IR/بیت‌کد (.ll/.bc) یا فایل Machine IR (.mir) برای پردازش. این آرگومان مکانی برای زیردستور embeddings الزامی است.
تعیین سطح تولید بردار تعبیه‌شده. مقادیر معتبر عبارتند از:
  • inst - تولید بردار تعبیه‌شده در سطح دستورالعمل
  • bb - تولید بردار تعبیه‌شده در سطح بلوک پایه
  • func - تولید بردار تعبیه‌شده در سطح تابع (پیش‌فرض)
پردازش تنها تابع مشخص‌شده به جای تمام توابع موجود در ماژول.

گزینه‌های مختص IR2Vec (برای --mode=llvm):

تعیین نوع بردارهای تعبیه‌شده IR2Vec برای تولید. مقادیر معتبر عبارتند از:
  • symbolic - تولید بردارهای نمادین (پیش‌فرض)
  • flow-aware - تولید بردارهای آگاه از جریان (Flow-aware)

بردارهای آگاه از جریان روابط جریان کنترل بین دستورالعمل‌ها را در نظر می‌گیرند، در حالی که بردارهای نمادین بر نمایش نمادین دستورالعمل‌ها تمرکز دارند.

تعیین مسیر فایل واژگان IR2Vec (برای تولید بردار تعبیه‌شده LLVM IR الزامی است). فایل واژگان باید در قالب JSON باشد و حاوی واژگان آموزش‌دیده برای تولید بردار تعبیه‌شده باشد. برای فایل‌های واژگان از پیش آموزش‌دیده به llvm/lib/Analysis/models مراجعه کنید.
تعیین وزن بردارهای آپ‌کد (پیش‌فرض: 1.0). این گزینه اهمیت نسبی کدهای عملیاتی دستورالعمل را در بردار تعبیه‌شده نهایی کنترل می‌کند.
تعیین وزن بردارهای نوع (پیش‌فرض: 0.5). این گزینه اهمیت نسبی اطلاعات نوع را در بردار تعبیه‌شده نهایی کنترل می‌کند.
تعیین وزن بردارهای آرگومان (پیش‌فرض: 0.2). این گزینه اهمیت نسبی اطلاعات عملوند را در بردار تعبیه‌شده نهایی کنترل می‌کند.

گزینه‌های مختص MIR2Vec (برای --mode=mir):

تعیین مسیر فایل واژگان MIR2Vec (برای تولید بردار تعبیه‌شده Machine IR الزامی است). فایل واژگان باید در قالب JSON باشد و حاوی واژگان آموزش‌دیده برای تولید بردار تعبیه‌شده باشد.
تعیین نوع بردارهای تعبیه‌شده MIR2Vec برای تولید. مقادیر معتبر عبارتند از:
•
symbolic - تولید بردارهای نمادین (پیش‌فرض)
تعیین وزن بردارهای آپ‌کد ماشین (پیش‌فرض: 1.0). این گزینه اهمیت نسبی کدهای عملیاتی دستورالعمل‌های ماشین را در بردار تعبیه‌شده نهایی کنترل می‌کند.
تعیین وزن بردارهای عملوند متداول (پیش‌فرض: 1.0). این گزینه اهمیت نسبی انواع عملوندهای متداول را در بردار تعبیه‌شده نهایی کنترل می‌کند.
تعیین وزن بردارهای عملوند ثبات (پیش‌فرض: 1.0). این گزینه اهمیت نسبی عملوندهای ثبات را در بردار تعبیه‌شده نهایی کنترل می‌کند.

زیردستور triplets:

<input-file>
فایل ورودی LLVM IR/بیت‌کد (.ll/.bc) یا فایل Machine IR (.mir) برای پردازش. این آرگومان مکانی برای زیردستور triplets الزامی است.

زیردستور entities:

<input-file>
فایل ورودی Machine IR (.mir) برای پردازش. این آرگومان مکانی برای زیردستور entities هنگام استفاده از --mode=mir الزامی است، زیرا نگاشت‌های موجودیت وابسته به معماری مقصد هستند. برای --mode=llvm نیازی به فایل ورودی نیست زیرا نگاشت‌های موجودیت IR2Vec مستقل از مقصد هستند.

در حالت سه‌تایی، خروجی شامل سه‌تایی‌های عددی در قالب train2id همراه با هدرهای متادیتا است. این قالب شامل موارد زیر است:

MAX_RELATION=<max_relation_count>
<head_entity_id> <tail_entity_id> <relation_id>
<head_entity_id> <tail_entity_id> <relation_id>
...

هر خط پس از هدر متادیتا نشان‌دهنده یک رابطه دستورالعمل است، همراه با شناسه‌های عددی برای موجودیت مبدأ (Head Entity)، موجودیت مقصد (Tail Entity) و نوع رابطه (Relation Type). هدر متادیتا (MAX_RELATION) بیشینه شناسه رابطه استفاده‌شده را مشخص می‌کند.

انواع رابطه (Relation Types):

برای LLVM IR (IR2Vec):
  • 0 = رابطه نوع (دستورالعمل به نوع آن)
  • 1 = رابطه بعدی (دستورالعمل‌های متوالی)
  • 2+ = روابط آرگومان (Arg0, Arg1, Arg2, ...)
برای Machine IR (MIR2Vec):
  • 0 = رابطه بعدی (دستورالعمل‌های متوالی)
  • 1+ = روابط آرگومان (Arg0, Arg1, Arg2, ...)

شناسه‌های موجودیت (Entity IDs):

برای LLVM IR: شناسه‌های موجودیت نشان‌دهنده کدهای عملیاتی (Opcodes)، انواع و عملوندها طبق تعریف واژگان IR2Vec هستند.

برای Machine IR: شناسه‌های موجودیت نشان‌دهنده آپ‌کدهای ماشین، عملوندهای متداول (مقدار بی‌واسطه، نمایه فریم و غیره)، کلاس‌های ثبات فیزیکی و کلاس‌های ثبات مجازی طبق تعریف واژگان MIR2Vec هستند. چیدمان موجودیت وابسته به معماری مقصد است.

در حالت موجودیت، خروجی شامل نگاشت‌های موجودیت در قالب زیر است:

<total_entities>
<entity_string>      <numeric_id>
<entity_string>      <numeric_id>
...

خط نخست شامل تعداد کل موجودیت‌ها است، و پس از آن در هر خط یک نگاشت موجودیت با رشته موجودیت و شناسه عددی جداشده با تب (Tab) قرار دارد.

برای LLVM IR، موجودیت‌ها شامل آپ‌کدهای دستورالعمل (مانند "Add"، "Ret")، انواع (مانند "INT"، "PTR") و انواع عملوند هستند.

برای Machine IR، موجودیت‌ها شامل آپ‌کدهای ماشین (مانند "COPY"، "ADD")، عملوندهای متداول (مانند "Immediate"، "FrameIndex")، کلاس‌های ثبات فیزیکی (مانند "PhyReg_GR32") و کلاس‌های ثبات مجازی (مانند "VirtReg_GR32") هستند.

در حالت بردار تعبیه‌شده، قالب خروجی به سطح مشخص‌شده بستگی دارد:

  • سطح تابع (Function Level): یک بردار تعبیه‌شده به ازای هر تابع
  • سطح بلوک پایه (Basic Block Level): یک بردار تعبیه‌شده به ازای هر بلوک پایه، گروه‌بندی‌شده بر اساس تابع
  • سطح دستورالعمل (Instruction Level): یک بردار تعبیه‌شده به ازای هر دستورالعمل، گروه‌بندی‌شده بر اساس بلوک پایه و تابع

هر بردار تعبیه‌شده به صورت یک بردار ممیز شناور (Floating Point) نمایش داده می‌شود.

llvm-ir2vec در صورت موفقیت مقدار 0 و در صورت بروز خطا مقداری غیرصفر برمی‌گرداند.

موارد متداول خطا عبارتند از:

  • فایل ورودی نامعتبر یا ناموجود
  • فایل واژگان ناموجود یا نامعتبر (در حالت بردار تعبیه‌شده)
  • تابع مشخص‌شده در ماژول یافت نشد
  • گزینه‌های خط فرمان نامعتبر

بهینه‌سازی هدایت‌شده با یادگیری ماشین (MLGO) https://llvm.org/docs/MLGO.html

برای اطلاعات بیشتر در مورد الگوریتم و رویکرد IR2Vec ببینید: IR2Vec: LLVM IR Based Scalable Program Embeddings https://doi.org/10.1145/3418463.

برای اطلاعات بیشتر در مورد الگوریتم و رویکرد MIR2Vec ببینید: RL4ReAl: Reinforcement Learning for Register Allocation https://doi.org/10.1145/3578360.3580273.

نگهداری‌شده توسط تیم LLVM (https://llvm.org).

2003-2026, LLVM Project

2026-07-15 22