diff options
| author | James Morris <james.morris@microsoft.com> | 2019-03-27 02:28:01 +0300 | 
|---|---|---|
| committer | James Morris <james.morris@microsoft.com> | 2019-03-27 02:28:01 +0300 | 
| commit | 9d7b7bfbafba5e6cad609f1188243a7f0cd0d293 (patch) | |
| tree | 3bc87cf11ab44f10a2000bb8ab22ca361a944621 /scripts/gcc-plugins/structleak_plugin.c | |
| parent | 468e91cecb3218afd684b8c422490dfebe0691bb (diff) | |
| parent | 8c2ffd9174779014c3fe1f96d9dc3641d9175f00 (diff) | |
| download | linux-9d7b7bfbafba5e6cad609f1188243a7f0cd0d293.tar.xz | |
Merge tag 'v5.1-rc2' into next-general
Merge to Linux 5.1-rc2 for subsystems to work with.
Diffstat (limited to 'scripts/gcc-plugins/structleak_plugin.c')
| -rw-r--r-- | scripts/gcc-plugins/structleak_plugin.c | 36 | 
1 files changed, 25 insertions, 11 deletions
| diff --git a/scripts/gcc-plugins/structleak_plugin.c b/scripts/gcc-plugins/structleak_plugin.c index 10292f791e99..e89be8f5c859 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   * -fplugin-arg-structleak_plugin-byref-all   *   * Usage: @@ -26,7 +27,6 @@   * $ gcc -fplugin=./structleak_plugin.so test.c -O2   *   * TODO: eliminate redundant initializers - *       increase type coverage   */  #include "gcc-common.h" @@ -37,13 +37,18 @@  __visible int plugin_is_GPL_compatible;  static struct plugin_info structleak_plugin_info = { -	.version	= "201607271510vanilla", +	.version	= "20190125vanilla",  	.help		= "disable\tdo not activate plugin\n" -			   "verbose\tprint all initialized variables\n", +			  "byref\tinit structs passed by reference\n" +			  "byref-all\tinit anything passed by reference\n" +			  "verbose\tprint all initialized variables\n",  }; +#define BYREF_STRUCT	1 +#define BYREF_ALL	2 +  static bool verbose; -static bool byref_all; +static int byref;  static tree handle_user_attribute(tree *node, tree name, tree args, int flags, bool *no_add_attrs)  { @@ -118,6 +123,7 @@ static void initialize(tree var)  	gimple_stmt_iterator gsi;  	tree initializer;  	gimple init_stmt; +	tree type;  	/* this is the original entry bb before the forced split */  	bb = single_succ(ENTRY_BLOCK_PTR_FOR_FN(cfun)); @@ -148,11 +154,15 @@ static void initialize(tree var)  	if (verbose)  		inform(DECL_SOURCE_LOCATION(var),  			"%s variable will be forcibly initialized", -			(byref_all && TREE_ADDRESSABLE(var)) ? "byref" -							     : "userspace"); +			(byref && TREE_ADDRESSABLE(var)) ? "byref" +							 : "userspace");  	/* build the initializer expression */ -	initializer = build_constructor(TREE_TYPE(var), NULL); +	type = TREE_TYPE(var); +	if (AGGREGATE_TYPE_P(type)) +		initializer = build_constructor(type, NULL); +	else +		initializer = fold_convert(type, integer_zero_node);  	/* build the initializer stmt */  	init_stmt = gimple_build_assign(var, initializer); @@ -184,13 +194,13 @@ static unsigned int structleak_execute(void)  		if (!auto_var_in_fn_p(var, current_function_decl))  			continue; -		/* only care about structure types */ -		if (TREE_CODE(type) != RECORD_TYPE && TREE_CODE(type) != UNION_TYPE) +		/* only care about structure types unless byref-all */ +		if (byref != BYREF_ALL && TREE_CODE(type) != RECORD_TYPE && TREE_CODE(type) != UNION_TYPE)  			continue;  		/* if the type is of interest, examine the variable */  		if (TYPE_USERSPACE(type) || -		    (byref_all && TREE_ADDRESSABLE(var))) +		    (byref && TREE_ADDRESSABLE(var)))  			initialize(var);  	} @@ -232,8 +242,12 @@ __visible int plugin_init(struct plugin_name_args *plugin_info, struct plugin_gc  			verbose = true;  			continue;  		} +		if (!strcmp(argv[i].key, "byref")) { +			byref = BYREF_STRUCT; +			continue; +		}  		if (!strcmp(argv[i].key, "byref-all")) { -			byref_all = true; +			byref = BYREF_ALL;  			continue;  		}  		error(G_("unknown option '-fplugin-arg-%s-%s'"), plugin_name, argv[i].key); | 
