]>
Commit | Line | Data |
---|---|---|
0dae776c ER |
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 | ||
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; | |
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 | } |