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 | ||
