From 161c0a534b344a48ee3482fd8e2a5494cd3ec3e5 Mon Sep 17 00:00:00 2001 From: Jorge Ortega Date: Sat, 5 Apr 2025 16:03:31 -0700 Subject: [PATCH 1/2] fix(cust_raw): Use string macro expansion to record function renames `cl.exe` macro expansion does not do any token validation when using token pasting (##), but `cc` does validate token pasting results in a valid token. This change switches from token pasting to stringify (#), which expands all the macro function variables as strings. Rename lines now expand to `"RUST_RENAME" "_someDefine" "expandedFuncName"`. This prevents `cc` from erroring during expanding in cases where the expanded macro would have resulted in an invalid token, i.e: `RUST_RENAME_someDefine_(not_valid)` which is invalid because the `(` is not a valid token character. --- crates/cust_raw/build/callbacks.rs | 19 ++++++++++++++----- ...{cublaslt_wrapper.h => cublasLt_wrapper.h} | 0 ...{cublasxt_wrapper.h => cublasXt_wrapper.h} | 0 crates/cust_raw/src/cublaslt_sys.rs | 2 +- crates/cust_raw/src/cublasxt_sys.rs | 2 +- 5 files changed, 16 insertions(+), 7 deletions(-) rename crates/cust_raw/build/{cublaslt_wrapper.h => cublasLt_wrapper.h} (100%) rename crates/cust_raw/build/{cublasxt_wrapper.h => cublasXt_wrapper.h} (100%) diff --git a/crates/cust_raw/build/callbacks.rs b/crates/cust_raw/build/callbacks.rs index a15e4366..07d32d13 100644 --- a/crates/cust_raw/build/callbacks.rs +++ b/crates/cust_raw/build/callbacks.rs @@ -3,7 +3,6 @@ use std::fs; use std::path; use std::sync; -use bimap; use bindgen::callbacks::{ItemInfo, ItemKind, MacroParsingBehavior, ParseCallbacks}; /// Struct to handle renaming of functions through macro expansion. @@ -40,18 +39,24 @@ impl FunctionRenames { fn expand(&self) -> &bimap::BiHashMap { self.func_remaps.get_or_init(|| { + if self.macro_names.borrow().is_empty() { + return bimap::BiHashMap::new(); + } + let expand_me = self.out_dir.join("expand_macros.c"); let includes = fs::read_to_string(&self.includes) .expect("Failed to read includes for function renames"); let mut template = format!( r#"{includes} -#define RENAMED2(from, to) RUST_RENAMED##from##_TO_##to -#define RENAMED(from, to) RENAMED2(from, to) +#define STRINGIFY(x) #x +#define TOSTRING(x) STRINGIFY(x) +#define RENAMED(from, to) "RUST_RENAMED" TOSTRING(from) TOSTRING(to) "# ); for name in self.macro_names.borrow().iter() { + // Add an underscore to the left so that it won't get expanded. template.push_str(&format!("RENAMED(_{name}, {name})\n")); } @@ -74,11 +79,15 @@ impl FunctionRenames { let mut remaps = bimap::BiHashMap::new(); for line in expanded.lines().rev() { - let rename_prefix = "RUST_RENAMED_"; + let rename_prefix = "\"RUST_RENAMED\" "; if let Some((original, expanded)) = line .strip_prefix(rename_prefix) - .and_then(|s| s.split_once("_TO_")) + .map(|s| s.replace("\"", "")) + .and_then(|s| { + s.split_once(' ') + .map(|(l, r)| (l[1..].to_string(), r.to_string())) + }) .filter(|(l, r)| l != r && !r.is_empty()) { remaps.insert(original.to_string(), expanded.to_string()); diff --git a/crates/cust_raw/build/cublaslt_wrapper.h b/crates/cust_raw/build/cublasLt_wrapper.h similarity index 100% rename from crates/cust_raw/build/cublaslt_wrapper.h rename to crates/cust_raw/build/cublasLt_wrapper.h diff --git a/crates/cust_raw/build/cublasxt_wrapper.h b/crates/cust_raw/build/cublasXt_wrapper.h similarity index 100% rename from crates/cust_raw/build/cublasxt_wrapper.h rename to crates/cust_raw/build/cublasXt_wrapper.h diff --git a/crates/cust_raw/src/cublaslt_sys.rs b/crates/cust_raw/src/cublaslt_sys.rs index 6347ffbd..c806b3b7 100644 --- a/crates/cust_raw/src/cublaslt_sys.rs +++ b/crates/cust_raw/src/cublaslt_sys.rs @@ -2,4 +2,4 @@ #![allow(non_camel_case_types)] #![allow(non_snake_case)] -include!(concat!(env!("OUT_DIR"), "/cublaslt_sys.rs")); +include!(concat!(env!("OUT_DIR"), "/cublasLt_sys.rs")); diff --git a/crates/cust_raw/src/cublasxt_sys.rs b/crates/cust_raw/src/cublasxt_sys.rs index db2b81c6..c4d934dc 100644 --- a/crates/cust_raw/src/cublasxt_sys.rs +++ b/crates/cust_raw/src/cublasxt_sys.rs @@ -2,4 +2,4 @@ #![allow(non_camel_case_types)] #![allow(non_snake_case)] -include!(concat!(env!("OUT_DIR"), "/cublasxt_sys.rs")); +include!(concat!(env!("OUT_DIR"), "/cublasXt_sys.rs")); From a625051c34f405734f8d48e870119714c340e5c9 Mon Sep 17 00:00:00 2001 From: Jorge Ortega Date: Sat, 5 Apr 2025 16:03:31 -0700 Subject: [PATCH 2/2] chore(ci): Add a step to build all features of `cust_raw` This adds a step to build all features of `cust_raw` to validate all the bindings it generates can build successfully. --- .github/workflows/ci_linux.yml | 2 ++ .github/workflows/rust.yml | 3 +++ 2 files changed, 5 insertions(+) diff --git a/.github/workflows/ci_linux.yml b/.github/workflows/ci_linux.yml index 3e47d6ad..02ed59ba 100644 --- a/.github/workflows/ci_linux.yml +++ b/.github/workflows/ci_linux.yml @@ -45,6 +45,8 @@ jobs: env: RUSTFLAGS: -Dwarnings run: cargo clippy --workspace --exclude "optix*" --exclude "path_tracer" --exclude "denoiser" --exclude "ex*" --exclude "cudnn*" + - name: Build all bindings + run: cargo build --all-features -p cust_raw - name: Build run: cargo build --workspace --exclude "optix*" --exclude "path_tracer" --exclude "denoiser" --exclude "ex*" --exclude "cudnn*" - name: Check documentation diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 6397509d..c1eee7a7 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -62,6 +62,9 @@ jobs: with: key: ${{ matrix.os }}-${{ matrix.target }}-${{ matrix.cuda }} + - name: Build all bindings + run: cargo build --all-features -p cust_raw + - name: Build run: cargo build --workspace --exclude "optix*" --exclude "path_tracer" --exclude "denoiser" --exclude "add" --exclude "ex*" --exclude "cudnn*"