prometeu-studio/docs/pbs/agendas/18.2. Backend Workshop 2 - LowerToVM and IRVM Contract.md

6.6 KiB

18.2. Backend Workshop 2 - LowerToIRVM and IRVM Contract

Status: Ready for Closure (v1 Draft Text)

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?

Resolution (v1)

Nao ha open questions bloqueantes remanescentes nesta agenda.

As perguntas desta agenda ficam consideradas resolvidas para v1 pelos termos normativos abaixo.

Normative Text (Draft for Closure)

1) Escopo e fronteira

  1. Esta agenda define o contrato intermediario IRVM e as regras obrigatorias de lowering IRBackend -> IRVM.
  2. O objetivo do IRVM v1 e permitir emissao mecanica e deterministica de bytecode para runtime core-v1.
  3. Esta agenda NAO define o marshaling binario final IRVM -> BytecodeModule (Agenda 18.3).

2) Modelo de IRVM (quase-ISA estendido)

  1. IRVM v1 adota modelo quase-ISA:
    • opcodes da Core ISA alvo;
    • e opcodes internos estendidos (IRVM_EXT) quando necessarios para normalizacao/otimizacao.
  2. IRVM_EXT MUST ser interno ao compilador e MUST NOT aparecer no artefato executavel final.
  3. Todo opcode IRVM_EXT MUST declarar metadados estruturais equivalentes a spec de opcode:
    • pops,
    • pushes,
    • is_branch,
    • is_terminator.
  4. O backend MUST expandir/reduzir todo IRVM_EXT para Core ISA antes da fase de emissao de bytecode.

3) Controle de fluxo e labels

  1. O IRVM pode usar labels simbolicos internamente.
  2. A resolucao final de labels para immediates u32 de salto MUST ocorrer no LowerToIRVM.
  3. O target final de salto MUST seguir contrato da VM:
    • offset relativo ao inicio da funcao (func_start + target_rel em runtime).
  4. Todo salto MUST apontar para fronteira valida de instrucao da funcao alvo.
  5. Caminho alcancavel que cai no fim da funcao sem terminador MUST ser erro de compilacao.

4) IDs deterministas de funcao

  1. O backend MUST produzir func_id deterministico para CALL, SPAWN e MAKE_CLOSURE.
  2. Regra v1:
    • entrypoint executavel no indice 0;
    • demais callables por ordenacao deterministica (module_key, callable_name, source_start).
  3. O mesmo grafo de entrada admitido MUST produzir os mesmos func_id.

5) Contrato de chamadas

  1. CALL MUST referenciar func_id valido.
  2. SPAWN MUST respeitar aridade exata da funcao de destino.
  3. CALL_HOST no IRBackend MUST lower para HOSTCALL <sysc_index> em IRVM pre-load.
  4. CALL_INTRINSIC no IRBackend MUST lower para INTRINSIC <id_final> em IRVM.
  5. CALL_CLOSURE com callee nao determinavel estaticamente e proibido no v1.

6) Contrato de slots por funcao

Para cada funcao em IRVM, o backend MUST fixar:

  1. param_slots,
  2. local_slots,
  3. return_slots,
  4. max_stack_slots.

RET MUST ser consistente com return_slots em todos os caminhos alcancaveis.

7) Pre-verificacao obrigatoria no compilador

Antes de emitir bytecode, o compilador MUST executar pre-verificacao estrutural em IRVM (ja em Core ISA, sem IRVM_EXT), cobrindo no minimo:

  1. validade de target de saltos;
  2. coerencia de altura de stack em joins;
  3. ausencia de underflow e overflow contra max_stack_slots;
  4. consistencia de RET com return_slots;
  5. validade de func_id referenciado;
  6. validade de aridade em CALL/SPAWN/CALL_CLOSURE;
  7. regra de YIELD com stack vazia;
  8. validade estrutural de HOSTCALL/INTRINSIC no shape de IR.

O verificador do runtime permanece autoritativo e continua obrigatorio.

8) Regra de YIELD

YIELD com stack nao vazia MUST ser rejeitado no compilador como erro deterministico de lowering/verificacao.

9) Versionamento do IRVM

  1. IRVM MUST carregar vm_profile explicito.
  2. Para v1, o perfil normativo e core-v1.
  3. Mismatch entre vm_profile e alvo de emissao/verificacao MUST falhar de forma deterministica.

10) Deferrals explicitos

Sem deferrals de perguntas abertas desta agenda.

Permanecem fora de escopo por fronteira de agenda:

  1. formato binario final de BytecodeModule e seccionamento PBX (Agenda 18.3);
  2. politicas avancadas de otimizacao nao necessarias para conformidade v1.

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 LowerToIRVMPipelineStage.

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/LowerToIRVMPipelineStage.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