]>
Commit | Line | Data |
---|---|---|
0dae776c ER |
1 | /* |
2 | * Copyright 2011-2016 by Emese Revfy <[email protected]> | |
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 | ||
da7389ac | 23 | __visible int plugin_is_GPL_compatible; |
0dae776c ER |
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 | ||
da7389ac | 52 | __visible int plugin_init(struct plugin_name_args *plugin_info, struct plugin_gcc_version *version) |
0dae776c ER |
53 | { |
54 | const char * const plugin_name = plugin_info->base_name; | |
0dae776c | 55 | |
5a45a4c5 | 56 | PASS_INFO(cyc_complexity, "ssa", 1, PASS_POS_INSERT_AFTER); |
0dae776c ER |
57 | |
58 | if (!plugin_default_version_check(version, &gcc_version)) { | |
59 | error(G_("incompatible gcc/plugin versions")); | |
60 | return 1; | |
61 | } | |
62 | ||
63 | register_callback(plugin_name, PLUGIN_INFO, NULL, | |
64 | &cyc_complexity_plugin_info); | |
65 | register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, | |
66 | &cyc_complexity_pass_info); | |
67 | ||
68 | return 0; | |
69 | } |