Contexto
Descoberto ao implementar acesso a membro de struct (commit e111321 na developer). Os fixtures tests/integration/valid/structs.c e typedef.c declaram struct Point origin; no nível de arquivo; isso passa pela análise semântica, mas falha no lowering com erro explícito ("tipo de variavel desconhecido no lowering") porque Decl::GlobalVar nunca é processado: lower_program só itera Decl::Function.
Causa raiz
Não existe, em lugar nenhum do codegen (src/codegen/last/x86_64.rs), emissão de .data/.bss/.comm para armazenamento estático, nem resolução de Operand::Var para um símbolo global via nome(%rip) em vez de offset(%rbp). Hoje todo Operand::Var é implicitamente "variável local da função atual".
Escopo do trabalho
- Em
lower_program, coletar Decl::GlobalVar (nome, tipo, inicializador constante ou ausente) antes de lowerar as funções.
- Decidir como
Operand::Var (ou um novo Operand::Global) distingue local de global — hoje o Frame é por-função e não sabe nada sobre globais.
- No codegen, emitir
.bss/.data com os símbolos globais (zerados ou com valor inicial constante) e usar nome(%rip) para ler/escrever, em vez de offset(%rbp).
- Cuidado: variáveis locais e globais podem ter o mesmo nome (shadowing) — a resolução precisa preferir a local quando ambas existem no escopo.
Critério de aceite
Contexto
Descoberto ao implementar acesso a membro de struct (commit e111321 na developer). Os fixtures
tests/integration/valid/structs.cetypedef.cdeclaramstruct Point origin;no nível de arquivo; isso passa pela análise semântica, mas falha no lowering com erro explícito ("tipo de variavel desconhecido no lowering") porqueDecl::GlobalVarnunca é processado:lower_programsó iteraDecl::Function.Causa raiz
Não existe, em lugar nenhum do codegen (
src/codegen/last/x86_64.rs), emissão de.data/.bss/.commpara armazenamento estático, nem resolução deOperand::Varpara um símbolo global vianome(%rip)em vez deoffset(%rbp). Hoje todoOperand::Varé implicitamente "variável local da função atual".Escopo do trabalho
lower_program, coletarDecl::GlobalVar(nome, tipo, inicializador constante ou ausente) antes de lowerar as funções.Operand::Var(ou um novoOperand::Global) distingue local de global — hoje oFrameé por-função e não sabe nada sobre globais..bss/.datacom os símbolos globais (zerados ou com valor inicial constante) e usarnome(%rip)para ler/escrever, em vez deoffset(%rbp).Critério de aceite
int counter; int main(void) { counter = 41; return counter + 1; }compila e roda via gcc retornando 42tests/integration/valid/structs.cetypedef.cpassam a compilar e rodar via gcc (hoje só são validados a nível semântico)