18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci#include "clang.h" 38c2ecf20Sopenharmony_ci#include "clang-c.h" 48c2ecf20Sopenharmony_ciextern "C" { 58c2ecf20Sopenharmony_ci#include "../util.h" 68c2ecf20Sopenharmony_ci} 78c2ecf20Sopenharmony_ci#include "llvm/IR/Function.h" 88c2ecf20Sopenharmony_ci#include "llvm/IR/LLVMContext.h" 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#include <tests/llvm.h> 118c2ecf20Sopenharmony_ci#include <string> 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ciclass perf_clang_scope { 148c2ecf20Sopenharmony_cipublic: 158c2ecf20Sopenharmony_ci explicit perf_clang_scope() {perf_clang__init();} 168c2ecf20Sopenharmony_ci ~perf_clang_scope() {perf_clang__cleanup();} 178c2ecf20Sopenharmony_ci}; 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_cistatic std::unique_ptr<llvm::Module> 208c2ecf20Sopenharmony_ci__test__clang_to_IR(void) 218c2ecf20Sopenharmony_ci{ 228c2ecf20Sopenharmony_ci unsigned int kernel_version; 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci if (fetch_kernel_version(&kernel_version, NULL, 0)) 258c2ecf20Sopenharmony_ci return std::unique_ptr<llvm::Module>(nullptr); 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci std::string cflag_kver("-DLINUX_VERSION_CODE=" + 288c2ecf20Sopenharmony_ci std::to_string(kernel_version)); 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci std::unique_ptr<llvm::Module> M = 318c2ecf20Sopenharmony_ci perf::getModuleFromSource({cflag_kver.c_str()}, 328c2ecf20Sopenharmony_ci "perf-test.c", 338c2ecf20Sopenharmony_ci test_llvm__bpf_base_prog); 348c2ecf20Sopenharmony_ci return M; 358c2ecf20Sopenharmony_ci} 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ciextern "C" { 388c2ecf20Sopenharmony_ciint test__clang_to_IR(void) 398c2ecf20Sopenharmony_ci{ 408c2ecf20Sopenharmony_ci perf_clang_scope _scope; 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci auto M = __test__clang_to_IR(); 438c2ecf20Sopenharmony_ci if (!M) 448c2ecf20Sopenharmony_ci return -1; 458c2ecf20Sopenharmony_ci for (llvm::Function& F : *M) 468c2ecf20Sopenharmony_ci if (F.getName() == "bpf_func__SyS_epoll_pwait") 478c2ecf20Sopenharmony_ci return 0; 488c2ecf20Sopenharmony_ci return -1; 498c2ecf20Sopenharmony_ci} 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ciint test__clang_to_obj(void) 528c2ecf20Sopenharmony_ci{ 538c2ecf20Sopenharmony_ci perf_clang_scope _scope; 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci auto M = __test__clang_to_IR(); 568c2ecf20Sopenharmony_ci if (!M) 578c2ecf20Sopenharmony_ci return -1; 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_ci auto Buffer = perf::getBPFObjectFromModule(&*M); 608c2ecf20Sopenharmony_ci if (!Buffer) 618c2ecf20Sopenharmony_ci return -1; 628c2ecf20Sopenharmony_ci return 0; 638c2ecf20Sopenharmony_ci} 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_ci} 66