Early engine prototypes resolved Extern(Library:…) via dlopen/dlsym. That complicates reproducible AOT artifacts and blurs security review of loaded code.
Verification and traceability
Platform spec article
Verification and traceability
Spec standingStandard
-
User foreign libraries resolve at link time; dlopen remains legacy.
Context
Decision
Track Status Link-time Standard for v0.3 — addresses fixed before execution via C ABI profile Dynamic extern_dlopenProposed / legacy — engine feature only; not required for reference CLI Validation High-level Beskid types in extern signatures must be rejected before codegen Syscalls User externs must not embed OS syscall sequences — see Panic, IO, and syscalls Consequences
New platform work documents link-time flows first. Dynamic resolution stays gated behind
extern_dlopeninbeskid_engine.Verification anchors
compiler/crates/beskid_analysisextern validation;beskid_enginelink paths. -
Compiler thunks call stable dispatch entrypoints for language/runtime interop layouts.
Context
Tagged interop values need runtime-known layout offsets. Per-site custom trampolines would fork ABI stability.
Decision
Builtin family Role interop_dispatch_unitUnit-tagged dispatch interop_dispatch_ptrPointer payloads interop_dispatch_usizeScalar bridge Layout stability Offsets are versioned with ABI versioning Implementation beskid_runtime::interopexports registered inBUILTIN_SPECSLowering must route approved tagged calls through these builtins rather than ad-hoc host calls.
Consequences
Interop layout changes require ABI bump or additive symbol policy per D-EXEC-ABI-0002.
Verification anchors
compiler/crates/beskid_runtime/src/interop/; interop lowering tests.
- Contracts and edge cases MUST rules for extern validation, dynamic linking policy, and interop dispatch layout.
- Design model Extern resolution layers, runtime dispatch builtins, and host policy boundaries.
- Examples Declaring Extern contracts, dynamic getpid smoke, and interop dispatch usage patterns.
- FAQ and troubleshooting Extern linking failures, dlopen policy, and interop dispatch debugging.
- Flow and algorithm Extern validation, link registration, optional dlopen resolution, and interop dispatch calls.
- Verification and traceability Engine extern tests, analysis diagnostics, and interop layout traceability.
0 revisions (git unavailable at build; counts may be empty)
No commits recorded for this path.
| Section id | Required | Found |
|---|---|---|
what-this-feature-specifies | yes | yes |
implementation-anchors | yes | yes |
Full tree: run pnpm verify:platform-spec-layout (writes src/generated/platform-spec-layout-report.json).
Implementation anchors
Section titled “Implementation anchors”| Path | Role |
|---|---|
compiler/crates/beskid_analysis/src/beskid.pest | Extern syntax |
compiler/crates/beskid_analysis/src/analysis/diagnostic_kinds.rs | Extern-related diagnostics |
compiler/crates/beskid_abi/src/builtins.rs | interop_dispatch_* in BUILTIN_SPECS |
compiler/crates/beskid_codegen | declare_validated_extern_imports, signature validation |
compiler/crates/beskid_engine | extern_dlopen tests, new_with_symbols |
compiler/crates/beskid_runtime/src/interop.rs | Dispatch implementations |
compiler/crates/beskid_runtime/src/interop_layout.rs | Tag/payload offsets |
Test matrix
Section titled “Test matrix”| Test (engine) | Asserts |
|---|---|
extern_resolution_only_compiles_with_feature | Resolution succeeds when feature on |
extern_real_call_getpid | Live call returns plausible PID |
extern_resolution_fails_without_feature | EXT-001 style failure |
extern_missing_symbol_errors | dlsym diagnostic quality |
extern_missing_library_errors | dlopen diagnostic quality |
Requirement traceability
Section titled “Requirement traceability”| ID | Evidence |
|---|---|
| EXT-001 | extern_resolution_fails_without_feature |
| EXT-002 | ExternDeclarationError::InvalidSignature unit paths in codegen |
| EXT-003–004 | Engine cache tests + code review of dlopen flags |
| EXT-005 | interop_layout.rs + runtime dispatch tests |