€•œdŒsphinx.addnodes”Œdocument”“”)”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)”}”(hhh]”(hŒ pending_xref”“”)”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…””}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ,/translations/zh_CN/rust/general-information”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)”}”(hhh]”hŒChinese (Traditional)”…””}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ,/translations/zh_TW/rust/general-information”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ,/translations/it_IT/rust/general-information”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ,/translations/ja_JP/rust/general-information”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ,/translations/ko_KR/rust/general-information”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒPortuguese (Brazilian)”…””}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ,/translations/pt_BR/rust/general-information”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒSpanish”…””}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ,/translations/sp_SP/rust/general-information”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒcomment”“”)”}”(hŒ SPDX-License-Identifier: GPL-2.0”h]”hŒ SPDX-License-Identifier: GPL-2.0”…””}”hh·sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1hµhhh²hh³ŒF/var/lib/git/docbuild/linux/Documentation/rust/general-information.rst”h´KubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒGeneral Information”h]”hŒGeneral Information”…””}”(hhÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhhÊh²hh³hÇh´KubhŒ paragraph”“”)”}”(hŒcThis document contains useful information to know when working with the Rust support in the kernel.”h]”hŒcThis document contains useful information to know when working with the Rust support in the kernel.”…””}”(hhßh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KhhÊh²hubhÉ)”}”(hhh]”(hÎ)”}”(hŒ ``no_std``”h]”hŒliteral”“”)”}”(hhòh]”hŒno_std”…””}”(hhöh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhhðubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhhíh²hh³hÇh´K ubhÞ)”}”(hŒåThe Rust support in the kernel can link only `core `_, but not `std `_. Crates for use in the kernel must opt into this behavior using the ``#![no_std]`` attribute.”h]”(hŒ-The Rust support in the kernel can link only ”…””}”(hj h²hh³Nh´NubhŒ reference”“”)”}”(hŒ)`core `_”h]”hŒcore”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œcore”Œrefuri”Œhttps://doc.rust-lang.org/core/”uh1jhj ubhŒtarget”“”)”}”(hŒ" ”h]”h}”(h]”Œcore”ah ]”h"]”Œcore”ah$]”h&]”Œrefuri”j$uh1j%Œ referenced”Khj ubhŒ , but not ”…””}”(hj h²hh³Nh´Nubj)”}”(hŒ'`std `_”h]”hŒstd”…””}”(hj9h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œstd”j#Œhttps://doc.rust-lang.org/std/”uh1jhj ubj&)”}”(hŒ! ”h]”h}”(h]”Œstd”ah ]”h"]”Œstd”ah$]”h&]”Œrefuri”jIuh1j%j4Khj ubhŒE. Crates for use in the kernel must opt into this behavior using the ”…””}”(hj h²hh³Nh´Nubhõ)”}”(hŒ``#![no_std]``”h]”hŒ #![no_std]”…””}”(hj[h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhj ubhŒ attribute.”…””}”(hj h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K hhíh²hubj&)”}”(hŒ.. _rust_code_documentation:”h]”h}”(h]”h ]”h"]”h$]”h&]”Œrefid”Œrust-code-documentation”uh1j%h´Khhíh²hh³hÇubeh}”(h]”Œno-std”ah ]”h"]”Œno_std”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K ubhÉ)”}”(hhh]”(hÎ)”}”(hŒCode documentation”h]”hŒCode documentation”…””}”(hjŠh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj‡h²hh³hÇh´KubhÞ)”}”(hŒWRust kernel code is documented using ``rustdoc``, its built-in documentation generator.”h]”(hŒ%Rust kernel code is documented using ”…””}”(hj˜h²hh³Nh´Nubhõ)”}”(hŒ ``rustdoc``”h]”hŒrustdoc”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhj˜ubhŒ', its built-in documentation generator.”…””}”(hj˜h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khj‡h²hubhÞ)”}”(hŒŠThe generated HTML docs include integrated search, linked items (e.g. types, functions, constants), source code, etc. They may be read at:”h]”hŒŠThe generated HTML docs include integrated search, linked items (e.g. types, functions, constants), source code, etc. They may be read at:”…””}”(hj¸h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khj‡h²hubhŒ block_quote”“”)”}”(hŒhttps://rust.docs.kernel.org ”h]”hÞ)”}”(hŒhttps://rust.docs.kernel.org”h]”j)”}”(hjÎh]”hŒhttps://rust.docs.kernel.org”…””}”(hjÐh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jÎuh1jhjÌubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KhjÈubah}”(h]”h ]”h"]”h$]”h&]”uh1jÆh³hÇh´Khj‡h²hubhÞ)”}”(hŒFor linux-next, please see:”h]”hŒFor linux-next, please see:”…””}”(hjêh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khj‡h²hubjÇ)”}”(hŒ#https://rust.docs.kernel.org/next/ ”h]”hÞ)”}”(hŒ"https://rust.docs.kernel.org/next/”h]”j)”}”(hjþh]”hŒ"https://rust.docs.kernel.org/next/”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jþuh1jhjüubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K!hjøubah}”(h]”h ]”h"]”h$]”h&]”uh1jÆh³hÇh´K!hj‡h²hubhÞ)”}”(hŒ0There are also tags for each main release, e.g.:”h]”hŒ0There are also tags for each main release, e.g.:”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K#hj‡h²hubjÇ)”}”(hŒ#https://rust.docs.kernel.org/6.10/ ”h]”hÞ)”}”(hŒ"https://rust.docs.kernel.org/6.10/”h]”j)”}”(hj.h]”hŒ"https://rust.docs.kernel.org/6.10/”…””}”(hj0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”j.uh1jhj,ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K%hj(ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÆh³hÇh´K%hj‡h²hubhÞ)”}”(hXlThe docs can also be easily generated and read locally. This is quite fast (same order as compiling the code itself) and no special tools or environment are needed. This has the added advantage that they will be tailored to the particular kernel configuration used. To generate them, use the ``rustdoc`` target with the same invocation used for compilation, e.g.::”h]”(hX$The docs can also be easily generated and read locally. This is quite fast (same order as compiling the code itself) and no special tools or environment are needed. This has the added advantage that they will be tailored to the particular kernel configuration used. To generate them, use the ”…””}”(hjJh²hh³Nh´Nubhõ)”}”(hŒ ``rustdoc``”h]”hŒrustdoc”…””}”(hjRh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhjJubhŒ< target with the same invocation used for compilation, e.g.:”…””}”(hjJh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K'hj‡h²hubhŒ literal_block”“”)”}”(hŒmake LLVM=1 rustdoc”h]”hŒmake LLVM=1 rustdoc”…””}”hjlsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jjh³hÇh´K-hj‡h²hubhÞ)”}”(hŒ8To read the docs locally in your web browser, run e.g.::”h]”hŒ7To read the docs locally in your web browser, run e.g.:”…””}”(hjzh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K/hj‡h²hubjk)”}”(hŒ from the C side and calls its functions through the bindings.”…””}”(hjWh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KLhj*h²hubhÞ)”}”(hX Abstractions are not available for all the kernel internal APIs and concepts, but it is intended that coverage is expanded as time goes on. "Leaf" modules (e.g. drivers) should not use the C bindings directly. Instead, subsystems should provide as-safe-as-possible abstractions as needed.”h]”hX$Abstractions are not available for all the kernel internal APIs and concepts, but it is intended that coverage is expanded as time goes on. “Leaf†modules (e.g. drivers) should not use the C bindings directly. Instead, subsystems should provide as-safe-as-possible abstractions as needed.”…””}”(hj‰h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KOhj*h²hubjk)”}”(hX§ rust/bindings/ (rust/helpers/) include/ -----+ <-+ | | drivers/ rust/kernel/ +----------+ <-+ | fs/ | bindgen | | .../ +-------------------+ +----------+ --+ | | Abstractions | | | +---------+ | +------+ +------+ | +----------+ | | | my_foo | -----> | | foo | | bar | | -------> | Bindings | <-+ | | driver | Safe | | sub- | | sub- | | Unsafe | | | +---------+ | |system| |system| | | bindings | <-----+ | | +------+ +------+ | | crate | | | | kernel crate | +----------+ | | +-------------------+ | | | +------------------# FORBIDDEN #--------------------------------+”h]”hX§ rust/bindings/ (rust/helpers/) include/ -----+ <-+ | | drivers/ rust/kernel/ +----------+ <-+ | fs/ | bindgen | | .../ +-------------------+ +----------+ --+ | | Abstractions | | | +---------+ | +------+ +------+ | +----------+ | | | my_foo | -----> | | foo | | bar | | -------> | Bindings | <-+ | | driver | Safe | | sub- | | sub- | | Unsafe | | | +---------+ | |system| |system| | | bindings | <-----+ | | +------+ +------+ | | crate | | | | kernel crate | +----------+ | | +-------------------+ | | | +------------------# FORBIDDEN #--------------------------------+”…””}”hj—sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆŒforce”‰Œlanguage”Œnone”Œhighlight_args”}”uh1jjh³hÇh´KThj*h²hubhÞ)”}”(hŒÚThe main idea is to encapsulate all direct interaction with the kernel's C APIs into carefully reviewed and documented abstractions. Then users of these abstractions cannot introduce undefined behavior (UB) as long as:”h]”hŒÜThe main idea is to encapsulate all direct interaction with the kernel’s C APIs into carefully reviewed and documented abstractions. Then users of these abstractions cannot introduce undefined behavior (UB) as long as:”…””}”(hjªh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kihj*h²hubhŒenumerated_list”“”)”}”(hhh]”(hŒ list_item”“”)”}”(hŒ'The abstractions are correct ("sound").”h]”hÞ)”}”(hjÁh]”hŒ+The abstractions are correct (“soundâ€).”…””}”(hjÃh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kmhj¿ubah}”(h]”h ]”h"]”h$]”h&]”uh1j½hjºh²hh³hÇh´Nubj¾)”}”(hŒÅAny ``unsafe`` blocks respect the safety contract necessary to call the operations inside the block. Similarly, any ``unsafe impl``\ s respect the safety contract necessary to implement the trait. ”h]”hÞ)”}”(hŒÄAny ``unsafe`` blocks respect the safety contract necessary to call the operations inside the block. Similarly, any ``unsafe impl``\ s respect the safety contract necessary to implement the trait.”h]”(hŒAny ”…””}”(hjÚh²hh³Nh´Nubhõ)”}”(hŒ ``unsafe``”h]”hŒunsafe”…””}”(hjâh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhjÚubhŒf blocks respect the safety contract necessary to call the operations inside the block. Similarly, any ”…””}”(hjÚh²hh³Nh´Nubhõ)”}”(hŒ``unsafe impl``”h]”hŒ unsafe impl”…””}”(hjôh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhjÚubhŒA s respect the safety contract necessary to implement the trait.”…””}”(hjÚh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KnhjÖubah}”(h]”h ]”h"]”h$]”h&]”uh1j½hjºh²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”Œenumtype”Œarabic”Œprefix”hŒsuffix”Œ.”uh1j¸hj*h²hh³hÇh´KmubhÉ)”}”(hhh]”(hÎ)”}”(hŒBindings”h]”hŒBindings”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjh²hh³hÇh´KsubhÞ)”}”(hXBy including a C header from ``include/`` into ``rust/bindings/bindings_helper.h``, the ``bindgen`` tool will auto-generate the bindings for the included subsystem. After building, see the ``*_generated.rs`` output files in the ``rust/bindings/`` directory.”h]”(hŒBy including a C header from ”…””}”(hj.h²hh³Nh´Nubhõ)”}”(hŒ ``include/``”h]”hŒinclude/”…””}”(hj6h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhj.ubhŒ into ”…””}”(hj.h²hh³Nh´Nubhõ)”}”(hŒ#``rust/bindings/bindings_helper.h``”h]”hŒrust/bindings/bindings_helper.h”…””}”(hjHh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhj.ubhŒ, the ”…””}”(hj.h²hh³Nh´Nubhõ)”}”(hŒ ``bindgen``”h]”hŒbindgen”…””}”(hjZh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhj.ubhŒZ tool will auto-generate the bindings for the included subsystem. After building, see the ”…””}”(hj.h²hh³Nh´Nubhõ)”}”(hŒ``*_generated.rs``”h]”hŒ*_generated.rs”…””}”(hjlh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhj.ubhŒ output files in the ”…””}”(hj.h²hh³Nh´Nubhõ)”}”(hŒ``rust/bindings/``”h]”hŒrust/bindings/”…””}”(hj~h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhj.ubhŒ directory.”…””}”(hj.h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kuhjh²hubhÞ)”}”(hŒëFor parts of the C header that ``bindgen`` does not auto generate, e.g. C ``inline`` functions or non-trivial macros, it is acceptable to add a small wrapper function to ``rust/helpers/`` to make it available for the Rust side as well.”h]”(hŒFor parts of the C header that ”…””}”(hj–h²hh³Nh´Nubhõ)”}”(hŒ ``bindgen``”h]”hŒbindgen”…””}”(hjžh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhj–ubhŒ does not auto generate, e.g. C ”…””}”(hj–h²hh³Nh´Nubhõ)”}”(hŒ ``inline``”h]”hŒinline”…””}”(hj°h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhj–ubhŒV functions or non-trivial macros, it is acceptable to add a small wrapper function to ”…””}”(hj–h²hh³Nh´Nubhõ)”}”(hŒ``rust/helpers/``”h]”hŒ rust/helpers/”…””}”(hjÂh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhj–ubhŒ0 to make it available for the Rust side as well.”…””}”(hj–h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kzhjh²hubeh}”(h]”Œbindings”ah ]”h"]”Œbindings”ah$]”h&]”uh1hÈhj*h²hh³hÇh´KsubhÉ)”}”(hhh]”(hÎ)”}”(hŒ Abstractions”h]”hŒ Abstractions”…””}”(hjåh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjâh²hh³hÇh´K€ubhÞ)”}”(hXHAbstractions are the layer between the bindings and the in-kernel users. They are located in ``rust/kernel/`` and their role is to encapsulate the unsafe access to the bindings into an as-safe-as-possible API that they expose to their users. Users of the abstractions include things like drivers or file systems written in Rust.”h]”(hŒ]Abstractions are the layer between the bindings and the in-kernel users. They are located in ”…””}”(hjóh²hh³Nh´Nubhõ)”}”(hŒ``rust/kernel/``”h]”hŒ rust/kernel/”…””}”(hjûh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhjóubhŒÛ and their role is to encapsulate the unsafe access to the bindings into an as-safe-as-possible API that they expose to their users. Users of the abstractions include things like drivers or file systems written in Rust.”…””}”(hjóh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K‚hjâh²hubhÞ)”}”(hX1Besides the safety aspect, the abstractions are supposed to be "ergonomic", in the sense that they turn the C interfaces into "idiomatic" Rust code. Basic examples are to turn the C resource acquisition and release into Rust constructors and destructors or C integer error codes into Rust's ``Result``\ s.”h]”(hX-Besides the safety aspect, the abstractions are supposed to be “ergonomicâ€, in the sense that they turn the C interfaces into “idiomatic†Rust code. Basic examples are to turn the C resource acquisition and release into Rust constructors and destructors or C integer error codes into Rust’s ”…””}”(hjh²hh³Nh´Nubhõ)”}”(hŒ ``Result``”h]”hŒResult”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhjubhŒ s.”…””}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kˆhjâh²hubeh}”(h]”Œ abstractions”ah ]”h"]”Œ abstractions”ah$]”h&]”uh1hÈhj*h²hh³hÇh´K€ubeh}”(h]”Œabstractions-vs-bindings”ah ]”h"]”Œabstractions vs. bindings”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KDubhÉ)”}”(hhh]”(hÎ)”}”(hŒConditional compilation”h]”hŒConditional compilation”…””}”(hjFh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjCh²hh³hÇh´KubhÞ)”}”(hŒRRust code has access to conditional compilation based on the kernel configuration:”h]”hŒRRust code has access to conditional compilation based on the kernel configuration:”…””}”(hjTh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K‘hjCh²hubjk)”}”(hŒË#[cfg(CONFIG_X)] // Enabled (`y` or `m`) #[cfg(CONFIG_X="y")] // Enabled as a built-in (`y`) #[cfg(CONFIG_X="m")] // Enabled as a module (`m`) #[cfg(not(CONFIG_X))] // Disabled”h]”hŒË#[cfg(CONFIG_X)] // Enabled (`y` or `m`) #[cfg(CONFIG_X="y")] // Enabled as a built-in (`y`) #[cfg(CONFIG_X="m")] // Enabled as a module (`m`) #[cfg(not(CONFIG_X))] // Disabled”…””}”hjbsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj¥‰j¦Œrust”j¨}”uh1jjh³hÇh´K”hjCh²hubhÞ)”}”(hŒŒFor other predicates that Rust's ``cfg`` does not support, e.g. expressions with numerical comparisons, one may define a new Kconfig symbol:”h]”(hŒ#For other predicates that Rust’s ”…””}”(hjrh²hh³Nh´Nubhõ)”}”(hŒ``cfg``”h]”hŒcfg”…””}”(hjzh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hôhjrubhŒd does not support, e.g. expressions with numerical comparisons, one may define a new Kconfig symbol:”…””}”(hjrh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K›hjCh²hubjk)”}”(hŒCconfig RUSTC_HAS_SPAN_FILE def_bool RUSTC_VERSION >= 108800”h]”hŒCconfig RUSTC_HAS_SPAN_FILE def_bool RUSTC_VERSION >= 108800”…””}”hj’sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj¥‰j¦Œkconfig”j¨}”uh1jjh³hÇh´KžhjCh²hubeh}”(h]”Œconditional-compilation”ah ]”h"]”Œconditional compilation”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´Kubeh}”(h]”Œgeneral-information”ah ]”h"]”Œgeneral information”ah$]”h&]”uh1hÈhhh²hh³hÇh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÇuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)”}”(hÍNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”jÕŒerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÇŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”j~]”jsasŒnameids”}”(j¯j¬j„jj0j-jSjPjªj~j©j¦j'j$j@j=jßjÜj8j5j§j¤uŒ nametypes”}”(j¯‰j„‰j0ˆjSˆjªˆj©‰j'‰j@‰j߉j8‰j§‰uh}”(j¬hÊjhíj-j'jPjJj~j‡j¦j‡j$j±j=j*jÜjj5jâj¤jCuŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”hŒsystem_message”“”)”}”(hhh]”hÞ)”}”(hhh]”hŒ=Hyperlink target "rust-code-documentation" is not referenced.”…””}”hj?sbah}”(h]”h ]”h"]”h$]”h&]”uh1hÝhj<ubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”ŒINFO”Œsource”hÇŒline”Kuh1j:ubaŒ transformer”NŒ include_log”]”Œ decoration”Nh²hub.