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.
- Linux x86-64: padrão nativo com hospedagem fechada e livre de libc.
- Linux AArch64: runtime/link hospedado com política de executor.
- Linux RISC-V64: somente objeto hospedado; a inicialização independente é separada.
- Windows x86-64: PE/DLL/runtime/tasks/networking, arquivo read/seek, propriedade de bytes compartilhados, FFI de parâmetro agregado Microsoft x64, proteção do carregador e um pacote de jogo SDL3 relocável passam de acordo com a política Wine necessária.
- macOS x86-64: a superfície do SDK explícito executable/dylib/static/runtime/pthread é pronto para a execução nativa necessária da Intel.
- macOS arm64: a superfície equivalente é verificada por ligação cruzada; a execução não é reivindicado sem corredor.
- Android braço64 e x86-64: LLVM/object emissão, bibliotecas estáticas, compartilhadas
bibliotecas e executáveis simples com um sysroot NDK explícito, além de
.sdiinterfaces, estão disponíveis como uma fatia de destino móvel inicial. O adaptador nativo cobre allocation/regions, tarefas, I/O/filesystem/socket invólucros, Logcat, process/time/entropy, recursos integrados de propriedade e cancelamento do ciclo de vida; o Android-apenasmobilebiblioteca eSeedSurfaceViewfornecer quadro limitado primitives/text, touch/key/IME entrada, safe-area/display métricas, sinais de foco e pressão de memória, privados files/cache visualizações de diretório e um armazenamento de slot inteiro privado atômico para pequenos progress/settings valores; um Gradle/CMake/Kotlin/JNI modelo de host, ABI-conscientejniLibsencenação, package/run comandos e diagnósticos médicos estão disponíveis. Emulator/device assinatura de execução e produção permanecem não verificadas sem um Android conjunto de ferramentas e corredor. - independente x86-64/AArch64/RISC-V64: evidência de inicialização livre de libc em Gate 7 níveis declarados.
- Wasm/WASI os serviços permanecem explícitos no nível da matriz declarada.
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.