€•çSŒ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/kbuild/gcc-plugins”Œ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/kbuild/gcc-plugins”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ&/translations/it_IT/kbuild/gcc-plugins”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ&/translations/ja_JP/kbuild/gcc-plugins”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ&/translations/ko_KR/kbuild/gcc-plugins”Œ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/kbuild/gcc-plugins”Œ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/kbuild/gcc-plugins”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒGCC plugin infrastructure”h]”hŒGCC plugin infrastructure”…””}”(hh¼h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhh·h²hh³Œ@/var/lib/git/docbuild/linux/Documentation/kbuild/gcc-plugins.rst”h´Kubh¶)”}”(hhh]”(h»)”}”(hŒ Introduction”h]”hŒ Introduction”…””}”(hhÎh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhhËh²hh³hÊh´KubhŒ paragraph”“”)”}”(hXGCC plugins are loadable modules that provide extra features to the compiler [1]_. They are useful for runtime instrumentation and static analysis. We can analyse, change and add further code during compilation via callbacks [2]_, GIMPLE [3]_, IPA [4]_ and RTL passes [5]_.”h]”(hŒMGCC plugins are loadable modules that provide extra features to the compiler ”…””}”(hhÞh²hh³Nh´NubhŒfootnote_reference”“”)”}”(hŒ[1]_”h]”hŒ1”…””}”(hhèh²hh³Nh´Nubah}”(h]”Œid1”ah ]”h"]”h$]”h&]”Œrefid”Œid8”Œdocname”Œkbuild/gcc-plugins”uh1hæhhÞŒresolved”KubhŒ. They are useful for runtime instrumentation and static analysis. We can analyse, change and add further code during compilation via callbacks ”…””}”(hhÞh²hh³Nh´Nubhç)”}”(hŒ[2]_”h]”hŒ2”…””}”(hjh²hh³Nh´Nubah}”(h]”Œid2”ah ]”h"]”h$]”h&]”h÷Œid9”hùhúuh1hæhhÞhûKubhŒ , GIMPLE ”…””}”(hhÞh²hh³Nh´Nubhç)”}”(hŒ[3]_”h]”hŒ3”…””}”(hjh²hh³Nh´Nubah}”(h]”Œid3”ah ]”h"]”h$]”h&]”h÷Œid10”hùhúuh1hæhhÞhûKubhŒ, IPA ”…””}”(hhÞh²hh³Nh´Nubhç)”}”(hŒ[4]_”h]”hŒ4”…””}”(hj(h²hh³Nh´Nubah}”(h]”Œid4”ah ]”h"]”h$]”h&]”h÷Œid11”hùhúuh1hæhhÞhûKubhŒ and RTL passes ”…””}”(hhÞh²hh³Nh´Nubhç)”}”(hŒ[5]_”h]”hŒ5”…””}”(hj<h²hh³Nh´Nubah}”(h]”Œid5”ah ]”h"]”h$]”h&]”h÷Œid12”hùhúuh1hæhhÞhûKubhŒ.”…””}”(hhÞh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K hhËh²hubhÝ)”}”(hŒÇThe GCC plugin infrastructure of the kernel supports building out-of-tree modules, cross-compilation and building in a separate directory. Plugin source files have to be compilable by a C++ compiler.”h]”hŒÇThe GCC plugin infrastructure of the kernel supports building out-of-tree modules, cross-compilation and building in a separate directory. Plugin source files have to be compilable by a C++ compiler.”…””}”(hjVh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KhhËh²hubhÝ)”}”(hŒCurrently the GCC plugin infrastructure supports only some architectures. Grep "select HAVE_GCC_PLUGINS" to find out which architectures support GCC plugins.”h]”hŒ¡Currently the GCC plugin infrastructure supports only some architectures. Grep “select HAVE_GCC_PLUGINS†to find out which architectures support GCC plugins.”…””}”(hjdh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KhhËh²hubhÝ)”}”(hŒAThis infrastructure was ported from grsecurity [6]_ and PaX [7]_.”h]”(hŒ/This infrastructure was ported from grsecurity ”…””}”(hjrh²hh³Nh´Nubhç)”}”(hŒ[6]_”h]”hŒ6”…””}”(hjzh²hh³Nh´Nubah}”(h]”Œid6”ah ]”h"]”h$]”h&]”h÷Œid13”hùhúuh1hæhjrhûKubhŒ and PaX ”…””}”(hjrh²hh³Nh´Nubhç)”}”(hŒ[7]_”h]”hŒ7”…””}”(hjŽh²hh³Nh´Nubah}”(h]”Œid7”ah ]”h"]”h$]”h&]”h÷Œid14”hùhúuh1hæhjrhûKubhŒ.”…””}”(hjrh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KhhËh²hubhÝ)”}”(hŒ--”h]”hŒ--”…””}”(hj¨h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KhhËh²hubhŒfootnote”“”)”}”(hŒ2https://gcc.gnu.org/onlinedocs/gccint/Plugins.html”h]”(hŒlabel”“”)”}”(hŒ1”h]”hŒ1”…””}”(hj¾h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼hj¸ubhÝ)”}”(hjºh]”hŒ reference”“”)”}”(hjºh]”hŒ2https://gcc.gnu.org/onlinedocs/gccint/Plugins.html”…””}”(hjÑh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jºuh1jÏhjÌubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Khj¸ubeh}”(h]”høah ]”h"]”Œ1”ah$]”h&]”hòahùhúuh1j¶h³hÊh´KhhËh²hhûKubj·)”}”(hŒ@https://gcc.gnu.org/onlinedocs/gccint/Plugin-API.html#Plugin-API”h]”(j½)”}”(hŒ2”h]”hŒ2”…””}”(hjðh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼hjìubhÝ)”}”(hjîh]”jÐ)”}”(hjîh]”hŒ@https://gcc.gnu.org/onlinedocs/gccint/Plugin-API.html#Plugin-API”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jîuh1jÏhjþubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Khjìubeh}”(h]”jah ]”h"]”Œ2”ah$]”h&]”j ahùhúuh1j¶h³hÊh´KhhËh²hhûKubj·)”}”(hŒ1https://gcc.gnu.org/onlinedocs/gccint/GIMPLE.html”h]”(j½)”}”(hŒ3”h]”hŒ3”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼hjubhÝ)”}”(hjh]”jÐ)”}”(hjh]”hŒ1https://gcc.gnu.org/onlinedocs/gccint/GIMPLE.html”…””}”(hj1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”juh1jÏhj.ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Khjubeh}”(h]”j#ah ]”h"]”Œ3”ah$]”h&]”jahùhúuh1j¶h³hÊh´KhhËh²hhûKubj·)”}”(hŒ.https://gcc.gnu.org/onlinedocs/gccint/IPA.html”h]”(j½)”}”(hŒ4”h]”hŒ4”…””}”(hjPh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼hjLubhÝ)”}”(hjNh]”jÐ)”}”(hjNh]”hŒ.https://gcc.gnu.org/onlinedocs/gccint/IPA.html”…””}”(hjah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jNuh1jÏhj^ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KhjLubeh}”(h]”j7ah ]”h"]”Œ4”ah$]”h&]”j2ahùhúuh1j¶h³hÊh´KhhËh²hhûKubj·)”}”(hŒ.https://gcc.gnu.org/onlinedocs/gccint/RTL.html”h]”(j½)”}”(hŒ5”h]”hŒ5”…””}”(hj€h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼hj|ubhÝ)”}”(hj~h]”jÐ)”}”(hj~h]”hŒ.https://gcc.gnu.org/onlinedocs/gccint/RTL.html”…””}”(hj‘h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”j~uh1jÏhjŽubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Khj|ubeh}”(h]”jKah ]”h"]”Œ5”ah$]”h&]”jFahùhúuh1j¶h³hÊh´KhhËh²hhûKubj·)”}”(hŒhttps://grsecurity.net/”h]”(j½)”}”(hŒ6”h]”hŒ6”…””}”(hj°h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼hj¬ubhÝ)”}”(hj®h]”jÐ)”}”(hj®h]”hŒhttps://grsecurity.net/”…””}”(hjÁh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”j®uh1jÏhj¾ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Khj¬ubeh}”(h]”j‰ah ]”h"]”Œ6”ah$]”h&]”j„ahùhúuh1j¶h³hÊh´KhhËh²hhûKubj·)”}”(hŒhttps://pax.grsecurity.net/ ”h]”(j½)”}”(hŒ7”h]”hŒ7”…””}”(hjàh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼hjÜubhÝ)”}”(hŒhttps://pax.grsecurity.net/”h]”jÐ)”}”(hjðh]”hŒhttps://pax.grsecurity.net/”…””}”(hjòh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jðuh1jÏhjîubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K hjÜubeh}”(h]”jah ]”h"]”Œ7”ah$]”h&]”j˜ahùhúuh1j¶h³hÊh´K hhËh²hhûKubeh}”(h]”Œ introduction”ah ]”h"]”Œ introduction”ah$]”h&]”uh1hµhh·h²hh³hÊh´Kubh¶)”}”(hhh]”(h»)”}”(hŒPurpose”h]”hŒPurpose”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjh²hh³hÊh´K$ubhÝ)”}”(hXNGCC plugins are designed to provide a place to experiment with potential compiler features that are neither in GCC nor Clang upstream. Once their utility is proven, the goal is to upstream the feature into GCC (and Clang), and then to finally remove them from the kernel once the feature is available in all supported versions of GCC.”h]”hXNGCC plugins are designed to provide a place to experiment with potential compiler features that are neither in GCC nor Clang upstream. Once their utility is proven, the goal is to upstream the feature into GCC (and Clang), and then to finally remove them from the kernel once the feature is available in all supported versions of GCC.”…””}”(hj&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K&hjh²hubhÝ)”}”(hŒySpecifically, new plugins should implement only features that have no upstream compiler support (in either GCC or Clang).”h]”hŒySpecifically, new plugins should implement only features that have no upstream compiler support (in either GCC or Clang).”…””}”(hj4h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K,hjh²hubhÝ)”}”(hŒÇWhen a feature exists in Clang but not GCC, effort should be made to bring the feature to upstream GCC (rather than just as a kernel-specific GCC plugin), so the entire ecosystem can benefit from it.”h]”hŒÇWhen a feature exists in Clang but not GCC, effort should be made to bring the feature to upstream GCC (rather than just as a kernel-specific GCC plugin), so the entire ecosystem can benefit from it.”…””}”(hjBh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K/hjh²hubhÝ)”}”(hŒ»Similarly, even if a feature provided by a GCC plugin does *not* exist in Clang, but the feature is proven to be useful, effort should be spent to upstream the feature to GCC (and Clang).”h]”(hŒ;Similarly, even if a feature provided by a GCC plugin does ”…””}”(hjPh²hh³Nh´NubhŒemphasis”“”)”}”(hŒ*not*”h]”hŒnot”…””}”(hjZh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jXhjPubhŒ{ exist in Clang, but the feature is proven to be useful, effort should be spent to upstream the feature to GCC (and Clang).”…””}”(hjPh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K3hjh²hubhÝ)”}”(hŒëAfter a feature is available in upstream GCC, the plugin will be made unbuildable for the corresponding GCC version (and later). Once all kernel-supported versions of GCC provide the feature, the plugin will be removed from the kernel.”h]”hŒëAfter a feature is available in upstream GCC, the plugin will be made unbuildable for the corresponding GCC version (and later). Once all kernel-supported versions of GCC provide the feature, the plugin will be removed from the kernel.”…””}”(hjrh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K7hjh²hubeh}”(h]”Œpurpose”ah ]”h"]”Œpurpose”ah$]”h&]”uh1hµhh·h²hh³hÊh´K$ubh¶)”}”(hhh]”(h»)”}”(hŒFiles”h]”hŒFiles”…””}”(hj‹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjˆh²hh³hÊh´K>ubhÝ)”}”(hŒ**$(src)/scripts/gcc-plugins**”h]”hŒstrong”“”)”}”(hj›h]”hŒ$(src)/scripts/gcc-plugins”…””}”(hjŸh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj™ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K@hjˆh²hubhŒ block_quote”“”)”}”(hŒ*This is the directory of the GCC plugins. ”h]”hÝ)”}”(hŒ)This is the directory of the GCC plugins.”h]”hŒ)This is the directory of the GCC plugins.”…””}”(hj¸h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KBhj´ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³hÊh´KBhjˆh²hubhÝ)”}”(hŒ+**$(src)/scripts/gcc-plugins/gcc-common.h**”h]”jž)”}”(hjÎh]”hŒ'$(src)/scripts/gcc-plugins/gcc-common.h”…””}”(hjÐh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÌubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KDhjˆh²hubj³)”}”(hŒpThis is a compatibility header for GCC plugins. It should be always included instead of individual gcc headers. ”h]”hÝ)”}”(hŒoThis is a compatibility header for GCC plugins. It should be always included instead of individual gcc headers.”h]”hŒoThis is a compatibility header for GCC plugins. It should be always included instead of individual gcc headers.”…””}”(hjçh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KFhjãubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³hÊh´KFhjˆh²hubhÝ)”}”(hŒÜ**$(src)/scripts/gcc-plugins/gcc-generate-gimple-pass.h, $(src)/scripts/gcc-plugins/gcc-generate-ipa-pass.h, $(src)/scripts/gcc-plugins/gcc-generate-simple_ipa-pass.h, $(src)/scripts/gcc-plugins/gcc-generate-rtl-pass.h**”h]”jž)”}”(hjýh]”hŒØ$(src)/scripts/gcc-plugins/gcc-generate-gimple-pass.h, $(src)/scripts/gcc-plugins/gcc-generate-ipa-pass.h, $(src)/scripts/gcc-plugins/gcc-generate-simple_ipa-pass.h, $(src)/scripts/gcc-plugins/gcc-generate-rtl-pass.h”…””}”(hjÿh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjûubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KIhjˆh²hubj³)”}”(hŒ«These headers automatically generate the registration structures for GIMPLE, SIMPLE_IPA, IPA and RTL passes. They should be preferred to creating the structures by hand. ”h]”hÝ)”}”(hŒ©These headers automatically generate the registration structures for GIMPLE, SIMPLE_IPA, IPA and RTL passes. They should be preferred to creating the structures by hand.”h]”hŒ©These headers automatically generate the registration structures for GIMPLE, SIMPLE_IPA, IPA and RTL passes. They should be preferred to creating the structures by hand.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KNhjubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³hÊh´KNhjˆh²hubeh}”(h]”Œfiles”ah ]”h"]”Œfiles”ah$]”h&]”uh1hµhh·h²hh³hÊh´K>ubh¶)”}”(hhh]”(h»)”}”(hŒUsage”h]”hŒUsage”…””}”(hj5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj2h²hh³hÊh´KTubhÝ)”}”(hŒZYou must install the gcc plugin headers for your gcc version, e.g., on Ubuntu for gcc-10::”h]”hŒYYou must install the gcc plugin headers for your gcc version, e.g., on Ubuntu for gcc-10:”…””}”(hjCh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KVhj2h²hubhŒ literal_block”“”)”}”(hŒ!apt-get install gcc-10-plugin-dev”h]”hŒ!apt-get install gcc-10-plugin-dev”…””}”hjSsbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1jQh³hÊh´KYhj2h²hubhÝ)”}”(hŒOr on Fedora::”h]”hŒ Or on Fedora:”…””}”(hjch²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K[hj2h²hubjR)”}”(hŒ)dnf install gcc-plugin-devel libmpc-devel”h]”hŒ)dnf install gcc-plugin-devel libmpc-devel”…””}”hjqsbah}”(h]”h ]”h"]”h$]”h&]”jajbuh1jQh³hÊh´K]hj2h²hubhÝ)”}”(hŒ>Or on Fedora when using cross-compilers that include plugins::”h]”hŒ=Or on Fedora when using cross-compilers that include plugins:”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K_hj2h²hubjR)”}”(hŒdnf install libmpc-devel”h]”hŒdnf install libmpc-devel”…””}”hjsbah}”(h]”h ]”h"]”h$]”h&]”jajbuh1jQh³hÊh´Kahj2h²hubhÝ)”}”(hŒ^Enable the GCC plugin infrastructure and some plugin(s) you want to use in the kernel config::”h]”hŒ]Enable the GCC plugin infrastructure and some plugin(s) you want to use in the kernel config:”…””}”(hj›h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kchj2h²hubjR)”}”(hŒ;CONFIG_GCC_PLUGINS=y CONFIG_GCC_PLUGIN_LATENT_ENTROPY=y ...”h]”hŒ;CONFIG_GCC_PLUGINS=y CONFIG_GCC_PLUGIN_LATENT_ENTROPY=y ...”…””}”hj©sbah}”(h]”h ]”h"]”h$]”h&]”jajbuh1jQh³hÊh´Kfhj2h²hubhÝ)”}”(hŒJRun gcc (native or cross-compiler) to ensure plugin headers are detected::”h]”hŒIRun gcc (native or cross-compiler) to ensure plugin headers are detected:”…””}”(hj·h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kjhj2h²hubjR)”}”(hŒdgcc -print-file-name=plugin CROSS_COMPILE=arm-linux-gnu- ${CROSS_COMPILE}gcc -print-file-name=plugin”h]”hŒdgcc -print-file-name=plugin CROSS_COMPILE=arm-linux-gnu- ${CROSS_COMPILE}gcc -print-file-name=plugin”…””}”hjÅsbah}”(h]”h ]”h"]”h$]”h&]”jajbuh1jQh³hÊh´Klhj2h²hubhÝ)”}”(hŒ/The word "plugin" means they are not detected::”h]”hŒ2The word “plugin†means they are not detected:”…””}”(hjÓh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kohj2h²hubjR)”}”(hŒplugin”h]”hŒplugin”…””}”hjásbah}”(h]”h ]”h"]”h$]”h&]”jajbuh1jQh³hÊh´Kqhj2h²hubhÝ)”}”(hŒ%A full path means they are detected::”h]”hŒ$A full path means they are detected:”…””}”(hjïh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kshj2h²hubjR)”}”(hŒ*/usr/lib/gcc/x86_64-redhat-linux/12/plugin”h]”hŒ*/usr/lib/gcc/x86_64-redhat-linux/12/plugin”…””}”hjýsbah}”(h]”h ]”h"]”h$]”h&]”jajbuh1jQh³hÊh´Kuhj2h²hubhÝ)”}”(hŒ9To compile the minimum tool set including the plugin(s)::”h]”hŒ8To compile the minimum tool set including the plugin(s):”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kwhj2h²hubjR)”}”(hŒ make scripts”h]”hŒ make scripts”…””}”hjsbah}”(h]”h ]”h"]”h$]”h&]”jajbuh1jQh³hÊh´Kyhj2h²hubhÝ)”}”(hŒcor just run the kernel make and compile the whole kernel with the cyclomatic complexity GCC plugin.”h]”hŒcor just run the kernel make and compile the whole kernel with the cyclomatic complexity GCC plugin.”…””}”(hj'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K{hj2h²hubeh}”(h]”Œusage”ah ]”h"]”Œusage”ah$]”h&]”uh1hµhh·h²hh³hÊh´KTubh¶)”}”(hhh]”(h»)”}”(hŒ4. How to add a new GCC plugin”h]”hŒ4. How to add a new GCC plugin”…””}”(hj@h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj=h²hh³hÊh´K€ubhÝ)”}”(hXThe GCC plugins are in scripts/gcc-plugins/. You need to put plugin source files right under scripts/gcc-plugins/. Creating subdirectories is not supported. It must be added to scripts/gcc-plugins/Makefile, scripts/Makefile.gcc-plugins and a relevant Kconfig file.”h]”hXThe GCC plugins are in scripts/gcc-plugins/. You need to put plugin source files right under scripts/gcc-plugins/. Creating subdirectories is not supported. It must be added to scripts/gcc-plugins/Makefile, scripts/Makefile.gcc-plugins and a relevant Kconfig file.”…””}”(hjNh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K‚hj=h²hubeh}”(h]”Œhow-to-add-a-new-gcc-plugin”ah ]”h"]”Œ4. how to add a new gcc plugin”ah$]”h&]”uh1hµhh·h²hh³hÊh´K€ubeh}”(h]”Œgcc-plugin-infrastructure”ah ]”h"]”Œgcc plugin infrastructure”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”}”(Œ1”]”hèaŒ2”]”jaŒ3”]”jaŒ4”]”j(aŒ5”]”j<aŒ6”]”jzaŒ7”]”jŽauŒrefids”}”Œnameids”}”(jijfjjjéhøjjjIj#jyj7j©jKjÙj‰j jj…j‚j/j,j:j7jaj^uŒ nametypes”}”(ji‰j‰jéˆjˆjIˆjyˆj©ˆjÙˆj ˆj…‰j/‰j:‰ja‰uh}”(jfh·jhËhòhèj jjjj2j(jFj<j„jzj˜jŽhøj¸jjìj#jj7jLjKj|j‰j¬jjÜj‚jj,jˆj7j2j^j=uŒ footnote_refs”}”(jÏ]”hèajÑ]”jajÓ]”jajÕ]”j(aj×]”j<ajÙ]”jzajÛ]”jŽauŒ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”(j¸jìjjLj|j¬jÜeŒ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”jKs…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.