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
u32absoluto 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
- 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.
- Regras de lowering para controle de fluxo:
- labels simbólicos,
- normalização de blocos,
- política de branch/jump target.
- Regras de lowering para chamadas:
CALL,HOSTCALLpré-load,INTRINSICVM-owned.
- Regras de layout de função e slots:
param_slots,local_slots,return_slots.
- Política de diagnósticos determinísticos no lowering para rejeições backend-originadas.
Core Questions
IRVMpermite pseudo-opcodes que não existem na ISA final?- Onde ocorre a resolução final de labels para offsets: no próprio lowering ou apenas no emitter?
- Como garantir que cada função tenha finalização válida (
RET/terminador) sem depender só do verificador? - Qual o limite de checagens estáticas no compiler vs checagens delegadas ao verifier do runtime?
- Como representar efeitos de stack no
IRVMpara detectar underflow/mismatch antes de emitir bytes? - Como versionar
IRVMem 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
- Esta agenda define o contrato intermediario
IRVMe as regras obrigatorias de loweringIRBackend -> IRVM. - O objetivo do
IRVMv1 e permitir emissao mecanica e deterministica de bytecode para runtimecore-v1. - Esta agenda NAO define o marshaling binario final
IRVM -> BytecodeModule(Agenda 18.3).
2) Modelo de IRVM (quase-ISA estendido)
IRVMv1 adota modelo quase-ISA:- opcodes da Core ISA alvo;
- e opcodes internos estendidos (
IRVM_EXT) quando necessarios para normalizacao/otimizacao.
IRVM_EXTMUST ser interno ao compilador e MUST NOT aparecer no artefato executavel final.- Todo opcode
IRVM_EXTMUST declarar metadados estruturais equivalentes a spec de opcode:pops,pushes,is_branch,is_terminator.
- O backend MUST expandir/reduzir todo
IRVM_EXTpara Core ISA antes da fase de emissao de bytecode.
3) Controle de fluxo e labels
- O
IRVMpode usar labels simbolicos internamente. - A resolucao final de labels para immediates
u32de salto MUST ocorrer noLowerToIRVM. - O target final de salto MUST seguir contrato da VM:
- offset relativo ao inicio da funcao (
func_start + target_relem runtime).
- offset relativo ao inicio da funcao (
- Todo salto MUST apontar para fronteira valida de instrucao da funcao alvo.
- Caminho alcancavel que cai no fim da funcao sem terminador MUST ser erro de compilacao.
4) IDs deterministas de funcao
- O backend MUST produzir
func_iddeterministico paraCALL,SPAWNeMAKE_CLOSURE. - Regra v1:
- entrypoint executavel no indice
0; - demais callables por ordenacao deterministica
(module_key, callable_name, source_start).
- entrypoint executavel no indice
- O mesmo grafo de entrada admitido MUST produzir os mesmos
func_id.
5) Contrato de chamadas
CALLMUST referenciarfunc_idvalido.SPAWNMUST respeitar aridade exata da funcao de destino.CALL_HOSTnoIRBackendMUST lower paraHOSTCALL <sysc_index>emIRVMpre-load.CALL_INTRINSICnoIRBackendMUST lower paraINTRINSIC <id_final>emIRVM.CALL_CLOSUREcom callee nao determinavel estaticamente e proibido no v1.
6) Contrato de slots por funcao
Para cada funcao em IRVM, o backend MUST fixar:
param_slots,local_slots,return_slots,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:
- validade de target de saltos;
- coerencia de altura de stack em joins;
- ausencia de underflow e overflow contra
max_stack_slots; - consistencia de
RETcomreturn_slots; - validade de
func_idreferenciado; - validade de aridade em
CALL/SPAWN/CALL_CLOSURE; - regra de
YIELDcom stack vazia; - validade estrutural de
HOSTCALL/INTRINSICno 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
IRVMMUST carregarvm_profileexplicito.- Para v1, o perfil normativo e
core-v1. - Mismatch entre
vm_profilee 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:
- formato binario final de
BytecodeModulee seccionamento PBX (Agenda 18.3); - politicas avancadas de otimizacao nao necessarias para conformidade v1.
Expected Spec Material
- Nova spec:
IRBackend -> IRVMlowering contract. - Nova spec:
IRVMmodel e invariantes. - Tabela de mapeamento
IRVM op -> ISA oppor linha de runtime suportada. - 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