Skip to content

Commit d609273

Browse files
authored
Merge pull request #68 from upstat-io/dev
feat: LLVM 21 upgrade, Unicode escapes, cross-platform AOT, complete COW plan
2 parents d38631d + 8a7d935 commit d609273

144 files changed

Lines changed: 11085 additions & 2193 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.cargo/config.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
# Cargo configuration for Ori
22

33
[env]
4-
# LLVM 17 location for llvm-sys crate
5-
LLVM_SYS_170_PREFIX = "/usr/lib/llvm-17"
4+
# LLVM 21 location for llvm-sys crate
5+
LLVM_SYS_211_PREFIX = "/usr/lib/llvm-21"
66

77
[alias]
88
# Ori language tests
@@ -20,4 +20,4 @@ c = "check --workspace"
2020
b = "build --workspace"
2121
cl = "clippy --workspace --all-targets -- -D warnings"
2222

23-
# LLVM 17 is a default feature of oric. All commands include LLVM.
23+
# LLVM 21 is a default feature of oric. All commands include LLVM.

.github/workflows/ci.yml

Lines changed: 51 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,12 @@ jobs:
4747
steps:
4848
- uses: actions/checkout@v4
4949

50-
- name: Install LLVM 17
50+
- name: Install LLVM 21
5151
run: |
5252
curl -fsSL https://apt.llvm.org/llvm-snapshot.gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/llvm-archive-keyring.gpg
53-
echo "deb [signed-by=/usr/share/keyrings/llvm-archive-keyring.gpg] http://apt.llvm.org/$(lsb_release -cs)/ llvm-toolchain-$(lsb_release -cs)-17 main" | sudo tee /etc/apt/sources.list.d/llvm.list
53+
echo "deb [signed-by=/usr/share/keyrings/llvm-archive-keyring.gpg] http://apt.llvm.org/$(lsb_release -cs)/ llvm-toolchain-$(lsb_release -cs)-21 main" | sudo tee /etc/apt/sources.list.d/llvm.list
5454
sudo apt-get update
55-
sudo apt-get install -y --no-install-recommends llvm-17 llvm-17-dev libpolly-17-dev clang-17 lld-17
55+
sudo apt-get install -y --no-install-recommends llvm-21 llvm-21-dev libpolly-21-dev clang-21 lld-21
5656
env:
5757
DEBIAN_FRONTEND: noninteractive
5858

@@ -64,7 +64,7 @@ jobs:
6464
key: clippy
6565
- run: cargo clippy --workspace --all-targets -- -D warnings
6666
env:
67-
LLVM_SYS_170_PREFIX: /usr/lib/llvm-17
67+
LLVM_SYS_211_PREFIX: /usr/lib/llvm-21
6868

6969
# Main test suite
7070
test:
@@ -75,12 +75,12 @@ jobs:
7575
steps:
7676
- uses: actions/checkout@v4
7777

78-
- name: Install LLVM 17
78+
- name: Install LLVM 21
7979
run: |
8080
curl -fsSL https://apt.llvm.org/llvm-snapshot.gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/llvm-archive-keyring.gpg
81-
echo "deb [signed-by=/usr/share/keyrings/llvm-archive-keyring.gpg] http://apt.llvm.org/$(lsb_release -cs)/ llvm-toolchain-$(lsb_release -cs)-17 main" | sudo tee /etc/apt/sources.list.d/llvm.list
81+
echo "deb [signed-by=/usr/share/keyrings/llvm-archive-keyring.gpg] http://apt.llvm.org/$(lsb_release -cs)/ llvm-toolchain-$(lsb_release -cs)-21 main" | sudo tee /etc/apt/sources.list.d/llvm.list
8282
sudo apt-get update
83-
sudo apt-get install -y --no-install-recommends llvm-17 llvm-17-dev libpolly-17-dev clang-17 lld-17
83+
sudo apt-get install -y --no-install-recommends llvm-21 llvm-21-dev libpolly-21-dev clang-21 lld-21
8484
env:
8585
DEBIAN_FRONTEND: noninteractive
8686

@@ -92,7 +92,7 @@ jobs:
9292
- name: Build
9393
run: cargo build --workspace
9494
env:
95-
LLVM_SYS_170_PREFIX: /usr/lib/llvm-17
95+
LLVM_SYS_211_PREFIX: /usr/lib/llvm-21
9696

9797
- name: Rust unit tests
9898
id: rust-tests
@@ -106,7 +106,7 @@ jobs:
106106
echo "RUST_TESTS=$RUST_TESTS" >> $GITHUB_ENV
107107
echo "RUST_FAILED=$RUST_FAILED" >> $GITHUB_ENV
108108
env:
109-
LLVM_SYS_170_PREFIX: /usr/lib/llvm-17
109+
LLVM_SYS_211_PREFIX: /usr/lib/llvm-21
110110

111111
- name: Ori language tests
112112
id: ori-tests
@@ -120,7 +120,7 @@ jobs:
120120
echo "ORI_TESTS=$ORI_TESTS" >> $GITHUB_ENV
121121
echo "ORI_FAILED=$ORI_FAILED" >> $GITHUB_ENV
122122
env:
123-
LLVM_SYS_170_PREFIX: /usr/lib/llvm-17
123+
LLVM_SYS_211_PREFIX: /usr/lib/llvm-21
124124

125125
- name: Ori runtime tests
126126
id: rt-tests
@@ -191,29 +191,29 @@ jobs:
191191
name: ${{ matrix.os }}
192192
needs: [format, clippy] # Don't waste CI time if basics fail
193193
runs-on: ${{ matrix.os }}
194-
timeout-minutes: 7
194+
timeout-minutes: 12
195195
strategy:
196196
fail-fast: false
197197
matrix:
198198
os: [macos-latest, windows-latest]
199199
steps:
200200
- uses: actions/checkout@v4
201201

202-
- name: Install LLVM 17 (macOS)
202+
- name: Install LLVM 21 (macOS)
203203
if: runner.os == 'macOS'
204204
run: |
205-
brew install llvm@17
206-
echo "LLVM_SYS_170_PREFIX=$(brew --prefix llvm@17)" >> $GITHUB_ENV
205+
brew install llvm@21
206+
echo "LLVM_SYS_211_PREFIX=$(brew --prefix llvm@21)" >> $GITHUB_ENV
207207
208-
- name: Install LLVM 17 (Windows)
208+
- name: Install LLVM 21 (Windows)
209209
if: runner.os == 'Windows'
210210
run: |
211-
$LLVM_URL = "https://github.com/upstat-io/llvm-package-windows/releases/download/v17.0.6/LLVM-17.0.6-win64.7z"
211+
$LLVM_URL = "https://github.com/upstat-io/llvm-package-windows/releases/download/v21.1.8/LLVM-21.1.8-win64.7z"
212212
Write-Host "Downloading LLVM from $LLVM_URL"
213213
curl.exe -fLO $LLVM_URL
214214
Write-Host "Extracting LLVM to C:\LLVM..."
215-
7z x LLVM-17.0.6-win64.7z -oC:\LLVM
216-
echo "LLVM_SYS_170_PREFIX=C:\LLVM" >> $env:GITHUB_ENV
215+
7z x LLVM-21.1.8-win64.7z -oC:\LLVM
216+
echo "LLVM_SYS_211_PREFIX=C:\LLVM" >> $env:GITHUB_ENV
217217
echo "C:\LLVM\bin" >> $env:GITHUB_PATH
218218
219219
- name: Set up MSVC environment (Windows)
@@ -234,6 +234,39 @@ jobs:
234234
- name: Ori language tests
235235
run: cargo run -p oric --bin ori -- test tests/
236236

237+
- name: AOT smoke test (compile + link + run)
238+
continue-on-error: true # macOS ARM64: compiler stack overflow in LLVM codegen (tracked)
239+
shell: bash
240+
run: |
241+
SMOKE_DIR="${RUNNER_TEMP}/aot_smoke"
242+
mkdir -p "$SMOKE_DIR"
243+
244+
# Write a minimal Ori program that exercises string + print (touches ori_rt)
245+
cat > "$SMOKE_DIR/smoke.ori" << 'ORIEOF'
246+
@main () -> void = print(msg: "hello from AOT");
247+
ORIEOF
248+
249+
EXE_SUFFIX=""
250+
if [[ "$RUNNER_OS" == "Windows" ]]; then
251+
EXE_SUFFIX=".exe"
252+
fi
253+
254+
BUILD_ARGS=(build "$SMOKE_DIR/smoke.ori" -o "$SMOKE_DIR/smoke${EXE_SUFFIX}")
255+
256+
# macOS: put Homebrew LLVM on PATH so lld is available
257+
if [[ "$RUNNER_OS" == "macOS" ]]; then
258+
LLVM_BIN="$(brew --prefix llvm@21)/bin"
259+
if [[ -d "$LLVM_BIN" ]]; then
260+
export PATH="$LLVM_BIN:$PATH"
261+
if command -v lld >/dev/null 2>&1; then
262+
BUILD_ARGS+=(--linker=lld)
263+
fi
264+
fi
265+
fi
266+
267+
cargo run -p oric --bin ori -- "${BUILD_ARGS[@]}"
268+
"$SMOKE_DIR/smoke${EXE_SUFFIX}"
269+
237270
# Single status check for branch protection
238271
ci-success:
239272
name: CI Success

.github/workflows/release.yml

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ concurrency:
1212

1313
env:
1414
CARGO_TERM_COLOR: always
15-
LLVM_VERSION: "17"
15+
LLVM_VERSION: "21"
1616

1717
jobs:
1818
validate:
@@ -149,7 +149,7 @@ jobs:
149149
- name: Install LLVM
150150
run: |
151151
brew install llvm@${{ env.LLVM_VERSION }}
152-
echo "LLVM_SYS_170_PREFIX=$(brew --prefix llvm@${{ env.LLVM_VERSION }})" >> $GITHUB_ENV
152+
echo "LLVM_SYS_211_PREFIX=$(brew --prefix llvm@${{ env.LLVM_VERSION }})" >> $GITHUB_ENV
153153
154154
- name: Install Rust
155155
uses: dtolnay/rust-toolchain@stable
@@ -184,7 +184,7 @@ jobs:
184184
timeout-minutes: 60
185185

186186
env:
187-
LLVM_SYS_170_PREFIX: C:\LLVM
187+
LLVM_SYS_211_PREFIX: C:\LLVM
188188

189189
steps:
190190
- uses: actions/checkout@v4
@@ -210,17 +210,17 @@ jobs:
210210
- name: Download LLVM
211211
run: |
212212
# Download our pre-built LLVM with all targets
213-
$LLVM_URL = "https://github.com/upstat-io/llvm-package-windows/releases/download/v17.0.6/LLVM-17.0.6-win64.7z"
213+
$LLVM_URL = "https://github.com/upstat-io/llvm-package-windows/releases/download/v21.1.8/LLVM-21.1.8-win64.7z"
214214
Write-Host "Downloading LLVM from $LLVM_URL"
215215
curl.exe -fLO $LLVM_URL
216216
Write-Host "Extracting LLVM to C:\LLVM..."
217-
7z x LLVM-17.0.6-win64.7z -oC:\LLVM
217+
7z x LLVM-21.1.8-win64.7z -oC:\LLVM
218218
219219
- name: Verify LLVM
220220
run: |
221-
Write-Host "LLVM_SYS_170_PREFIX = $env:LLVM_SYS_170_PREFIX"
222-
& "$env:LLVM_SYS_170_PREFIX\bin\llvm-config.exe" --version
223-
& "$env:LLVM_SYS_170_PREFIX\bin\llvm-config.exe" --targets-built
221+
Write-Host "LLVM_SYS_211_PREFIX = $env:LLVM_SYS_211_PREFIX"
222+
& "$env:LLVM_SYS_211_PREFIX\bin\llvm-config.exe" --version
223+
& "$env:LLVM_SYS_211_PREFIX\bin\llvm-config.exe" --targets-built
224224
225225
- name: Install Rust
226226
uses: dtolnay/rust-toolchain@stable

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ Thumbs.db
4242
# Rust specific
4343
**/*.rs.bk
4444
*.pdb
45+
librust_out.a
46+
rust_out.lib
4547

4648
# Local configuration
4749
.cargo/

Cargo.lock

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ members = [
1818
"compiler/ori_llvm",
1919
"compiler/ori_rt",
2020
]
21-
# All crates including ori_llvm are in default-members; LLVM 17 is required for oric builds.
21+
# All crates including ori_llvm are in default-members; LLVM 21 is required for oric builds.
2222
default-members = [
2323
"compiler/ori_ir",
2424
"compiler/ori_diagnostic",

compiler/ori_arc/src/borrow/mod.rs

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,7 @@ pub(super) fn update_ownership_inner(
377377
my_sig,
378378
local_sigs,
379379
external_sigs,
380+
builtins,
380381
&aliases,
381382
);
382383
}
@@ -417,17 +418,20 @@ pub(super) fn update_ownership_inner(
417418
/// expects an argument as Owned but the corresponding parameter in our
418419
/// function is currently Borrowed, we must promote it to Owned to preserve
419420
/// the tail call optimization.
421+
#[expect(
422+
clippy::too_many_arguments,
423+
reason = "mirrors promote_callee_args context — both need caller + callee scope + builtins"
424+
)]
420425
fn check_tail_call(
421426
block: &crate::ir::ArcBlock,
422427
returned_value: ArcVarId,
423428
func: &ArcFunction,
424429
my_sig: &mut AnnotatedSig,
425430
local_sigs: &FxHashMap<Name, AnnotatedSig>,
426431
external_sigs: &FxHashMap<Name, AnnotatedSig>,
432+
builtins: &BuiltinOwnershipSets,
427433
aliases: &FxHashMap<ArcVarId, ArcVarId>,
428434
) -> bool {
429-
let mut changed = false;
430-
431435
let tail_apply = block
432436
.body
433437
.iter()
@@ -438,18 +442,19 @@ fn check_tail_call(
438442
func: callee, args, ..
439443
}) = tail_apply
440444
{
441-
let callee_sig = local_sigs.get(callee).or_else(|| external_sigs.get(callee));
442-
if let Some(callee_sig) = callee_sig {
443-
for (i, &arg) in args.iter().enumerate() {
444-
if i < callee_sig.params.len() && callee_sig.params[i].ownership == Ownership::Owned
445-
{
446-
changed |= try_mark_param_owned(arg, func, my_sig, aliases);
447-
}
448-
}
449-
}
445+
promote_callee_args(
446+
*callee,
447+
args,
448+
func,
449+
my_sig,
450+
local_sigs,
451+
external_sigs,
452+
builtins,
453+
aliases,
454+
)
455+
} else {
456+
false
450457
}
451-
452-
changed
453458
}
454459

455460
#[cfg(test)]

0 commit comments

Comments
 (0)