Skip to content

rust: Proper bindgen sources for BTF debug builds #835

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jul 23, 2022

Conversation

YakoYakoYokuYoku
Copy link

I was testing a BTF debug info build while using a patched pahole that supports excluding Rust. I've noticed that Clang 14 introduced support for the btf_type_tag attribute, resulting BTF_TYPE_TAG(value) to be expanded as so.
This is all cool and dandy, but watch what happens when bindgen is fed with functions that contains attributed const pointers (like const char __user *), bindgen discards its constness, causing that some sources that expect the param to be const failing in their compilation.
For example the write field in file_operations has a const pointer, a vtable in rust/kernel/file.rs based on said struct also uses a const pointer, but if bindgen fails to generate a proper binding it results in the failure of the compilation of the kernel crate.

See this Zulip thread for context.

@ojeda
Copy link
Member

ojeda commented Jul 23, 2022

What about calling it __BINDGEN__ to make it closer to __CHECKER__, __GNUC__, __clang__, etc.?

@ojeda
Copy link
Member

ojeda commented Jul 23, 2022

Yeah, I can reproduce the bindgen issue, opening an issue...

As Clang 14 supports the btf_type_tag attribute and building with
PAHOLE_HAS_BTF_TAG defines BTF_TYPE_TAG(value) to be
__attribute__((btf_type_tag(#value))). Because of this bindgen might get
confused and discards constness of attributed function parameters that
are indeed const pointers (like const char __user * -> char *).

This patch fixes that by passing a BINDGEN_RUN definition to bindgen
that causes BTF_TYPE_TAG(value) to be defined as nothing, thus
generating proper definitions for functions like write in the
file_operations struct.

Signed-off-by: Martin Rodriguez Reboredo <[email protected]>
@YakoYakoYokuYoku
Copy link
Author

What about calling it __BINDGEN__ to make it closer to __CHECKER__, __GNUC__, __clang__, etc.?

That was an habit from working with Shiboken, but yeah, __BINDGEN__ sounds more accurate.

@ojeda
Copy link
Member

ojeda commented Jul 23, 2022

Cc @yonghong-song who introduced it

@ojeda ojeda merged commit fcb1a09 into Rust-for-Linux:rust Jul 23, 2022
@ojeda
Copy link
Member

ojeda commented Jul 23, 2022

Thanks @YakoYakoYokuYoku!

@YakoYakoYokuYoku
Copy link
Author

YakoYakoYokuYoku commented Jul 23, 2022

You are welcome and thanks for merging too.

@YakoYakoYokuYoku YakoYakoYokuYoku deleted the btf-attr-bindgen branch July 23, 2022 21:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

Successfully merging this pull request may close these issues.

2 participants