mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-10-31 16:54:21 +00:00 
			
		
		
		
	perf clang: Update test case to use real BPF script
Allow C++ code to use util.h and tests/llvm.h. Let 'perf test' compile a real BPF script. Signed-off-by: Wang Nan <wangnan0@huawei.com> Cc: Alexei Starovoitov <ast@fb.com> Cc: He Kuang <hekuang@huawei.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Joe Stringer <joe@ovn.org> Cc: Zefan Li <lizefan@huawei.com> Cc: pi3orama@163.com Link: http://lkml.kernel.org/r/20161126070354.141764-14-wangnan0@huawei.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
		
							parent
							
								
									a9495fe9dc
								
							
						
					
					
						commit
						e67d52d411
					
				
					 4 changed files with 62 additions and 15 deletions
				
			
		|  | @ -212,24 +212,27 @@ ifeq ($(DEBUG),0) | ||||||
|   endif |   endif | ||||||
| endif | endif | ||||||
| 
 | 
 | ||||||
| CFLAGS += -I$(src-perf)/util/include | INC_FLAGS += -I$(src-perf)/util/include | ||||||
| CFLAGS += -I$(src-perf)/arch/$(ARCH)/include | INC_FLAGS += -I$(src-perf)/arch/$(ARCH)/include | ||||||
| CFLAGS += -I$(srctree)/tools/include/uapi | INC_FLAGS += -I$(srctree)/tools/include/uapi | ||||||
| CFLAGS += -I$(srctree)/tools/include/ | INC_FLAGS += -I$(srctree)/tools/include/ | ||||||
| CFLAGS += -I$(srctree)/tools/arch/$(ARCH)/include/uapi | INC_FLAGS += -I$(srctree)/tools/arch/$(ARCH)/include/uapi | ||||||
| CFLAGS += -I$(srctree)/tools/arch/$(ARCH)/include/ | INC_FLAGS += -I$(srctree)/tools/arch/$(ARCH)/include/ | ||||||
| CFLAGS += -I$(srctree)/tools/arch/$(ARCH)/ | INC_FLAGS += -I$(srctree)/tools/arch/$(ARCH)/ | ||||||
| 
 | 
 | ||||||
| # $(obj-perf)      for generated common-cmds.h | # $(obj-perf)      for generated common-cmds.h | ||||||
| # $(obj-perf)/util for generated bison/flex headers | # $(obj-perf)/util for generated bison/flex headers | ||||||
| ifneq ($(OUTPUT),) | ifneq ($(OUTPUT),) | ||||||
| CFLAGS += -I$(obj-perf)/util | INC_FLAGS += -I$(obj-perf)/util | ||||||
| CFLAGS += -I$(obj-perf) | INC_FLAGS += -I$(obj-perf) | ||||||
| endif | endif | ||||||
| 
 | 
 | ||||||
| CFLAGS += -I$(src-perf)/util | INC_FLAGS += -I$(src-perf)/util | ||||||
| CFLAGS += -I$(src-perf) | INC_FLAGS += -I$(src-perf) | ||||||
| CFLAGS += -I$(srctree)/tools/lib/ | INC_FLAGS += -I$(srctree)/tools/lib/ | ||||||
|  | 
 | ||||||
|  | CFLAGS   += $(INC_FLAGS) | ||||||
|  | CXXFLAGS += $(INC_FLAGS) | ||||||
| 
 | 
 | ||||||
| CFLAGS += -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE | CFLAGS += -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,6 +1,10 @@ | ||||||
| #ifndef PERF_TEST_LLVM_H | #ifndef PERF_TEST_LLVM_H | ||||||
| #define PERF_TEST_LLVM_H | #define PERF_TEST_LLVM_H | ||||||
| 
 | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| #include <stddef.h> /* for size_t */ | #include <stddef.h> /* for size_t */ | ||||||
| #include <stdbool.h> /* for bool */ | #include <stdbool.h> /* for bool */ | ||||||
| 
 | 
 | ||||||
|  | @ -20,4 +24,7 @@ enum test_llvm__testcase { | ||||||
| int test_llvm__fetch_bpf_obj(void **p_obj_buf, size_t *p_obj_buf_sz, | int test_llvm__fetch_bpf_obj(void **p_obj_buf, size_t *p_obj_buf_sz, | ||||||
| 			     enum test_llvm__testcase index, bool force, | 			     enum test_llvm__testcase index, bool force, | ||||||
| 			     bool *should_load_fail); | 			     bool *should_load_fail); | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } | ||||||
|  | #endif | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | @ -3,6 +3,10 @@ | ||||||
| #include "llvm/IR/Function.h" | #include "llvm/IR/Function.h" | ||||||
| #include "llvm/IR/LLVMContext.h" | #include "llvm/IR/LLVMContext.h" | ||||||
| 
 | 
 | ||||||
|  | #include <util-cxx.h> | ||||||
|  | #include <tests/llvm.h> | ||||||
|  | #include <string> | ||||||
|  | 
 | ||||||
| class perf_clang_scope { | class perf_clang_scope { | ||||||
| public: | public: | ||||||
| 	explicit perf_clang_scope() {perf_clang__init();} | 	explicit perf_clang_scope() {perf_clang__init();} | ||||||
|  | @ -14,17 +18,24 @@ extern "C" { | ||||||
| int test__clang_to_IR(void) | int test__clang_to_IR(void) | ||||||
| { | { | ||||||
| 	perf_clang_scope _scope; | 	perf_clang_scope _scope; | ||||||
|  | 	unsigned int kernel_version; | ||||||
|  | 
 | ||||||
|  | 	if (fetch_kernel_version(&kernel_version, NULL, 0)) | ||||||
|  | 		return -1; | ||||||
|  | 
 | ||||||
|  | 	std::string cflag_kver("-DLINUX_VERSION_CODE=" + | ||||||
|  | 				std::to_string(kernel_version)); | ||||||
| 
 | 
 | ||||||
| 	std::unique_ptr<llvm::Module> M = | 	std::unique_ptr<llvm::Module> M = | ||||||
| 		perf::getModuleFromSource({"-DRESULT=1"}, | 		perf::getModuleFromSource({cflag_kver.c_str()}, | ||||||
| 					  "perf-test.c", | 					  "perf-test.c", | ||||||
| 					  "int myfunc(void) {return RESULT;}"); | 					  test_llvm__bpf_base_prog); | ||||||
| 
 | 
 | ||||||
| 	if (!M) | 	if (!M) | ||||||
| 		return -1; | 		return -1; | ||||||
| 
 | 
 | ||||||
| 	for (llvm::Function& F : *M) | 	for (llvm::Function& F : *M) | ||||||
| 		if (F.getName() == "myfunc") | 		if (F.getName() == "bpf_func__SyS_epoll_wait") | ||||||
| 			return 0; | 			return 0; | ||||||
| 	return -1; | 	return -1; | ||||||
| } | } | ||||||
|  |  | ||||||
							
								
								
									
										26
									
								
								tools/perf/util/util-cxx.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								tools/perf/util/util-cxx.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,26 @@ | ||||||
|  | /*
 | ||||||
|  |  * Support C++ source use utilities defined in util.h | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #ifndef PERF_UTIL_UTIL_CXX_H | ||||||
|  | #define PERF_UTIL_UTIL_CXX_H | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Now 'new' is the only C++ keyword found in util.h: | ||||||
|  |  * in tools/include/linux/rbtree.h | ||||||
|  |  * | ||||||
|  |  * Other keywords, like class and delete, should be | ||||||
|  |  * redefined if necessary. | ||||||
|  |  */ | ||||||
|  | #define new _new | ||||||
|  | #include "util.h" | ||||||
|  | #undef new | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Wang Nan
						Wang Nan