Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v4.6-rc3 170 lines 4.0 kB view raw
1#include <stdio.h> 2#include <bpf/libbpf.h> 3#include <util/llvm-utils.h> 4#include <util/cache.h> 5#include "llvm.h" 6#include "tests.h" 7#include "debug.h" 8 9#ifdef HAVE_LIBBPF_SUPPORT 10static int test__bpf_parsing(void *obj_buf, size_t obj_buf_sz) 11{ 12 struct bpf_object *obj; 13 14 obj = bpf_object__open_buffer(obj_buf, obj_buf_sz, NULL); 15 if (IS_ERR(obj)) 16 return TEST_FAIL; 17 bpf_object__close(obj); 18 return TEST_OK; 19} 20#else 21static int test__bpf_parsing(void *obj_buf __maybe_unused, 22 size_t obj_buf_sz __maybe_unused) 23{ 24 pr_debug("Skip bpf parsing\n"); 25 return TEST_OK; 26} 27#endif 28 29static struct { 30 const char *source; 31 const char *desc; 32 bool should_load_fail; 33} bpf_source_table[__LLVM_TESTCASE_MAX] = { 34 [LLVM_TESTCASE_BASE] = { 35 .source = test_llvm__bpf_base_prog, 36 .desc = "Basic BPF llvm compiling test", 37 }, 38 [LLVM_TESTCASE_KBUILD] = { 39 .source = test_llvm__bpf_test_kbuild_prog, 40 .desc = "Test kbuild searching", 41 }, 42 [LLVM_TESTCASE_BPF_PROLOGUE] = { 43 .source = test_llvm__bpf_test_prologue_prog, 44 .desc = "Compile source for BPF prologue generation test", 45 }, 46 [LLVM_TESTCASE_BPF_RELOCATION] = { 47 .source = test_llvm__bpf_test_relocation, 48 .desc = "Compile source for BPF relocation test", 49 .should_load_fail = true, 50 }, 51}; 52 53int 54test_llvm__fetch_bpf_obj(void **p_obj_buf, 55 size_t *p_obj_buf_sz, 56 enum test_llvm__testcase idx, 57 bool force, 58 bool *should_load_fail) 59{ 60 const char *source; 61 const char *desc; 62 const char *tmpl_old, *clang_opt_old; 63 char *tmpl_new = NULL, *clang_opt_new = NULL; 64 int err, old_verbose, ret = TEST_FAIL; 65 66 if (idx >= __LLVM_TESTCASE_MAX) 67 return TEST_FAIL; 68 69 source = bpf_source_table[idx].source; 70 desc = bpf_source_table[idx].desc; 71 if (should_load_fail) 72 *should_load_fail = bpf_source_table[idx].should_load_fail; 73 74 /* 75 * Skip this test if user's .perfconfig doesn't set [llvm] section 76 * and clang is not found in $PATH, and this is not perf test -v 77 */ 78 if (!force && (verbose == 0 && 79 !llvm_param.user_set_param && 80 llvm__search_clang())) { 81 pr_debug("No clang and no verbosive, skip this test\n"); 82 return TEST_SKIP; 83 } 84 85 /* 86 * llvm is verbosity when error. Suppress all error output if 87 * not 'perf test -v'. 88 */ 89 old_verbose = verbose; 90 if (verbose == 0) 91 verbose = -1; 92 93 *p_obj_buf = NULL; 94 *p_obj_buf_sz = 0; 95 96 if (!llvm_param.clang_bpf_cmd_template) 97 goto out; 98 99 if (!llvm_param.clang_opt) 100 llvm_param.clang_opt = strdup(""); 101 102 err = asprintf(&tmpl_new, "echo '%s' | %s%s", source, 103 llvm_param.clang_bpf_cmd_template, 104 old_verbose ? "" : " 2>/dev/null"); 105 if (err < 0) 106 goto out; 107 err = asprintf(&clang_opt_new, "-xc %s", llvm_param.clang_opt); 108 if (err < 0) 109 goto out; 110 111 tmpl_old = llvm_param.clang_bpf_cmd_template; 112 llvm_param.clang_bpf_cmd_template = tmpl_new; 113 clang_opt_old = llvm_param.clang_opt; 114 llvm_param.clang_opt = clang_opt_new; 115 116 err = llvm__compile_bpf("-", p_obj_buf, p_obj_buf_sz); 117 118 llvm_param.clang_bpf_cmd_template = tmpl_old; 119 llvm_param.clang_opt = clang_opt_old; 120 121 verbose = old_verbose; 122 if (err) 123 goto out; 124 125 ret = TEST_OK; 126out: 127 free(tmpl_new); 128 free(clang_opt_new); 129 if (ret != TEST_OK) 130 pr_debug("Failed to compile test case: '%s'\n", desc); 131 return ret; 132} 133 134int test__llvm(int subtest) 135{ 136 int ret; 137 void *obj_buf = NULL; 138 size_t obj_buf_sz = 0; 139 bool should_load_fail = false; 140 141 if ((subtest < 0) || (subtest >= __LLVM_TESTCASE_MAX)) 142 return TEST_FAIL; 143 144 ret = test_llvm__fetch_bpf_obj(&obj_buf, &obj_buf_sz, 145 subtest, false, &should_load_fail); 146 147 if (ret == TEST_OK && !should_load_fail) { 148 ret = test__bpf_parsing(obj_buf, obj_buf_sz); 149 if (ret != TEST_OK) { 150 pr_debug("Failed to parse test case '%s'\n", 151 bpf_source_table[subtest].desc); 152 } 153 } 154 free(obj_buf); 155 156 return ret; 157} 158 159int test__llvm_subtest_get_nr(void) 160{ 161 return __LLVM_TESTCASE_MAX; 162} 163 164const char *test__llvm_subtest_get_desc(int subtest) 165{ 166 if ((subtest < 0) || (subtest >= __LLVM_TESTCASE_MAX)) 167 return NULL; 168 169 return bpf_source_table[subtest].desc; 170}