rust-lang / rust-lang/rust-bindgen

Unable to prevent Clang headers from being used

Open
#2,842 9 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Rust
Stars
5.3k
Forks
829
Avg merge
1d 1h
Merged PRs (30d)
15

Description

All versions of LLVM 18 have a bug where the __prefetch intrinsic has the wrong definition. This bug was fixed in https://github.com/llvm/llvm-project/pull/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

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the build.rs reproduction and input.h, then trace how bindgen passes the listed clang arguments, especially -fno-builtin and -fno-builtin-__prefetch. Reproduce the aarch64-pc-windows-msvc failure and verify that the same invocation generates bindings successfully without the conflicting __prefetch definition.

Written by the indexing model from the issue text.

Assessment

Tech stack
rust
Domain
devtools
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.