Files
sift/vendor/modernc.org/libc/GEMINI.md
T
kyle 2f9d3d97e6 p2: digest with in-sift FIFO, SQLite caches, Honcho context, recover
Dixie is capped (max_inflight 2, queue_depth 8, queue_wait 20s) and
never queued on llama-server. Streaming chat, thinking off, 45s
fallback to clean. Digest and chunk-embedding caches are
content-addressed SQLite (Honcho context is not cached). Recover
uses the guarded Fetcher. guardian-star is refused in code.
2026-09-22 23:54:49 -07:00

2.9 KiB

GEMINI.md

This file provides guidance for the Gemini AI assistant when working with the modernc.org/libc repository.

Overview

modernc.org/libc is a partial reimplementation of C libc in pure Go. It acts as the runtime for C programs transpiled to Go by the modernc.org/ccgo transpiler (used notably by modernc.org/sqlite). It is not intended as a general-purpose standalone library.

Key Rule: The API tracks the needs of ccgo-generated code. Callers must use the libc version matching their generated code. Do not bump the libc version of downstream consumers without re-translating their C sources.

Architecture

The codebase is split into two completely separate code paths, selected by build constraints:

  1. musl-derived (Linux)

    • Targeted via: //go:build linux && (amd64 || arm64 || loong64 || ppc64le || s390x || riscv64 || 386 || arm)
    • Generated files: ccgo_linux_*.go (~4MB each), per-arch musl_*.go, and assembly stubs abi0_linux_amd64.{go,s}. Do not hand-edit generated files.
    • Hand-written glue files: libc_musl.go, etc_musl.go, mem_brk_musl.go, mem_musl.go, memgrind_musl.go, pthread_musl.go, syscall_musl.go, aliases.go, atomic.go, atomic{32,64}.go, builtin{32,64}.go, libc_linux_statfs.go.
  2. Hand-written (non-Linux / mips64le)

    • Targeted via negated constraints.
    • Main files: libc.go, libc_unix.go, libc_<goos>.go, libc_windows*.go, pthread.go, mem.go.
    • These platforms use handwritten implementations combined with some older ccgo/v3-generated musl_<goos>_<goarch>.go pieces.

Important: When making a change, you usually need to update both code paths (the musl path and the hand-written path).

Common Commands

  • Build/Lint:
    • go build ./...
    • make editor (fast iteration)
    • make build_all_targets (full cross-compile, required before submitting)
  • Tests:
    • make short-test
    • make test (full test)
    • make libc-test (musl libc-test suite)
    • go test -v -run <TestName>
  • Generate (Linux only):
    • make generate (downloads musl, translates via ccgo, rebuilds, and tests)

Build Tags

  • libc.membrk: Sbrk-style allocator for detecting use-after-free.
  • libc.memgrind: Allocator audit table for leak detection.
  • libc.dmesg: Per-pid logging to /tmp/libc.log.
  • libc.strace: Traces C function entries.
  • Note: libc.membrk and libc.memgrind are mutually exclusive.

Symbol Naming Conventions

  • Xfoo: Externally visible C function foo.
  • Yfoo: abi0-wrapped entry to Xfoo (linux/amd64).
  • Tfoo_t: Typedef'd C type foo_t.
  • Sfoo / Ufoo: Struct / Union tags.
  • Ffield: Struct field.

If you add a new Xfoo symbol in hand-written files, ensure it is added to the relevant capi_<goos>_<goarch>.go files.

Thread Local State (TLS)

  • *TLS represents a C "thread". It is passed as the first argument to every Xfoo function.
  • TLS is not safe for concurrent use. Use one goroutine per TLS.