| # 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 {ref}`IR2Vec Embeddings <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). | |