]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - tools/perf/util/bpf-loader.c
Merge branch 'tsc2007' into next
[karo-tx-linux.git] / tools / perf / util / bpf-loader.c
index 1f12e4e4000605e68351194731969df0c9081005..36c861103291982516b7463422544ed279fe18ed 100644 (file)
 #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 ehough 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);