| # llvm-ir2vec - IR2Vec and MIR2Vec Embedding Generation Tool |
| |
| ```{program} llvm-ir2vec |
| ``` |
| |
| ## SYNOPSIS |
| |
| {program}`llvm-ir2vec` \[*subcommand*\] \[*options*\] |
| |
| ## DESCRIPTION |
| |
| {program}`llvm-ir2vec` is a standalone command-line tool for IR2Vec and MIR2Vec. |
| It generates embeddings for both LLVM IR and Machine IR (MIR) and supports |
| triplet generation for vocabulary training. |
| |
| The tool provides three main subcommands: |
| |
| 1. **triplets**: Generates numeric triplets in train2id format for vocabulary |
| training from LLVM IR. |
| 2. **entities**: Generates entity mapping files (entity2id.txt) for vocabulary |
| training. |
| 3. **embeddings**: Generates IR2Vec or MIR2Vec embeddings using a trained vocabulary |
| at different granularity levels (instruction, basic block, or function). |
| |
| The tool supports two operation modes: |
| |
| - **LLVM IR mode** (`--mode=llvm`): Process LLVM IR bitcode files and generate |
| IR2Vec embeddings |
| - **Machine IR mode** (`--mode=mir`): Process Machine IR (.mir) files and generate |
| MIR2Vec embeddings |
| |
| The tool is designed to facilitate machine learning applications that work with |
| LLVM IR or Machine IR by converting them into numerical representations that can |
| be used by ML models. The `triplets` subcommand generates numeric IDs directly |
| instead of string triplets, streamlining the training data preparation workflow. |
| |
| :::{note} |
| For information about using IR2Vec and MIR2Vec programmatically within LLVM |
| passes and the C++ API, see the [IR2Vec Embeddings](https://llvm.org/docs/MLGO.html#ir2vec-embeddings) |
| section in the MLGO documentation. |
| ::: |
| |
| ## OPERATION MODES |
| |
| The tool operates in two modes: **LLVM IR mode** and **Machine IR mode**. The mode |
| is selected using the `--mode` option (default: `llvm`). |
| |
| Triplet Generation and Entity Mapping Modes are used for preparing |
| vocabulary and training data for knowledge graph embeddings. The Embedding Mode |
| is used for generating embeddings from LLVM IR using a pre-trained vocabulary. |
| |
| The Seed Embedding Vocabulary of IR2Vec is trained on a large corpus of LLVM IR |
| by modeling the relationships between opcodes, types, and operands as a knowledge |
| graph. For this purpose, Triplet Generation and Entity Mapping Modes generate |
| triplets and entity mappings in the standard format used for knowledge graph |
| embedding training (see |
| \<<https://github.com/thunlp/OpenKE/tree/OpenKE-PyTorch?tab=readme-ov-file#data-format>> |
| for details). |
| |
| See `llvm/utils/mlgo-utils/IR2Vec/generateTriplets.py` for more details on how |
| these two modes are used to generate the triplets and entity mappings. |
| |
| ### Triplet Generation |
| |
| With the `triplets` subcommand, {program}`llvm-ir2vec` analyzes LLVM IR or Machine IR |
| and extracts numeric triplets consisting of opcode IDs and operand IDs. These triplets |
| are generated in the standard format used for knowledge graph embedding training. |
| The tool outputs numeric IDs directly using the vocabulary mapping infrastructure, |
| eliminating the need for string-to-ID preprocessing. |
| |
| Usage for LLVM IR: |
| |
| ```bash |
| llvm-ir2vec triplets --mode=llvm input.bc -o triplets_train2id.txt |
| ``` |
| |
| Usage for Machine IR: |
| |
| ```bash |
| llvm-ir2vec triplets --mode=mir input.mir -o triplets_train2id.txt |
| ``` |
| |
| ### Entity Mapping Generation |
| |
| With the `entities` subcommand, {program}`llvm-ir2vec` generates the entity mappings |
| supported by IR2Vec or MIR2Vec in the standard format used for knowledge graph embedding |
| training. This subcommand outputs all supported entities with their corresponding numeric IDs. |
| |
| For LLVM IR, entities include opcodes, types, and operands. For Machine IR, entities include |
| machine opcodes, common operands, and register classes (both physical and virtual). |
| |
| Usage for LLVM IR: |
| |
| ```bash |
| llvm-ir2vec entities --mode=llvm -o entity2id.txt |
| ``` |
| |
| Usage for Machine IR: |
| |
| ```bash |
| llvm-ir2vec entities --mode=mir input.mir -o entity2id.txt |
| ``` |
| |
| :::{note} |
| For LLVM IR mode, the entity mapping is target-independent and does not require an input file. |
| For Machine IR mode, an input .mir file is required to determine the target architecture, |
| as entity mappings vary by target (different architectures have different instruction sets |
| and register classes). |
| ::: |
| |
| ### Embedding Generation |
| |
| With the `embeddings` subcommand, {program}`llvm-ir2vec` uses a pre-trained vocabulary to |
| generate numerical embeddings for LLVM IR or Machine IR at different levels of granularity. |
| |
| Example Usage for LLVM IR: |
| |
| ```bash |
| llvm-ir2vec embeddings --mode=llvm --ir2vec-vocab-path=vocab.json --ir2vec-kind=symbolic --level=func input.bc -o embeddings.txt |
| ``` |
| |
| Example Usage for Machine IR: |
| |
| ```bash |
| llvm-ir2vec embeddings --mode=mir --mir2vec-vocab-path=vocab.json --level=func input.mir -o embeddings.txt |
| ``` |
| |
| ## OPTIONS |
| |
| Common options (applicable to both LLVM IR and Machine IR modes): |
| |
| :::{option} --mode=<mode> |
| Specify the operation mode. Valid values are: |
| |
| - `llvm` - Process LLVM IR bitcode files (default) |
| - `mir` - Process Machine IR (.mir) files |
| ::: |
| |
| :::{option} -o <filename> |
| Specify the output filename. Use `-` to write to standard output (default). |
| ::: |
| |
| :::{option} --help |
| Print a summary of command line options. |
| ::: |
| |
| Subcommand-specific options: |
| |
| **embeddings** subcommand: |
| |
| :::{option} <input-file> |
| The input LLVM IR/bitcode file (.ll/.bc) or Machine IR file (.mir) to process. |
| This positional argument is required for the `embeddings` subcommand. |
| ::: |
| |
| :::{option} --level=<level> |
| Specify the embedding generation level. Valid values are: |
| |
| - `inst` - Generate instruction-level embeddings |
| - `bb` - Generate basic block-level embeddings |
| - `func` - Generate function-level embeddings (default) |
| ::: |
| |
| :::{option} --function=<name> |
| Process only the specified function instead of all functions in the module. |
| ::: |
| |
| **IR2Vec-specific options** (for `--mode=llvm`): |
| |
| :::{option} --ir2vec-kind=<kind> |
| Specify the kind of IR2Vec embeddings to generate. Valid values are: |
| |
| - `symbolic` - Generate symbolic embeddings (default) |
| - `flow-aware` - Generate flow-aware embeddings |
| |
| Flow-aware embeddings consider control flow relationships between instructions, |
| while symbolic embeddings focus on the symbolic representation of instructions. |
| ::: |
| |
| :::{option} --ir2vec-vocab-path=<path> |
| Specify the path to the IR2Vec vocabulary file (required for LLVM IR embedding |
| generation). The vocabulary file should be in JSON format and contain the trained |
| vocabulary for embedding generation. See `llvm/lib/Analysis/models` |
| for pre-trained vocabulary files. |
| ::: |
| |
| :::{option} --ir2vec-opc-weight=<weight> |
| Specify the weight for opcode embeddings (default: 1.0). This controls |
| the relative importance of instruction opcodes in the final embedding. |
| ::: |
| |
| :::{option} --ir2vec-type-weight=<weight> |
| Specify the weight for type embeddings (default: 0.5). This controls |
| the relative importance of type information in the final embedding. |
| ::: |
| |
| :::{option} --ir2vec-arg-weight=<weight> |
| Specify the weight for argument embeddings (default: 0.2). This controls |
| the relative importance of operand information in the final embedding. |
| ::: |
| |
| **MIR2Vec-specific options** (for `--mode=mir`): |
| |
| :::{option} --mir2vec-vocab-path=<path> |
| Specify the path to the MIR2Vec vocabulary file (required for Machine IR |
| embedding generation). The vocabulary file should be in JSON format and |
| contain the trained vocabulary for embedding generation. |
| ::: |
| |
| :::{option} --mir2vec-kind=<kind> |
| Specify the kind of MIR2Vec embeddings to generate. Valid values are: |
| |
| - `symbolic` - Generate symbolic embeddings (default) |
| ::: |
| |
| :::{option} --mir2vec-opc-weight=<weight> |
| Specify the weight for machine opcode embeddings (default: 1.0). This controls |
| the relative importance of machine instruction opcodes in the final embedding. |
| ::: |
| |
| :::{option} --mir2vec-common-operand-weight=<weight> |
| Specify the weight for common operand embeddings (default: 1.0). This controls |
| the relative importance of common operand types in the final embedding. |
| ::: |
| |
| :::{option} --mir2vec-reg-operand-weight=<weight> |
| Specify the weight for register operand embeddings (default: 1.0). This controls |
| the relative importance of register operands in the final embedding. |
| ::: |
| |
| **triplets** subcommand: |
| |
| :::{option} <input-file> |
| The input LLVM IR/bitcode file (.ll/.bc) or Machine IR file (.mir) to process. |
| This positional argument is required for the `triplets` subcommand. |
| ::: |
| |
| **entities** subcommand: |
| |
| :::{option} <input-file> |
| The input Machine IR file (.mir) to process. This positional argument is required |
| for the `entities` subcommand when using `--mode=mir`, as the entity mappings |
| are target-specific. For `--mode=llvm`, no input file is required as IR2Vec |
| entity mappings are target-independent. |
| ::: |
| |
| ## OUTPUT FORMAT |
| |
| ### Triplet Mode Output |
| |
| In triplet mode, the output consists of numeric triplets in train2id format with |
| metadata headers. The format includes: |
| |
| ```text |
| MAX_RELATION=<max_relation_count> |
| <head_entity_id> <tail_entity_id> <relation_id> |
| <head_entity_id> <tail_entity_id> <relation_id> |
| ... |
| ``` |
| |
| Each line after the metadata header represents one instruction relationship, |
| with numeric IDs for head entity, tail entity, and relation type. The metadata |
| header (MAX_RELATION) indicates the maximum relation ID used. |
| |
| **Relation Types:** |
| |
| For LLVM IR (IR2Vec): |
| : - **0** = Type relationship (instruction to its type) |
| - **1** = Next relationship (sequential instructions) |
| - **2+** = Argument relationships (Arg0, Arg1, Arg2, ...) |
| |
| For Machine IR (MIR2Vec): |
| : - **0** = Next relationship (sequential instructions) |
| - **1+** = Argument relationships (Arg0, Arg1, Arg2, ...) |
| |
| **Entity IDs:** |
| |
| For LLVM IR: Entity IDs represent opcodes, types, and operands as defined by the IR2Vec vocabulary. |
| |
| For Machine IR: Entity IDs represent machine opcodes, common operands (immediate, frame index, etc.), |
| physical register classes, and virtual register classes as defined by the MIR2Vec vocabulary. The entity layout is target-specific. |
| |
| ### Entity Mode Output |
| |
| In entity mode, the output consists of entity mappings in the format: |
| |
| ```text |
| <total_entities> |
| <entity_string> <numeric_id> |
| <entity_string> <numeric_id> |
| ... |
| ``` |
| |
| The first line contains the total number of entities, followed by one entity |
| mapping per line with tab-separated entity string and numeric ID. |
| |
| For LLVM IR, entities include instruction opcodes (e.g., "Add", "Ret"), types |
| (e.g., "INT", "PTR"), and operand kinds. |
| |
| For Machine IR, entities include machine opcodes (e.g., "COPY", "ADD"), |
| common operands (e.g., "Immediate", "FrameIndex"), physical register classes |
| (e.g., "PhyReg_GR32"), and virtual register classes (e.g., "VirtReg_GR32"). |
| |
| ### Embedding Mode Output |
| |
| In embedding mode, the output format depends on the specified level: |
| |
| - **Function Level**: One embedding vector per function |
| - **Basic Block Level**: One embedding vector per basic block, grouped by function |
| - **Instruction Level**: One embedding vector per instruction, grouped by basic block and function |
| |
| Each embedding is represented as a floating point vector. |
| |
| ## EXIT STATUS |
| |
| {program}`llvm-ir2vec` returns 0 on success, and a non-zero value on failure. |
| |
| Common failure cases include: |
| |
| - Invalid or missing input file |
| - Missing or invalid vocabulary file (in embedding mode) |
| - Specified function not found in the module |
| - Invalid command line options |
| |
| ## SEE ALSO |
| |
| {doc}`../MLGO` |
| |
| For more information about the IR2Vec algorithm and approach, see: |
| [IR2Vec: LLVM IR Based Scalable Program Embeddings](https://doi.org/10.1145/3418463). |
| |
| For more information about the MIR2Vec algorithm and approach, see: |
| [RL4ReAl: Reinforcement Learning for Register Allocation](https://doi.org/10.1145/3578360.3580273). |
| |