1 /*
   2  * This file and its contents are supplied under the terms of the
   3  * Common Development and Distribution License ("CDDL"), version 1.0.
   4  * You may only use this file in accordance with the terms of version
   5  * 1.0 of the CDDL.
   6  *
   7  * A full copy of the text of the CDDL should have accompanied this
   8  * source.  A copy of the CDDL is also available via the Internet at
   9  * http://www.illumos.org/license/CDDL.
  10  */
  11 
  12 /*
  13  * Copyright 2019 Joyent, Inc.
  14  */
  15 
  16 #ifndef _DEMANGLE_TEST_H
  17 #define _DEMANGLE_TEST_H
  18 
  19 #include <demangle-sys.h>
  20 #include <sys/linker_set.h>
  21 
  22 #ifdef __cplusplus
  23 extern "C" {
  24 #endif
  25 
  26 typedef struct demtest_case {
  27         const char *dtc_mangled;
  28         const char *dtc_demangled;
  29 } demtest_case_t;
  30 
  31 typedef struct demtest_group {
  32         sysdem_lang_t   dtg_lang;
  33         const char      *dtg_name;
  34         demtest_case_t  dtg_tests[];
  35 } demtest_group_t;
  36 
  37 #define T(_m, _d) { .dtc_mangled = _m, .dtc_demangled = _d }
  38 #define T_ERR(_m) { .dtc_mangled = _m }
  39 
  40 #define GROUP(_name, _lang, ...)                \
  41         static demtest_group_t _name = {        \
  42                 .dtg_name = #_name,             \
  43                 .dtg_lang = _lang,              \
  44                 .dtg_tests = {                  \
  45                         __VA_ARGS__,            \
  46                         { NULL, NULL }          \
  47                 }                               \
  48         };                                      \
  49         DATA_SET(demangle_tests, _name)
  50 
  51 /*
  52  * Some things (e.g. the C++ mangled names with floating point constants)
  53  * can produce multiple acceptable outputs.
  54  */
  55 typedef struct demtest_mcase {
  56         const char *dtmc_mangled;
  57         const char **dtmc_demangled;
  58 } demtest_mcase_t;
  59 
  60 typedef struct demtest_mgroup {
  61         sysdem_lang_t   dtmg_lang;
  62         const char      *dtmg_name;
  63         demtest_mcase_t *dtmg_tests[];
  64 } demtest_mgroup_t;
  65 
  66 #define TM(_m, ...) &(demtest_mcase_t){             \
  67         .dtmc_mangled = _m,                     \
  68         .dtmc_demangled = (const char *[]){     \
  69                 __VA_ARGS__,                    \
  70                 NULL                            \
  71         }                                       \
  72 }
  73 
  74 #define MGROUP(_name, _lang, ...)               \
  75         static demtest_mgroup_t _name = {       \
  76                 .dtmg_name = #_name,            \
  77                 .dtmg_lang = _lang,             \
  78                 .dtmg_tests = {                 \
  79                         __VA_ARGS__,            \
  80                         NULL                    \
  81                 }                               \
  82         };                                      \
  83         DATA_SET(demangle_mtests, _name)
  84 
  85 #ifdef __cplusplus
  86 }
  87 #endif
  88 
  89 #endif /* _DEMANGLE_TEST_H */