# 18.2. Backend Workshop 2 - LowerToVM and IRVM Contract Status: Active (Draft) ## Purpose Definir o contrato intermediário `IRVM` e as regras normativas de lowering `IRBackend -> IRVM`, garantindo que a emissão de bytecode seja mecânica e determinística. ## Context - O runtime já define ISA e calling rules concretas. - No runtime atual, jumps usam imediato `u32` absoluto relativo ao início da função. - O verificador e o loader já têm validações rígidas que devem ser antecipadas pelo backend sempre que possível. ## Decisions to Produce 1. Modelo oficial de `IRVM`: - unidades (módulo/função/bloco), - instruções VM-like, - referência a constantes/globais/locals/callables, - metadados mínimos por função. 2. Regras de lowering para controle de fluxo: - labels simbólicos, - normalização de blocos, - política de branch/jump target. 3. Regras de lowering para chamadas: - `CALL`, - `HOSTCALL` pré-load, - `INTRINSIC` VM-owned. 4. Regras de layout de função e slots: - `param_slots`, - `local_slots`, - `return_slots`. 5. Política de diagnósticos determinísticos no lowering para rejeições backend-originadas. ## Core Questions 1. `IRVM` permite pseudo-opcodes que não existem na ISA final? 2. Onde ocorre a resolução final de labels para offsets: no próprio lowering ou apenas no emitter? 3. Como garantir que cada função tenha finalização válida (`RET`/terminador) sem depender só do verificador? 4. Qual o limite de checagens estáticas no compiler vs checagens delegadas ao verifier do runtime? 5. Como representar efeitos de stack no `IRVM` para detectar underflow/mismatch antes de emitir bytes? 6. Como versionar `IRVM` em relação à linha de ISA do runtime selecionada? ## Expected Spec Material 1. Nova spec: `IRBackend -> IRVM` lowering contract. 2. Nova spec: `IRVM` model e invariantes. 3. Tabela de mapeamento `IRVM op -> ISA op` por linha de runtime suportada. 4. Critérios de testes unitários do `LowerToVMPipelineStage`. ## Non-Goals - Implementar ainda otimizações avançadas. - Expandir ISA com novos opcodes. - Resolver políticas de linking multi-artifact além do necessário para execução v1. - Definir packer/cart assembly. ## Inputs - `prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/workspaces/stages/LowerToVMPipelineStage.java` - `../runtime/docs/runtime/virtual-machine/ISA_CORE.md` - `../runtime/docs/runtime/specs/02-vm-instruction-set.md` - `../runtime/docs/runtime/specs/02a-vm-values-and-calling-convention.md` - `../runtime/crates/console/prometeu-bytecode/src/opcode.rs` - `../runtime/crates/console/prometeu-bytecode/src/opcode_spec.rs` - `../runtime/crates/console/prometeu-bytecode/src/decoder.rs` - `../runtime/crates/console/prometeu-vm/src/verifier.rs`