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