diff options
Diffstat (limited to 'scripts/gcc-plugins/structleak_plugin.c')
-rw-r--r-- | scripts/gcc-plugins/structleak_plugin.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/scripts/gcc-plugins/structleak_plugin.c b/scripts/gcc-plugins/structleak_plugin.c index fa3d7a4b26f2..3f8dd4868178 100644 --- a/scripts/gcc-plugins/structleak_plugin.c +++ b/scripts/gcc-plugins/structleak_plugin.c | |||
@@ -16,6 +16,7 @@ | |||
16 | * Options: | 16 | * Options: |
17 | * -fplugin-arg-structleak_plugin-disable | 17 | * -fplugin-arg-structleak_plugin-disable |
18 | * -fplugin-arg-structleak_plugin-verbose | 18 | * -fplugin-arg-structleak_plugin-verbose |
19 | * -fplugin-arg-structleak_plugin-byref-all | ||
19 | * | 20 | * |
20 | * Usage: | 21 | * Usage: |
21 | * $ # for 4.5/4.6/C based 4.7 | 22 | * $ # for 4.5/4.6/C based 4.7 |
@@ -42,6 +43,7 @@ static struct plugin_info structleak_plugin_info = { | |||
42 | }; | 43 | }; |
43 | 44 | ||
44 | static bool verbose; | 45 | static bool verbose; |
46 | static bool byref_all; | ||
45 | 47 | ||
46 | static tree handle_user_attribute(tree *node, tree name, tree args, int flags, bool *no_add_attrs) | 48 | static tree handle_user_attribute(tree *node, tree name, tree args, int flags, bool *no_add_attrs) |
47 | { | 49 | { |
@@ -150,7 +152,9 @@ static void initialize(tree var) | |||
150 | /* these aren't the 0days you're looking for */ | 152 | /* these aren't the 0days you're looking for */ |
151 | if (verbose) | 153 | if (verbose) |
152 | inform(DECL_SOURCE_LOCATION(var), | 154 | inform(DECL_SOURCE_LOCATION(var), |
153 | "userspace variable will be forcibly initialized"); | 155 | "%s variable will be forcibly initialized", |
156 | (byref_all && TREE_ADDRESSABLE(var)) ? "byref" | ||
157 | : "userspace"); | ||
154 | 158 | ||
155 | /* build the initializer expression */ | 159 | /* build the initializer expression */ |
156 | initializer = build_constructor(TREE_TYPE(var), NULL); | 160 | initializer = build_constructor(TREE_TYPE(var), NULL); |
@@ -190,7 +194,8 @@ static unsigned int structleak_execute(void) | |||
190 | continue; | 194 | continue; |
191 | 195 | ||
192 | /* if the type is of interest, examine the variable */ | 196 | /* if the type is of interest, examine the variable */ |
193 | if (TYPE_USERSPACE(type)) | 197 | if (TYPE_USERSPACE(type) || |
198 | (byref_all && TREE_ADDRESSABLE(var))) | ||
194 | initialize(var); | 199 | initialize(var); |
195 | } | 200 | } |
196 | 201 | ||
@@ -232,6 +237,10 @@ __visible int plugin_init(struct plugin_name_args *plugin_info, struct plugin_gc | |||
232 | verbose = true; | 237 | verbose = true; |
233 | continue; | 238 | continue; |
234 | } | 239 | } |
240 | if (!strcmp(argv[i].key, "byref-all")) { | ||
241 | byref_all = true; | ||
242 | continue; | ||
243 | } | ||
235 | error(G_("unknown option '-fplugin-arg-%s-%s'"), plugin_name, argv[i].key); | 244 | error(G_("unknown option '-fplugin-arg-%s-%s'"), plugin_name, argv[i].key); |
236 | } | 245 | } |
237 | 246 | ||