Skip to content

Feat: integra fluxo de tratamento de variáveis globais#175

Merged
guxvr merged 9 commits into
developerfrom
feat/issue174-codegen-global-variables
Jun 25, 2026
Merged

Feat: integra fluxo de tratamento de variáveis globais#175
guxvr merged 9 commits into
developerfrom
feat/issue174-codegen-global-variables

Conversation

@HugoFreitass

Copy link
Copy Markdown
Collaborator

Contexto

Durante a implementação de acesso a membros de structs, foi identificado que declarações globais como:

struct Point origin;

passavam pela análise semântica, mas falhavam no lowering com o erro:

tipo de variavel desconhecido no lowering

Isso acontecia porque lower_program processava apenas Decl::Function, ignorando completamente Decl::GlobalVar.

Causa raiz

O backend assumia que todo Operand::Var representava uma variável local da função atual:

  • Não existia representação explícita para variáveis globais no TAC.
  • O codegen não emitia armazenamento estático em .data ou .bss.
  • Todo acesso a uma variável era resolvido como offset(%rbp).
  • O Frame não diferenciava variáveis locais de símbolos globais.
  • Não havia tratamento adequado de shadowing entre globais e locais.

Solução

Este PR adiciona suporte completo a variáveis globais no fluxo de geração de código.

TAC e lowering

  • Adiciona TacGlobal ao TacProgram.
  • Adiciona Operand::Global para distinguir globais de variáveis locais.
  • Coleta Decl::GlobalVar antes do lowering das funções.
  • Registra nome, tamanho e inicializador estático de cada global.
  • Suporta inicializadores constantes inteiros, caracteres, strings, casts e expressões constantes.
  • Variáveis sem inicializador recebem inicialização estática com zero.

Resolução de nomes

  • Mantém tabelas separadas para variáveis globais e locais.
  • Variáveis locais têm precedência sobre globais com o mesmo nome.
  • O shadowing respeita escopos léxicos e deixa de ocultar o global após o fim do bloco.
  • Declarações no inicializador de for permanecem visíveis somente durante o loop.

Codegen x86-64

  • Emite globais inicializadas na seção .data.
  • Emite globais zero-inicializadas na seção .bss.
  • Usa endereçamento RIP-relative para leitura e escrita:
movq counter(%rip), %rax
movq %rax, counter(%rip)
  • Usa leaq nome(%rip) para obter o endereço de uma global.
  • Impede que globais recebam slots no stack frame.
  • Preserva atribuições globais durante dead-code elimination.
  • Emite .note.GNU-stack somente em plataformas compatíveis com ELF.

Testes

Foram adicionados testes ponta a ponta cobrindo:

  • Leitura e escrita de global zero-inicializada.
  • Inicialização global por expressão constante.
  • Shadowing entre variáveis locais e globais.
  • Restauração da resolução global após o fim do escopo local.
  • Execução de tests/integration/valid/structs.c.
  • Execução de tests/integration/valid/typedef.c.

A suíte completa foi executada com:

cargo test --all-targets

Resultado:

345 testes aprovados
0 falhas

Critérios de aceite

  • int counter; int main(void) { counter = 41; return counter + 1; } compila e retorna 42.
  • tests/integration/valid/structs.c compila, linka e executa via GCC.
  • tests/integration/valid/typedef.c compila, linka e executa via GCC.
  • Variáveis locais ocultam globais com o mesmo nome apenas dentro do respectivo escopo.
  • Globais inicializadas e não inicializadas são emitidas corretamente em .data e .bss.

@HugoFreitass HugoFreitass changed the base branch from master to developer June 24, 2026 20:46
@HugoFreitass HugoFreitass changed the title Feat/issue174 codegen global variables Feat: integra fluxo de tratamento de variáveis globais Jun 24, 2026
@HugoFreitass HugoFreitass self-assigned this Jun 24, 2026
@HugoFreitass HugoFreitass linked an issue Jun 24, 2026 that may be closed by this pull request
2 tasks
@HugoFreitass HugoFreitass added codegen IR intermediate code generation labels Jun 24, 2026

@Phill-Chill Phill-Chill left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Revisão concluída com sucesso. A implementação atende a todos os requisitos estabelecidos para o suporte à geração de código e endereçamento de variáveis globais.

Destaco os seguintes aspectos técnicos da submissão:

  • TAC e Lowering: A introdução explícita de Operand::Global e TacGlobal corrige a lacuna estrutural anterior, garantindo o rastreio correto de tamanho e inicialização estática (zero-init ou expressões constantes).
  • Codegen (x86-64): A separação precisa entre seções .data (inicializadas) e .bss (não inicializadas), combinada com o uso seguro do endereçamento RIP-relative (%rip), demonstra excelente adequação à arquitetura-alvo e impede a alocação indevida no stack frame.
  • Resolução de Escopo (Shadowing): A separação e precedência correta das tabelas de símbolos locais e globais assegura a corretude léxica, ocultando a global apenas temporariamente durante o escopo interno.

Código validado frente aos critérios de aceite e coberto pelos testes E2E. Pull Request aprovado e pronto para integração.

@guxvr guxvr merged commit a3b6be5 into developer Jun 25, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

codegen IR intermediate code generation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

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

3 participants