Open
Description
All versions of LLVM 18 have a bug where the __prefetch
intrinsic has the wrong definition. This bug was fixed in llvm/llvm-project#93235, but will not be released until LLVM 19 comes out.
When bindgen
invokes clang
to parse the headers, it looks like clang
is actually using its bugged intrin.h
which brings in the invalid signature for __prefetch
. This leads to the failure to generate bindings for any header that pulls in msvc's intrin.h
on aarch64
. I attempted to use clang
's -fno-builtin
arg to prevent bindgen
from pulling in the wrong definition of __prefetch
, but it seems to not have any effect here.
Bindgen Invocation
use std::env;
use std::path::PathBuf;
fn main() {
let bindings = bindgen::Builder::default()
.header_contents(
"input.h",
r#"
void __prefetch(const void *);"#,
)
.parse_callbacks(Box::new(bindgen::CargoCallbacks::new()))
.clang_args([
"-fms-compatibility",
"-fms-extensions",
"-fdelayed-template-parsing",
"-fno-builtin", // attempt to prevent intrin.h from clang from being used (not working)
"-fno-builtin-__prefetch" // another not working attempt
])
.generate()
.expect("Unable to generate bindings");
let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
bindings
.write_to_file(out_path.join("bindings.rs"))
.expect("Couldn't write bindings!");
}
Actual Results
cargo build --target aarch64-pc-windows-msvc
Compiling bindgen-test v0.1.0 (D:\git-repos\bindgen-test)
error: failed to run custom build command for `bindgen-test v0.1.0 (D:\git-repos\bindgen-test)`
Caused by:
process didn't exit successfully: `D:\git-repos\bindgen-test\target\debug\build\bindgen-test-28575ca189a67a38\build-script-build` (exit code: 101)
--- stdout
cargo:rerun-if-env-changed=TARGET
cargo:rerun-if-env-changed=BINDGEN_EXTRA_CLANG_ARGS_aarch64-pc-windows-msvc
cargo:rerun-if-env-changed=BINDGEN_EXTRA_CLANG_ARGS_aarch64_pc_windows_msvc
cargo:rerun-if-env-changed=BINDGEN_EXTRA_CLANG_ARGS
--- stderr
D:\git-repos\bindgen-test\input.h:2:6: error: conflicting types for '__prefetch'
D:\git-repos\bindgen-test\input.h:2:6: note: '__prefetch' is a builtin with type 'void (void *)'
thread 'main' panicked at build.rs:23:10:
Unable to generate bindings: ClangDiagnostic("D:\\git-repos\\bindgen-test\\input.h:2:6: error: conflicting types for '__prefetch'\n")
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
Expected Results
Should compile sucessfully
Activity
workingjubilee commentedon Jul 6, 2024
why is clang not issuing a patch release?
workingjubilee commentedon Jul 6, 2024
ah.
pvdrz commentedon Jul 17, 2024
@workingjubilee @wmmc88 is there something we can do from
bindgen
's side to mitigate this?wmmc88 commentedon Jul 17, 2024
Is it possible for bindgen to provide a way to prevent the use of clang's builtin headers (i.e.
__prefetch.h
)?pvdrz commentedon Sep 7, 2024
it depends, if you can filter it using
allowlist_file
or any other allowlist method maybe we can do something about it.