Skip to content

rust: Proper bindgen sources for BTF debug builds - #835

Merged
ojeda merged 1 commit into
Rust-for-Linux:rustfrom
YakoYakoYokuYoku:btf-attr-bindgen
Jul 23, 2022
Merged

ojeda merged 1 commit into
Rust-for-Linux:rustfrom
YakoYakoYokuYoku:btf-attr-bindgen

Conversation

@YakoYakoYokuYoku

Copy link
Copy Markdown

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

ojeda commented Jul 23, 2022

Copy link
Copy Markdown
Member

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

@ojeda

ojeda commented Jul 23, 2022

Copy link
Copy Markdown
Member

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 <yakoyoku@gmail.com>
@YakoYakoYokuYoku

Copy link
Copy Markdown
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

ojeda commented Jul 23, 2022

Copy link
Copy Markdown
Member

Cc @yonghong-song who introduced it

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

ojeda commented Jul 23, 2022

Copy link
Copy Markdown
Member

Thanks @YakoYakoYokuYoku!

@YakoYakoYokuYoku

YakoYakoYokuYoku commented Jul 23, 2022 •

Copy link
Copy Markdown
Author

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