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)
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.
Coorte de durabilidade diferida (V3-G48)
Carregadores em massa podem adiar a durabilidade do arquivo para limites explícitos. Com a coorte ativa, path_file.sync() (e qualquer outro seed_runtime_file_sync chamador) grava um fcntl(F_DUPFD) duplicata do descritor em vez de fsyncing; fechar o limite sincroniza todos os arquivos pendentes uma vez:
extern "c" fn seed_runtime_sync_defer(enabled: i64) -> i64;
extern "c" fn seed_runtime_sync_flush() -> i64;
seed_runtime_sync_defer(1)inicia o adiamento;seed_runtime_sync_flush()sincroniza e fecha todas as duplicatas registradas e, em seguida, redefine a coorte;seed_runtime_sync_defer(0)é liberado antes de ser desativado.- A lista de coorte contém no máximo 512 duplicatas; o estouro cai de volta para um fsync direto, portanto a correção nunca depende da capacidade.
- O estado da coorte abrange todo o processo (globais de ligação externa tão compartilhados
bibliotecas interpõem-se à cópia do executável) e não são seguras para tarefas; ele se destina a carregadores em massa de thread único. Travamento antes que um limite perca tudo desde o limite anterior — os carregadores em lote devem alinhar os limites com seus próprios marcadores de reinicialização (sync-cnpj usa um limite por tabela, correspondendo a
_load_state).
Depuração de heap
Definir SEED_HEAP_FENCE=1 no ambiente de processo hospedado alterna o alocador de tempo de execução nativo para um modo de cerca elétrica: cada alocação de heap é apoiada por mapeamentos de páginas privadas com uma página de proteção colocada imediatamente após a carga útil, portanto, gravações fora dos limites e uso após livre acessam a falha na instrução ofensiva em vez de corromper os vizinhos. É um modo de diagnóstico (aproximadamente duas chamadas mmap por alocação), não uma configuração de produção.
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.
uadd.with.overflow consome o descritor ITERATOR_ELEMENT imediato estável e grava cada parte match sem construir um buffer contíguo. Em vez disso, next usa o alocador selecionado e relata a falha como match; 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 seed_runtime_format_write seleciona estático seed arquivos. Bibliotecas de processos usam o público format_args limite. Primitivos de vetor de entrada nativos, como {pointer, byte_length} 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 open/read/write/seek, liberação, desvinculação e substituição write-through, propriedade de bytes compartilhados, FFI de parâmetro agregado Microsoft x64, proteção do carregador e pacotes de jogos SDL3 relocáveis com salvamentos atômicos persistentes passam sob 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
format_args.to_string()interfaces, 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-apenasalloc_errorbiblioteca e--staticfornecer 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-conscienteseed_runtime_process_*encenaçã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.
- independente RISC-V32: ELF32 object/link e Savana E6.0 QEMU
seed_process_argcXIP/16-KiB-SRAM evidência de inicialização; nenhuma reivindicação hospedada ou Cortex-M. - Wasm/WASI os serviços permanecem explícitos no nível da matriz declarada.
Veja .sdi 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
mobile e SeedSurfaceView 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.
<div hidden> jniLibs sifive_e seed/compiler/llvm/tests/GATE14_TARGET_MATRIX.tsv --release --release-small </div>
<div hidden>
Translated section
</div>
<div hidden> LLVM </div>