3.5 KiB
3.5 KiB
PR-07.3 - IRVM Entrypoint Export Emission for Runtime Loader Compatibility
Briefing
Hoje um cartridge pode compilar com entrypoint: "frame" no manifest.json e pub fn frame() no mod.barrel, mas ainda falhar em runtime com EntrypointNotFound.
A causa observada e que o program.pbx pode ser emitido sem secao exports (section kind 4), enquanto o loader resolve entrypoint nominal usando program.exports.
Motivation
Dor atual que esta PR resolve
- Build aparentemente valido, mas falha de bootstrap em runtime.
- Divergencia entre contrato de manifesto (
entrypointnominal) e artefato PBX emitido. - Falta de evidencia automatizada para evitar regressao de exports no caminho
IRBackend -> IRVM -> Bytecode.
Target
Corrigir o pipeline backend para sempre emitir export nominal do entrypoint no PBX de preload, garantindo compatibilidade com o loader quando o manifest.json declara entrypoint por nome.
Dependencies
Prerequisitos diretos:
PR-05.3(politica deterministica de entrypoint no indice0).PR-05.4(coerencia unica entre IRVM e EmissionPlan).
Scope
LowerToIRVMServicedeve preencherEmissionPlan.exportscom o simbolo do entrypoint apontando parafunc_idx = 0.- Adicionar regressao dedicada para garantir que
coherentEmissionPlan()preserva export do entrypoint. - Validar serializacao PBX com secao
exportspresente quando houver entrypoint nominal. - Cobrir cenario de integracao onde
manifest.entrypoint = "frame"inicializa VM semEntrypointNotFound.
Non-Goals
- Nao exportar toda a superficie de funcoes executaveis neste passo.
- Nao alterar formato binario PBX alem da presenca correta da secao
exports. - Nao mudar semantica de resolucao por indice numerico de entrypoint.
Method
O que deve ser feito explicitamente
- No
LowerToIRVMService, construirBytecodeEmitter.EmissionPlancomexportscontendo, no minimo,Export(entryPointCallableName, 0). - Garantir determinismo do export do entrypoint a partir da mesma politica que fixa
func_id = 0. - Adicionar teste unitario em
LowerToIRVMServiceTestpara verificar export nominal do entrypoint no plano coerente. - Adicionar teste de emissao/link para verificar secao
exportsno modulo serializado. - Adicionar teste de integracao runtime-backed para falhar se regressar para
EntrypointNotFoundem cartridge com entrypoint nominal valido.
Acceptance Criteria
- Build de projeto PBS com entrypoint
framegera PBX com secaoexports. - O simbolo
frameaponta parafunc_idx = 0no artefato emitido. - Execucao de cartridge com
manifest.entrypoint = "frame"nao falha porEntrypointNotFoundquando o programa contem o entrypoint admitido. - Rebuilds equivalentes produzem mapping de export deterministico.
Tests
- Novos testes de backend:
:prometeu-compiler:prometeu-build-pipeline:test
- Reexecucao de compatibilidade runtime-backed:
:prometeu-compiler:prometeu-build-pipeline:test --tests *Runtime*
- Smoke local recomendado:
./runtime/prometeu build ../runtime/prometeu run cartridge
Affected Documents
docs/general/specs/15. Bytecode and PBX Mapping Specification.mddocs/general/specs/20. IRBackend to IRVM Lowering Specification.mddocs/pbs/specs/7. Cartridge Manifest and Runtime Capabilities Specification.mddocs/general/specs/22. Backend Spec-to-Test Conformance Matrix.md
Open Questions
- Em evolucao futura, devemos exportar apenas o entrypoint ou tambem funcoes explicitamente marcadas para linking externo?