diff options
Diffstat (limited to 'tools/perf/util/bpf-loader.c')
| -rw-r--r-- | tools/perf/util/bpf-loader.c | 33 | 
1 files changed, 22 insertions, 11 deletions
diff --git a/tools/perf/util/bpf-loader.c b/tools/perf/util/bpf-loader.c index 2b2c9b82f5ab..36c861103291 100644 --- a/tools/perf/util/bpf-loader.c +++ b/tools/perf/util/bpf-loader.c @@ -14,11 +14,11 @@  #include "debug.h"  #include "bpf-loader.h"  #include "bpf-prologue.h" -#include "llvm-utils.h"  #include "probe-event.h"  #include "probe-finder.h" // for MAX_PROBES  #include "parse-events.h"  #include "llvm-utils.h" +#include "c++/clang-c.h"  #define DEFINE_PRINT_FN(name, level) \  static int libbpf_##name(const char *fmt, ...)	\ @@ -86,10 +86,21 @@ struct bpf_object *bpf__prepare_load(const char *filename, bool source)  		void *obj_buf;  		size_t obj_buf_sz; -		err = llvm__compile_bpf(filename, &obj_buf, &obj_buf_sz); -		if (err) -			return ERR_PTR(-BPF_LOADER_ERRNO__COMPILE); +		perf_clang__init(); +		err = perf_clang__compile_bpf(filename, &obj_buf, &obj_buf_sz); +		perf_clang__cleanup(); +		if (err) { +			pr_warning("bpf: builtin compilation failed: %d, try external compiler\n", err); +			err = llvm__compile_bpf(filename, &obj_buf, &obj_buf_sz); +			if (err) +				return ERR_PTR(-BPF_LOADER_ERRNO__COMPILE); +		} else +			pr_debug("bpf: successfull builtin compilation\n");  		obj = bpf_object__open_buffer(obj_buf, obj_buf_sz, filename); + +		if (!IS_ERR(obj) && llvm_param.dump_obj) +			llvm__dump_obj(filename, obj_buf, obj_buf_sz); +  		free(obj_buf);  	} else  		obj = bpf_object__open(filename); @@ -241,7 +252,7 @@ parse_prog_config_kvpair(const char *config_str, struct perf_probe_event *pev)  	int err = 0;  	if (!text) { -		pr_debug("No enough memory: dup config_str failed\n"); +		pr_debug("Not enough memory: dup config_str failed\n");  		return ERR_PTR(-ENOMEM);  	} @@ -531,7 +542,7 @@ static int map_prologue(struct perf_probe_event *pev, int *mapping,  	ptevs = malloc(array_sz);  	if (!ptevs) { -		pr_debug("No enough memory: alloc ptevs failed\n"); +		pr_debug("Not enough memory: alloc ptevs failed\n");  		return -ENOMEM;  	} @@ -604,13 +615,13 @@ static int hook_load_preprocessor(struct bpf_program *prog)  	priv->need_prologue = true;  	priv->insns_buf = malloc(sizeof(struct bpf_insn) * BPF_MAXINSNS);  	if (!priv->insns_buf) { -		pr_debug("No enough memory: alloc insns_buf failed\n"); +		pr_debug("Not enough memory: alloc insns_buf failed\n");  		return -ENOMEM;  	}  	priv->type_mapping = malloc(sizeof(int) * pev->ntevs);  	if (!priv->type_mapping) { -		pr_debug("No enough memory: alloc type_mapping failed\n"); +		pr_debug("Not enough memory: alloc type_mapping failed\n");  		return -ENOMEM;  	}  	memset(priv->type_mapping, -1, @@ -864,7 +875,7 @@ bpf_map_op_setkey(struct bpf_map_op *op, struct parse_events_term *term)  		op->k.array.ranges = memdup(term->array.ranges, memsz);  		if (!op->k.array.ranges) { -			pr_debug("No enough memory to alloc indices for map\n"); +			pr_debug("Not enough memory to alloc indices for map\n");  			return -ENOMEM;  		}  		op->key_type = BPF_MAP_KEY_RANGES; @@ -929,7 +940,7 @@ bpf_map_priv__clone(struct bpf_map_priv *priv)  	newpriv = zalloc(sizeof(*newpriv));  	if (!newpriv) { -		pr_debug("No enough memory to alloc map private\n"); +		pr_debug("Not enough memory to alloc map private\n");  		return NULL;  	}  	INIT_LIST_HEAD(&newpriv->ops_list); @@ -960,7 +971,7 @@ bpf_map__add_op(struct bpf_map *map, struct bpf_map_op *op)  	if (!priv) {  		priv = zalloc(sizeof(*priv));  		if (!priv) { -			pr_debug("No enough memory to alloc map private\n"); +			pr_debug("Not enough memory to alloc map private\n");  			return -ENOMEM;  		}  		INIT_LIST_HEAD(&priv->ops_list);  |