diff options
author | Emese Revfy <re.emese@gmail.com> | 2016-05-23 18:10:35 -0400 |
---|---|---|
committer | Michal Marek <mmarek@suse.com> | 2016-06-07 16:57:10 -0400 |
commit | 0dae776c6bf31e779c172753f6e2d6426eb42523 (patch) | |
tree | a535f373e3a767bc3a3d6177640e3b088f7cdb24 /scripts/gcc-plugins | |
parent | 6b90bd4ba40b38dc13c2782469c1c77e4ed79915 (diff) |
Add Cyclomatic complexity GCC plugin
Add a very simple plugin to demonstrate the GCC plugin infrastructure. This GCC
plugin computes the cyclomatic complexity of each function.
The complexity M of a function's control flow graph is defined as:
M = E - N + 2P
where
E = the number of edges
N = the number of nodes
P = the number of connected components (exit nodes).
Signed-off-by: Emese Revfy <re.emese@gmail.com>
Acked-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Michal Marek <mmarek@suse.com>
Diffstat (limited to 'scripts/gcc-plugins')
-rw-r--r-- | scripts/gcc-plugins/Makefile | 1 | ||||
-rw-r--r-- | scripts/gcc-plugins/cyc_complexity_plugin.c | 73 |
2 files changed, 74 insertions, 0 deletions
diff --git a/scripts/gcc-plugins/Makefile b/scripts/gcc-plugins/Makefile index a4c93419d5d1..c60ba4bef57c 100644 --- a/scripts/gcc-plugins/Makefile +++ b/scripts/gcc-plugins/Makefile | |||
@@ -17,4 +17,5 @@ export GCCPLUGINS_DIR HOSTLIBS | |||
17 | $(HOSTLIBS)-y := $(GCC_PLUGIN) | 17 | $(HOSTLIBS)-y := $(GCC_PLUGIN) |
18 | always := $($(HOSTLIBS)-y) | 18 | always := $($(HOSTLIBS)-y) |
19 | 19 | ||
20 | cyc_complexity_plugin-objs := cyc_complexity_plugin.o | ||
20 | clean-files += *.so | 21 | clean-files += *.so |
diff --git a/scripts/gcc-plugins/cyc_complexity_plugin.c b/scripts/gcc-plugins/cyc_complexity_plugin.c new file mode 100644 index 000000000000..34df974c6ba3 --- /dev/null +++ b/scripts/gcc-plugins/cyc_complexity_plugin.c | |||
@@ -0,0 +1,73 @@ | |||
1 | /* | ||
2 | * Copyright 2011-2016 by Emese Revfy <re.emese@gmail.com> | ||
3 | * Licensed under the GPL v2, or (at your option) v3 | ||
4 | * | ||
5 | * Homepage: | ||
6 | * https://github.com/ephox-gcc-plugins/cyclomatic_complexity | ||
7 | * | ||
8 | * http://en.wikipedia.org/wiki/Cyclomatic_complexity | ||
9 | * The complexity M is then defined as: | ||
10 | * M = E - N + 2P | ||
11 | * where | ||
12 | * | ||
13 | * E = the number of edges of the graph | ||
14 | * N = the number of nodes of the graph | ||
15 | * P = the number of connected components (exit nodes). | ||
16 | * | ||
17 | * Usage (4.5 - 5): | ||
18 | * $ make clean; make run | ||
19 | */ | ||
20 | |||
21 | #include "gcc-common.h" | ||
22 | |||
23 | int plugin_is_GPL_compatible; | ||
24 | |||
25 | static struct plugin_info cyc_complexity_plugin_info = { | ||
26 | .version = "20160225", | ||
27 | .help = "Cyclomatic Complexity\n", | ||
28 | }; | ||
29 | |||
30 | static unsigned int cyc_complexity_execute(void) | ||
31 | { | ||
32 | int complexity; | ||
33 | expanded_location xloc; | ||
34 | |||
35 | /* M = E - N + 2P */ | ||
36 | complexity = n_edges_for_fn(cfun) - n_basic_blocks_for_fn(cfun) + 2; | ||
37 | |||
38 | xloc = expand_location(DECL_SOURCE_LOCATION(current_function_decl)); | ||
39 | fprintf(stderr, "Cyclomatic Complexity %d %s:%s\n", complexity, | ||
40 | xloc.file, DECL_NAME_POINTER(current_function_decl)); | ||
41 | |||
42 | return 0; | ||
43 | } | ||
44 | |||
45 | #define PASS_NAME cyc_complexity | ||
46 | |||
47 | #define NO_GATE | ||
48 | #define TODO_FLAGS_FINISH TODO_dump_func | ||
49 | |||
50 | #include "gcc-generate-gimple-pass.h" | ||
51 | |||
52 | int plugin_init(struct plugin_name_args *plugin_info, struct plugin_gcc_version *version) | ||
53 | { | ||
54 | const char * const plugin_name = plugin_info->base_name; | ||
55 | struct register_pass_info cyc_complexity_pass_info; | ||
56 | |||
57 | cyc_complexity_pass_info.pass = make_cyc_complexity_pass(); | ||
58 | cyc_complexity_pass_info.reference_pass_name = "ssa"; | ||
59 | cyc_complexity_pass_info.ref_pass_instance_number = 1; | ||
60 | cyc_complexity_pass_info.pos_op = PASS_POS_INSERT_AFTER; | ||
61 | |||
62 | if (!plugin_default_version_check(version, &gcc_version)) { | ||
63 | error(G_("incompatible gcc/plugin versions")); | ||
64 | return 1; | ||
65 | } | ||
66 | |||
67 | register_callback(plugin_name, PLUGIN_INFO, NULL, | ||
68 | &cyc_complexity_plugin_info); | ||
69 | register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, | ||
70 | &cyc_complexity_pass_info); | ||
71 | |||
72 | return 0; | ||
73 | } | ||