text: #ifndef _CILTUT_H_
  #define _CILTUT_H_
  
  #include <stdio.h>
  #include <stdint.h>
  #include <unistd.h>
  
  #define CONSTRUCTOR __attribute__((constructor))
  
  
  #define ExactRGB(r,g,b) __attribute__((ExactRGB((r),(g),(b))))
  #define LowerRGB(r,g,b) __attribute__((LowerRGB((r),(g),(b))))
  #define UpperRGB(r,g,b) __attribute__((UpperRGB((r),(g),(b))))
  
  #define AddRGB(x,r,g,b) (typeof(x) ExactRGB(r,g,b))x
  
  
  #define red   __attribute__((red))
  #define green __attribute__((green))
  #define blue  __attribute__((blue))
  #define AddColor(c,x) (typeof(x) c)x
  
  
  #define cache_report if((void *__attribute__((cache_report)))0)
  
  
  #define invariant(c,i,...) __blockattribute__((invariant((c),(i),__VA_ARGS__)))
  #define post(c) __attribute__((post((c))))
  #define pre(c)  __attribute__((pre((c))))
  
  void *checked_dlsym(void *handle, const char *sym);
  pid_t gettid();
  
  void perf_init(pid_t pid);
  uint64_t perf_get_cache_refs();
  uint64_t perf_get_cache_miss();
  void perf_deinit();
  uint64_t tut_get_time();
  
  
  void toggle_lock_tracking();
  
  #include <getopt.h>
  size_t s;
  struct option o;
  
  #ifdef __CILTUT__
  #pragma cilnoremove("getoptdummy")
  #endif
  static inline int getoptdummy()
  {
    int i;
    optarg = NULL;
    sscanf(NULL,"%d",&i);
    return getopt_long(0, NULL, NULL, NULL, NULL);
  }
  
  #define ARG_HAS_OPT 1
  
  #define argument(argtype, argname, ...) \
  argtype argname; \
  int argname##got; \
  struct ciltut_##argname { \
    char    *short_form; \
    char    *help_text; \
    char    *format; \
    argtype  def; \
    void    *requires; \
    int      has_opt; \
  } __attribute__((ciltutarg, ##__VA_ARGS__)) _ciltut_##argname =
  
  #define arg_assert(e) (void *__attribute__((ciltut_assert((e)))))0
  
  
  #define autotest    __attribute__((autotest))
  #define instrument  __attribute__((instrument))
  #define input       __attribute__((input))
  #define inputarr(s) __attribute__((inputarr(s)))
  #define inputnt     __attribute__((inputnt))
  
  void assign(uint64_t lhs, uint64_t op, int opk, uint64_t opv);
  void assgn_bop(uint64_t lhs, uint64_t lhsv, int bop,
                 uint64_t op1, int op1k, uint64_t op1v,
                 uint64_t op2, int op2k, uint64_t op2v);
  void assgn_uop(uint64_t lhs, uint64_t lhsv, int uop,
                 uint64_t op, int opk, uint64_t opv);
  
  void cond(int cid, int r, uint64_t op, int opk, uint64_t opv);
  void cond_bop(int cid, int bop, int r,
                uint64_t op1, int op1k, uint64_t op1v,
                uint64_t op2, int op2k, uint64_t op2v);
  void cond_uop(int cid, int uop, int r,
                uint64_t op, int opk, uint64_t opv);
  
  void register_input(char *name, uint64_t addr, int bits);
  void register_arr_input(char *name, uint64_t start, int sz, int cnt);
  void register_nt_input(char *name, char *start);
  
  #ifdef __CILTUT__
  #pragma cilnoremove("autotest_finished")
  #endif
  extern int autotest_finished;
  void gen_new_input();
  
  void val_push(uint64_t v);
  uint64_t val_pop(char *name);
  void pop_array(char *name, char *base, int cnt, int sz);
  void pop_nt(char * name, char *base);
  
  void return_push(uint64_t p, uint64_t v);
  void return_pop(uint64_t p, uint64_t v);
  
  void autotest_reset();
  
  #endif 
  
  
  