clang-test.cpp (1404B)
1// SPDX-License-Identifier: GPL-2.0 2#include "clang.h" 3#include "clang-c.h" 4extern "C" { 5#include "../util.h" 6} 7#include "llvm/IR/Function.h" 8#include "llvm/IR/LLVMContext.h" 9 10#include <tests/llvm.h> 11#include <string> 12 13class perf_clang_scope { 14public: 15 explicit perf_clang_scope() {perf_clang__init();} 16 ~perf_clang_scope() {perf_clang__cleanup();} 17}; 18 19static std::unique_ptr<llvm::Module> 20__test__clang_to_IR(void) 21{ 22 unsigned int kernel_version; 23 24 if (fetch_kernel_version(&kernel_version, NULL, 0)) 25 return std::unique_ptr<llvm::Module>(nullptr); 26 27 std::string cflag_kver("-DLINUX_VERSION_CODE=" + 28 std::to_string(kernel_version)); 29 30 std::unique_ptr<llvm::Module> M = 31 perf::getModuleFromSource({cflag_kver.c_str()}, 32 "perf-test.c", 33 test_llvm__bpf_base_prog); 34 return M; 35} 36 37extern "C" { 38int test__clang_to_IR(struct test_suite *test __maybe_unused, 39 int subtest __maybe_unused) 40{ 41 perf_clang_scope _scope; 42 43 auto M = __test__clang_to_IR(); 44 if (!M) 45 return -1; 46 for (llvm::Function& F : *M) 47 if (F.getName() == "bpf_func__SyS_epoll_pwait") 48 return 0; 49 return -1; 50} 51 52int test__clang_to_obj(struct test_suite *test __maybe_unused, 53 int subtest __maybe_unused) 54{ 55 perf_clang_scope _scope; 56 57 auto M = __test__clang_to_IR(); 58 if (!M) 59 return -1; 60 61 auto Buffer = perf::getBPFObjectFromModule(&*M); 62 if (!Buffer) 63 return -1; 64 return 0; 65} 66 67}