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 @@   * Options:   * -fplugin-arg-structleak_plugin-disable   * -fplugin-arg-structleak_plugin-verbose + * -fplugin-arg-structleak_plugin-byref-all   *   * Usage:   * $ # for 4.5/4.6/C based 4.7 @@ -42,6 +43,7 @@ static struct plugin_info structleak_plugin_info = {  };  static bool verbose; +static bool byref_all;  static tree handle_user_attribute(tree *node, tree name, tree args, int flags, bool *no_add_attrs)  { @@ -150,7 +152,9 @@ static void initialize(tree var)  	/* these aren't the 0days you're looking for */  	if (verbose)  		inform(DECL_SOURCE_LOCATION(var), -			"userspace variable will be forcibly initialized"); +			"%s variable will be forcibly initialized", +			(byref_all && TREE_ADDRESSABLE(var)) ? "byref" +							     : "userspace");  	/* build the initializer expression */  	initializer = build_constructor(TREE_TYPE(var), NULL); @@ -190,7 +194,8 @@ static unsigned int structleak_execute(void)  			continue;  		/* if the type is of interest, examine the variable */ -		if (TYPE_USERSPACE(type)) +		if (TYPE_USERSPACE(type) || +		    (byref_all && TREE_ADDRESSABLE(var)))  			initialize(var);  	} @@ -232,6 +237,10 @@ __visible int plugin_init(struct plugin_name_args *plugin_info, struct plugin_gc  			verbose = true;  			continue;  		} +		if (!strcmp(argv[i].key, "byref-all")) { +			byref_all = true; +			continue; +		}  		error(G_("unknown option '-fplugin-arg-%s-%s'"), plugin_name, argv[i].key);  	} | 
