#include "c++/clang-c.h"
 #include <linux/kernel.h>
 
-static struct {
-       int (*func)(void);
-       const char *desc;
-} clang_testcase_table[] = {
-#ifdef HAVE_LIBCLANGLLVM_SUPPORT
-       {
-               .func = test__clang_to_IR,
-               .desc = "builtin clang compile C source to IR",
-       },
-       {
-               .func = test__clang_to_obj,
-               .desc = "builtin clang compile C source to ELF object",
-       },
-#endif
-};
-
-static int test__clang_subtest_get_nr(void)
-{
-       return (int)ARRAY_SIZE(clang_testcase_table);
-}
-
-static const char *test__clang_subtest_get_desc(int i)
-{
-       if (i < 0 || i >= (int)ARRAY_SIZE(clang_testcase_table))
-               return NULL;
-       return clang_testcase_table[i].desc;
-}
-
 #ifndef HAVE_LIBCLANGLLVM_SUPPORT
-static int test__clang(struct test_suite *test __maybe_unused, int i __maybe_unused)
+static int test__clang_to_IR(struct test_suite *test __maybe_unused,
+                            int subtest __maybe_unused)
 {
        return TEST_SKIP;
 }
-#else
-static int test__clang(struct test_suite *test __maybe_unused, int i)
+
+static int test__clang_to_obj(struct test_suite *test __maybe_unused,
+                             int subtest __maybe_unused)
 {
-       if (i < 0 || i >= (int)ARRAY_SIZE(clang_testcase_table))
-               return TEST_FAIL;
-       return clang_testcase_table[i].func();
+       return TEST_SKIP;
 }
 #endif
 
+static struct test_case clang_tests[] = {
+       TEST_CASE_REASON("builtin clang compile C source to IR", clang_to_IR,
+                        "not compiled in"),
+       TEST_CASE_REASON("builtin clang compile C source to ELF object",
+                        clang_to_obj,
+                        "not compiled in"),
+       { .name = NULL, }
+};
+
 struct test_suite suite__clang = {
        .desc = "builtin clang support",
-       .func = test__clang,
-       .subtest = {
-               .skip_if_fail   = true,
-               .get_nr         = test__clang_subtest_get_nr,
-               .get_desc       = test__clang_subtest_get_desc,
-       }
+       .test_cases = clang_tests,
+       .subtest = { .skip_if_fail = true, },
 };
 
 extern void perf_clang__init(void);
 extern void perf_clang__cleanup(void);
 
-extern int test__clang_to_IR(void);
-extern int test__clang_to_obj(void);
+struct test_suite;
+extern int test__clang_to_IR(struct test_suite *test, int subtest);
+extern int test__clang_to_obj(struct test_suite *test, int subtest);
 
 extern int perf_clang__compile_bpf(const char *filename,
                                   void **p_obj_buf,
 static inline void perf_clang__init(void) { }
 static inline void perf_clang__cleanup(void) { }
 
-static inline int test__clang_to_IR(void) { return -1; }
-static inline int test__clang_to_obj(void) { return -1;}
-
 static inline int
 perf_clang__compile_bpf(const char *filename __maybe_unused,
                        void **p_obj_buf __maybe_unused,