Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 5 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,14 +73,15 @@ If the binary is named `openvaf` it comes from the `branches/osdi_0.3` branch an

## LLVM Version Support

OpenVAF-reloaded supports multiple LLVM versions from 18 to 21. You can choose which version to use at build time via Cargo features:
OpenVAF-reloaded supports multiple LLVM versions from 18 to 22. You can choose which version to use at build time via Cargo features:

| Feature | LLVM Version | Environment Variable | llvm-sys crate |
|---------|--------------|----------------------|----------------|
| `llvm18` | LLVM 18.1.x | `LLVM_SYS_181_PREFIX` | 181.2.0 |
| `llvm19` | LLVM 19.1.x | `LLVM_SYS_191_PREFIX` | 191.0.0 |
| `llvm20` | LLVM 20.1.x | `LLVM_SYS_201_PREFIX` | 201.0.1 |
| `llvm21` | LLVM 21.1.x | `LLVM_SYS_211_PREFIX` | 211.0.0 |
| `llvm22` | LLVM 22.1.x | `LLVM_SYS_221_PREFIX` | 221.0.1 |

**Note:** There is no default LLVM version. You must specify the version explicitly using `--features llvmXX` or use the `./configure` script for auto-detection (see Building section).

Expand Down Expand Up @@ -174,10 +175,10 @@ export LLVM_SYS_181_PREFIX=$(brew --prefix llvm@18)
export PATH="$(brew --prefix llvm@18)/bin:$PATH"
```

### Using LLVM 21 (latest)
### Using LLVM 22 (latest)
```bash
brew install llvm
export LLVM_SYS_211_PREFIX=$(brew --prefix llvm)
export LLVM_SYS_221_PREFIX=$(brew --prefix llvm)
export PATH="$(brew --prefix llvm)/bin:$PATH"
```

Expand Down Expand Up @@ -206,7 +207,7 @@ The easiest way to build is using the configure script which auto-detects your L

The configure script will:
1. Search for LLVM installations (via environment variables, PATH, or Homebrew on macOS)
2. Select the newest available version (21 > 20 > 19 > 18)
2. Select the newest available version (22 > 21 > 20 > 19 > 18)
3. Save the configuration to `.llvm-version`

You can also force a specific version:
Expand Down
1 change: 1 addition & 0 deletions build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ case "$LLVM_VERSION" in
19) export LLVM_SYS_191_PREFIX="$LLVM_PREFIX" ;;
20) export LLVM_SYS_201_PREFIX="$LLVM_PREFIX" ;;
21) export LLVM_SYS_211_PREFIX="$LLVM_PREFIX" ;;
22) export LLVM_SYS_221_PREFIX="$LLVM_PREFIX" ;;
esac

# Add LLVM to PATH if needed
Expand Down
13 changes: 8 additions & 5 deletions configure
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ Usage: $0 [OPTIONS]
Auto-detect LLVM version and configure the build.

Options:
--llvm=VERSION Force specific LLVM version (18, 19, 20, or 21)
--llvm=VERSION Force specific LLVM version (18, 19, 20, 21, or 22)
--help Show this help message

After running configure, use ./build.sh to build with auto-detected settings,
Expand All @@ -32,6 +32,7 @@ Environment variables:
LLVM_SYS_191_PREFIX Path to LLVM 19 installation
LLVM_SYS_201_PREFIX Path to LLVM 20 installation
LLVM_SYS_211_PREFIX Path to LLVM 21 installation
LLVM_SYS_221_PREFIX Path to LLVM 22 installation

Examples:
./configure # Auto-detect
Expand Down Expand Up @@ -67,6 +68,7 @@ check_llvm_version() {
19) env_var="LLVM_SYS_191_PREFIX" ;;
20) env_var="LLVM_SYS_201_PREFIX" ;;
21) env_var="LLVM_SYS_211_PREFIX" ;;
22) env_var="LLVM_SYS_221_PREFIX" ;;
*) return 1 ;;
esac

Expand Down Expand Up @@ -124,6 +126,7 @@ get_llvm_prefix() {
19) env_var="LLVM_SYS_191_PREFIX" ;;
20) env_var="LLVM_SYS_201_PREFIX" ;;
21) env_var="LLVM_SYS_211_PREFIX" ;;
22) env_var="LLVM_SYS_221_PREFIX" ;;
*) return 1 ;;
esac

Expand Down Expand Up @@ -181,7 +184,7 @@ get_llvm_prefix() {

# Detect available LLVM versions (prefer newer)
detect_llvm() {
for ver in 21 20 19 18; do
for ver in 22 21 20 19 18; do
if check_llvm_version "$ver" >/dev/null 2>&1; then
echo "$ver"
return 0
Expand All @@ -193,12 +196,12 @@ detect_llvm() {
# Main logic
if [ -n "$FORCE_VERSION" ]; then
case "$FORCE_VERSION" in
18|19|20|21)
18|19|20|21|22)
LLVM_VERSION="$FORCE_VERSION"
;;
*)
echo "Error: Invalid LLVM version '$FORCE_VERSION'"
echo "Supported versions: 18, 19, 20, 21"
echo "Supported versions: 18, 19, 20, 21, 22"
exit 1
;;
esac
Expand All @@ -208,7 +211,7 @@ else
echo ""
echo "Error: No supported LLVM version found."
echo ""
echo "Please install LLVM 18, 19, 20, or 21 and either:"
echo "Please install LLVM 18, 19, 20, 21, or 22 and either:"
echo " 1. Add llvm-config to your PATH"
echo " 2. Set LLVM_SYS_XXX_PREFIX environment variable"
echo ""
Expand Down
5 changes: 3 additions & 2 deletions openvaf/linker/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,10 @@ use cc::windows_registry;
use target::spec::{LinkerFlavor, Target};

/// Get the LLVM prefix from environment variables.
/// Checks in order: LLVM 21.1, 20.1, 19.1, 18.1 (newest first).
/// Checks in order: LLVM 22.1, 21.1, 20.1, 19.1, 18.1 (newest first).
fn get_llvm_prefix() -> Option<String> {
env::var("LLVM_SYS_211_PREFIX")
env::var("LLVM_SYS_221_PREFIX")
.or_else(|_| env::var("LLVM_SYS_211_PREFIX"))
.or_else(|_| env::var("LLVM_SYS_201_PREFIX"))
.or_else(|_| env::var("LLVM_SYS_191_PREFIX"))
.or_else(|_| env::var("LLVM_SYS_181_PREFIX"))
Expand Down
4 changes: 3 additions & 1 deletion openvaf/mir_llvm/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,19 @@ license = "GPL-3.0"
doctest = false

[features]
# No default - user must specify --features llvm18/llvm19/llvm20/llvm21
# No default - user must specify --features llvm18/llvm19/llvm20/llvm21/llvm22
llvm18 = ["dep:llvm-sys-181"]
llvm19 = ["dep:llvm-sys-191"]
llvm20 = ["dep:llvm-sys-201"]
llvm21 = ["dep:llvm-sys-211"]
llvm22 = ["dep:llvm-sys-221"]

[dependencies]
llvm-sys-181 = { package = "llvm-sys", version = "181.2.0", features = ["prefer-dynamic"], optional = true }
llvm-sys-191 = { package = "llvm-sys", version = "191.0.0", features = ["prefer-dynamic"], optional = true }
llvm-sys-201 = { package = "llvm-sys", version = "201.0.1", features = ["prefer-dynamic"], optional = true }
llvm-sys-211 = { package = "llvm-sys", version = "211.0.0", features = ["prefer-dynamic"], optional = true }
llvm-sys-221 = { package = "llvm-sys", version = "221.0.1", features = ["prefer-dynamic"], optional = true }
#target-lexicon = "0.12"
mir = { version = "0.0.0", path = "../mir" }
target = { version = "0.0.0", path = "../target" }
Expand Down
2 changes: 1 addition & 1 deletion openvaf/mir_llvm/src/context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ impl<'a, 'll> CodegenCx<'a, 'll> {
0,
)
};
#[cfg(any(feature = "llvm19", feature = "llvm20", feature = "llvm21"))]
#[cfg(any(feature = "llvm19", feature = "llvm20", feature = "llvm21", feature = "llvm22"))]
let val = unsafe {
llvm_sys::core::LLVMConstStringInContext2(
NonNull::from(self.llcx).as_ptr(),
Expand Down
2 changes: 2 additions & 0 deletions openvaf/mir_llvm/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ extern crate llvm_sys_191 as llvm_sys;
extern crate llvm_sys_201 as llvm_sys;
#[cfg(feature = "llvm21")]
extern crate llvm_sys_211 as llvm_sys;
#[cfg(feature = "llvm22")]
extern crate llvm_sys_221 as llvm_sys;

use std::error::Error;
use std::ffi::{CStr, CString};
Expand Down
3 changes: 2 additions & 1 deletion openvaf/openvaf-driver/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,12 @@ doctest = false
test = false

[features]
# No default - user must specify --features llvm18/llvm19/llvm20/llvm21
# No default - user must specify --features llvm18/llvm19/llvm20/llvm21/llvm22
llvm18 = ["openvaf/llvm18"]
llvm19 = ["openvaf/llvm19"]
llvm20 = ["openvaf/llvm20"]
llvm21 = ["openvaf/llvm21"]
llvm22 = ["openvaf/llvm22"]

[dependencies]

Expand Down
2 changes: 2 additions & 0 deletions openvaf/openvaf/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ llvm18 = ["dep:llvm-sys-181", "mir_llvm/llvm18", "osdi/llvm18"]
llvm19 = ["dep:llvm-sys-191", "mir_llvm/llvm19", "osdi/llvm19"]
llvm20 = ["dep:llvm-sys-201", "mir_llvm/llvm20", "osdi/llvm20"]
llvm21 = ["dep:llvm-sys-211", "mir_llvm/llvm21", "osdi/llvm21"]
llvm22 = ["dep:llvm-sys-221", "mir_llvm/llvm22", "osdi/llvm22"]

[dependencies]

Expand All @@ -27,6 +28,7 @@ llvm-sys-181 = { package = "llvm-sys", version = "181.2.0", optional = true }
llvm-sys-191 = { package = "llvm-sys", version = "191.0.0", optional = true }
llvm-sys-201 = { package = "llvm-sys", version = "201.0.1", optional = true }
llvm-sys-211 = { package = "llvm-sys", version = "211.0.0", optional = true }
llvm-sys-221 = { package = "llvm-sys", version = "221.0.1", optional = true }
mir_llvm = { version = "0.0.0", path = "../mir_llvm", default-features = false }
hir = { version = "0.0.0", path = "../hir" }
target = { version = "0.0.0", path = "../target" }
Expand Down
2 changes: 2 additions & 0 deletions openvaf/openvaf/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ extern crate llvm_sys_191 as llvm_sys;
extern crate llvm_sys_201 as llvm_sys;
#[cfg(feature = "llvm21")]
extern crate llvm_sys_211 as llvm_sys;
#[cfg(feature = "llvm22")]
extern crate llvm_sys_221 as llvm_sys;

use std::fs::{create_dir_all, remove_file};
use std::io::Write;
Expand Down
4 changes: 3 additions & 1 deletion openvaf/osdi/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,12 @@ license = "GPL-3.0"
doctest = false

[features]
# No default - user must specify --features llvm18/llvm19/llvm20/llvm21
# No default - user must specify --features llvm18/llvm19/llvm20/llvm21/llvm22
llvm18 = ["dep:llvm-sys-181", "mir_llvm/llvm18"]
llvm19 = ["dep:llvm-sys-191", "mir_llvm/llvm19"]
llvm20 = ["dep:llvm-sys-201", "mir_llvm/llvm20"]
llvm21 = ["dep:llvm-sys-211", "mir_llvm/llvm21"]
llvm22 = ["dep:llvm-sys-221", "mir_llvm/llvm22"]

[dependencies]

Expand All @@ -35,6 +36,7 @@ llvm-sys-181 = { package = "llvm-sys", version = "181.2.0", optional = true }
llvm-sys-191 = { package = "llvm-sys", version = "191.0.0", optional = true }
llvm-sys-201 = { package = "llvm-sys", version = "201.0.1", optional = true }
llvm-sys-211 = { package = "llvm-sys", version = "211.0.0", optional = true }
llvm-sys-221 = { package = "llvm-sys", version = "221.0.1", optional = true }
target = { version = "0.0.0", path = "../target"}

typed-index-collections = "3.1"
Expand Down
3 changes: 2 additions & 1 deletion openvaf/osdi/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ fn main() {

// Use clang from LLVM prefix environment variables (check newest first)
// Fall back to Homebrew LLVM on macOS, then system clang
let clang_path = tracked_env_var_os("LLVM_SYS_211_PREFIX")
let clang_path = tracked_env_var_os("LLVM_SYS_221_PREFIX")
.or_else(|| tracked_env_var_os("LLVM_SYS_211_PREFIX"))
.or_else(|| tracked_env_var_os("LLVM_SYS_201_PREFIX"))
.or_else(|| tracked_env_var_os("LLVM_SYS_191_PREFIX"))
.or_else(|| tracked_env_var_os("LLVM_SYS_181_PREFIX"))
Expand Down
2 changes: 2 additions & 0 deletions openvaf/osdi/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ extern crate llvm_sys_191 as llvm_sys;
extern crate llvm_sys_201 as llvm_sys;
#[cfg(feature = "llvm21")]
extern crate llvm_sys_211 as llvm_sys;
#[cfg(feature = "llvm22")]
extern crate llvm_sys_221 as llvm_sys;

use std::collections::HashMap;
use std::ffi::CString;
Expand Down
2 changes: 2 additions & 0 deletions verilogae/verilogae/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ llvm18 = ["dep:llvm-sys-181", "mir_llvm/llvm18"]
llvm19 = ["dep:llvm-sys-191", "mir_llvm/llvm19"]
llvm20 = ["dep:llvm-sys-201", "mir_llvm/llvm20"]
llvm21 = ["dep:llvm-sys-211", "mir_llvm/llvm21"]
llvm22 = ["dep:llvm-sys-221", "mir_llvm/llvm22"]

[dependencies]

Expand All @@ -34,6 +35,7 @@ llvm-sys-181 = { package = "llvm-sys", version = "181.2.0", optional = true }
llvm-sys-191 = { package = "llvm-sys", version = "191.0.0", optional = true }
llvm-sys-201 = { package = "llvm-sys", version = "201.0.1", optional = true }
llvm-sys-211 = { package = "llvm-sys", version = "211.0.0", optional = true }
llvm-sys-221 = { package = "llvm-sys", version = "221.0.1", optional = true }
target = { version = "0.0.0", path = "../../openvaf/target" }
linker = { version = "0.0.0", path = "../../openvaf/linker" }

Expand Down
2 changes: 2 additions & 0 deletions verilogae/verilogae/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ extern crate llvm_sys_191 as llvm_sys;
extern crate llvm_sys_201 as llvm_sys;
#[cfg(feature = "llvm21")]
extern crate llvm_sys_211 as llvm_sys;
#[cfg(feature = "llvm22")]
extern crate llvm_sys_221 as llvm_sys;

use std::fs;
use std::io::Write;
Expand Down
3 changes: 2 additions & 1 deletion verilogae/verilogae_ffi/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,10 @@ verilogae = { version = "1.0.0", path = "../verilogae", optional = true, default

[features]
default = ["static"]
# No default LLVM - user must specify --features llvm18/llvm19/llvm20/llvm21
# No default LLVM - user must specify --features llvm18/llvm19/llvm20/llvm21/llvm22
static = ["verilogae"]
llvm18 = ["verilogae?/llvm18"]
llvm19 = ["verilogae?/llvm19"]
llvm20 = ["verilogae?/llvm20"]
llvm21 = ["verilogae?/llvm21"]
llvm22 = ["verilogae?/llvm22"]
3 changes: 2 additions & 1 deletion verilogae/verilogae_py/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,10 @@ pyo3-build-config = { version = "0.19", features = ["resolve-config"] }
[features]

default = ["static"]
# No default LLVM - user must specify --features llvm18/llvm19/llvm20/llvm21
# No default LLVM - user must specify --features llvm18/llvm19/llvm20/llvm21/llvm22
static = ["verilogae_ffi/static"]
llvm18 = ["verilogae_ffi/llvm18"]
llvm19 = ["verilogae_ffi/llvm19"]
llvm20 = ["verilogae_ffi/llvm20"]
llvm21 = ["verilogae_ffi/llvm21"]
llvm22 = ["verilogae_ffi/llvm22"]