| // SPDX-License-Identifier: GPL-2.0 |
| #include "clang.h" |
| #include "clang-c.h" |
| #include "llvm/IR/Function.h" |
| #include "llvm/IR/LLVMContext.h" |
| |
| #include <util-cxx.h> |
| #include <tests/llvm.h> |
| #include <string> |
| |
| class perf_clang_scope { |
| public: |
| explicit perf_clang_scope() {perf_clang__init();} |
| ~perf_clang_scope() {perf_clang__cleanup();} |
| }; |
| |
| static std::unique_ptr<llvm::Module> |
| __test__clang_to_IR(void) |
| { |
| unsigned int kernel_version; |
| |
| if (fetch_kernel_version(&kernel_version, NULL, 0)) |
| return std::unique_ptr<llvm::Module>(nullptr); |
| |
| std::string cflag_kver("-DLINUX_VERSION_CODE=" + |
| std::to_string(kernel_version)); |
| |
| std::unique_ptr<llvm::Module> M = |
| perf::getModuleFromSource({cflag_kver.c_str()}, |
| "perf-test.c", |
| test_llvm__bpf_base_prog); |
| return M; |
| } |
| |
| extern "C" { |
| int test__clang_to_IR(void) |
| { |
| perf_clang_scope _scope; |
| |
| auto M = __test__clang_to_IR(); |
| if (!M) |
| return -1; |
| for (llvm::Function& F : *M) |
| if (F.getName() == "bpf_func__SyS_epoll_pwait") |
| return 0; |
| return -1; |
| } |
| |
| int test__clang_to_obj(void) |
| { |
| perf_clang_scope _scope; |
| |
| auto M = __test__clang_to_IR(); |
| if (!M) |
| return -1; |
| |
| auto Buffer = perf::getBPFObjectFromModule(&*M); |
| if (!Buffer) |
| return -1; |
| return 0; |
| } |
| |
| } |