2015-07-21 19:13:34 +08:00
|
|
|
/*
|
|
|
|
* Copyright (C) 2015, Wang Nan <wangnan0@huawei.com>
|
|
|
|
* Copyright (C) 2015, Huawei Inc.
|
|
|
|
*/
|
|
|
|
#ifndef __LLVM_UTILS_H
|
|
|
|
#define __LLVM_UTILS_H
|
|
|
|
|
|
|
|
#include "debug.h"
|
|
|
|
|
|
|
|
struct llvm_param {
|
|
|
|
/* Path of clang executable */
|
|
|
|
const char *clang_path;
|
|
|
|
/*
|
|
|
|
* Template of clang bpf compiling. 5 env variables
|
|
|
|
* can be used:
|
|
|
|
* $CLANG_EXEC: Path to clang.
|
|
|
|
* $CLANG_OPTIONS: Extra options to clang.
|
|
|
|
* $KERNEL_INC_OPTIONS: Kernel include directories.
|
|
|
|
* $WORKING_DIR: Kernel source directory.
|
|
|
|
* $CLANG_SOURCE: Source file to be compiled.
|
|
|
|
*/
|
|
|
|
const char *clang_bpf_cmd_template;
|
|
|
|
/* Will be filled in $CLANG_OPTIONS */
|
|
|
|
const char *clang_opt;
|
|
|
|
/* Where to find kbuild system */
|
|
|
|
const char *kbuild_dir;
|
|
|
|
/*
|
|
|
|
* Arguments passed to make, like 'ARCH=arm' if doing cross
|
|
|
|
* compiling. Should not be used for dynamic compiling.
|
|
|
|
*/
|
|
|
|
const char *kbuild_opts;
|
perf llvm: Allow dump llvm output object file using llvm.dump-obj
Add a 'llvm.dump-obj' config option to enable perf dump BPF object files
compiled by LLVM.
This option is useful when using BPF objects in embedded platforms.
LLVM compiler won't be deployed in these platforms, and currently we
don't support dynamic compiling library.
Before this patch users have to explicitly issue llvm commands to
compile BPF scripts, and can't use helpers (like include path detection
and default macros) in perf. With this option, user is allowed to use
perf to compile their BPF objects then copy them into their embedded
platforms.
Committer notice:
Testing it:
# cat ~/.perfconfig
[llvm]
dump-obj = true
#
# ls -la filter.o
ls: cannot access filter.o: No such file or directory
# cat filter.c
#include <uapi/linux/bpf.h>
#define SEC(NAME) __attribute__((section(NAME), used))
SEC("func=hrtimer_nanosleep rqtp->tv_nsec")
int func(void *ctx, int err, long nsec)
{
return nsec > 1000;
}
char _license[] SEC("license") = "GPL";
int _version SEC("version") = LINUX_VERSION_CODE;
# trace -e nanosleep --event filter.c usleep 6
LLVM: dumping filter.o
0.007 ( 0.007 ms): usleep/13976 nanosleep(rqtp: 0x7ffc5847f640 ) ...
0.007 ( ): perf_bpf_probe:func:(ffffffff811137d0) tv_nsec=6000)
0.070 ( 0.070 ms): usleep/13976 ... [continued]: nanosleep()) = 0
# ls -la filter.o
-rw-r--r--. 1 root root 776 Jun 20 17:01 filter.o
# readelf -SW filter.o
There are 7 section headers, starting at offset 0x148:
Section Headers:
[Nr] Name Type Address Off Size ES Flg Lk Inf Al
[ 0] NULL 0000000000000000 000000 000000 00 0 0 0
[ 1] .strtab STRTAB 0000000000000000 0000e8 00005a 00 0 0 1
[ 2] .text PROGBITS 0000000000000000 000040 000000 00 AX 0 0 4
[ 3] func=hrtimer_nanosleep rqtp->tv_nsec PROGBITS 0000000000000000 000040 000028 00 AX 0 0 8
[ 4] license PROGBITS 0000000000000000 000068 000004 00 WA 0 0 1
[ 5] version PROGBITS 0000000000000000 00006c 000004 00 WA 0 0 4
[ 6] .symtab SYMTAB 0000000000000000 000070 000078 18 1 2 8
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings)
I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific)
#
Signed-off-by: Wang Nan <wangnan0@huawei.com>
Cc: Alexei Starovoitov <ast@kernel.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: pi3orama@163.com
Link: http://lkml.kernel.org/r/1466064161-48553-2-git-send-email-wangnan0@huawei.com
[ s/dumpping/dumping/g ]
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2016-06-16 16:02:40 +08:00
|
|
|
/*
|
|
|
|
* Default is false. If set to true, write compiling result
|
|
|
|
* to object file.
|
|
|
|
*/
|
|
|
|
bool dump_obj;
|
2015-07-08 18:04:02 +08:00
|
|
|
/*
|
|
|
|
* Default is false. If one of the above fields is set by user
|
|
|
|
* explicitly then user_set_llvm is set to true. This is used
|
|
|
|
* for perf test. If user doesn't set anything in .perfconfig
|
|
|
|
* and clang is not found, don't trigger llvm test.
|
|
|
|
*/
|
|
|
|
bool user_set_param;
|
2015-07-21 19:13:34 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
extern struct llvm_param llvm_param;
|
2016-03-24 02:06:35 +08:00
|
|
|
int perf_llvm_config(const char *var, const char *value);
|
2015-06-11 18:31:09 +08:00
|
|
|
|
2016-03-24 02:06:35 +08:00
|
|
|
int llvm__compile_bpf(const char *path, void **p_obj_buf, size_t *p_obj_buf_sz);
|
2015-07-08 18:04:02 +08:00
|
|
|
|
|
|
|
/* This function is for test__llvm() use only */
|
2016-03-24 02:06:35 +08:00
|
|
|
int llvm__search_clang(void);
|
2016-11-26 15:03:30 +08:00
|
|
|
|
|
|
|
/* Following functions are reused by builtin clang support */
|
|
|
|
void llvm__get_kbuild_opts(char **kbuild_dir, char **kbuild_include_opts);
|
|
|
|
int llvm__get_nr_cpus(void);
|
|
|
|
|
|
|
|
void llvm__dump_obj(const char *path, void *obj_buf, size_t size);
|
2015-07-21 19:13:34 +08:00
|
|
|
#endif
|