diff options
Diffstat (limited to 'scripts/gcc-plugins/randomize_layout_plugin.c')
| -rw-r--r-- | scripts/gcc-plugins/randomize_layout_plugin.c | 40 | 
1 files changed, 12 insertions, 28 deletions
diff --git a/scripts/gcc-plugins/randomize_layout_plugin.c b/scripts/gcc-plugins/randomize_layout_plugin.c index 5694df3da2e9..ff65a4f87f24 100644 --- a/scripts/gcc-plugins/randomize_layout_plugin.c +++ b/scripts/gcc-plugins/randomize_layout_plugin.c @@ -73,6 +73,9 @@ static tree handle_randomize_layout_attr(tree *node, tree name, tree args, int f  	if (TYPE_P(*node)) {  		type = *node; +	} else if (TREE_CODE(*node) == FIELD_DECL) { +		*no_add_attrs = false; +		return NULL_TREE;  	} else {  		gcc_assert(TREE_CODE(*node) == TYPE_DECL);  		type = TREE_TYPE(*node); @@ -344,35 +347,18 @@ static int relayout_struct(tree type)  	shuffle(type, (tree *)newtree, shuffle_length); -	/* -	 * set up a bogus anonymous struct field designed to error out on unnamed struct initializers -	 * as gcc provides no other way to detect such code -	 */ -	list = make_node(FIELD_DECL); -	TREE_CHAIN(list) = newtree[0]; -	TREE_TYPE(list) = void_type_node; -	DECL_SIZE(list) = bitsize_zero_node; -	DECL_NONADDRESSABLE_P(list) = 1; -	DECL_FIELD_BIT_OFFSET(list) = bitsize_zero_node; -	DECL_SIZE_UNIT(list) = size_zero_node; -	DECL_FIELD_OFFSET(list) = size_zero_node; -	DECL_CONTEXT(list) = type; -	// to satisfy the constify plugin -	TREE_READONLY(list) = 1; -  	for (i = 0; i < num_fields - 1; i++)  		TREE_CHAIN(newtree[i]) = newtree[i+1];  	TREE_CHAIN(newtree[num_fields - 1]) = NULL_TREE; +	add_type_attr(type, "randomize_performed", NULL_TREE); +	add_type_attr(type, "designated_init", NULL_TREE); +	if (has_flexarray) +		add_type_attr(type, "has_flexarray", NULL_TREE); +  	main_variant = TYPE_MAIN_VARIANT(type); -	for (variant = main_variant; variant; variant = TYPE_NEXT_VARIANT(variant)) { -		TYPE_FIELDS(variant) = list; -		TYPE_ATTRIBUTES(variant) = copy_list(TYPE_ATTRIBUTES(variant)); -		TYPE_ATTRIBUTES(variant) = tree_cons(get_identifier("randomize_performed"), NULL_TREE, TYPE_ATTRIBUTES(variant)); -		TYPE_ATTRIBUTES(variant) = tree_cons(get_identifier("designated_init"), NULL_TREE, TYPE_ATTRIBUTES(variant)); -		if (has_flexarray) -			TYPE_ATTRIBUTES(type) = tree_cons(get_identifier("has_flexarray"), NULL_TREE, TYPE_ATTRIBUTES(type)); -	} +	for (variant = main_variant; variant; variant = TYPE_NEXT_VARIANT(variant)) +		TYPE_FIELDS(variant) = newtree[0];  	/*  	 * force a re-layout of the main variant @@ -440,10 +426,8 @@ static void randomize_type(tree type)  	if (lookup_attribute("randomize_layout", TYPE_ATTRIBUTES(TYPE_MAIN_VARIANT(type))) || is_pure_ops_struct(type))  		relayout_struct(type); -	for (variant = TYPE_MAIN_VARIANT(type); variant; variant = TYPE_NEXT_VARIANT(variant)) { -		TYPE_ATTRIBUTES(type) = copy_list(TYPE_ATTRIBUTES(type)); -		TYPE_ATTRIBUTES(type) = tree_cons(get_identifier("randomize_considered"), NULL_TREE, TYPE_ATTRIBUTES(type)); -	} +	add_type_attr(type, "randomize_considered", NULL_TREE); +  #ifdef __DEBUG_PLUGIN  	fprintf(stderr, "Marking randomize_considered on struct %s\n", ORIG_TYPE_NAME(type));  #ifdef __DEBUG_VERBOSE  | 
