]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - Documentation/gcc-plugins.txt
UBUNTU: Ubuntu-4.15.0-96.97
[mirror_ubuntu-bionic-kernel.git] / Documentation / gcc-plugins.txt
CommitLineData
ccd8d557 1=========================
6b90bd4b
ER
2GCC plugin infrastructure
3=========================
4
5
ccd8d557
MCC
6Introduction
7============
6b90bd4b
ER
8
9GCC plugins are loadable modules that provide extra features to the
ccd8d557 10compiler [1]_. They are useful for runtime instrumentation and static analysis.
6b90bd4b 11We can analyse, change and add further code during compilation via
ccd8d557 12callbacks [2]_, GIMPLE [3]_, IPA [4]_ and RTL passes [5]_.
6b90bd4b
ER
13
14The GCC plugin infrastructure of the kernel supports all gcc versions from
154.5 to 6.0, building out-of-tree modules, cross-compilation and building in a
16separate directory.
17Plugin source files have to be compilable by both a C and a C++ compiler as well
18because gcc versions 4.5 and 4.6 are compiled by a C compiler,
19gcc-4.7 can be compiled by a C or a C++ compiler,
20and versions 4.8+ can only be compiled by a C++ compiler.
21
cc638a48
AD
22Currently the GCC plugin infrastructure supports only the x86, arm, arm64 and
23powerpc architectures.
6b90bd4b 24
ccd8d557 25This infrastructure was ported from grsecurity [6]_ and PaX [7]_.
6b90bd4b
ER
26
27--
6b90bd4b 28
ccd8d557
MCC
29.. [1] https://gcc.gnu.org/onlinedocs/gccint/Plugins.html
30.. [2] https://gcc.gnu.org/onlinedocs/gccint/Plugin-API.html#Plugin-API
31.. [3] https://gcc.gnu.org/onlinedocs/gccint/GIMPLE.html
32.. [4] https://gcc.gnu.org/onlinedocs/gccint/IPA.html
33.. [5] https://gcc.gnu.org/onlinedocs/gccint/RTL.html
34.. [6] https://grsecurity.net/
35.. [7] https://pax.grsecurity.net/
36
37
38Files
39=====
6b90bd4b 40
ccd8d557 41**$(src)/scripts/gcc-plugins**
6b90bd4b 42
6b90bd4b
ER
43 This is the directory of the GCC plugins.
44
ccd8d557
MCC
45**$(src)/scripts/gcc-plugins/gcc-common.h**
46
6b90bd4b
ER
47 This is a compatibility header for GCC plugins.
48 It should be always included instead of individual gcc headers.
49
ccd8d557
MCC
50**$(src)/scripts/gcc-plugin.sh**
51
6b90bd4b
ER
52 This script checks the availability of the included headers in
53 gcc-common.h and chooses the proper host compiler to build the plugins
54 (gcc-4.7 can be built by either gcc or g++).
55
ccd8d557
MCC
56**$(src)/scripts/gcc-plugins/gcc-generate-gimple-pass.h,
57$(src)/scripts/gcc-plugins/gcc-generate-ipa-pass.h,
58$(src)/scripts/gcc-plugins/gcc-generate-simple_ipa-pass.h,
59$(src)/scripts/gcc-plugins/gcc-generate-rtl-pass.h**
60
6b90bd4b
ER
61 These headers automatically generate the registration structures for
62 GIMPLE, SIMPLE_IPA, IPA and RTL passes. They support all gcc versions
63 from 4.5 to 6.0.
64 They should be preferred to creating the structures by hand.
65
66
ccd8d557
MCC
67Usage
68=====
6b90bd4b
ER
69
70You must install the gcc plugin headers for your gcc version,
ccd8d557 71e.g., on Ubuntu for gcc-4.9::
6b90bd4b
ER
72
73 apt-get install gcc-4.9-plugin-dev
74
ccd8d557 75Enable a GCC plugin based feature in the kernel config::
6b90bd4b
ER
76
77 CONFIG_GCC_PLUGIN_CYC_COMPLEXITY = y
78
ccd8d557 79To compile only the plugin(s)::
6b90bd4b
ER
80
81 make gcc-plugins
82
83or just run the kernel make and compile the whole kernel with
84the cyclomatic complexity GCC plugin.
85
86
874. How to add a new GCC plugin
88==============================
89
90The GCC plugins are in $(src)/scripts/gcc-plugins/. You can use a file or a directory
91here. It must be added to $(src)/scripts/gcc-plugins/Makefile,
92$(src)/scripts/Makefile.gcc-plugins and $(src)/arch/Kconfig.
93See the cyc_complexity_plugin.c (CONFIG_GCC_PLUGIN_CYC_COMPLEXITY) GCC plugin.