Commit 577f12c0 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'gcc-plugins-v4.9-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux

Pull gcc plugin fixes from Kees Cook:
 - make sure required exports from gcc plugins are visible to gcc
 - switch latent_entropy to unsigned long to avoid stack frame bloat

* tag 'gcc-plugins-v4.9-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux:
  latent_entropy: Fix wrong gcc code generation with 64 bit variables
  gcc-plugins: Export symbols needed by gcc
parents 04659feb 58bea414
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -92,7 +92,7 @@ int _node_numa_mem_[MAX_NUMNODES];
#endif
#endif


#ifdef CONFIG_GCC_PLUGIN_LATENT_ENTROPY
#ifdef CONFIG_GCC_PLUGIN_LATENT_ENTROPY
volatile u64 latent_entropy __latent_entropy;
volatile unsigned long latent_entropy __latent_entropy;
EXPORT_SYMBOL(latent_entropy);
EXPORT_SYMBOL(latent_entropy);
#endif
#endif


+2 −2
Original line number Original line Diff line number Diff line
@@ -20,7 +20,7 @@


#include "gcc-common.h"
#include "gcc-common.h"


int plugin_is_GPL_compatible;
__visible int plugin_is_GPL_compatible;


static struct plugin_info cyc_complexity_plugin_info = {
static struct plugin_info cyc_complexity_plugin_info = {
	.version	= "20160225",
	.version	= "20160225",
@@ -49,7 +49,7 @@ static unsigned int cyc_complexity_execute(void)


#include "gcc-generate-gimple-pass.h"
#include "gcc-generate-gimple-pass.h"


int plugin_init(struct plugin_name_args *plugin_info, struct plugin_gcc_version *version)
__visible int plugin_init(struct plugin_name_args *plugin_info, struct plugin_gcc_version *version)
{
{
	const char * const plugin_name = plugin_info->base_name;
	const char * const plugin_name = plugin_info->base_name;
	struct register_pass_info cyc_complexity_pass_info;
	struct register_pass_info cyc_complexity_pass_info;
+1 −0
Original line number Original line Diff line number Diff line
@@ -130,6 +130,7 @@ extern void dump_gimple_stmt(pretty_printer *, gimple, int, int);
#endif
#endif


#define __unused __attribute__((__unused__))
#define __unused __attribute__((__unused__))
#define __visible __attribute__((visibility("default")))


#define DECL_NAME_POINTER(node) IDENTIFIER_POINTER(DECL_NAME(node))
#define DECL_NAME_POINTER(node) IDENTIFIER_POINTER(DECL_NAME(node))
#define DECL_NAME_LENGTH(node) IDENTIFIER_LENGTH(DECL_NAME(node))
#define DECL_NAME_LENGTH(node) IDENTIFIER_LENGTH(DECL_NAME(node))
+12 −13
Original line number Original line Diff line number Diff line
@@ -77,7 +77,7 @@


#include "gcc-common.h"
#include "gcc-common.h"


int plugin_is_GPL_compatible;
__visible int plugin_is_GPL_compatible;


static GTY(()) tree latent_entropy_decl;
static GTY(()) tree latent_entropy_decl;


@@ -340,7 +340,7 @@ static enum tree_code get_op(tree *rhs)
		break;
		break;
	}
	}
	if (rhs)
	if (rhs)
		*rhs = build_int_cstu(unsigned_intDI_type_node, random_const);
		*rhs = build_int_cstu(long_unsigned_type_node, random_const);
	return op;
	return op;
}
}


@@ -372,7 +372,7 @@ static void __perturb_latent_entropy(gimple_stmt_iterator *gsi,
	enum tree_code op;
	enum tree_code op;


	/* 1. create temporary copy of latent_entropy */
	/* 1. create temporary copy of latent_entropy */
	temp = create_var(unsigned_intDI_type_node, "tmp_latent_entropy");
	temp = create_var(long_unsigned_type_node, "temp_latent_entropy");


	/* 2. read... */
	/* 2. read... */
	add_referenced_var(latent_entropy_decl);
	add_referenced_var(latent_entropy_decl);
@@ -459,13 +459,13 @@ static void init_local_entropy(basic_block bb, tree local_entropy)
	gsi_insert_before(&gsi, call, GSI_NEW_STMT);
	gsi_insert_before(&gsi, call, GSI_NEW_STMT);
	update_stmt(call);
	update_stmt(call);


	udi_frame_addr = fold_convert(unsigned_intDI_type_node, frame_addr);
	udi_frame_addr = fold_convert(long_unsigned_type_node, frame_addr);
	assign = gimple_build_assign(local_entropy, udi_frame_addr);
	assign = gimple_build_assign(local_entropy, udi_frame_addr);
	gsi_insert_after(&gsi, assign, GSI_NEW_STMT);
	gsi_insert_after(&gsi, assign, GSI_NEW_STMT);
	update_stmt(assign);
	update_stmt(assign);


	/* 3. create temporary copy of latent_entropy */
	/* 3. create temporary copy of latent_entropy */
	tmp = create_var(unsigned_intDI_type_node, "tmp_latent_entropy");
	tmp = create_var(long_unsigned_type_node, "temp_latent_entropy");


	/* 4. read the global entropy variable into local entropy */
	/* 4. read the global entropy variable into local entropy */
	add_referenced_var(latent_entropy_decl);
	add_referenced_var(latent_entropy_decl);
@@ -480,7 +480,7 @@ static void init_local_entropy(basic_block bb, tree local_entropy)
	update_stmt(assign);
	update_stmt(assign);


	rand_cst = get_random_const();
	rand_cst = get_random_const();
	rand_const = build_int_cstu(unsigned_intDI_type_node, rand_cst);
	rand_const = build_int_cstu(long_unsigned_type_node, rand_cst);
	op = get_op(NULL);
	op = get_op(NULL);
	assign = create_assign(op, local_entropy, local_entropy, rand_const);
	assign = create_assign(op, local_entropy, local_entropy, rand_const);
	gsi_insert_after(&gsi, assign, GSI_NEW_STMT);
	gsi_insert_after(&gsi, assign, GSI_NEW_STMT);
@@ -529,7 +529,7 @@ static unsigned int latent_entropy_execute(void)
	}
	}


	/* 1. create the local entropy variable */
	/* 1. create the local entropy variable */
	local_entropy = create_var(unsigned_intDI_type_node, "local_entropy");
	local_entropy = create_var(long_unsigned_type_node, "local_entropy");


	/* 2. initialize the local entropy variable */
	/* 2. initialize the local entropy variable */
	init_local_entropy(bb, local_entropy);
	init_local_entropy(bb, local_entropy);
@@ -561,10 +561,9 @@ static void latent_entropy_start_unit(void *gcc_data __unused,
	if (in_lto_p)
	if (in_lto_p)
		return;
		return;


	/* extern volatile u64 latent_entropy */
	/* extern volatile unsigned long latent_entropy */
	gcc_assert(TYPE_PRECISION(long_long_unsigned_type_node) == 64);
	quals = TYPE_QUALS(long_unsigned_type_node) | TYPE_QUAL_VOLATILE;
	quals = TYPE_QUALS(long_long_unsigned_type_node) | TYPE_QUAL_VOLATILE;
	type = build_qualified_type(long_unsigned_type_node, quals);
	type = build_qualified_type(long_long_unsigned_type_node, quals);
	id = get_identifier("latent_entropy");
	id = get_identifier("latent_entropy");
	latent_entropy_decl = build_decl(UNKNOWN_LOCATION, VAR_DECL, id, type);
	latent_entropy_decl = build_decl(UNKNOWN_LOCATION, VAR_DECL, id, type);


@@ -584,7 +583,7 @@ static void latent_entropy_start_unit(void *gcc_data __unused,
	| TODO_update_ssa
	| TODO_update_ssa
#include "gcc-generate-gimple-pass.h"
#include "gcc-generate-gimple-pass.h"


int plugin_init(struct plugin_name_args *plugin_info,
__visible int plugin_init(struct plugin_name_args *plugin_info,
			  struct plugin_gcc_version *version)
			  struct plugin_gcc_version *version)
{
{
	bool enabled = true;
	bool enabled = true;
+2 −2
Original line number Original line Diff line number Diff line
@@ -21,7 +21,7 @@


#include "gcc-common.h"
#include "gcc-common.h"


int plugin_is_GPL_compatible;
__visible int plugin_is_GPL_compatible;


tree sancov_fndecl;
tree sancov_fndecl;


@@ -86,7 +86,7 @@ static void sancov_start_unit(void __unused *gcc_data, void __unused *user_data)
#endif
#endif
}
}


int plugin_init(struct plugin_name_args *plugin_info, struct plugin_gcc_version *version)
__visible int plugin_init(struct plugin_name_args *plugin_info, struct plugin_gcc_version *version)
{
{
	int i;
	int i;
	struct register_pass_info sancov_plugin_pass_info;
	struct register_pass_info sancov_plugin_pass_info;