Skip to content

Variáveis globais (Decl::GlobalVar) não têm codegen — sem .data/.bss #174

Description

@Bappoz

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

  1. Em lower_program, coletar Decl::GlobalVar (nome, tipo, inicializador constante ou ausente) antes de lowerar as funções.
  2. 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.
  3. 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).
  4. 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

  • int counter; int main(void) { counter = 41; return counter + 1; } compila e roda via gcc retornando 42
  • tests/integration/valid/structs.c e typedef.c passam a compilar e rodar via gcc (hoje só são validados a nível semântico)

Metadata

Metadata

Assignees

Labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions