blob: 1aa863c99267555ceaa818e2160dbeef088d6d89 [file] [view] [edit]
# ProtoVM Compiler
The ProtoVM Compiler is a CLI tool that compiles high-level transformation commands (`CompileConfig`) into low-level bytecode instructions (`VmProgram`) executable by the ProtoVM.
## Command-Line Interface
The compiler CLI (`protovm_compiler`) is the entry point for compilation.
### Usage
```sh
protovm_compiler [-I <proto_path>] <file1.proto> [<file2.proto> ...]
```
### Input
- **Command-line arguments**: A list of `.proto` files that contain the definitions of the source and destination messages.
- **`-I` / `--proto_path`**: Specifies directories in which to search for imports. Multiple `-I` flags can be provided.
- **`stdin`**: The compiler reads the `CompileConfig` textproto from standard input.
### Output
- **`stdout`**: The compiler outputs the compiled binary `VmProgram` to standard output.
- **`stderr`**: Any compilation or validation errors are printed to standard error.
### Example
```sh
protovm_compiler \
-I external/perfetto \
-I external/perfetto/buildtools/protobuf/src \
protos/perfetto/trace/trace_packet.proto \
protos/perfetto/trace/android/winscope_extensions_impl.proto \
<compile_config.textproto
>program.pb
```
## Architecture Overview
The compiler is structured into three main components:
```mermaid
graph TD
main[main.cc - CLI Entrypoint] -->|Loads descriptors & parse compile config| Compiler[Compiler - Front-end]
Compiler -->|Delegates translation into VmInstruction| Emitter[InstructionEmitter - Back-end]
Emitter -->|Translates field IDs| Pool[DescriptorPool]
Emitter -->|Emits| Program[VmProgram Binary]
```
### 1. `main.cc` (CLI Entrypoint)
- Parses command-line arguments.
- Loads and compiles the `.proto` files provided as arguments into a serialized file descriptor.
- Reads the `CompileConfig` textproto from standard input (`stdin`).
- Instantiates and invokes the `Compiler`
### 2. `Compiler` (Front-end)
- Parses the high-level `CompileConfig` textproto.
- Traverses the list of high-level commands (`set`, `del`, `merge`, `enter_scope`).
- Tracks the compilation "scope", which maintains the current instruction being populated and the src/dst cursor positions.
- Delegates translation of individual commands to the `InstructionEmitter`.
### 3. `InstructionEmitter` (Back-end)
- Translates human-redable field names to field IDs.
- Translates high-level commands (`SelectByKey`, `MergeByKey`, etc.) into the proper sequence of low-level `VmInstruction`s.