Primitivos do sistema e tempo de execução

Esta página descreve a limpeza operacional LLVM compilador. As operações de baixo nível fazem parte seed em si, não uma linguagem adicional, mas aplicativos comuns devem consumir wrappers seguros auditados e restritos.

Perfis de tempo de execução

Perfil Significado
hosted serviços de tempo de execução da plataforma selecionados pelo destino
freestanding imagem livre de libc com serviços explicitamente selecionados
kernel restrições do kernel ABI/service e nenhuma suposição hospedada
none nenhum serviço de tempo de execução além target/compiler primitivos

Efeitos (alloc, bloqueio, pânico, I/O) são verificados em relação ao selecionado profile/service definido. Perfis não mudam ownership/type semântica.

Linux-a execução hospedada nativa não tem libc obrigatória. linux-libc é uma escolha explícita de tempo de execução de interoperabilidade. Freestanding/kernel os alvos permanecem livres de libc.

Memória bruta digitada

unsafe fn use_buffer() -> result<i64, alloc_error> {
    let pointer = raw_try_alloc<i64>(4)?
    raw_write<i64>(pointer, 0, 42)
    let value = raw_read<i64>(pointer, 0)
    raw_free<i64>(pointer)
    result.ok(value)
}

Um ABI externo que retorna o armazenamento de visualização process/static-lifetime pode declarar @static_view. Esta é uma afirmação de origem confiável restrita a extern; a chamada permanece unsafe e um wrapper de biblioteca seguro comum deve auditar a garantia vitalícia estrangeira.

O substrato limpo e inseguro é raw_try_alloc<t>, raw_null<t>, raw_is_null<t>, raw_read<t>, raw_write<t>, raw_free<t>e raw_slice<t>. A alocação rejeita contagens negativas, estouro de multiplicação e falha do alocador com alloc_error. Os chamadores inseguros permanecem responsáveis ​​pela extensão, alinhamento, inicialização, proveniência, alias e liberação exata do elemento.

raw_null<t>() produz o sentinela nulo interno usado por proprietários inseguros auditados e raw_is_null<t>(pointer) o testa. O padrão box<t> confina essas operações por trás de seu construtor, extração de consumo e destruidor.

Linux-alocações nativas cuja carga útil mais cabeçalho cabem em 8 KiB e cujo alinhamento é de no máximo 16 bytes usam classes de placas precisas (16 bytes a 8 KiB). Placas vazias de 1 MiB compartilham um cache de 32 entradas para todo o processo; o excesso de lajes vazias não é mapeado. Alocações maiores ou mais estritamente alinhadas permanecem mapeamentos diretos com arredondamento de página e são desmapeadas imediatamente.

O tempo de execução nativo também fornece recursos introduzidos pelo otimizador memcpy, memmovee memset pontos de entrada sem libc. É sqrt(f64) símbolo de tempo de execução desce para o LLVM intrínseco de raiz quadrada, permitindo que cargas de trabalho estritas de ponto flutuante permaneçam livres de libc.

Legado alloc(type,n), endereço inteiro read/writee free exemplos pertencem a backends arquivados e não são o compilador limpo API.

Espaços de endereço e dispositivos

Tipos de ponteiro bruto podem identificar user, kernel, physical, mmio, ou dma espaços de endereço. Eles permanecem distintos através .sdi e LLVM abaixando. Operações voláteis digitadas e inseguras explícitas mapping/cast transições são usadas para memória do dispositivo. compiler/llvm/libs/system constrói wrappers nominais seguros para MMIO, páginas, pin/DMA, inicialização e mecanismos locais de CPU.

Atômica

O compilador valida auxiliares acquire/release e operações ordenadas explícitas de carregamento, armazenamento, busca-adição, troca, comparação-troca e cerca. Combinações de pedido load/store/CAS inválidas são rejeitadas. Atômicos são distintos do acesso a dispositivos voláteis. Um wrapper seguro deve estabelecer tempo de vida de alocação, alinhamento, acesso compartilhado e um protocolo atômico consistente.

FFI e ABI

O target/ABI camada atribui interno explícito seed, público seed, plataforma-C, compilador integrado, entrada, interrupção e nu ABI aulas. .sdi inclui alvo, ABI, perfil de construção, perfil de tempo de execução e identidade de recurso de tempo de execução; conhecido seed incompatibilidades de artefato falham quando fechadas com um diagnóstico de reconstrução. Estrangeiro C/assembly objetos não têm seed metadados de perfil e permanecem explicitamente vinculáveis.

Os limites FFI cobertos incluem escalares, ponteiros brutos, retornos de chamada sem captura, identificadores opacos e wrappers escalares C-struct baseados em ponteiro. Estruturas C por valor e plataforma mais rica ABI modelagem permanecem limitadas. Chamadas estrangeiras não são seguras até serem embaladas por um cofre verificado API.

Pânico e limpeza

A falha na verificação segura invoca o alvo panic/trap política. Pânico, armadilha e aborto nunca se desenrolam seed, FFI, biblioteca dinâmica, interrupção, kernel/user ou limites de tarefas. Nenhuma limpeza lexical ou destruidor de usuário é executado nessas bordas.

Tempo de execução e bibliotecas separadas

Os compiladores integrados usam IDs de símbolos de tempo de execução estáveis ​​em vez de inspeção de string de nome de origem. Os serviços de tempo de execução executáveis hospedados incluem allocation/resource operações, processo entry/args/environment, output/files, time/randomness, descritores de rede, ganchos do agendador, regiões, pânico e aborto no nível implementado por cada linha de destino.

seed_runtime_format_write consome o descritor format_args imediato estável e grava cada parte {pointer, byte_length} sem construir um buffer contíguo. Em vez disso, format_args.to_string() usa o alocador selecionado e relata a falha como alloc_error; nenhum dos caminhos requer libc.

Bibliotecas dinâmicas declaram símbolos de tempo de execução necessários e resolvem de acordo com o executable/runtime domínio. Bibliotecas instaladas são target/ABI qualificado; ligação dinâmica é padrão e --static seleciona estático seed arquivos. Bibliotecas de processos usam o público seed_runtime_process_* limite. Primitivos de vetor de entrada nativos, como seed_process_argc permanecem ocultos dentro do executável e são acessados somente por meio de wrappers de tempo de execução exportados.

Níveis alvo

A matriz de destino declarativa separa a emissão LLVM/object dos níveis de link estático, link dinâmico, executável e de execução.

Veja seed/compiler/llvm/tests/GATE14_TARGET_MATRIX.tsv em vez de inferir capacidades a partir da presença de um LLVM triplo.

Significado de inicialização

Para Gate 7, “inicialização” significa que o compilador emite uma imagem de destino, a emulação do sistema QEMU a carrega por meio do caminho firmware/machine declarado, o código de entrada de destino é executado, grava a evidência de sucesso esperada por meio do mecanismo de destino e sai ou atinge o estado terminal esperado. Isso não significa que um sistema operacional completo, pilha de drivers, espaço de usuário ou libc esteja presente.

Liberar perfis

--release e --release-small preservar verificações seguras. LLVM pode remover verificações somente quando se provar redundante. ThinLTO, PGO, ligação estática, code/relocation modelo, política de zona vermelha, entrada, script do vinculador, destino, perfil de tempo de execução e sysroot são controles independentes explícitos.