@greenpandastudios/aug-cli 0.20.1 → 0.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/docs/assets/benchmarks/execution.svg +774 -637
- package/docs/assets/benchmarks/http.svg +278 -249
- package/docs/assets/benchmarks/improvements.svg +66 -66
- package/docs/assets/benchmarks/kernels-mobile.svg +1 -0
- package/docs/assets/benchmarks/kernels.svg +1 -0
- package/docs/assets/benchmarks/memory.svg +153 -153
- package/docs/benchmark-results.json +227089 -90363
- package/docs/compatibility.md +6 -6
- package/docs/contributing-benchmarks.md +36 -6
- package/docs/dev-containers.md +8 -15
- package/docs/dgx-consumers.json +122 -0
- package/docs/dgx-gyms.json +784 -0
- package/docs/dgx-kernels.json +1170 -0
- package/docs/dgx-performance.json +227849 -0
- package/docs/dgx-spark.md +64 -0
- package/docs/diagnostics.md +1 -1
- package/docs/docker.md +16 -17
- package/docs/example-projects.json +32 -0
- package/docs/examples/approved-design/dependencies/august/{0.20.1 → 0.21.0}/io/contracts.md +3 -3
- package/docs/examples/approved-design/domain/app.md +4 -4
- package/docs/examples/approved-design/main.md +2 -2
- package/docs/examples/calls-benchmark/index.md +36 -0
- package/docs/examples/calls-benchmark/main.md +78 -0
- package/docs/examples/calls-benchmark/operations.md +60 -0
- package/docs/examples/developer-workflow/calculator.md +5 -5
- package/docs/examples/developer-workflow/dependencies/august/{0.20.1 → 0.21.0}/io/contracts.md +3 -3
- package/docs/examples/developer-workflow/logging/console.md +2 -2
- package/docs/examples/developer-workflow/logging/logger.md +2 -2
- package/docs/examples/developer-workflow/main.md +2 -2
- package/docs/examples/errors-benchmark/index.md +36 -0
- package/docs/examples/errors-benchmark/main.md +92 -0
- package/docs/examples/errors-benchmark/operations.md +65 -0
- package/docs/examples/float-benchmark/index.md +35 -0
- package/docs/examples/float-benchmark/main.md +75 -0
- package/docs/examples/generic-di/dependencies/august/{0.20.1 → 0.21.0}/io/contracts.md +3 -3
- package/docs/examples/generic-di/main.md +2 -2
- package/docs/examples/generic-di/types.md +3 -3
- package/docs/examples/hello/app/greeter.md +3 -3
- package/docs/examples/hello/dependencies/august/{0.20.1 → 0.21.0}/io/contracts.md +3 -3
- package/docs/examples/hello/logging/console.md +2 -2
- package/docs/examples/hello/logging/logger.md +2 -2
- package/docs/examples/hello/main.md +2 -2
- package/docs/examples/index.md +18 -1
- package/docs/examples/interceptors/app.md +5 -5
- package/docs/examples/interceptors/dependencies/august/{0.20.1 → 0.21.0}/io/contracts.md +3 -3
- package/docs/examples/interceptors/interceptors.md +2 -2
- package/docs/examples/interceptors/logging.md +3 -3
- package/docs/examples/interceptors/main.md +2 -2
- package/docs/examples/list-benchmark/index.md +35 -0
- package/docs/examples/list-benchmark/main.md +78 -0
- package/docs/examples/map-churn-benchmark/index.md +35 -0
- package/docs/examples/map-churn-benchmark/main.md +106 -0
- package/docs/examples/native-blake3/dependencies/packages/@greenpandastudios/aug-blake3/0.1.3/api.md +104 -0
- package/docs/examples/native-blake3/dependencies/packages/@greenpandastudios/aug-blake3/0.1.3/contracts.md +54 -0
- package/docs/examples/native-blake3/dependencies/packages/@greenpandastudios/aug-blake3/0.1.3/native.abi-json.md +48 -0
- package/docs/examples/native-blake3/hashing.md +93 -0
- package/docs/examples/native-blake3/index.md +38 -0
- package/docs/examples/native-blake3/main.md +73 -0
- package/docs/examples/native-pytorch/dependencies/packages/@greenpandastudios/aug-pytorch/0.1.4/api.md +406 -0
- package/docs/examples/native-pytorch/dependencies/packages/@greenpandastudios/aug-pytorch/0.1.4/bindings.md +51 -0
- package/docs/examples/native-pytorch/dependencies/packages/@greenpandastudios/aug-pytorch/0.1.4/contracts.md +63 -0
- package/docs/examples/native-pytorch/dependencies/packages/@greenpandastudios/aug-pytorch/0.1.4/native.abi-json.md +161 -0
- package/docs/examples/native-pytorch/index.md +38 -0
- package/docs/examples/native-pytorch/main.md +73 -0
- package/docs/examples/native-pytorch/tensors.md +123 -0
- package/docs/examples/native-sqlite/database.md +116 -0
- package/docs/examples/native-sqlite/dependencies/packages/@greenpandastudios/aug-sqlite/0.1.3/api.md +284 -0
- package/docs/examples/native-sqlite/dependencies/packages/@greenpandastudios/aug-sqlite/0.1.3/bindings.md +51 -0
- package/docs/examples/native-sqlite/dependencies/packages/@greenpandastudios/aug-sqlite/0.1.3/contracts.md +75 -0
- package/docs/examples/native-sqlite/dependencies/packages/@greenpandastudios/aug-sqlite/0.1.3/native.abi-json.md +119 -0
- package/docs/examples/native-sqlite/index.md +38 -0
- package/docs/examples/native-sqlite/main.md +73 -0
- package/docs/examples/native-zlib/compression.md +99 -0
- package/docs/examples/native-zlib/dependencies/packages/@greenpandastudios/aug-zlib/0.1.3/api.md +153 -0
- package/docs/examples/native-zlib/dependencies/packages/@greenpandastudios/aug-zlib/0.1.3/contracts.md +54 -0
- package/docs/examples/native-zlib/dependencies/packages/@greenpandastudios/aug-zlib/0.1.3/native.abi-json.md +76 -0
- package/docs/examples/native-zlib/index.md +38 -0
- package/docs/examples/native-zlib/main.md +78 -0
- package/docs/examples/new-syntax/console.md +2 -2
- package/docs/examples/new-syntax/dependencies/august/{0.20.1 → 0.21.0}/io/contracts.md +3 -3
- package/docs/examples/new-syntax/greeter.md +3 -3
- package/docs/examples/new-syntax/logger.md +2 -2
- package/docs/examples/new-syntax/main.md +2 -2
- package/docs/examples/ownership-transfer/dependencies/august/{0.20.1 → 0.21.0}/io/contracts.md +3 -3
- package/docs/examples/ownership-transfer/main.md +2 -2
- package/docs/examples/ownership-transfer/resource.md +2 -2
- package/docs/examples/packages-math/aug-package-json.md +1 -1
- package/docs/examples/records-benchmark/data.md +55 -0
- package/docs/examples/records-benchmark/index.md +36 -0
- package/docs/examples/records-benchmark/main.md +85 -0
- package/docs/examples/strings-benchmark/index.md +35 -0
- package/docs/examples/strings-benchmark/main.md +76 -0
- package/docs/examples/tasks-benchmark/index.md +36 -0
- package/docs/examples/tasks-benchmark/main.md +89 -0
- package/docs/examples/tasks-benchmark/operations.md +58 -0
- package/docs/getting-started.md +3 -3
- package/docs/grammar.md +2 -2
- package/docs/gym-results.json +784 -0
- package/docs/implementation-map.md +6 -0
- package/docs/index.md +1 -1
- package/docs/kernel-results.json +1170 -0
- package/docs/language-conformance.md +6 -0
- package/docs/language-constructs.md +9 -1
- package/docs/learn/index.md +1 -1
- package/docs/maintaining-docs.md +1 -1
- package/docs/native-implementation.md +276 -0
- package/docs/native-interop-llvm-plan.md +342 -0
- package/docs/native-package-examples.md +684 -0
- package/docs/native-packages.md +179 -0
- package/docs/packages.md +2 -2
- package/docs/performance.md +50 -29
- package/docs/production-readiness.md +11 -1
- package/docs/public/downloads/approved-design.zip +0 -0
- package/docs/public/downloads/calls-benchmark.zip +0 -0
- package/docs/public/downloads/developer-workflow.zip +0 -0
- package/docs/public/downloads/errors-benchmark.zip +0 -0
- package/docs/public/downloads/float-benchmark.zip +0 -0
- package/docs/public/downloads/generic-di.zip +0 -0
- package/docs/public/downloads/hello.zip +0 -0
- package/docs/public/downloads/interceptors.zip +0 -0
- package/docs/public/downloads/json-benchmark.zip +0 -0
- package/docs/public/downloads/list-benchmark.zip +0 -0
- package/docs/public/downloads/map-churn-benchmark.zip +0 -0
- package/docs/public/downloads/native-blake3.zip +0 -0
- package/docs/public/downloads/native-pytorch.zip +0 -0
- package/docs/public/downloads/native-sqlite.zip +0 -0
- package/docs/public/downloads/native-zlib.zip +0 -0
- package/docs/public/downloads/new-syntax.zip +0 -0
- package/docs/public/downloads/oidc-login.zip +0 -0
- package/docs/public/downloads/ownership-transfer.zip +0 -0
- package/docs/public/downloads/packages-app.zip +0 -0
- package/docs/public/downloads/packages-math.zip +0 -0
- package/docs/public/downloads/records-benchmark.zip +0 -0
- package/docs/public/downloads/strings-benchmark.zip +0 -0
- package/docs/public/downloads/tasks-benchmark.zip +0 -0
- package/docs/qualification-results.md +66 -0
- package/docs/reference.md +24 -0
- package/docs/releasing.md +81 -6
- package/docs/research/libtorch-native-qualification.md +115 -0
- package/docs/research/native-interop-llvm.md +197 -0
- package/docs/research/qualification-methods.md +15 -0
- package/docs/roadmap.md +1 -0
- package/docs/safety-gyms.md +41 -0
- package/docs/tooling.md +16 -15
- package/docs/web-library-gaps.md +1 -1
- package/docs/web.md +4 -0
- package/examples/approved-design/.aug-spec/manifest.json +3 -3
- package/examples/approved-design/domain/app.aug.md +4 -4
- package/examples/approved-design/main.aug.md +2 -2
- package/examples/developer-workflow/.aug-spec/manifest.json +3 -3
- package/examples/developer-workflow/calculator.aug.md +5 -5
- package/examples/developer-workflow/logging/console.aug.md +2 -2
- package/examples/developer-workflow/logging/logger.aug.md +2 -2
- package/examples/developer-workflow/main.aug.md +2 -2
- package/examples/generic-di/.aug-spec/manifest.json +3 -3
- package/examples/generic-di/main.aug.md +2 -2
- package/examples/generic-di/types.aug.md +3 -3
- package/examples/hello/.aug-spec/manifest.json +3 -3
- package/examples/hello/app/greeter.aug.md +3 -3
- package/examples/hello/logging/console.aug.md +2 -2
- package/examples/hello/logging/logger.aug.md +2 -2
- package/examples/hello/main.aug.md +2 -2
- package/examples/interceptors/.aug-spec/manifest.json +3 -3
- package/examples/interceptors/app.aug.md +5 -5
- package/examples/interceptors/interceptors.aug.md +2 -2
- package/examples/interceptors/logging.aug.md +3 -3
- package/examples/interceptors/main.aug.md +2 -2
- package/examples/native-blake3/.aug-spec/manifest.json +16 -0
- package/examples/native-blake3/.aug-spec/packages/@greenpandastudios/aug-blake3/0.1.1/native.abi.json +29 -0
- package/examples/native-blake3/.aug-spec/packages/@greenpandastudios/aug-blake3/0.1.3/api.aug +14 -0
- package/examples/native-blake3/.aug-spec/packages/@greenpandastudios/aug-blake3/0.1.3/api.aug.md +34 -0
- package/examples/native-blake3/.aug-spec/packages/@greenpandastudios/aug-blake3/0.1.3/contracts.aug +4 -0
- package/examples/native-blake3/.aug-spec/packages/@greenpandastudios/aug-blake3/0.1.3/contracts.aug.md +8 -0
- package/examples/native-blake3/.aug-spec/packages/@greenpandastudios/aug-blake3/0.1.3/native.abi.json +29 -0
- package/examples/native-blake3/AGENTS.md +5 -0
- package/examples/native-blake3/aug.lock.json +253 -0
- package/examples/native-blake3/hashing.aug +11 -0
- package/examples/native-blake3/hashing.aug.md +25 -0
- package/examples/native-blake3/main.aug +8 -0
- package/examples/native-blake3/main.aug.md +13 -0
- package/examples/native-pytorch/.aug-spec/manifest.json +18 -0
- package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.1/native.abi.json +142 -0
- package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.3/native.abi.json +142 -0
- package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.4/api.aug +101 -0
- package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.4/api.aug.md +160 -0
- package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.4/bindings.aug +3 -0
- package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.4/bindings.aug.md +8 -0
- package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.4/contracts.aug +6 -0
- package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.4/contracts.aug.md +13 -0
- package/examples/native-pytorch/.aug-spec/packages/@greenpandastudios/aug-pytorch/0.1.4/native.abi.json +142 -0
- package/examples/native-pytorch/AGENTS.md +5 -0
- package/examples/native-pytorch/aug.lock.json +309 -0
- package/examples/native-pytorch/main.aug +8 -0
- package/examples/native-pytorch/main.aug.md +13 -0
- package/examples/native-pytorch/tensors.aug +23 -0
- package/examples/native-pytorch/tensors.aug.md +35 -0
- package/examples/native-sqlite/.aug-spec/manifest.json +18 -0
- package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.2/native.abi.json +100 -0
- package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.3/api.aug +48 -0
- package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.3/api.aug.md +91 -0
- package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.3/bindings.aug +3 -0
- package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.3/bindings.aug.md +8 -0
- package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.3/contracts.aug +8 -0
- package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.3/contracts.aug.md +22 -0
- package/examples/native-sqlite/.aug-spec/packages/@greenpandastudios/aug-sqlite/0.1.3/native.abi.json +100 -0
- package/examples/native-sqlite/AGENTS.md +5 -0
- package/examples/native-sqlite/aug.lock.json +236 -0
- package/examples/native-sqlite/database.aug +15 -0
- package/examples/native-sqlite/database.aug.md +27 -0
- package/examples/native-sqlite/main.aug +8 -0
- package/examples/native-sqlite/main.aug.md +13 -0
- package/examples/native-zlib/.aug-spec/manifest.json +16 -0
- package/examples/native-zlib/.aug-spec/packages/@greenpandastudios/aug-zlib/0.1.1/native.abi.json +57 -0
- package/examples/native-zlib/.aug-spec/packages/@greenpandastudios/aug-zlib/0.1.3/api.aug +29 -0
- package/examples/native-zlib/.aug-spec/packages/@greenpandastudios/aug-zlib/0.1.3/api.aug.md +54 -0
- package/examples/native-zlib/.aug-spec/packages/@greenpandastudios/aug-zlib/0.1.3/contracts.aug +4 -0
- package/examples/native-zlib/.aug-spec/packages/@greenpandastudios/aug-zlib/0.1.3/contracts.aug.md +8 -0
- package/examples/native-zlib/.aug-spec/packages/@greenpandastudios/aug-zlib/0.1.3/native.abi.json +57 -0
- package/examples/native-zlib/AGENTS.md +5 -0
- package/examples/native-zlib/aug.lock.json +236 -0
- package/examples/native-zlib/compression.aug +15 -0
- package/examples/native-zlib/compression.aug.md +27 -0
- package/examples/native-zlib/main.aug +10 -0
- package/examples/native-zlib/main.aug.md +13 -0
- package/examples/new-syntax/.aug-spec/manifest.json +3 -3
- package/examples/new-syntax/console.aug.md +2 -2
- package/examples/new-syntax/greeter.aug.md +3 -3
- package/examples/new-syntax/logger.aug.md +2 -2
- package/examples/new-syntax/main.aug.md +2 -2
- package/examples/oidc-login/aug.lock.json +6 -6
- package/examples/ownership-transfer/.aug-spec/manifest.json +3 -3
- package/examples/ownership-transfer/main.aug.md +2 -2
- package/examples/ownership-transfer/resource.aug.md +2 -2
- package/examples/packages/math/aug-package.json +1 -1
- package/native/compiler-packs.json +43 -0
- package/package.json +3 -2
- package/runtime/aug_http.c +48 -21
- package/runtime/aug_http_ir.c +30 -0
- package/runtime/aug_http_ir.h +18 -0
- package/runtime/aug_ir.c +209 -0
- package/runtime/aug_ir.h +89 -0
- package/runtime/aug_json.c +6 -1
- package/runtime/aug_runtime.c +82 -16
- package/runtime/aug_runtime.h +16 -2
- package/runtime/aug_tasks.c +38 -7
- package/runtime/aug_values.c +12 -6
- package/scripts/bootstrap-native.mjs +4 -1
- package/src/ast.js +1 -1
- package/src/checker.js +110 -28
- package/src/cli.js +92 -14
- package/src/codegen.js +31 -6
- package/src/compiler-packs.js +66 -0
- package/src/config.js +2 -2
- package/src/editor.js +15 -6
- package/src/formatter.js +4 -2
- package/src/git-http.js +137 -0
- package/src/git-packages.js +9 -1
- package/src/help.js +10 -2
- package/src/ir-types.js +5 -0
- package/src/ir-verify.js +277 -0
- package/src/ir.js +962 -0
- package/src/llvm-debug.js +101 -0
- package/src/llvm-native.js +152 -0
- package/src/llvm-platform.js +20 -0
- package/src/llvm.js +781 -0
- package/src/native-artifacts.js +207 -0
- package/src/native-bindings.js +189 -0
- package/src/native-contracts.js +295 -0
- package/src/native-declarations.js +68 -0
- package/src/native-facts.js +63 -0
- package/src/package-locking.js +43 -0
- package/src/package-manager.js +23 -8
- package/src/parser.js +20 -2
- package/src/project.js +2 -2
- package/src/runtime-abi.js +23 -0
- package/src/runtime-adapters.js +18 -0
- package/src/schemas.js +24 -17
- package/src/semantic.js +8 -3
- package/src/snippets.js +1 -0
- package/src/spec.js +49 -8
- /package/examples/approved-design/.aug-spec/august/{0.20.1 → 0.21.0}/io/contracts.aug +0 -0
- /package/examples/approved-design/.aug-spec/august/{0.20.1 → 0.21.0}/io/contracts.aug.md +0 -0
- /package/examples/developer-workflow/.aug-spec/august/{0.20.1 → 0.21.0}/io/contracts.aug +0 -0
- /package/examples/developer-workflow/.aug-spec/august/{0.20.1 → 0.21.0}/io/contracts.aug.md +0 -0
- /package/examples/generic-di/.aug-spec/august/{0.20.1 → 0.21.0}/io/contracts.aug +0 -0
- /package/examples/generic-di/.aug-spec/august/{0.20.1 → 0.21.0}/io/contracts.aug.md +0 -0
- /package/examples/hello/.aug-spec/august/{0.20.1 → 0.21.0}/io/contracts.aug +0 -0
- /package/examples/hello/.aug-spec/august/{0.20.1 → 0.21.0}/io/contracts.aug.md +0 -0
- /package/examples/interceptors/.aug-spec/august/{0.20.1 → 0.21.0}/io/contracts.aug +0 -0
- /package/examples/interceptors/.aug-spec/august/{0.20.1 → 0.21.0}/io/contracts.aug.md +0 -0
- /package/examples/new-syntax/.aug-spec/august/{0.20.1 → 0.21.0}/io/contracts.aug +0 -0
- /package/examples/new-syntax/.aug-spec/august/{0.20.1 → 0.21.0}/io/contracts.aug.md +0 -0
- /package/examples/ownership-transfer/.aug-spec/august/{0.20.1 → 0.21.0}/io/contracts.aug +0 -0
- /package/examples/ownership-transfer/.aug-spec/august/{0.20.1 → 0.21.0}/io/contracts.aug.md +0 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { basename, dirname } from 'node:path';
|
|
2
|
+
const quote = (value) => '"' + [...Buffer.from(value)].map(byte => byte >= 32 && byte < 127 && byte !== 34 && byte !== 92 ? String.fromCharCode(byte) : '\\' + byte.toString(16).padStart(2, '0').toUpperCase()).join('') + '"';
|
|
3
|
+
const typeName = (type) => (type.optional || type.nullable ? 'optional ' : '') + type.name + (type.args.length ? '<' + type.args.map(typeName).join(', ') + '>' : '');
|
|
4
|
+
/** DWARF describes August source and the real boxed storage. Rich collection
|
|
5
|
+
* views and an August-aware debugger are separate from source-line information. */
|
|
6
|
+
export class DebugMetadata {
|
|
7
|
+
nodes = [];
|
|
8
|
+
files = new Map();
|
|
9
|
+
functions = new Map();
|
|
10
|
+
retained = new Map();
|
|
11
|
+
locations = new Map();
|
|
12
|
+
scopes = new Map();
|
|
13
|
+
variables = new Map();
|
|
14
|
+
types = new Map();
|
|
15
|
+
unit;
|
|
16
|
+
subroutine;
|
|
17
|
+
boxed;
|
|
18
|
+
optimized;
|
|
19
|
+
constructor(ir, optimized) {
|
|
20
|
+
this.optimized = optimized;
|
|
21
|
+
const source = ir.functions.find(fn => fn.name === ir.main);
|
|
22
|
+
// Use LLDB's C type reader for the concrete tagged C-compatible storage.
|
|
23
|
+
// An unregistered vendor language prevents older LLDBs from finding locals.
|
|
24
|
+
// Source paths, names and producer still identify the August program; this
|
|
25
|
+
// does not enable August expression evaluation in the debugger.
|
|
26
|
+
this.unit = this.node(`distinct !DICompileUnit(language: DW_LANG_C99, file: ${this.file(source.span.file)}, producer: "August LLVM", isOptimized: ${optimized}, runtimeVersion: 0, emissionKind: FullDebug)`);
|
|
27
|
+
this.subroutine = this.node(`!DISubroutineType(types: ${this.node('!{}')})`);
|
|
28
|
+
const tag = this.node('!DIBasicType(name: "tag", size: 32, encoding: DW_ATE_unsigned)');
|
|
29
|
+
const integer = this.node('!DIBasicType(name: "int64", size: 64, encoding: DW_ATE_signed)');
|
|
30
|
+
const floating = this.node('!DIBasicType(name: "float64", size: 64, encoding: DW_ATE_float)');
|
|
31
|
+
const pointer = this.node('!DIDerivedType(tag: DW_TAG_pointer_type, baseType: null, size: 64)');
|
|
32
|
+
const payload = this.node(`!DICompositeType(tag: DW_TAG_union_type, name: "August payload", size: 64, align: 64, elements: ${this.node('!{' + [
|
|
33
|
+
this.node(`!DIDerivedType(tag: DW_TAG_member, name: "integer", baseType: ${integer}, size: 64)`),
|
|
34
|
+
this.node(`!DIDerivedType(tag: DW_TAG_member, name: "floating", baseType: ${floating}, size: 64)`),
|
|
35
|
+
this.node(`!DIDerivedType(tag: DW_TAG_member, name: "object", baseType: ${pointer}, size: 64)`)
|
|
36
|
+
].join(', ') + '}')})`);
|
|
37
|
+
this.boxed = this.node(`!DICompositeType(tag: DW_TAG_structure_type, name: "August value", size: 128, align: 64, elements: ${this.node('!{' + [
|
|
38
|
+
this.node(`!DIDerivedType(tag: DW_TAG_member, name: "tag", baseType: ${tag}, size: 32, offset: 0)`),
|
|
39
|
+
this.node(`!DIDerivedType(tag: DW_TAG_member, name: "payload", baseType: ${payload}, size: 64, offset: 64)`)
|
|
40
|
+
].join(', ') + '}')})`);
|
|
41
|
+
}
|
|
42
|
+
node(value) { const name = '!' + this.nodes.length; this.nodes.push(name + ' = ' + value); return name; }
|
|
43
|
+
file(path) { let file = this.files.get(path); if (!file) {
|
|
44
|
+
file = this.node(`!DIFile(filename: ${quote(basename(path))}, directory: ${quote(dirname(path))})`);
|
|
45
|
+
this.files.set(path, file);
|
|
46
|
+
} return file; }
|
|
47
|
+
function(fn) {
|
|
48
|
+
let scope = this.functions.get(fn.name);
|
|
49
|
+
if (!scope) {
|
|
50
|
+
const retained = this.node('!{}');
|
|
51
|
+
this.retained.set(fn.name, { node: retained, variables: [] });
|
|
52
|
+
scope = this.node(`distinct !DISubprogram(name: ${quote(fn.sourceName)}, linkageName: ${quote(fn.name)}, scope: ${this.file(fn.span.file)}, file: ${this.file(fn.span.file)}, line: ${fn.span.line}, type: ${this.subroutine}, scopeLine: ${fn.span.line}, spFlags: DISPFlagDefinition${fn.name === 'main' ? '' : ' | DISPFlagLocalToUnit'}${this.optimized ? ' | DISPFlagOptimized' : ''}, unit: ${this.unit}, retainedNodes: ${retained})`);
|
|
53
|
+
this.functions.set(fn.name, scope);
|
|
54
|
+
}
|
|
55
|
+
return scope;
|
|
56
|
+
}
|
|
57
|
+
scope(fn, name) {
|
|
58
|
+
if (name === undefined)
|
|
59
|
+
return this.function(fn);
|
|
60
|
+
const key = fn.name + ':' + name;
|
|
61
|
+
let result = this.scopes.get(key);
|
|
62
|
+
if (!result) {
|
|
63
|
+
const source = fn.scopes.find(scope => scope.name === name);
|
|
64
|
+
result = this.node(`distinct !DILexicalBlock(scope: ${this.scope(fn, source.parent)}, file: ${this.file(source.span.file)}, line: ${source.span.line}, column: ${source.span.column})`);
|
|
65
|
+
this.scopes.set(key, result);
|
|
66
|
+
}
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
location(fn, span, scopeName) {
|
|
70
|
+
const key = [fn.name, span.file, span.line, span.column, scopeName].join(':');
|
|
71
|
+
let location = this.locations.get(key);
|
|
72
|
+
if (!location) {
|
|
73
|
+
const base = this.scope(fn, scopeName);
|
|
74
|
+
const scope = span.file === fn.span.file ? base : this.node(`!DILexicalBlockFile(scope: ${base}, file: ${this.file(span.file)}, discriminator: 0)`);
|
|
75
|
+
location = this.node(`!DILocation(line: ${Math.max(1, span.line)}, column: ${Math.max(1, span.column)}, scope: ${scope})`);
|
|
76
|
+
this.locations.set(key, location);
|
|
77
|
+
}
|
|
78
|
+
return location;
|
|
79
|
+
}
|
|
80
|
+
variable(fn, variable) {
|
|
81
|
+
const existing = this.variables.get(variable);
|
|
82
|
+
if (existing)
|
|
83
|
+
return existing;
|
|
84
|
+
const key = JSON.stringify(variable.type);
|
|
85
|
+
let type = this.types.get(key);
|
|
86
|
+
if (!type) {
|
|
87
|
+
type = this.node(`!DIDerivedType(tag: DW_TAG_typedef, name: ${quote(typeName(variable.type))}, baseType: ${this.boxed})`);
|
|
88
|
+
this.types.set(key, type);
|
|
89
|
+
}
|
|
90
|
+
const result = this.node(`!DILocalVariable(name: ${quote(variable.name)}, ${variable.argument ? 'arg: ' + variable.argument + ', ' : ''}scope: ${this.scope(fn, variable.scope)}, file: ${this.file(variable.span.file)}, line: ${variable.span.line}, type: ${type})`);
|
|
91
|
+
this.retained.get(fn.name).variables.push(result);
|
|
92
|
+
this.variables.set(variable, result);
|
|
93
|
+
return result;
|
|
94
|
+
}
|
|
95
|
+
generate() {
|
|
96
|
+
for (const entry of this.retained.values())
|
|
97
|
+
this.nodes[Number(entry.node.slice(1))] = entry.node + ' = !{' + entry.variables.join(', ') + '}';
|
|
98
|
+
const dwarf = this.node('!{i32 7, !"Dwarf Version", i32 4}'), debug = this.node('!{i32 2, !"Debug Info Version", i32 3}');
|
|
99
|
+
return [`!llvm.dbg.cu = !{${this.unit}}`, `!llvm.module.flags = !{${dwarf}, ${debug}}`, ...this.nodes].join('\n');
|
|
100
|
+
}
|
|
101
|
+
}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { copyFileSync, existsSync, lstatSync, mkdirSync, readFileSync, realpathSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { basename, dirname, join, resolve } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { spawnSync } from 'node:child_process';
|
|
5
|
+
import { createHash } from 'node:crypto';
|
|
6
|
+
import { generateLLVM, runtimeLayout } from "./llvm.js";
|
|
7
|
+
import { lowerToIR } from "./ir.js";
|
|
8
|
+
import { compilerVersion } from "./package-manager.js";
|
|
9
|
+
import { nativePath, nativeHostTarget } from "./native-contracts.js";
|
|
10
|
+
import { runtimeIdentifierSha256 } from "./runtime-abi.js";
|
|
11
|
+
import { generateOpenApi } from "./openapi.js";
|
|
12
|
+
import { llvmPlatform, systemLibc } from "./llvm-platform.js";
|
|
13
|
+
export function readRuntimePack(directory) {
|
|
14
|
+
if (!existsSync(join(directory, 'runtime.json')))
|
|
15
|
+
throw new Error('LLVM_RUNTIME: A matching prebuilt August runtime is not available. Contributor builds can run node scripts/build-runtime-pack.mjs.');
|
|
16
|
+
const pack = JSON.parse(readFileSync(join(directory, 'runtime.json'), 'utf8'));
|
|
17
|
+
const platform = llvmPlatform();
|
|
18
|
+
if (pack.identifierSha256 !== runtimeIdentifierSha256)
|
|
19
|
+
throw new Error('LLVM_RUNTIME: Runtime operation identifiers differ from this compiler');
|
|
20
|
+
if (!pack || pack.format !== 1 || pack.version !== compilerVersion() || pack.target !== platform.target || pack.minimumOS !== platform.minimumOS || pack.minimumLibc !== platform.minimumLibc || !pack.files || typeof pack.files !== 'object' || Array.isArray(pack.files) || !Array.isArray(pack.libraries) || !pack.libraries.length || !/^([0-9a-f]{64})$/.test(pack.sourceSha256) || JSON.stringify(pack.layout) !== JSON.stringify(runtimeLayout))
|
|
21
|
+
throw new Error('LLVM_RUNTIME: Runtime pack does not match this compiler, layout and target');
|
|
22
|
+
const root = realpathSync(directory);
|
|
23
|
+
for (const [path, expected] of Object.entries(pack.files)) {
|
|
24
|
+
nativePath(path);
|
|
25
|
+
const file = join(root, path);
|
|
26
|
+
if (!/^[0-9a-f]{64}$/.test(expected) || !lstatSync(file).isFile() || !realpathSync(file).startsWith(root + '/'))
|
|
27
|
+
throw new Error('NATIVE_INTEGRITY: Invalid runtime pack member ' + path);
|
|
28
|
+
const actual = createHash('sha256').update(readFileSync(file)).digest('hex');
|
|
29
|
+
if (actual !== expected)
|
|
30
|
+
throw new Error('NATIVE_INTEGRITY: Runtime pack file changed: ' + path);
|
|
31
|
+
}
|
|
32
|
+
for (const path of [...pack.libraries, platform.entry ? 'platform/start.o' : 'platform/libSystem.tbd'])
|
|
33
|
+
if (!pack.files[nativePath(path)])
|
|
34
|
+
throw new Error('LLVM_RUNTIME: Runtime manifest does not identify required file ' + path);
|
|
35
|
+
if (pack.staticCore !== undefined && (typeof pack.staticCore !== 'string' || !pack.staticCore.endsWith('.a') || !pack.files[nativePath(pack.staticCore)]))
|
|
36
|
+
throw new Error('LLVM_RUNTIME: Runtime manifest does not identify its core archive');
|
|
37
|
+
if (!pack.components || typeof pack.components !== 'object' || Array.isArray(pack.components))
|
|
38
|
+
throw new Error('LLVM_RUNTIME: Missing component contracts');
|
|
39
|
+
for (const [name, component] of Object.entries(pack.components)) {
|
|
40
|
+
if (!/^[a-z][a-z0-9-]*$/.test(name) || !component || !Array.isArray(component.libraries) || !component.libraries.length || !Array.isArray(component.runtimeFiles) || !Array.isArray(component.metadata))
|
|
41
|
+
throw new Error('LLVM_RUNTIME: Invalid component ' + name);
|
|
42
|
+
for (const path of [...component.libraries, ...component.runtimeFiles, ...component.metadata])
|
|
43
|
+
if (typeof path !== 'string' || !pack.files[nativePath(path)])
|
|
44
|
+
throw new Error('LLVM_RUNTIME: Missing component file ' + name + ' ' + path);
|
|
45
|
+
}
|
|
46
|
+
return pack;
|
|
47
|
+
}
|
|
48
|
+
/** Link target objects with prebuilt runtimes. Application builds never invoke Clang. */
|
|
49
|
+
export function compileLLVM(checked, options = {}) {
|
|
50
|
+
const root = checked.project.root, target = nativeHostTarget();
|
|
51
|
+
const config = checked.project.config;
|
|
52
|
+
const release = options.release ?? config.optimization === 'release';
|
|
53
|
+
if (config.libraries.length || config.library_paths.length)
|
|
54
|
+
throw new Error('LLVM_LINK_INPUT: LLVM builds require native libraries to be declared by a locked August package. Remove main.yaml libraries/library_paths or use the C reference backend for this local toolchain build.');
|
|
55
|
+
const platform = llvmPlatform(target);
|
|
56
|
+
const compilerRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..');
|
|
57
|
+
const tools = options.toolchain?.tools ?? process.env.AUG_LLVM_HOME, runtime = resolve(options.toolchain?.runtime ?? process.env.AUG_RUNTIME_PACK ?? join(compilerRoot, '.aug-native/llvm/runtime'));
|
|
58
|
+
if (!tools)
|
|
59
|
+
throw new Error('LLVM_TOOLS: Prepare the compiler-owned tool pack before invoking the LLVM compilation API. The CLI installs it automatically.');
|
|
60
|
+
const llc = join(tools, 'bin/llc'), lld = join(tools, 'bin/lld'), opt = join(tools, 'bin/opt'), dsymutil = join(tools, 'bin/dsymutil');
|
|
61
|
+
if (platform.tools.some(tool => !existsSync(join(tools, 'bin', tool))))
|
|
62
|
+
throw new Error('LLVM_TOOLS: The configured tool pack is missing ' + platform.tools.join(', '));
|
|
63
|
+
const pack = readRuntimePack(runtime), ir = lowerToIR(checked, { coverage: options.coverage }), module = generateLLVM(ir, { layout: pack.layout, release, triple: platform.triple });
|
|
64
|
+
const directory = resolve(options.bundle ?? join(root, '.aug-build', ...(options.testIndex === undefined ? [] : ['tests'])));
|
|
65
|
+
mkdirSync(join(directory, 'lib'), { recursive: true });
|
|
66
|
+
const name = options.testIndex === undefined ? 'program' : 'test-' + options.testIndex;
|
|
67
|
+
const source = join(directory, name + '.ll'), object = join(directory, name + '.o');
|
|
68
|
+
const outputName = options.testIndex === undefined ? options.output ?? config.output ?? basename(root) : name;
|
|
69
|
+
const output = resolve(directory, outputName);
|
|
70
|
+
const deployment = join(dirname(output), 'lib');
|
|
71
|
+
mkdirSync(deployment, { recursive: true });
|
|
72
|
+
writeFileSync(source, module);
|
|
73
|
+
writeFileSync(join(directory, name + '.aug-ir.json'), JSON.stringify(ir, null, 2) + '\n');
|
|
74
|
+
if (config.openapi.enabled && options.testIndex === undefined) {
|
|
75
|
+
const target = resolve(root, config.openapi.output);
|
|
76
|
+
mkdirSync(dirname(target), { recursive: true });
|
|
77
|
+
writeFileSync(target, JSON.stringify(generateOpenApi(checked).document, null, 2) + '\n');
|
|
78
|
+
}
|
|
79
|
+
const run = (tool, args) => { const result = spawnSync(tool, args, { encoding: 'utf8', cwd: root, env: { ...process.env, SDKROOT: '/nonexistent', DEVELOPER_DIR: '/nonexistent' } }); if (result.status !== 0)
|
|
80
|
+
throw new Error(`LLVM compilation failed with ${basename(tool)}.\n${result.stderr || result.error?.message || result.stdout}\nLLVM IR: ${source}`); return result; };
|
|
81
|
+
const optimized = join(directory, name + '.optimized.ll');
|
|
82
|
+
run(opt, ['-passes=verify', '-disable-output', source]);
|
|
83
|
+
if (release)
|
|
84
|
+
run(opt, ['-passes=default<O2>', '-S', source, '-o', optimized]);
|
|
85
|
+
run(llc, ['-filetype=obj', release ? '-O=2' : '-O=0', '-relocation-model=pic', release ? optimized : source, '-o', object]);
|
|
86
|
+
const libraries = [], deployed = new Map();
|
|
87
|
+
const deploy = (origin, path, link) => {
|
|
88
|
+
nativePath(path);
|
|
89
|
+
const destination = join(deployment, basename(path));
|
|
90
|
+
const digest = createHash('sha256').update(readFileSync(join(origin, path))).digest('hex');
|
|
91
|
+
if (deployed.has(destination) && deployed.get(destination) !== digest)
|
|
92
|
+
throw new Error('NATIVE_CONFLICT: Different runtime files have the same deployment name ' + basename(path));
|
|
93
|
+
deployed.set(destination, digest);
|
|
94
|
+
copyFileSync(join(origin, path), destination);
|
|
95
|
+
if (link)
|
|
96
|
+
libraries.push(destination);
|
|
97
|
+
};
|
|
98
|
+
const metadata = (origin, namespace, paths) => {
|
|
99
|
+
for (const path of paths) {
|
|
100
|
+
nativePath(path);
|
|
101
|
+
const destination = join(dirname(output), 'share', 'august-native', namespace, path);
|
|
102
|
+
mkdirSync(dirname(destination), { recursive: true });
|
|
103
|
+
copyFileSync(join(origin, path), destination);
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
const staticCore = !ir.components.length && pack.staticCore !== undefined;
|
|
107
|
+
if (staticCore)
|
|
108
|
+
libraries.push(join(runtime, pack.staticCore));
|
|
109
|
+
else
|
|
110
|
+
for (const library of pack.libraries)
|
|
111
|
+
deploy(runtime, library, true);
|
|
112
|
+
for (const name of ir.components) {
|
|
113
|
+
const component = pack.components[name];
|
|
114
|
+
if (!component)
|
|
115
|
+
throw new Error('LLVM_RUNTIME: Compiler pack is missing the ' + name + ' runtime component. Install a matching complete compiler pack.');
|
|
116
|
+
for (const path of component.libraries)
|
|
117
|
+
deploy(runtime, path, true);
|
|
118
|
+
for (const path of component.runtimeFiles)
|
|
119
|
+
deploy(runtime, path, false);
|
|
120
|
+
metadata(runtime, 'runtime-' + pack.sourceSha256, component.metadata);
|
|
121
|
+
}
|
|
122
|
+
metadata(runtime, 'runtime-' + pack.sourceSha256, [...Object.keys(pack.files).filter(path => path.startsWith('licenses/')), 'runtime.json']);
|
|
123
|
+
for (const input of options.native ?? []) {
|
|
124
|
+
for (const library of input.libraries)
|
|
125
|
+
deploy(input.directory, library, true);
|
|
126
|
+
for (const file of input.runtimeFiles)
|
|
127
|
+
if (!input.libraries.includes(file))
|
|
128
|
+
deploy(input.directory, file, false);
|
|
129
|
+
if (input.metadata?.length) {
|
|
130
|
+
if (!/^[0-9a-f]{64}$/.test(input.artifactSha256 ?? ''))
|
|
131
|
+
throw new Error('NATIVE_INTEGRITY: Deployment metadata requires an artifact identity');
|
|
132
|
+
metadata(input.directory, input.artifactSha256, input.metadata);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
if (platform.entry) {
|
|
136
|
+
const libc = systemLibc(platform), math = join(dirname(libc), 'libm.so.6');
|
|
137
|
+
if (staticCore && !existsSync(math))
|
|
138
|
+
throw new Error('LLVM_RUNTIME: The qualified GNU/Linux math runtime is absent. Install the operating system libc runtime; no development headers or compiler are required.');
|
|
139
|
+
// Only the existing private checkpoint-hook boundary needs dynamic lookup.
|
|
140
|
+
// August function exports and native runtime entry remain separate profiles.
|
|
141
|
+
const coreExports = staticCore ? ['--gc-sections', '--export-dynamic-symbol=aug_execution_current', '--export-dynamic-symbol=aug_task_checkpoint_hook'] : [];
|
|
142
|
+
run(lld, ['-flavor', 'gnu', '-pie', '-z', 'now', '-z', 'noexecstack', '--hash-style=gnu', '--eh-frame-hdr', ...coreExports, '--dynamic-linker', platform.loader, '-e', '_start', '-rpath', '$ORIGIN/lib', join(runtime, 'platform/start.o'), object, ...libraries, libc, ...(staticCore ? [math] : []), '-o', output]);
|
|
143
|
+
}
|
|
144
|
+
else
|
|
145
|
+
run(lld, ['-flavor', 'darwin', ...(staticCore ? ['-dead_strip', '-exported_symbol', '_aug_execution_current', '-exported_symbol', '_aug_task_checkpoint_hook'] : []), '-arch', 'arm64', '-platform_version', 'macos', '14.0', '14.0', '-Z', '-fixup_chains', '-adhoc_codesign', '-e', '_main', '-rpath', '@executable_path/lib', object, ...libraries, join(runtime, 'platform/libSystem.tbd'), '-o', output]);
|
|
146
|
+
const debugInfo = platform.entry ? output : output + '.dSYM';
|
|
147
|
+
if (!platform.entry)
|
|
148
|
+
run(dsymutil, [output, '-o', debugInfo]);
|
|
149
|
+
const hash = (file) => createHash('sha256').update(readFileSync(file)).digest('hex');
|
|
150
|
+
writeFileSync(output + '.augmap.json', JSON.stringify({ format: 1, backend: 'llvm', version: compilerVersion(), llvm: '23.1.2', mode: release ? 'release' : 'development', target: pack.target, minimumOS: pack.minimumOS, minimumLibc: pack.minimumLibc, sourceRevision: ir.sourceRevision, llvmIR: source, llvmIRSha256: hash(source), optimizedIRSha256: release ? hash(optimized) : undefined, object, objectSha256: hash(object), executableSha256: hash(output), debugInfo, debugInfoSha256: hash(platform.entry ? output : join(debugInfo, 'Contents/Resources/DWARF', basename(output))), runtime: pack.sourceSha256, compilerArtifact: options.toolchain?.archiveSha256, developmentToolchain: options.toolchain?.developmentOverride ?? true, nativeArtifacts: options.native?.map(input => input.artifactSha256), libraries: [...deployed].map(([file, sha256]) => ({ file: basename(file), sha256 })), symbols: ir.functions.map(f => ({ name: f.name, sourceName: f.sourceName, location: f.span })) }, null, 2) + '\n');
|
|
151
|
+
return { output, status: 0, error: '', diagnostics: [] };
|
|
152
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { nativeHostTarget } from "./native-contracts.js";
|
|
3
|
+
export const llvmPlatforms = [
|
|
4
|
+
{ host: 'darwin-arm64', target: 'aarch64-apple-darwin', triple: 'arm64-apple-macosx14.0.0', artifact: 'macos-arm64', minimumOS: '14.0', tools: ['llc', 'opt', 'lld', 'dsymutil'] },
|
|
5
|
+
{ host: 'linux-x64', target: 'x86_64-unknown-linux-gnu', triple: 'x86_64-unknown-linux-gnu', artifact: 'linux-x64', minimumLibc: '2.36', tools: ['llc', 'opt', 'lld'], entry: 'linux-x64/start.S', loader: '/lib64/ld-linux-x86-64.so.2', libc: ['/lib/x86_64-linux-gnu/libc.so.6', '/usr/lib/x86_64-linux-gnu/libc.so.6'] },
|
|
6
|
+
{ host: 'linux-arm64', target: 'aarch64-unknown-linux-gnu', triple: 'aarch64-unknown-linux-gnu', artifact: 'linux-arm64', minimumLibc: '2.36', tools: ['llc', 'opt', 'lld'], entry: 'linux-arm64/start.S', loader: '/lib/ld-linux-aarch64.so.1', libc: ['/lib/aarch64-linux-gnu/libc.so.6', '/usr/lib/aarch64-linux-gnu/libc.so.6'] }
|
|
7
|
+
];
|
|
8
|
+
const atLeast = (actual, minimum) => !!actual && Number(actual.split('.')[0]) * 1000 + Number(actual.split('.')[1]) >= Number(minimum.split('.')[0]) * 1000 + Number(minimum.split('.')[1]);
|
|
9
|
+
export function llvmPlatform(target = nativeHostTarget()) {
|
|
10
|
+
const platform = llvmPlatforms.find(platform => platform.target === target.triple && platform.host === process.platform + '-' + process.arch);
|
|
11
|
+
if (!platform || platform.minimumOS && !atLeast(target.minimumOS, platform.minimumOS) || platform.minimumLibc && !atLeast(target.minimumLibc, platform.minimumLibc))
|
|
12
|
+
throw new Error('NATIVE_TARGET: LLVM requires macOS 14+ ARM64 or GNU/Linux x86-64/ARM64 with glibc 2.36+. This host is ' + target.triple + ' (' + (target.minimumOS ?? target.minimumLibc ?? target.libc) + '). Cross compilation and musl are not supported.');
|
|
13
|
+
return platform;
|
|
14
|
+
}
|
|
15
|
+
export function systemLibc(platform) {
|
|
16
|
+
const libc = platform.libc?.find(path => existsSync(path));
|
|
17
|
+
if (!libc || !platform.loader || !existsSync(platform.loader))
|
|
18
|
+
throw new Error('LLVM_RUNTIME: The qualified GNU/Linux libc/loader is absent. Use a glibc 2.36+ Debian/Ubuntu runtime. No development headers or compiler are required.');
|
|
19
|
+
return libc;
|
|
20
|
+
}
|