Skip to content

Commit f5c2984

Browse files
authored
Merge branch 'master' into dependabot/cargo/thiserror-2.0.11
2 parents c663c8a + b8d81bf commit f5c2984

Some content is hidden

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

56 files changed

+1758
-2164
lines changed

.github/workflows/test.yml

+15-23
Original file line numberDiff line numberDiff line change
@@ -4,32 +4,31 @@ on: [push, pull_request]
44

55
env:
66
CARGO_TERM_COLOR: always
7-
DOC_LLVM_FEATURE: llvm18-0
7+
DOC_LLVM_FEATURE: llvm18-1
88
DOC_LLVM_VERSION: "18.1"
99
DOC_PATH: target/doc
1010

1111
jobs:
12-
typos:
13-
name: Typos
12+
lint:
13+
name: Linting
1414
runs-on: ubuntu-latest
1515
steps:
16+
- name: Checkout Repo
17+
uses: actions/checkout@v4
1618
- name: Install Rust Stable
1719
uses: dtolnay/rust-toolchain@stable
1820
- name: Install typos
1921
uses: taiki-e/install-action@typos
20-
- name: Run typos
22+
- name: Check typos
2123
run: typos .
24+
- name: Check code formatting
25+
run: cargo fmt --check
2226
tests:
2327
name: "LLVM ${{ matrix.llvm-version[0] }}: ${{ matrix.os }}"
2428
runs-on: ${{ matrix.os }}
2529
strategy:
2630
matrix:
2731
llvm-version:
28-
- ["4.0", "4-0"]
29-
- ["5.0", "5-0"]
30-
- ["6.0", "6-0"]
31-
- ["7.0", "7-0"]
32-
- ["7.1", "7-0"]
3332
- ["8.0", "8-0"]
3433
- ["9.0", "9-0"]
3534
- ["10.0", "10-0"]
@@ -40,31 +39,24 @@ jobs:
4039
- ["15.0", "15-0"]
4140
- ["16.0", "16-0"]
4241
- ["17.0", "17-0"]
43-
- ["18.1", "18-0"]
42+
- ["18.1", "18-1"]
4443
include:
45-
- os: ubuntu-20.04
46-
# only use ubuntu-22.04 for llvm 16 and llvm 17
47-
- os: ubuntu-22.04
48-
llvm-version: ["16.0", "16-0"]
4944
- os: ubuntu-22.04
50-
llvm-version: ["17.0", "17-0"]
5145
steps:
5246
- name: Checkout Repo
5347
uses: actions/checkout@v4
48+
- name: Install Dependencies
49+
run: sudo apt update && sudo apt install -y libtinfo5
5450
- name: Install LLVM and Clang (LLVM >= 7.1)
5551
uses: KyleMayes/install-llvm-action@v2
56-
if: ${{ matrix.llvm-version[0] > 7 }}
57-
with:
58-
version: ${{ matrix.llvm-version[0] }}
59-
- name: Install LLVM and Clang (LLVM <= 7)
60-
uses: KyleMayes/install-llvm-action@v1
61-
if: ${{ matrix.llvm-version[0] <= 7 }}
6252
with:
6353
version: ${{ matrix.llvm-version[0] }}
6454
- name: llvm-config
6555
run: llvm-config --version --bindir --libdir
6656
- name: Install Rust Stable
6757
uses: dtolnay/rust-toolchain@stable
58+
- name: cargo clippy
59+
run: cargo clippy --tests --features llvm${{ matrix.llvm-version[1] }} -- -D warnings
6860
- name: Build
6961
run: cargo build --release --features llvm${{ matrix.llvm-version[1] }} --verbose
7062
- name: Run tests
@@ -73,8 +65,8 @@ jobs:
7365
run: cargo build --example kaleidoscope --features llvm${{ matrix.llvm-version[1] }} --verbose
7466
doc:
7567
name: Documentation
76-
runs-on: ubuntu-20.04
77-
needs: [typos, tests]
68+
runs-on: ubuntu-22.04
69+
needs: [lint, tests]
7870
if: github.event_name == 'push' && github.ref == 'refs/heads/master'
7971
steps:
8072
- uses: actions/checkout@v4

Cargo.toml

+28-37
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "inkwell"
3-
version = "0.5.0"
3+
version = "0.6.0"
44
authors = ["Daniel Kolsoi <[email protected]>"]
55
description = "Inkwell aims to help you pen your own programming languages by safely wrapping llvm-sys."
66
documentation = "https://thedan64.github.io/inkwell/"
@@ -13,33 +13,26 @@ edition = "2021"
1313

1414
[features]
1515
default = ["target-all"]
16+
typed-pointers = []
1617

1718
# Please update internal_macros::FEATURE_VERSIONS when adding a new LLVM version
18-
llvm4-0 = ["llvm-sys-40"]
19-
llvm5-0 = ["llvm-sys-50"]
20-
llvm6-0 = ["llvm-sys-60"]
21-
llvm7-0 = ["llvm-sys-70"]
22-
llvm8-0 = ["llvm-sys-80"]
23-
llvm9-0 = ["llvm-sys-90"]
24-
llvm10-0 = ["llvm-sys-100"]
25-
llvm11-0 = ["llvm-sys-110"]
26-
llvm12-0 = ["llvm-sys-120"]
27-
llvm13-0 = ["llvm-sys-130"]
28-
llvm14-0 = ["llvm-sys-140"]
19+
llvm8-0 = ["llvm-sys-80", "typed-pointers"]
20+
llvm9-0 = ["llvm-sys-90", "typed-pointers"]
21+
llvm10-0 = ["llvm-sys-100", "typed-pointers"]
22+
llvm11-0 = ["llvm-sys-110", "typed-pointers"]
23+
llvm12-0 = ["llvm-sys-120", "typed-pointers"]
24+
llvm13-0 = ["llvm-sys-130", "typed-pointers"]
25+
llvm14-0 = ["llvm-sys-140", "typed-pointers"]
2926
llvm15-0 = ["llvm-sys-150"]
3027
llvm16-0 = ["llvm-sys-160"]
3128
llvm17-0 = ["llvm-sys-170"]
32-
llvm18-0 = ["llvm-sys-180"]
29+
llvm18-1 = ["llvm-sys-181"]
3330

3431
# Don't link against LLVM libraries. This is useful if another dependency is
3532
# installing LLVM. See llvm-sys for more details. We can't enable a single
3633
# `no-llvm-linking` feature across the board of llvm versions, as it'll cause
3734
# cargo to try and download and compile them all. See
3835
# https://github.com/rust-lang/cargo/issues/3494
39-
llvm4-0-no-llvm-linking = ["llvm4-0", "llvm-sys-40/no-llvm-linking"]
40-
llvm5-0-no-llvm-linking = ["llvm5-0", "llvm-sys-50/no-llvm-linking"]
41-
llvm6-0-no-llvm-linking = ["llvm6-0", "llvm-sys-60/no-llvm-linking"]
42-
llvm7-0-no-llvm-linking = ["llvm7-0", "llvm-sys-70/no-llvm-linking"]
4336
llvm8-0-no-llvm-linking = ["llvm8-0", "llvm-sys-80/no-llvm-linking"]
4437
llvm9-0-no-llvm-linking = ["llvm9-0", "llvm-sys-90/no-llvm-linking"]
4538
llvm10-0-no-llvm-linking = ["llvm10-0", "llvm-sys-100/no-llvm-linking"]
@@ -50,7 +43,7 @@ llvm14-0-no-llvm-linking = ["llvm14-0", "llvm-sys-140/no-llvm-linking"]
5043
llvm15-0-no-llvm-linking = ["llvm15-0", "llvm-sys-150/no-llvm-linking"]
5144
llvm16-0-no-llvm-linking = ["llvm16-0", "llvm-sys-160/no-llvm-linking"]
5245
llvm17-0-no-llvm-linking = ["llvm17-0", "llvm-sys-170/no-llvm-linking"]
53-
llvm18-0-no-llvm-linking = ["llvm18-0", "llvm-sys-180/no-llvm-linking"]
46+
llvm18-1-no-llvm-linking = ["llvm18-1", "llvm-sys-181/no-llvm-linking"]
5447

5548
# Linking preference.
5649
# If none of these are enabled, it defaults to force static linking.
@@ -62,7 +55,7 @@ llvm14-0-force-dynamic = ["llvm14-0", "llvm-sys-140/force-dynamic"]
6255
llvm15-0-force-dynamic = ["llvm15-0", "llvm-sys-150/force-dynamic"]
6356
llvm16-0-force-dynamic = ["llvm16-0", "llvm-sys-160/force-dynamic"]
6457
llvm17-0-force-dynamic = ["llvm17-0", "llvm-sys-170/force-dynamic"]
65-
llvm18-0-force-dynamic = ["llvm18-0", "llvm-sys-180/force-dynamic"]
58+
llvm18-1-force-dynamic = ["llvm18-1", "llvm-sys-181/force-dynamic"]
6659

6760
# Prefer dynamic linking against LLVM libraries. See llvm-sys for more details
6861
llvm12-0-prefer-dynamic = ["llvm12-0", "llvm-sys-120/prefer-dynamic"]
@@ -71,7 +64,7 @@ llvm14-0-prefer-dynamic = ["llvm14-0", "llvm-sys-140/prefer-dynamic"]
7164
llvm15-0-prefer-dynamic = ["llvm15-0", "llvm-sys-150/prefer-dynamic"]
7265
llvm16-0-prefer-dynamic = ["llvm16-0", "llvm-sys-160/prefer-dynamic"]
7366
llvm17-0-prefer-dynamic = ["llvm17-0", "llvm-sys-170/prefer-dynamic"]
74-
llvm18-0-prefer-dynamic = ["llvm18-0", "llvm-sys-180/prefer-dynamic"]
67+
llvm18-1-prefer-dynamic = ["llvm18-1", "llvm-sys-181/prefer-dynamic"]
7568

7669
# Force static linking against LLVM libraries. See llvm-sys for more details
7770
llvm12-0-force-static = ["llvm12-0", "llvm-sys-120/force-static"]
@@ -80,7 +73,7 @@ llvm14-0-force-static = ["llvm14-0", "llvm-sys-140/force-static"]
8073
llvm15-0-force-static = ["llvm15-0", "llvm-sys-150/force-static"]
8174
llvm16-0-force-static = ["llvm16-0", "llvm-sys-160/force-static"]
8275
llvm17-0-force-static = ["llvm17-0", "llvm-sys-170/force-static"]
83-
llvm18-0-force-static = ["llvm18-0", "llvm-sys-180/force-static"]
76+
llvm18-1-force-static = ["llvm18-1", "llvm-sys-181/force-static"]
8477

8578
# Prefer static linking against LLVM libraries. See llvm-sys for more details
8679
llvm12-0-prefer-static = ["llvm12-0", "llvm-sys-120/prefer-static"]
@@ -89,7 +82,7 @@ llvm14-0-prefer-static = ["llvm14-0", "llvm-sys-140/prefer-static"]
8982
llvm15-0-prefer-static = ["llvm15-0", "llvm-sys-150/prefer-static"]
9083
llvm16-0-prefer-static = ["llvm16-0", "llvm-sys-160/prefer-static"]
9184
llvm17-0-prefer-static = ["llvm17-0", "llvm-sys-170/prefer-static"]
92-
llvm18-0-prefer-static = ["llvm18-0", "llvm-sys-180/prefer-static"]
85+
llvm18-1-prefer-static = ["llvm18-1", "llvm-sys-181/prefer-static"]
9386

9487
# Don't force linking to libffi on non-windows platforms. Without this feature
9588
# inkwell always links to libffi on non-windows platforms.
@@ -135,31 +128,29 @@ experimental = ["static-alloc"]
135128
nightly = ["inkwell_internals/nightly"]
136129

137130
[dependencies]
138-
inkwell_internals = { path = "./internal_macros", version = "0.10.0" }
131+
inkwell_internals = { path = "./internal_macros", version = "0.11.0" }
139132

140-
llvm-sys-40 = { package = "llvm-sys", version = "40.4", optional = true }
141-
llvm-sys-50 = { package = "llvm-sys", version = "50.4", optional = true }
142-
llvm-sys-60 = { package = "llvm-sys", version = "60.6", optional = true }
143-
llvm-sys-70 = { package = "llvm-sys", version = "70.4", optional = true }
144133
llvm-sys-80 = { package = "llvm-sys", version = "80.3", optional = true }
145-
llvm-sys-90 = { package = "llvm-sys", version = "90.2.1", optional = true }
146-
llvm-sys-100 = { package = "llvm-sys", version = "100.2.3", optional = true }
147-
llvm-sys-110 = { package = "llvm-sys", version = "110.0.3", optional = true }
148-
llvm-sys-120 = { package = "llvm-sys", version = "120.2.4", optional = true }
149-
llvm-sys-130 = { package = "llvm-sys", version = "130.0.4", optional = true }
150-
llvm-sys-140 = { package = "llvm-sys", version = "140.0.2", optional = true }
151-
llvm-sys-150 = { package = "llvm-sys", version = "150.0.3", optional = true }
152-
llvm-sys-160 = { package = "llvm-sys", version = "160.1.0", optional = true }
134+
llvm-sys-90 = { package = "llvm-sys", version = "90.2.2", optional = true }
135+
llvm-sys-100 = { package = "llvm-sys", version = "100.2.4", optional = true }
136+
llvm-sys-110 = { package = "llvm-sys", version = "110.0.4", optional = true }
137+
llvm-sys-120 = { package = "llvm-sys", version = "120.3.2", optional = true }
138+
llvm-sys-130 = { package = "llvm-sys", version = "130.1.2", optional = true }
139+
llvm-sys-140 = { package = "llvm-sys", version = "140.1.3", optional = true }
140+
llvm-sys-150 = { package = "llvm-sys", version = "150.2.1", optional = true }
141+
llvm-sys-160 = { package = "llvm-sys", version = "160.2.1", optional = true }
153142
llvm-sys-170 = { package = "llvm-sys", version = "170.2.0", optional = true }
154-
llvm-sys-180 = { package = "llvm-sys", version = "181.2.0", optional = true }
143+
llvm-sys-181 = { package = "llvm-sys", version = "181.2.0", optional = true }
155144

156145
either = "1.5"
157146
libc = "0.2"
158147
once_cell = "1.16"
159148
thiserror = "2.0.11"
160149

161150
static-alloc = { version = "0.2", optional = true }
162-
serde = { version = "1.0", default-features = false, features = ["derive"], optional = true }
151+
serde = { version = "1.0", default-features = false, features = [
152+
"derive",
153+
], optional = true }
163154

164155
[dev-dependencies]
165156
regex = "1"

README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,15 @@ Inkwell aims to help you pen your own programming languages by safely wrapping l
1414
## Requirements
1515

1616
* Rust 1.56+ (Stable, Beta, or Nightly)
17-
* One of LLVM 4-18
17+
* One of LLVM 8-18
1818

1919
## Usage
2020

2121
You'll need to point your Cargo.toml to use a single LLVM version feature flag corresponding to your LLVM version as such:
2222

2323
```toml
2424
[dependencies]
25-
inkwell = { version = "0.5.0", features = ["llvm18-0"] }
25+
inkwell = { version = "0.6.0", features = ["llvm18-1"] }
2626
```
2727

2828
Supported versions:

examples/kaleidoscope/implementation_typed_pointers.rs

+2-4
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@ use inkwell::types::BasicMetadataTypeEnum;
1111
use inkwell::values::{BasicMetadataValueEnum, BasicValueEnum, FloatValue, FunctionValue, PointerValue};
1212
use inkwell::FloatPredicate;
1313

14-
use inkwell_internals::llvm_versions;
15-
1614
use crate::Token::*;
1715

1816
const ANONYMOUS_FUNCTION_NAME: &str = "anonymous";
@@ -856,12 +854,12 @@ impl<'a, 'ctx> Compiler<'a, 'ctx> {
856854
builder.build_alloca(self.context.f64_type(), name).unwrap()
857855
}
858856

859-
#[llvm_versions(..=14)]
857+
#[cfg(feature = "typed-pointers")]
860858
pub fn build_load(&self, ptr: PointerValue<'ctx>, name: &str) -> BasicValueEnum<'ctx> {
861859
self.builder.build_load(ptr, name).unwrap()
862860
}
863861

864-
#[llvm_versions(15..)]
862+
#[cfg(not(feature = "typed-pointers"))]
865863
pub fn build_load(&self, ptr: PointerValue<'ctx>, name: &str) -> BasicValueEnum<'ctx> {
866864
self.builder.build_load(self.context.f64_type(), ptr, name).unwrap()
867865
}

internal_macros/Cargo.toml

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
[package]
22
authors = ["Daniel Kolsoi <[email protected]>"]
33
description = "Internal macro crate for inkwell"
4-
edition = "2021"
4+
edition = "2024"
55
license = "Apache-2.0"
66
name = "inkwell_internals"
77
readme = "README.md"
88
repository = "https://github.com/TheDan64/inkwell"
9-
version = "0.10.0"
9+
version = "0.11.0"
1010

1111
[dependencies]
1212
proc-macro2 = "1.0"

internal_macros/src/cfg.rs

+15-4
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ use syn::{Lit, RangeLimits};
99

1010
// This array should match the LLVM features in the top level Cargo manifest
1111
const FEATURE_VERSIONS: &[&str] = &[
12-
"llvm4-0", "llvm5-0", "llvm6-0", "llvm7-0", "llvm8-0", "llvm9-0", "llvm10-0", "llvm11-0", "llvm12-0", "llvm13-0",
13-
"llvm14-0", "llvm15-0", "llvm16-0", "llvm17-0", "llvm18-0",
12+
"llvm8-0", "llvm9-0", "llvm10-0", "llvm11-0", "llvm12-0", "llvm13-0", "llvm14-0", "llvm15-0", "llvm16-0",
13+
"llvm17-0", "llvm18-1",
1414
];
1515

1616
pub struct VersionRange {
@@ -111,11 +111,22 @@ struct Version {
111111
span: Span,
112112
}
113113

114+
fn default_minor(major: u32) -> u32 {
115+
if major >= 18 {
116+
1
117+
} else {
118+
0
119+
}
120+
}
121+
114122
impl Parse for Version {
115123
fn parse(input: ParseStream) -> Result<Self> {
116124
let lit = input.parse::<Lit>()?;
117125
let (major, minor) = match &lit {
118-
Lit::Int(int) => (int.base10_parse()?, 0),
126+
Lit::Int(int) => {
127+
let major = int.base10_parse()?;
128+
(major, default_minor(major))
129+
},
119130
Lit::Float(float) => {
120131
let s = float.base10_digits();
121132
let mut parts = s.split('.');
@@ -127,7 +138,7 @@ impl Parse for Version {
127138
let minor = if let Some(minor) = parts.next() {
128139
minor.parse().map_err(|e| syn::Error::new(float.span(), e))?
129140
} else {
130-
0
141+
default_minor(major)
131142
};
132143
(major, minor)
133144
},

src/attributes.rs

+2
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ impl PartialEq<Self> for Attribute {
7373
}
7474

7575
if self.is_type() && other.is_type() {
76+
// Seems to be some clippy bug here, but it's not clear why.
77+
#[allow(clippy::unit_cmp)]
7678
return self.get_enum_kind_id() == other.get_enum_kind_id()
7779
&& self.get_type_value() == other.get_type_value();
7880
}

src/basic_block.rs

+10-15
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use llvm_sys::core::{
55
LLVMGetBasicBlockTerminator, LLVMGetFirstInstruction, LLVMGetFirstUse, LLVMGetLastInstruction,
66
LLVMGetNextBasicBlock, LLVMGetPreviousBasicBlock, LLVMGetTypeContext, LLVMIsABasicBlock, LLVMIsConstant,
77
LLVMMoveBasicBlockAfter, LLVMMoveBasicBlockBefore, LLVMPrintTypeToString, LLVMPrintValueToString,
8-
LLVMRemoveBasicBlockFromParent, LLVMReplaceAllUsesWith, LLVMTypeOf,
8+
LLVMRemoveBasicBlockFromParent, LLVMReplaceAllUsesWith, LLVMSetValueName2, LLVMTypeOf,
99
};
1010
use llvm_sys::prelude::{LLVMBasicBlockRef, LLVMValueRef};
1111

@@ -288,9 +288,9 @@ impl<'ctx> BasicBlock<'ctx> {
288288
///
289289
/// let void_type = context.void_type();
290290
/// let i32_type = context.i32_type();
291-
/// #[cfg(not(any(feature = "llvm15-0", feature = "llvm16-0", feature = "llvm17-0", feature = "llvm18-0")))]
291+
/// #[cfg(feature = "typed-pointers")]
292292
/// let i32_ptr_type = i32_type.ptr_type(AddressSpace::default());
293-
/// #[cfg(any(feature = "llvm15-0", feature = "llvm16-0", feature = "llvm17-0", feature = "llvm18-0"))]
293+
/// #[cfg(not(feature = "typed-pointers"))]
294294
/// let i32_ptr_type = context.ptr_type(AddressSpace::default());
295295
///
296296
/// let fn_type = void_type.fn_type(&[i32_ptr_type.into()], false);
@@ -471,18 +471,13 @@ impl<'ctx> BasicBlock<'ctx> {
471471
pub fn set_name(&self, name: &str) {
472472
let c_string = to_c_str(name);
473473

474-
#[cfg(any(feature = "llvm4-0", feature = "llvm5-0", feature = "llvm6-0"))]
475-
{
476-
use llvm_sys::core::LLVMSetValueName;
477-
478-
unsafe { LLVMSetValueName(LLVMBasicBlockAsValue(self.basic_block), c_string.as_ptr()) };
479-
}
480-
#[cfg(not(any(feature = "llvm4-0", feature = "llvm5-0", feature = "llvm6-0")))]
481-
{
482-
use llvm_sys::core::LLVMSetValueName2;
483-
484-
unsafe { LLVMSetValueName2(LLVMBasicBlockAsValue(self.basic_block), c_string.as_ptr(), c_string.to_bytes().len()) };
485-
}
474+
unsafe {
475+
LLVMSetValueName2(
476+
LLVMBasicBlockAsValue(self.basic_block),
477+
c_string.as_ptr(),
478+
c_string.to_bytes().len(),
479+
)
480+
};
486481
}
487482

488483
/// Replaces all uses of this basic block with another.

0 commit comments

Comments
 (0)