10 KiB

Globals and Lifecycle Lowering to IRBackend/IRVM Agenda

Status

Open

Parent Agenda

This agenda derives from:

  • 19. Globals, Synthetic Module Init, and FRAME_RET Agenda

Expected fixed inputs from previous stages:

  • 19.1. PBS Globals Surface, Identity, and Module Boundaries Agenda
  • 19.2. PBS Lifecycle Markers, Program Init, and Frame Root Semantics Agenda
  • 19.3. Published Entrypoint, Synthetic Wrapper, and FRAME_RET Ownership Agenda

Purpose

Define how the already-decided globals and lifecycle model are represented and lowered through the executable compiler pipeline.

This agenda must close:

  • the representation boundary for globals;
  • module init synthesis;
  • boot guard materialization;
  • wrapper lowering;
  • and the executable path that preserves the chosen FRAME_RET ownership.

Domain Owner

docs/compiler/pbs

Este tema pertence ao domínio PBS, mas encosta diretamente nas specs gerais de lowering e nas interfaces entre frontend e backend.

Context

Depois que surface, lifecycle e publication contract estiverem fechados, ainda restará decidir:

  • em que boundary globals passam a existir como entidade explícita;
  • se IRBackend carrega globals diretamente ou só uma forma anterior;
  • como module init sintético é representado;
  • como o wrapper published entrypoint é emitido;
  • como o guard one-shot de boot é materializado.

Esta agenda é mecânica/arquitetural. Ela não deve reabrir decisões de linguagem.

Inputs Already Fixed Elsewhere

Os seguintes inputs devem ser tratados como fixos aqui:

  • surface e identidade de globals vindas de 19.1;
  • lifecycle semântico vindo de 19.2;
  • owner do published entrypoint e de FRAME_RET vindo de 19.3;
  • GET_GLOBAL e SET_GLOBAL já existem na VM.

Decisions To Produce

Esta agenda deve produzir direção suficiente para fechar:

  1. se globals entram explicitamente no IRBackend ou apenas em lowering posterior;
  2. como module init é sintetizado;
  3. como o guard one-shot de boot é materializado;
  4. como o wrapper é lowered;
  5. como FRAME_RET é preservado no ponto correto;
  6. quais contracts gerais de lowering precisam propagação.

Core Questions

  1. IRBackend deve ganhar representação explícita para globals?
  2. Se não, qual é o boundary intermediário responsável por materializá-los antes de IRVM?
  3. Module init sintético é emitido como callable próprio por módulo?
  4. O boot guard é global oculto, local estático de wrapper, ou outra forma interna?
  5. O wrapper published entrypoint é um callable sintético explícito no graph do frontend?
  6. Como manter attribution e diagnostics úteis para código sintético?
  7. Que mudanças mínimas precisam acontecer em specs gerais fora de docs/compiler/pbs?
  8. O lowering deve introduzir uma classe explícita de funções sintéticas com ergonomia própria, em vez de emissão ad hoc?

Options

Option A

Dar representação explícita a globals e callables sintéticos já no boundary de IRBackend, preservando attribution e identidade suficientes para lowering posterior.

Option B

Manter IRBackend sem globals explícitos e adiar essa materialização para um lowering mais baixo.

Option C

Tratar globals como açúcar compilado diretamente para slots/ops sem entidade intermediária estável.

Tradeoffs

Option A

  • Prós:
    • boundary mais explícito e testável;
    • menor inferência textual em lowers posteriores;
    • facilita explicar wrapper e init synthesis.
  • Contras:
    • aumenta o contrato do IRBackend;
    • pode exigir propagação além do domínio PBS.

Option B

  • Prós:
    • preserva o boundary atual por mais tempo.
  • Contras:
    • empurra complexidade para fases posteriores;
    • dificulta conformance do shape intermediário.

Option C

  • Prós:
    • menor aparente custo de modelagem.
  • Contras:
    • fraco para teste, attribution e manutenção;
    • mistura lowering demais cedo.

Recommendation

Seguir com a Option A, salvo impedimento forte de boundary cross-domain.

Current Direction

Os pontos abaixo já podem ser tratados como direção fechada desta agenda, salvo objeção nova forte:

  1. globals devem entrar explicitamente no IRBackend;
  2. o pipeline não deve adiar globals para uma materialização implícita tardia abaixo desse boundary;
  3. fragments de init por arquivo, init sintético por módulo, init de projeto e wrapper published entrypoint devem existir como callables sintéticos explícitos;
  4. o boot guard deve ser materializado como um global oculto;
  5. esse global oculto não pode ser referenciado nem alterado por userland;
  6. o wrapper published entrypoint deve existir explicitamente no graph de lowering;
  7. o lowering deve seguir direção direta para as operações de globals já suportadas em IRVM/VM, isto é, GET_GLOBAL e SET_GLOBAL;
  8. attribution e diagnostics devem preservar separadamente:
    • origem em source userland,
    • e origem sintética gerada pelo compiler;
  9. quando algum erro estrutural ou de lowering surgir em código sintetizado, a superfície sintética deve ser capaz de carregar attribution de volta ao código real que originou aquele trecho;
  10. spans e diagnostics devem preferir apontar para código real de userland sempre que essa origem existir;
  11. o frontend/lowering deve introduzir uma classe explícita de funções sintéticas com ergonomia própria;
  12. a emissão dessas funções não deve ser ad hoc caso a caso.

Synthetic Callable Direction

Esta agenda também fecha a seguinte direção arquitetural:

  1. callables sintéticos não devem ser tratados como acidentes de emissão;
  2. eles devem possuir classe/identidade própria no lowering;
  3. essa classe deve cobrir pelo menos:
    • fragmentos de init por arquivo,
    • init sintético por módulo,
    • init de projeto,
    • wrapper físico publicado;
  4. a ergonomia dessa classe própria deve facilitar:
    • ordenação,
    • attribution,
    • debug,
    • testes,
    • e futuras extensões de lifecycle sem reabrir o modelo básico.

Também fica fechada a seguinte exigência de diagnóstico:

  1. a superfície sintética precisa carregar origem suficiente para remapear erros ao código real;
  2. quando existir origem userland inequívoca, o diagnóstico deve preferir essa origem em vez de um span puramente sintético;
  3. spans puramente sintéticos só devem aparecer quando não houver origem real defensável.

Hidden Boot Guard Direction

O boot guard também fica com direção fechada nesta agenda:

  1. ele deve existir como global oculto de programa;
  2. ele pertence ao estado interno publicado pelo compiler;
  3. userland não pode nomeá-lo, ler seu valor ou alterá-lo;
  4. sua única função é garantir a semântica one-shot do bootstrap no wrapper físico.

IRBackend Shape Direction

Esta agenda também fecha o seguinte shape estrutural mínimo para o IRBackend.

1. Backend Globals

O IRBackend deve carregar globals explicitamente como entidades estruturais, não apenas como efeitos implícitos no corpo de funções.

Direção mínima recomendada para cada global:

  • name
  • ownerModuleId
  • type
  • slot
  • visibility
  • isHidden
  • origin

Isso deve cobrir:

  • globals de userland;
  • e globals ocultos do compiler, incluindo o boot guard.

2. Backend Callables

O IRBackend deve distinguir explicitamente:

  • callables normais de userland;
  • callables sintéticos gerados pelo compiler.

3. Synthetic Callable Kind

O conjunto mínimo de kinds sintéticos desta agenda deve cobrir:

  • FILE_INIT_FRAGMENT
  • MODULE_INIT
  • PROJECT_INIT
  • PUBLISHED_FRAME_WRAPPER

4. Synthetic Origin

Todo callable ou global sintético deve carregar metadados suficientes para attribution e remapeamento de diagnóstico.

Direção mínima recomendada:

  • derivedFromFile
  • derivedFromModule
  • derivedFromUserSymbol
  • primarySpan
  • fallbackSyntheticLabel

5. Hidden Global Kind

O boot guard deve aparecer como global oculto com identidade estrutural explícita, não como convenção informal de nome.

Direção mínima recomendada:

  • BOOT_GUARD

Diagnostics and Conformance Direction

Esta agenda também fecha o seguinte conjunto mínimo de checks estruturais e evidências de conformance.

Structural Diagnostics / Validation

  1. synthetic wrapper entrypoint missing
    • quando o pipeline não conseguir publicar o wrapper exigido.
  2. published entrypoint is not function index 0
    • quando o lowering violar o protocolo físico.
  3. hidden boot guard is missing
    • quando a semântica one-shot exigir o guard e ele não existir.
  4. synthetic callable origin missing
    • quando o lowering gerar callable sintético sem attribution suficiente para diagnóstico defensável.

Conformance / Fixture Expectations

  1. fixture com declare global + [Init] por arquivo + [Init] de projeto + [Frame];
  2. evidência de geração de:
    • file init fragment,
    • module init,
    • project init,
    • published wrapper,
    • hidden boot guard;
  3. evidência de que o wrapper ocupa func_id = 0;
  4. evidência de que FRAME_RET está no wrapper;
  5. evidência de que erro em lowering sintético remapeia para span real quando houver origem de userland defensável.

Spec and Learn Propagation Direction

Esta agenda também fecha a seguinte direção editorial:

  1. specs de lowering devem explicar de forma normativa:
    • a classe de callables sintéticos,
    • o lifecycle de init no lowering,
    • o wrapper publicado,
    • o hidden boot guard,
    • e a relação desses artefatos com attribution e diagnostics;
  2. learn deve explicar esse modelo de forma didática com exemplos de código source;
  3. learn deve mostrar como:
    • declare global,
    • [Init] por arquivo,
    • [Init] de projeto,
    • e [Frame] se compõem até virar o wrapper físico publicado;
  4. a explicação didática em learn deve privilegiar exemplos concretos de source e composição, não apenas descrição abstrata do pipeline.

Expected Spec Material

Se esta agenda fechar, a propagação esperada atinge pelo menos:

  • 13. Lowering IRBackend Specification.md
  • specs gerais de lowering/backend fora do domínio PBS, se necessário
  • 12. Diagnostics Specification.md

Non-Goals

Esta agenda não deve:

  1. redefinir surface syntax;
  2. redefinir lifecycle;
  3. redefinir manifest publication;
  4. fechar catálogo final de fixtures.

Next Step

Depois de fechar esta agenda, abrir ou aprofundar:

  • 19.5. Diagnostics, Manifest Propagation, and Conformance Coverage Agenda