diff options
Diffstat (limited to 'tools/perf/config/feature-checks')
27 files changed, 522 insertions, 0 deletions
diff --git a/tools/perf/config/feature-checks/.gitignore b/tools/perf/config/feature-checks/.gitignore new file mode 100644 index 00000000000..80f3da0c351 --- /dev/null +++ b/tools/perf/config/feature-checks/.gitignore @@ -0,0 +1,2 @@ +*.d +*.bin diff --git a/tools/perf/config/feature-checks/Makefile b/tools/perf/config/feature-checks/Makefile new file mode 100644 index 00000000000..64c84e5f051 --- /dev/null +++ b/tools/perf/config/feature-checks/Makefile @@ -0,0 +1,149 @@ + +FILES=					\ +	test-all.bin			\ +	test-backtrace.bin		\ +	test-bionic.bin			\ +	test-dwarf.bin			\ +	test-fortify-source.bin		\ +	test-glibc.bin			\ +	test-gtk2.bin			\ +	test-gtk2-infobar.bin		\ +	test-hello.bin			\ +	test-libaudit.bin		\ +	test-libbfd.bin			\ +	test-liberty.bin		\ +	test-liberty-z.bin		\ +	test-cplus-demangle.bin		\ +	test-libelf.bin			\ +	test-libelf-getphdrnum.bin	\ +	test-libelf-mmap.bin		\ +	test-libnuma.bin		\ +	test-libperl.bin		\ +	test-libpython.bin		\ +	test-libpython-version.bin	\ +	test-libslang.bin		\ +	test-libunwind.bin		\ +	test-libunwind-debug-frame.bin	\ +	test-stackprotector-all.bin	\ +	test-timerfd.bin		\ +	test-libdw-dwarf-unwind.bin + +CC := $(CROSS_COMPILE)gcc -MD +PKG_CONFIG := $(CROSS_COMPILE)pkg-config + +all: $(FILES) + +BUILD = $(CC) $(CFLAGS) -o $(OUTPUT)$@ $(patsubst %.bin,%.c,$@) $(LDFLAGS) + +############################### + +test-all.bin: +	$(BUILD) -Werror -fstack-protector-all -O2 -Werror -D_FORTIFY_SOURCE=2 -ldw -lelf -lnuma -lelf -laudit -I/usr/include/slang -lslang $(shell $(PKG_CONFIG) --libs --cflags gtk+-2.0 2>/dev/null) $(FLAGS_PERL_EMBED) $(FLAGS_PYTHON_EMBED) -DPACKAGE='"perf"' -lbfd -ldl + +test-hello.bin: +	$(BUILD) + +test-stackprotector-all.bin: +	$(BUILD) -Werror -fstack-protector-all + +test-fortify-source.bin: +	$(BUILD) -O2 -Werror -D_FORTIFY_SOURCE=2 + +test-bionic.bin: +	$(BUILD) + +test-libelf.bin: +	$(BUILD) -lelf + +test-glibc.bin: +	$(BUILD) + +test-dwarf.bin: +	$(BUILD) -ldw + +test-libelf-mmap.bin: +	$(BUILD) -lelf + +test-libelf-getphdrnum.bin: +	$(BUILD) -lelf + +test-libnuma.bin: +	$(BUILD) -lnuma + +test-libunwind.bin: +	$(BUILD) -lelf + +test-libunwind-debug-frame.bin: +	$(BUILD) -lelf + +test-libaudit.bin: +	$(BUILD) -laudit + +test-libslang.bin: +	$(BUILD) -I/usr/include/slang -lslang + +test-gtk2.bin: +	$(BUILD) $(shell $(PKG_CONFIG) --libs --cflags gtk+-2.0 2>/dev/null) + +test-gtk2-infobar.bin: +	$(BUILD) $(shell $(PKG_CONFIG) --libs --cflags gtk+-2.0 2>/dev/null) + +grep-libs  = $(filter -l%,$(1)) +strip-libs = $(filter-out -l%,$(1)) + +PERL_EMBED_LDOPTS = $(shell perl -MExtUtils::Embed -e ldopts 2>/dev/null) +PERL_EMBED_LDFLAGS = $(call strip-libs,$(PERL_EMBED_LDOPTS)) +PERL_EMBED_LIBADD = $(call grep-libs,$(PERL_EMBED_LDOPTS)) +PERL_EMBED_CCOPTS = `perl -MExtUtils::Embed -e ccopts 2>/dev/null` +FLAGS_PERL_EMBED=$(PERL_EMBED_CCOPTS) $(PERL_EMBED_LDOPTS) + +test-libperl.bin: +	$(BUILD) $(FLAGS_PERL_EMBED) + +override PYTHON := python +override PYTHON_CONFIG := python-config + +escape-for-shell-sq =  $(subst ','\'',$(1)) +shell-sq = '$(escape-for-shell-sq)' + +PYTHON_CONFIG_SQ = $(call shell-sq,$(PYTHON_CONFIG)) + +PYTHON_EMBED_LDOPTS = $(shell $(PYTHON_CONFIG_SQ) --ldflags 2>/dev/null) +PYTHON_EMBED_LDFLAGS = $(call strip-libs,$(PYTHON_EMBED_LDOPTS)) +PYTHON_EMBED_LIBADD = $(call grep-libs,$(PYTHON_EMBED_LDOPTS)) +PYTHON_EMBED_CCOPTS = $(shell $(PYTHON_CONFIG_SQ) --cflags 2>/dev/null) +FLAGS_PYTHON_EMBED = $(PYTHON_EMBED_CCOPTS) $(PYTHON_EMBED_LDOPTS) + +test-libpython.bin: +	$(BUILD) $(FLAGS_PYTHON_EMBED) + +test-libpython-version.bin: +	$(BUILD) $(FLAGS_PYTHON_EMBED) + +test-libbfd.bin: +	$(BUILD) -DPACKAGE='"perf"' -lbfd -lz -liberty -ldl + +test-liberty.bin: +	$(CC) -o $(OUTPUT)$@ test-libbfd.c -DPACKAGE='"perf"' -lbfd -ldl -liberty + +test-liberty-z.bin: +	$(CC) -o $(OUTPUT)$@ test-libbfd.c -DPACKAGE='"perf"' -lbfd -ldl -liberty -lz + +test-cplus-demangle.bin: +	$(BUILD) -liberty + +test-backtrace.bin: +	$(BUILD) + +test-timerfd.bin: +	$(BUILD) + +test-libdw-dwarf-unwind.bin: +	$(BUILD) + +-include *.d + +############################### + +clean: +	rm -f $(FILES) *.d diff --git a/tools/perf/config/feature-checks/test-all.c b/tools/perf/config/feature-checks/test-all.c new file mode 100644 index 00000000000..fe5c1e5c952 --- /dev/null +++ b/tools/perf/config/feature-checks/test-all.c @@ -0,0 +1,116 @@ +/* + * test-all.c: Try to build all the main testcases at once. + * + * A well-configured system will have all the prereqs installed, so we can speed + * up auto-detection on such systems. + */ + +/* + * Quirk: Python and Perl headers cannot be in arbitrary places, so keep + * these 3 testcases at the top: + */ +#define main main_test_libpython +# include "test-libpython.c" +#undef main + +#define main main_test_libpython_version +# include "test-libpython-version.c" +#undef main + +#define main main_test_libperl +# include "test-libperl.c" +#undef main + +#define main main_test_hello +# include "test-hello.c" +#undef main + +#define main main_test_libelf +# include "test-libelf.c" +#undef main + +#define main main_test_libelf_mmap +# include "test-libelf-mmap.c" +#undef main + +#define main main_test_glibc +# include "test-glibc.c" +#undef main + +#define main main_test_dwarf +# include "test-dwarf.c" +#undef main + +#define main main_test_libelf_getphdrnum +# include "test-libelf-getphdrnum.c" +#undef main + +#define main main_test_libunwind +# include "test-libunwind.c" +#undef main + +#define main main_test_libaudit +# include "test-libaudit.c" +#undef main + +#define main main_test_libslang +# include "test-libslang.c" +#undef main + +#define main main_test_gtk2 +# include "test-gtk2.c" +#undef main + +#define main main_test_gtk2_infobar +# include "test-gtk2-infobar.c" +#undef main + +#define main main_test_libbfd +# include "test-libbfd.c" +#undef main + +#define main main_test_backtrace +# include "test-backtrace.c" +#undef main + +#define main main_test_libnuma +# include "test-libnuma.c" +#undef main + +#define main main_test_timerfd +# include "test-timerfd.c" +#undef main + +#define main main_test_stackprotector_all +# include "test-stackprotector-all.c" +#undef main + +#define main main_test_libdw_dwarf_unwind +# include "test-libdw-dwarf-unwind.c" +#undef main + +int main(int argc, char *argv[]) +{ +	main_test_libpython(); +	main_test_libpython_version(); +	main_test_libperl(); +	main_test_hello(); +	main_test_libelf(); +	main_test_libelf_mmap(); +	main_test_glibc(); +	main_test_dwarf(); +	main_test_libelf_getphdrnum(); +	main_test_libunwind(); +	main_test_libaudit(); +	main_test_libslang(); +	main_test_gtk2(argc, argv); +	main_test_gtk2_infobar(argc, argv); +	main_test_libbfd(); +	main_test_backtrace(); +	main_test_libnuma(); +	main_test_timerfd(); +	main_test_stackprotector_all(); +	main_test_libdw_dwarf_unwind(); + +	return 0; +} diff --git a/tools/perf/config/feature-checks/test-backtrace.c b/tools/perf/config/feature-checks/test-backtrace.c new file mode 100644 index 00000000000..7124aa1dc8f --- /dev/null +++ b/tools/perf/config/feature-checks/test-backtrace.c @@ -0,0 +1,13 @@ +#include <execinfo.h> +#include <stdio.h> + +int main(void) +{ +	void *backtrace_fns[10]; +	size_t entries; + +	entries = backtrace(backtrace_fns, 10); +	backtrace_symbols_fd(backtrace_fns, entries, 1); + +	return 0; +} diff --git a/tools/perf/config/feature-checks/test-bionic.c b/tools/perf/config/feature-checks/test-bionic.c new file mode 100644 index 00000000000..eac24e9513e --- /dev/null +++ b/tools/perf/config/feature-checks/test-bionic.c @@ -0,0 +1,6 @@ +#include <android/api-level.h> + +int main(void) +{ +	return __ANDROID_API__; +} diff --git a/tools/perf/config/feature-checks/test-cplus-demangle.c b/tools/perf/config/feature-checks/test-cplus-demangle.c new file mode 100644 index 00000000000..610c686e000 --- /dev/null +++ b/tools/perf/config/feature-checks/test-cplus-demangle.c @@ -0,0 +1,14 @@ +extern int printf(const char *format, ...); +extern char *cplus_demangle(const char *, int); + +int main(void) +{ +	char symbol[4096] = "FieldName__9ClassNameFd"; +	char *tmp; + +	tmp = cplus_demangle(symbol, 0); + +	printf("demangled symbol: {%s}\n", tmp); + +	return 0; +} diff --git a/tools/perf/config/feature-checks/test-dwarf.c b/tools/perf/config/feature-checks/test-dwarf.c new file mode 100644 index 00000000000..3fc1801ce4a --- /dev/null +++ b/tools/perf/config/feature-checks/test-dwarf.c @@ -0,0 +1,10 @@ +#include <dwarf.h> +#include <elfutils/libdw.h> +#include <elfutils/version.h> + +int main(void) +{ +	Dwarf *dbg = dwarf_begin(0, DWARF_C_READ); + +	return (long)dbg; +} diff --git a/tools/perf/config/feature-checks/test-fortify-source.c b/tools/perf/config/feature-checks/test-fortify-source.c new file mode 100644 index 00000000000..c9f398d8786 --- /dev/null +++ b/tools/perf/config/feature-checks/test-fortify-source.c @@ -0,0 +1,6 @@ +#include <stdio.h> + +int main(void) +{ +	return puts("hi"); +} diff --git a/tools/perf/config/feature-checks/test-glibc.c b/tools/perf/config/feature-checks/test-glibc.c new file mode 100644 index 00000000000..b0820345cd9 --- /dev/null +++ b/tools/perf/config/feature-checks/test-glibc.c @@ -0,0 +1,8 @@ +#include <gnu/libc-version.h> + +int main(void) +{ +	const char *version = gnu_get_libc_version(); + +	return (long)version; +} diff --git a/tools/perf/config/feature-checks/test-gtk2-infobar.c b/tools/perf/config/feature-checks/test-gtk2-infobar.c new file mode 100644 index 00000000000..397b4646d06 --- /dev/null +++ b/tools/perf/config/feature-checks/test-gtk2-infobar.c @@ -0,0 +1,11 @@ +#pragma GCC diagnostic ignored "-Wstrict-prototypes" +#include <gtk/gtk.h> +#pragma GCC diagnostic error "-Wstrict-prototypes" + +int main(int argc, char *argv[]) +{ +	gtk_init(&argc, &argv); +	gtk_info_bar_new(); + +	return 0; +} diff --git a/tools/perf/config/feature-checks/test-gtk2.c b/tools/perf/config/feature-checks/test-gtk2.c new file mode 100644 index 00000000000..6bd80e50943 --- /dev/null +++ b/tools/perf/config/feature-checks/test-gtk2.c @@ -0,0 +1,10 @@ +#pragma GCC diagnostic ignored "-Wstrict-prototypes" +#include <gtk/gtk.h> +#pragma GCC diagnostic error "-Wstrict-prototypes" + +int main(int argc, char *argv[]) +{ +	gtk_init(&argc, &argv); + +        return 0; +} diff --git a/tools/perf/config/feature-checks/test-hello.c b/tools/perf/config/feature-checks/test-hello.c new file mode 100644 index 00000000000..c9f398d8786 --- /dev/null +++ b/tools/perf/config/feature-checks/test-hello.c @@ -0,0 +1,6 @@ +#include <stdio.h> + +int main(void) +{ +	return puts("hi"); +} diff --git a/tools/perf/config/feature-checks/test-libaudit.c b/tools/perf/config/feature-checks/test-libaudit.c new file mode 100644 index 00000000000..afc019f0864 --- /dev/null +++ b/tools/perf/config/feature-checks/test-libaudit.c @@ -0,0 +1,10 @@ +#include <libaudit.h> + +extern int printf(const char *format, ...); + +int main(void) +{ +	printf("error message: %s\n", audit_errno_to_name(0)); + +	return audit_open(); +} diff --git a/tools/perf/config/feature-checks/test-libbfd.c b/tools/perf/config/feature-checks/test-libbfd.c new file mode 100644 index 00000000000..24059907e99 --- /dev/null +++ b/tools/perf/config/feature-checks/test-libbfd.c @@ -0,0 +1,15 @@ +#include <bfd.h> + +extern int printf(const char *format, ...); + +int main(void) +{ +	char symbol[4096] = "FieldName__9ClassNameFd"; +	char *tmp; + +	tmp = bfd_demangle(0, symbol, 0); + +	printf("demangled symbol: {%s}\n", tmp); + +	return 0; +} diff --git a/tools/perf/config/feature-checks/test-libdw-dwarf-unwind.c b/tools/perf/config/feature-checks/test-libdw-dwarf-unwind.c new file mode 100644 index 00000000000..f676a3ff442 --- /dev/null +++ b/tools/perf/config/feature-checks/test-libdw-dwarf-unwind.c @@ -0,0 +1,13 @@ + +#include <elfutils/libdwfl.h> + +int main(void) +{ +	/* +	 * This function is guarded via: __nonnull_attribute__ (1, 2). +	 * Passing '1' as arguments value. This code is never executed, +	 * only compiled. +	 */ +	dwfl_thread_getframes((void *) 1, (void *) 1, NULL); +	return 0; +} diff --git a/tools/perf/config/feature-checks/test-libelf-getphdrnum.c b/tools/perf/config/feature-checks/test-libelf-getphdrnum.c new file mode 100644 index 00000000000..d710459306c --- /dev/null +++ b/tools/perf/config/feature-checks/test-libelf-getphdrnum.c @@ -0,0 +1,8 @@ +#include <libelf.h> + +int main(void) +{ +	size_t dst; + +	return elf_getphdrnum(0, &dst); +} diff --git a/tools/perf/config/feature-checks/test-libelf-mmap.c b/tools/perf/config/feature-checks/test-libelf-mmap.c new file mode 100644 index 00000000000..564427d7ef1 --- /dev/null +++ b/tools/perf/config/feature-checks/test-libelf-mmap.c @@ -0,0 +1,8 @@ +#include <libelf.h> + +int main(void) +{ +	Elf *elf = elf_begin(0, ELF_C_READ_MMAP, 0); + +	return (long)elf; +} diff --git a/tools/perf/config/feature-checks/test-libelf.c b/tools/perf/config/feature-checks/test-libelf.c new file mode 100644 index 00000000000..08db322d895 --- /dev/null +++ b/tools/perf/config/feature-checks/test-libelf.c @@ -0,0 +1,8 @@ +#include <libelf.h> + +int main(void) +{ +	Elf *elf = elf_begin(0, ELF_C_READ, 0); + +	return (long)elf; +} diff --git a/tools/perf/config/feature-checks/test-libnuma.c b/tools/perf/config/feature-checks/test-libnuma.c new file mode 100644 index 00000000000..4763d9cd587 --- /dev/null +++ b/tools/perf/config/feature-checks/test-libnuma.c @@ -0,0 +1,9 @@ +#include <numa.h> +#include <numaif.h> + +int main(void) +{ +	numa_available(); + +	return 0; +} diff --git a/tools/perf/config/feature-checks/test-libperl.c b/tools/perf/config/feature-checks/test-libperl.c new file mode 100644 index 00000000000..8871f6a0fdb --- /dev/null +++ b/tools/perf/config/feature-checks/test-libperl.c @@ -0,0 +1,9 @@ +#include <EXTERN.h> +#include <perl.h> + +int main(void) +{ +	perl_alloc(); + +	return 0; +} diff --git a/tools/perf/config/feature-checks/test-libpython-version.c b/tools/perf/config/feature-checks/test-libpython-version.c new file mode 100644 index 00000000000..facea122d81 --- /dev/null +++ b/tools/perf/config/feature-checks/test-libpython-version.c @@ -0,0 +1,10 @@ +#include <Python.h> + +#if PY_VERSION_HEX >= 0x03000000 +	#error +#endif + +int main(void) +{ +	return 0; +} diff --git a/tools/perf/config/feature-checks/test-libpython.c b/tools/perf/config/feature-checks/test-libpython.c new file mode 100644 index 00000000000..b24b28ad632 --- /dev/null +++ b/tools/perf/config/feature-checks/test-libpython.c @@ -0,0 +1,8 @@ +#include <Python.h> + +int main(void) +{ +	Py_Initialize(); + +	return 0; +} diff --git a/tools/perf/config/feature-checks/test-libslang.c b/tools/perf/config/feature-checks/test-libslang.c new file mode 100644 index 00000000000..22ff22ed94d --- /dev/null +++ b/tools/perf/config/feature-checks/test-libslang.c @@ -0,0 +1,6 @@ +#include <slang.h> + +int main(void) +{ +	return SLsmg_init_smg(); +} diff --git a/tools/perf/config/feature-checks/test-libunwind-debug-frame.c b/tools/perf/config/feature-checks/test-libunwind-debug-frame.c new file mode 100644 index 00000000000..0ef8087a104 --- /dev/null +++ b/tools/perf/config/feature-checks/test-libunwind-debug-frame.c @@ -0,0 +1,16 @@ +#include <libunwind.h> +#include <stdlib.h> + +extern int +UNW_OBJ(dwarf_find_debug_frame) (int found, unw_dyn_info_t *di_debug, +				 unw_word_t ip, unw_word_t segbase, +				 const char *obj_name, unw_word_t start, +				 unw_word_t end); + +#define dwarf_find_debug_frame UNW_OBJ(dwarf_find_debug_frame) + +int main(void) +{ +	dwarf_find_debug_frame(0, NULL, 0, 0, NULL, 0, 0); +	return 0; +} diff --git a/tools/perf/config/feature-checks/test-libunwind.c b/tools/perf/config/feature-checks/test-libunwind.c new file mode 100644 index 00000000000..43b9369bcab --- /dev/null +++ b/tools/perf/config/feature-checks/test-libunwind.c @@ -0,0 +1,27 @@ +#include <libunwind.h> +#include <stdlib.h> + +extern int UNW_OBJ(dwarf_search_unwind_table) (unw_addr_space_t as, +                                      unw_word_t ip, +                                      unw_dyn_info_t *di, +                                      unw_proc_info_t *pi, +                                      int need_unwind_info, void *arg); + + +#define dwarf_search_unwind_table UNW_OBJ(dwarf_search_unwind_table) + +static unw_accessors_t accessors; + +int main(void) +{ +	unw_addr_space_t addr_space; + +	addr_space = unw_create_addr_space(&accessors, 0); +	if (addr_space) +		return 0; + +	unw_init_remote(NULL, addr_space, NULL); +	dwarf_search_unwind_table(addr_space, 0, NULL, NULL, 0, NULL); + +	return 0; +} diff --git a/tools/perf/config/feature-checks/test-stackprotector-all.c b/tools/perf/config/feature-checks/test-stackprotector-all.c new file mode 100644 index 00000000000..c9f398d8786 --- /dev/null +++ b/tools/perf/config/feature-checks/test-stackprotector-all.c @@ -0,0 +1,6 @@ +#include <stdio.h> + +int main(void) +{ +	return puts("hi"); +} diff --git a/tools/perf/config/feature-checks/test-timerfd.c b/tools/perf/config/feature-checks/test-timerfd.c new file mode 100644 index 00000000000..8c5c083b4d3 --- /dev/null +++ b/tools/perf/config/feature-checks/test-timerfd.c @@ -0,0 +1,18 @@ +/* + * test for timerfd functions used by perf-kvm-stat-live + */ +#include <sys/timerfd.h> + +int main(void) +{ +	struct itimerspec new_value; + +	int fd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK); +	if (fd < 0) +		return 1; + +	if (timerfd_settime(fd, 0, &new_value, NULL) != 0) +		return 1; + +	return 0; +}  | 
