_ZN3hog15compileBootCodeERN6hobbes2ccE:
    9|      1|void compileBootCode(hobbes::cc& ctx) {
   10|      2|  for (size_t i = 0; module_defs[i] != nullptr; ++i) {
  ------------------
  |  Branch (10:22): [True: 1, False: 1]
  ------------------
   11|      1|    hobbes::compile(&ctx, ctx.readModule(std::string(reinterpret_cast<const char*>(module_defs[i]), module_lens[i])));
   12|      1|  }
   13|      1|}

_ZN3hog13hstoreCanReadERN6hobbes7storage11TransactionEl:
   11|  90.0k|bool hstoreCanRead(storage::Transaction& txn, long n) {
   12|       |  // a negative count must never reach Transaction::canRead as a size_t: cast
   13|       |  // here it would wrap to a huge value (STRFR-433920)
   14|  90.0k|  return n >= 0 && txn.canRead(static_cast<size_t>(n));
  ------------------
  |  Branch (14:10): [True: 89.6k, False: 407]
  |  Branch (14:20): [True: 62.0k, False: 27.5k]
  ------------------
   15|  90.0k|}
_ZN3hog16hstoreUnsafeReadERN6hobbes7storage11TransactionEl:
   17|  42.2k|const uint8_t* hstoreUnsafeRead(storage::Transaction& txn, long n) {
   18|  42.2k|  if (n < 0) {
  ------------------
  |  Branch (18:7): [True: 0, False: 42.2k]
  ------------------
   19|      0|    throw std::runtime_error("hstoreUnsafeRead: negative count");
   20|      0|  }
   21|  42.2k|  const auto *p = txn.ptr();
   22|  42.2k|  txn.skip(static_cast<size_t>(n));
   23|  42.2k|  return p;
   24|  42.2k|}
_ZN3hog26hstoreUnsafeReadFixedArrayERN6hobbes7storage11TransactionEll:
   26|  5.58k|const uint8_t* hstoreUnsafeReadFixedArray(storage::Transaction& txn, long bytes, long asIfLen) {
   27|  5.58k|  if (bytes < 0 || asIfLen < 0) {
  ------------------
  |  Branch (27:7): [True: 0, False: 5.58k]
  |  Branch (27:20): [True: 0, False: 5.58k]
  ------------------
   28|      0|    throw std::runtime_error("hstoreUnsafeReadFixedArray: negative length");
   29|      0|  }
   30|  5.58k|  array<uint8_t>* result = makeArray<uint8_t>(bytes);
   31|  5.58k|  result->size = asIfLen;
   32|       |
   33|  5.58k|  memcpy(result->data, txn.ptr(), bytes);
   34|  5.58k|  txn.skip(static_cast<size_t>(bytes));
   35|  5.58k|  return reinterpret_cast<const uint8_t*>(result);
   36|  5.58k|}

LLVMFuzzerTestOneInput:
   77|      1|extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
   78|      1|  const auto &fns = readers(); // first call pays the one-time JIT cost
   79|       |
   80|       |  // The readers allocate what they read -- arrays, strings -- out of the
   81|       |  // thread-local expression pool, which hobbes reclaims by resetting at a
   82|       |  // transaction boundary rather than by freeing each value. The dispatch loop
   83|       |  // below is modelled on initStorageSession in bin/hog/session.C, and that is
   84|       |  // where session.C resets it: once per transaction, after the loop. Without
   85|       |  // the same reset here every input's allocations stay live for the rest of
   86|       |  // the process, so the harness grows without bound and is eventually killed
   87|       |  // for it -- an artifact of the harness, reported against a target whose
   88|       |  // actual subject is memory *safety*.
   89|       |  //
   90|       |  // Scoped rather than a call after the loop, because a reader that throws on
   91|       |  // malformed input is the common case here, not the exceptional one, and the
   92|       |  // allocations it made before throwing need reclaiming just the same.
   93|      1|  scoped_pool_reset resetPool;
   94|       |
   95|      1|  try {
   96|      1|    storage::Transaction txn(data, size);
   97|       |    // mirrors the dispatch loop in bin/hog/session.C's initStorageSession:
   98|       |    // read a uint32 id, run the reader picked out for it, repeat
   99|  33.4k|    while (txn.canRead(sizeof(uint32_t))) {
  ------------------
  |  Branch (99:12): [True: 33.4k, False: 1]
  ------------------
  100|  33.4k|      uint32_t id = txn.read<uint32_t>();
  101|  33.4k|      fns[id % fns.size()](&txn);
  102|  33.4k|    }
  103|      1|  } catch (const std::exception &) {
  104|       |    // malformed input rejected cleanly -- expected, not a finding
  105|      0|  }
  106|       |
  107|      1|  return 0;
  108|      1|}
fuzz_hog_session.C:_ZN12_GLOBAL__N_17readersEv:
   47|      1|const std::vector<ReadFn> &readers() {
   48|      1|  static const std::vector<ReadFn> fns = [] {
   49|      1|    static cc c; // cc's own constructor already loads the core prelude
   50|      1|    c.bind("hstoreCanRead", &hog::hstoreCanRead);
   51|      1|    c.bind("hstoreUnsafeRead", &hog::hstoreUnsafeRead);
   52|      1|    c.bind("hstoreUnsafeReadFixedArray", &hog::hstoreUnsafeReadFixedArray);
   53|      1|    hog::compileBootCode(c);
   54|       |
   55|      1|    auto compileDiscard = [&](const char *ty) {
   56|       |      // ignore both the success and failure arm -- we only care whether
   57|       |      // *reading* corrupts memory, not about persisting a value
   58|      1|      return c.compileFn<void(storage::Transaction *)>(
   59|      1|          "txn", std::string("either(hstoreRead(txn) :: (()+") + ty +
   60|      1|                     "), (), \\_.())");
   61|      1|    };
   62|       |
   63|      1|    return std::vector<ReadFn>{
   64|      1|        compileDiscard("[long]"),    // FixedWidth element, width 8
   65|      1|        compileDiscard("[byte]"),    // FixedWidth element, width 1
   66|      1|        compileDiscard("[[byte]]"),  // element [byte] is not FixedWidth
   67|       |                                      // (dynamic arrays never are) -> the
   68|       |                                      // outer array takes the unguarded
   69|       |                                      // newArray(n) path, read.hob:138-139
   70|      1|    };
   71|      1|  }();
   72|      1|  return fns;
   73|      1|}
fuzz_hog_session.C:_ZZN12_GLOBAL__N_17readersEvENK3$_0clEv:
   48|      1|  static const std::vector<ReadFn> fns = [] {
   49|      1|    static cc c; // cc's own constructor already loads the core prelude
   50|      1|    c.bind("hstoreCanRead", &hog::hstoreCanRead);
   51|      1|    c.bind("hstoreUnsafeRead", &hog::hstoreUnsafeRead);
   52|      1|    c.bind("hstoreUnsafeReadFixedArray", &hog::hstoreUnsafeReadFixedArray);
   53|      1|    hog::compileBootCode(c);
   54|       |
   55|      1|    auto compileDiscard = [&](const char *ty) {
   56|       |      // ignore both the success and failure arm -- we only care whether
   57|       |      // *reading* corrupts memory, not about persisting a value
   58|      1|      return c.compileFn<void(storage::Transaction *)>(
   59|      1|          "txn", std::string("either(hstoreRead(txn) :: (()+") + ty +
   60|      1|                     "), (), \\_.())");
   61|      1|    };
   62|       |
   63|      1|    return std::vector<ReadFn>{
   64|      1|        compileDiscard("[long]"),    // FixedWidth element, width 8
   65|      1|        compileDiscard("[byte]"),    // FixedWidth element, width 1
   66|      1|        compileDiscard("[[byte]]"),  // element [byte] is not FixedWidth
   67|       |                                      // (dynamic arrays never are) -> the
   68|       |                                      // outer array takes the unguarded
   69|       |                                      // newArray(n) path, read.hob:138-139
   70|      1|    };
   71|      1|  }();
fuzz_hog_session.C:_ZZZN12_GLOBAL__N_17readersEvENK3$_0clEvENKUlPKcE_clES2_:
   55|      3|    auto compileDiscard = [&](const char *ty) {
   56|       |      // ignore both the success and failure arm -- we only care whether
   57|       |      // *reading* corrupts memory, not about persisting a value
   58|      3|      return c.compileFn<void(storage::Transaction *)>(
   59|      3|          "txn", std::string("either(hstoreRead(txn) :: (()+") + ty +
   60|      3|                     "), (), \\_.())");
   61|      3|    };

_ZN6hobbes2cc4bindIbJRNS_7storage11TransactionElEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIPKhJRNS_7storage11TransactionElEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIPKhJRNS_7storage11TransactionEllEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc9compileFnIFvPNS_7storage11TransactionEEJPKcNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEENS_4funcIT_E4typeEDpT0_:
  142|      3|  typename func<RFn>::type compileFn(NamesAndExpr... args) {
  143|      3|    static_assert(
  144|      3|        func<RFn>::arity == sizeof...(NamesAndExpr) - 1,
  145|      3|        "Formal parameter list and expected function type arity mismatch");
  146|      3|    return rcast<typename func<RFn>::type>(unsafeCompileFn(
  147|      3|        lift<RFn>::type(*this), PArgl<NamesAndExpr...>::names(args...),
  148|      3|        PArgl<NamesAndExpr...>::expr(
  149|      3|            [&](const std::string &x) { return this->readExpr(x); }, args...)));
  150|      3|  }
_ZN6hobbes5PArglIJPKcNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE5namesES2_RKS8_:
   61|      3|  static str::seq names(const char *x, const NamesAndExpr &...args) {
   62|      3|    str::seq r = PArgl<NamesAndExpr...>::names(args...);
   63|      3|    r.insert(r.begin(), std::string(x));
   64|      3|    return r;
   65|      3|  }
_ZN6hobbes5PArglIJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE5namesERKS6_:
   42|      3|  static str::seq names(const std::string &) { return str::seq(); }
_ZN6hobbes5PArglIJPKcNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE4exprERKSt8functionIFSt10shared_ptrINS_4ExprEERKS8_EES2_SF_:
   67|      3|                      const NamesAndExpr &...args) {
   68|      3|    return PArgl<NamesAndExpr...>::expr(p, args...);
   69|      3|  }
_ZN6hobbes5PArglIJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE4exprERKSt8functionIFSt10shared_ptrINS_4ExprEERKS6_EESD_:
   43|      3|  static ExprPtr expr(const ExprParser &p, const std::string &e) {
   44|      3|    return p(e);
   45|      3|  }
_ZZN6hobbes2cc9compileFnIFvPNS_7storage11TransactionEEJPKcNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEENS_4funcIT_E4typeEDpT0_ENKUlRKSD_E_clESL_:
  149|      3|            [&](const std::string &x) { return this->readExpr(x); }, args...)));
_ZN6hobbes2cc4bindImJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEvS9_PFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIcJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEmEEEvS9_PFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIPcJmmEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      3|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      3|    hlock _;
  263|      3|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      3|  }
_ZN6hobbes2cc4bindIvJEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      3|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      3|    hlock _;
  263|      3|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      3|  }
_ZN6hobbes2cc4bindIPNS_5arrayINS_11RegionStateEEEJEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindImJmEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindImJPKNS_5arrayIcEEEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIvJmEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIPKNS_5arrayIcEEJcEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIPKNS_5arrayIcEEJhEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      2|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      2|    hlock _;
  263|      2|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      2|  }
_ZN6hobbes2cc4bindIPKNS_5arrayIcEEJsEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIPKNS_5arrayIcEEJiEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIPKNS_5arrayIcEEJlEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIPKNS_5arrayIcEEJnEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIPKNS_5arrayIcEEJfiEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIPKNS_5arrayIcEEJdiEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIPKNS_5arrayIcEEJPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEvRKSB_PFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIPKNS_5arrayIcEEJNS_9timespanTEEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIPKNS_5arrayIcEEJNS_5timeTEEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIPKNS_5arrayIcEEJNS_9datetimeTEEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIPKNS_5arrayIcEEJS5_lEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIPKNS_5arrayIcEEJS5_NS_9datetimeTEEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindINS_9datetimeTEJEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindINS_9datetimeTEJS2_EEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindINS_5timeTEJNS_9datetimeTEEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindINS_9datetimeTEJS2_NS_5timeTEEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindINS_9timespanTEJNS_9datetimeTEEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIPKNS_3CTMEJNS_9datetimeTEEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      2|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      2|    hlock _;
  263|      2|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      2|  }
_ZN6hobbes2cc4bindIvJPNS_5arrayIcEEEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIPKNS_5arrayIcEEJEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIPKNS_7variantIJNS_4unitEcEEEJPKNS_5arrayIcEEEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIPKNS_7variantIJNS_4unitEhEEEJPKNS_5arrayIcEEEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIPKNS_7variantIJNS_4unitEsEEEJPKNS_5arrayIcEEEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIPKNS_7variantIJNS_4unitEiEEEJPKNS_5arrayIcEEEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIPKNS_7variantIJNS_4unitElEEEJPKNS_5arrayIcEEEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIPKNS_7variantIJNS_4unitEnEEEJPKNS_5arrayIcEEEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIPKNS_7variantIJNS_4unitEfEEEJPKNS_5arrayIcEEEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIPKNS_7variantIJNS_4unitEdEEEJPKNS_5arrayIcEEEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIvJPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPNS_5arrayIcEEEEEvRKS7_PFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIdJddEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIlJllEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      2|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      2|    hlock _;
  263|      2|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      2|  }
_ZN6hobbes2cc4bindIlJdEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      3|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      3|    hlock _;
  263|      3|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      3|  }
_ZN6hobbes2cc4bindIdJdEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      3|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      3|    hlock _;
  263|      3|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      3|  }
_ZN6hobbes2cc4bindIvJPKNS_5arrayIcEEmS5_PcEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIlJlllEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      3|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      3|    hlock _;
  263|      3|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      3|  }
_ZN6hobbes2cc4bindImJPcEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIcJPcmEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIvJPclEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIbJiEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIvJibEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIhJiEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIvJihEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIcJiEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIvJicEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIsJiEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIvJisEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIiJiEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIvJiiEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIlJiEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIvJilEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindInJiEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIvJinEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIfJiEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIvJifEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIdJiEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIvJidEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIvJiPKNS_5arrayIcEEEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIvJiPKNS_5arrayIhEEEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIPKNS_5arrayIhEEJS5_EEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      2|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      2|    hlock _;
  263|      2|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      2|  }
_ZN6hobbes2cc4bindIvJNS_9timespanTEPFbvEEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindImJRKSt6vectorIhSaIhEEmEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIPKcJRKSt6vectorIhSaIhEEEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindImJmPFPciEEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIvJlEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      3|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      3|    hlock _;
  263|      3|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      3|  }
_ZN6hobbes2cc4bindIPcJljEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIPcJlllEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      2|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      2|    hlock _;
  263|      2|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      2|  }
_ZN6hobbes2cc4bindIPcJllEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIvJlllEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      2|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      2|    hlock _;
  263|      2|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      2|  }
_ZN6hobbes2cc4bindIvJllEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIlJllmEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIlJPKNS_5arrayIcEElEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      2|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      2|    hlock _;
  263|      2|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      2|  }
_ZN6hobbes2cc4bindIPNS_5arrayISt4pairIhsEEEJlEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIPNS_10DynDModel0EJlbhEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIvJPNS_10DynDModel0EPjEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIvJPNS_10DynDModel0EEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIPNS_8UCReaderEJmmmEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIbJPNS_8UCReaderEEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      3|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      3|    hlock _;
  263|      3|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      3|  }
_ZN6hobbes2cc4bindImJPNS_8UCReaderEEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      2|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      2|    hlock _;
  263|      2|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      2|  }
_ZN6hobbes2cc4bindIhJPNS_8UCReaderEPNS_10DynDModel0EEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIvJPNS_8UCReaderEEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIPNS_8UCWriterEJmmmmEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIbJPNS_8UCWriterEEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindImJPNS_8UCWriterEEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIPhJPNS_8UCWriterEEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIvJPNS_8UCWriterEPNS_10DynDModel0EhEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIvJPNS_8UCWriterEEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIvJljPFblEEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIvJlllhPFblEEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }
_ZN6hobbes2cc4bindIPKNS_5arrayISt4pairIPKNS2_IcEEPKNS2_IS3_ImS3_IhmEEEEEEEJEEEvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPFT_DpT0_E:
  261|      1|  void bind(const std::string &fn, R (*pfn)(Args...)) {
  262|      1|    hlock _;
  263|      1|    bindExternFunction(fn, lift<R(Args...)>::type(*this), rcast<void *>(pfn));
  264|      1|  }

boot.C:_ZNK6hobbes3$_0clEv:
   24|  5.67k|void compile(cc*, const ModulePtr& m, std::function<bool()> stopFn=[] { return false; });

_ZN6hobbes13hasPointerRepERKSt10shared_ptrINS_8MonoTypeEE:
   13|      9|inline bool hasPointerRep(const MonoTypePtr& t) {
   14|      9|  MonoTypePtr rt = repType(t);
   15|       |
   16|      9|  if (const OpaquePtr* op = is<OpaquePtr>(rt)) {
  ------------------
  |  Branch (16:24): [True: 0, False: 9]
  ------------------
   17|      0|    return !op->storedContiguously();
   18|      0|  }
   19|      9|  return (is<Record>(rt) != nullptr) || (is<FixedArray>(rt) != nullptr) || (is<Array>(rt) != nullptr) || (is<Variant>(rt) != nullptr) || (is<Recursive>(rt) != nullptr);
  ------------------
  |  Branch (19:10): [True: 6, False: 3]
  |  Branch (19:41): [True: 0, False: 3]
  |  Branch (19:76): [True: 0, False: 3]
  |  Branch (19:106): [True: 0, False: 3]
  |  Branch (19:138): [True: 0, False: 3]
  ------------------
   20|      9|}
_ZN6hobbes11isLargeTypeERKSt10shared_ptrINS_8MonoTypeEE:
   30|    296|inline bool isLargeType(const MonoTypePtr& t) {
   31|    296|  MonoTypePtr rt = repType(t);
   32|       |
   33|    296|  if (const OpaquePtr* p = is<OpaquePtr>(rt)) {
  ------------------
  |  Branch (33:24): [True: 2, False: 294]
  ------------------
   34|      2|    return p->storedContiguously();
   35|    294|  } else {
   36|    294|    return (is<Record>(rt) != nullptr) || (is<FixedArray>(rt) != nullptr) || (is<Variant>(rt) != nullptr);
  ------------------
  |  Branch (36:12): [True: 40, False: 254]
  |  Branch (36:43): [True: 5, False: 249]
  |  Branch (36:78): [True: 2, False: 247]
  ------------------
   37|    294|  }
   38|    296|}

_ZN6hobbes5jitcc3UCFC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt6vectorIS7_SaIS7_EERKSA_ISt10shared_ptrINS_8MonoTypeEESaISH_EERKSF_INS_4ExprEE:
  211|    308|      : name(name), argns(argns), argtys(argtys), exp(exp), result(nullptr), newScopeBinding(false), newGlobalDecl(false) { }

_ZN6hobbes9makeArrayIhEEPNS_5arrayIT_EEl:
   71|  5.58k|template <typename T> array<T> *makeArray(long n) {
   72|  5.58k|  array<T> *r = reinterpret_cast<array<T> *>(
   73|  5.58k|      memalloc(checkedArrayAllocSize(n, sizeof(T)),
   74|  5.58k|               std::max<size_t>(sizeof(long), alignof(T))));
   75|  5.58k|  r->size = n;
   76|  5.58k|  return defInitArray<T>(r);
   77|  5.58k|}
_ZN6hobbes12defInitArrayIhEEPNS_5arrayIT_EES4_:
   56|  5.58k|template <typename T> array<T> *defInitArray(array<T> *xs) {
   57|  5.58k|  if (xs->size > 0) {
  ------------------
  |  Branch (57:7): [True: 15, False: 5.57k]
  ------------------
   58|     15|    new (xs->data) T[xs->size];
   59|     15|  }
   60|  5.58k|  return xs;
   61|  5.58k|}

_ZN6hobbes4Case7BindingC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES9_RKSt10shared_ptrINS_4ExprEE:
  552|  1.47k|    Binding(const std::string& selector, const std::string& vname, const ExprPtr& exp) : selector(selector), vname(vname), exp(exp) { }
_ZN6hobbes6Switch7BindingC2ERKSt10shared_ptrINS_9PrimitiveEERKS2_INS_4ExprEE:
  592|    253|    Binding(const PrimitivePtr& value, const ExprPtr& exp) : value(value), exp(exp) { }
_ZN6hobbes8constantEhRKNS_17LexicalAnnotationE:
  743|     28|inline ExprPtr constant(uint8_t x, const LexicalAnnotation& la) {
  744|     28|  ExprPtr r(new Byte(x, la));
  745|     28|  r->type(qualtype(MonoTypePtr(Prim::make("byte"))));
  746|     28|  return r;
  747|     28|}
_ZN6hobbes8constantEiRKNS_17LexicalAnnotationE:
  749|     39|inline ExprPtr constant(int x, const LexicalAnnotation& la) {
  750|     39|  ExprPtr r(new Int(x, la));
  751|     39|  r->type(qualtype(MonoTypePtr(Prim::make("int"))));
  752|     39|  return r;
  753|     39|}
_ZN6hobbes8constantElRKNS_17LexicalAnnotationE:
  755|      2|inline ExprPtr constant(long x, const LexicalAnnotation& la) {
  756|      2|  ExprPtr r(new Long(x, la));
  757|      2|  r->type(qualtype(MonoTypePtr(Prim::make("long"))));
  758|      2|  return r;
  759|      2|}
_ZN6hobbes3varERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNS_17LexicalAnnotationE:
  773|  2.26k|inline ExprPtr var(const std::string& vn, const LexicalAnnotation& la) {
  774|  2.26k|  return ExprPtr(new Var(vn, la));
  775|  2.26k|}
_ZN6hobbes4varsERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS6_EERKNS_17LexicalAnnotationE:
  777|      4|inline Exprs vars(const std::vector<std::string>& vns, const LexicalAnnotation& la) {
  778|      4|  Exprs r;
  779|      4|  for (const std::string& vn : vns) {
  ------------------
  |  Branch (779:30): [True: 1, False: 4]
  ------------------
  780|      1|    r.push_back(var(vn, la));
  781|      1|  }
  782|      4|  return r;
  783|      4|}
_ZN6hobbes3varERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_8QualTypeEERKNS_17LexicalAnnotationE:
  785|     11|inline ExprPtr var(const std::string& vn, const QualTypePtr& ty, const LexicalAnnotation& la) {
  786|     11|  ExprPtr r(new Var(vn, la));
  787|     11|  r->type(ty);
  788|     11|  return r;
  789|     11|}
_ZN6hobbes3varERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_8MonoTypeEERKNS_17LexicalAnnotationE:
  791|     11|inline ExprPtr var(const std::string& vn, const MonoTypePtr& ty, const LexicalAnnotation& la) {
  792|     11|  return var(vn, qualtype(ty), la);
  793|     11|}
_ZN6hobbes3letERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_4ExprEESC_RKNS_17LexicalAnnotationE:
  795|    127|inline ExprPtr let(const std::string& vn, const ExprPtr& e, const ExprPtr& b, const LexicalAnnotation& la) {
  796|    127|  ExprPtr r(new Let(vn, e, b, la));
  797|    127|  if (e->type() != QualTypePtr() && b->type() != QualTypePtr()) {
  ------------------
  |  Branch (797:7): [True: 0, False: 127]
  |  Branch (797:7): [True: 0, False: 127]
  |  Branch (797:37): [True: 0, False: 0]
  ------------------
  798|      0|    r->type(qualtype(mergeConstraints(e->type()->constraints(), b->type()->constraints()), b->type()->monoType()));
  799|      0|  }
  800|    127|  return r;
  801|    127|}
_ZN6hobbes7mktunitERKNS_17LexicalAnnotationE:
  819|      2|inline ExprPtr mktunit(const LexicalAnnotation& la) {
  820|      2|  ExprPtr r(new Unit(la));
  821|      2|  r->type(qualtype(MonoTypePtr(Prim::make("unit"))));
  822|      2|  return r;
  823|      2|}
_ZN6hobbes4projERKSt10shared_ptrINS_4ExprEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNS_17LexicalAnnotationE:
  860|     92|inline ExprPtr proj(const ExprPtr& rec, const std::string& field, const LexicalAnnotation& la) {
  861|     92|  if (rec->type() != QualTypePtr()) {
  ------------------
  |  Branch (861:7): [True: 0, False: 92]
  ------------------
  862|      0|    if (const Record* rty = is<Record>(rec->type()->monoType())) {
  ------------------
  |  Branch (862:23): [True: 0, False: 0]
  ------------------
  863|      0|      return proj(rec, rty, field, la);
  864|      0|    } else {
  865|      0|      throw annotated_error(*rec, "Expected record type in projection");
  866|      0|    }
  867|      0|  }
  868|     92|  return ExprPtr(new Proj(rec, field, la));
  869|     92|}
_ZN6hobbes4projERKSt10shared_ptrINS_4ExprEERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EERKNS_17LexicalAnnotationE:
  871|      7|inline ExprPtr proj(const ExprPtr& rec, const str::seq& fields, const LexicalAnnotation& la) {
  872|      7|  ExprPtr r = rec;
  873|      7|  for (const auto& f : fields) {
  ------------------
  |  Branch (873:22): [True: 7, False: 7]
  ------------------
  874|      7|    r = proj(r, f, la);
  875|      7|  }
  876|      7|  return r;
  877|      7|}
_ZN6hobbes15liftConstraintsERKSt6vectorISt10shared_ptrINS_4ExprEESaIS3_EE:
  897|      4|inline Constraints liftConstraints(const Exprs& es) {
  898|      4|  Constraints r;
  899|      9|  for (const auto &e : es) {
  ------------------
  |  Branch (899:22): [True: 9, False: 4]
  ------------------
  900|      9|    QualTypePtr qt = e->type();
  901|      9|    if (qt != QualTypePtr()) {
  ------------------
  |  Branch (901:9): [True: 9, False: 0]
  ------------------
  902|      9|      append(&r, qt->constraints());
  903|      9|    }
  904|      9|  }
  905|      4|  return r;
  906|      4|}
_ZN6hobbes2fnERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS6_EERKSt10shared_ptrINS_4ExprEERKNS_17LexicalAnnotationE:
  908|     24|inline ExprPtr fn(const str::seq& vns, const ExprPtr& b, const LexicalAnnotation& la) {
  909|     24|  return ExprPtr(new Fn(vns, b, la));
  910|     24|}
_ZN6hobbes6fncallERKSt10shared_ptrINS_4ExprEERKSt6vectorIS2_SaIS2_EERKNS_17LexicalAnnotationE:
  916|    657|inline ExprPtr fncall(const ExprPtr& f, const Exprs& args, const LexicalAnnotation& la) {
  917|    657|  ExprPtr r(new App(f, args, la));
  918|    657|  if (f->type() != QualTypePtr()) {
  ------------------
  |  Branch (918:7): [True: 4, False: 653]
  ------------------
  919|      4|    r->type(qualtype(liftConstraints(cons(f, args)), fnresult(f->type()->monoType())));
  920|      4|  }
  921|    657|  return r;
  922|    657|}
_ZN6hobbes7etaLiftERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_8MonoTypeEERKNS_17LexicalAnnotationE:
  950|      4|inline ExprPtr etaLift(const std::string& opname, const MonoTypePtr& oty, const LexicalAnnotation& la) {
  951|      4|  Func* fty = is<Func>(oty);
  952|      4|  if (fty == nullptr) { throw annotated_error(la, "Internal compiler error while eta-expanding primitive op: " + opname); }
  ------------------
  |  Branch (952:7): [True: 0, False: 4]
  ------------------
  953|       |
  954|      4|  ExprPtr op = var(opname, oty, la);
  955|       |
  956|      4|  const MonoTypes& atys = fty->parameters();
  957|      4|  Exprs            args;
  958|      4|  Fn::VarNames     vns;
  959|      4|  int              i = 0;
  960|       |
  961|      5|  for (const auto& a : atys) {
  ------------------
  |  Branch (961:22): [True: 5, False: 4]
  ------------------
  962|      5|    std::string vname = canonicalName(i);
  963|      5|    args.push_back(var(vname, a, la));
  964|      5|    vns.push_back(vname);
  965|      5|    ++i;
  966|      5|  }
  967|       |
  968|      4|  ExprPtr ret = fn(vns, fncall(op, args, la), la);
  969|      4|  ret->type(qualtype(oty));
  970|      4|  return ret;
  971|      4|}
_ZN6hobbes7mkarrayERKSt6vectorIhSaIhEERKNS_17LexicalAnnotationE:
  973|      1|inline Expr* mkarray(const std::vector<unsigned char>& v, const LexicalAnnotation& la) {
  974|      1|  MonoTypePtr bty = primty("byte");
  975|      1|  QualTypePtr ety = qualtype(bty);
  976|      1|  QualTypePtr aty = qualtype(arrayty(bty));
  977|       |
  978|      1|  Exprs cs;
  979|    128|  for (const unsigned char b : v) {
  ------------------
  |  Branch (979:30): [True: 128, False: 1]
  ------------------
  980|    128|    ExprPtr be(new Byte(b, la));
  981|    128|    be->type(ety);
  982|    128|    cs.push_back(be);
  983|    128|  }
  984|       |
  985|      1|  ExprPtr marr(new MkArray(cs, la));
  986|      1|  marr->type(aty);
  987|       |
  988|      1|  Expr* result = new Assump(marr, aty, la);
  989|      1|  result->type(aty);
  990|       |
  991|      1|  return result;
  992|      1|}
_ZN6hobbes7mkarrayERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNS_17LexicalAnnotationE:
  994|     83|inline Expr* mkarray(const std::string& v, const LexicalAnnotation& la) {
  995|     83|  MonoTypePtr cty = primty("char");
  996|     83|  QualTypePtr ety = qualtype(cty);
  997|     83|  QualTypePtr aty = qualtype(arrayty(cty));
  998|       |
  999|     83|  Exprs cs;
 1000|    688|  for (const char c : v) {
  ------------------
  |  Branch (1000:21): [True: 688, False: 83]
  ------------------
 1001|    688|    ExprPtr ce(new Char(c, la));
 1002|    688|    ce->type(ety);
 1003|    688|    cs.push_back(ce);
 1004|    688|  }
 1005|       |
 1006|     83|  ExprPtr marr(new MkArray(cs, la));
 1007|     83|  marr->type(aty);
 1008|       |
 1009|     83|  Expr* result = new Assump(marr, aty, la);
 1010|     83|  result->type(aty);
 1011|       |
 1012|     83|  return result;
 1013|     83|}
_ZN6hobbes7switchEERKSt10shared_ptrINS_4ExprEERKSt6vectorINS_6Switch7BindingESaIS7_EES4_RKNS_17LexicalAnnotationE:
 1015|      2|inline ExprPtr switchE(const ExprPtr& e, const Switch::Bindings& bs, const ExprPtr& def, const LexicalAnnotation& la) {
 1016|      2|  if (bs.empty()) {
  ------------------
  |  Branch (1016:7): [True: 0, False: 2]
  ------------------
 1017|      0|    return def;
 1018|      2|  } else {
 1019|      2|    return ExprPtr(new Switch(e, bs, def, la));
 1020|      2|  }
 1021|      2|}
_ZN6hobbes6assumeERKSt10shared_ptrINS_4ExprEERKS0_INS_8QualTypeEERKNS_17LexicalAnnotationE:
 1023|  1.32k|inline ExprPtr assume(const ExprPtr& e, const QualTypePtr& t, const LexicalAnnotation& la) {
 1024|  1.32k|  if (const Assump* ae = is<Assump>(e)) {
  ------------------
  |  Branch (1024:21): [True: 403, False: 920]
  ------------------
 1025|    403|    if (*ae->ty() == *t) {
  ------------------
  |  Branch (1025:9): [True: 396, False: 7]
  ------------------
 1026|    396|      return e;
 1027|    396|    }
 1028|    403|  }
 1029|       |
 1030|    927|  QualTypePtr ety = e->type();
 1031|    927|  if (ety) {
  ------------------
  |  Branch (1031:7): [True: 23, False: 904]
  ------------------
 1032|     23|    ExprPtr r(new Assump(e, t, la));
 1033|     23|    r->type(qualtype(mergeConstraints(ety->constraints(), t->constraints()), ety->monoType()));
 1034|     23|    return r;
 1035|    904|  } else {
 1036|    904|    return ExprPtr(new Assump(e, t, la));
 1037|    904|  }
 1038|    927|}
_ZN6hobbes6assumeERKSt10shared_ptrINS_4ExprEERKS0_INS_8MonoTypeEERKNS_17LexicalAnnotationE:
 1040|  1.09k|inline ExprPtr assume(const ExprPtr& e, const MonoTypePtr& t, const LexicalAnnotation& la) {
 1041|  1.09k|  return assume(e, qualtype(t), la);
 1042|  1.09k|}
_ZN6hobbes6assignERKSt10shared_ptrINS_4ExprEES4_RKNS_17LexicalAnnotationE:
 1067|     10|inline ExprPtr assign(const ExprPtr& lhs, const ExprPtr& rhs, const LexicalAnnotation& la) {
 1068|     10|  ExprPtr r(new Assign(lhs, rhs, la));
 1069|     10|  if (lhs->type() && rhs->type()) {
  ------------------
  |  Branch (1069:7): [True: 2, False: 8]
  |  Branch (1069:22): [True: 2, False: 0]
  ------------------
 1070|      2|    r->type(qualtype(mergeConstraints(lhs->type()->constraints(), rhs->type()->constraints()), primty("unit")));
 1071|      2|  }
 1072|     10|  return r;
 1073|     10|}
_ZN6hobbes5exprsERKSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_4ExprEEESaISB_EE:
 1075|    129|inline Exprs exprs(const MkRecord::FieldDefs& ms) {
 1076|    129|  Exprs r;
 1077|    277|  for (const auto &m : ms) {
  ------------------
  |  Branch (1077:22): [True: 277, False: 129]
  ------------------
 1078|    277|    r.push_back(m.second);
 1079|    277|  }
 1080|    129|  return r;
 1081|    129|}
_ZNK6hobbes13PrimitiveCaseINS_4BoolEEltERKNS_9PrimitiveE:
  133|    102|    bool operator<(const Primitive& rhs) const override {
  134|    102|      if (const Case* trhs = is<Case>(&rhs)) {
  ------------------
  |  Branch (134:23): [True: 102, False: 0]
  ------------------
  135|    102|        return lt(*trhs);
  136|    102|      } else {
  137|      0|        return case_id() < rhs.case_id();
  138|      0|      }
  139|    102|    }
_ZNK6hobbes13PrimitiveCaseINS_3IntEEltERKNS_9PrimitiveE:
  133|    900|    bool operator<(const Primitive& rhs) const override {
  134|    900|      if (const Case* trhs = is<Case>(&rhs)) {
  ------------------
  |  Branch (134:23): [True: 900, False: 0]
  ------------------
  135|    900|        return lt(*trhs);
  136|    900|      } else {
  137|      0|        return case_id() < rhs.case_id();
  138|      0|      }
  139|    900|    }
_ZNK6hobbes13PrimitiveCaseINS_4LongEEltERKNS_9PrimitiveE:
  133|    134|    bool operator<(const Primitive& rhs) const override {
  134|    134|      if (const Case* trhs = is<Case>(&rhs)) {
  ------------------
  |  Branch (134:23): [True: 134, False: 0]
  ------------------
  135|    134|        return lt(*trhs);
  136|    134|      } else {
  137|      0|        return case_id() < rhs.case_id();
  138|      0|      }
  139|    134|    }
_ZNK6hobbes8ExprCaseINS_3VarEEeqERKNS_4ExprE:
   49|  1.20k|    bool operator==(const Expr& rhs) const override {
   50|  1.20k|      if (this == &rhs) {
  ------------------
  |  Branch (50:11): [True: 0, False: 1.20k]
  ------------------
   51|      0|        return true;
   52|  1.20k|      } else if (const Case* trhs = is<Case>(&rhs)) {
  ------------------
  |  Branch (52:30): [True: 1.20k, False: 0]
  ------------------
   53|  1.20k|        return *this == *trhs;
   54|  1.20k|      } else {
   55|      0|        return false;
   56|      0|      }
   57|  1.20k|    }
_ZN6hobbes11switchExprCISt10shared_ptrINS_4ExprEEED2Ev:
 1179|  6.98k|    virtual ~switchExprC() = default;
_ZNK6hobbes11switchExprCISt10shared_ptrINS_4ExprEEE4withEPKNS_4UnitE:
 1199|  1.41k|    T with(const Unit*   v) const override { return withConst(v); }
_ZNK6hobbes11switchExprCISt10shared_ptrINS_4ExprEEE4withEPKNS_4BoolE:
 1200|    628|    T with(const Bool*   v) const override { return withConst(v); }
_ZNK6hobbes11switchExprCISt10shared_ptrINS_4ExprEEE4withEPKNS_4CharE:
 1201|    814|    T with(const Char*   v) const override { return withConst(v); }
_ZNK6hobbes11switchExprCISt10shared_ptrINS_4ExprEEE4withEPKNS_4ByteE:
 1202|    869|    T with(const Byte*   v) const override { return withConst(v); }
_ZNK6hobbes11switchExprCISt10shared_ptrINS_4ExprEEE4withEPKNS_5ShortE:
 1203|     11|    T with(const Short*  v) const override { return withConst(v); }
_ZNK6hobbes11switchExprCISt10shared_ptrINS_4ExprEEE4withEPKNS_3IntE:
 1204|  1.57k|    T with(const Int*    v) const override { return withConst(v); }
_ZNK6hobbes11switchExprCISt10shared_ptrINS_4ExprEEE4withEPKNS_6Int128E:
 1206|      6|    T with(const Int128* v) const override { return withConst(v); }
_ZNK6hobbes11switchExprCISt10shared_ptrINS_4ExprEEE4withEPKNS_4LongE:
 1205|  3.20k|    T with(const Long*   v) const override { return withConst(v); }
_ZNK6hobbes11switchExprCISt10shared_ptrINS_4ExprEEE4withEPKNS_5FloatE:
 1207|      6|    T with(const Float*  v) const override { return withConst(v); }
_ZNK6hobbes11switchExprCISt10shared_ptrINS_4ExprEEE4withEPKNS_6DoubleE:
 1208|      6|    T with(const Double* v) const override { return withConst(v); }
_ZN6hobbes11switchExprCINS_7details4BoolEED2Ev:
 1179|    277|    virtual ~switchExprC() = default;
_ZNK6hobbes11switchExprCINS_7details4BoolEE4withEPKNS_4UnitE:
 1199|    112|    T with(const Unit*   v) const override { return withConst(v); }
_ZNK6hobbes11switchExprCINS_7details4BoolEE4withEPKNS_4BoolE:
 1200|     38|    T with(const Bool*   v) const override { return withConst(v); }
_ZNK6hobbes11switchExprCINS_7details4BoolEE4withEPKNS_4CharE:
 1201|     77|    T with(const Char*   v) const override { return withConst(v); }
_ZNK6hobbes11switchExprCINS_7details4BoolEE4withEPKNS_4ByteE:
 1202|    136|    T with(const Byte*   v) const override { return withConst(v); }
_ZNK6hobbes11switchExprCINS_7details4BoolEE4withEPKNS_5ShortE:
 1203|      1|    T with(const Short*  v) const override { return withConst(v); }
_ZNK6hobbes11switchExprCINS_7details4BoolEE4withEPKNS_3IntE:
 1204|    135|    T with(const Int*    v) const override { return withConst(v); }
_ZNK6hobbes11switchExprCINS_7details4BoolEE4withEPKNS_4LongE:
 1205|    287|    T with(const Long*   v) const override { return withConst(v); }
_ZN6hobbes8switchOfINS_7details4BoolEEESt6vectorIT_SaIS4_EERKS3_ISt10shared_ptrINS_4ExprEESaIS9_EERKNS_10switchExprIS4_EE:
 1320|  1.83k|  std::vector<T> switchOf(const Exprs& es, const switchExpr<T>& f) {
 1321|  1.83k|    std::vector<T> result;
 1322|  4.24k|    for (const auto& e : es) {
  ------------------
  |  Branch (1322:24): [True: 4.24k, False: 1.83k]
  ------------------
 1323|  4.24k|      result.push_back(switchOf(e, f));
 1324|  4.24k|    }
 1325|  1.83k|    return result;
 1326|  1.83k|  }
_ZN6hobbes8switchOfINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS_7details4BoolEEESt6vectorISt4pairIT_T0_ESaISD_EERKS9_ISA_ISB_St10shared_ptrINS_4ExprEEESaISJ_EERKNS_10switchExprISC_EE:
 1338|     43|  std::vector< std::pair<K, T> > switchOf(const std::vector< std::pair<K, ExprPtr> >& kes, const switchExpr<T>& f) {
 1339|     43|    using KT = std::pair<K, T>;
 1340|     43|    using KTS = std::vector<KT>;
 1341|     43|    KTS kts;
 1342|     96|    for (const auto& ke : kes) {
  ------------------
  |  Branch (1342:25): [True: 96, False: 43]
  ------------------
 1343|     96|      kts.push_back(KT(ke.first, switchOf(ke.second, f)));
 1344|     96|    }
 1345|     43|    return kts;
 1346|     43|  }
_ZN6hobbes8switchOfISt10shared_ptrINS_4ExprEEEESt6vectorIT_SaIS5_EERKS4_IS3_SaIS3_EERKNS_10switchExprIS5_EE:
 1320|  26.6k|  std::vector<T> switchOf(const Exprs& es, const switchExpr<T>& f) {
 1321|  26.6k|    std::vector<T> result;
 1322|  55.1k|    for (const auto& e : es) {
  ------------------
  |  Branch (1322:24): [True: 55.1k, False: 26.6k]
  ------------------
 1323|  55.1k|      result.push_back(switchOf(e, f));
 1324|  55.1k|    }
 1325|  26.6k|    return result;
 1326|  26.6k|  }
_ZN6hobbes8switchOfINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_4ExprEEEESt6vectorISt4pairIT_T0_ESaISE_EERKSA_ISB_ISC_S9_ESaISH_EERKNS_10switchExprISD_EE:
 1338|    998|  std::vector< std::pair<K, T> > switchOf(const std::vector< std::pair<K, ExprPtr> >& kes, const switchExpr<T>& f) {
 1339|    998|    using KT = std::pair<K, T>;
 1340|    998|    using KTS = std::vector<KT>;
 1341|    998|    KTS kts;
 1342|  2.23k|    for (const auto& ke : kes) {
  ------------------
  |  Branch (1342:25): [True: 2.23k, False: 998]
  ------------------
 1343|  2.23k|      kts.push_back(KT(ke.first, switchOf(ke.second, f)));
 1344|  2.23k|    }
 1345|    998|    return kts;
 1346|    998|  }
_ZN6hobbes8switchOfISt10shared_ptrINS_4ExprEEEET_RKS3_RKNS_10switchExprIS4_EE:
 1310|   139k|  T switchOf(const ExprPtr& e, const switchExpr<T>& f) {
 1311|   139k|    return switchOfF< T, const switchExpr<T>& >(*e, f);
 1312|   139k|  }
_ZN6hobbes9switchOfFISt10shared_ptrINS_4ExprEERKNS_10switchExprIS3_EEEET_RKS2_T0_:
 1245|   139k|  T switchOfF(const Expr& e, F f) {
 1246|   139k|    switch (e.case_id()) {
 1247|  1.41k|    case Unit::type_case_id:
  ------------------
  |  Branch (1247:5): [True: 1.41k, False: 137k]
  ------------------
 1248|  1.41k|      return f.with(crcast<Unit*>(&e));
 1249|    628|    case Bool::type_case_id:
  ------------------
  |  Branch (1249:5): [True: 628, False: 138k]
  ------------------
 1250|    628|      return f.with(crcast<Bool*>(&e));
 1251|    814|    case Char::type_case_id:
  ------------------
  |  Branch (1251:5): [True: 814, False: 138k]
  ------------------
 1252|    814|      return f.with(crcast<Char*>(&e));
 1253|    869|    case Byte::type_case_id:
  ------------------
  |  Branch (1253:5): [True: 869, False: 138k]
  ------------------
 1254|    869|      return f.with(crcast<Byte*>(&e));
 1255|     11|    case Short::type_case_id:
  ------------------
  |  Branch (1255:5): [True: 11, False: 139k]
  ------------------
 1256|     11|      return f.with(crcast<Short*>(&e));
 1257|  1.57k|    case Int::type_case_id:
  ------------------
  |  Branch (1257:5): [True: 1.57k, False: 137k]
  ------------------
 1258|  1.57k|      return f.with(crcast<Int*>(&e));
 1259|  3.20k|    case Long::type_case_id:
  ------------------
  |  Branch (1259:5): [True: 3.20k, False: 135k]
  ------------------
 1260|  3.20k|      return f.with(crcast<Long*>(&e));
 1261|      6|    case Int128::type_case_id:
  ------------------
  |  Branch (1261:5): [True: 6, False: 139k]
  ------------------
 1262|      6|      return f.with(crcast<Int128*>(&e));
 1263|      6|    case Float::type_case_id:
  ------------------
  |  Branch (1263:5): [True: 6, False: 139k]
  ------------------
 1264|      6|      return f.with(crcast<Float*>(&e));
 1265|      6|    case Double::type_case_id:
  ------------------
  |  Branch (1265:5): [True: 6, False: 139k]
  ------------------
 1266|      6|      return f.with(crcast<Double*>(&e));
 1267|  63.9k|    case Var::type_case_id:
  ------------------
  |  Branch (1267:5): [True: 63.9k, False: 75.1k]
  ------------------
 1268|  63.9k|      return f.with(crcast<Var*>(&e));
 1269|  6.80k|    case Let::type_case_id:
  ------------------
  |  Branch (1269:5): [True: 6.80k, False: 132k]
  ------------------
 1270|  6.80k|      return f.with(crcast<Let*>(&e));
 1271|     36|    case LetRec::type_case_id:
  ------------------
  |  Branch (1271:5): [True: 36, False: 139k]
  ------------------
 1272|     36|      return f.with(crcast<LetRec*>(&e));
 1273|  3.75k|    case Fn::type_case_id:
  ------------------
  |  Branch (1273:5): [True: 3.75k, False: 135k]
  ------------------
 1274|  3.75k|      return f.with(crcast<Fn*>(&e));
 1275|  25.9k|    case App::type_case_id:
  ------------------
  |  Branch (1275:5): [True: 25.9k, False: 113k]
  ------------------
 1276|  25.9k|      return f.with(crcast<App*>(&e));
 1277|  1.05k|    case Assign::type_case_id:
  ------------------
  |  Branch (1277:5): [True: 1.05k, False: 138k]
  ------------------
 1278|  1.05k|      return f.with(crcast<Assign*>(&e));
 1279|    633|    case MkArray::type_case_id:
  ------------------
  |  Branch (1279:5): [True: 633, False: 138k]
  ------------------
 1280|    633|      return f.with(crcast<MkArray*>(&e));
 1281|    822|    case MkVariant::type_case_id:
  ------------------
  |  Branch (1281:5): [True: 822, False: 138k]
  ------------------
 1282|    822|      return f.with(crcast<MkVariant*>(&e));
 1283|    998|    case MkRecord::type_case_id:
  ------------------
  |  Branch (1283:5): [True: 998, False: 138k]
  ------------------
 1284|    998|      return f.with(crcast<MkRecord*>(&e));
 1285|  1.94k|    case AIndex::type_case_id:
  ------------------
  |  Branch (1285:5): [True: 1.94k, False: 137k]
  ------------------
 1286|  1.94k|      return f.with(crcast<AIndex*>(&e));
 1287|    711|    case Case::type_case_id:
  ------------------
  |  Branch (1287:5): [True: 711, False: 138k]
  ------------------
 1288|    711|      return f.with(crcast<Case*>(&e));
 1289|     60|    case Switch::type_case_id:
  ------------------
  |  Branch (1289:5): [True: 60, False: 139k]
  ------------------
 1290|     60|      return f.with(crcast<Switch*>(&e));
 1291|  3.40k|    case Proj::type_case_id:
  ------------------
  |  Branch (1291:5): [True: 3.40k, False: 135k]
  ------------------
 1292|  3.40k|      return f.with(crcast<Proj*>(&e));
 1293|  20.1k|    case Assump::type_case_id:
  ------------------
  |  Branch (1293:5): [True: 20.1k, False: 118k]
  ------------------
 1294|  20.1k|      return f.with(crcast<Assump*>(&e));
 1295|    232|    case Pack::type_case_id:
  ------------------
  |  Branch (1295:5): [True: 232, False: 138k]
  ------------------
 1296|    232|      return f.with(crcast<Pack*>(&e));
 1297|     55|    case Unpack::type_case_id:
  ------------------
  |  Branch (1297:5): [True: 55, False: 139k]
  ------------------
 1298|     55|      return f.with(crcast<Unpack*>(&e));
 1299|      0|    default:
  ------------------
  |  Branch (1299:5): [True: 0, False: 139k]
  ------------------
 1300|      0|      throw annotated_error(e, "Internal error, cannot switch on unknown expression: " + show(e));
 1301|   139k|    }
 1302|   139k|  }
_ZN6hobbes8switchOfINS_7details4BoolEEET_RKSt10shared_ptrINS_4ExprEERKNS_10switchExprIS3_EE:
 1310|  7.89k|  T switchOf(const ExprPtr& e, const switchExpr<T>& f) {
 1311|  7.89k|    return switchOfF< T, const switchExpr<T>& >(*e, f);
 1312|  7.89k|  }
_ZN6hobbes9switchOfFINS_7details4BoolERKNS_10switchExprIS2_EEEET_RKNS_4ExprET0_:
 1245|  7.89k|  T switchOfF(const Expr& e, F f) {
 1246|  7.89k|    switch (e.case_id()) {
 1247|    112|    case Unit::type_case_id:
  ------------------
  |  Branch (1247:5): [True: 112, False: 7.78k]
  ------------------
 1248|    112|      return f.with(crcast<Unit*>(&e));
 1249|     38|    case Bool::type_case_id:
  ------------------
  |  Branch (1249:5): [True: 38, False: 7.85k]
  ------------------
 1250|     38|      return f.with(crcast<Bool*>(&e));
 1251|     77|    case Char::type_case_id:
  ------------------
  |  Branch (1251:5): [True: 77, False: 7.81k]
  ------------------
 1252|     77|      return f.with(crcast<Char*>(&e));
 1253|    136|    case Byte::type_case_id:
  ------------------
  |  Branch (1253:5): [True: 136, False: 7.75k]
  ------------------
 1254|    136|      return f.with(crcast<Byte*>(&e));
 1255|      1|    case Short::type_case_id:
  ------------------
  |  Branch (1255:5): [True: 1, False: 7.89k]
  ------------------
 1256|      1|      return f.with(crcast<Short*>(&e));
 1257|    135|    case Int::type_case_id:
  ------------------
  |  Branch (1257:5): [True: 135, False: 7.76k]
  ------------------
 1258|    135|      return f.with(crcast<Int*>(&e));
 1259|    287|    case Long::type_case_id:
  ------------------
  |  Branch (1259:5): [True: 287, False: 7.60k]
  ------------------
 1260|    287|      return f.with(crcast<Long*>(&e));
 1261|      0|    case Int128::type_case_id:
  ------------------
  |  Branch (1261:5): [True: 0, False: 7.89k]
  ------------------
 1262|      0|      return f.with(crcast<Int128*>(&e));
 1263|      0|    case Float::type_case_id:
  ------------------
  |  Branch (1263:5): [True: 0, False: 7.89k]
  ------------------
 1264|      0|      return f.with(crcast<Float*>(&e));
 1265|      0|    case Double::type_case_id:
  ------------------
  |  Branch (1265:5): [True: 0, False: 7.89k]
  ------------------
 1266|      0|      return f.with(crcast<Double*>(&e));
 1267|  4.18k|    case Var::type_case_id:
  ------------------
  |  Branch (1267:5): [True: 4.18k, False: 3.70k]
  ------------------
 1268|  4.18k|      return f.with(crcast<Var*>(&e));
 1269|    455|    case Let::type_case_id:
  ------------------
  |  Branch (1269:5): [True: 455, False: 7.44k]
  ------------------
 1270|    455|      return f.with(crcast<Let*>(&e));
 1271|      4|    case LetRec::type_case_id:
  ------------------
  |  Branch (1271:5): [True: 4, False: 7.89k]
  ------------------
 1272|      4|      return f.with(crcast<LetRec*>(&e));
 1273|     47|    case Fn::type_case_id:
  ------------------
  |  Branch (1273:5): [True: 47, False: 7.84k]
  ------------------
 1274|     47|      return f.with(crcast<Fn*>(&e));
 1275|  1.78k|    case App::type_case_id:
  ------------------
  |  Branch (1275:5): [True: 1.78k, False: 6.10k]
  ------------------
 1276|  1.78k|      return f.with(crcast<App*>(&e));
 1277|     72|    case Assign::type_case_id:
  ------------------
  |  Branch (1277:5): [True: 72, False: 7.82k]
  ------------------
 1278|     72|      return f.with(crcast<Assign*>(&e));
 1279|     45|    case MkArray::type_case_id:
  ------------------
  |  Branch (1279:5): [True: 45, False: 7.85k]
  ------------------
 1280|     45|      return f.with(crcast<MkArray*>(&e));
 1281|     31|    case MkVariant::type_case_id:
  ------------------
  |  Branch (1281:5): [True: 31, False: 7.86k]
  ------------------
 1282|     31|      return f.with(crcast<MkVariant*>(&e));
 1283|     43|    case MkRecord::type_case_id:
  ------------------
  |  Branch (1283:5): [True: 43, False: 7.85k]
  ------------------
 1284|     43|      return f.with(crcast<MkRecord*>(&e));
 1285|    174|    case AIndex::type_case_id:
  ------------------
  |  Branch (1285:5): [True: 174, False: 7.72k]
  ------------------
 1286|    174|      return f.with(crcast<AIndex*>(&e));
 1287|     37|    case Case::type_case_id:
  ------------------
  |  Branch (1287:5): [True: 37, False: 7.85k]
  ------------------
 1288|     37|      return f.with(crcast<Case*>(&e));
 1289|      4|    case Switch::type_case_id:
  ------------------
  |  Branch (1289:5): [True: 4, False: 7.89k]
  ------------------
 1290|      4|      return f.with(crcast<Switch*>(&e));
 1291|    149|    case Proj::type_case_id:
  ------------------
  |  Branch (1291:5): [True: 149, False: 7.74k]
  ------------------
 1292|    149|      return f.with(crcast<Proj*>(&e));
 1293|     70|    case Assump::type_case_id:
  ------------------
  |  Branch (1293:5): [True: 70, False: 7.82k]
  ------------------
 1294|     70|      return f.with(crcast<Assump*>(&e));
 1295|      0|    case Pack::type_case_id:
  ------------------
  |  Branch (1295:5): [True: 0, False: 7.89k]
  ------------------
 1296|      0|      return f.with(crcast<Pack*>(&e));
 1297|      1|    case Unpack::type_case_id:
  ------------------
  |  Branch (1297:5): [True: 1, False: 7.89k]
  ------------------
 1298|      1|      return f.with(crcast<Unpack*>(&e));
 1299|      0|    default:
  ------------------
  |  Branch (1299:5): [True: 0, False: 7.89k]
  ------------------
 1300|      0|      throw annotated_error(e, "Internal error, cannot switch on unknown expression: " + show(e));
 1301|  7.89k|    }
 1302|  7.89k|  }
_ZN6hobbes11switchExprCIbED2Ev:
 1179|     40|    virtual ~switchExprC() = default;
_ZNK6hobbes11switchExprCIbE4withEPKNS_4BoolE:
 1200|     20|    T with(const Bool*   v) const override { return withConst(v); }
_ZN6hobbes11switchExprCISt6vectorISt10shared_ptrINS_4ExprEESaIS4_EEED2Ev:
 1179|  61.5k|    virtual ~switchExprC() = default;
_ZNK6hobbes11switchExprCISt6vectorISt10shared_ptrINS_4ExprEESaIS4_EEE4withEPKNS_4UnitE:
 1199|  1.02k|    T with(const Unit*   v) const override { return withConst(v); }
_ZNK6hobbes11switchExprCISt6vectorISt10shared_ptrINS_4ExprEESaIS4_EEE4withEPKNS_4BoolE:
 1200|    294|    T with(const Bool*   v) const override { return withConst(v); }
_ZNK6hobbes11switchExprCISt6vectorISt10shared_ptrINS_4ExprEESaIS4_EEE4withEPKNS_4CharE:
 1201|    662|    T with(const Char*   v) const override { return withConst(v); }
_ZNK6hobbes11switchExprCISt6vectorISt10shared_ptrINS_4ExprEESaIS4_EEE4withEPKNS_4ByteE:
 1202|    332|    T with(const Byte*   v) const override { return withConst(v); }
_ZNK6hobbes11switchExprCISt6vectorISt10shared_ptrINS_4ExprEESaIS4_EEE4withEPKNS_5ShortE:
 1203|      8|    T with(const Short*  v) const override { return withConst(v); }
_ZNK6hobbes11switchExprCISt6vectorISt10shared_ptrINS_4ExprEESaIS4_EEE4withEPKNS_3IntE:
 1204|    738|    T with(const Int*    v) const override { return withConst(v); }
_ZNK6hobbes11switchExprCISt6vectorISt10shared_ptrINS_4ExprEESaIS4_EEE4withEPKNS_6Int128E:
 1206|      4|    T with(const Int128* v) const override { return withConst(v); }
_ZNK6hobbes11switchExprCISt6vectorISt10shared_ptrINS_4ExprEESaIS4_EEE4withEPKNS_4LongE:
 1205|  1.73k|    T with(const Long*   v) const override { return withConst(v); }
_ZNK6hobbes11switchExprCISt6vectorISt10shared_ptrINS_4ExprEESaIS4_EEE4withEPKNS_5FloatE:
 1207|      4|    T with(const Float*  v) const override { return withConst(v); }
_ZNK6hobbes11switchExprCISt6vectorISt10shared_ptrINS_4ExprEESaIS4_EEE4withEPKNS_6DoubleE:
 1208|      4|    T with(const Double* v) const override { return withConst(v); }
_ZN6hobbes11switchExprCISt3setINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4lessIS7_ESaIS7_EEED2Ev:
 1179|  7.50k|    virtual ~switchExprC() = default;
_ZNK6hobbes11switchExprCISt3setINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4lessIS7_ESaIS7_EEE4withEPKNS_4UnitE:
 1199|    183|    T with(const Unit*   v) const override { return withConst(v); }
_ZNK6hobbes11switchExprCISt3setINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4lessIS7_ESaIS7_EEE4withEPKNS_4BoolE:
 1200|     78|    T with(const Bool*   v) const override { return withConst(v); }
_ZNK6hobbes11switchExprCISt3setINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4lessIS7_ESaIS7_EEE4withEPKNS_4CharE:
 1201|    131|    T with(const Char*   v) const override { return withConst(v); }
_ZNK6hobbes11switchExprCISt3setINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4lessIS7_ESaIS7_EEE4withEPKNS_4ByteE:
 1202|     37|    T with(const Byte*   v) const override { return withConst(v); }
_ZNK6hobbes11switchExprCISt3setINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4lessIS7_ESaIS7_EEE4withEPKNS_5ShortE:
 1203|      1|    T with(const Short*  v) const override { return withConst(v); }
_ZNK6hobbes11switchExprCISt3setINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4lessIS7_ESaIS7_EEE4withEPKNS_3IntE:
 1204|    192|    T with(const Int*    v) const override { return withConst(v); }
_ZNK6hobbes11switchExprCISt3setINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4lessIS7_ESaIS7_EEE4withEPKNS_4LongE:
 1205|    436|    T with(const Long*   v) const override { return withConst(v); }
_ZN6hobbes8switchOfISt3setINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4lessIS7_ESaIS7_EEEESt6vectorIT_SaISD_EERKSC_ISt10shared_ptrINS_4ExprEESaISI_EERKNS_10switchExprISD_EE:
 1320|  3.32k|  std::vector<T> switchOf(const Exprs& es, const switchExpr<T>& f) {
 1321|  3.32k|    std::vector<T> result;
 1322|  7.00k|    for (const auto& e : es) {
  ------------------
  |  Branch (1322:24): [True: 7.00k, False: 3.32k]
  ------------------
 1323|  7.00k|      result.push_back(switchOf(e, f));
 1324|  7.00k|    }
 1325|  3.32k|    return result;
 1326|  3.32k|  }
_ZN6hobbes13PrimitiveCaseINS_4UnitEEC2ERKNS_17LexicalAnnotationE:
  306|  1.99k|  PrimitiveCase<Case>::PrimitiveCase(const LexicalAnnotation& la) : Primitive(Case::type_case_id, la) {
  307|  1.99k|  }
_ZN6hobbes13PrimitiveCaseINS_4BoolEEC2ERKNS_17LexicalAnnotationE:
  306|    906|  PrimitiveCase<Case>::PrimitiveCase(const LexicalAnnotation& la) : Primitive(Case::type_case_id, la) {
  307|    906|  }
_ZN6hobbes13PrimitiveCaseINS_4CharEEC2ERKNS_17LexicalAnnotationE:
  306|  1.84k|  PrimitiveCase<Case>::PrimitiveCase(const LexicalAnnotation& la) : Primitive(Case::type_case_id, la) {
  307|  1.84k|  }
_ZN6hobbes13PrimitiveCaseINS_4ByteEEC2ERKNS_17LexicalAnnotationE:
  306|  1.09k|  PrimitiveCase<Case>::PrimitiveCase(const LexicalAnnotation& la) : Primitive(Case::type_case_id, la) {
  307|  1.09k|  }
_ZN6hobbes13PrimitiveCaseINS_5ShortEEC2ERKNS_17LexicalAnnotationE:
  306|     17|  PrimitiveCase<Case>::PrimitiveCase(const LexicalAnnotation& la) : Primitive(Case::type_case_id, la) {
  307|     17|  }
_ZN6hobbes13PrimitiveCaseINS_3IntEEC2ERKNS_17LexicalAnnotationE:
  306|  2.19k|  PrimitiveCase<Case>::PrimitiveCase(const LexicalAnnotation& la) : Primitive(Case::type_case_id, la) {
  307|  2.19k|  }
_ZN6hobbes13PrimitiveCaseINS_4LongEEC2ERKNS_17LexicalAnnotationE:
  306|  4.44k|  PrimitiveCase<Case>::PrimitiveCase(const LexicalAnnotation& la) : Primitive(Case::type_case_id, la) {
  307|  4.44k|  }
_ZN6hobbes13PrimitiveCaseINS_6Int128EEC2ERKNS_17LexicalAnnotationE:
  306|      8|  PrimitiveCase<Case>::PrimitiveCase(const LexicalAnnotation& la) : Primitive(Case::type_case_id, la) {
  307|      8|  }
_ZN6hobbes13PrimitiveCaseINS_5FloatEEC2ERKNS_17LexicalAnnotationE:
  306|      8|  PrimitiveCase<Case>::PrimitiveCase(const LexicalAnnotation& la) : Primitive(Case::type_case_id, la) {
  307|      8|  }
_ZN6hobbes13PrimitiveCaseINS_6DoubleEEC2ERKNS_17LexicalAnnotationE:
  306|      8|  PrimitiveCase<Case>::PrimitiveCase(const LexicalAnnotation& la) : Primitive(Case::type_case_id, la) {
  307|      8|  }
_ZN6hobbes8ExprCaseINS_3VarEEC2ERKNS_17LexicalAnnotationE:
  733|  86.9k|  ExprCase<Case>::ExprCase(const LexicalAnnotation& la) : Expr(Case::type_case_id, la) {
  734|  86.9k|  }
_ZN6hobbes8ExprCaseINS_3LetEEC2ERKNS_17LexicalAnnotationE:
  733|  9.37k|  ExprCase<Case>::ExprCase(const LexicalAnnotation& la) : Expr(Case::type_case_id, la) {
  734|  9.37k|  }
_ZN6hobbes8ExprCaseINS_6LetRecEEC2ERKNS_17LexicalAnnotationE:
  733|     48|  ExprCase<Case>::ExprCase(const LexicalAnnotation& la) : Expr(Case::type_case_id, la) {
  734|     48|  }
_ZN6hobbes8ExprCaseINS_2FnEEC2ERKNS_17LexicalAnnotationE:
  733|  5.42k|  ExprCase<Case>::ExprCase(const LexicalAnnotation& la) : Expr(Case::type_case_id, la) {
  734|  5.42k|  }
_ZN6hobbes8ExprCaseINS_3AppEEC2ERKNS_17LexicalAnnotationE:
  733|  36.1k|  ExprCase<Case>::ExprCase(const LexicalAnnotation& la) : Expr(Case::type_case_id, la) {
  734|  36.1k|  }
_ZN6hobbes8ExprCaseINS_6AssignEEC2ERKNS_17LexicalAnnotationE:
  733|  1.41k|  ExprCase<Case>::ExprCase(const LexicalAnnotation& la) : Expr(Case::type_case_id, la) {
  734|  1.41k|  }
_ZN6hobbes8ExprCaseINS_7MkArrayEEC2ERKNS_17LexicalAnnotationE:
  733|    890|  ExprCase<Case>::ExprCase(const LexicalAnnotation& la) : Expr(Case::type_case_id, la) {
  734|    890|  }
_ZN6hobbes8ExprCaseINS_9MkVariantEEC2ERKNS_17LexicalAnnotationE:
  733|    960|  ExprCase<Case>::ExprCase(const LexicalAnnotation& la) : Expr(Case::type_case_id, la) {
  734|    960|  }
_ZN6hobbes8ExprCaseINS_8MkRecordEEC2ERKNS_17LexicalAnnotationE:
  733|  1.26k|  ExprCase<Case>::ExprCase(const LexicalAnnotation& la) : Expr(Case::type_case_id, la) {
  734|  1.26k|  }
_ZN6hobbes8ExprCaseINS_6AIndexEEC2ERKNS_17LexicalAnnotationE:
  733|  2.68k|  ExprCase<Case>::ExprCase(const LexicalAnnotation& la) : Expr(Case::type_case_id, la) {
  734|  2.68k|  }
_ZN6hobbes8ExprCaseINS_4CaseEEC2ERKNS_17LexicalAnnotationE:
  733|  1.00k|  ExprCase<Case>::ExprCase(const LexicalAnnotation& la) : Expr(Case::type_case_id, la) {
  734|  1.00k|  }
_ZN6hobbes8ExprCaseINS_6SwitchEEC2ERKNS_17LexicalAnnotationE:
  733|     84|  ExprCase<Case>::ExprCase(const LexicalAnnotation& la) : Expr(Case::type_case_id, la) {
  734|     84|  }
_ZN6hobbes8ExprCaseINS_4ProjEEC2ERKNS_17LexicalAnnotationE:
  733|  4.39k|  ExprCase<Case>::ExprCase(const LexicalAnnotation& la) : Expr(Case::type_case_id, la) {
  734|  4.39k|  }
_ZN6hobbes8ExprCaseINS_6AssumpEEC2ERKNS_17LexicalAnnotationE:
  733|  23.8k|  ExprCase<Case>::ExprCase(const LexicalAnnotation& la) : Expr(Case::type_case_id, la) {
  734|  23.8k|  }
_ZN6hobbes8ExprCaseINS_4PackEEC2ERKNS_17LexicalAnnotationE:
  733|    277|  ExprCase<Case>::ExprCase(const LexicalAnnotation& la) : Expr(Case::type_case_id, la) {
  734|    277|  }
_ZN6hobbes8ExprCaseINS_6UnpackEEC2ERKNS_17LexicalAnnotationE:
  733|     63|  ExprCase<Case>::ExprCase(const LexicalAnnotation& la) : Expr(Case::type_case_id, la) {
  734|     63|  }
_ZN6hobbes8switchOfIbEET_RKSt10shared_ptrINS_4ExprEERKNS_10switchExprIS1_EE:
 1310|     40|  T switchOf(const ExprPtr& e, const switchExpr<T>& f) {
 1311|     40|    return switchOfF< T, const switchExpr<T>& >(*e, f);
 1312|     40|  }
_ZN6hobbes9switchOfFIbRKNS_10switchExprIbEEEET_RKNS_4ExprET0_:
 1245|     40|  T switchOfF(const Expr& e, F f) {
 1246|     40|    switch (e.case_id()) {
 1247|      0|    case Unit::type_case_id:
  ------------------
  |  Branch (1247:5): [True: 0, False: 40]
  ------------------
 1248|      0|      return f.with(crcast<Unit*>(&e));
 1249|     20|    case Bool::type_case_id:
  ------------------
  |  Branch (1249:5): [True: 20, False: 20]
  ------------------
 1250|     20|      return f.with(crcast<Bool*>(&e));
 1251|      0|    case Char::type_case_id:
  ------------------
  |  Branch (1251:5): [True: 0, False: 40]
  ------------------
 1252|      0|      return f.with(crcast<Char*>(&e));
 1253|      0|    case Byte::type_case_id:
  ------------------
  |  Branch (1253:5): [True: 0, False: 40]
  ------------------
 1254|      0|      return f.with(crcast<Byte*>(&e));
 1255|      0|    case Short::type_case_id:
  ------------------
  |  Branch (1255:5): [True: 0, False: 40]
  ------------------
 1256|      0|      return f.with(crcast<Short*>(&e));
 1257|      0|    case Int::type_case_id:
  ------------------
  |  Branch (1257:5): [True: 0, False: 40]
  ------------------
 1258|      0|      return f.with(crcast<Int*>(&e));
 1259|      0|    case Long::type_case_id:
  ------------------
  |  Branch (1259:5): [True: 0, False: 40]
  ------------------
 1260|      0|      return f.with(crcast<Long*>(&e));
 1261|      0|    case Int128::type_case_id:
  ------------------
  |  Branch (1261:5): [True: 0, False: 40]
  ------------------
 1262|      0|      return f.with(crcast<Int128*>(&e));
 1263|      0|    case Float::type_case_id:
  ------------------
  |  Branch (1263:5): [True: 0, False: 40]
  ------------------
 1264|      0|      return f.with(crcast<Float*>(&e));
 1265|      0|    case Double::type_case_id:
  ------------------
  |  Branch (1265:5): [True: 0, False: 40]
  ------------------
 1266|      0|      return f.with(crcast<Double*>(&e));
 1267|      8|    case Var::type_case_id:
  ------------------
  |  Branch (1267:5): [True: 8, False: 32]
  ------------------
 1268|      8|      return f.with(crcast<Var*>(&e));
 1269|      0|    case Let::type_case_id:
  ------------------
  |  Branch (1269:5): [True: 0, False: 40]
  ------------------
 1270|      0|      return f.with(crcast<Let*>(&e));
 1271|      0|    case LetRec::type_case_id:
  ------------------
  |  Branch (1271:5): [True: 0, False: 40]
  ------------------
 1272|      0|      return f.with(crcast<LetRec*>(&e));
 1273|      0|    case Fn::type_case_id:
  ------------------
  |  Branch (1273:5): [True: 0, False: 40]
  ------------------
 1274|      0|      return f.with(crcast<Fn*>(&e));
 1275|      4|    case App::type_case_id:
  ------------------
  |  Branch (1275:5): [True: 4, False: 36]
  ------------------
 1276|      4|      return f.with(crcast<App*>(&e));
 1277|      0|    case Assign::type_case_id:
  ------------------
  |  Branch (1277:5): [True: 0, False: 40]
  ------------------
 1278|      0|      return f.with(crcast<Assign*>(&e));
 1279|      0|    case MkArray::type_case_id:
  ------------------
  |  Branch (1279:5): [True: 0, False: 40]
  ------------------
 1280|      0|      return f.with(crcast<MkArray*>(&e));
 1281|      0|    case MkVariant::type_case_id:
  ------------------
  |  Branch (1281:5): [True: 0, False: 40]
  ------------------
 1282|      0|      return f.with(crcast<MkVariant*>(&e));
 1283|      8|    case MkRecord::type_case_id:
  ------------------
  |  Branch (1283:5): [True: 8, False: 32]
  ------------------
 1284|      8|      return f.with(crcast<MkRecord*>(&e));
 1285|      0|    case AIndex::type_case_id:
  ------------------
  |  Branch (1285:5): [True: 0, False: 40]
  ------------------
 1286|      0|      return f.with(crcast<AIndex*>(&e));
 1287|      0|    case Case::type_case_id:
  ------------------
  |  Branch (1287:5): [True: 0, False: 40]
  ------------------
 1288|      0|      return f.with(crcast<Case*>(&e));
 1289|      0|    case Switch::type_case_id:
  ------------------
  |  Branch (1289:5): [True: 0, False: 40]
  ------------------
 1290|      0|      return f.with(crcast<Switch*>(&e));
 1291|      0|    case Proj::type_case_id:
  ------------------
  |  Branch (1291:5): [True: 0, False: 40]
  ------------------
 1292|      0|      return f.with(crcast<Proj*>(&e));
 1293|      0|    case Assump::type_case_id:
  ------------------
  |  Branch (1293:5): [True: 0, False: 40]
  ------------------
 1294|      0|      return f.with(crcast<Assump*>(&e));
 1295|      0|    case Pack::type_case_id:
  ------------------
  |  Branch (1295:5): [True: 0, False: 40]
  ------------------
 1296|      0|      return f.with(crcast<Pack*>(&e));
 1297|      0|    case Unpack::type_case_id:
  ------------------
  |  Branch (1297:5): [True: 0, False: 40]
  ------------------
 1298|      0|      return f.with(crcast<Unpack*>(&e));
 1299|      0|    default:
  ------------------
  |  Branch (1299:5): [True: 0, False: 40]
  ------------------
 1300|      0|      throw annotated_error(e, "Internal error, cannot switch on unknown expression: " + show(e));
 1301|     40|    }
 1302|     40|  }
_ZN6hobbes8switchOfISt6vectorISt10shared_ptrINS_4ExprEESaIS4_EEEET_RKS4_RKNS_10switchExprIS7_EE:
 1310|  61.5k|  T switchOf(const ExprPtr& e, const switchExpr<T>& f) {
 1311|  61.5k|    return switchOfF< T, const switchExpr<T>& >(*e, f);
 1312|  61.5k|  }
_ZN6hobbes9switchOfFISt6vectorISt10shared_ptrINS_4ExprEESaIS4_EERKNS_10switchExprIS6_EEEET_RKS3_T0_:
 1245|  61.5k|  T switchOfF(const Expr& e, F f) {
 1246|  61.5k|    switch (e.case_id()) {
 1247|  1.02k|    case Unit::type_case_id:
  ------------------
  |  Branch (1247:5): [True: 1.02k, False: 60.5k]
  ------------------
 1248|  1.02k|      return f.with(crcast<Unit*>(&e));
 1249|    294|    case Bool::type_case_id:
  ------------------
  |  Branch (1249:5): [True: 294, False: 61.2k]
  ------------------
 1250|    294|      return f.with(crcast<Bool*>(&e));
 1251|    662|    case Char::type_case_id:
  ------------------
  |  Branch (1251:5): [True: 662, False: 60.8k]
  ------------------
 1252|    662|      return f.with(crcast<Char*>(&e));
 1253|    332|    case Byte::type_case_id:
  ------------------
  |  Branch (1253:5): [True: 332, False: 61.2k]
  ------------------
 1254|    332|      return f.with(crcast<Byte*>(&e));
 1255|      8|    case Short::type_case_id:
  ------------------
  |  Branch (1255:5): [True: 8, False: 61.5k]
  ------------------
 1256|      8|      return f.with(crcast<Short*>(&e));
 1257|    738|    case Int::type_case_id:
  ------------------
  |  Branch (1257:5): [True: 738, False: 60.8k]
  ------------------
 1258|    738|      return f.with(crcast<Int*>(&e));
 1259|  1.73k|    case Long::type_case_id:
  ------------------
  |  Branch (1259:5): [True: 1.73k, False: 59.8k]
  ------------------
 1260|  1.73k|      return f.with(crcast<Long*>(&e));
 1261|      4|    case Int128::type_case_id:
  ------------------
  |  Branch (1261:5): [True: 4, False: 61.5k]
  ------------------
 1262|      4|      return f.with(crcast<Int128*>(&e));
 1263|      4|    case Float::type_case_id:
  ------------------
  |  Branch (1263:5): [True: 4, False: 61.5k]
  ------------------
 1264|      4|      return f.with(crcast<Float*>(&e));
 1265|      4|    case Double::type_case_id:
  ------------------
  |  Branch (1265:5): [True: 4, False: 61.5k]
  ------------------
 1266|      4|      return f.with(crcast<Double*>(&e));
 1267|  33.7k|    case Var::type_case_id:
  ------------------
  |  Branch (1267:5): [True: 33.7k, False: 27.7k]
  ------------------
 1268|  33.7k|      return f.with(crcast<Var*>(&e));
 1269|  3.07k|    case Let::type_case_id:
  ------------------
  |  Branch (1269:5): [True: 3.07k, False: 58.4k]
  ------------------
 1270|  3.07k|      return f.with(crcast<Let*>(&e));
 1271|      8|    case LetRec::type_case_id:
  ------------------
  |  Branch (1271:5): [True: 8, False: 61.5k]
  ------------------
 1272|      8|      return f.with(crcast<LetRec*>(&e));
 1273|    470|    case Fn::type_case_id:
  ------------------
  |  Branch (1273:5): [True: 470, False: 61.0k]
  ------------------
 1274|    470|      return f.with(crcast<Fn*>(&e));
 1275|  13.7k|    case App::type_case_id:
  ------------------
  |  Branch (1275:5): [True: 13.7k, False: 47.7k]
  ------------------
 1276|  13.7k|      return f.with(crcast<App*>(&e));
 1277|    620|    case Assign::type_case_id:
  ------------------
  |  Branch (1277:5): [True: 620, False: 60.9k]
  ------------------
 1278|    620|      return f.with(crcast<Assign*>(&e));
 1279|    484|    case MkArray::type_case_id:
  ------------------
  |  Branch (1279:5): [True: 484, False: 61.0k]
  ------------------
 1280|    484|      return f.with(crcast<MkArray*>(&e));
 1281|    104|    case MkVariant::type_case_id:
  ------------------
  |  Branch (1281:5): [True: 104, False: 61.4k]
  ------------------
 1282|    104|      return f.with(crcast<MkVariant*>(&e));
 1283|    282|    case MkRecord::type_case_id:
  ------------------
  |  Branch (1283:5): [True: 282, False: 61.2k]
  ------------------
 1284|    282|      return f.with(crcast<MkRecord*>(&e));
 1285|  1.05k|    case AIndex::type_case_id:
  ------------------
  |  Branch (1285:5): [True: 1.05k, False: 60.4k]
  ------------------
 1286|  1.05k|      return f.with(crcast<AIndex*>(&e));
 1287|    294|    case Case::type_case_id:
  ------------------
  |  Branch (1287:5): [True: 294, False: 61.2k]
  ------------------
 1288|    294|      return f.with(crcast<Case*>(&e));
 1289|     14|    case Switch::type_case_id:
  ------------------
  |  Branch (1289:5): [True: 14, False: 61.5k]
  ------------------
 1290|     14|      return f.with(crcast<Switch*>(&e));
 1291|  1.29k|    case Proj::type_case_id:
  ------------------
  |  Branch (1291:5): [True: 1.29k, False: 60.2k]
  ------------------
 1292|  1.29k|      return f.with(crcast<Proj*>(&e));
 1293|  1.53k|    case Assump::type_case_id:
  ------------------
  |  Branch (1293:5): [True: 1.53k, False: 60.0k]
  ------------------
 1294|  1.53k|      return f.with(crcast<Assump*>(&e));
 1295|      0|    case Pack::type_case_id:
  ------------------
  |  Branch (1295:5): [True: 0, False: 61.5k]
  ------------------
 1296|      0|      return f.with(crcast<Pack*>(&e));
 1297|      4|    case Unpack::type_case_id:
  ------------------
  |  Branch (1297:5): [True: 4, False: 61.5k]
  ------------------
 1298|      4|      return f.with(crcast<Unpack*>(&e));
 1299|      0|    default:
  ------------------
  |  Branch (1299:5): [True: 0, False: 61.5k]
  ------------------
 1300|      0|      throw annotated_error(e, "Internal error, cannot switch on unknown expression: " + show(e));
 1301|  61.5k|    }
 1302|  61.5k|  }
_ZN6hobbes8switchOfIhEET_RKSt10shared_ptrINS_4ExprEERKNS_11switchExprMIS1_EE:
 1315|  40.7k|  T switchOf(const ExprPtr& e, const switchExprM<T>& f) {
 1316|  40.7k|    return switchOfF< T, switchExprM<T>& >(*e, const_cast<switchExprM<T>&>(f));
 1317|  40.7k|  }
_ZN6hobbes9switchOfFIhRNS_11switchExprMIhEEEET_RKNS_4ExprET0_:
 1245|  40.7k|  T switchOfF(const Expr& e, F f) {
 1246|  40.7k|    switch (e.case_id()) {
 1247|    425|    case Unit::type_case_id:
  ------------------
  |  Branch (1247:5): [True: 425, False: 40.3k]
  ------------------
 1248|    425|      return f.with(crcast<Unit*>(&e));
 1249|    179|    case Bool::type_case_id:
  ------------------
  |  Branch (1249:5): [True: 179, False: 40.5k]
  ------------------
 1250|    179|      return f.with(crcast<Bool*>(&e));
 1251|    288|    case Char::type_case_id:
  ------------------
  |  Branch (1251:5): [True: 288, False: 40.4k]
  ------------------
 1252|    288|      return f.with(crcast<Char*>(&e));
 1253|    338|    case Byte::type_case_id:
  ------------------
  |  Branch (1253:5): [True: 338, False: 40.3k]
  ------------------
 1254|    338|      return f.with(crcast<Byte*>(&e));
 1255|     10|    case Short::type_case_id:
  ------------------
  |  Branch (1255:5): [True: 10, False: 40.7k]
  ------------------
 1256|     10|      return f.with(crcast<Short*>(&e));
 1257|    413|    case Int::type_case_id:
  ------------------
  |  Branch (1257:5): [True: 413, False: 40.3k]
  ------------------
 1258|    413|      return f.with(crcast<Int*>(&e));
 1259|  1.05k|    case Long::type_case_id:
  ------------------
  |  Branch (1259:5): [True: 1.05k, False: 39.6k]
  ------------------
 1260|  1.05k|      return f.with(crcast<Long*>(&e));
 1261|      8|    case Int128::type_case_id:
  ------------------
  |  Branch (1261:5): [True: 8, False: 40.7k]
  ------------------
 1262|      8|      return f.with(crcast<Int128*>(&e));
 1263|      8|    case Float::type_case_id:
  ------------------
  |  Branch (1263:5): [True: 8, False: 40.7k]
  ------------------
 1264|      8|      return f.with(crcast<Float*>(&e));
 1265|      8|    case Double::type_case_id:
  ------------------
  |  Branch (1265:5): [True: 8, False: 40.7k]
  ------------------
 1266|      8|      return f.with(crcast<Double*>(&e));
 1267|  18.3k|    case Var::type_case_id:
  ------------------
  |  Branch (1267:5): [True: 18.3k, False: 22.3k]
  ------------------
 1268|  18.3k|      return f.with(crcast<Var*>(&e));
 1269|  1.44k|    case Let::type_case_id:
  ------------------
  |  Branch (1269:5): [True: 1.44k, False: 39.2k]
  ------------------
 1270|  1.44k|      return f.with(crcast<Let*>(&e));
 1271|      8|    case LetRec::type_case_id:
  ------------------
  |  Branch (1271:5): [True: 8, False: 40.7k]
  ------------------
 1272|      8|      return f.with(crcast<LetRec*>(&e));
 1273|  1.32k|    case Fn::type_case_id:
  ------------------
  |  Branch (1273:5): [True: 1.32k, False: 39.3k]
  ------------------
 1274|  1.32k|      return f.with(crcast<Fn*>(&e));
 1275|  7.34k|    case App::type_case_id:
  ------------------
  |  Branch (1275:5): [True: 7.34k, False: 33.3k]
  ------------------
 1276|  7.34k|      return f.with(crcast<App*>(&e));
 1277|    247|    case Assign::type_case_id:
  ------------------
  |  Branch (1277:5): [True: 247, False: 40.4k]
  ------------------
 1278|    247|      return f.with(crcast<Assign*>(&e));
 1279|    144|    case MkArray::type_case_id:
  ------------------
  |  Branch (1279:5): [True: 144, False: 40.5k]
  ------------------
 1280|    144|      return f.with(crcast<MkArray*>(&e));
 1281|    245|    case MkVariant::type_case_id:
  ------------------
  |  Branch (1281:5): [True: 245, False: 40.4k]
  ------------------
 1282|    245|      return f.with(crcast<MkVariant*>(&e));
 1283|    210|    case MkRecord::type_case_id:
  ------------------
  |  Branch (1283:5): [True: 210, False: 40.5k]
  ------------------
 1284|    210|      return f.with(crcast<MkRecord*>(&e));
 1285|    551|    case AIndex::type_case_id:
  ------------------
  |  Branch (1285:5): [True: 551, False: 40.1k]
  ------------------
 1286|    551|      return f.with(crcast<AIndex*>(&e));
 1287|    122|    case Case::type_case_id:
  ------------------
  |  Branch (1287:5): [True: 122, False: 40.6k]
  ------------------
 1288|    122|      return f.with(crcast<Case*>(&e));
 1289|     16|    case Switch::type_case_id:
  ------------------
  |  Branch (1289:5): [True: 16, False: 40.7k]
  ------------------
 1290|     16|      return f.with(crcast<Switch*>(&e));
 1291|    570|    case Proj::type_case_id:
  ------------------
  |  Branch (1291:5): [True: 570, False: 40.1k]
  ------------------
 1292|    570|      return f.with(crcast<Proj*>(&e));
 1293|  7.37k|    case Assump::type_case_id:
  ------------------
  |  Branch (1293:5): [True: 7.37k, False: 33.3k]
  ------------------
 1294|  7.37k|      return f.with(crcast<Assump*>(&e));
 1295|     47|    case Pack::type_case_id:
  ------------------
  |  Branch (1295:5): [True: 47, False: 40.6k]
  ------------------
 1296|     47|      return f.with(crcast<Pack*>(&e));
 1297|     17|    case Unpack::type_case_id:
  ------------------
  |  Branch (1297:5): [True: 17, False: 40.7k]
  ------------------
 1298|     17|      return f.with(crcast<Unpack*>(&e));
 1299|      0|    default:
  ------------------
  |  Branch (1299:5): [True: 0, False: 40.7k]
  ------------------
 1300|      0|      throw annotated_error(e, "Internal error, cannot switch on unknown expression: " + show(e));
 1301|  40.7k|    }
 1302|  40.7k|  }
_ZN6hobbes8switchOfIhEESt6vectorIT_SaIS2_EERKS1_ISt10shared_ptrINS_4ExprEESaIS7_EERKNS_11switchExprMIS2_EE:
 1329|  4.13k|  std::vector<T> switchOf(const Exprs& es, const switchExprM<T>& f) {
 1330|  4.13k|    std::vector<T> result;
 1331|  8.65k|    for (const auto& e : es) {
  ------------------
  |  Branch (1331:24): [True: 8.65k, False: 4.13k]
  ------------------
 1332|  8.65k|      result.push_back(switchOf(e, const_cast<switchExprM<T>&>(f)));
 1333|  8.65k|    }
 1334|  4.13k|    return result;
 1335|  4.13k|  }
_ZN6hobbes8switchOfINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEhEESt6vectorISt4pairIT_T0_ESaISB_EERKS7_IS8_IS9_St10shared_ptrINS_4ExprEEESaISH_EERKNS_11switchExprMISA_EE:
 1349|    111|  std::vector< std::pair<K, T> > switchOf(const std::vector< std::pair<K, ExprPtr> >& kes, const switchExprM<T>& f) {
 1350|    111|    using KT = std::pair<K, T>;
 1351|    111|    using KTS = std::vector<KT>;
 1352|    111|    KTS kts;
 1353|    248|    for (const auto& ke : kes) {
  ------------------
  |  Branch (1353:25): [True: 248, False: 111]
  ------------------
 1354|    248|      kts.push_back(KT(ke.first, switchOf(ke.second, const_cast<switchExprM<T>&>(f))));
 1355|    248|    }
 1356|    111|    return kts;
 1357|    111|  }
_ZN6hobbes8switchOfISt3setINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4lessIS7_ESaIS7_EEEET_RKSt10shared_ptrINS_4ExprEERKNS_10switchExprISC_EE:
 1310|  14.5k|  T switchOf(const ExprPtr& e, const switchExpr<T>& f) {
 1311|  14.5k|    return switchOfF< T, const switchExpr<T>& >(*e, f);
 1312|  14.5k|  }
_ZN6hobbes9switchOfFISt3setINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4lessIS7_ESaIS7_EERKNS_10switchExprISB_EEEET_RKNS_4ExprET0_:
 1245|  14.5k|  T switchOfF(const Expr& e, F f) {
 1246|  14.5k|    switch (e.case_id()) {
 1247|    183|    case Unit::type_case_id:
  ------------------
  |  Branch (1247:5): [True: 183, False: 14.3k]
  ------------------
 1248|    183|      return f.with(crcast<Unit*>(&e));
 1249|     78|    case Bool::type_case_id:
  ------------------
  |  Branch (1249:5): [True: 78, False: 14.4k]
  ------------------
 1250|     78|      return f.with(crcast<Bool*>(&e));
 1251|    131|    case Char::type_case_id:
  ------------------
  |  Branch (1251:5): [True: 131, False: 14.3k]
  ------------------
 1252|    131|      return f.with(crcast<Char*>(&e));
 1253|     37|    case Byte::type_case_id:
  ------------------
  |  Branch (1253:5): [True: 37, False: 14.4k]
  ------------------
 1254|     37|      return f.with(crcast<Byte*>(&e));
 1255|      1|    case Short::type_case_id:
  ------------------
  |  Branch (1255:5): [True: 1, False: 14.5k]
  ------------------
 1256|      1|      return f.with(crcast<Short*>(&e));
 1257|    192|    case Int::type_case_id:
  ------------------
  |  Branch (1257:5): [True: 192, False: 14.3k]
  ------------------
 1258|    192|      return f.with(crcast<Int*>(&e));
 1259|    436|    case Long::type_case_id:
  ------------------
  |  Branch (1259:5): [True: 436, False: 14.0k]
  ------------------
 1260|    436|      return f.with(crcast<Long*>(&e));
 1261|      0|    case Int128::type_case_id:
  ------------------
  |  Branch (1261:5): [True: 0, False: 14.5k]
  ------------------
 1262|      0|      return f.with(crcast<Int128*>(&e));
 1263|      0|    case Float::type_case_id:
  ------------------
  |  Branch (1263:5): [True: 0, False: 14.5k]
  ------------------
 1264|      0|      return f.with(crcast<Float*>(&e));
 1265|      0|    case Double::type_case_id:
  ------------------
  |  Branch (1265:5): [True: 0, False: 14.5k]
  ------------------
 1266|      0|      return f.with(crcast<Double*>(&e));
 1267|  7.64k|    case Var::type_case_id:
  ------------------
  |  Branch (1267:5): [True: 7.64k, False: 6.86k]
  ------------------
 1268|  7.64k|      return f.with(crcast<Var*>(&e));
 1269|    792|    case Let::type_case_id:
  ------------------
  |  Branch (1269:5): [True: 792, False: 13.7k]
  ------------------
 1270|    792|      return f.with(crcast<Let*>(&e));
 1271|      4|    case LetRec::type_case_id:
  ------------------
  |  Branch (1271:5): [True: 4, False: 14.5k]
  ------------------
 1272|      4|      return f.with(crcast<LetRec*>(&e));
 1273|     70|    case Fn::type_case_id:
  ------------------
  |  Branch (1273:5): [True: 70, False: 14.4k]
  ------------------
 1274|     70|      return f.with(crcast<Fn*>(&e));
 1275|  3.12k|    case App::type_case_id:
  ------------------
  |  Branch (1275:5): [True: 3.12k, False: 11.3k]
  ------------------
 1276|  3.12k|      return f.with(crcast<App*>(&e));
 1277|    110|    case Assign::type_case_id:
  ------------------
  |  Branch (1277:5): [True: 110, False: 14.3k]
  ------------------
 1278|    110|      return f.with(crcast<Assign*>(&e));
 1279|     76|    case MkArray::type_case_id:
  ------------------
  |  Branch (1279:5): [True: 76, False: 14.4k]
  ------------------
 1280|     76|      return f.with(crcast<MkArray*>(&e));
 1281|     86|    case MkVariant::type_case_id:
  ------------------
  |  Branch (1281:5): [True: 86, False: 14.4k]
  ------------------
 1282|     86|      return f.with(crcast<MkVariant*>(&e));
 1283|    129|    case MkRecord::type_case_id:
  ------------------
  |  Branch (1283:5): [True: 129, False: 14.3k]
  ------------------
 1284|    129|      return f.with(crcast<MkRecord*>(&e));
 1285|    263|    case AIndex::type_case_id:
  ------------------
  |  Branch (1285:5): [True: 263, False: 14.2k]
  ------------------
 1286|    263|      return f.with(crcast<AIndex*>(&e));
 1287|     54|    case Case::type_case_id:
  ------------------
  |  Branch (1287:5): [True: 54, False: 14.4k]
  ------------------
 1288|     54|      return f.with(crcast<Case*>(&e));
 1289|      8|    case Switch::type_case_id:
  ------------------
  |  Branch (1289:5): [True: 8, False: 14.5k]
  ------------------
 1290|      8|      return f.with(crcast<Switch*>(&e));
 1291|    300|    case Proj::type_case_id:
  ------------------
  |  Branch (1291:5): [True: 300, False: 14.2k]
  ------------------
 1292|    300|      return f.with(crcast<Proj*>(&e));
 1293|    754|    case Assump::type_case_id:
  ------------------
  |  Branch (1293:5): [True: 754, False: 13.7k]
  ------------------
 1294|    754|      return f.with(crcast<Assump*>(&e));
 1295|     28|    case Pack::type_case_id:
  ------------------
  |  Branch (1295:5): [True: 28, False: 14.4k]
  ------------------
 1296|     28|      return f.with(crcast<Pack*>(&e));
 1297|      6|    case Unpack::type_case_id:
  ------------------
  |  Branch (1297:5): [True: 6, False: 14.5k]
  ------------------
 1298|      6|      return f.with(crcast<Unpack*>(&e));
 1299|      0|    default:
  ------------------
  |  Branch (1299:5): [True: 0, False: 14.5k]
  ------------------
 1300|      0|      throw annotated_error(e, "Internal error, cannot switch on unknown expression: " + show(e));
 1301|  14.5k|    }
 1302|  14.5k|  }
_ZN6hobbes8switchOfIPN4llvm5ValueEEESt6vectorIT_SaIS5_EERKS4_ISt10shared_ptrINS_4ExprEESaISA_EERKNS_10switchExprIS5_EE:
 1320|     32|  std::vector<T> switchOf(const Exprs& es, const switchExpr<T>& f) {
 1321|     32|    std::vector<T> result;
 1322|     36|    for (const auto& e : es) {
  ------------------
  |  Branch (1322:24): [True: 36, False: 32]
  ------------------
 1323|     36|      result.push_back(switchOf(e, f));
 1324|     36|    }
 1325|     32|    return result;
 1326|     32|  }
_ZN6hobbes8switchOfIPN4llvm8ConstantEEESt6vectorIT_SaIS5_EERKS4_ISt10shared_ptrINS_4ExprEESaISA_EERKNS_10switchExprIS5_EE:
 1320|      9|  std::vector<T> switchOf(const Exprs& es, const switchExpr<T>& f) {
 1321|      9|    std::vector<T> result;
 1322|    706|    for (const auto& e : es) {
  ------------------
  |  Branch (1322:24): [True: 706, False: 9]
  ------------------
 1323|    706|      result.push_back(switchOf(e, f));
 1324|    706|    }
 1325|      9|    return result;
 1326|      9|  }
_ZN6hobbes8switchOfIPN4llvm11ConstantIntEEET_RKSt10shared_ptrINS_9PrimitiveEERKNS_11switchConstIS4_EE:
 1117|      4|  T switchOf(const PrimitivePtr& p, const switchConst<T>& f) {
 1118|      4|    switch (p->case_id()) {
 1119|      0|    case Unit::type_case_id:
  ------------------
  |  Branch (1119:5): [True: 0, False: 4]
  ------------------
 1120|      0|      return f.with(crcast<Unit*>(p.get()));
 1121|      0|    case Bool::type_case_id:
  ------------------
  |  Branch (1121:5): [True: 0, False: 4]
  ------------------
 1122|      0|      return f.with(crcast<Bool*>(p.get()));
 1123|      0|    case Char::type_case_id:
  ------------------
  |  Branch (1123:5): [True: 0, False: 4]
  ------------------
 1124|      0|      return f.with(crcast<Char*>(p.get()));
 1125|      0|    case Byte::type_case_id:
  ------------------
  |  Branch (1125:5): [True: 0, False: 4]
  ------------------
 1126|      0|      return f.with(crcast<Byte*>(p.get()));
 1127|      0|    case Short::type_case_id:
  ------------------
  |  Branch (1127:5): [True: 0, False: 4]
  ------------------
 1128|      0|      return f.with(crcast<Short*>(p.get()));
 1129|      0|    case Int::type_case_id:
  ------------------
  |  Branch (1129:5): [True: 0, False: 4]
  ------------------
 1130|      0|      return f.with(crcast<Int*>(p.get()));
 1131|      4|    case Long::type_case_id:
  ------------------
  |  Branch (1131:5): [True: 4, False: 0]
  ------------------
 1132|      4|      return f.with(crcast<Long*>(p.get()));
 1133|      0|    case Int128::type_case_id:
  ------------------
  |  Branch (1133:5): [True: 0, False: 4]
  ------------------
 1134|      0|      return f.with(crcast<Int128*>(p.get()));
 1135|      0|    case Float::type_case_id:
  ------------------
  |  Branch (1135:5): [True: 0, False: 4]
  ------------------
 1136|      0|      return f.with(crcast<Float*>(p.get()));
 1137|      0|    case Double::type_case_id:
  ------------------
  |  Branch (1137:5): [True: 0, False: 4]
  ------------------
 1138|      0|      return f.with(crcast<Double*>(p.get()));
 1139|      0|    default:
  ------------------
  |  Branch (1139:5): [True: 0, False: 4]
  ------------------
 1140|      0|      throw annotated_error(*p, "Internal error, cannot switch on unknown constant: " + show(p));
 1141|      4|    }
 1142|      4|  }
_ZN6hobbes8switchOfIPN4llvm5ValueEEET_RKSt10shared_ptrINS_4ExprEERKNS_10switchExprIS4_EE:
 1310|  4.56k|  T switchOf(const ExprPtr& e, const switchExpr<T>& f) {
 1311|  4.56k|    return switchOfF< T, const switchExpr<T>& >(*e, f);
 1312|  4.56k|  }
_ZN6hobbes9switchOfFIPN4llvm5ValueERKNS_10switchExprIS3_EEEET_RKNS_4ExprET0_:
 1245|  4.56k|  T switchOfF(const Expr& e, F f) {
 1246|  4.56k|    switch (e.case_id()) {
 1247|     90|    case Unit::type_case_id:
  ------------------
  |  Branch (1247:5): [True: 90, False: 4.47k]
  ------------------
 1248|     90|      return f.with(crcast<Unit*>(&e));
 1249|     42|    case Bool::type_case_id:
  ------------------
  |  Branch (1249:5): [True: 42, False: 4.52k]
  ------------------
 1250|     42|      return f.with(crcast<Bool*>(&e));
 1251|     69|    case Char::type_case_id:
  ------------------
  |  Branch (1251:5): [True: 69, False: 4.49k]
  ------------------
 1252|     69|      return f.with(crcast<Char*>(&e));
 1253|      9|    case Byte::type_case_id:
  ------------------
  |  Branch (1253:5): [True: 9, False: 4.55k]
  ------------------
 1254|      9|      return f.with(crcast<Byte*>(&e));
 1255|      0|    case Short::type_case_id:
  ------------------
  |  Branch (1255:5): [True: 0, False: 4.56k]
  ------------------
 1256|      0|      return f.with(crcast<Short*>(&e));
 1257|     50|    case Int::type_case_id:
  ------------------
  |  Branch (1257:5): [True: 50, False: 4.51k]
  ------------------
 1258|     50|      return f.with(crcast<Int*>(&e));
 1259|    159|    case Long::type_case_id:
  ------------------
  |  Branch (1259:5): [True: 159, False: 4.40k]
  ------------------
 1260|    159|      return f.with(crcast<Long*>(&e));
 1261|      0|    case Int128::type_case_id:
  ------------------
  |  Branch (1261:5): [True: 0, False: 4.56k]
  ------------------
 1262|      0|      return f.with(crcast<Int128*>(&e));
 1263|      0|    case Float::type_case_id:
  ------------------
  |  Branch (1263:5): [True: 0, False: 4.56k]
  ------------------
 1264|      0|      return f.with(crcast<Float*>(&e));
 1265|      0|    case Double::type_case_id:
  ------------------
  |  Branch (1265:5): [True: 0, False: 4.56k]
  ------------------
 1266|      0|      return f.with(crcast<Double*>(&e));
 1267|  1.78k|    case Var::type_case_id:
  ------------------
  |  Branch (1267:5): [True: 1.78k, False: 2.77k]
  ------------------
 1268|  1.78k|      return f.with(crcast<Var*>(&e));
 1269|    203|    case Let::type_case_id:
  ------------------
  |  Branch (1269:5): [True: 203, False: 4.36k]
  ------------------
 1270|    203|      return f.with(crcast<Let*>(&e));
 1271|      0|    case LetRec::type_case_id:
  ------------------
  |  Branch (1271:5): [True: 0, False: 4.56k]
  ------------------
 1272|      0|      return f.with(crcast<LetRec*>(&e));
 1273|     30|    case Fn::type_case_id:
  ------------------
  |  Branch (1273:5): [True: 30, False: 4.53k]
  ------------------
 1274|     30|      return f.with(crcast<Fn*>(&e));
 1275|  1.22k|    case App::type_case_id:
  ------------------
  |  Branch (1275:5): [True: 1.22k, False: 3.33k]
  ------------------
 1276|  1.22k|      return f.with(crcast<App*>(&e));
 1277|     39|    case Assign::type_case_id:
  ------------------
  |  Branch (1277:5): [True: 39, False: 4.52k]
  ------------------
 1278|     39|      return f.with(crcast<Assign*>(&e));
 1279|     32|    case MkArray::type_case_id:
  ------------------
  |  Branch (1279:5): [True: 32, False: 4.53k]
  ------------------
 1280|     32|      return f.with(crcast<MkArray*>(&e));
 1281|     66|    case MkVariant::type_case_id:
  ------------------
  |  Branch (1281:5): [True: 66, False: 4.49k]
  ------------------
 1282|     66|      return f.with(crcast<MkVariant*>(&e));
 1283|     20|    case MkRecord::type_case_id:
  ------------------
  |  Branch (1283:5): [True: 20, False: 4.54k]
  ------------------
 1284|     20|      return f.with(crcast<MkRecord*>(&e));
 1285|     49|    case AIndex::type_case_id:
  ------------------
  |  Branch (1285:5): [True: 49, False: 4.51k]
  ------------------
 1286|     49|      return f.with(crcast<AIndex*>(&e));
 1287|     17|    case Case::type_case_id:
  ------------------
  |  Branch (1287:5): [True: 17, False: 4.54k]
  ------------------
 1288|     17|      return f.with(crcast<Case*>(&e));
 1289|      2|    case Switch::type_case_id:
  ------------------
  |  Branch (1289:5): [True: 2, False: 4.56k]
  ------------------
 1290|      2|      return f.with(crcast<Switch*>(&e));
 1291|     76|    case Proj::type_case_id:
  ------------------
  |  Branch (1291:5): [True: 76, False: 4.48k]
  ------------------
 1292|     76|      return f.with(crcast<Proj*>(&e));
 1293|    588|    case Assump::type_case_id:
  ------------------
  |  Branch (1293:5): [True: 588, False: 3.97k]
  ------------------
 1294|    588|      return f.with(crcast<Assump*>(&e));
 1295|      5|    case Pack::type_case_id:
  ------------------
  |  Branch (1295:5): [True: 5, False: 4.55k]
  ------------------
 1296|      5|      return f.with(crcast<Pack*>(&e));
 1297|      5|    case Unpack::type_case_id:
  ------------------
  |  Branch (1297:5): [True: 5, False: 4.55k]
  ------------------
 1298|      5|      return f.with(crcast<Unpack*>(&e));
 1299|      0|    default:
  ------------------
  |  Branch (1299:5): [True: 0, False: 4.56k]
  ------------------
 1300|      0|      throw annotated_error(e, "Internal error, cannot switch on unknown expression: " + show(e));
 1301|  4.56k|    }
 1302|  4.56k|  }
_ZN6hobbes8switchOfIPN4llvm8ConstantEEET_RKSt10shared_ptrINS_4ExprEERKNS_10switchExprIS4_EE:
 1310|  1.14k|  T switchOf(const ExprPtr& e, const switchExpr<T>& f) {
 1311|  1.14k|    return switchOfF< T, const switchExpr<T>& >(*e, f);
 1312|  1.14k|  }
_ZN6hobbes9switchOfFIPN4llvm8ConstantERKNS_10switchExprIS3_EEEET_RKNS_4ExprET0_:
 1245|  1.14k|  T switchOfF(const Expr& e, F f) {
 1246|  1.14k|    switch (e.case_id()) {
 1247|      0|    case Unit::type_case_id:
  ------------------
  |  Branch (1247:5): [True: 0, False: 1.14k]
  ------------------
 1248|      0|      return f.with(crcast<Unit*>(&e));
 1249|      0|    case Bool::type_case_id:
  ------------------
  |  Branch (1249:5): [True: 0, False: 1.14k]
  ------------------
 1250|      0|      return f.with(crcast<Bool*>(&e));
 1251|    578|    case Char::type_case_id:
  ------------------
  |  Branch (1251:5): [True: 578, False: 562]
  ------------------
 1252|    578|      return f.with(crcast<Char*>(&e));
 1253|    128|    case Byte::type_case_id:
  ------------------
  |  Branch (1253:5): [True: 128, False: 1.01k]
  ------------------
 1254|    128|      return f.with(crcast<Byte*>(&e));
 1255|      0|    case Short::type_case_id:
  ------------------
  |  Branch (1255:5): [True: 0, False: 1.14k]
  ------------------
 1256|      0|      return f.with(crcast<Short*>(&e));
 1257|      2|    case Int::type_case_id:
  ------------------
  |  Branch (1257:5): [True: 2, False: 1.13k]
  ------------------
 1258|      2|      return f.with(crcast<Int*>(&e));
 1259|      1|    case Long::type_case_id:
  ------------------
  |  Branch (1259:5): [True: 1, False: 1.13k]
  ------------------
 1260|      1|      return f.with(crcast<Long*>(&e));
 1261|      0|    case Int128::type_case_id:
  ------------------
  |  Branch (1261:5): [True: 0, False: 1.14k]
  ------------------
 1262|      0|      return f.with(crcast<Int128*>(&e));
 1263|      0|    case Float::type_case_id:
  ------------------
  |  Branch (1263:5): [True: 0, False: 1.14k]
  ------------------
 1264|      0|      return f.with(crcast<Float*>(&e));
 1265|      0|    case Double::type_case_id:
  ------------------
  |  Branch (1265:5): [True: 0, False: 1.14k]
  ------------------
 1266|      0|      return f.with(crcast<Double*>(&e));
 1267|      0|    case Var::type_case_id:
  ------------------
  |  Branch (1267:5): [True: 0, False: 1.14k]
  ------------------
 1268|      0|      return f.with(crcast<Var*>(&e));
 1269|      2|    case Let::type_case_id:
  ------------------
  |  Branch (1269:5): [True: 2, False: 1.13k]
  ------------------
 1270|      2|      return f.with(crcast<Let*>(&e));
 1271|      0|    case LetRec::type_case_id:
  ------------------
  |  Branch (1271:5): [True: 0, False: 1.14k]
  ------------------
 1272|      0|      return f.with(crcast<LetRec*>(&e));
 1273|    134|    case Fn::type_case_id:
  ------------------
  |  Branch (1273:5): [True: 134, False: 1.00k]
  ------------------
 1274|    134|      return f.with(crcast<Fn*>(&e));
 1275|      0|    case App::type_case_id:
  ------------------
  |  Branch (1275:5): [True: 0, False: 1.14k]
  ------------------
 1276|      0|      return f.with(crcast<App*>(&e));
 1277|      0|    case Assign::type_case_id:
  ------------------
  |  Branch (1277:5): [True: 0, False: 1.14k]
  ------------------
 1278|      0|      return f.with(crcast<Assign*>(&e));
 1279|      9|    case MkArray::type_case_id:
  ------------------
  |  Branch (1279:5): [True: 9, False: 1.13k]
  ------------------
 1280|      9|      return f.with(crcast<MkArray*>(&e));
 1281|      0|    case MkVariant::type_case_id:
  ------------------
  |  Branch (1281:5): [True: 0, False: 1.14k]
  ------------------
 1282|      0|      return f.with(crcast<MkVariant*>(&e));
 1283|      0|    case MkRecord::type_case_id:
  ------------------
  |  Branch (1283:5): [True: 0, False: 1.14k]
  ------------------
 1284|      0|      return f.with(crcast<MkRecord*>(&e));
 1285|      0|    case AIndex::type_case_id:
  ------------------
  |  Branch (1285:5): [True: 0, False: 1.14k]
  ------------------
 1286|      0|      return f.with(crcast<AIndex*>(&e));
 1287|      0|    case Case::type_case_id:
  ------------------
  |  Branch (1287:5): [True: 0, False: 1.14k]
  ------------------
 1288|      0|      return f.with(crcast<Case*>(&e));
 1289|      0|    case Switch::type_case_id:
  ------------------
  |  Branch (1289:5): [True: 0, False: 1.14k]
  ------------------
 1290|      0|      return f.with(crcast<Switch*>(&e));
 1291|      0|    case Proj::type_case_id:
  ------------------
  |  Branch (1291:5): [True: 0, False: 1.14k]
  ------------------
 1292|      0|      return f.with(crcast<Proj*>(&e));
 1293|    286|    case Assump::type_case_id:
  ------------------
  |  Branch (1293:5): [True: 286, False: 854]
  ------------------
 1294|    286|      return f.with(crcast<Assump*>(&e));
 1295|      0|    case Pack::type_case_id:
  ------------------
  |  Branch (1295:5): [True: 0, False: 1.14k]
  ------------------
 1296|      0|      return f.with(crcast<Pack*>(&e));
 1297|      0|    case Unpack::type_case_id:
  ------------------
  |  Branch (1297:5): [True: 0, False: 1.14k]
  ------------------
 1298|      0|      return f.with(crcast<Unpack*>(&e));
 1299|      0|    default:
  ------------------
  |  Branch (1299:5): [True: 0, False: 1.14k]
  ------------------
 1300|      0|      throw annotated_error(e, "Internal error, cannot switch on unknown expression: " + show(e));
 1301|  1.14k|    }
 1302|  1.14k|  }

_ZN6hobbes16MUnsafePragmaDefC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNS_17LexicalAnnotationE:
  156|    186|  MUnsafePragmaDef(const std::string& symbol, const LexicalAnnotation& la) : Base(la), symbol(symbol) {}
_ZNK6hobbes16MUnsafePragmaDef11symbolValueB5cxx11Ev:
  159|    279|  const std::string& symbolValue() const { return symbol; }
_ZN6hobbes14MSafePragmaDefC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNS_17LexicalAnnotationE:
  168|    114|  MSafePragmaDef(const std::string& symbol, const LexicalAnnotation& la) : Base(la), symbol(symbol) {}
_ZNK6hobbes14MSafePragmaDef11symbolValueB5cxx11Ev:
  171|    171|  const std::string& symbolValue() const { return symbol; }
_ZN6hobbes10switchMDefISt10shared_ptrINS_9ModuleDefEEED2Ev:
  184|  1.41k|    virtual ~switchMDef() = default;
_ZN6hobbes8switchOfISt10shared_ptrINS_9ModuleDefEEEET_RKS3_RKNS_10switchMDefIS4_EE:
  196|  1.41k|  T switchOf(const ModuleDefPtr& p, const switchMDef<T>& f) {
  197|  1.41k|    switch (p->case_id()) {
  198|      0|    case MImport::type_case_id:
  ------------------
  |  Branch (198:5): [True: 0, False: 1.41k]
  ------------------
  199|      0|      return f.with(reinterpret_cast<const MImport*>(p.get()));
  200|     13|    case MTypeDef::type_case_id:
  ------------------
  |  Branch (200:5): [True: 13, False: 1.40k]
  ------------------
  201|     13|      return f.with(reinterpret_cast<const MTypeDef*>(p.get()));
  202|    260|    case MVarTypeDef::type_case_id:
  ------------------
  |  Branch (202:5): [True: 260, False: 1.15k]
  ------------------
  203|    260|      return f.with(reinterpret_cast<const MVarTypeDef*>(p.get()));
  204|    277|    case MVarDef::type_case_id:
  ------------------
  |  Branch (204:5): [True: 277, False: 1.14k]
  ------------------
  205|    277|      return f.with(reinterpret_cast<const MVarDef*>(p.get()));
  206|     97|    case ClassDef::type_case_id:
  ------------------
  |  Branch (206:5): [True: 97, False: 1.32k]
  ------------------
  207|     97|      return f.with(reinterpret_cast<const ClassDef*>(p.get()));
  208|    621|    case InstanceDef::type_case_id:
  ------------------
  |  Branch (208:5): [True: 621, False: 797]
  ------------------
  209|    621|      return f.with(reinterpret_cast<const InstanceDef*>(p.get()));
  210|     93|    case MUnsafePragmaDef::type_case_id:
  ------------------
  |  Branch (210:5): [True: 93, False: 1.32k]
  ------------------
  211|     93|      return f.with(reinterpret_cast<const MUnsafePragmaDef*>(p.get()));
  212|     57|    case MSafePragmaDef::type_case_id:
  ------------------
  |  Branch (212:5): [True: 57, False: 1.36k]
  ------------------
  213|     57|      return f.with(reinterpret_cast<const MSafePragmaDef*>(p.get())); 
  214|      0|    default:
  ------------------
  |  Branch (214:5): [True: 0, False: 1.41k]
  ------------------
  215|      0|      {
  216|      0|        std::ostringstream ss;
  217|      0|        ss << "Internal error, cannot switch on unknown module def: ";
  218|      0|        p->show(ss);
  219|      0|        throw annotated_error(*p, ss.str());
  220|      0|      }
  221|  1.41k|    }
  222|  1.41k|  }
_ZN6hobbes13ModuleDefCaseINS_16MUnsafePragmaDefEEC2ERKNS_17LexicalAnnotationE:
  179|    186|  ModuleDefCase<Case>::ModuleDefCase(const LexicalAnnotation& la) : ModuleDef(Case::type_case_id, la) {
  180|    186|  }
_ZN6hobbes13ModuleDefCaseINS_14MSafePragmaDefEEC2ERKNS_17LexicalAnnotationE:
  179|    114|  ModuleDefCase<Case>::ModuleDefCase(const LexicalAnnotation& la) : ModuleDef(Case::type_case_id, la) {
  180|    114|  }
_ZN6hobbes13ModuleDefCaseINS_8MTypeDefEEC2ERKNS_17LexicalAnnotationE:
  179|     26|  ModuleDefCase<Case>::ModuleDefCase(const LexicalAnnotation& la) : ModuleDef(Case::type_case_id, la) {
  180|     26|  }
_ZN6hobbes13ModuleDefCaseINS_11MVarTypeDefEEC2ERKNS_17LexicalAnnotationE:
  179|    710|  ModuleDefCase<Case>::ModuleDefCase(const LexicalAnnotation& la) : ModuleDef(Case::type_case_id, la) {
  180|    710|  }
_ZN6hobbes13ModuleDefCaseINS_7MVarDefEEC2ERKNS_17LexicalAnnotationE:
  179|  2.04k|  ModuleDefCase<Case>::ModuleDefCase(const LexicalAnnotation& la) : ModuleDef(Case::type_case_id, la) {
  180|  2.04k|  }
_ZN6hobbes13ModuleDefCaseINS_8ClassDefEEC2ERKNS_17LexicalAnnotationE:
  179|    194|  ModuleDefCase<Case>::ModuleDefCase(const LexicalAnnotation& la) : ModuleDef(Case::type_case_id, la) {
  180|    194|  }
_ZN6hobbes13ModuleDefCaseINS_11InstanceDefEEC2ERKNS_17LexicalAnnotationE:
  179|  1.24k|  ModuleDefCase<Case>::ModuleDefCase(const LexicalAnnotation& la) : ModuleDef(Case::type_case_id, la) {
  180|  1.24k|  }

_ZN6hobbes6MStateD2Ev:
   26|  1.66k|  virtual ~MState() = default;
_ZN6hobbes12switchMStateISt10shared_ptrINS_4ExprEEED2Ev:
  133|    917|    virtual ~switchMState() = default;
_ZN6hobbes10MStateCaseINS_8LoadVarsEEC2Ev:
  124|     63|  MStateCase<Case>::MStateCase() : MState(Case::type_case_id) {
  125|     63|  }
_ZN6hobbes10MStateCaseINS_9SwitchValEEC2Ev:
  124|     19|  MStateCase<Case>::MStateCase() : MState(Case::type_case_id) {
  125|     19|  }
_ZN6hobbes10MStateCaseINS_13SwitchVariantEEC2Ev:
  124|     76|  MStateCase<Case>::MStateCase() : MState(Case::type_case_id) {
  125|     76|  }
_ZN6hobbes10MStateCaseINS_10FinishExprEEC2Ev:
  124|  1.51k|  MStateCase<Case>::MStateCase() : MState(Case::type_case_id) {
  125|  1.51k|  }
_ZN6hobbes8switchOfISt10shared_ptrINS_4ExprEEEET_RKS1_INS_6MStateEERKNS_12switchMStateIS4_EE:
  157|    917|  T switchOf(const MStatePtr& s, const switchMState<T>& f) {
  158|    917|    return switchOf(*s, f);
  159|    917|  }
_ZN6hobbes8switchOfISt10shared_ptrINS_4ExprEEEET_RKNS_6MStateERKNS_12switchMStateIS4_EE:
  141|    917|  T switchOf(const MState& s, const switchMState<T>& f) {
  142|    917|    switch (s.case_id()) {
  143|     63|    case LoadVars::type_case_id:
  ------------------
  |  Branch (143:5): [True: 63, False: 854]
  ------------------
  144|     63|      return f.with(reinterpret_cast<const LoadVars*>(&s));
  145|      7|    case SwitchVal::type_case_id:
  ------------------
  |  Branch (145:5): [True: 7, False: 910]
  ------------------
  146|      7|      return f.with(reinterpret_cast<const SwitchVal*>(&s));
  147|     76|    case SwitchVariant::type_case_id:
  ------------------
  |  Branch (147:5): [True: 76, False: 841]
  ------------------
  148|     76|      return f.with(reinterpret_cast<const SwitchVariant*>(&s));
  149|    771|    case FinishExpr::type_case_id:
  ------------------
  |  Branch (149:5): [True: 771, False: 146]
  ------------------
  150|    771|      return f.with(reinterpret_cast<const FinishExpr*>(&s));
  151|      0|    default:
  ------------------
  |  Branch (151:5): [True: 0, False: 917]
  ------------------
  152|      0|      throw std::runtime_error("Internal error, cannot switch on unknown match state");
  153|    917|    }
  154|    917|  }

_ZN6hobbes10PatternRowC2ERKSt6vectorISt10shared_ptrINS_7PatternEESaIS4_EERKS2_INS_4ExprEE:
   26|    749|  inline PatternRow(const Patterns& ps, const ExprPtr& r) : patterns(ps), result(r) { }
_ZN6hobbes10PatternRowC2ERKSt6vectorISt10shared_ptrINS_7PatternEESaIS4_EERKS2_INS_4ExprEESC_:
   27|  1.26k|  inline PatternRow(const Patterns& ps, const ExprPtr& g, const ExprPtr& r) : patterns(ps), guard(g), result(r) { }
_ZN6hobbes10mkpatarrayERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNS_17LexicalAnnotationE:
  270|      4|inline MatchArray* mkpatarray(const std::string& cs, const LexicalAnnotation& la) {
  271|      4|  Patterns ps;
  272|     11|  for (auto c : cs) {
  ------------------
  |  Branch (272:15): [True: 11, False: 4]
  ------------------
  273|     11|    ps.push_back(PatternPtr(new MatchLiteral(PrimitivePtr(new Char(c, la)), la)));
  274|     11|  }
  275|      4|  return new MatchArray(ps, la);
  276|      4|}
_ZNKSt4hashIN6hobbes10PatternRowEEclERKS1_:
  304|  2.35k|    inline size_t operator()(const hobbes::PatternRow& x) const {
  305|  2.35k|      return hobbes::hash(x);
  306|  2.35k|    }
_ZN6hobbes7PatternD2Ev:
   55|  1.05k|  virtual ~Pattern() = default;
_ZN6hobbes11PatternCaseINS_12MatchLiteralEEC2ERKNS_17LexicalAnnotationE:
  218|     29|  PatternCase<Case>::PatternCase(const LexicalAnnotation& la) : Pattern(Case::type_case_id, la) {
  219|     29|  }
_ZN6hobbes11PatternCaseINS_8MatchAnyEEC2ERKNS_17LexicalAnnotationE:
  218|    869|  PatternCase<Case>::PatternCase(const LexicalAnnotation& la) : Pattern(Case::type_case_id, la) {
  219|    869|  }
_ZN6hobbes11PatternCaseINS_10MatchArrayEEC2ERKNS_17LexicalAnnotationE:
  218|     12|  PatternCase<Case>::PatternCase(const LexicalAnnotation& la) : Pattern(Case::type_case_id, la) {
  219|     12|  }
_ZN6hobbes11PatternCaseINS_10MatchRegexEEC2ERKNS_17LexicalAnnotationE:
  218|      8|  PatternCase<Case>::PatternCase(const LexicalAnnotation& la) : Pattern(Case::type_case_id, la) {
  219|      8|  }
_ZN6hobbes11PatternCaseINS_11MatchRecordEEC2ERKNS_17LexicalAnnotationE:
  218|     44|  PatternCase<Case>::PatternCase(const LexicalAnnotation& la) : Pattern(Case::type_case_id, la) {
  219|     44|  }
_ZN6hobbes11PatternCaseINS_12MatchVariantEEC2ERKNS_17LexicalAnnotationE:
  218|     89|  PatternCase<Case>::PatternCase(const LexicalAnnotation& la) : Pattern(Case::type_case_id, la) {
  219|     89|  }
_ZN6hobbes8switchOfISt10shared_ptrINS_8MonoTypeEEEET_RKS1_INS_7PatternEERKNS_13switchPatternIS4_EE:
  233|    900|  T switchOf(const PatternPtr& p, const switchPattern<T>& f) {
  234|    900|    switch (p->case_id()) {
  235|     25|    case MatchLiteral::type_case_id:
  ------------------
  |  Branch (235:5): [True: 25, False: 875]
  ------------------
  236|     25|      return f.with(rcast<const MatchLiteral*>(p.get()));
  237|    754|    case MatchAny::type_case_id:
  ------------------
  |  Branch (237:5): [True: 754, False: 146]
  ------------------
  238|    754|      return f.with(rcast<const MatchAny*>(p.get()));
  239|     12|    case MatchArray::type_case_id:
  ------------------
  |  Branch (239:5): [True: 12, False: 888]
  ------------------
  240|     12|      return f.with(rcast<const MatchArray*>(p.get()));
  241|      2|    case MatchRegex::type_case_id:
  ------------------
  |  Branch (241:5): [True: 2, False: 898]
  ------------------
  242|      2|      return f.with(rcast<const MatchRegex*>(p.get()));
  243|     19|    case MatchRecord::type_case_id:
  ------------------
  |  Branch (243:5): [True: 19, False: 881]
  ------------------
  244|     19|      return f.with(rcast<const MatchRecord*>(p.get()));
  245|     88|    case MatchVariant::type_case_id:
  ------------------
  |  Branch (245:5): [True: 88, False: 812]
  ------------------
  246|     88|      return f.with(rcast<const MatchVariant*>(p.get()));
  247|      0|    default:
  ------------------
  |  Branch (247:5): [True: 0, False: 900]
  ------------------
  248|      0|      throw annotated_error(*p, "Internal error, cannot switch on unknown high-level pattern: " + show(p));
  249|    900|    }
  250|    900|  }
_ZN6hobbes8switchOfIhEET_RKSt10shared_ptrINS_7PatternEERKNS_13switchPatternIS1_EE:
  233|  2.08k|  T switchOf(const PatternPtr& p, const switchPattern<T>& f) {
  234|  2.08k|    switch (p->case_id()) {
  235|     50|    case MatchLiteral::type_case_id:
  ------------------
  |  Branch (235:5): [True: 50, False: 2.03k]
  ------------------
  236|     50|      return f.with(rcast<const MatchLiteral*>(p.get()));
  237|  1.73k|    case MatchAny::type_case_id:
  ------------------
  |  Branch (237:5): [True: 1.73k, False: 344]
  ------------------
  238|  1.73k|      return f.with(rcast<const MatchAny*>(p.get()));
  239|     24|    case MatchArray::type_case_id:
  ------------------
  |  Branch (239:5): [True: 24, False: 2.05k]
  ------------------
  240|     24|      return f.with(rcast<const MatchArray*>(p.get()));
  241|      4|    case MatchRegex::type_case_id:
  ------------------
  |  Branch (241:5): [True: 4, False: 2.07k]
  ------------------
  242|      4|      return f.with(rcast<const MatchRegex*>(p.get()));
  243|     88|    case MatchRecord::type_case_id:
  ------------------
  |  Branch (243:5): [True: 88, False: 1.99k]
  ------------------
  244|     88|      return f.with(rcast<const MatchRecord*>(p.get()));
  245|    178|    case MatchVariant::type_case_id:
  ------------------
  |  Branch (245:5): [True: 178, False: 1.90k]
  ------------------
  246|    178|      return f.with(rcast<const MatchVariant*>(p.get()));
  247|      0|    default:
  ------------------
  |  Branch (247:5): [True: 0, False: 2.08k]
  ------------------
  248|      0|      throw annotated_error(*p, "Internal error, cannot switch on unknown high-level pattern: " + show(p));
  249|  2.08k|    }
  250|  2.08k|  }
_ZN6hobbes8switchOfIbEET_RKSt10shared_ptrINS_7PatternEERKNS_13switchPatternIS1_EE:
  233|    187|  T switchOf(const PatternPtr& p, const switchPattern<T>& f) {
  234|    187|    switch (p->case_id()) {
  235|      6|    case MatchLiteral::type_case_id:
  ------------------
  |  Branch (235:5): [True: 6, False: 181]
  ------------------
  236|      6|      return f.with(rcast<const MatchLiteral*>(p.get()));
  237|    173|    case MatchAny::type_case_id:
  ------------------
  |  Branch (237:5): [True: 173, False: 14]
  ------------------
  238|    173|      return f.with(rcast<const MatchAny*>(p.get()));
  239|      0|    case MatchArray::type_case_id:
  ------------------
  |  Branch (239:5): [True: 0, False: 187]
  ------------------
  240|      0|      return f.with(rcast<const MatchArray*>(p.get()));
  241|      0|    case MatchRegex::type_case_id:
  ------------------
  |  Branch (241:5): [True: 0, False: 187]
  ------------------
  242|      0|      return f.with(rcast<const MatchRegex*>(p.get()));
  243|      7|    case MatchRecord::type_case_id:
  ------------------
  |  Branch (243:5): [True: 7, False: 180]
  ------------------
  244|      7|      return f.with(rcast<const MatchRecord*>(p.get()));
  245|      1|    case MatchVariant::type_case_id:
  ------------------
  |  Branch (245:5): [True: 1, False: 186]
  ------------------
  246|      1|      return f.with(rcast<const MatchVariant*>(p.get()));
  247|      0|    default:
  ------------------
  |  Branch (247:5): [True: 0, False: 187]
  ------------------
  248|      0|      throw annotated_error(*p, "Internal error, cannot switch on unknown high-level pattern: " + show(p));
  249|    187|    }
  250|    187|  }
_ZN6hobbes10PatternRowC2Ev:
   25|     10|  inline PatternRow() = default;
_ZN6hobbes8switchOfISt10shared_ptrINS_6MStateEEEET_RKS1_INS_7PatternEERKNS_13switchPatternIS4_EE:
  233|    131|  T switchOf(const PatternPtr& p, const switchPattern<T>& f) {
  234|    131|    switch (p->case_id()) {
  235|     14|    case MatchLiteral::type_case_id:
  ------------------
  |  Branch (235:5): [True: 14, False: 117]
  ------------------
  236|     14|      return f.with(rcast<const MatchLiteral*>(p.get()));
  237|      0|    case MatchAny::type_case_id:
  ------------------
  |  Branch (237:5): [True: 0, False: 131]
  ------------------
  238|      0|      return f.with(rcast<const MatchAny*>(p.get()));
  239|      4|    case MatchArray::type_case_id:
  ------------------
  |  Branch (239:5): [True: 4, False: 127]
  ------------------
  240|      4|      return f.with(rcast<const MatchArray*>(p.get()));
  241|      1|    case MatchRegex::type_case_id:
  ------------------
  |  Branch (241:5): [True: 1, False: 130]
  ------------------
  242|      1|      return f.with(rcast<const MatchRegex*>(p.get()));
  243|     36|    case MatchRecord::type_case_id:
  ------------------
  |  Branch (243:5): [True: 36, False: 95]
  ------------------
  244|     36|      return f.with(rcast<const MatchRecord*>(p.get()));
  245|     76|    case MatchVariant::type_case_id:
  ------------------
  |  Branch (245:5): [True: 76, False: 55]
  ------------------
  246|     76|      return f.with(rcast<const MatchVariant*>(p.get()));
  247|      0|    default:
  ------------------
  |  Branch (247:5): [True: 0, False: 131]
  ------------------
  248|      0|      throw annotated_error(*p, "Internal error, cannot switch on unknown high-level pattern: " + show(p));
  249|    131|    }
  250|    131|  }
_ZN6hobbes8switchOfImEET_RKSt10shared_ptrINS_7PatternEERKNS_13switchPatternIS1_EE:
  233|    652|  T switchOf(const PatternPtr& p, const switchPattern<T>& f) {
  234|    652|    switch (p->case_id()) {
  235|     38|    case MatchLiteral::type_case_id:
  ------------------
  |  Branch (235:5): [True: 38, False: 614]
  ------------------
  236|     38|      return f.with(rcast<const MatchLiteral*>(p.get()));
  237|    395|    case MatchAny::type_case_id:
  ------------------
  |  Branch (237:5): [True: 395, False: 257]
  ------------------
  238|    395|      return f.with(rcast<const MatchAny*>(p.get()));
  239|      8|    case MatchArray::type_case_id:
  ------------------
  |  Branch (239:5): [True: 8, False: 644]
  ------------------
  240|      8|      return f.with(rcast<const MatchArray*>(p.get()));
  241|      2|    case MatchRegex::type_case_id:
  ------------------
  |  Branch (241:5): [True: 2, False: 650]
  ------------------
  242|      2|      return f.with(rcast<const MatchRegex*>(p.get()));
  243|     81|    case MatchRecord::type_case_id:
  ------------------
  |  Branch (243:5): [True: 81, False: 571]
  ------------------
  244|     81|      return f.with(rcast<const MatchRecord*>(p.get()));
  245|    128|    case MatchVariant::type_case_id:
  ------------------
  |  Branch (245:5): [True: 128, False: 524]
  ------------------
  246|    128|      return f.with(rcast<const MatchVariant*>(p.get()));
  247|      0|    default:
  ------------------
  |  Branch (247:5): [True: 0, False: 652]
  ------------------
  248|      0|      throw annotated_error(*p, "Internal error, cannot switch on unknown high-level pattern: " + show(p));
  249|    652|    }
  250|    652|  }

_ZN6hobbes5RegexD2Ev:
   38|     69|  virtual ~Regex() = default;

_ZN6hobbes12ATEliminatorD2Ev:
   24|      1|  virtual ~ATEliminator() = default;

_ZN6hobbes12HCEliminatorD2Ev:
   17|      1|  virtual ~HCEliminator() = default;

_ZN6hobbes12HFEliminatorD2Ev:
   35|      7|  virtual ~HFEliminator() = default;

_ZN6hobbes17SubtypeEliminatorD2Ev:
   18|      1|  virtual ~SubtypeEliminator() = default;

_ZN6hobbes4ObjsD2Ev:
   49|      1|  virtual ~Objs() = default;

_ZN6hobbes12liftFunctionIFbRNS_7storage11TransactionElEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJRNS_7storage11TransactionElEE7liftSeqERNS_6typedbE:
  288|      2|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJRNS_7storage11TransactionElEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS8_EERNS_6typedbE:
  284|      2|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      2|      r->push_back(lift<T, false>::type(tenv));
  286|      2|      typeSeq<Ts...>::accum(r, tenv);
  287|      2|    }
_ZN6hobbes4liftIRNS_7storage11TransactionELb0EvE4typeERNS_6typedbE:
  114|      3|    static MonoTypePtr type(typedb& tenv) {
  115|      3|      return defaultLift<T, InStruct>::type(tenv);
  116|      3|    }
_ZN6hobbes4liftIPNS_7storage11TransactionELb0EvE4typeERNS_6typedbE:
  114|      6|    static MonoTypePtr type(typedb& tenv) {
  115|      6|      return defaultLift<T, InStruct>::type(tenv);
  116|      6|    }
_ZN6hobbes11defaultLiftIPNS_7storage11TransactionELb0EE4typeERNS_6typedbE:
  108|      6|    static MonoTypePtr type(typedb& tenv) {
  109|      6|      return tenv.opaquePtrMonoType(typeid(T*), 0, false);
  110|      6|    }
_ZN6hobbes7typeSeqIJlEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS5_EERNS_6typedbE:
  284|     49|    static void accum(MonoTypes* r, typedb& tenv) {
  285|     49|      r->push_back(lift<T, false>::type(tenv));
  286|     49|      typeSeq<Ts...>::accum(r, tenv);
  287|     49|    }
_ZN6hobbes4liftIlLb0EvE4typeERNS_6typedbE:
  201|    166|      static MonoTypePtr type(typedb&) { \
  202|    166|        return Prim::make(#n); \
  203|    166|      } \
_ZN6hobbes7typeSeqIJEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS5_EERNS_6typedbE:
  279|    257|    static void accum(MonoTypes*, typedb&) { }
_ZN6hobbes4liftIbLb0EvE4typeERNS_6typedbE:
  201|     67|      static MonoTypePtr type(typedb&) { \
  202|     67|        return Prim::make(#n); \
  203|     67|      } \
_ZN6hobbes12liftFunctionIFPKhRNS_7storage11TransactionElEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes4liftIPKhLb0EvE4typeERNS_6typedbE:
  114|      2|    static MonoTypePtr type(typedb& tenv) {
  115|      2|      return defaultLift<T, InStruct>::type(tenv);
  116|      2|    }
_ZN6hobbes4liftIPhLb0EvE4typeERNS_6typedbE:
  114|      3|    static MonoTypePtr type(typedb& tenv) {
  115|      3|      return defaultLift<T, InStruct>::type(tenv);
  116|      3|    }
_ZN6hobbes11defaultLiftIPhLb0EE4typeERNS_6typedbE:
  108|      3|    static MonoTypePtr type(typedb& tenv) {
  109|      3|      return tenv.opaquePtrMonoType(typeid(T*), 0, false);
  110|      3|    }
_ZN6hobbes12liftFunctionIFPKhRNS_7storage11TransactionEllEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJRNS_7storage11TransactionEllEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJRNS_7storage11TransactionEllEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS8_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes7typeSeqIJllEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS5_EERNS_6typedbE:
  284|     29|    static void accum(MonoTypes* r, typedb& tenv) {
  285|     29|      r->push_back(lift<T, false>::type(tenv));
  286|     29|      typeSeq<Ts...>::accum(r, tenv);
  287|     29|    }
_ZN6hobbes12liftFunctionIFvPNS_7storage11TransactionEEE4typeERNS_6typedbE:
  296|      3|    static MonoTypePtr type(typedb& tenv) {
  297|      3|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      3|    }
_ZN6hobbes7typeSeqIJPNS_7storage11TransactionEEE7liftSeqERNS_6typedbE:
  288|      3|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJPNS_7storage11TransactionEEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS8_EERNS_6typedbE:
  284|      3|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      3|      r->push_back(lift<T, false>::type(tenv));
  286|      3|      typeSeq<Ts...>::accum(r, tenv);
  287|      3|    }
_ZN6hobbes4liftIvLb0EvE4typeERNS_6typedbE:
  201|     37|      static MonoTypePtr type(typedb&) { \
  202|     37|        return Prim::make(#n); \
  203|     37|      } \
_ZN6hobbes15inferFieldTypeFC2EPSt6vectorINS_6Record6MemberESaIS3_EEPNS_6typedbE:
  484|      3|  inferFieldTypeF(Record::Members* ms, typedb* tenv) : ms(ms), o(0), tenv(tenv) { }
_ZN6hobbes4primIFbbEEESt10shared_ptrINS_8MonoTypeEEv:
  224|      1|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes12liftFunctionIFbbEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJbEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJbEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS5_EERNS_6typedbE:
  284|      4|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      4|      r->push_back(lift<T, false>::type(tenv));
  286|      4|      typeSeq<Ts...>::accum(r, tenv);
  287|      4|    }
_ZN6hobbes4primIFhhEEESt10shared_ptrINS_8MonoTypeEEv:
  224|      1|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes12liftFunctionIFhhEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJhEE7liftSeqERNS_6typedbE:
  288|      5|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJhEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS5_EERNS_6typedbE:
  284|     25|    static void accum(MonoTypes* r, typedb& tenv) {
  285|     25|      r->push_back(lift<T, false>::type(tenv));
  286|     25|      typeSeq<Ts...>::accum(r, tenv);
  287|     25|    }
_ZN6hobbes4liftIhLb0EvE4typeERNS_6typedbE:
  201|     62|      static MonoTypePtr type(typedb&) { \
  202|     62|        return Prim::make(#n); \
  203|     62|      } \
_ZN6hobbes4primIFihEEESt10shared_ptrINS_8MonoTypeEEv:
  224|      1|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes12liftFunctionIFihEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes4liftIiLb0EvE4typeERNS_6typedbE:
  201|     87|      static MonoTypePtr type(typedb&) { \
  202|     87|        return Prim::make(#n); \
  203|     87|      } \
_ZN6hobbes4primIiEESt10shared_ptrINS_8MonoTypeEEv:
  224|      5|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes4primIFlhEEESt10shared_ptrINS_8MonoTypeEEv:
  224|      1|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes12liftFunctionIFlhEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes4primIlEESt10shared_ptrINS_8MonoTypeEEv:
  224|     28|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes4primIFdiEEESt10shared_ptrINS_8MonoTypeEEv:
  224|      1|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes12liftFunctionIFdiEE4typeERNS_6typedbE:
  296|      2|    static MonoTypePtr type(typedb& tenv) {
  297|      2|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      2|    }
_ZN6hobbes7typeSeqIJiEE7liftSeqERNS_6typedbE:
  288|     17|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJiEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS5_EERNS_6typedbE:
  284|     37|    static void accum(MonoTypes* r, typedb& tenv) {
  285|     37|      r->push_back(lift<T, false>::type(tenv));
  286|     37|      typeSeq<Ts...>::accum(r, tenv);
  287|     37|    }
_ZN6hobbes4liftIdLb0EvE4typeERNS_6typedbE:
  201|     47|      static MonoTypePtr type(typedb&) { \
  202|     47|        return Prim::make(#n); \
  203|     47|      } \
_ZN6hobbes4primIdEESt10shared_ptrINS_8MonoTypeEEv:
  224|      3|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes4primIFliEEESt10shared_ptrINS_8MonoTypeEEv:
  224|      1|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes12liftFunctionIFliEE4typeERNS_6typedbE:
  296|      2|    static MonoTypePtr type(typedb& tenv) {
  297|      2|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      2|    }
_ZN6hobbes4primIFdlEEESt10shared_ptrINS_8MonoTypeEEv:
  224|      1|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes12liftFunctionIFdlEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJlEE7liftSeqERNS_6typedbE:
  288|     13|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes4primIFnlEEESt10shared_ptrINS_8MonoTypeEEv:
  224|      1|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes12liftFunctionIFnlEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes4liftInLb0EvE4typeERNS_6typedbE:
  201|     54|      static MonoTypePtr type(typedb&) { \
  202|     54|        return Prim::make(#n); \
  203|     54|      } \
_ZN6hobbes4primInEESt10shared_ptrINS_8MonoTypeEEv:
  224|      3|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes4primIFflEEESt10shared_ptrINS_8MonoTypeEEv:
  224|      1|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes12liftFunctionIFflEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes4liftIfLb0EvE4typeERNS_6typedbE:
  201|     33|      static MonoTypePtr type(typedb&) { \
  202|     33|        return Prim::make(#n); \
  203|     33|      } \
_ZN6hobbes4primIfEESt10shared_ptrINS_8MonoTypeEEv:
  224|      1|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes4primIFisEEESt10shared_ptrINS_8MonoTypeEEv:
  224|      1|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes12liftFunctionIFisEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJsEE7liftSeqERNS_6typedbE:
  288|      3|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJsEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS5_EERNS_6typedbE:
  284|     15|    static void accum(MonoTypes* r, typedb& tenv) {
  285|     15|      r->push_back(lift<T, false>::type(tenv));
  286|     15|      typeSeq<Ts...>::accum(r, tenv);
  287|     15|    }
_ZN6hobbes4liftIsLb0EvE4typeERNS_6typedbE:
  201|     35|      static MonoTypePtr type(typedb&) { \
  202|     35|        return Prim::make(#n); \
  203|     35|      } \
_ZN6hobbes4primIFfiEEESt10shared_ptrINS_8MonoTypeEEv:
  224|      1|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes12liftFunctionIFfiEE4typeERNS_6typedbE:
  296|      2|    static MonoTypePtr type(typedb& tenv) {
  297|      2|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      2|    }
_ZN6hobbes4primIFdfEEESt10shared_ptrINS_8MonoTypeEEv:
  224|      1|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes12liftFunctionIFdfEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJfEE7liftSeqERNS_6typedbE:
  288|      2|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJfEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS5_EERNS_6typedbE:
  284|     13|    static void accum(MonoTypes* r, typedb& tenv) {
  285|     13|      r->push_back(lift<T, false>::type(tenv));
  286|     13|      typeSeq<Ts...>::accum(r, tenv);
  287|     13|    }
_ZN6hobbes4primIFilEEESt10shared_ptrINS_8MonoTypeEEv:
  224|      1|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes12liftFunctionIFilEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes4primIFsiEEESt10shared_ptrINS_8MonoTypeEEv:
  224|      1|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes12liftFunctionIFsiEE4typeERNS_6typedbE:
  296|      2|    static MonoTypePtr type(typedb& tenv) {
  297|      2|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      2|    }
_ZN6hobbes4primIFhiEEESt10shared_ptrINS_8MonoTypeEEv:
  224|      1|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes12liftFunctionIFhiEE4typeERNS_6typedbE:
  296|      2|    static MonoTypePtr type(typedb& tenv) {
  297|      2|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      2|    }
_ZN6hobbes4primIhEESt10shared_ptrINS_8MonoTypeEEv:
  224|      3|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes4primIFhlEEESt10shared_ptrINS_8MonoTypeEEv:
  224|      1|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes12liftFunctionIFhlEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes4primIFssEEESt10shared_ptrINS_8MonoTypeEEv:
  224|      1|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes12liftFunctionIFssEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes4primIFiiEEESt10shared_ptrINS_8MonoTypeEEv:
  224|      1|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes12liftFunctionIFiiEE4typeERNS_6typedbE:
  296|      2|    static MonoTypePtr type(typedb& tenv) {
  297|      2|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      2|    }
_ZN6hobbes4primIFllEEESt10shared_ptrINS_8MonoTypeEEv:
  224|      1|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes12liftFunctionIFllEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes4primIFnnEEESt10shared_ptrINS_8MonoTypeEEv:
  224|      1|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes12liftFunctionIFnnEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJnEE7liftSeqERNS_6typedbE:
  288|      2|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJnEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS5_EERNS_6typedbE:
  284|     20|    static void accum(MonoTypes* r, typedb& tenv) {
  285|     20|      r->push_back(lift<T, false>::type(tenv));
  286|     20|      typeSeq<Ts...>::accum(r, tenv);
  287|     20|    }
_ZN6hobbes4primIFffEEESt10shared_ptrINS_8MonoTypeEEv:
  224|      1|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes12liftFunctionIFffEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes4primIFddEEESt10shared_ptrINS_8MonoTypeEEv:
  224|      1|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes12liftFunctionIFddEE4typeERNS_6typedbE:
  296|      4|    static MonoTypePtr type(typedb& tenv) {
  297|      4|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      4|    }
_ZN6hobbes7typeSeqIJdEE7liftSeqERNS_6typedbE:
  288|      7|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJdEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS5_EERNS_6typedbE:
  284|     19|    static void accum(MonoTypes* r, typedb& tenv) {
  285|     19|      r->push_back(lift<T, false>::type(tenv));
  286|     19|      typeSeq<Ts...>::accum(r, tenv);
  287|     19|    }
_ZN6hobbes4primIFbccEEESt10shared_ptrINS_8MonoTypeEEv:
  224|      6|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes12liftFunctionIFbccEE4typeERNS_6typedbE:
  296|      6|    static MonoTypePtr type(typedb& tenv) {
  297|      6|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      6|    }
_ZN6hobbes7typeSeqIJccEE7liftSeqERNS_6typedbE:
  288|     11|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJccEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS5_EERNS_6typedbE:
  284|     11|    static void accum(MonoTypes* r, typedb& tenv) {
  285|     11|      r->push_back(lift<T, false>::type(tenv));
  286|     11|      typeSeq<Ts...>::accum(r, tenv);
  287|     11|    }
_ZN6hobbes4liftIcLb0EvE4typeERNS_6typedbE:
  201|     99|      static MonoTypePtr type(typedb&) { \
  202|     99|        return Prim::make(#n); \
  203|     99|      } \
_ZN6hobbes7typeSeqIJcEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS5_EERNS_6typedbE:
  284|     13|    static void accum(MonoTypes* r, typedb& tenv) {
  285|     13|      r->push_back(lift<T, false>::type(tenv));
  286|     13|      typeSeq<Ts...>::accum(r, tenv);
  287|     13|    }
_ZN6hobbes4primIFbhhEEESt10shared_ptrINS_8MonoTypeEEv:
  224|      6|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes12liftFunctionIFbhhEE4typeERNS_6typedbE:
  296|      6|    static MonoTypePtr type(typedb& tenv) {
  297|      6|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      6|    }
_ZN6hobbes7typeSeqIJhhEE7liftSeqERNS_6typedbE:
  288|     17|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJhhEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS5_EERNS_6typedbE:
  284|     17|    static void accum(MonoTypes* r, typedb& tenv) {
  285|     17|      r->push_back(lift<T, false>::type(tenv));
  286|     17|      typeSeq<Ts...>::accum(r, tenv);
  287|     17|    }
_ZN6hobbes4primIFbssEEESt10shared_ptrINS_8MonoTypeEEv:
  224|      6|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes12liftFunctionIFbssEE4typeERNS_6typedbE:
  296|      6|    static MonoTypePtr type(typedb& tenv) {
  297|      6|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      6|    }
_ZN6hobbes7typeSeqIJssEE7liftSeqERNS_6typedbE:
  288|     11|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJssEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS5_EERNS_6typedbE:
  284|     11|    static void accum(MonoTypes* r, typedb& tenv) {
  285|     11|      r->push_back(lift<T, false>::type(tenv));
  286|     11|      typeSeq<Ts...>::accum(r, tenv);
  287|     11|    }
_ZN6hobbes4primIFbiiEEESt10shared_ptrINS_8MonoTypeEEv:
  224|      6|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes12liftFunctionIFbiiEE4typeERNS_6typedbE:
  296|      6|    static MonoTypePtr type(typedb& tenv) {
  297|      6|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      6|    }
_ZN6hobbes7typeSeqIJiiEE7liftSeqERNS_6typedbE:
  288|     18|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJiiEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS5_EERNS_6typedbE:
  284|     18|    static void accum(MonoTypes* r, typedb& tenv) {
  285|     18|      r->push_back(lift<T, false>::type(tenv));
  286|     18|      typeSeq<Ts...>::accum(r, tenv);
  287|     18|    }
_ZN6hobbes4primIFbllEEESt10shared_ptrINS_8MonoTypeEEv:
  224|      6|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes12liftFunctionIFbllEE4typeERNS_6typedbE:
  296|      6|    static MonoTypePtr type(typedb& tenv) {
  297|      6|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      6|    }
_ZN6hobbes7typeSeqIJllEE7liftSeqERNS_6typedbE:
  288|     21|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes4primIFbnnEEESt10shared_ptrINS_8MonoTypeEEv:
  224|      6|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes12liftFunctionIFbnnEE4typeERNS_6typedbE:
  296|      6|    static MonoTypePtr type(typedb& tenv) {
  297|      6|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      6|    }
_ZN6hobbes7typeSeqIJnnEE7liftSeqERNS_6typedbE:
  288|     17|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJnnEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS5_EERNS_6typedbE:
  284|     17|    static void accum(MonoTypes* r, typedb& tenv) {
  285|     17|      r->push_back(lift<T, false>::type(tenv));
  286|     17|      typeSeq<Ts...>::accum(r, tenv);
  287|     17|    }
_ZN6hobbes4primIFbffEEESt10shared_ptrINS_8MonoTypeEEv:
  224|      6|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes12liftFunctionIFbffEE4typeERNS_6typedbE:
  296|      6|    static MonoTypePtr type(typedb& tenv) {
  297|      6|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      6|    }
_ZN6hobbes7typeSeqIJffEE7liftSeqERNS_6typedbE:
  288|     10|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJffEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS5_EERNS_6typedbE:
  284|     10|    static void accum(MonoTypes* r, typedb& tenv) {
  285|     10|      r->push_back(lift<T, false>::type(tenv));
  286|     10|      typeSeq<Ts...>::accum(r, tenv);
  287|     10|    }
_ZN6hobbes4primIFbddEEESt10shared_ptrINS_8MonoTypeEEv:
  224|      6|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes12liftFunctionIFbddEE4typeERNS_6typedbE:
  296|      6|    static MonoTypePtr type(typedb& tenv) {
  297|      6|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      6|    }
_ZN6hobbes7typeSeqIJddEE7liftSeqERNS_6typedbE:
  288|     11|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJddEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS5_EERNS_6typedbE:
  284|     11|    static void accum(MonoTypes* r, typedb& tenv) {
  285|     11|      r->push_back(lift<T, false>::type(tenv));
  286|     11|      typeSeq<Ts...>::accum(r, tenv);
  287|     11|    }
_ZN6hobbes4primIFhhhEEESt10shared_ptrINS_8MonoTypeEEv:
  224|     11|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes12liftFunctionIFhhhEE4typeERNS_6typedbE:
  296|     11|    static MonoTypePtr type(typedb& tenv) {
  297|     11|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|     11|    }
_ZN6hobbes4primIFiiiEEESt10shared_ptrINS_8MonoTypeEEv:
  224|     11|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes12liftFunctionIFiiiEE4typeERNS_6typedbE:
  296|     11|    static MonoTypePtr type(typedb& tenv) {
  297|     11|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|     11|    }
_ZN6hobbes4primIFlllEEESt10shared_ptrINS_8MonoTypeEEv:
  224|     11|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes12liftFunctionIFlllEE4typeERNS_6typedbE:
  296|     13|    static MonoTypePtr type(typedb& tenv) {
  297|     13|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|     13|    }
_ZN6hobbes4primIFcccEEESt10shared_ptrINS_8MonoTypeEEv:
  224|      5|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes12liftFunctionIFcccEE4typeERNS_6typedbE:
  296|      5|    static MonoTypePtr type(typedb& tenv) {
  297|      5|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      5|    }
_ZN6hobbes4primIFsssEEESt10shared_ptrINS_8MonoTypeEEv:
  224|      5|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes12liftFunctionIFsssEE4typeERNS_6typedbE:
  296|      5|    static MonoTypePtr type(typedb& tenv) {
  297|      5|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      5|    }
_ZN6hobbes4primIFnnnEEESt10shared_ptrINS_8MonoTypeEEv:
  224|     11|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes12liftFunctionIFnnnEE4typeERNS_6typedbE:
  296|     11|    static MonoTypePtr type(typedb& tenv) {
  297|     11|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|     11|    }
_ZN6hobbes4primIFfffEEESt10shared_ptrINS_8MonoTypeEEv:
  224|      4|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes12liftFunctionIFfffEE4typeERNS_6typedbE:
  296|      4|    static MonoTypePtr type(typedb& tenv) {
  297|      4|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      4|    }
_ZN6hobbes4primIFdddEEESt10shared_ptrINS_8MonoTypeEEv:
  224|      4|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes12liftFunctionIFdddEE4typeERNS_6typedbE:
  296|      5|    static MonoTypePtr type(typedb& tenv) {
  297|      5|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      5|    }
_ZN6hobbes4primIvEESt10shared_ptrINS_8MonoTypeEEv:
  224|      1|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes4primIcEESt10shared_ptrINS_8MonoTypeEEv:
  224|     66|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes4liftIPcLb0EvE4typeERNS_6typedbE:
  114|     14|    static MonoTypePtr type(typedb& tenv) {
  115|     14|      return defaultLift<T, InStruct>::type(tenv);
  116|     14|    }
_ZN6hobbes11defaultLiftIPcLb0EE4typeERNS_6typedbE:
  108|     14|    static MonoTypePtr type(typedb& tenv) {
  109|     14|      return tenv.opaquePtrMonoType(typeid(T*), 0, false);
  110|     14|    }
_ZN6hobbes12liftFunctionIFmRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaISD_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes4liftIRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEELb0EvE4typeERNS_6typedbE:
  114|      2|    static MonoTypePtr type(typedb& tenv) {
  115|      2|      return defaultLift<T, InStruct>::type(tenv);
  116|      2|    }
_ZN6hobbes4liftIPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEELb0EvE4typeERNS_6typedbE:
  123|      4|  struct lift<std::string*, InStruct> { static MonoTypePtr type(typedb&) { return OpaquePtr::make("std::string", InStruct ? sizeof(std::string) : 0, InStruct); } };
  ------------------
  |  Branch (123:114): [Folded, False: 4]
  ------------------
_ZN6hobbes4liftImLb0EvE4typeERNS_6typedbE:
  201|     30|      static MonoTypePtr type(typedb&) { \
  202|     30|        return Prim::make(#n); \
  203|     30|      } \
_ZN6hobbes12liftFunctionIFcRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEmEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEmEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEmEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaISD_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes7typeSeqIJmEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS5_EERNS_6typedbE:
  284|     11|    static void accum(MonoTypes* r, typedb& tenv) {
  285|     11|      r->push_back(lift<T, false>::type(tenv));
  286|     11|      typeSeq<Ts...>::accum(r, tenv);
  287|     11|    }
_ZN6hobbes12liftFunctionIFPcmmEE4typeERNS_6typedbE:
  296|      3|    static MonoTypePtr type(typedb& tenv) {
  297|      3|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      3|    }
_ZN6hobbes7typeSeqIJmmEE7liftSeqERNS_6typedbE:
  288|      3|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJmmEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS5_EERNS_6typedbE:
  284|      5|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      5|      r->push_back(lift<T, false>::type(tenv));
  286|      5|      typeSeq<Ts...>::accum(r, tenv);
  287|      5|    }
_ZN6hobbes12liftFunctionIFvvEE4typeERNS_6typedbE:
  296|      3|    static MonoTypePtr type(typedb& tenv) {
  297|      3|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      3|    }
_ZN6hobbes7typeSeqIJEE7liftSeqERNS_6typedbE:
  280|      8|    static MonoTypes liftSeq(typedb&) { return MonoTypes(); }
_ZN6hobbes12liftFunctionIFPNS_5arrayINS_11RegionStateEEEvEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes12liftVarArrayINS_11RegionStateEE4typeERNS_6typedbE:
  189|      1|    static MonoTypePtr type(typedb& tenv) {
  190|      1|      return Array::make(lift<T, true>::type(tenv));
  191|      1|    }
_ZN6hobbes10liftStructINS_11RegionStateEE4typeERNS_6typedbE:
  496|      1|    static MonoTypePtr type(typedb& tenv) {
  497|      1|      Record::Members ms;
  498|      1|      inferFieldTypeF f(&ms, &tenv);
  499|      1|      T::meta(f);
  500|      1|      return Record::make(ms);
  501|      1|    }
_ZN6hobbes15inferFieldTypeF5visitIPKNS_5arrayIcEEEEvPKc:
  487|      1|    void visit(const char* fname) {
  488|      1|      this->o = align<size_t>(this->o, alignof(T));
  489|      1|      ms->push_back(Record::Member(fname, lift<T, true>::type(*this->tenv), this->o));
  490|      1|      this->o += sizeof(T);
  491|      1|    }
_ZN6hobbes4liftIPKNS_5arrayIcEELb1EvE4typeERNS_6typedbE:
  114|      2|    static MonoTypePtr type(typedb& tenv) {
  115|      2|      return defaultLift<T, InStruct>::type(tenv);
  116|      2|    }
_ZN6hobbes12liftVarArrayIcE4typeERNS_6typedbE:
  189|     36|    static MonoTypePtr type(typedb& tenv) {
  190|     36|      return Array::make(lift<T, true>::type(tenv));
  191|     36|    }
_ZN6hobbes4liftIcLb1EvE4typeERNS_6typedbE:
  201|     37|      static MonoTypePtr type(typedb&) { \
  202|     37|        return Prim::make(#n); \
  203|     37|      } \
_ZN6hobbes15inferFieldTypeF5visitImEEvPKc:
  487|      4|    void visit(const char* fname) {
  488|      4|      this->o = align<size_t>(this->o, alignof(T));
  489|      4|      ms->push_back(Record::Member(fname, lift<T, true>::type(*this->tenv), this->o));
  490|      4|      this->o += sizeof(T);
  491|      4|    }
_ZN6hobbes4liftImLb1EvE4typeERNS_6typedbE:
  201|      6|      static MonoTypePtr type(typedb&) { \
  202|      6|        return Prim::make(#n); \
  203|      6|      } \
_ZN6hobbes12liftFunctionIFmmEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJmEE7liftSeqERNS_6typedbE:
  288|      2|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes12liftFunctionIFmPKNS_5arrayIcEEEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJPKNS_5arrayIcEEEE7liftSeqERNS_6typedbE:
  288|      9|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJPKNS_5arrayIcEEEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS9_EERNS_6typedbE:
  284|     10|    static void accum(MonoTypes* r, typedb& tenv) {
  285|     10|      r->push_back(lift<T, false>::type(tenv));
  286|     10|      typeSeq<Ts...>::accum(r, tenv);
  287|     10|    }
_ZN6hobbes4liftIPKNS_5arrayIcEELb0EvE4typeERNS_6typedbE:
  114|     32|    static MonoTypePtr type(typedb& tenv) {
  115|     32|      return defaultLift<T, InStruct>::type(tenv);
  116|     32|    }
_ZN6hobbes12liftFunctionIFvmEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes12liftFunctionIFPKNS_5arrayIcEEcEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJcEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes12liftFunctionIFPKNS_5arrayIcEEhEE4typeERNS_6typedbE:
  296|      2|    static MonoTypePtr type(typedb& tenv) {
  297|      2|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      2|    }
_ZN6hobbes12liftFunctionIFPKNS_5arrayIcEEsEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes12liftFunctionIFPKNS_5arrayIcEEiEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes12liftFunctionIFPKNS_5arrayIcEElEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes12liftFunctionIFPKNS_5arrayIcEEnEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes12liftFunctionIFPKNS_5arrayIcEEfiEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJfiEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJfiEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS5_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes12liftFunctionIFPKNS_5arrayIcEEdiEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJdiEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJdiEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS5_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes12liftFunctionIFPKNS_5arrayIcEEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaISC_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes12liftFunctionIFPKNS_5arrayIcEENS_9timespanTEEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJNS_9timespanTEEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJNS_9timespanTEEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes4liftINS_9timespanTELb0EvE4typeERNS_6typedbE:
  235|      3|    static MonoTypePtr type(typedb& tenv) {
  236|      3|      return tenv.defineNamedType(T::name(), str::seq(), lift<typename T::type, InStruct>::type(tenv));
  237|      3|    }
_ZN6hobbes12liftFunctionIFPKNS_5arrayIcEENS_5timeTEEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJNS_5timeTEEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJNS_5timeTEEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERNS_6typedbE:
  284|      2|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      2|      r->push_back(lift<T, false>::type(tenv));
  286|      2|      typeSeq<Ts...>::accum(r, tenv);
  287|      2|    }
_ZN6hobbes4liftINS_5timeTELb0EvE4typeERNS_6typedbE:
  235|      3|    static MonoTypePtr type(typedb& tenv) {
  236|      3|      return tenv.defineNamedType(T::name(), str::seq(), lift<typename T::type, InStruct>::type(tenv));
  237|      3|    }
_ZN6hobbes12liftFunctionIFPKNS_5arrayIcEENS_9datetimeTEEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJNS_9datetimeTEEE7liftSeqERNS_6typedbE:
  288|      6|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJNS_9datetimeTEEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERNS_6typedbE:
  284|      7|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      7|      r->push_back(lift<T, false>::type(tenv));
  286|      7|      typeSeq<Ts...>::accum(r, tenv);
  287|      7|    }
_ZN6hobbes4liftINS_9datetimeTELb0EvE4typeERNS_6typedbE:
  235|     11|    static MonoTypePtr type(typedb& tenv) {
  236|     11|      return tenv.defineNamedType(T::name(), str::seq(), lift<typename T::type, InStruct>::type(tenv));
  237|     11|    }
_ZN6hobbes12liftFunctionIFPKNS_5arrayIcEES4_lEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJPKNS_5arrayIcEElEE7liftSeqERNS_6typedbE:
  288|      3|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJPKNS_5arrayIcEElEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS9_EERNS_6typedbE:
  284|      3|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      3|      r->push_back(lift<T, false>::type(tenv));
  286|      3|      typeSeq<Ts...>::accum(r, tenv);
  287|      3|    }
_ZN6hobbes12liftFunctionIFPKNS_5arrayIcEES4_NS_9datetimeTEEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJPKNS_5arrayIcEENS_9datetimeTEEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJPKNS_5arrayIcEENS_9datetimeTEEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaISA_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes12liftFunctionIFNS_9datetimeTEvEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes12liftFunctionIFNS_9datetimeTES1_EE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes12liftFunctionIFNS_5timeTENS_9datetimeTEEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes12liftFunctionIFNS_9datetimeTES1_NS_5timeTEEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJNS_9datetimeTENS_5timeTEEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJNS_9datetimeTENS_5timeTEEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes12liftFunctionIFNS_9timespanTENS_9datetimeTEEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes12liftFunctionIFPKNS_3CTMENS_9datetimeTEEE4typeERNS_6typedbE:
  296|      2|    static MonoTypePtr type(typedb& tenv) {
  297|      2|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      2|    }
_ZN6hobbes10liftStructIKNS_3CTMEE4typeERNS_6typedbE:
  496|      2|    static MonoTypePtr type(typedb& tenv) {
  497|      2|      Record::Members ms;
  498|      2|      inferFieldTypeF f(&ms, &tenv);
  499|      2|      T::meta(f);
  500|      2|      return Record::make(ms);
  501|      2|    }
_ZN6hobbes15inferFieldTypeF5visitIiEEvPKc:
  487|     20|    void visit(const char* fname) {
  488|     20|      this->o = align<size_t>(this->o, alignof(T));
  489|     20|      ms->push_back(Record::Member(fname, lift<T, true>::type(*this->tenv), this->o));
  490|     20|      this->o += sizeof(T);
  491|     20|    }
_ZN6hobbes4liftIiLb1EvE4typeERNS_6typedbE:
  201|     21|      static MonoTypePtr type(typedb&) { \
  202|     21|        return Prim::make(#n); \
  203|     21|      } \
_ZN6hobbes12liftFunctionIFvPNS_5arrayIcEEEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJPNS_5arrayIcEEEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJPNS_5arrayIcEEEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS8_EERNS_6typedbE:
  284|      2|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      2|      r->push_back(lift<T, false>::type(tenv));
  286|      2|      typeSeq<Ts...>::accum(r, tenv);
  287|      2|    }
_ZN6hobbes12liftFunctionIFPKNS_5arrayIcEEvEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes12liftFunctionIFPKNS_7variantIJNS_4unitEcEEEPKNS_5arrayIcEEEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes4liftIPKNS_7variantIJNS_4unitEcEEELb0EvE4typeERNS_6typedbE:
  114|      1|    static MonoTypePtr type(typedb& tenv) {
  115|      1|      return defaultLift<T, InStruct>::type(tenv);
  116|      1|    }
_ZN6hobbes11liftVariantINS_7variantIJNS_4unitEcEEEE4typeERNS_6typedbE:
  377|      1|    static MonoTypePtr type(typedb& tenv) {
  378|      1|      Variant::Members ms;
  379|      1|      liftVarCtors<CTys...>::constructors(tenv, &ms);
  380|      1|      MonoTypePtr result = Variant::make(ms);
  381|      1|      const Variant* vty = is<Variant>(result);
  382|      1|      size_t vsz = vty->size();
  383|      1|      size_t csz = sizeof(variant<CTys...>);
  384|      1|      if (vsz != csz) {
  ------------------
  |  Branch (384:11): [True: 0, False: 1]
  ------------------
  385|      0|        size_t offset = vty->payloadOffset();
  386|      0|        size_t psz    = vty->payloadSize();
  387|      0|        throw std::runtime_error(
  388|      0|          "Internal error, computed size for variant '" + show(result) + "' (" +
  389|      0|          str::from(offset) + "+" + str::from(psz) + "(+" + str::from(vsz - (offset + psz)) +
  390|      0|          ")) inconsistent with C++ memory layout (size=" + str::from(csz) + ")"
  391|      0|        );
  392|      0|      }
  393|      1|      return result;
  394|      1|    }
_ZN6hobbes12liftVarCtorsIJNS_4unitEcEE12constructorsERNS_6typedbEPSt6vectorINS_7Variant6MemberESaIS7_EE:
  367|      1|    static void constructors(typedb& tenv, Variant::Members* ms) {
  368|      1|      ms->push_back(Variant::Member(liftVarCtor<CTy>::labelText(ms->size()), lift< typename liftVarCtor<CTy>::type, true >::type(tenv), ms->size()));
  369|      1|      liftVarCtors<CTys...>::constructors(tenv, ms);
  370|      1|    }
_ZN6hobbes11liftVarCtorINS_4unitEvE9labelTextB5cxx11Ei:
  354|      8|    static std::string labelText(int idx) { return ".f" + str::from(idx); }
_ZN6hobbes4liftINS_4unitELb1EvE4typeERNS_6typedbE:
  201|      8|      static MonoTypePtr type(typedb&) { \
  202|      8|        return Prim::make(#n); \
  203|      8|      } \
_ZN6hobbes12liftVarCtorsIJcEE12constructorsERNS_6typedbEPSt6vectorINS_7Variant6MemberESaIS6_EE:
  367|      1|    static void constructors(typedb& tenv, Variant::Members* ms) {
  368|      1|      ms->push_back(Variant::Member(liftVarCtor<CTy>::labelText(ms->size()), lift< typename liftVarCtor<CTy>::type, true >::type(tenv), ms->size()));
  369|      1|      liftVarCtors<CTys...>::constructors(tenv, ms);
  370|      1|    }
_ZN6hobbes11liftVarCtorIcvE9labelTextB5cxx11Ei:
  354|      1|    static std::string labelText(int idx) { return ".f" + str::from(idx); }
_ZN6hobbes12liftVarCtorsIJEE12constructorsERNS_6typedbEPSt6vectorINS_7Variant6MemberESaIS6_EE:
  363|      8|    static void constructors(typedb&, Variant::Members*) { }
_ZN6hobbes12liftFunctionIFPKNS_7variantIJNS_4unitEhEEEPKNS_5arrayIcEEEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes4liftIPKNS_7variantIJNS_4unitEhEEELb0EvE4typeERNS_6typedbE:
  114|      1|    static MonoTypePtr type(typedb& tenv) {
  115|      1|      return defaultLift<T, InStruct>::type(tenv);
  116|      1|    }
_ZN6hobbes11liftVariantINS_7variantIJNS_4unitEhEEEE4typeERNS_6typedbE:
  377|      1|    static MonoTypePtr type(typedb& tenv) {
  378|      1|      Variant::Members ms;
  379|      1|      liftVarCtors<CTys...>::constructors(tenv, &ms);
  380|      1|      MonoTypePtr result = Variant::make(ms);
  381|      1|      const Variant* vty = is<Variant>(result);
  382|      1|      size_t vsz = vty->size();
  383|      1|      size_t csz = sizeof(variant<CTys...>);
  384|      1|      if (vsz != csz) {
  ------------------
  |  Branch (384:11): [True: 0, False: 1]
  ------------------
  385|      0|        size_t offset = vty->payloadOffset();
  386|      0|        size_t psz    = vty->payloadSize();
  387|      0|        throw std::runtime_error(
  388|      0|          "Internal error, computed size for variant '" + show(result) + "' (" +
  389|      0|          str::from(offset) + "+" + str::from(psz) + "(+" + str::from(vsz - (offset + psz)) +
  390|      0|          ")) inconsistent with C++ memory layout (size=" + str::from(csz) + ")"
  391|      0|        );
  392|      0|      }
  393|      1|      return result;
  394|      1|    }
_ZN6hobbes12liftVarCtorsIJNS_4unitEhEE12constructorsERNS_6typedbEPSt6vectorINS_7Variant6MemberESaIS7_EE:
  367|      1|    static void constructors(typedb& tenv, Variant::Members* ms) {
  368|      1|      ms->push_back(Variant::Member(liftVarCtor<CTy>::labelText(ms->size()), lift< typename liftVarCtor<CTy>::type, true >::type(tenv), ms->size()));
  369|      1|      liftVarCtors<CTys...>::constructors(tenv, ms);
  370|      1|    }
_ZN6hobbes12liftVarCtorsIJhEE12constructorsERNS_6typedbEPSt6vectorINS_7Variant6MemberESaIS6_EE:
  367|      1|    static void constructors(typedb& tenv, Variant::Members* ms) {
  368|      1|      ms->push_back(Variant::Member(liftVarCtor<CTy>::labelText(ms->size()), lift< typename liftVarCtor<CTy>::type, true >::type(tenv), ms->size()));
  369|      1|      liftVarCtors<CTys...>::constructors(tenv, ms);
  370|      1|    }
_ZN6hobbes11liftVarCtorIhvE9labelTextB5cxx11Ei:
  354|      1|    static std::string labelText(int idx) { return ".f" + str::from(idx); }
_ZN6hobbes4liftIhLb1EvE4typeERNS_6typedbE:
  201|     11|      static MonoTypePtr type(typedb&) { \
  202|     11|        return Prim::make(#n); \
  203|     11|      } \
_ZN6hobbes12liftFunctionIFPKNS_7variantIJNS_4unitEsEEEPKNS_5arrayIcEEEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes4liftIPKNS_7variantIJNS_4unitEsEEELb0EvE4typeERNS_6typedbE:
  114|      1|    static MonoTypePtr type(typedb& tenv) {
  115|      1|      return defaultLift<T, InStruct>::type(tenv);
  116|      1|    }
_ZN6hobbes11liftVariantINS_7variantIJNS_4unitEsEEEE4typeERNS_6typedbE:
  377|      1|    static MonoTypePtr type(typedb& tenv) {
  378|      1|      Variant::Members ms;
  379|      1|      liftVarCtors<CTys...>::constructors(tenv, &ms);
  380|      1|      MonoTypePtr result = Variant::make(ms);
  381|      1|      const Variant* vty = is<Variant>(result);
  382|      1|      size_t vsz = vty->size();
  383|      1|      size_t csz = sizeof(variant<CTys...>);
  384|      1|      if (vsz != csz) {
  ------------------
  |  Branch (384:11): [True: 0, False: 1]
  ------------------
  385|      0|        size_t offset = vty->payloadOffset();
  386|      0|        size_t psz    = vty->payloadSize();
  387|      0|        throw std::runtime_error(
  388|      0|          "Internal error, computed size for variant '" + show(result) + "' (" +
  389|      0|          str::from(offset) + "+" + str::from(psz) + "(+" + str::from(vsz - (offset + psz)) +
  390|      0|          ")) inconsistent with C++ memory layout (size=" + str::from(csz) + ")"
  391|      0|        );
  392|      0|      }
  393|      1|      return result;
  394|      1|    }
_ZN6hobbes12liftVarCtorsIJNS_4unitEsEE12constructorsERNS_6typedbEPSt6vectorINS_7Variant6MemberESaIS7_EE:
  367|      1|    static void constructors(typedb& tenv, Variant::Members* ms) {
  368|      1|      ms->push_back(Variant::Member(liftVarCtor<CTy>::labelText(ms->size()), lift< typename liftVarCtor<CTy>::type, true >::type(tenv), ms->size()));
  369|      1|      liftVarCtors<CTys...>::constructors(tenv, ms);
  370|      1|    }
_ZN6hobbes12liftVarCtorsIJsEE12constructorsERNS_6typedbEPSt6vectorINS_7Variant6MemberESaIS6_EE:
  367|      1|    static void constructors(typedb& tenv, Variant::Members* ms) {
  368|      1|      ms->push_back(Variant::Member(liftVarCtor<CTy>::labelText(ms->size()), lift< typename liftVarCtor<CTy>::type, true >::type(tenv), ms->size()));
  369|      1|      liftVarCtors<CTys...>::constructors(tenv, ms);
  370|      1|    }
_ZN6hobbes11liftVarCtorIsvE9labelTextB5cxx11Ei:
  354|      1|    static std::string labelText(int idx) { return ".f" + str::from(idx); }
_ZN6hobbes4liftIsLb1EvE4typeERNS_6typedbE:
  201|      3|      static MonoTypePtr type(typedb&) { \
  202|      3|        return Prim::make(#n); \
  203|      3|      } \
_ZN6hobbes12liftFunctionIFPKNS_7variantIJNS_4unitEiEEEPKNS_5arrayIcEEEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes4liftIPKNS_7variantIJNS_4unitEiEEELb0EvE4typeERNS_6typedbE:
  114|      1|    static MonoTypePtr type(typedb& tenv) {
  115|      1|      return defaultLift<T, InStruct>::type(tenv);
  116|      1|    }
_ZN6hobbes11liftVariantINS_7variantIJNS_4unitEiEEEE4typeERNS_6typedbE:
  377|      1|    static MonoTypePtr type(typedb& tenv) {
  378|      1|      Variant::Members ms;
  379|      1|      liftVarCtors<CTys...>::constructors(tenv, &ms);
  380|      1|      MonoTypePtr result = Variant::make(ms);
  381|      1|      const Variant* vty = is<Variant>(result);
  382|      1|      size_t vsz = vty->size();
  383|      1|      size_t csz = sizeof(variant<CTys...>);
  384|      1|      if (vsz != csz) {
  ------------------
  |  Branch (384:11): [True: 0, False: 1]
  ------------------
  385|      0|        size_t offset = vty->payloadOffset();
  386|      0|        size_t psz    = vty->payloadSize();
  387|      0|        throw std::runtime_error(
  388|      0|          "Internal error, computed size for variant '" + show(result) + "' (" +
  389|      0|          str::from(offset) + "+" + str::from(psz) + "(+" + str::from(vsz - (offset + psz)) +
  390|      0|          ")) inconsistent with C++ memory layout (size=" + str::from(csz) + ")"
  391|      0|        );
  392|      0|      }
  393|      1|      return result;
  394|      1|    }
_ZN6hobbes12liftVarCtorsIJNS_4unitEiEE12constructorsERNS_6typedbEPSt6vectorINS_7Variant6MemberESaIS7_EE:
  367|      1|    static void constructors(typedb& tenv, Variant::Members* ms) {
  368|      1|      ms->push_back(Variant::Member(liftVarCtor<CTy>::labelText(ms->size()), lift< typename liftVarCtor<CTy>::type, true >::type(tenv), ms->size()));
  369|      1|      liftVarCtors<CTys...>::constructors(tenv, ms);
  370|      1|    }
_ZN6hobbes12liftVarCtorsIJiEE12constructorsERNS_6typedbEPSt6vectorINS_7Variant6MemberESaIS6_EE:
  367|      1|    static void constructors(typedb& tenv, Variant::Members* ms) {
  368|      1|      ms->push_back(Variant::Member(liftVarCtor<CTy>::labelText(ms->size()), lift< typename liftVarCtor<CTy>::type, true >::type(tenv), ms->size()));
  369|      1|      liftVarCtors<CTys...>::constructors(tenv, ms);
  370|      1|    }
_ZN6hobbes11liftVarCtorIivE9labelTextB5cxx11Ei:
  354|      1|    static std::string labelText(int idx) { return ".f" + str::from(idx); }
_ZN6hobbes12liftFunctionIFPKNS_7variantIJNS_4unitElEEEPKNS_5arrayIcEEEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes4liftIPKNS_7variantIJNS_4unitElEEELb0EvE4typeERNS_6typedbE:
  114|      1|    static MonoTypePtr type(typedb& tenv) {
  115|      1|      return defaultLift<T, InStruct>::type(tenv);
  116|      1|    }
_ZN6hobbes11liftVariantINS_7variantIJNS_4unitElEEEE4typeERNS_6typedbE:
  377|      1|    static MonoTypePtr type(typedb& tenv) {
  378|      1|      Variant::Members ms;
  379|      1|      liftVarCtors<CTys...>::constructors(tenv, &ms);
  380|      1|      MonoTypePtr result = Variant::make(ms);
  381|      1|      const Variant* vty = is<Variant>(result);
  382|      1|      size_t vsz = vty->size();
  383|      1|      size_t csz = sizeof(variant<CTys...>);
  384|      1|      if (vsz != csz) {
  ------------------
  |  Branch (384:11): [True: 0, False: 1]
  ------------------
  385|      0|        size_t offset = vty->payloadOffset();
  386|      0|        size_t psz    = vty->payloadSize();
  387|      0|        throw std::runtime_error(
  388|      0|          "Internal error, computed size for variant '" + show(result) + "' (" +
  389|      0|          str::from(offset) + "+" + str::from(psz) + "(+" + str::from(vsz - (offset + psz)) +
  390|      0|          ")) inconsistent with C++ memory layout (size=" + str::from(csz) + ")"
  391|      0|        );
  392|      0|      }
  393|      1|      return result;
  394|      1|    }
_ZN6hobbes12liftVarCtorsIJNS_4unitElEE12constructorsERNS_6typedbEPSt6vectorINS_7Variant6MemberESaIS7_EE:
  367|      1|    static void constructors(typedb& tenv, Variant::Members* ms) {
  368|      1|      ms->push_back(Variant::Member(liftVarCtor<CTy>::labelText(ms->size()), lift< typename liftVarCtor<CTy>::type, true >::type(tenv), ms->size()));
  369|      1|      liftVarCtors<CTys...>::constructors(tenv, ms);
  370|      1|    }
_ZN6hobbes12liftVarCtorsIJlEE12constructorsERNS_6typedbEPSt6vectorINS_7Variant6MemberESaIS6_EE:
  367|      1|    static void constructors(typedb& tenv, Variant::Members* ms) {
  368|      1|      ms->push_back(Variant::Member(liftVarCtor<CTy>::labelText(ms->size()), lift< typename liftVarCtor<CTy>::type, true >::type(tenv), ms->size()));
  369|      1|      liftVarCtors<CTys...>::constructors(tenv, ms);
  370|      1|    }
_ZN6hobbes11liftVarCtorIlvE9labelTextB5cxx11Ei:
  354|      1|    static std::string labelText(int idx) { return ".f" + str::from(idx); }
_ZN6hobbes4liftIlLb1EvE4typeERNS_6typedbE:
  201|      1|      static MonoTypePtr type(typedb&) { \
  202|      1|        return Prim::make(#n); \
  203|      1|      } \
_ZN6hobbes12liftFunctionIFPKNS_7variantIJNS_4unitEnEEEPKNS_5arrayIcEEEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes4liftIPKNS_7variantIJNS_4unitEnEEELb0EvE4typeERNS_6typedbE:
  114|      1|    static MonoTypePtr type(typedb& tenv) {
  115|      1|      return defaultLift<T, InStruct>::type(tenv);
  116|      1|    }
_ZN6hobbes11liftVariantINS_7variantIJNS_4unitEnEEEE4typeERNS_6typedbE:
  377|      1|    static MonoTypePtr type(typedb& tenv) {
  378|      1|      Variant::Members ms;
  379|      1|      liftVarCtors<CTys...>::constructors(tenv, &ms);
  380|      1|      MonoTypePtr result = Variant::make(ms);
  381|      1|      const Variant* vty = is<Variant>(result);
  382|      1|      size_t vsz = vty->size();
  383|      1|      size_t csz = sizeof(variant<CTys...>);
  384|      1|      if (vsz != csz) {
  ------------------
  |  Branch (384:11): [True: 0, False: 1]
  ------------------
  385|      0|        size_t offset = vty->payloadOffset();
  386|      0|        size_t psz    = vty->payloadSize();
  387|      0|        throw std::runtime_error(
  388|      0|          "Internal error, computed size for variant '" + show(result) + "' (" +
  389|      0|          str::from(offset) + "+" + str::from(psz) + "(+" + str::from(vsz - (offset + psz)) +
  390|      0|          ")) inconsistent with C++ memory layout (size=" + str::from(csz) + ")"
  391|      0|        );
  392|      0|      }
  393|      1|      return result;
  394|      1|    }
_ZN6hobbes12liftVarCtorsIJNS_4unitEnEE12constructorsERNS_6typedbEPSt6vectorINS_7Variant6MemberESaIS7_EE:
  367|      1|    static void constructors(typedb& tenv, Variant::Members* ms) {
  368|      1|      ms->push_back(Variant::Member(liftVarCtor<CTy>::labelText(ms->size()), lift< typename liftVarCtor<CTy>::type, true >::type(tenv), ms->size()));
  369|      1|      liftVarCtors<CTys...>::constructors(tenv, ms);
  370|      1|    }
_ZN6hobbes12liftVarCtorsIJnEE12constructorsERNS_6typedbEPSt6vectorINS_7Variant6MemberESaIS6_EE:
  367|      1|    static void constructors(typedb& tenv, Variant::Members* ms) {
  368|      1|      ms->push_back(Variant::Member(liftVarCtor<CTy>::labelText(ms->size()), lift< typename liftVarCtor<CTy>::type, true >::type(tenv), ms->size()));
  369|      1|      liftVarCtors<CTys...>::constructors(tenv, ms);
  370|      1|    }
_ZN6hobbes11liftVarCtorInvE9labelTextB5cxx11Ei:
  354|      1|    static std::string labelText(int idx) { return ".f" + str::from(idx); }
_ZN6hobbes4liftInLb1EvE4typeERNS_6typedbE:
  201|      1|      static MonoTypePtr type(typedb&) { \
  202|      1|        return Prim::make(#n); \
  203|      1|      } \
_ZN6hobbes12liftFunctionIFPKNS_7variantIJNS_4unitEfEEEPKNS_5arrayIcEEEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes4liftIPKNS_7variantIJNS_4unitEfEEELb0EvE4typeERNS_6typedbE:
  114|      1|    static MonoTypePtr type(typedb& tenv) {
  115|      1|      return defaultLift<T, InStruct>::type(tenv);
  116|      1|    }
_ZN6hobbes11liftVariantINS_7variantIJNS_4unitEfEEEE4typeERNS_6typedbE:
  377|      1|    static MonoTypePtr type(typedb& tenv) {
  378|      1|      Variant::Members ms;
  379|      1|      liftVarCtors<CTys...>::constructors(tenv, &ms);
  380|      1|      MonoTypePtr result = Variant::make(ms);
  381|      1|      const Variant* vty = is<Variant>(result);
  382|      1|      size_t vsz = vty->size();
  383|      1|      size_t csz = sizeof(variant<CTys...>);
  384|      1|      if (vsz != csz) {
  ------------------
  |  Branch (384:11): [True: 0, False: 1]
  ------------------
  385|      0|        size_t offset = vty->payloadOffset();
  386|      0|        size_t psz    = vty->payloadSize();
  387|      0|        throw std::runtime_error(
  388|      0|          "Internal error, computed size for variant '" + show(result) + "' (" +
  389|      0|          str::from(offset) + "+" + str::from(psz) + "(+" + str::from(vsz - (offset + psz)) +
  390|      0|          ")) inconsistent with C++ memory layout (size=" + str::from(csz) + ")"
  391|      0|        );
  392|      0|      }
  393|      1|      return result;
  394|      1|    }
_ZN6hobbes12liftVarCtorsIJNS_4unitEfEE12constructorsERNS_6typedbEPSt6vectorINS_7Variant6MemberESaIS7_EE:
  367|      1|    static void constructors(typedb& tenv, Variant::Members* ms) {
  368|      1|      ms->push_back(Variant::Member(liftVarCtor<CTy>::labelText(ms->size()), lift< typename liftVarCtor<CTy>::type, true >::type(tenv), ms->size()));
  369|      1|      liftVarCtors<CTys...>::constructors(tenv, ms);
  370|      1|    }
_ZN6hobbes12liftVarCtorsIJfEE12constructorsERNS_6typedbEPSt6vectorINS_7Variant6MemberESaIS6_EE:
  367|      1|    static void constructors(typedb& tenv, Variant::Members* ms) {
  368|      1|      ms->push_back(Variant::Member(liftVarCtor<CTy>::labelText(ms->size()), lift< typename liftVarCtor<CTy>::type, true >::type(tenv), ms->size()));
  369|      1|      liftVarCtors<CTys...>::constructors(tenv, ms);
  370|      1|    }
_ZN6hobbes11liftVarCtorIfvE9labelTextB5cxx11Ei:
  354|      1|    static std::string labelText(int idx) { return ".f" + str::from(idx); }
_ZN6hobbes4liftIfLb1EvE4typeERNS_6typedbE:
  201|      1|      static MonoTypePtr type(typedb&) { \
  202|      1|        return Prim::make(#n); \
  203|      1|      } \
_ZN6hobbes12liftFunctionIFPKNS_7variantIJNS_4unitEdEEEPKNS_5arrayIcEEEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes4liftIPKNS_7variantIJNS_4unitEdEEELb0EvE4typeERNS_6typedbE:
  114|      1|    static MonoTypePtr type(typedb& tenv) {
  115|      1|      return defaultLift<T, InStruct>::type(tenv);
  116|      1|    }
_ZN6hobbes11liftVariantINS_7variantIJNS_4unitEdEEEE4typeERNS_6typedbE:
  377|      1|    static MonoTypePtr type(typedb& tenv) {
  378|      1|      Variant::Members ms;
  379|      1|      liftVarCtors<CTys...>::constructors(tenv, &ms);
  380|      1|      MonoTypePtr result = Variant::make(ms);
  381|      1|      const Variant* vty = is<Variant>(result);
  382|      1|      size_t vsz = vty->size();
  383|      1|      size_t csz = sizeof(variant<CTys...>);
  384|      1|      if (vsz != csz) {
  ------------------
  |  Branch (384:11): [True: 0, False: 1]
  ------------------
  385|      0|        size_t offset = vty->payloadOffset();
  386|      0|        size_t psz    = vty->payloadSize();
  387|      0|        throw std::runtime_error(
  388|      0|          "Internal error, computed size for variant '" + show(result) + "' (" +
  389|      0|          str::from(offset) + "+" + str::from(psz) + "(+" + str::from(vsz - (offset + psz)) +
  390|      0|          ")) inconsistent with C++ memory layout (size=" + str::from(csz) + ")"
  391|      0|        );
  392|      0|      }
  393|      1|      return result;
  394|      1|    }
_ZN6hobbes12liftVarCtorsIJNS_4unitEdEE12constructorsERNS_6typedbEPSt6vectorINS_7Variant6MemberESaIS7_EE:
  367|      1|    static void constructors(typedb& tenv, Variant::Members* ms) {
  368|      1|      ms->push_back(Variant::Member(liftVarCtor<CTy>::labelText(ms->size()), lift< typename liftVarCtor<CTy>::type, true >::type(tenv), ms->size()));
  369|      1|      liftVarCtors<CTys...>::constructors(tenv, ms);
  370|      1|    }
_ZN6hobbes12liftVarCtorsIJdEE12constructorsERNS_6typedbEPSt6vectorINS_7Variant6MemberESaIS6_EE:
  367|      1|    static void constructors(typedb& tenv, Variant::Members* ms) {
  368|      1|      ms->push_back(Variant::Member(liftVarCtor<CTy>::labelText(ms->size()), lift< typename liftVarCtor<CTy>::type, true >::type(tenv), ms->size()));
  369|      1|      liftVarCtors<CTys...>::constructors(tenv, ms);
  370|      1|    }
_ZN6hobbes11liftVarCtorIdvE9labelTextB5cxx11Ei:
  354|      1|    static std::string labelText(int idx) { return ".f" + str::from(idx); }
_ZN6hobbes4liftIdLb1EvE4typeERNS_6typedbE:
  201|      1|      static MonoTypePtr type(typedb&) { \
  202|      1|        return Prim::make(#n); \
  203|      1|      } \
_ZN6hobbes12liftFunctionIFvPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPNS_5arrayIcEEEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPNS_5arrayIcEEEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPNS_5arrayIcEEEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaISF_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes12liftFunctionIFldEE4typeERNS_6typedbE:
  296|      3|    static MonoTypePtr type(typedb& tenv) {
  297|      3|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      3|    }
_ZN6hobbes12liftFunctionIFvPKNS_5arrayIcEEmS4_PcEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJPKNS_5arrayIcEEmS4_PcEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJPKNS_5arrayIcEEmS4_PcEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaISA_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes7typeSeqIJmPKNS_5arrayIcEEPcEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaISA_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes7typeSeqIJPKNS_5arrayIcEEPcEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaISA_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes7typeSeqIJPcEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERNS_6typedbE:
  284|      2|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      2|      r->push_back(lift<T, false>::type(tenv));
  286|      2|      typeSeq<Ts...>::accum(r, tenv);
  287|      2|    }
_ZN6hobbes12liftFunctionIFllllEE4typeERNS_6typedbE:
  296|      3|    static MonoTypePtr type(typedb& tenv) {
  297|      3|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      3|    }
_ZN6hobbes7typeSeqIJlllEE7liftSeqERNS_6typedbE:
  288|      7|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJlllEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS5_EERNS_6typedbE:
  284|      7|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      7|      r->push_back(lift<T, false>::type(tenv));
  286|      7|      typeSeq<Ts...>::accum(r, tenv);
  287|      7|    }
_ZN6hobbes12liftFunctionIFmPcEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJPcEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes12liftFunctionIFcPcmEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJPcmEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJPcmEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes12liftFunctionIFvPclEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJPclEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJPclEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes12liftFunctionIFbiEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes12liftFunctionIFvibEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJibEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJibEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS5_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes12liftFunctionIFvihEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJihEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJihEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS5_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes12liftFunctionIFciEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes12liftFunctionIFvicEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJicEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJicEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS5_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes12liftFunctionIFvisEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJisEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJisEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS5_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes12liftFunctionIFviiEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes12liftFunctionIFvilEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJilEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJilEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS5_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes12liftFunctionIFniEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes12liftFunctionIFvinEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJinEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJinEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS5_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes12liftFunctionIFvifEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJifEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJifEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS5_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes12liftFunctionIFvidEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJidEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJidEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS5_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes12liftFunctionIFviPKNS_5arrayIcEEEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJiPKNS_5arrayIcEEEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJiPKNS_5arrayIcEEEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS9_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes12liftFunctionIFviPKNS_5arrayIhEEEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJiPKNS_5arrayIhEEEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJiPKNS_5arrayIhEEEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS9_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes7typeSeqIJPKNS_5arrayIhEEEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS9_EERNS_6typedbE:
  284|      3|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      3|      r->push_back(lift<T, false>::type(tenv));
  286|      3|      typeSeq<Ts...>::accum(r, tenv);
  287|      3|    }
_ZN6hobbes4liftIPKNS_5arrayIhEELb0EvE4typeERNS_6typedbE:
  114|      5|    static MonoTypePtr type(typedb& tenv) {
  115|      5|      return defaultLift<T, InStruct>::type(tenv);
  116|      5|    }
_ZN6hobbes12liftVarArrayIhE4typeERNS_6typedbE:
  189|      5|    static MonoTypePtr type(typedb& tenv) {
  190|      5|      return Array::make(lift<T, true>::type(tenv));
  191|      5|    }
_ZN6hobbes12liftFunctionIFPKNS_5arrayIhEES4_EE4typeERNS_6typedbE:
  296|      2|    static MonoTypePtr type(typedb& tenv) {
  297|      2|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      2|    }
_ZN6hobbes7typeSeqIJPKNS_5arrayIhEEEE7liftSeqERNS_6typedbE:
  288|      2|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes12liftFunctionIFvNS_9timespanTEPFbvEEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJNS_9timespanTEPFbvEEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJNS_9timespanTEPFbvEEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS8_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes7typeSeqIJPFbvEEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes12liftFunctionIFbvEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes12liftFunctionIFmRKSt6vectorIhSaIhEEmEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJRKSt6vectorIhSaIhEEmEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJRKSt6vectorIhSaIhEEmEE5accumEPS1_ISt10shared_ptrINS_8MonoTypeEESaIS9_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes4liftIRKSt6vectorIhSaIhEELb0EvE4typeERNS_6typedbE:
  114|      2|    static MonoTypePtr type(typedb& tenv) {
  115|      2|      return defaultLift<T, InStruct>::type(tenv);
  116|      2|    }
_ZN6hobbes10liftVectorIhE4typeERNS_6typedbE:
  128|      2|    static MonoTypePtr type(typedb& tenv) {
  129|      2|      return tapp(primty("vector", tabs(str::strings("t", "s", "c"), FixedArray::make(primty("byte"), tvar("c")))), list(lift<T, true>::type(tenv), tlong(sizeof(T)), tlong(sizeof(std::vector<T>))));
  130|      2|    }
_ZN6hobbes12liftFunctionIFPKcRKSt6vectorIhSaIhEEEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJRKSt6vectorIhSaIhEEEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJRKSt6vectorIhSaIhEEEE5accumEPS1_ISt10shared_ptrINS_8MonoTypeEESaIS9_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes4liftIPKcLb0EvE4typeERNS_6typedbE:
  114|      1|    static MonoTypePtr type(typedb& tenv) {
  115|      1|      return defaultLift<T, InStruct>::type(tenv);
  116|      1|    }
_ZN6hobbes12liftFunctionIFmmPFPciEEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJmPFPciEEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJmPFPciEEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS8_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes7typeSeqIJPFPciEEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS8_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes12liftFunctionIFPciEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes12liftFunctionIFvlEE4typeERNS_6typedbE:
  296|      3|    static MonoTypePtr type(typedb& tenv) {
  297|      3|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      3|    }
_ZN6hobbes4primIFbbbEEESt10shared_ptrINS_8MonoTypeEEv:
  224|      2|  inline MonoTypePtr prim() { return lift<T, false>::type(nulltdb); }
_ZN6hobbes12liftFunctionIFbbbEE4typeERNS_6typedbE:
  296|      2|    static MonoTypePtr type(typedb& tenv) {
  297|      2|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      2|    }
_ZN6hobbes7typeSeqIJbbEE7liftSeqERNS_6typedbE:
  288|      2|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJbbEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS5_EERNS_6typedbE:
  284|      2|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      2|      r->push_back(lift<T, false>::type(tenv));
  286|      2|      typeSeq<Ts...>::accum(r, tenv);
  287|      2|    }
_ZN6hobbes12liftVarArrayISt4pairIhsEE4typeERNS_6typedbE:
  189|      2|    static MonoTypePtr type(typedb& tenv) {
  190|      2|      return Array::make(lift<T, true>::type(tenv));
  191|      2|    }
_ZN6hobbes8liftPairIhsE4typeERNS_6typedbE:
  171|      2|    static MonoTypePtr type(typedb& tenv) {
  172|      2|      using FS = std::pair<F, S>;
  173|      2|      Record::Members fs;
  174|      2|      fs.push_back(Record::Member(".f0", lift<F, true>::type(tenv), offsetof(FS, first)));
  175|       |      fs.push_back(Record::Member(".f1", lift<S, true>::type(tenv), offsetof(FS, second)));
  176|      2|      return Record::make(fs);
  177|      2|    }
_ZN6hobbes12liftFunctionIFPcljEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJljEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJljEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS5_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes7typeSeqIJjEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS5_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes4liftIjLb0EvE4typeERNS_6typedbE:
  201|      2|      static MonoTypePtr type(typedb&) { \
  202|      2|        return Prim::make(#n); \
  203|      2|      } \
_ZN6hobbes12liftFunctionIFPclllEE4typeERNS_6typedbE:
  296|      2|    static MonoTypePtr type(typedb& tenv) {
  297|      2|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      2|    }
_ZN6hobbes12liftFunctionIFPcllEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes12liftFunctionIFvlllEE4typeERNS_6typedbE:
  296|      2|    static MonoTypePtr type(typedb& tenv) {
  297|      2|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      2|    }
_ZN6hobbes12liftFunctionIFvllEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes12liftFunctionIFlllmEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJllmEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJllmEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS5_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes7typeSeqIJlmEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS5_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes12liftFunctionIFlPKNS_5arrayIcEElEE4typeERNS_6typedbE:
  296|      2|    static MonoTypePtr type(typedb& tenv) {
  297|      2|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      2|    }
_ZN6hobbes12liftFunctionIFPNS_5arrayISt4pairIhsEEElEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes12liftFunctionIFPNS_10DynDModel0ElbhEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJlbhEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJlbhEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS5_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes7typeSeqIJbhEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS5_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes4liftIPNS_10DynDModel0ELb0EvE4typeERNS_6typedbE:
  114|      5|    static MonoTypePtr type(typedb& tenv) {
  115|      5|      return defaultLift<T, InStruct>::type(tenv);
  116|      5|    }
_ZN6hobbes11defaultLiftIPNS_10DynDModel0ELb0EE4typeERNS_6typedbE:
  108|      5|    static MonoTypePtr type(typedb& tenv) {
  109|      5|      return tenv.opaquePtrMonoType(typeid(T*), 0, false);
  110|      5|    }
_ZN6hobbes12liftFunctionIFvPNS_10DynDModel0EPjEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJPNS_10DynDModel0EPjEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJPNS_10DynDModel0EPjEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS8_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes7typeSeqIJPjEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes4liftIPjLb0EvE4typeERNS_6typedbE:
  114|      1|    static MonoTypePtr type(typedb& tenv) {
  115|      1|      return defaultLift<T, InStruct>::type(tenv);
  116|      1|    }
_ZN6hobbes11defaultLiftIPjLb0EE4typeERNS_6typedbE:
  108|      1|    static MonoTypePtr type(typedb& tenv) {
  109|      1|      return tenv.opaquePtrMonoType(typeid(T*), 0, false);
  110|      1|    }
_ZN6hobbes12liftFunctionIFvPNS_10DynDModel0EEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJPNS_10DynDModel0EEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJPNS_10DynDModel0EEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERNS_6typedbE:
  284|      2|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      2|      r->push_back(lift<T, false>::type(tenv));
  286|      2|      typeSeq<Ts...>::accum(r, tenv);
  287|      2|    }
_ZN6hobbes12liftFunctionIFPNS_8UCReaderEmmmEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJmmmEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJmmmEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS5_EERNS_6typedbE:
  284|      2|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      2|      r->push_back(lift<T, false>::type(tenv));
  286|      2|      typeSeq<Ts...>::accum(r, tenv);
  287|      2|    }
_ZN6hobbes4liftIPNS_8UCReaderELb0EvE4typeERNS_6typedbE:
  114|      8|    static MonoTypePtr type(typedb& tenv) {
  115|      8|      return defaultLift<T, InStruct>::type(tenv);
  116|      8|    }
_ZN6hobbes11defaultLiftIPNS_8UCReaderELb0EE4typeERNS_6typedbE:
  108|      8|    static MonoTypePtr type(typedb& tenv) {
  109|      8|      return tenv.opaquePtrMonoType(typeid(T*), 0, false);
  110|      8|    }
_ZN6hobbes12liftFunctionIFbPNS_8UCReaderEEE4typeERNS_6typedbE:
  296|      3|    static MonoTypePtr type(typedb& tenv) {
  297|      3|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      3|    }
_ZN6hobbes7typeSeqIJPNS_8UCReaderEEE7liftSeqERNS_6typedbE:
  288|      6|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJPNS_8UCReaderEEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERNS_6typedbE:
  284|      6|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      6|      r->push_back(lift<T, false>::type(tenv));
  286|      6|      typeSeq<Ts...>::accum(r, tenv);
  287|      6|    }
_ZN6hobbes12liftFunctionIFmPNS_8UCReaderEEE4typeERNS_6typedbE:
  296|      2|    static MonoTypePtr type(typedb& tenv) {
  297|      2|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      2|    }
_ZN6hobbes12liftFunctionIFhPNS_8UCReaderEPNS_10DynDModel0EEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJPNS_8UCReaderEPNS_10DynDModel0EEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJPNS_8UCReaderEPNS_10DynDModel0EEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS9_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes12liftFunctionIFvPNS_8UCReaderEEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes12liftFunctionIFPNS_8UCWriterEmmmmEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJmmmmEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJmmmmEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS5_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes4liftIPNS_8UCWriterELb0EvE4typeERNS_6typedbE:
  114|      6|    static MonoTypePtr type(typedb& tenv) {
  115|      6|      return defaultLift<T, InStruct>::type(tenv);
  116|      6|    }
_ZN6hobbes11defaultLiftIPNS_8UCWriterELb0EE4typeERNS_6typedbE:
  108|      6|    static MonoTypePtr type(typedb& tenv) {
  109|      6|      return tenv.opaquePtrMonoType(typeid(T*), 0, false);
  110|      6|    }
_ZN6hobbes12liftFunctionIFbPNS_8UCWriterEEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJPNS_8UCWriterEEE7liftSeqERNS_6typedbE:
  288|      4|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJPNS_8UCWriterEEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERNS_6typedbE:
  284|      4|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      4|      r->push_back(lift<T, false>::type(tenv));
  286|      4|      typeSeq<Ts...>::accum(r, tenv);
  287|      4|    }
_ZN6hobbes12liftFunctionIFmPNS_8UCWriterEEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes12liftFunctionIFPhPNS_8UCWriterEEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes12liftFunctionIFvPNS_8UCWriterEPNS_10DynDModel0EhEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJPNS_8UCWriterEPNS_10DynDModel0EhEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJPNS_8UCWriterEPNS_10DynDModel0EhEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS9_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes7typeSeqIJPNS_10DynDModel0EhEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes12liftFunctionIFvPNS_8UCWriterEEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes12liftFunctionIFvljPFblEEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJljPFblEEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJljPFblEEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes7typeSeqIJjPFblEEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes7typeSeqIJPFblEEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERNS_6typedbE:
  284|      2|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      2|      r->push_back(lift<T, false>::type(tenv));
  286|      2|      typeSeq<Ts...>::accum(r, tenv);
  287|      2|    }
_ZN6hobbes12liftFunctionIFblEE4typeERNS_6typedbE:
  296|      2|    static MonoTypePtr type(typedb& tenv) {
  297|      2|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      2|    }
_ZN6hobbes12liftFunctionIFvlllhPFblEEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes7typeSeqIJlllhPFblEEE7liftSeqERNS_6typedbE:
  288|      1|    static MonoTypes liftSeq(typedb& tenv) { MonoTypes r; accum(&r, tenv); return r; }
_ZN6hobbes7typeSeqIJlllhPFblEEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes7typeSeqIJllhPFblEEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes7typeSeqIJlhPFblEEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes7typeSeqIJhPFblEEE5accumEPSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERNS_6typedbE:
  284|      1|    static void accum(MonoTypes* r, typedb& tenv) {
  285|      1|      r->push_back(lift<T, false>::type(tenv));
  286|      1|      typeSeq<Ts...>::accum(r, tenv);
  287|      1|    }
_ZN6hobbes12liftFunctionIFPKNS_5arrayISt4pairIPKNS1_IcEEPKNS1_IS2_ImS2_IhmEEEEEEEvEE4typeERNS_6typedbE:
  296|      1|    static MonoTypePtr type(typedb& tenv) {
  297|      1|      return functy(typeSeq<Args...>::liftSeq(tenv), lift<R, false>::type(tenv));
  298|      1|    }
_ZN6hobbes4liftIPKNS_5arrayISt4pairIPKNS1_IcEEPKNS1_IS2_ImS2_IhmEEEEEEELb0EvE4typeERNS_6typedbE:
  114|      1|    static MonoTypePtr type(typedb& tenv) {
  115|      1|      return defaultLift<T, InStruct>::type(tenv);
  116|      1|    }
_ZN6hobbes12liftVarArrayISt4pairIPKNS_5arrayIcEEPKNS2_IS1_ImS1_IhmEEEEEE4typeERNS_6typedbE:
  189|      1|    static MonoTypePtr type(typedb& tenv) {
  190|      1|      return Array::make(lift<T, true>::type(tenv));
  191|      1|    }
_ZN6hobbes8liftPairIPKNS_5arrayIcEEPKNS1_ISt4pairImS5_IhmEEEEE4typeERNS_6typedbE:
  171|      1|    static MonoTypePtr type(typedb& tenv) {
  172|      1|      using FS = std::pair<F, S>;
  173|      1|      Record::Members fs;
  174|      1|      fs.push_back(Record::Member(".f0", lift<F, true>::type(tenv), offsetof(FS, first)));
  175|       |      fs.push_back(Record::Member(".f1", lift<S, true>::type(tenv), offsetof(FS, second)));
  176|      1|      return Record::make(fs);
  177|      1|    }
_ZN6hobbes4liftIPKNS_5arrayISt4pairImS2_IhmEEEELb1EvE4typeERNS_6typedbE:
  114|      1|    static MonoTypePtr type(typedb& tenv) {
  115|      1|      return defaultLift<T, InStruct>::type(tenv);
  116|      1|    }
_ZN6hobbes12liftVarArrayISt4pairImS1_IhmEEE4typeERNS_6typedbE:
  189|      1|    static MonoTypePtr type(typedb& tenv) {
  190|      1|      return Array::make(lift<T, true>::type(tenv));
  191|      1|    }
_ZN6hobbes8liftPairImSt4pairIhmEE4typeERNS_6typedbE:
  171|      1|    static MonoTypePtr type(typedb& tenv) {
  172|      1|      using FS = std::pair<F, S>;
  173|      1|      Record::Members fs;
  174|      1|      fs.push_back(Record::Member(".f0", lift<F, true>::type(tenv), offsetof(FS, first)));
  175|       |      fs.push_back(Record::Member(".f1", lift<S, true>::type(tenv), offsetof(FS, second)));
  176|      1|      return Record::make(fs);
  177|      1|    }
_ZN6hobbes8liftPairIhmE4typeERNS_6typedbE:
  171|      1|    static MonoTypePtr type(typedb& tenv) {
  172|      1|      using FS = std::pair<F, S>;
  173|      1|      Record::Members fs;
  174|      1|      fs.push_back(Record::Member(".f0", lift<F, true>::type(tenv), offsetof(FS, first)));
  175|       |      fs.push_back(Record::Member(".f1", lift<S, true>::type(tenv), offsetof(FS, second)));
  176|      1|      return Record::make(fs);
  177|      1|    }

_ZN6hobbes6functyERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS3_EERKS3_:
 1158|  3.74k|inline MonoTypePtr functy(const MonoTypes& atys, const MonoTypePtr& rty) {
 1159|  3.74k|  if (atys.empty()) {
  ------------------
  |  Branch (1159:7): [True: 8, False: 3.73k]
  ------------------
 1160|      8|    return Func::make(tuplety(list(tuplety())), rty);
 1161|  3.73k|  } else {
 1162|  3.73k|    return Func::make(tuplety(atys), rty);
 1163|  3.73k|  }
 1164|  3.74k|}
_ZN6hobbes7tupletyERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS3_EE:
 1113|  6.40k|inline MonoTypePtr tuplety(const MonoTypes& mtys = MonoTypes()) {
 1114|  6.40k|  if (mtys.empty()) {
  ------------------
  |  Branch (1114:7): [True: 8, False: 6.40k]
  ------------------
 1115|      8|    return primty("unit");
 1116|  6.40k|  } else {
 1117|  6.40k|    Record::Members ms;
 1118|  20.8k|    for (unsigned int i = 0; i < mtys.size(); ++i) {
  ------------------
  |  Branch (1118:30): [True: 14.4k, False: 6.40k]
  ------------------
 1119|  14.4k|      ms.push_back(Record::Member(".f" + str::from(i), mtys[i]));
 1120|  14.4k|    }
 1121|  6.40k|    return Record::make(ms);
 1122|  6.40k|  }
 1123|  6.40k|}
_ZN6hobbes6primtyEPKc:
 1053|  7.07k|inline MonoTypePtr primty(const char* x) {
 1054|  7.07k|  return Prim::make(x);
 1055|  7.07k|}
_ZN6hobbes24CompactMTypeMemoryAtExitC2Eb:
 1303|      1|  explicit CompactMTypeMemoryAtExit(bool armed = true) : armed(armed) { }
_ZN6hobbes24CompactMTypeMemoryAtExitD2Ev:
 1304|      1|  ~CompactMTypeMemoryAtExit() { if (this->armed) { compactMTypeMemory(); } }
  ------------------
  |  Branch (1304:37): [True: 1, False: 0]
  ------------------
_ZNK6hobbes7genHashINS_6Record6MemberEEclERKS2_:
 1318|   155k|    inline size_t operator()(const Record::Member& x) const {
 1319|   155k|      using RMTup = std::tuple<std::string, MonoTypePtr, unsigned int>;
 1320|   155k|      static genHash<RMTup> h;
 1321|   155k|      return h(RMTup(x.field, x.type, x.offset));
 1322|   155k|    }
_ZNK6hobbes7genHashINS_7Variant6MemberEEclERKS2_:
 1326|  21.0k|    inline size_t operator()(const Variant::Member& x) const {
 1327|  21.0k|      using VMTup = std::tuple<std::string, MonoTypePtr, unsigned int>;
 1328|  21.0k|      static genHash<VMTup> h;
 1329|  21.0k|      return h(VMTup(x.selector, x.type, x.id));
 1330|  21.0k|    }
_ZNK6hobbes7genHashISt10shared_ptrINS_8MonoTypeEEEclERKS3_:
 1334|   340k|    inline size_t operator()(const MonoTypePtr& x) const {
 1335|   340k|      static std::hash<void*> h;
 1336|   340k|      return h(rcast<void*>(x.get()));
 1337|   340k|    }
_ZN6hobbes12substitutionERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS6_EERKS0_ISt10shared_ptrINS_8MonoTypeEESaISD_EE:
  177|      3|inline MonoTypeSubst substitution(const str::seq& ns, const MonoTypes& ts) {
  178|      3|  MonoTypeSubst s;
  179|      3|  size_t n = std::min<size_t>(ns.size(), ts.size());
  180|     10|  for (size_t i = 0; i < n; ++i) {
  ------------------
  |  Branch (180:22): [True: 7, False: 3]
  ------------------
  181|      7|    s[ns[i]] = ts[i];
  182|      7|  }
  183|      3|  return s;
  184|      3|}
_ZN6hobbes11selectTypesERKSt6vectorINS_6Record6MemberESaIS2_EE:
  879|  1.85k|inline MonoTypes selectTypes(const Record::Members& ms) {
  880|  1.85k|  MonoTypes r;
  881|  3.60k|  for (const auto &m : ms) {
  ------------------
  |  Branch (881:22): [True: 3.60k, False: 1.85k]
  ------------------
  882|  3.60k|    r.push_back(m.type);
  883|  3.60k|  }
  884|  1.85k|  return r;
  885|  1.85k|}
_ZN6hobbes6primtyEPKcRKSt10shared_ptrINS_8MonoTypeEE:
 1057|    104|inline MonoTypePtr primty(const char* x, const MonoTypePtr& aty) {
 1058|    104|  return Prim::make(x, aty);
 1059|    104|}
_ZN6hobbes8qualtypeERKSt6vectorISt10shared_ptrINS_10ConstraintEESaIS3_EERKS1_INS_8MonoTypeEE:
 1061|  48.7k|inline QualTypePtr qualtype(const Constraints& cs, const MonoTypePtr& p) {
 1062|  48.7k|  return std::make_shared<QualType>(cs, p);
 1063|  48.7k|}
_ZN6hobbes8qualtypeERKSt10shared_ptrINS_8MonoTypeEE:
 1069|  13.0k|inline QualTypePtr qualtype(const MonoTypePtr& p) {
 1070|  13.0k|  return std::make_shared<QualType>(p);
 1071|  13.0k|}
_ZN6hobbes8polytypeEiRKSt10shared_ptrINS_8QualTypeEE:
 1081|    193|inline PolyTypePtr polytype(int tvs, const QualTypePtr& qt) {
 1082|    193|  return std::make_shared<PolyType>(tvs, qt);
 1083|    193|}
_ZN6hobbes8polytypeERKSt10shared_ptrINS_8QualTypeEE:
 1085|  6.38k|inline PolyTypePtr polytype(const QualTypePtr& qt) {
 1086|  6.38k|  return std::make_shared<PolyType>(qt);
 1087|  6.38k|}
_ZN6hobbes8polytypeERKSt10shared_ptrINS_8MonoTypeEE:
 1089|  5.57k|inline PolyTypePtr polytype(const MonoTypePtr& p) {
 1090|  5.57k|  return polytype(qualtype(p));
 1091|  5.57k|}
_ZN6hobbes4tgenEi:
 1101|  3.28k|inline MonoTypePtr tgen(int i) {
 1102|  3.28k|  return TGen::make(i);
 1103|  3.28k|}
_ZN6hobbes4tvarERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
 1105|  1.09k|inline MonoTypePtr tvar(const std::string& vn) {
 1106|  1.09k|  return TVar::make(vn);
 1107|  1.09k|}
_ZN6hobbes7tstringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
 1109|  1.14k|inline MonoTypePtr tstring(const std::string& x) {
 1110|  1.14k|  return TString::make(x);
 1111|  1.14k|}
_ZN6hobbes7sumtypeERKSt10shared_ptrINS_8MonoTypeEES4_:
 1125|      1|inline MonoTypePtr sumtype(const MonoTypePtr& t0, const MonoTypePtr& t1) {
 1126|      1|  Variant::Members ms;
 1127|      1|  ms.push_back(Variant::Member(".f0", t0, 0));
 1128|      1|  ms.push_back(Variant::Member(".f1", t1, 1));
 1129|      1|  return Variant::make(ms);
 1130|      1|}
_ZN6hobbes6functyERKSt10shared_ptrINS_8MonoTypeEES4_:
 1154|      2|inline MonoTypePtr functy(const MonoTypePtr& aty, const MonoTypePtr& rty) {
 1155|      2|  return Func::make(aty, rty);
 1156|      2|}
_ZN6hobbes6clostyERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS3_EERKS3_:
 1170|      2|inline MonoTypePtr closty(const MonoTypes& atys, const MonoTypePtr& rty) {
 1171|      2|  return Exists::make("E", tuplety(list(functy(tuplety(cons(tvar("E"), atys)), rty), tvar("E"))));
 1172|      2|}
_ZN6hobbes4tabsERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS6_EERKSt10shared_ptrINS_8MonoTypeEE:
 1174|    110|inline MonoTypePtr tabs(const str::seq& tns, const MonoTypePtr& body) {
 1175|    110|  return TAbs::make(tns, body);
 1176|    110|}
_ZN6hobbes4tappERKSt10shared_ptrINS_8MonoTypeEERKSt6vectorIS2_SaIS2_EE:
 1178|     29|inline MonoTypePtr tapp(const MonoTypePtr& f, const MonoTypes& args) {
 1179|     29|  return TApp::make(f, args);
 1180|     29|}
_ZN6hobbes5tlongEl:
 1182|  5.39k|inline MonoTypePtr tlong(long x) {
 1183|  5.39k|  return TLong::make(x);
 1184|  5.39k|}
_ZN6hobbes5texprERKSt10shared_ptrINS_4ExprEE:
 1186|    288|inline MonoTypePtr texpr(const ExprPtr& x) {
 1187|    288|  return TExpr::make(x);
 1188|    288|}
_ZN6hobbes7arraytyERKSt10shared_ptrINS_8MonoTypeEEm:
 1200|     74|inline MonoTypePtr arrayty(const MonoTypePtr& ty, size_t n) {
 1201|     74|  return FixedArray::make(ty, tlong(n));
 1202|     74|}
_ZN6hobbes7arraytyERKSt10shared_ptrINS_8MonoTypeEE:
 1204|  1.02k|inline MonoTypePtr arrayty(const MonoTypePtr& ty) {
 1205|  1.02k|  return Array::make(ty);
 1206|  1.02k|}
_ZN6hobbes6isUnitERKSt10shared_ptrINS_8MonoTypeEE:
 1225|  11.9k|inline bool isUnit(const MonoTypePtr& t) {
 1226|  11.9k|  try {
 1227|  11.9k|    return sizeOf(t) == 0;
 1228|  11.9k|  } catch (std::exception&) {
 1229|     86|    return false; // well if we can't get a size, it must not be unit (yet?)
 1230|     86|  }
 1231|  11.9k|}
_ZN6hobbes8fnresultERKSt10shared_ptrINS_8MonoTypeEE:
 1278|      4|inline MonoTypePtr fnresult(const MonoTypePtr& fty) {
 1279|      4|  if (const Func* f = is<Func>(fty)) {
  ------------------
  |  Branch (1279:19): [True: 4, False: 0]
  ------------------
 1280|      4|    return f->result();
 1281|      4|  } else if (const TApp* fa = is<TApp>(fty)) {
  ------------------
  |  Branch (1281:26): [True: 0, False: 0]
  ------------------
 1282|      0|    if (const Prim* fn = is<Prim>(fa->fn())) {
  ------------------
  |  Branch (1282:21): [True: 0, False: 0]
  ------------------
 1283|      0|      if (fn->name() == "->" && fa->args().size() == 2) {
  ------------------
  |  Branch (1283:11): [True: 0, False: 0]
  |  Branch (1283:33): [True: 0, False: 0]
  ------------------
 1284|      0|        return fa->args()[1];
 1285|      0|      }
 1286|      0|    }
 1287|      0|  }
 1288|       |
 1289|      0|  throw std::runtime_error("Expected function type: " + show(fty));
 1290|      4|}
_ZN6hobbes8switchOfISt10shared_ptrINS_8MonoTypeEEEESt6vectorIT_SaIS5_EERKS4_IS3_SaIS3_EERKNS_10switchTypeIS5_EE:
  818|  1.66k|  std::vector<T> switchOf(const MonoTypes& ts, const switchType<T>& f) {
  819|  1.66k|    std::vector<T> result;
  820|  3.27k|    for (const auto &t : ts) {
  ------------------
  |  Branch (820:24): [True: 3.27k, False: 1.66k]
  ------------------
  821|  3.27k|      result.push_back(switchOf(t, f));
  822|  3.27k|    }
  823|  1.66k|    return result;
  824|  1.66k|  }
_ZN6hobbes8switchOfISt10shared_ptrINS_8MonoTypeEEEET_RKS3_RKNS_10switchTypeIS4_EE:
  813|   385k|  T switchOf(const MonoTypePtr& ty, const switchType<T>& f) {
  814|   385k|    return switchOfF< T, const MonoType*, CPtr, const switchType<T>& >(ty.get(), f);
  815|   385k|  }
_ZN6hobbes9switchOfFISt10shared_ptrINS_8MonoTypeEEPKS2_NS_4CPtrERKNS_10switchTypeIS3_EEEET_T0_T2_:
  751|   388k|  T switchOfF(Ptr ty, F f) {
  752|   388k|    using PrimT = typename PtrC::template as<Prim>::ty;
  753|   388k|    using OpaquePtrT = typename PtrC::template as<OpaquePtr>::ty;
  754|   388k|    using TVarT = typename PtrC::template as<TVar>::ty;
  755|   388k|    using TGenT = typename PtrC::template as<TGen>::ty;
  756|   388k|    using TAbsT = typename PtrC::template as<TAbs>::ty;
  757|   388k|    using TAppT = typename PtrC::template as<TApp>::ty;
  758|   388k|    using FixedArrayT = typename PtrC::template as<FixedArray>::ty;
  759|   388k|    using ArrayT = typename PtrC::template as<Array>::ty;
  760|   388k|    using VariantT = typename PtrC::template as<Variant>::ty;
  761|   388k|    using RecordT = typename PtrC::template as<Record>::ty;
  762|   388k|    using FuncT = typename PtrC::template as<Func>::ty;
  763|   388k|    using ExistsT = typename PtrC::template as<Exists>::ty;
  764|   388k|    using RecursiveT = typename PtrC::template as<Recursive>::ty;
  765|   388k|    using TStringT = typename PtrC::template as<TString>::ty;
  766|   388k|    using TLongT = typename PtrC::template as<TLong>::ty;
  767|   388k|    using TExprT = typename PtrC::template as<TExpr>::ty;
  768|       |
  769|   388k|    switch (ty->case_id()) {
  770|  24.8k|    case Prim::type_case_id:
  ------------------
  |  Branch (770:5): [True: 24.8k, False: 363k]
  ------------------
  771|  24.8k|      return f.with(rcast<PrimT>(ty));
  772|    436|    case OpaquePtr::type_case_id:
  ------------------
  |  Branch (772:5): [True: 436, False: 388k]
  ------------------
  773|    436|      return f.with(rcast<OpaquePtrT>(ty));
  774|   178k|    case TVar::type_case_id:
  ------------------
  |  Branch (774:5): [True: 178k, False: 210k]
  ------------------
  775|   178k|      return f.with(rcast<TVarT>(ty));
  776|  58.7k|    case TGen::type_case_id:
  ------------------
  |  Branch (776:5): [True: 58.7k, False: 329k]
  ------------------
  777|  58.7k|      return f.with(rcast<TGenT>(ty));
  778|      0|    case TAbs::type_case_id:
  ------------------
  |  Branch (778:5): [True: 0, False: 388k]
  ------------------
  779|      0|      return f.with(rcast<TAbsT>(ty));
  780|  3.36k|    case TApp::type_case_id:
  ------------------
  |  Branch (780:5): [True: 3.36k, False: 385k]
  ------------------
  781|  3.36k|      return f.with(rcast<TAppT>(ty));
  782|    770|    case FixedArray::type_case_id:
  ------------------
  |  Branch (782:5): [True: 770, False: 387k]
  ------------------
  783|    770|      return f.with(rcast<FixedArrayT>(ty));
  784|  19.8k|    case Array::type_case_id:
  ------------------
  |  Branch (784:5): [True: 19.8k, False: 368k]
  ------------------
  785|  19.8k|      return f.with(rcast<ArrayT>(ty));
  786|  8.90k|    case Variant::type_case_id:
  ------------------
  |  Branch (786:5): [True: 8.90k, False: 379k]
  ------------------
  787|  8.90k|      return f.with(rcast<VariantT>(ty));
  788|  55.6k|    case Record::type_case_id:
  ------------------
  |  Branch (788:5): [True: 55.6k, False: 332k]
  ------------------
  789|  55.6k|      return f.with(rcast<RecordT>(ty));
  790|  23.9k|    case Func::type_case_id:
  ------------------
  |  Branch (790:5): [True: 23.9k, False: 364k]
  ------------------
  791|  23.9k|      return f.with(rcast<FuncT>(ty));
  792|  6.02k|    case Exists::type_case_id:
  ------------------
  |  Branch (792:5): [True: 6.02k, False: 382k]
  ------------------
  793|  6.02k|      return f.with(rcast<ExistsT>(ty));
  794|  6.90k|    case Recursive::type_case_id:
  ------------------
  |  Branch (794:5): [True: 6.90k, False: 381k]
  ------------------
  795|  6.90k|      return f.with(rcast<RecursiveT>(ty));
  796|    418|    case TString::type_case_id:
  ------------------
  |  Branch (796:5): [True: 418, False: 388k]
  ------------------
  797|    418|      return f.with(rcast<TStringT>(ty));
  798|    354|    case TLong::type_case_id:
  ------------------
  |  Branch (798:5): [True: 354, False: 388k]
  ------------------
  799|    354|      return f.with(rcast<TLongT>(ty));
  800|      0|    case TExpr::type_case_id:
  ------------------
  |  Branch (800:5): [True: 0, False: 388k]
  ------------------
  801|      0|      return f.with(rcast<TExprT>(ty));
  802|      0|    default:
  ------------------
  |  Branch (802:5): [True: 0, False: 388k]
  ------------------
  803|      0|      throw std::runtime_error("Internal error, cannot switch on unknown type: " + show(ty));
  804|   388k|    }
  805|   388k|  }
_ZN6hobbes8switchOfIbEET_RKSt10shared_ptrINS_8MonoTypeEERKNS_10switchTypeIS1_EE:
  813|   232k|  T switchOf(const MonoTypePtr& ty, const switchType<T>& f) {
  814|   232k|    return switchOfF< T, const MonoType*, CPtr, const switchType<T>& >(ty.get(), f);
  815|   232k|  }
_ZN6hobbes9switchOfFIbPKNS_8MonoTypeENS_4CPtrERKNS_10switchTypeIbEEEET_T0_T2_:
  751|   232k|  T switchOfF(Ptr ty, F f) {
  752|   232k|    using PrimT = typename PtrC::template as<Prim>::ty;
  753|   232k|    using OpaquePtrT = typename PtrC::template as<OpaquePtr>::ty;
  754|   232k|    using TVarT = typename PtrC::template as<TVar>::ty;
  755|   232k|    using TGenT = typename PtrC::template as<TGen>::ty;
  756|   232k|    using TAbsT = typename PtrC::template as<TAbs>::ty;
  757|   232k|    using TAppT = typename PtrC::template as<TApp>::ty;
  758|   232k|    using FixedArrayT = typename PtrC::template as<FixedArray>::ty;
  759|   232k|    using ArrayT = typename PtrC::template as<Array>::ty;
  760|   232k|    using VariantT = typename PtrC::template as<Variant>::ty;
  761|   232k|    using RecordT = typename PtrC::template as<Record>::ty;
  762|   232k|    using FuncT = typename PtrC::template as<Func>::ty;
  763|   232k|    using ExistsT = typename PtrC::template as<Exists>::ty;
  764|   232k|    using RecursiveT = typename PtrC::template as<Recursive>::ty;
  765|   232k|    using TStringT = typename PtrC::template as<TString>::ty;
  766|   232k|    using TLongT = typename PtrC::template as<TLong>::ty;
  767|   232k|    using TExprT = typename PtrC::template as<TExpr>::ty;
  768|       |
  769|   232k|    switch (ty->case_id()) {
  770|  10.1k|    case Prim::type_case_id:
  ------------------
  |  Branch (770:5): [True: 10.1k, False: 221k]
  ------------------
  771|  10.1k|      return f.with(rcast<PrimT>(ty));
  772|     49|    case OpaquePtr::type_case_id:
  ------------------
  |  Branch (772:5): [True: 49, False: 231k]
  ------------------
  773|     49|      return f.with(rcast<OpaquePtrT>(ty));
  774|  22.5k|    case TVar::type_case_id:
  ------------------
  |  Branch (774:5): [True: 22.5k, False: 209k]
  ------------------
  775|  22.5k|      return f.with(rcast<TVarT>(ty));
  776|      0|    case TGen::type_case_id:
  ------------------
  |  Branch (776:5): [True: 0, False: 232k]
  ------------------
  777|      0|      return f.with(rcast<TGenT>(ty));
  778|      0|    case TAbs::type_case_id:
  ------------------
  |  Branch (778:5): [True: 0, False: 232k]
  ------------------
  779|      0|      return f.with(rcast<TAbsT>(ty));
  780|    339|    case TApp::type_case_id:
  ------------------
  |  Branch (780:5): [True: 339, False: 231k]
  ------------------
  781|    339|      return f.with(rcast<TAppT>(ty));
  782|      9|    case FixedArray::type_case_id:
  ------------------
  |  Branch (782:5): [True: 9, False: 231k]
  ------------------
  783|      9|      return f.with(rcast<FixedArrayT>(ty));
  784|  2.75k|    case Array::type_case_id:
  ------------------
  |  Branch (784:5): [True: 2.75k, False: 229k]
  ------------------
  785|  2.75k|      return f.with(rcast<ArrayT>(ty));
  786|    208|    case Variant::type_case_id:
  ------------------
  |  Branch (786:5): [True: 208, False: 231k]
  ------------------
  787|    208|      return f.with(rcast<VariantT>(ty));
  788|  13.7k|    case Record::type_case_id:
  ------------------
  |  Branch (788:5): [True: 13.7k, False: 218k]
  ------------------
  789|  13.7k|      return f.with(rcast<RecordT>(ty));
  790|  2.79k|    case Func::type_case_id:
  ------------------
  |  Branch (790:5): [True: 2.79k, False: 229k]
  ------------------
  791|  2.79k|      return f.with(rcast<FuncT>(ty));
  792|  2.18k|    case Exists::type_case_id:
  ------------------
  |  Branch (792:5): [True: 2.18k, False: 229k]
  ------------------
  793|  2.18k|      return f.with(rcast<ExistsT>(ty));
  794|     88|    case Recursive::type_case_id:
  ------------------
  |  Branch (794:5): [True: 88, False: 231k]
  ------------------
  795|     88|      return f.with(rcast<RecursiveT>(ty));
  796|   173k|    case TString::type_case_id:
  ------------------
  |  Branch (796:5): [True: 173k, False: 58.3k]
  ------------------
  797|   173k|      return f.with(rcast<TStringT>(ty));
  798|  2.26k|    case TLong::type_case_id:
  ------------------
  |  Branch (798:5): [True: 2.26k, False: 229k]
  ------------------
  799|  2.26k|      return f.with(rcast<TLongT>(ty));
  800|  1.20k|    case TExpr::type_case_id:
  ------------------
  |  Branch (800:5): [True: 1.20k, False: 230k]
  ------------------
  801|  1.20k|      return f.with(rcast<TExprT>(ty));
  802|      0|    default:
  ------------------
  |  Branch (802:5): [True: 0, False: 232k]
  ------------------
  803|      0|      throw std::runtime_error("Internal error, cannot switch on unknown type: " + show(ty));
  804|   232k|    }
  805|   232k|  }
_ZN6hobbes8switchOfIhEET_RKSt10shared_ptrINS_8MonoTypeEERKNS_10switchTypeIS1_EE:
  813|  16.8k|  T switchOf(const MonoTypePtr& ty, const switchType<T>& f) {
  814|  16.8k|    return switchOfF< T, const MonoType*, CPtr, const switchType<T>& >(ty.get(), f);
  815|  16.8k|  }
_ZN6hobbes9switchOfFIhPKNS_8MonoTypeENS_4CPtrERKNS_10switchTypeIhEEEET_T0_T2_:
  751|  16.8k|  T switchOfF(Ptr ty, F f) {
  752|  16.8k|    using PrimT = typename PtrC::template as<Prim>::ty;
  753|  16.8k|    using OpaquePtrT = typename PtrC::template as<OpaquePtr>::ty;
  754|  16.8k|    using TVarT = typename PtrC::template as<TVar>::ty;
  755|  16.8k|    using TGenT = typename PtrC::template as<TGen>::ty;
  756|  16.8k|    using TAbsT = typename PtrC::template as<TAbs>::ty;
  757|  16.8k|    using TAppT = typename PtrC::template as<TApp>::ty;
  758|  16.8k|    using FixedArrayT = typename PtrC::template as<FixedArray>::ty;
  759|  16.8k|    using ArrayT = typename PtrC::template as<Array>::ty;
  760|  16.8k|    using VariantT = typename PtrC::template as<Variant>::ty;
  761|  16.8k|    using RecordT = typename PtrC::template as<Record>::ty;
  762|  16.8k|    using FuncT = typename PtrC::template as<Func>::ty;
  763|  16.8k|    using ExistsT = typename PtrC::template as<Exists>::ty;
  764|  16.8k|    using RecursiveT = typename PtrC::template as<Recursive>::ty;
  765|  16.8k|    using TStringT = typename PtrC::template as<TString>::ty;
  766|  16.8k|    using TLongT = typename PtrC::template as<TLong>::ty;
  767|  16.8k|    using TExprT = typename PtrC::template as<TExpr>::ty;
  768|       |
  769|  16.8k|    switch (ty->case_id()) {
  770|  3.35k|    case Prim::type_case_id:
  ------------------
  |  Branch (770:5): [True: 3.35k, False: 13.4k]
  ------------------
  771|  3.35k|      return f.with(rcast<PrimT>(ty));
  772|     32|    case OpaquePtr::type_case_id:
  ------------------
  |  Branch (772:5): [True: 32, False: 16.8k]
  ------------------
  773|     32|      return f.with(rcast<OpaquePtrT>(ty));
  774|  5.23k|    case TVar::type_case_id:
  ------------------
  |  Branch (774:5): [True: 5.23k, False: 11.6k]
  ------------------
  775|  5.23k|      return f.with(rcast<TVarT>(ty));
  776|  1.72k|    case TGen::type_case_id:
  ------------------
  |  Branch (776:5): [True: 1.72k, False: 15.1k]
  ------------------
  777|  1.72k|      return f.with(rcast<TGenT>(ty));
  778|      0|    case TAbs::type_case_id:
  ------------------
  |  Branch (778:5): [True: 0, False: 16.8k]
  ------------------
  779|      0|      return f.with(rcast<TAbsT>(ty));
  780|    184|    case TApp::type_case_id:
  ------------------
  |  Branch (780:5): [True: 184, False: 16.6k]
  ------------------
  781|    184|      return f.with(rcast<TAppT>(ty));
  782|     84|    case FixedArray::type_case_id:
  ------------------
  |  Branch (782:5): [True: 84, False: 16.7k]
  ------------------
  783|     84|      return f.with(rcast<FixedArrayT>(ty));
  784|  1.71k|    case Array::type_case_id:
  ------------------
  |  Branch (784:5): [True: 1.71k, False: 15.1k]
  ------------------
  785|  1.71k|      return f.with(rcast<ArrayT>(ty));
  786|    305|    case Variant::type_case_id:
  ------------------
  |  Branch (786:5): [True: 305, False: 16.5k]
  ------------------
  787|    305|      return f.with(rcast<VariantT>(ty));
  788|  2.46k|    case Record::type_case_id:
  ------------------
  |  Branch (788:5): [True: 2.46k, False: 14.3k]
  ------------------
  789|  2.46k|      return f.with(rcast<RecordT>(ty));
  790|    570|    case Func::type_case_id:
  ------------------
  |  Branch (790:5): [True: 570, False: 16.2k]
  ------------------
  791|    570|      return f.with(rcast<FuncT>(ty));
  792|    385|    case Exists::type_case_id:
  ------------------
  |  Branch (792:5): [True: 385, False: 16.4k]
  ------------------
  793|    385|      return f.with(rcast<ExistsT>(ty));
  794|    398|    case Recursive::type_case_id:
  ------------------
  |  Branch (794:5): [True: 398, False: 16.4k]
  ------------------
  795|    398|      return f.with(rcast<RecursiveT>(ty));
  796|    148|    case TString::type_case_id:
  ------------------
  |  Branch (796:5): [True: 148, False: 16.6k]
  ------------------
  797|    148|      return f.with(rcast<TStringT>(ty));
  798|    243|    case TLong::type_case_id:
  ------------------
  |  Branch (798:5): [True: 243, False: 16.6k]
  ------------------
  799|    243|      return f.with(rcast<TLongT>(ty));
  800|      0|    case TExpr::type_case_id:
  ------------------
  |  Branch (800:5): [True: 0, False: 16.8k]
  ------------------
  801|      0|      return f.with(rcast<TExprT>(ty));
  802|      0|    default:
  ------------------
  |  Branch (802:5): [True: 0, False: 16.8k]
  ------------------
  803|      0|      throw std::runtime_error("Internal error, cannot switch on unknown type: " + show(ty));
  804|  16.8k|    }
  805|  16.8k|  }
_ZN6hobbes12MonoTypeCaseINS_4PrimEEC2Ev:
  680|     38|  MonoTypeCase<Case>::MonoTypeCase() : MonoType(Case::type_case_id) {
  681|     38|  }
_ZN6hobbes12MonoTypeCaseINS_9OpaquePtrEEC2Ev:
  680|      9|  MonoTypeCase<Case>::MonoTypeCase() : MonoType(Case::type_case_id) {
  681|      9|  }
_ZN6hobbes12MonoTypeCaseINS_4TVarEEC2Ev:
  680|  19.0k|  MonoTypeCase<Case>::MonoTypeCase() : MonoType(Case::type_case_id) {
  681|  19.0k|  }
_ZN6hobbes12MonoTypeCaseINS_4TGenEEC2Ev:
  680|     34|  MonoTypeCase<Case>::MonoTypeCase() : MonoType(Case::type_case_id) {
  681|     34|  }
_ZN6hobbes12MonoTypeCaseINS_4TAbsEEC2Ev:
  680|     13|  MonoTypeCase<Case>::MonoTypeCase() : MonoType(Case::type_case_id) {
  681|     13|  }
_ZN6hobbes12MonoTypeCaseINS_4TAppEEC2Ev:
  680|    231|  MonoTypeCase<Case>::MonoTypeCase() : MonoType(Case::type_case_id) {
  681|    231|  }
_ZN6hobbes12MonoTypeCaseINS_10FixedArrayEEC2Ev:
  680|     99|  MonoTypeCase<Case>::MonoTypeCase() : MonoType(Case::type_case_id) {
  681|     99|  }
_ZN6hobbes12MonoTypeCaseINS_5ArrayEEC2Ev:
  680|  2.08k|  MonoTypeCase<Case>::MonoTypeCase() : MonoType(Case::type_case_id) {
  681|  2.08k|  }
_ZN6hobbes12MonoTypeCaseINS_7VariantEEC2Ev:
  680|  1.34k|  MonoTypeCase<Case>::MonoTypeCase() : MonoType(Case::type_case_id) {
  681|  1.34k|  }
_ZN6hobbes12MonoTypeCaseINS_6RecordEEC2Ev:
  680|  9.97k|  MonoTypeCase<Case>::MonoTypeCase() : MonoType(Case::type_case_id) {
  681|  9.97k|  }
_ZN6hobbes12MonoTypeCaseINS_4FuncEEC2Ev:
  680|  9.45k|  MonoTypeCase<Case>::MonoTypeCase() : MonoType(Case::type_case_id) {
  681|  9.45k|  }
_ZN6hobbes12MonoTypeCaseINS_6ExistsEEC2Ev:
  680|    217|  MonoTypeCase<Case>::MonoTypeCase() : MonoType(Case::type_case_id) {
  681|    217|  }
_ZN6hobbes12MonoTypeCaseINS_9RecursiveEEC2Ev:
  680|    191|  MonoTypeCase<Case>::MonoTypeCase() : MonoType(Case::type_case_id) {
  681|    191|  }
_ZN6hobbes12MonoTypeCaseINS_7TStringEEC2Ev:
  680|    193|  MonoTypeCase<Case>::MonoTypeCase() : MonoType(Case::type_case_id) {
  681|    193|  }
_ZN6hobbes12MonoTypeCaseINS_5TLongEEC2Ev:
  680|     13|  MonoTypeCase<Case>::MonoTypeCase() : MonoType(Case::type_case_id) {
  681|     13|  }
_ZN6hobbes12MonoTypeCaseINS_5TExprEEC2Ev:
  680|     89|  MonoTypeCase<Case>::MonoTypeCase() : MonoType(Case::type_case_id) {
  681|     89|  }
_ZN6hobbes8switchOfISt10shared_ptrINS_8MonoTypeEEEESt6vectorINS_7Variant6MemberESaIS6_EERKS8_RKNS_10switchTypeIT_EE:
  846|  5.90k|  Variant::Members switchOf(const Variant::Members& ms, const switchType<T>& f) {
  847|  5.90k|    Variant::Members r;
  848|  11.8k|    for (const auto &m : ms) {
  ------------------
  |  Branch (848:24): [True: 11.8k, False: 5.90k]
  ------------------
  849|  11.8k|      r.push_back(Variant::Member(m.selector, switchOf(m.type, f), m.id));
  850|  11.8k|    }
  851|  5.90k|    return r;
  852|  5.90k|  }
_ZN6hobbes8switchOfISt10shared_ptrINS_8MonoTypeEEEESt6vectorINS_6Record6MemberESaIS6_EERKS8_RKNS_10switchTypeIT_EE:
  855|  32.8k|  Record::Members switchOf(const Record::Members& ms, const switchType<T>& f) {
  856|  32.8k|    Record::Members r;
  857|  71.2k|    for (const auto &m : ms) {
  ------------------
  |  Branch (857:24): [True: 71.2k, False: 32.8k]
  ------------------
  858|  71.2k|      r.push_back(Record::Member(m.field, switchOf(m.type, f), m.offset));
  859|  71.2k|    }
  860|  32.8k|    return r;
  861|  32.8k|  }
_ZN6hobbes8switchOfISt10shared_ptrINS_8MonoTypeEEEET_RKS2_RKNS_10switchTypeIS4_EE:
  808|  2.88k|  T switchOf(const MonoType& ty, const switchType<T>& f) {
  809|  2.88k|    return switchOfF< T, const MonoType*, CPtr, const switchType<T>& >(&ty, f);
  810|  2.88k|  }
_ZN6hobbes8switchOfIjEET_RKSt10shared_ptrINS_8MonoTypeEERKNS_10switchTypeIS1_EE:
  813|    522|  T switchOf(const MonoTypePtr& ty, const switchType<T>& f) {
  814|    522|    return switchOfF< T, const MonoType*, CPtr, const switchType<T>& >(ty.get(), f);
  815|    522|  }
_ZN6hobbes9switchOfFIjPKNS_8MonoTypeENS_4CPtrERKNS_10switchTypeIjEEEET_T0_T2_:
  751|    522|  T switchOfF(Ptr ty, F f) {
  752|    522|    using PrimT = typename PtrC::template as<Prim>::ty;
  753|    522|    using OpaquePtrT = typename PtrC::template as<OpaquePtr>::ty;
  754|    522|    using TVarT = typename PtrC::template as<TVar>::ty;
  755|    522|    using TGenT = typename PtrC::template as<TGen>::ty;
  756|    522|    using TAbsT = typename PtrC::template as<TAbs>::ty;
  757|    522|    using TAppT = typename PtrC::template as<TApp>::ty;
  758|    522|    using FixedArrayT = typename PtrC::template as<FixedArray>::ty;
  759|    522|    using ArrayT = typename PtrC::template as<Array>::ty;
  760|    522|    using VariantT = typename PtrC::template as<Variant>::ty;
  761|    522|    using RecordT = typename PtrC::template as<Record>::ty;
  762|    522|    using FuncT = typename PtrC::template as<Func>::ty;
  763|    522|    using ExistsT = typename PtrC::template as<Exists>::ty;
  764|    522|    using RecursiveT = typename PtrC::template as<Recursive>::ty;
  765|    522|    using TStringT = typename PtrC::template as<TString>::ty;
  766|    522|    using TLongT = typename PtrC::template as<TLong>::ty;
  767|    522|    using TExprT = typename PtrC::template as<TExpr>::ty;
  768|       |
  769|    522|    switch (ty->case_id()) {
  770|     15|    case Prim::type_case_id:
  ------------------
  |  Branch (770:5): [True: 15, False: 507]
  ------------------
  771|     15|      return f.with(rcast<PrimT>(ty));
  772|      8|    case OpaquePtr::type_case_id:
  ------------------
  |  Branch (772:5): [True: 8, False: 514]
  ------------------
  773|      8|      return f.with(rcast<OpaquePtrT>(ty));
  774|     86|    case TVar::type_case_id:
  ------------------
  |  Branch (774:5): [True: 86, False: 436]
  ------------------
  775|     86|      return f.with(rcast<TVarT>(ty));
  776|      0|    case TGen::type_case_id:
  ------------------
  |  Branch (776:5): [True: 0, False: 522]
  ------------------
  777|      0|      return f.with(rcast<TGenT>(ty));
  778|      0|    case TAbs::type_case_id:
  ------------------
  |  Branch (778:5): [True: 0, False: 522]
  ------------------
  779|      0|      return f.with(rcast<TAbsT>(ty));
  780|      3|    case TApp::type_case_id:
  ------------------
  |  Branch (780:5): [True: 3, False: 519]
  ------------------
  781|      3|      return f.with(rcast<TAppT>(ty));
  782|      7|    case FixedArray::type_case_id:
  ------------------
  |  Branch (782:5): [True: 7, False: 515]
  ------------------
  783|      7|      return f.with(rcast<FixedArrayT>(ty));
  784|     14|    case Array::type_case_id:
  ------------------
  |  Branch (784:5): [True: 14, False: 508]
  ------------------
  785|     14|      return f.with(rcast<ArrayT>(ty));
  786|     27|    case Variant::type_case_id:
  ------------------
  |  Branch (786:5): [True: 27, False: 495]
  ------------------
  787|     27|      return f.with(rcast<VariantT>(ty));
  788|     37|    case Record::type_case_id:
  ------------------
  |  Branch (788:5): [True: 37, False: 485]
  ------------------
  789|     37|      return f.with(rcast<RecordT>(ty));
  790|    312|    case Func::type_case_id:
  ------------------
  |  Branch (790:5): [True: 312, False: 210]
  ------------------
  791|    312|      return f.with(rcast<FuncT>(ty));
  792|      5|    case Exists::type_case_id:
  ------------------
  |  Branch (792:5): [True: 5, False: 517]
  ------------------
  793|      5|      return f.with(rcast<ExistsT>(ty));
  794|      2|    case Recursive::type_case_id:
  ------------------
  |  Branch (794:5): [True: 2, False: 520]
  ------------------
  795|      2|      return f.with(rcast<RecursiveT>(ty));
  796|      6|    case TString::type_case_id:
  ------------------
  |  Branch (796:5): [True: 6, False: 516]
  ------------------
  797|      6|      return f.with(rcast<TStringT>(ty));
  798|      0|    case TLong::type_case_id:
  ------------------
  |  Branch (798:5): [True: 0, False: 522]
  ------------------
  799|      0|      return f.with(rcast<TLongT>(ty));
  800|      0|    case TExpr::type_case_id:
  ------------------
  |  Branch (800:5): [True: 0, False: 522]
  ------------------
  801|      0|      return f.with(rcast<TExprT>(ty));
  802|      0|    default:
  ------------------
  |  Branch (802:5): [True: 0, False: 522]
  ------------------
  803|      0|      throw std::runtime_error("Internal error, cannot switch on unknown type: " + show(ty));
  804|    522|    }
  805|    522|  }
_ZN6hobbes8switchOfINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEET_RKSt10shared_ptrINS_8MonoTypeEERKNS_10switchTypeIS7_EE:
  813|  26.1k|  T switchOf(const MonoTypePtr& ty, const switchType<T>& f) {
  814|  26.1k|    return switchOfF< T, const MonoType*, CPtr, const switchType<T>& >(ty.get(), f);
  815|  26.1k|  }
_ZN6hobbes9switchOfFINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS_8MonoTypeENS_4CPtrERKNS_10switchTypeIS6_EEEET_T0_T2_:
  751|  26.1k|  T switchOfF(Ptr ty, F f) {
  752|  26.1k|    using PrimT = typename PtrC::template as<Prim>::ty;
  753|  26.1k|    using OpaquePtrT = typename PtrC::template as<OpaquePtr>::ty;
  754|  26.1k|    using TVarT = typename PtrC::template as<TVar>::ty;
  755|  26.1k|    using TGenT = typename PtrC::template as<TGen>::ty;
  756|  26.1k|    using TAbsT = typename PtrC::template as<TAbs>::ty;
  757|  26.1k|    using TAppT = typename PtrC::template as<TApp>::ty;
  758|  26.1k|    using FixedArrayT = typename PtrC::template as<FixedArray>::ty;
  759|  26.1k|    using ArrayT = typename PtrC::template as<Array>::ty;
  760|  26.1k|    using VariantT = typename PtrC::template as<Variant>::ty;
  761|  26.1k|    using RecordT = typename PtrC::template as<Record>::ty;
  762|  26.1k|    using FuncT = typename PtrC::template as<Func>::ty;
  763|  26.1k|    using ExistsT = typename PtrC::template as<Exists>::ty;
  764|  26.1k|    using RecursiveT = typename PtrC::template as<Recursive>::ty;
  765|  26.1k|    using TStringT = typename PtrC::template as<TString>::ty;
  766|  26.1k|    using TLongT = typename PtrC::template as<TLong>::ty;
  767|  26.1k|    using TExprT = typename PtrC::template as<TExpr>::ty;
  768|       |
  769|  26.1k|    switch (ty->case_id()) {
  770|    349|    case Prim::type_case_id:
  ------------------
  |  Branch (770:5): [True: 349, False: 25.8k]
  ------------------
  771|    349|      return f.with(rcast<PrimT>(ty));
  772|     42|    case OpaquePtr::type_case_id:
  ------------------
  |  Branch (772:5): [True: 42, False: 26.1k]
  ------------------
  773|     42|      return f.with(rcast<OpaquePtrT>(ty));
  774|      0|    case TVar::type_case_id:
  ------------------
  |  Branch (774:5): [True: 0, False: 26.1k]
  ------------------
  775|      0|      return f.with(rcast<TVarT>(ty));
  776|      0|    case TGen::type_case_id:
  ------------------
  |  Branch (776:5): [True: 0, False: 26.1k]
  ------------------
  777|      0|      return f.with(rcast<TGenT>(ty));
  778|      0|    case TAbs::type_case_id:
  ------------------
  |  Branch (778:5): [True: 0, False: 26.1k]
  ------------------
  779|      0|      return f.with(rcast<TAbsT>(ty));
  780|    264|    case TApp::type_case_id:
  ------------------
  |  Branch (780:5): [True: 264, False: 25.9k]
  ------------------
  781|    264|      return f.with(rcast<TAppT>(ty));
  782|     99|    case FixedArray::type_case_id:
  ------------------
  |  Branch (782:5): [True: 99, False: 26.0k]
  ------------------
  783|     99|      return f.with(rcast<FixedArrayT>(ty));
  784|  2.68k|    case Array::type_case_id:
  ------------------
  |  Branch (784:5): [True: 2.68k, False: 23.4k]
  ------------------
  785|  2.68k|      return f.with(rcast<ArrayT>(ty));
  786|    610|    case Variant::type_case_id:
  ------------------
  |  Branch (786:5): [True: 610, False: 25.5k]
  ------------------
  787|    610|      return f.with(rcast<VariantT>(ty));
  788|  11.5k|    case Record::type_case_id:
  ------------------
  |  Branch (788:5): [True: 11.5k, False: 14.6k]
  ------------------
  789|  11.5k|      return f.with(rcast<RecordT>(ty));
  790|  9.69k|    case Func::type_case_id:
  ------------------
  |  Branch (790:5): [True: 9.69k, False: 16.4k]
  ------------------
  791|  9.69k|      return f.with(rcast<FuncT>(ty));
  792|    272|    case Exists::type_case_id:
  ------------------
  |  Branch (792:5): [True: 272, False: 25.8k]
  ------------------
  793|    272|      return f.with(rcast<ExistsT>(ty));
  794|    174|    case Recursive::type_case_id:
  ------------------
  |  Branch (794:5): [True: 174, False: 25.9k]
  ------------------
  795|    174|      return f.with(rcast<RecursiveT>(ty));
  796|    286|    case TString::type_case_id:
  ------------------
  |  Branch (796:5): [True: 286, False: 25.8k]
  ------------------
  797|    286|      return f.with(rcast<TStringT>(ty));
  798|    165|    case TLong::type_case_id:
  ------------------
  |  Branch (798:5): [True: 165, False: 26.0k]
  ------------------
  799|    165|      return f.with(rcast<TLongT>(ty));
  800|      0|    case TExpr::type_case_id:
  ------------------
  |  Branch (800:5): [True: 0, False: 26.1k]
  ------------------
  801|      0|      return f.with(rcast<TExprT>(ty));
  802|      0|    default:
  ------------------
  |  Branch (802:5): [True: 0, False: 26.1k]
  ------------------
  803|      0|      throw std::runtime_error("Internal error, cannot switch on unknown type: " + show(ty));
  804|  26.1k|    }
  805|  26.1k|  }
_ZN6hobbes8switchOfIPN4llvm4TypeEEET_RKSt10shared_ptrINS_8MonoTypeEERKNS_10switchTypeIS4_EE:
  813|    445|  T switchOf(const MonoTypePtr& ty, const switchType<T>& f) {
  814|    445|    return switchOfF< T, const MonoType*, CPtr, const switchType<T>& >(ty.get(), f);
  815|    445|  }
_ZN6hobbes9switchOfFIPN4llvm4TypeEPKNS_8MonoTypeENS_4CPtrERKNS_10switchTypeIS3_EEEET_T0_T2_:
  751|    445|  T switchOfF(Ptr ty, F f) {
  752|    445|    using PrimT = typename PtrC::template as<Prim>::ty;
  753|    445|    using OpaquePtrT = typename PtrC::template as<OpaquePtr>::ty;
  754|    445|    using TVarT = typename PtrC::template as<TVar>::ty;
  755|    445|    using TGenT = typename PtrC::template as<TGen>::ty;
  756|    445|    using TAbsT = typename PtrC::template as<TAbs>::ty;
  757|    445|    using TAppT = typename PtrC::template as<TApp>::ty;
  758|    445|    using FixedArrayT = typename PtrC::template as<FixedArray>::ty;
  759|    445|    using ArrayT = typename PtrC::template as<Array>::ty;
  760|    445|    using VariantT = typename PtrC::template as<Variant>::ty;
  761|    445|    using RecordT = typename PtrC::template as<Record>::ty;
  762|    445|    using FuncT = typename PtrC::template as<Func>::ty;
  763|    445|    using ExistsT = typename PtrC::template as<Exists>::ty;
  764|    445|    using RecursiveT = typename PtrC::template as<Recursive>::ty;
  765|    445|    using TStringT = typename PtrC::template as<TString>::ty;
  766|    445|    using TLongT = typename PtrC::template as<TLong>::ty;
  767|    445|    using TExprT = typename PtrC::template as<TExpr>::ty;
  768|       |
  769|    445|    switch (ty->case_id()) {
  770|     26|    case Prim::type_case_id:
  ------------------
  |  Branch (770:5): [True: 26, False: 419]
  ------------------
  771|     26|      return f.with(rcast<PrimT>(ty));
  772|     10|    case OpaquePtr::type_case_id:
  ------------------
  |  Branch (772:5): [True: 10, False: 435]
  ------------------
  773|     10|      return f.with(rcast<OpaquePtrT>(ty));
  774|      0|    case TVar::type_case_id:
  ------------------
  |  Branch (774:5): [True: 0, False: 445]
  ------------------
  775|      0|      return f.with(rcast<TVarT>(ty));
  776|      0|    case TGen::type_case_id:
  ------------------
  |  Branch (776:5): [True: 0, False: 445]
  ------------------
  777|      0|      return f.with(rcast<TGenT>(ty));
  778|      0|    case TAbs::type_case_id:
  ------------------
  |  Branch (778:5): [True: 0, False: 445]
  ------------------
  779|      0|      return f.with(rcast<TAbsT>(ty));
  780|      2|    case TApp::type_case_id:
  ------------------
  |  Branch (780:5): [True: 2, False: 443]
  ------------------
  781|      2|      return f.with(rcast<TAppT>(ty));
  782|      5|    case FixedArray::type_case_id:
  ------------------
  |  Branch (782:5): [True: 5, False: 440]
  ------------------
  783|      5|      return f.with(rcast<FixedArrayT>(ty));
  784|     24|    case Array::type_case_id:
  ------------------
  |  Branch (784:5): [True: 24, False: 421]
  ------------------
  785|     24|      return f.with(rcast<ArrayT>(ty));
  786|     29|    case Variant::type_case_id:
  ------------------
  |  Branch (786:5): [True: 29, False: 416]
  ------------------
  787|     29|      return f.with(rcast<VariantT>(ty));
  788|     66|    case Record::type_case_id:
  ------------------
  |  Branch (788:5): [True: 66, False: 379]
  ------------------
  789|     66|      return f.with(rcast<RecordT>(ty));
  790|    275|    case Func::type_case_id:
  ------------------
  |  Branch (790:5): [True: 275, False: 170]
  ------------------
  791|    275|      return f.with(rcast<FuncT>(ty));
  792|      5|    case Exists::type_case_id:
  ------------------
  |  Branch (792:5): [True: 5, False: 440]
  ------------------
  793|      5|      return f.with(rcast<ExistsT>(ty));
  794|      3|    case Recursive::type_case_id:
  ------------------
  |  Branch (794:5): [True: 3, False: 442]
  ------------------
  795|      3|      return f.with(rcast<RecursiveT>(ty));
  796|      0|    case TString::type_case_id:
  ------------------
  |  Branch (796:5): [True: 0, False: 445]
  ------------------
  797|      0|      return f.with(rcast<TStringT>(ty));
  798|      0|    case TLong::type_case_id:
  ------------------
  |  Branch (798:5): [True: 0, False: 445]
  ------------------
  799|      0|      return f.with(rcast<TLongT>(ty));
  800|      0|    case TExpr::type_case_id:
  ------------------
  |  Branch (800:5): [True: 0, False: 445]
  ------------------
  801|      0|      return f.with(rcast<TExprT>(ty));
  802|      0|    default:
  ------------------
  |  Branch (802:5): [True: 0, False: 445]
  ------------------
  803|      0|      throw std::runtime_error("Internal error, cannot switch on unknown type: " + show(ty));
  804|    445|    }
  805|    445|  }

_ZN6hobbes8type_mapIbE6insertERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS5_EERKb:
   31|  2.87k|    void insert(const MonoTypes& mts, const V& v) {
   32|  2.87k|      this->d.insert(mts.begin(), mts.end(), v);
   33|  2.87k|    }
_ZN6hobbes8type_mapISt10shared_ptrINS_10TCInstanceEEE6insertERKSt6vectorIS1_INS_8MonoTypeEESaIS7_EERKS3_:
   31|    433|    void insert(const MonoTypes& mts, const V& v) {
   32|    433|      this->d.insert(mts.begin(), mts.end(), v);
   33|    433|    }
_ZNK6hobbes8type_mapISt6vectorISt10shared_ptrINS_12TCInstanceFnEESaIS4_EEE6lookupERKS1_IS2_INS_8MonoTypeEESaIS9_EE:
   35|    637|    V* lookup(const MonoTypes& mts) const {
   36|    637|      return this->d.lookup(mts.begin(), mts.end());
   37|    637|    }
_ZN6hobbes8type_mapISt6vectorISt10shared_ptrINS_12TCInstanceFnEESaIS4_EEE6insertERKS1_IS2_INS_8MonoTypeEESaIS9_EERKS6_:
   31|    572|    void insert(const MonoTypes& mts, const V& v) {
   32|    572|      this->d.insert(mts.begin(), mts.end(), v);
   33|    572|    }
_ZN6hobbes8type_mapIbE5clearEv:
   39|  3.60k|    void clear() {
   40|  3.60k|      this->d.clear();
   41|  3.60k|    }
_ZNK6hobbes8type_mapISt6vectorISt10shared_ptrINS_12TCInstanceFnEESaIS4_EEE11bidimatchesERKS2_INS_4TEnvEERKS1_IS2_INS_8MonoTypeEESaISD_EEPS1_IS6_SaIS6_EE:
   60|    176|    void bidimatches(const TEnvPtr& tenv, const MonoTypes& mts, std::vector<V>* out) const {
   61|    176|      MonoTypeUnifier u(tenv);
   62|    176|      findBidiMatches(u, this->d.rootPoint(), mts, 0, out);
   63|    176|    }
_ZNK6hobbes8type_mapISt6vectorISt10shared_ptrINS_12TCInstanceFnEESaIS4_EEE15findBidiMatchesERNS_15MonoTypeUnifierEPvRKS1_IS2_INS_8MonoTypeEESaISC_EEmPS1_IS6_SaIS6_EE:
  130|    626|    void findBidiMatches(MonoTypeUnifier& u, typename tmdata::point_t p, const MonoTypes& mts, size_t i, std::vector<V>* out) const {
  131|    626|      if (p == nullptr) return;
  ------------------
  |  Branch (131:11): [True: 0, False: 626]
  ------------------
  132|       |
  133|    626|      if (i == mts.size()) {
  ------------------
  |  Branch (133:11): [True: 218, False: 408]
  ------------------
  134|    218|        if (const V* v = this->d.valueAt(p)) {
  ------------------
  |  Branch (134:22): [True: 218, False: 0]
  ------------------
  135|    218|          out->push_back(*v);
  136|    218|        }
  137|    408|      } else {
  138|    408|        const MonoTypePtr& mty = u.substitute(mts[i]);
  139|       |
  140|    408|        typename tmdata::KeyPointSeq kps;
  141|    408|        this->d.keyPointsAt(&kps, p);
  142|       |  
  143|  1.11k|        for (typename tmdata::KeyPointSeq::const_iterator kp = kps.begin(); kp != kps.end(); ++kp) {
  ------------------
  |  Branch (143:77): [True: 711, False: 408]
  ------------------
  144|    711|          try {
  145|    711|            MonoTypeUnifier pu = u;
  146|    711|            mgu(mty, u.substitute(kp->first), &pu);
  147|    711|            findBidiMatches(pu, kp->second, mts, i + 1, out);
  148|    711|          } catch (std::exception& ex) {
  149|    261|          }
  150|    711|        }
  151|    408|      }
  152|    626|    }
_ZNK6hobbes8type_mapISt10shared_ptrINS_10TCInstanceEEE7matchesERKS1_INS_4TEnvEERKSt6vectorIS1_INS_8MonoTypeEESaISB_EEPS9_IS3_SaIS3_EE:
   54|  2.58k|    void matches(const TEnvPtr& tenv, const MonoTypes& mts, std::vector<V>* out) const {
   55|  2.58k|      MonoTypeUnifier u(tenv);
   56|  2.58k|      findMatches(u, this->d.rootPoint(), mts, 0, out);
   57|  2.58k|    }
_ZNK6hobbes8type_mapISt10shared_ptrINS_10TCInstanceEEE11findMatchesERNS_15MonoTypeUnifierEPvRKSt6vectorIS1_INS_8MonoTypeEESaISA_EEmPS8_IS3_SaIS3_EE:
  102|  7.89k|    void findMatches(MonoTypeUnifier& u, typename tmdata::point_t p, const MonoTypes& mts, size_t i, std::vector<V>* out) const {
  103|  7.89k|      if (p == nullptr) return;
  ------------------
  |  Branch (103:11): [True: 322, False: 7.57k]
  ------------------
  104|       |
  105|  7.57k|      if (i == mts.size()) {
  ------------------
  |  Branch (105:11): [True: 2.26k, False: 5.31k]
  ------------------
  106|  2.26k|        if (const V* v = this->d.valueAt(p)) {
  ------------------
  |  Branch (106:22): [True: 2.26k, False: 0]
  ------------------
  107|  2.26k|          out->push_back(*v);
  108|  2.26k|        }
  109|  5.31k|      } else {
  110|  5.31k|        const MonoTypePtr& mty = u.substitute(mts[i]);
  111|       |
  112|  5.31k|        if (!hasFreeVariables(mty)) {
  ------------------
  |  Branch (112:13): [True: 5.07k, False: 242]
  ------------------
  113|  5.07k|          findMatches(u, this->d.moveTo(mty, p), mts, i + 1, out);
  114|  5.07k|        } else {
  115|    242|          typename tmdata::KeyPointSeq kps;
  116|    242|          this->d.keyPointsAt(&kps, p);
  117|       |  
  118|    484|          for (typename tmdata::KeyPointSeq::const_iterator kp = kps.begin(); kp != kps.end(); ++kp) {
  ------------------
  |  Branch (118:79): [True: 242, False: 242]
  ------------------
  119|    242|            try {
  120|    242|              MonoTypeUnifier pu = u;
  121|    242|              mgu(mty, kp->first, &pu);
  122|    242|              findMatches(pu, kp->second, mts, i + 1, out);
  123|    242|            } catch (std::exception& ex) {
  124|      0|            }
  125|    242|          }
  126|    242|        }
  127|  5.31k|      }
  128|  7.57k|    }
_ZNK6hobbes8type_mapIbE6lookupERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS5_EE:
   35|  8.94k|    V* lookup(const MonoTypes& mts) const {
   36|  8.94k|      return this->d.lookup(mts.begin(), mts.end());
   37|  8.94k|    }
_ZNK6hobbes8type_mapISt10shared_ptrINS_10TCInstanceEEE6valuesEv:
   43|  7.74k|    std::vector<V> values() const {
   44|  7.74k|      return this->d.values();
   45|  7.74k|    }
_ZNK6hobbes8type_mapISt10shared_ptrINS_10TCInstanceEEE8hasMatchERKS1_INS_4TEnvEERKSt6vectorIS1_INS_8MonoTypeEESaISB_EE:
   48|  2.11k|    bool hasMatch(const TEnvPtr& tenv, const MonoTypes& mts) const {
   49|  2.11k|      MonoTypeUnifier u(tenv);
   50|  2.11k|      return hasMatch(u, this->d.rootPoint(), mts, 0);
   51|  2.11k|    }
_ZNK6hobbes8type_mapISt10shared_ptrINS_10TCInstanceEEE8hasMatchERNS_15MonoTypeUnifierEPvRKSt6vectorIS1_INS_8MonoTypeEESaISA_EEm:
   73|  4.71k|    bool hasMatch(MonoTypeUnifier& u, typename tmdata::point_t p, const MonoTypes& mts, size_t i) const {
   74|  4.71k|      if (p == nullptr) {
  ------------------
  |  Branch (74:11): [True: 697, False: 4.01k]
  ------------------
   75|    697|        return false;
   76|    697|      }
   77|       |
   78|  4.01k|      if (i == mts.size()) {
  ------------------
  |  Branch (78:11): [True: 863, False: 3.15k]
  ------------------
   79|    863|        return true;
   80|  3.15k|      } else {
   81|  3.15k|        const MonoTypePtr& mty = u.substitute(mts[i]);
   82|       |
   83|  3.15k|        if (!hasFreeVariables(mty)) {
  ------------------
  |  Branch (83:13): [True: 2.01k, False: 1.13k]
  ------------------
   84|  2.01k|          return hasMatch(u, this->d.moveTo(mty, p), mts, i + 1);
   85|  2.01k|        } else {
   86|  1.13k|          typename tmdata::KeyPointSeq kps;
   87|  1.13k|          this->d.keyPointsAt(&kps, p);
   88|       | 
   89|  1.48k|          for (typename tmdata::KeyPointSeq::const_iterator kp = kps.begin(); kp != kps.end(); ++kp) {
  ------------------
  |  Branch (89:79): [True: 830, False: 656]
  ------------------
   90|    830|            try {
   91|    830|              MonoTypeUnifier pu = u;
   92|    830|              mgu(mty, kp->first, &pu);
   93|    830|              if (hasMatch(pu, kp->second, mts, i + 1)) return true;
  ------------------
  |  Branch (93:19): [True: 482, False: 348]
  ------------------
   94|    830|            } catch (std::exception& ex) {
   95|    242|            }
   96|    830|          }
   97|  1.13k|        }
   98|  3.15k|      }
   99|    656|      return false;
  100|  4.01k|    }
_ZNK6hobbes8type_mapISt10shared_ptrINS_10ConstraintEEE6lookupERKSt6vectorIS1_INS_8MonoTypeEESaIS7_EE:
   35|  61.5k|    V* lookup(const MonoTypes& mts) const {
   36|  61.5k|      return this->d.lookup(mts.begin(), mts.end());
   37|  61.5k|    }
_ZNK6hobbes8type_mapISt10shared_ptrINS_10ConstraintEEE4findERKSt6vectorINS_7variantIJNS_4unitES1_INS_8MonoTypeEEEEESaISA_EEPS5_IS3_SaIS3_EE:
   66|  22.4k|    void find(const MaybePathPoints& path, std::vector<V>* out) const {
   67|  22.4k|      findMatches(this->d.rootPoint(), path, 0, out);
   68|  22.4k|    }
_ZNK6hobbes8type_mapISt10shared_ptrINS_10ConstraintEEE11findMatchesEPvRKSt6vectorINS_7variantIJNS_4unitES1_INS_8MonoTypeEEEEESaISB_EEmPS6_IS3_SaIS3_EE:
  154|  62.4k|    void findMatches(typename tmdata::point_t p, const MaybePathPoints& path, size_t i, std::vector<V>* out) const {
  155|  62.4k|      if (p == nullptr) return;
  ------------------
  |  Branch (155:11): [True: 22.2k, False: 40.1k]
  ------------------
  156|       |
  157|  40.1k|      if (i == path.size()) {
  ------------------
  |  Branch (157:11): [True: 762, False: 39.3k]
  ------------------
  158|    762|        if (const V* v = this->d.valueAt(p)) {
  ------------------
  |  Branch (158:22): [True: 762, False: 0]
  ------------------
  159|    762|          out->push_back(*v);
  160|    762|        }
  161|  39.3k|      } else {
  162|       |        // do we need an exact match or any point here?
  163|  39.3k|        if (const auto* mt = get<MonoTypePtr>(path[i])) {
  ------------------
  |  Branch (163:25): [True: 32.5k, False: 6.81k]
  ------------------
  164|  32.5k|          findMatches(this->d.moveTo(*mt, p), path, i + 1, out);
  165|  32.5k|        } else {
  166|  6.81k|          typename tmdata::KeyPointSeq kps;
  167|  6.81k|          this->d.keyPointsAt(&kps, p);
  168|       |
  169|  7.36k|          for (const auto& kp : kps) {
  ------------------
  |  Branch (169:31): [True: 7.36k, False: 6.81k]
  ------------------
  170|  7.36k|            findMatches(kp.second, path, i + 1, out);
  171|  7.36k|          }
  172|  6.81k|        }
  173|  39.3k|      }
  174|  40.1k|    }
_ZN6hobbes8type_mapISt10shared_ptrINS_10ConstraintEEE6insertERKSt6vectorIS1_INS_8MonoTypeEESaIS7_EERKS3_:
   31|  29.4k|    void insert(const MonoTypes& mts, const V& v) {
   32|  29.4k|      this->d.insert(mts.begin(), mts.end(), v);
   33|  29.4k|    }
_ZNK6hobbes8type_mapISt10shared_ptrINS_10ConstraintEEE6valuesEv:
   43|  19.3k|    std::vector<V> values() const {
   44|  19.3k|      return this->d.values();
   45|  19.3k|    }

_ZN6hobbes11UnqualifierD2Ev:
   22|    374|    virtual ~Unqualifier() = default;;

_ZN6hobbes15checkVariantTagEjm:
  548|   959k|inline void checkVariantTag(uint32_t id, size_t ctors) {
  549|   959k|  if (id >= ctors) {
  ------------------
  |  Branch (549:7): [True: 0, False: 959k]
  ------------------
  550|      0|    raiseBadVariantTag(id, ctors);
  551|      0|  }
  552|   959k|}
_ZN6hobbes9timespanT4nameEv:
 1068|      3|    static const char* name() { return #N; } \
_ZN6hobbes5timeT4nameEv:
 1068|      3|    static const char* name() { return #N; } \
_ZN6hobbes9datetimeT4nameEv:
 1068|     11|    static const char* name() { return #N; } \
_ZN6hobbes10variantAppIvNS_18variantPayloadDtorEvNS_5tupleIJNS_4unitESt10shared_ptrINS_10TCInstanceEEEEEJEE5applyEjPv:
  564|  1.94k|    static void apply(uint32_t id, void* payload, Args... args) {
  565|  1.94k|      checkVariantTag(id, sizeof...(Ctors));
  566|  1.94k|      fns()[id](payload, args...);
  567|  1.94k|    }
_ZN6hobbes10variantAppIvNS_18variantPayloadDtorEvNS_5tupleIJNS_4unitESt10shared_ptrINS_10TCInstanceEEEEEJEE3fnsEv:
  557|  1.94k|    static PF* fns() {
  558|  1.94k|      static PF fvec[sizeof...(Ctors)];
  559|  1.94k|      static bool init = variantAppInit<0, void, F, U, tuple<Args...>, Ctors...>::init(fvec);
  560|  1.94k|      return fvec;
  561|      0|      if (init) return fvec; // <-- pointless, but prevents an unused variable error
  ------------------
  |  Branch (561:11): [True: 0, False: 0]
  ------------------
  562|      0|    }
_ZN6hobbes14variantAppInitILm0EvNS_18variantPayloadDtorEvNS_5tupleIJEEEJNS_4unitESt10shared_ptrINS_10TCInstanceEEEE4initEPPFvPvE:
  527|      1|    static bool init(PF* pfs) {
  528|      1|      pfs[i] = &thunk;
  529|      1|      return variantAppInit<i+1, R, F, U, tuple<Args...>, Ctors...>::init(pfs);
  530|      1|    }
_ZN6hobbes14variantAppInitILm0EvNS_18variantPayloadDtorEvNS_5tupleIJEEEJNS_4unitESt10shared_ptrINS_10TCInstanceEEEE5thunkEPv:
  523|  1.08k|    static R thunk(void* p, Args... args) {
  524|  1.08k|      return F<i, Ctor, U>::fn(reinterpret_cast<Ctor*>(p), args...);
  525|  1.08k|    }
_ZN6hobbes18variantPayloadDtorILm0ENS_4unitEvE2fnEPS1_:
  595|   326k|    static void fn(T* p) {
  596|   326k|      p->~T();
  597|   326k|    }
_ZN6hobbes14variantAppInitILm1EvNS_18variantPayloadDtorEvNS_5tupleIJEEEJSt10shared_ptrINS_10TCInstanceEEEE4initEPPFvPvE:
  527|      1|    static bool init(PF* pfs) {
  528|      1|      pfs[i] = &thunk;
  529|      1|      return variantAppInit<i+1, R, F, U, tuple<Args...>, Ctors...>::init(pfs);
  530|      1|    }
_ZN6hobbes14variantAppInitILm1EvNS_18variantPayloadDtorEvNS_5tupleIJEEEJSt10shared_ptrINS_10TCInstanceEEEE5thunkEPv:
  523|    866|    static R thunk(void* p, Args... args) {
  524|    866|      return F<i, Ctor, U>::fn(reinterpret_cast<Ctor*>(p), args...);
  525|    866|    }
_ZN6hobbes18variantPayloadDtorILm1ESt10shared_ptrINS_10TCInstanceEEvE2fnEPS3_:
  595|    866|    static void fn(T* p) {
  596|    866|      p->~T();
  597|    866|    }
_ZN6hobbes14variantAppInitILm2EvNS_18variantPayloadDtorEvNS_5tupleIJEEEJEE4initEPPFvPvE:
  504|      5|    static bool init(PF*) { return true; }
_ZN6hobbes10variantAppIvNS_18variantPayloadDtorEvNS_5tupleIJNS_4unitESt6vectorISt10shared_ptrINS_12TCInstanceFnEESaIS7_EEEEEJEE5applyEjPv:
  564|  2.87k|    static void apply(uint32_t id, void* payload, Args... args) {
  565|  2.87k|      checkVariantTag(id, sizeof...(Ctors));
  566|  2.87k|      fns()[id](payload, args...);
  567|  2.87k|    }
_ZN6hobbes10variantAppIvNS_18variantPayloadDtorEvNS_5tupleIJNS_4unitESt6vectorISt10shared_ptrINS_12TCInstanceFnEESaIS7_EEEEEJEE3fnsEv:
  557|  2.87k|    static PF* fns() {
  558|  2.87k|      static PF fvec[sizeof...(Ctors)];
  559|  2.87k|      static bool init = variantAppInit<0, void, F, U, tuple<Args...>, Ctors...>::init(fvec);
  560|  2.87k|      return fvec;
  561|      0|      if (init) return fvec; // <-- pointless, but prevents an unused variable error
  ------------------
  |  Branch (561:11): [True: 0, False: 0]
  ------------------
  562|      0|    }
_ZN6hobbes14variantAppInitILm0EvNS_18variantPayloadDtorEvNS_5tupleIJEEEJNS_4unitESt6vectorISt10shared_ptrINS_12TCInstanceFnEESaIS8_EEEE4initEPPFvPvE:
  527|      1|    static bool init(PF* pfs) {
  528|      1|      pfs[i] = &thunk;
  529|      1|      return variantAppInit<i+1, R, F, U, tuple<Args...>, Ctors...>::init(pfs);
  530|      1|    }
_ZN6hobbes14variantAppInitILm0EvNS_18variantPayloadDtorEvNS_5tupleIJEEEJNS_4unitESt6vectorISt10shared_ptrINS_12TCInstanceFnEESaIS8_EEEE5thunkEPv:
  523|  1.73k|    static R thunk(void* p, Args... args) {
  524|  1.73k|      return F<i, Ctor, U>::fn(reinterpret_cast<Ctor*>(p), args...);
  525|  1.73k|    }
_ZN6hobbes14variantAppInitILm1EvNS_18variantPayloadDtorEvNS_5tupleIJEEEJSt6vectorISt10shared_ptrINS_12TCInstanceFnEESaIS7_EEEE4initEPPFvPvE:
  527|      1|    static bool init(PF* pfs) {
  528|      1|      pfs[i] = &thunk;
  529|      1|      return variantAppInit<i+1, R, F, U, tuple<Args...>, Ctors...>::init(pfs);
  530|      1|    }
_ZN6hobbes14variantAppInitILm1EvNS_18variantPayloadDtorEvNS_5tupleIJEEEJSt6vectorISt10shared_ptrINS_12TCInstanceFnEESaIS7_EEEE5thunkEPv:
  523|  1.14k|    static R thunk(void* p, Args... args) {
  524|  1.14k|      return F<i, Ctor, U>::fn(reinterpret_cast<Ctor*>(p), args...);
  525|  1.14k|    }
_ZN6hobbes18variantPayloadDtorILm1ESt6vectorISt10shared_ptrINS_12TCInstanceFnEESaIS4_EEvE2fnEPS6_:
  595|  1.14k|    static void fn(T* p) {
  596|  1.14k|      p->~T();
  597|  1.14k|    }
_ZN6hobbes10variantAppIvNS_18variantPayloadDtorEvNS_5tupleIJNS_4unitEbEEEJEE5applyEjPv:
  564|  14.7k|    static void apply(uint32_t id, void* payload, Args... args) {
  565|  14.7k|      checkVariantTag(id, sizeof...(Ctors));
  566|  14.7k|      fns()[id](payload, args...);
  567|  14.7k|    }
_ZN6hobbes10variantAppIvNS_18variantPayloadDtorEvNS_5tupleIJNS_4unitEbEEEJEE3fnsEv:
  557|  14.7k|    static PF* fns() {
  558|  14.7k|      static PF fvec[sizeof...(Ctors)];
  559|  14.7k|      static bool init = variantAppInit<0, void, F, U, tuple<Args...>, Ctors...>::init(fvec);
  560|  14.7k|      return fvec;
  561|      0|      if (init) return fvec; // <-- pointless, but prevents an unused variable error
  ------------------
  |  Branch (561:11): [True: 0, False: 0]
  ------------------
  562|      0|    }
_ZN6hobbes14variantAppInitILm0EvNS_18variantPayloadDtorEvNS_5tupleIJEEEJNS_4unitEbEE4initEPPFvPvE:
  527|      1|    static bool init(PF* pfs) {
  528|      1|      pfs[i] = &thunk;
  529|      1|      return variantAppInit<i+1, R, F, U, tuple<Args...>, Ctors...>::init(pfs);
  530|      1|    }
_ZN6hobbes14variantAppInitILm0EvNS_18variantPayloadDtorEvNS_5tupleIJEEEJNS_4unitEbEE5thunkEPv:
  523|  9.02k|    static R thunk(void* p, Args... args) {
  524|  9.02k|      return F<i, Ctor, U>::fn(reinterpret_cast<Ctor*>(p), args...);
  525|  9.02k|    }
_ZN6hobbes14variantAppInitILm1EvNS_18variantPayloadDtorEvNS_5tupleIJEEEJbEE4initEPPFvPvE:
  527|      1|    static bool init(PF* pfs) {
  528|      1|      pfs[i] = &thunk;
  529|      1|      return variantAppInit<i+1, R, F, U, tuple<Args...>, Ctors...>::init(pfs);
  530|      1|    }
_ZN6hobbes14variantAppInitILm1EvNS_18variantPayloadDtorEvNS_5tupleIJEEEJbEE5thunkEPv:
  523|  5.74k|    static R thunk(void* p, Args... args) {
  524|  5.74k|      return F<i, Ctor, U>::fn(reinterpret_cast<Ctor*>(p), args...);
  525|  5.74k|    }
_ZN6hobbes18variantPayloadDtorILm1EbvE2fnEPb:
  595|  5.74k|    static void fn(T* p) {
  596|  5.74k|      p->~T();
  597|  5.74k|    }
_ZN6hobbes11RegionState4metaINS_15inferFieldTypeFEEEvRT_:
  414|      1|      static void meta(V& v) { \
  415|      1|        PRIV_HPPF_MAP(PRIV_HPPF_STRUCT_FIELD_VISIT, FIELDS) \
  ------------------
  |  |  144|      1|#define PRIV_HPPF_MAP(f, VS...) PRIV_HPPF_EVAL(PRIV_HPPF_MAPP(f, VS))
  |  |  ------------------
  |  |  |  |  130|      1|#define PRIV_HPPF_EVAL(...) PRIV_HPPF_EVAL256(__VA_ARGS__)
  |  |  |  |  ------------------
  |  |  |  |  |  |  131|      1|#define PRIV_HPPF_EVAL256(...) PRIV_HPPF_EVAL128(PRIV_HPPF_EVAL128(__VA_ARGS__))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  132|      1|#define PRIV_HPPF_EVAL128(...) PRIV_HPPF_EVAL64(PRIV_HPPF_EVAL64(__VA_ARGS__))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  133|      1|#define PRIV_HPPF_EVAL64(...) PRIV_HPPF_EVAL32(PRIV_HPPF_EVAL32(__VA_ARGS__))
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  134|      1|#define PRIV_HPPF_EVAL32(...) PRIV_HPPF_EVAL16(PRIV_HPPF_EVAL16(__VA_ARGS__))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  135|      1|#define PRIV_HPPF_EVAL16(...) PRIV_HPPF_EVAL8(PRIV_HPPF_EVAL8(__VA_ARGS__))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  136|      1|#define PRIV_HPPF_EVAL8(...) PRIV_HPPF_EVAL4(PRIV_HPPF_EVAL4(__VA_ARGS__))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  137|      1|#define PRIV_HPPF_EVAL4(...) PRIV_HPPF_EVAL2(PRIV_HPPF_EVAL2(__VA_ARGS__))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  138|      1|#define PRIV_HPPF_EVAL2(...) PRIV_HPPF_EVAL1(PRIV_HPPF_EVAL1(__VA_ARGS__))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  139|      1|#define PRIV_HPPF_EVAL1(...) __VA_ARGS__
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  416|      1|      } \
_ZN6hobbes3CTM4metaINS_15inferFieldTypeFEEEvRT_:
  414|      2|      static void meta(V& v) { \
  415|      2|        PRIV_HPPF_MAP(PRIV_HPPF_STRUCT_FIELD_VISIT, FIELDS) \
  ------------------
  |  |  144|      2|#define PRIV_HPPF_MAP(f, VS...) PRIV_HPPF_EVAL(PRIV_HPPF_MAPP(f, VS))
  |  |  ------------------
  |  |  |  |  130|      2|#define PRIV_HPPF_EVAL(...) PRIV_HPPF_EVAL256(__VA_ARGS__)
  |  |  |  |  ------------------
  |  |  |  |  |  |  131|      2|#define PRIV_HPPF_EVAL256(...) PRIV_HPPF_EVAL128(PRIV_HPPF_EVAL128(__VA_ARGS__))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  132|      2|#define PRIV_HPPF_EVAL128(...) PRIV_HPPF_EVAL64(PRIV_HPPF_EVAL64(__VA_ARGS__))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  133|      2|#define PRIV_HPPF_EVAL64(...) PRIV_HPPF_EVAL32(PRIV_HPPF_EVAL32(__VA_ARGS__))
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  134|      2|#define PRIV_HPPF_EVAL32(...) PRIV_HPPF_EVAL16(PRIV_HPPF_EVAL16(__VA_ARGS__))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  135|      2|#define PRIV_HPPF_EVAL16(...) PRIV_HPPF_EVAL8(PRIV_HPPF_EVAL8(__VA_ARGS__))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  136|      2|#define PRIV_HPPF_EVAL8(...) PRIV_HPPF_EVAL4(PRIV_HPPF_EVAL4(__VA_ARGS__))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  137|      2|#define PRIV_HPPF_EVAL4(...) PRIV_HPPF_EVAL2(PRIV_HPPF_EVAL2(__VA_ARGS__))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  138|      2|#define PRIV_HPPF_EVAL2(...) PRIV_HPPF_EVAL1(PRIV_HPPF_EVAL1(__VA_ARGS__))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  139|      2|#define PRIV_HPPF_EVAL1(...) __VA_ARGS__
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  416|      2|      } \
_ZN6hobbes7variantIJNS_4unitESt10shared_ptrINS_10TCInstanceEEEEC2Ev:
  644|  1.08k|    variant() : tag(0) {
  645|  1.08k|      new (this->storage) typename First<Ctors...>::type();
  646|  1.08k|    }
_ZN6hobbes7variantIJNS_4unitESt6vectorISt10shared_ptrINS_12TCInstanceFnEESaIS5_EEEEC2Ev:
  644|  1.73k|    variant() : tag(0) {
  645|  1.73k|      new (this->storage) typename First<Ctors...>::type();
  646|  1.73k|    }
_ZN6hobbes7variantIJNS_4unitEbEEC2Ev:
  644|  9.02k|    variant() : tag(0) {
  645|  9.02k|      new (this->storage) typename First<Ctors...>::type();
  646|  9.02k|    }
_ZN6hobbes7variantIJNS_4unitEbEED2Ev:
  655|  11.8k|    ~variant() {
  656|  11.8k|      VDtor::apply(this->tag, this->storage);
  657|  11.8k|    }
_ZN6hobbes7variantIJNS_4unitESt6vectorISt10shared_ptrINS_12TCInstanceFnEESaIS5_EEEED2Ev:
  655|  2.30k|    ~variant() {
  656|  2.30k|      VDtor::apply(this->tag, this->storage);
  657|  2.30k|    }
_ZN6hobbes7variantIJNS_4unitESt10shared_ptrINS_10TCInstanceEEEED2Ev:
  655|  1.51k|    ~variant() {
  656|  1.51k|      VDtor::apply(this->tag, this->storage);
  657|  1.51k|    }
_ZN6hobbes7variantIJNS_4unitEbEEC2IbEERKT_:
  648|  2.87k|      variant(const T& t) : tag(CtorIndexOf<T, Ctors...>::value) {
  649|  2.87k|        static_assert(CtorIndexOf<T, Ctors...>::value < sizeof...(Ctors), "Constructor type isn't part of variant");
  650|  2.87k|        new (this->storage) T(t);
  651|  2.87k|      }
_ZN6hobbes7variantIJNS_4unitEbEEaSERKS2_:
  658|  2.87k|    variant<Ctors...>& operator=(const variant<Ctors...>& rhs) {
  659|  2.87k|      if (this != &rhs) {
  ------------------
  |  Branch (659:11): [True: 2.87k, False: 0]
  ------------------
  660|  2.87k|        VDtor::apply(this->tag, this->storage);
  661|  2.87k|        this->tag = rhs.tag;
  662|  2.87k|        VCCtor::apply(this->tag, this->storage, rhs.storage);
  663|  2.87k|      }
  664|  2.87k|      return *this;
  665|  2.87k|    }
_ZN6hobbes10variantAppIvNS_18variantPayloadCtorEvNS_5tupleIJNS_4unitEbEEEJPKvEE5applyEjPvS6_:
  564|  2.87k|    static void apply(uint32_t id, void* payload, Args... args) {
  565|  2.87k|      checkVariantTag(id, sizeof...(Ctors));
  566|  2.87k|      fns()[id](payload, args...);
  567|  2.87k|    }
_ZN6hobbes10variantAppIvNS_18variantPayloadCtorEvNS_5tupleIJNS_4unitEbEEEJPKvEE3fnsEv:
  557|  2.87k|    static PF* fns() {
  558|  2.87k|      static PF fvec[sizeof...(Ctors)];
  559|  2.87k|      static bool init = variantAppInit<0, void, F, U, tuple<Args...>, Ctors...>::init(fvec);
  560|  2.87k|      return fvec;
  561|      0|      if (init) return fvec; // <-- pointless, but prevents an unused variable error
  ------------------
  |  Branch (561:11): [True: 0, False: 0]
  ------------------
  562|      0|    }
_ZN6hobbes14variantAppInitILm0EvNS_18variantPayloadCtorEvNS_5tupleIJPKvEEEJNS_4unitEbEE4initEPPFvPvS4_E:
  527|      1|    static bool init(PF* pfs) {
  528|      1|      pfs[i] = &thunk;
  529|      1|      return variantAppInit<i+1, R, F, U, tuple<Args...>, Ctors...>::init(pfs);
  530|      1|    }
_ZN6hobbes18variantPayloadCtorILm0ENS_4unitEvE2fnEPS1_PKv:
  588|   128k|    static void fn(T* p, const void* rhsp) {
  589|   128k|      new (p) T(*reinterpret_cast<const T*>(rhsp));
  590|   128k|    }
_ZN6hobbes14variantAppInitILm1EvNS_18variantPayloadCtorEvNS_5tupleIJPKvEEEJbEE4initEPPFvPvS4_E:
  527|      1|    static bool init(PF* pfs) {
  528|      1|      pfs[i] = &thunk;
  529|      1|      return variantAppInit<i+1, R, F, U, tuple<Args...>, Ctors...>::init(pfs);
  530|      1|    }
_ZN6hobbes14variantAppInitILm1EvNS_18variantPayloadCtorEvNS_5tupleIJPKvEEEJbEE5thunkEPvS4_:
  523|  2.87k|    static R thunk(void* p, Args... args) {
  524|  2.87k|      return F<i, Ctor, U>::fn(reinterpret_cast<Ctor*>(p), args...);
  525|  2.87k|    }
_ZN6hobbes18variantPayloadCtorILm1EbvE2fnEPbPKv:
  588|  2.87k|    static void fn(T* p, const void* rhsp) {
  589|  2.87k|      new (p) T(*reinterpret_cast<const T*>(rhsp));
  590|  2.87k|    }
_ZN6hobbes14variantAppInitILm2EvNS_18variantPayloadCtorEvNS_5tupleIJPKvEEEJEE4initEPPFvPvS4_E:
  504|      5|    static bool init(PF*) { return true; }
_ZN6hobbes7variantIJNS_4unitESt10shared_ptrINS_10TCInstanceEEEEC2IS4_EERKT_:
  648|    433|      variant(const T& t) : tag(CtorIndexOf<T, Ctors...>::value) {
  649|    433|        static_assert(CtorIndexOf<T, Ctors...>::value < sizeof...(Ctors), "Constructor type isn't part of variant");
  650|    433|        new (this->storage) T(t);
  651|    433|      }
_ZN6hobbes7variantIJNS_4unitESt10shared_ptrINS_10TCInstanceEEEEaSERKS5_:
  658|    433|    variant<Ctors...>& operator=(const variant<Ctors...>& rhs) {
  659|    433|      if (this != &rhs) {
  ------------------
  |  Branch (659:11): [True: 433, False: 0]
  ------------------
  660|    433|        VDtor::apply(this->tag, this->storage);
  661|    433|        this->tag = rhs.tag;
  662|    433|        VCCtor::apply(this->tag, this->storage, rhs.storage);
  663|    433|      }
  664|    433|      return *this;
  665|    433|    }
_ZN6hobbes10variantAppIvNS_18variantPayloadCtorEvNS_5tupleIJNS_4unitESt10shared_ptrINS_10TCInstanceEEEEEJPKvEE5applyEjPvS9_:
  564|    433|    static void apply(uint32_t id, void* payload, Args... args) {
  565|    433|      checkVariantTag(id, sizeof...(Ctors));
  566|    433|      fns()[id](payload, args...);
  567|    433|    }
_ZN6hobbes10variantAppIvNS_18variantPayloadCtorEvNS_5tupleIJNS_4unitESt10shared_ptrINS_10TCInstanceEEEEEJPKvEE3fnsEv:
  557|    433|    static PF* fns() {
  558|    433|      static PF fvec[sizeof...(Ctors)];
  559|    433|      static bool init = variantAppInit<0, void, F, U, tuple<Args...>, Ctors...>::init(fvec);
  560|    433|      return fvec;
  561|      0|      if (init) return fvec; // <-- pointless, but prevents an unused variable error
  ------------------
  |  Branch (561:11): [True: 0, False: 0]
  ------------------
  562|      0|    }
_ZN6hobbes14variantAppInitILm0EvNS_18variantPayloadCtorEvNS_5tupleIJPKvEEEJNS_4unitESt10shared_ptrINS_10TCInstanceEEEE4initEPPFvPvS4_E:
  527|      1|    static bool init(PF* pfs) {
  528|      1|      pfs[i] = &thunk;
  529|      1|      return variantAppInit<i+1, R, F, U, tuple<Args...>, Ctors...>::init(pfs);
  530|      1|    }
_ZN6hobbes14variantAppInitILm1EvNS_18variantPayloadCtorEvNS_5tupleIJPKvEEEJSt10shared_ptrINS_10TCInstanceEEEE4initEPPFvPvS4_E:
  527|      1|    static bool init(PF* pfs) {
  528|      1|      pfs[i] = &thunk;
  529|      1|      return variantAppInit<i+1, R, F, U, tuple<Args...>, Ctors...>::init(pfs);
  530|      1|    }
_ZN6hobbes14variantAppInitILm1EvNS_18variantPayloadCtorEvNS_5tupleIJPKvEEEJSt10shared_ptrINS_10TCInstanceEEEE5thunkEPvS4_:
  523|    433|    static R thunk(void* p, Args... args) {
  524|    433|      return F<i, Ctor, U>::fn(reinterpret_cast<Ctor*>(p), args...);
  525|    433|    }
_ZN6hobbes18variantPayloadCtorILm1ESt10shared_ptrINS_10TCInstanceEEvE2fnEPS3_PKv:
  588|    433|    static void fn(T* p, const void* rhsp) {
  589|    433|      new (p) T(*reinterpret_cast<const T*>(rhsp));
  590|    433|    }
_ZN6hobbes3getISt6vectorISt10shared_ptrINS_12TCInstanceFnEESaIS4_EEJNS_4unitES6_EvEEPKT_RKNS_7variantIJDpT0_EEE:
  723|     65|  const T* get(const variant<Ctors...>& v) {
  724|     65|    return v.template get<T>();
  725|     65|  }
_ZNK6hobbes7variantIJNS_4unitESt6vectorISt10shared_ptrINS_12TCInstanceFnEESaIS5_EEEE3getIS7_vEEPKT_v:
  671|     65|      const T* get() const { return findByCtor<T>(); }
_ZNK6hobbes7variantIJNS_4unitESt6vectorISt10shared_ptrINS_12TCInstanceFnEESaIS5_EEEE10findByCtorIS7_vEEPT_v:
  705|    283|      T* findByCtor() const {
  706|    283|        if (this->tag == CtorIndexOf<T, Ctors...>::value) {
  ------------------
  |  Branch (706:13): [True: 283, False: 0]
  ------------------
  707|    283|          return const_cast<T*>(reinterpret_cast<const T*>(this->storage));
  708|    283|        } else {
  709|      0|          return nullptr;
  710|      0|        }
  711|    283|      }
_ZN6hobbes7variantIJNS_4unitESt6vectorISt10shared_ptrINS_12TCInstanceFnEESaIS5_EEEEC2IS7_EERKT_:
  648|    572|      variant(const T& t) : tag(CtorIndexOf<T, Ctors...>::value) {
  649|    572|        static_assert(CtorIndexOf<T, Ctors...>::value < sizeof...(Ctors), "Constructor type isn't part of variant");
  650|    572|        new (this->storage) T(t);
  651|    572|      }
_ZN6hobbes7variantIJNS_4unitESt6vectorISt10shared_ptrINS_12TCInstanceFnEESaIS5_EEEEaSERKS8_:
  658|    572|    variant<Ctors...>& operator=(const variant<Ctors...>& rhs) {
  659|    572|      if (this != &rhs) {
  ------------------
  |  Branch (659:11): [True: 572, False: 0]
  ------------------
  660|    572|        VDtor::apply(this->tag, this->storage);
  661|    572|        this->tag = rhs.tag;
  662|    572|        VCCtor::apply(this->tag, this->storage, rhs.storage);
  663|    572|      }
  664|    572|      return *this;
  665|    572|    }
_ZN6hobbes10variantAppIvNS_18variantPayloadCtorEvNS_5tupleIJNS_4unitESt6vectorISt10shared_ptrINS_12TCInstanceFnEESaIS7_EEEEEJPKvEE5applyEjPvSC_:
  564|    572|    static void apply(uint32_t id, void* payload, Args... args) {
  565|    572|      checkVariantTag(id, sizeof...(Ctors));
  566|    572|      fns()[id](payload, args...);
  567|    572|    }
_ZN6hobbes10variantAppIvNS_18variantPayloadCtorEvNS_5tupleIJNS_4unitESt6vectorISt10shared_ptrINS_12TCInstanceFnEESaIS7_EEEEEJPKvEE3fnsEv:
  557|    572|    static PF* fns() {
  558|    572|      static PF fvec[sizeof...(Ctors)];
  559|    572|      static bool init = variantAppInit<0, void, F, U, tuple<Args...>, Ctors...>::init(fvec);
  560|    572|      return fvec;
  561|      0|      if (init) return fvec; // <-- pointless, but prevents an unused variable error
  ------------------
  |  Branch (561:11): [True: 0, False: 0]
  ------------------
  562|      0|    }
_ZN6hobbes14variantAppInitILm0EvNS_18variantPayloadCtorEvNS_5tupleIJPKvEEEJNS_4unitESt6vectorISt10shared_ptrINS_12TCInstanceFnEESaISA_EEEE4initEPPFvPvS4_E:
  527|      1|    static bool init(PF* pfs) {
  528|      1|      pfs[i] = &thunk;
  529|      1|      return variantAppInit<i+1, R, F, U, tuple<Args...>, Ctors...>::init(pfs);
  530|      1|    }
_ZN6hobbes14variantAppInitILm1EvNS_18variantPayloadCtorEvNS_5tupleIJPKvEEEJSt6vectorISt10shared_ptrINS_12TCInstanceFnEESaIS9_EEEE4initEPPFvPvS4_E:
  527|      1|    static bool init(PF* pfs) {
  528|      1|      pfs[i] = &thunk;
  529|      1|      return variantAppInit<i+1, R, F, U, tuple<Args...>, Ctors...>::init(pfs);
  530|      1|    }
_ZN6hobbes14variantAppInitILm1EvNS_18variantPayloadCtorEvNS_5tupleIJPKvEEEJSt6vectorISt10shared_ptrINS_12TCInstanceFnEESaIS9_EEEE5thunkEPvS4_:
  523|    572|    static R thunk(void* p, Args... args) {
  524|    572|      return F<i, Ctor, U>::fn(reinterpret_cast<Ctor*>(p), args...);
  525|    572|    }
_ZN6hobbes18variantPayloadCtorILm1ESt6vectorISt10shared_ptrINS_12TCInstanceFnEESaIS4_EEvE2fnEPS6_PKv:
  588|    572|    static void fn(T* p, const void* rhsp) {
  589|    572|      new (p) T(*reinterpret_cast<const T*>(rhsp));
  590|    572|    }
_ZN6hobbes3getISt6vectorISt10shared_ptrINS_12TCInstanceFnEESaIS4_EEJNS_4unitES6_EvEEPT_RNS_7variantIJDpT0_EEE:
  719|    218|  T* get(variant<Ctors...>& v) {
  720|    218|    return v.template get<T>();
  721|    218|  }
_ZN6hobbes7variantIJNS_4unitESt6vectorISt10shared_ptrINS_12TCInstanceFnEESaIS5_EEEE3getIS7_vEEPT_v:
  669|    218|      T* get() { return findByCtor<T>(); }
_ZN6hobbes3getISt10shared_ptrINS_10TCInstanceEEJNS_4unitES3_EvEEPT_RNS_7variantIJDpT0_EEE:
  719|  2.26k|  T* get(variant<Ctors...>& v) {
  720|  2.26k|    return v.template get<T>();
  721|  2.26k|  }
_ZN6hobbes7variantIJNS_4unitESt10shared_ptrINS_10TCInstanceEEEE3getIS4_vEEPT_v:
  669|  2.26k|      T* get() { return findByCtor<T>(); }
_ZNK6hobbes7variantIJNS_4unitESt10shared_ptrINS_10TCInstanceEEEE10findByCtorIS4_vEEPT_v:
  705|  38.7k|      T* findByCtor() const {
  706|  38.7k|        if (this->tag == CtorIndexOf<T, Ctors...>::value) {
  ------------------
  |  Branch (706:13): [True: 18.0k, False: 20.7k]
  ------------------
  707|  18.0k|          return const_cast<T*>(reinterpret_cast<const T*>(this->storage));
  708|  20.7k|        } else {
  709|  20.7k|          return nullptr;
  710|  20.7k|        }
  711|  38.7k|      }
_ZN6hobbes3getIbJNS_4unitEbEvEEPKT_RKNS_7variantIJDpT0_EEE:
  723|  5.60k|  const T* get(const variant<Ctors...>& v) {
  724|  5.60k|    return v.template get<T>();
  725|  5.60k|  }
_ZNK6hobbes7variantIJNS_4unitEbEE3getIbvEEPKT_v:
  671|  5.60k|      const T* get() const { return findByCtor<T>(); }
_ZNK6hobbes7variantIJNS_4unitEbEE10findByCtorIbvEEPT_v:
  705|  5.60k|      T* findByCtor() const {
  706|  5.60k|        if (this->tag == CtorIndexOf<T, Ctors...>::value) {
  ------------------
  |  Branch (706:13): [True: 5.60k, False: 0]
  ------------------
  707|  5.60k|          return const_cast<T*>(reinterpret_cast<const T*>(this->storage));
  708|  5.60k|        } else {
  709|      0|          return nullptr;
  710|      0|        }
  711|  5.60k|      }
_ZN6hobbes3getISt10shared_ptrINS_10TCInstanceEEJNS_4unitES3_EvEEPKT_RKNS_7variantIJDpT0_EEE:
  723|  36.5k|  const T* get(const variant<Ctors...>& v) {
  724|  36.5k|    return v.template get<T>();
  725|  36.5k|  }
_ZNK6hobbes7variantIJNS_4unitESt10shared_ptrINS_10TCInstanceEEEE3getIS4_vEEPKT_v:
  671|  36.5k|      const T* get() const { return findByCtor<T>(); }
_ZN6hobbes7variantIJNS_4unitESt10shared_ptrINS_10ConstraintEEEED2Ev:
  655|   144k|    ~variant() {
  656|   144k|      VDtor::apply(this->tag, this->storage);
  657|   144k|    }
_ZN6hobbes10variantAppIvNS_18variantPayloadDtorEvNS_5tupleIJNS_4unitESt10shared_ptrINS_10ConstraintEEEEEJEE5applyEjPv:
  564|   173k|    static void apply(uint32_t id, void* payload, Args... args) {
  565|   173k|      checkVariantTag(id, sizeof...(Ctors));
  566|   173k|      fns()[id](payload, args...);
  567|   173k|    }
_ZN6hobbes10variantAppIvNS_18variantPayloadDtorEvNS_5tupleIJNS_4unitESt10shared_ptrINS_10ConstraintEEEEEJEE3fnsEv:
  557|   173k|    static PF* fns() {
  558|   173k|      static PF fvec[sizeof...(Ctors)];
  559|   173k|      static bool init = variantAppInit<0, void, F, U, tuple<Args...>, Ctors...>::init(fvec);
  560|   173k|      return fvec;
  561|      0|      if (init) return fvec; // <-- pointless, but prevents an unused variable error
  ------------------
  |  Branch (561:11): [True: 0, False: 0]
  ------------------
  562|      0|    }
_ZN6hobbes14variantAppInitILm0EvNS_18variantPayloadDtorEvNS_5tupleIJEEEJNS_4unitESt10shared_ptrINS_10ConstraintEEEE4initEPPFvPvE:
  527|      1|    static bool init(PF* pfs) {
  528|      1|      pfs[i] = &thunk;
  529|      1|      return variantAppInit<i+1, R, F, U, tuple<Args...>, Ctors...>::init(pfs);
  530|      1|    }
_ZN6hobbes14variantAppInitILm0EvNS_18variantPayloadDtorEvNS_5tupleIJEEEJNS_4unitESt10shared_ptrINS_10ConstraintEEEE5thunkEPv:
  523|   114k|    static R thunk(void* p, Args... args) {
  524|   114k|      return F<i, Ctor, U>::fn(reinterpret_cast<Ctor*>(p), args...);
  525|   114k|    }
_ZN6hobbes14variantAppInitILm1EvNS_18variantPayloadDtorEvNS_5tupleIJEEEJSt10shared_ptrINS_10ConstraintEEEE4initEPPFvPvE:
  527|      1|    static bool init(PF* pfs) {
  528|      1|      pfs[i] = &thunk;
  529|      1|      return variantAppInit<i+1, R, F, U, tuple<Args...>, Ctors...>::init(pfs);
  530|      1|    }
_ZN6hobbes14variantAppInitILm1EvNS_18variantPayloadDtorEvNS_5tupleIJEEEJSt10shared_ptrINS_10ConstraintEEEE5thunkEPv:
  523|  58.8k|    static R thunk(void* p, Args... args) {
  524|  58.8k|      return F<i, Ctor, U>::fn(reinterpret_cast<Ctor*>(p), args...);
  525|  58.8k|    }
_ZN6hobbes18variantPayloadDtorILm1ESt10shared_ptrINS_10ConstraintEEvE2fnEPS3_:
  595|  58.8k|    static void fn(T* p) {
  596|  58.8k|      p->~T();
  597|  58.8k|    }
_ZN6hobbes7variantIJNS_4unitESt10shared_ptrINS_10ConstraintEEEEC2Ev:
  644|   114k|    variant() : tag(0) {
  645|   114k|      new (this->storage) typename First<Ctors...>::type();
  646|   114k|    }
_ZN6hobbes7variantIJNS_4unitESt10shared_ptrINS_8MonoTypeEEEEC2ERKS5_:
  652|   298k|    variant(const variant<Ctors...>& rhs) : tag(rhs.tag) {
  653|   298k|      VCCtor::apply(this->tag, this->storage, rhs.storage);
  654|   298k|    }
_ZN6hobbes10variantAppIvNS_18variantPayloadCtorEvNS_5tupleIJNS_4unitESt10shared_ptrINS_8MonoTypeEEEEEJPKvEE5applyEjPvS9_:
  564|   298k|    static void apply(uint32_t id, void* payload, Args... args) {
  565|   298k|      checkVariantTag(id, sizeof...(Ctors));
  566|   298k|      fns()[id](payload, args...);
  567|   298k|    }
_ZN6hobbes10variantAppIvNS_18variantPayloadCtorEvNS_5tupleIJNS_4unitESt10shared_ptrINS_8MonoTypeEEEEEJPKvEE3fnsEv:
  557|   298k|    static PF* fns() {
  558|   298k|      static PF fvec[sizeof...(Ctors)];
  559|   298k|      static bool init = variantAppInit<0, void, F, U, tuple<Args...>, Ctors...>::init(fvec);
  560|   298k|      return fvec;
  561|      0|      if (init) return fvec; // <-- pointless, but prevents an unused variable error
  ------------------
  |  Branch (561:11): [True: 0, False: 0]
  ------------------
  562|      0|    }
_ZN6hobbes14variantAppInitILm0EvNS_18variantPayloadCtorEvNS_5tupleIJPKvEEEJNS_4unitESt10shared_ptrINS_8MonoTypeEEEE4initEPPFvPvS4_E:
  527|      1|    static bool init(PF* pfs) {
  528|      1|      pfs[i] = &thunk;
  529|      1|      return variantAppInit<i+1, R, F, U, tuple<Args...>, Ctors...>::init(pfs);
  530|      1|    }
_ZN6hobbes14variantAppInitILm0EvNS_18variantPayloadCtorEvNS_5tupleIJPKvEEEJNS_4unitESt10shared_ptrINS_8MonoTypeEEEE5thunkEPvS4_:
  523|   128k|    static R thunk(void* p, Args... args) {
  524|   128k|      return F<i, Ctor, U>::fn(reinterpret_cast<Ctor*>(p), args...);
  525|   128k|    }
_ZN6hobbes14variantAppInitILm1EvNS_18variantPayloadCtorEvNS_5tupleIJPKvEEEJSt10shared_ptrINS_8MonoTypeEEEE4initEPPFvPvS4_E:
  527|      1|    static bool init(PF* pfs) {
  528|      1|      pfs[i] = &thunk;
  529|      1|      return variantAppInit<i+1, R, F, U, tuple<Args...>, Ctors...>::init(pfs);
  530|      1|    }
_ZN6hobbes14variantAppInitILm1EvNS_18variantPayloadCtorEvNS_5tupleIJPKvEEEJSt10shared_ptrINS_8MonoTypeEEEE5thunkEPvS4_:
  523|   170k|    static R thunk(void* p, Args... args) {
  524|   170k|      return F<i, Ctor, U>::fn(reinterpret_cast<Ctor*>(p), args...);
  525|   170k|    }
_ZN6hobbes18variantPayloadCtorILm1ESt10shared_ptrINS_8MonoTypeEEvE2fnEPS3_PKv:
  588|   170k|    static void fn(T* p, const void* rhsp) {
  589|   170k|      new (p) T(*reinterpret_cast<const T*>(rhsp));
  590|   170k|    }
_ZN6hobbes7variantIJNS_4unitESt10shared_ptrINS_8MonoTypeEEEEC2IS4_EERKT_:
  648|  63.8k|      variant(const T& t) : tag(CtorIndexOf<T, Ctors...>::value) {
  649|  63.8k|        static_assert(CtorIndexOf<T, Ctors...>::value < sizeof...(Ctors), "Constructor type isn't part of variant");
  650|  63.8k|        new (this->storage) T(t);
  651|  63.8k|      }
_ZN6hobbes7variantIJNS_4unitESt10shared_ptrINS_8MonoTypeEEEED2Ev:
  655|   433k|    ~variant() {
  656|   433k|      VDtor::apply(this->tag, this->storage);
  657|   433k|    }
_ZN6hobbes10variantAppIvNS_18variantPayloadDtorEvNS_5tupleIJNS_4unitESt10shared_ptrINS_8MonoTypeEEEEEJEE5applyEjPv:
  564|   433k|    static void apply(uint32_t id, void* payload, Args... args) {
  565|   433k|      checkVariantTag(id, sizeof...(Ctors));
  566|   433k|      fns()[id](payload, args...);
  567|   433k|    }
_ZN6hobbes10variantAppIvNS_18variantPayloadDtorEvNS_5tupleIJNS_4unitESt10shared_ptrINS_8MonoTypeEEEEEJEE3fnsEv:
  557|   433k|    static PF* fns() {
  558|   433k|      static PF fvec[sizeof...(Ctors)];
  559|   433k|      static bool init = variantAppInit<0, void, F, U, tuple<Args...>, Ctors...>::init(fvec);
  560|   433k|      return fvec;
  561|      0|      if (init) return fvec; // <-- pointless, but prevents an unused variable error
  ------------------
  |  Branch (561:11): [True: 0, False: 0]
  ------------------
  562|      0|    }
_ZN6hobbes14variantAppInitILm0EvNS_18variantPayloadDtorEvNS_5tupleIJEEEJNS_4unitESt10shared_ptrINS_8MonoTypeEEEE4initEPPFvPvE:
  527|      1|    static bool init(PF* pfs) {
  528|      1|      pfs[i] = &thunk;
  529|      1|      return variantAppInit<i+1, R, F, U, tuple<Args...>, Ctors...>::init(pfs);
  530|      1|    }
_ZN6hobbes14variantAppInitILm0EvNS_18variantPayloadDtorEvNS_5tupleIJEEEJNS_4unitESt10shared_ptrINS_8MonoTypeEEEE5thunkEPv:
  523|   199k|    static R thunk(void* p, Args... args) {
  524|   199k|      return F<i, Ctor, U>::fn(reinterpret_cast<Ctor*>(p), args...);
  525|   199k|    }
_ZN6hobbes14variantAppInitILm1EvNS_18variantPayloadDtorEvNS_5tupleIJEEEJSt10shared_ptrINS_8MonoTypeEEEE4initEPPFvPvE:
  527|      1|    static bool init(PF* pfs) {
  528|      1|      pfs[i] = &thunk;
  529|      1|      return variantAppInit<i+1, R, F, U, tuple<Args...>, Ctors...>::init(pfs);
  530|      1|    }
_ZN6hobbes14variantAppInitILm1EvNS_18variantPayloadDtorEvNS_5tupleIJEEEJSt10shared_ptrINS_8MonoTypeEEEE5thunkEPv:
  523|   234k|    static R thunk(void* p, Args... args) {
  524|   234k|      return F<i, Ctor, U>::fn(reinterpret_cast<Ctor*>(p), args...);
  525|   234k|    }
_ZN6hobbes18variantPayloadDtorILm1ESt10shared_ptrINS_8MonoTypeEEvE2fnEPS3_:
  595|   234k|    static void fn(T* p) {
  596|   234k|      p->~T();
  597|   234k|    }
_ZN6hobbes7variantIJNS_4unitESt10shared_ptrINS_8MonoTypeEEEEC2Ev:
  644|  71.0k|    variant() : tag(0) {
  645|  71.0k|      new (this->storage) typename First<Ctors...>::type();
  646|  71.0k|    }
_ZN6hobbes3getISt10shared_ptrINS_10ConstraintEEJNS_4unitES3_EvEEPKT_RKNS_7variantIJDpT0_EEE:
  723|   117k|  const T* get(const variant<Ctors...>& v) {
  724|   117k|    return v.template get<T>();
  725|   117k|  }
_ZNK6hobbes7variantIJNS_4unitESt10shared_ptrINS_10ConstraintEEEE3getIS4_vEEPKT_v:
  671|   117k|      const T* get() const { return findByCtor<T>(); }
_ZNK6hobbes7variantIJNS_4unitESt10shared_ptrINS_10ConstraintEEEE10findByCtorIS4_vEEPT_v:
  705|   118k|      T* findByCtor() const {
  706|   118k|        if (this->tag == CtorIndexOf<T, Ctors...>::value) {
  ------------------
  |  Branch (706:13): [True: 32.5k, False: 85.5k]
  ------------------
  707|  32.5k|          return const_cast<T*>(reinterpret_cast<const T*>(this->storage));
  708|  85.5k|        } else {
  709|  85.5k|          return nullptr;
  710|  85.5k|        }
  711|   118k|      }
_ZN6hobbes3getISt10shared_ptrINS_10ConstraintEEJNS_4unitES3_EvEEPT_RNS_7variantIJDpT0_EEE:
  719|    762|  T* get(variant<Ctors...>& v) {
  720|    762|    return v.template get<T>();
  721|    762|  }
_ZN6hobbes7variantIJNS_4unitESt10shared_ptrINS_10ConstraintEEEE3getIS4_vEEPT_v:
  669|    762|      T* get() { return findByCtor<T>(); }
_ZN6hobbes3getISt10shared_ptrINS_8MonoTypeEEJNS_4unitES3_EvEEPKT_RKNS_7variantIJDpT0_EEE:
  723|  39.3k|  const T* get(const variant<Ctors...>& v) {
  724|  39.3k|    return v.template get<T>();
  725|  39.3k|  }
_ZNK6hobbes7variantIJNS_4unitESt10shared_ptrINS_8MonoTypeEEEE3getIS4_vEEPKT_v:
  671|  39.3k|      const T* get() const { return findByCtor<T>(); }
_ZNK6hobbes7variantIJNS_4unitESt10shared_ptrINS_8MonoTypeEEEE10findByCtorIS4_vEEPT_v:
  705|  39.3k|      T* findByCtor() const {
  706|  39.3k|        if (this->tag == CtorIndexOf<T, Ctors...>::value) {
  ------------------
  |  Branch (706:13): [True: 32.5k, False: 6.81k]
  ------------------
  707|  32.5k|          return const_cast<T*>(reinterpret_cast<const T*>(this->storage));
  708|  32.5k|        } else {
  709|  6.81k|          return nullptr;
  710|  6.81k|        }
  711|  39.3k|      }
_ZN6hobbes7variantIJNS_4unitESt10shared_ptrINS_10ConstraintEEEEC2IS4_EERKT_:
  648|  29.4k|      variant(const T& t) : tag(CtorIndexOf<T, Ctors...>::value) {
  649|  29.4k|        static_assert(CtorIndexOf<T, Ctors...>::value < sizeof...(Ctors), "Constructor type isn't part of variant");
  650|  29.4k|        new (this->storage) T(t);
  651|  29.4k|      }
_ZN6hobbes7variantIJNS_4unitESt10shared_ptrINS_10ConstraintEEEEaSERKS5_:
  658|  29.4k|    variant<Ctors...>& operator=(const variant<Ctors...>& rhs) {
  659|  29.4k|      if (this != &rhs) {
  ------------------
  |  Branch (659:11): [True: 29.4k, False: 0]
  ------------------
  660|  29.4k|        VDtor::apply(this->tag, this->storage);
  661|  29.4k|        this->tag = rhs.tag;
  662|  29.4k|        VCCtor::apply(this->tag, this->storage, rhs.storage);
  663|  29.4k|      }
  664|  29.4k|      return *this;
  665|  29.4k|    }
_ZN6hobbes10variantAppIvNS_18variantPayloadCtorEvNS_5tupleIJNS_4unitESt10shared_ptrINS_10ConstraintEEEEEJPKvEE5applyEjPvS9_:
  564|  29.4k|    static void apply(uint32_t id, void* payload, Args... args) {
  565|  29.4k|      checkVariantTag(id, sizeof...(Ctors));
  566|  29.4k|      fns()[id](payload, args...);
  567|  29.4k|    }
_ZN6hobbes10variantAppIvNS_18variantPayloadCtorEvNS_5tupleIJNS_4unitESt10shared_ptrINS_10ConstraintEEEEEJPKvEE3fnsEv:
  557|  29.4k|    static PF* fns() {
  558|  29.4k|      static PF fvec[sizeof...(Ctors)];
  559|  29.4k|      static bool init = variantAppInit<0, void, F, U, tuple<Args...>, Ctors...>::init(fvec);
  560|  29.4k|      return fvec;
  561|      0|      if (init) return fvec; // <-- pointless, but prevents an unused variable error
  ------------------
  |  Branch (561:11): [True: 0, False: 0]
  ------------------
  562|      0|    }
_ZN6hobbes14variantAppInitILm0EvNS_18variantPayloadCtorEvNS_5tupleIJPKvEEEJNS_4unitESt10shared_ptrINS_10ConstraintEEEE4initEPPFvPvS4_E:
  527|      1|    static bool init(PF* pfs) {
  528|      1|      pfs[i] = &thunk;
  529|      1|      return variantAppInit<i+1, R, F, U, tuple<Args...>, Ctors...>::init(pfs);
  530|      1|    }
_ZN6hobbes14variantAppInitILm1EvNS_18variantPayloadCtorEvNS_5tupleIJPKvEEEJSt10shared_ptrINS_10ConstraintEEEE4initEPPFvPvS4_E:
  527|      1|    static bool init(PF* pfs) {
  528|      1|      pfs[i] = &thunk;
  529|      1|      return variantAppInit<i+1, R, F, U, tuple<Args...>, Ctors...>::init(pfs);
  530|      1|    }
_ZN6hobbes14variantAppInitILm1EvNS_18variantPayloadCtorEvNS_5tupleIJPKvEEEJSt10shared_ptrINS_10ConstraintEEEE5thunkEPvS4_:
  523|  29.4k|    static R thunk(void* p, Args... args) {
  524|  29.4k|      return F<i, Ctor, U>::fn(reinterpret_cast<Ctor*>(p), args...);
  525|  29.4k|    }
_ZN6hobbes18variantPayloadCtorILm1ESt10shared_ptrINS_10ConstraintEEvE2fnEPS3_PKv:
  588|  29.4k|    static void fn(T* p, const void* rhsp) {
  589|  29.4k|      new (p) T(*reinterpret_cast<const T*>(rhsp));
  590|  29.4k|    }

_ZN6hobbes7storage11TransactionC2EPKhm:
 2226|      1|  Transaction(const uint8_t* d, size_t len) : fd(-1), file_size(len), map_size(len), data(const_cast<uint8_t*>(d)), data_size(nullptr), wi(0), ri(0) {
 2227|      1|    this->data_size = &this->map_size;
 2228|      1|  }
_ZNK6hobbes7storage11Transaction7canReadEm:
 2230|   123k|  bool canRead(size_t x) const {
 2231|       |    // ri+x (rather than x <= data_size-ri) would overflow and wrap back
 2232|       |    // below data_size when x is huge -- notably when a caller has cast a
 2233|       |    // negative, untrusted count to size_t (STRFR-433920). ri is always
 2234|       |    // <= *data_size here: it only advances via skip(), which callers may
 2235|       |    // only invoke after a canRead() that already bounded the advance.
 2236|   123k|    return x <= (*this->data_size - this->ri);
 2237|   123k|  }
_ZN6hobbes7storage11Transaction4readIjEET_v:
 2257|  33.4k|    T read() {
 2258|  33.4k|      static_assert(std::is_trivially_copyable<T>::value,
 2259|  33.4k|                    "Transaction::read copies raw bytes out of the stream");
 2260|  33.4k|      T v;
 2261|  33.4k|      memcpy(&v, ptr(), sizeof(T));
 2262|  33.4k|      skip(sizeof(T));
 2263|  33.4k|      return v;
 2264|  33.4k|    }
_ZNK6hobbes7storage11Transaction3ptrEv:
 2239|  81.2k|  const uint8_t* ptr() const {
 2240|  81.2k|    return this->data + this->ri;
 2241|  81.2k|  }
_ZN6hobbes7storage11Transaction4skipEm:
 2243|  81.2k|  void skip(size_t d) {
 2244|  81.2k|    this->ri += d;
 2245|  81.2k|  }

_ZN6hobbes4listISt10shared_ptrINS_8MonoTypeEEJEEESt6vectorIT_SaIS5_EERKS5_DpRKT0_:
   31|    150|  std::vector<T> list(const T& x, const Ts& ... xs) {
   32|    150|    std::vector<T> r = {x,xs...};
   33|    150|    return r;
   34|    150|  }
_ZN6hobbes4listISt10shared_ptrINS_8MonoTypeEEJS3_EEESt6vectorIT_SaIS5_EERKS5_DpRKT0_:
   31|    493|  std::vector<T> list(const T& x, const Ts& ... xs) {
   32|    493|    std::vector<T> r = {x,xs...};
   33|    493|    return r;
   34|    493|  }
_ZN6hobbes4consISt10shared_ptrINS_8MonoTypeEEEESt6vectorIT_SaIS5_EES5_S7_:
  287|     46|  std::vector<T> cons(T h, std::vector<T> t) {
  288|     46|    t.insert(t.begin(), h);
  289|     46|    return t;
  290|     46|  }
_ZN6hobbes6appendISt10shared_ptrINS_10ConstraintEEEEvPSt6vectorIT_SaIS5_EERKS7_:
  293|      9|  void append(std::vector<T>* xs, const std::vector<T>& ys) {
  294|      9|    xs->insert(xs->end(), ys.begin(), ys.end());
  295|      9|  }
_ZN6hobbes4consISt10shared_ptrINS_4ExprEEEESt6vectorIT_SaIS5_EES5_S7_:
  287|      4|  std::vector<T> cons(T h, std::vector<T> t) {
  288|      4|    t.insert(t.begin(), h);
  289|      4|    return t;
  290|      4|  }
_ZN6hobbes4listISt10shared_ptrINS_4ExprEEJEEESt6vectorIT_SaIS5_EERKS5_DpRKT0_:
   31|  18.4k|  std::vector<T> list(const T& x, const Ts& ... xs) {
   32|  18.4k|    std::vector<T> r = {x,xs...};
   33|  18.4k|    return r;
   34|  18.4k|  }
_ZN6hobbes4listIPN4llvm4TypeEJS3_EEESt6vectorIT_SaIS5_EERKS5_DpRKT0_:
   31|    332|  std::vector<T> list(const T& x, const Ts& ... xs) {
   32|    332|    std::vector<T> r = {x,xs...};
   33|    332|    return r;
   34|    332|  }
_ZN6hobbes4listIPN4llvm8ConstantEJS3_EEESt6vectorIT_SaIS5_EERKS5_DpRKT0_:
   31|     38|  std::vector<T> list(const T& x, const Ts& ... xs) {
   32|     38|    std::vector<T> r = {x,xs...};
   33|     38|    return r;
   34|     38|  }
_ZN6hobbes5unzipINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPN4llvm5ValueEEESt4pairISt6vectorIT_SaISC_EESB_IT0_SaISF_EEERKSB_ISA_ISC_SF_ESaISJ_EE:
  239|     20|  std::pair< std::vector<L>, std::vector<R> > unzip(const std::vector< std::pair<L, R> >& ps) {
  240|     20|    return std::pair< std::vector<L>, std::vector<R> >(first(ps), second(ps));
  241|     20|  }
_ZN6hobbes5firstINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPN4llvm5ValueEEESt6vectorIT_SaISB_EERKSA_ISt4pairISB_T0_ESaISG_EE:
  209|     20|  std::vector<L> first(const std::vector< std::pair<L, R> >& xs) {
  210|     20|    std::vector<L> result;
  211|     20|    result.reserve(xs.size());
  212|     68|    for (auto x = xs.begin(); x != xs.end(); ++x) {
  ------------------
  |  Branch (212:31): [True: 48, False: 20]
  ------------------
  213|     48|      result.push_back(x->first);
  214|     48|    }
  215|     20|    return result;
  216|     20|  }
_ZN6hobbes6secondINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPN4llvm5ValueEEESt6vectorIT0_SaISB_EERKSA_ISt4pairIT_SB_ESaISG_EE:
  229|     20|  std::vector<R> second(const std::vector< std::pair<L, R> >& xs) {
  230|     20|    std::vector<R> result;
  231|     20|    result.reserve(xs.size());
  232|     68|    for (auto x = xs.begin(); x != xs.end(); ++x) {
  ------------------
  |  Branch (232:31): [True: 48, False: 20]
  ------------------
  233|     48|      result.push_back(x->second);
  234|     48|    }
  235|     20|    return result;
  236|     20|  }
_ZN6hobbes5toSetISt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS7_EEEESt3setINT_10value_typeESt4lessISC_ESaISC_EERKSB_:
  152|  9.77k|  std::set<typename CT::value_type> toSet(const CT& xs) {
  153|  9.77k|    std::set<typename CT::value_type> r;
  154|  10.8k|    for (const auto& x : xs) {
  ------------------
  |  Branch (154:24): [True: 10.8k, False: 9.77k]
  ------------------
  155|  10.8k|      r.insert(x);
  156|  10.8k|    }
  157|  9.77k|    return r;
  158|  9.77k|  }
_ZN6hobbes4listISt10shared_ptrINS_4ExprEEJS3_EEESt6vectorIT_SaIS5_EERKS5_DpRKT0_:
   31|  5.59k|  std::vector<T> list(const T& x, const Ts& ... xs) {
   32|  5.59k|    std::vector<T> r = {x,xs...};
   33|  5.59k|    return r;
   34|  5.59k|  }
_ZN6hobbes4listISt10shared_ptrINS_8MonoTypeEEJS3_S3_EEESt6vectorIT_SaIS5_EERKS5_DpRKT0_:
   31|  13.0k|  std::vector<T> list(const T& x, const Ts& ... xs) {
   32|  13.0k|    std::vector<T> r = {x,xs...};
   33|  13.0k|    return r;
   34|  13.0k|  }
_ZN6hobbes4listIPN4llvm5ValueEJPNS1_8ConstantEEEESt6vectorIT_SaIS7_EERKS7_DpRKT0_:
   31|     30|  std::vector<T> list(const T& x, const Ts& ... xs) {
   32|     30|    std::vector<T> r = {x,xs...};
   33|     30|    return r;
   34|     30|  }
_ZN6hobbes4listIPN4llvm5ValueEJS3_PNS1_8ConstantEEEESt6vectorIT_SaIS7_EERKS7_DpRKT0_:
   31|      6|  std::vector<T> list(const T& x, const Ts& ... xs) {
   32|      6|    std::vector<T> r = {x,xs...};
   33|      6|    return r;
   34|      6|  }
_ZN6hobbes4listISt10shared_ptrINS_8MonoTypeEEJS3_S3_S3_S3_S3_S3_S3_EEESt6vectorIT_SaIS5_EERKS5_DpRKT0_:
   31|      1|  std::vector<T> list(const T& x, const Ts& ... xs) {
   32|      1|    std::vector<T> r = {x,xs...};
   33|      1|    return r;
   34|      1|  }
_ZN6hobbes4listISt10shared_ptrINS_8MonoTypeEEJS3_S3_S3_EEESt6vectorIT_SaIS5_EERKS5_DpRKT0_:
   31|      1|  std::vector<T> list(const T& x, const Ts& ... xs) {
   32|      1|    std::vector<T> r = {x,xs...};
   33|      1|    return r;
   34|      1|  }
_ZN6hobbes4listIPN4llvm5ValueEJS3_EEESt6vectorIT_SaIS5_EERKS5_DpRKT0_:
   31|    127|  std::vector<T> list(const T& x, const Ts& ... xs) {
   32|    127|    std::vector<T> r = {x,xs...};
   33|    127|    return r;
   34|    127|  }
_ZN6hobbes4listISt10shared_ptrINS_10ConstraintEEJEEESt6vectorIT_SaIS5_EERKS5_DpRKT0_:
   31|  3.30k|  std::vector<T> list(const T& x, const Ts& ... xs) {
   32|  3.30k|    std::vector<T> r = {x,xs...};
   33|  3.30k|    return r;
   34|  3.30k|  }
_ZN6hobbes4listISt4pairISt6vectorIiSaIiEEiEJS5_EEES2_IT_SaIS6_EERKS6_DpRKT0_:
   31|      1|  std::vector<T> list(const T& x, const Ts& ... xs) {
   32|      1|    std::vector<T> r = {x,xs...};
   33|      1|    return r;
   34|      1|  }
_ZN6hobbes4listIiJEEESt6vectorIT_SaIS2_EERKS2_DpRKT0_:
   31|    530|  std::vector<T> list(const T& x, const Ts& ... xs) {
   32|    530|    std::vector<T> r = {x,xs...};
   33|    530|    return r;
   34|    530|  }
_ZN6hobbes4listIiJiiEEESt6vectorIT_SaIS2_EERKS2_DpRKT0_:
   31|  4.28k|  std::vector<T> list(const T& x, const Ts& ... xs) {
   32|  4.28k|    std::vector<T> r = {x,xs...};
   33|  4.28k|    return r;
   34|  4.28k|  }
_ZN6hobbes4listINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJEEESt6vectorIT_SaIS8_EERKS8_DpRKT0_:
   31|  9.01k|  std::vector<T> list(const T& x, const Ts& ... xs) {
   32|  9.01k|    std::vector<T> r = {x,xs...};
   33|  9.01k|    return r;
   34|  9.01k|  }
_ZN6hobbes2inISt10shared_ptrINS_4TEnvEEEEbT_RKSt3setIS4_St4lessIS4_ESaIS4_EE:
   48|  2.12k|  bool in(T x, const std::set<T>& xs) {
   49|  2.12k|    return xs.find(x) != xs.end();
   50|  2.12k|  }
_ZN6hobbes13setDifferenceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEESt3setIT_St4lessIS8_ESaIS8_EERKSC_SE_:
  186|  1.99k|  std::set<T> setDifference(const std::set<T>& lhs, const std::set<T>& rhs) {
  187|  1.99k|    std::set<T> r;
  188|  1.99k|    std::set_difference(lhs.begin(), lhs.end(), rhs.begin(), rhs.end(), std::inserter(r, r.begin()));
  189|  1.99k|    return r;
  190|  1.99k|  }
_ZN6hobbes4consINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEESt6vectorIT_SaIS8_EES8_SA_:
  287|     22|  std::vector<T> cons(T h, std::vector<T> t) {
  288|     22|    t.insert(t.begin(), h);
  289|     22|    return t;
  290|     22|  }
_ZN6hobbes4dropINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_4ExprEEEESt3mapIT_T0_St4lessISB_ESaISt4pairIKSB_SC_EEERKSJ_RKSt3setISB_SE_SaISB_EE:
  136|    539|  std::map<K, V> drop(const std::map<K, V>& m, const std::set<K>& ks) {
  137|    539|    std::map<K, V> result;
  138|  1.13k|    for (auto p = m.begin(); p != m.end(); ++p) {
  ------------------
  |  Branch (138:30): [True: 600, False: 539]
  ------------------
  139|    600|      if (ks.find(p->first) == ks.end()) {
  ------------------
  |  Branch (139:11): [True: 598, False: 2]
  ------------------
  140|    598|        result[p->first] = p->second;
  141|    598|      }
  142|    600|    }
  143|    539|    return result;
  144|    539|  }
_ZN6hobbes8setUnionINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEESt3setIT_St4lessIS8_ESaIS8_EERKSt6vectorISC_SaISC_EE:
  177|  4.56k|  std::set<T> setUnion(const std::vector< std::set<T> >& ss) {
  178|  4.56k|    std::set<T> r;
  179|  17.2k|    for (auto s = ss.begin(); s != ss.end(); ++s) {
  ------------------
  |  Branch (179:31): [True: 12.6k, False: 4.56k]
  ------------------
  180|  12.6k|      r.insert(s->begin(), s->end());
  181|  12.6k|    }
  182|  4.56k|    return r;
  183|  4.56k|  }
_ZN6hobbes4listISt3setINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4lessIS7_ESaIS7_EEJSB_EEESt6vectorIT_SaISD_EERKSD_DpRKT0_:
   31|  1.17k|  std::vector<T> list(const T& x, const Ts& ... xs) {
   32|  1.17k|    std::vector<T> r = {x,xs...};
   33|  1.17k|    return r;
   34|  1.17k|  }
_ZN6hobbes4consISt3setINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4lessIS7_ESaIS7_EEEESt6vectorIT_SaISD_EESD_SF_:
  287|  3.12k|  std::vector<T> cons(T h, std::vector<T> t) {
  288|  3.12k|    t.insert(t.begin(), h);
  289|  3.12k|    return t;
  290|  3.12k|  }
_ZN6hobbes4listISt10shared_ptrINS_4ExprEEJS3_S3_EEESt6vectorIT_SaIS5_EERKS5_DpRKT0_:
   31|    338|  std::vector<T> list(const T& x, const Ts& ... xs) {
   32|    338|    std::vector<T> r = {x,xs...};
   33|    338|    return r;
   34|    338|  }
_ZN6hobbes4listIiJiEEESt6vectorIT_SaIS2_EERKS2_DpRKT0_:
   31|  1.19k|  std::vector<T> list(const T& x, const Ts& ... xs) {
   32|  1.19k|    std::vector<T> r = {x,xs...};
   33|  1.19k|    return r;
   34|  1.19k|  }
_ZN6hobbes4listINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJS6_EEESt6vectorIT_SaIS8_EERKS8_DpRKT0_:
   31|     46|  std::vector<T> list(const T& x, const Ts& ... xs) {
   32|     46|    std::vector<T> r = {x,xs...};
   33|     46|    return r;
   34|     46|  }
_ZN6hobbes2inISt4pairISt6vectorIiSaIiEEiEEEbT_RKS2_IS6_SaIS6_EE:
   54|    633|  bool in(T x, const std::vector<T>& xs) {
   55|  8.70k|    for (auto xi = xs.begin(); xi != xs.end(); ++xi) {
  ------------------
  |  Branch (55:32): [True: 8.16k, False: 535]
  ------------------
   56|  8.16k|      if (*xi == x) {
  ------------------
  |  Branch (56:11): [True: 98, False: 8.06k]
  ------------------
   57|     98|        return true;
   58|     98|      }
   59|  8.16k|    }
   60|    535|    return false;
   61|    633|  }
_ZN6hobbes8setUnionIiEESt3setIT_St4lessIS2_ESaIS2_EERKS6_S8_:
  170|    975|  std::set<T> setUnion(const std::set<T>& lhs, const std::set<T>& rhs) {
  171|    975|    std::set<T> r;
  172|    975|    std::set_union(lhs.begin(), lhs.end(), rhs.begin(), rhs.end(), std::inserter(r, r.begin()));
  173|    975|    return r;
  174|    975|  }
_ZN6hobbes2inIiEEbT_RKSt3setIS1_St4lessIS1_ESaIS1_EE:
   48|    690|  bool in(T x, const std::set<T>& xs) {
   49|    690|    return xs.find(x) != xs.end();
   50|    690|  }
_ZN6hobbes6selectISt10shared_ptrINS_8MonoTypeEEiEESt6vectorIT_SaIS5_EERKS7_RKS4_IT0_SaISA_EE:
  107|  40.0k|  std::vector<T> select(const std::vector<T>& xs, const std::vector<I>& is) {
  108|  40.0k|    std::vector<T> r;
  109|   104k|    for (auto i = is.begin(); i != is.end(); ++i) {
  ------------------
  |  Branch (109:31): [True: 64.2k, False: 40.0k]
  ------------------
  110|  64.2k|      r.push_back(select(xs, *i));
  111|  64.2k|    }
  112|  40.0k|    return r;
  113|  40.0k|  }
_ZN6hobbes6selectISt10shared_ptrINS_8MonoTypeEEiEET_RKSt6vectorIS4_SaIS4_EET0_:
   93|  70.2k|  T select(const std::vector<T>& xs, I i) {
   94|  70.2k|    return xs[i];
   95|  70.2k|  }
_ZN6hobbes8toVectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEESt6vectorIT_SaIS8_EERKSt3setIS8_St4lessIS8_ES9_E:
  147|    251|  std::vector<T> toVector(const std::set<T>& xs) {
  148|    251|    return std::vector<T>(xs.begin(), xs.end());
  149|    251|  }
_ZN6hobbes4listISt10shared_ptrINS_8MonoTypeEEJS3_S3_S3_S3_S3_EEESt6vectorIT_SaIS5_EERKS5_DpRKT0_:
   31|    111|  std::vector<T> list(const T& x, const Ts& ... xs) {
   32|    111|    std::vector<T> r = {x,xs...};
   33|    111|    return r;
   34|    111|  }
_ZN6hobbes4listISt10shared_ptrINS_8MonoTypeEEJS3_S3_S3_S3_EEESt6vectorIT_SaIS5_EERKS5_DpRKT0_:
   31|    308|  std::vector<T> list(const T& x, const Ts& ... xs) {
   32|    308|    std::vector<T> r = {x,xs...};
   33|    308|    return r;
   34|    308|  }
_ZN6hobbes4dropISt10shared_ptrINS_8MonoTypeEEEESt6vectorIT_SaIS5_EERKS7_m:
  260|    114|  std::vector<T> drop(const std::vector<T>& xs, size_t n) {
  261|    114|    if (n >= xs.size()) {
  ------------------
  |  Branch (261:9): [True: 0, False: 114]
  ------------------
  262|      0|      return std::vector<T>();
  263|    114|    } else {
  264|    114|      return std::vector<T>(xs.begin() + n, xs.end());
  265|    114|    }
  266|    114|  }
_ZN6hobbes8setUnionINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEESt3setIT_St4lessIS8_ESaIS8_EERKSC_SE_:
  170|  34.4k|  std::set<T> setUnion(const std::set<T>& lhs, const std::set<T>& rhs) {
  171|  34.4k|    std::set<T> r;
  172|  34.4k|    std::set_union(lhs.begin(), lhs.end(), rhs.begin(), rhs.end(), std::inserter(r, r.begin()));
  173|  34.4k|    return r;
  174|  34.4k|  }
_ZN6hobbes13setDifferenceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEESt3setIT_St4lessIS8_ESaIS8_EERKSC_RKS8_:
  193|    408|  std::set<T> setDifference(const std::set<T>& lhs, const T& x) {
  194|    408|    std::set<T> sx;
  195|    408|    sx.insert(x);
  196|    408|    return setDifference(lhs, sx);
  197|    408|  }
_ZN6hobbes4listISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS_17LexicalAnnotationEEJEEESt6vectorIT_SaISB_EERKSB_DpRKT0_:
   31|    385|  std::vector<T> list(const T& x, const Ts& ... xs) {
   32|    385|    std::vector<T> r = {x,xs...};
   33|    385|    return r;
   34|    385|  }
_ZN6hobbes4listISt10shared_ptrINS_7PatternEEJEEESt6vectorIT_SaIS5_EERKS5_DpRKT0_:
   31|    505|  std::vector<T> list(const T& x, const Ts& ... xs) {
   32|    505|    std::vector<T> r = {x,xs...};
   33|    505|    return r;
   34|    505|  }
_ZN6hobbes4listINS_10PatternRowEJEEESt6vectorIT_SaIS3_EERKS3_DpRKT0_:
   31|    612|  std::vector<T> list(const T& x, const Ts& ... xs) {
   32|    612|    std::vector<T> r = {x,xs...};
   33|    612|    return r;
   34|    612|  }
_ZN6hobbes4listINS_10PatternRowEJS1_EEESt6vectorIT_SaIS3_EERKS3_DpRKT0_:
   31|      1|  std::vector<T> list(const T& x, const Ts& ... xs) {
   32|      1|    std::vector<T> r = {x,xs...};
   33|      1|    return r;
   34|      1|  }
_ZN6hobbes4listINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJS6_S6_EEESt6vectorIT_SaIS8_EERKS8_DpRKT0_:
   31|     76|  std::vector<T> list(const T& x, const Ts& ... xs) {
   32|     76|    std::vector<T> r = {x,xs...};
   33|     76|    return r;
   34|     76|  }
_ZN6hobbes4listINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJS6_S6_S6_EEESt6vectorIT_SaIS8_EERKS8_DpRKT0_:
   31|     60|  std::vector<T> list(const T& x, const Ts& ... xs) {
   32|     60|    std::vector<T> r = {x,xs...};
   33|     60|    return r;
   34|     60|  }
_ZN6hobbes4listINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJS6_S6_S6_S6_EEESt6vectorIT_SaIS8_EERKS8_DpRKT0_:
   31|     49|  std::vector<T> list(const T& x, const Ts& ... xs) {
   32|     49|    std::vector<T> r = {x,xs...};
   33|     49|    return r;
   34|     49|  }
_ZN6hobbes4listINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJS6_S6_S6_S6_S6_EEESt6vectorIT_SaIS8_EERKS8_DpRKT0_:
   31|     22|  std::vector<T> list(const T& x, const Ts& ... xs) {
   32|     22|    std::vector<T> r = {x,xs...};
   33|     22|    return r;
   34|     22|  }
_ZN6hobbes4listINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJS6_S6_S6_S6_S6_S6_EEESt6vectorIT_SaIS8_EERKS8_DpRKT0_:
   31|      6|  std::vector<T> list(const T& x, const Ts& ... xs) {
   32|      6|    std::vector<T> r = {x,xs...};
   33|      6|    return r;
   34|      6|  }
_ZN6hobbes4listINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJS6_S6_S6_S6_S6_S6_S6_EEESt6vectorIT_SaIS8_EERKS8_DpRKT0_:
   31|      6|  std::vector<T> list(const T& x, const Ts& ... xs) {
   32|      6|    std::vector<T> r = {x,xs...};
   33|      6|    return r;
   34|      6|  }
_ZN6hobbes4listINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEJS6_S6_S6_S6_S6_S6_S6_S6_S6_S6_EEESt6vectorIT_SaIS8_EERKS8_DpRKT0_:
   31|      1|  std::vector<T> list(const T& x, const Ts& ... xs) {
   32|      1|    std::vector<T> r = {x,xs...};
   33|      1|    return r;
   34|      1|  }
_ZN6hobbes6selectINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiEET_RKSt6vectorIS7_SaIS7_EET0_:
   93|     33|  T select(const std::vector<T>& xs, I i) {
   94|     33|    return xs[i];
   95|     33|  }
_ZN6hobbes6selectINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiEESt6vectorIT_SaIS8_EERKSA_T0_SD_:
   98|     13|  std::vector<T> select(const std::vector<T>& xs, I b, I e) {
   99|     13|    std::vector<T> r;
  100|     33|    for (I j = b; j < e; ++j) {
  ------------------
  |  Branch (100:19): [True: 20, False: 13]
  ------------------
  101|     20|      r.push_back(select(xs, j));
  102|     20|    }
  103|     13|    return r;
  104|     13|  }
_ZN6hobbes4listIPN4llvm5ValueEJPNS1_8ConstantES3_S3_EEESt6vectorIT_SaIS7_EERKS7_DpRKT0_:
   31|     17|  std::vector<T> list(const T& x, const Ts& ... xs) {
   32|     17|    std::vector<T> r = {x,xs...};
   33|     17|    return r;
   34|     17|  }
_ZN6hobbes2inIiEEbT_RKSt6vectorIS1_SaIS1_EE:
   54|   112k|  bool in(T x, const std::vector<T>& xs) {
   55|   256k|    for (auto xi = xs.begin(); xi != xs.end(); ++xi) {
  ------------------
  |  Branch (55:32): [True: 184k, False: 71.0k]
  ------------------
   56|   184k|      if (*xi == x) {
  ------------------
  |  Branch (56:11): [True: 41.3k, False: 143k]
  ------------------
   57|  41.3k|        return true;
   58|  41.3k|      }
   59|   184k|    }
   60|  71.0k|    return false;
   61|   112k|  }
_ZN6hobbes5rangeImEESt6vectorIT_SaIS2_EERKS2_S6_:
   38|    100|  std::vector<T> range(const T& i, const T& e) {
   39|    100|    std::vector<T> result;
   40|    301|    for (T t = i; t < e; ++t) {
  ------------------
  |  Branch (40:19): [True: 201, False: 100]
  ------------------
   41|    201|      result.push_back(t);
   42|    201|    }
   43|    100|    return result;
   44|    100|  }
_ZN6hobbes5firstINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_7PatternEEEESt6vectorIT_SaISB_EERKSA_ISt4pairISB_T0_ESaISG_EE:
  209|     44|  std::vector<L> first(const std::vector< std::pair<L, R> >& xs) {
  210|     44|    std::vector<L> result;
  211|     44|    result.reserve(xs.size());
  212|    135|    for (auto x = xs.begin(); x != xs.end(); ++x) {
  ------------------
  |  Branch (212:31): [True: 91, False: 44]
  ------------------
  213|     91|      result.push_back(x->first);
  214|     91|    }
  215|     44|    return result;
  216|     44|  }
_ZN6hobbes4keysINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt6vectorISt10shared_ptrINS_7PatternEESaISA_EEEESt3setIT_St4lessISE_ESaISE_EERKSt3mapISE_T0_SG_SaISt4pairIKSE_SK_EEE:
  200|     32|  std::set<K> keys(const std::map<K, V>& m) {
  201|     32|    std::set<K> r;
  202|     99|    for (auto kv = m.begin(); kv != m.end(); ++kv) {
  ------------------
  |  Branch (202:31): [True: 67, False: 32]
  ------------------
  203|     67|      r.insert(kv->first);
  204|     67|    }
  205|     32|    return r;
  206|     32|  }
_ZN6hobbes13setDifferenceIhEESt3setIT_St4lessIS2_ESaIS2_EERKS6_S8_:
  186|      3|  std::set<T> setDifference(const std::set<T>& lhs, const std::set<T>& rhs) {
  187|      3|    std::set<T> r;
  188|      3|    std::set_difference(lhs.begin(), lhs.end(), rhs.begin(), rhs.end(), std::inserter(r, r.begin()));
  189|      3|    return r;
  190|      3|  }
_ZN6hobbes4listISt10shared_ptrINS_4ExprEEJS3_S3_S3_S3_EEESt6vectorIT_SaIS5_EERKS5_DpRKT0_:
   31|     22|  std::vector<T> list(const T& x, const Ts& ... xs) {
   32|     22|    std::vector<T> r = {x,xs...};
   33|     22|    return r;
   34|     22|  }

_ZN6hobbes14AutoreleaseSet5resetEv:
   25|     30|  static void reset() {
   26|     30|    ResetFns& rfs = resetFns();
   27|    602|    for (auto rf : rfs) {
  ------------------
  |  Branch (27:18): [True: 602, False: 30]
  ------------------
   28|    602|      rf();
   29|    602|    }
   30|     30|  }
_ZN6hobbes14AutoreleaseSet8resetFnsEv:
   14|     52|  static ResetFns& resetFns() {
   15|     52|    thread_local ResetFns rs;
   16|     52|    return rs;
   17|     52|  }
_ZN6hobbes11autoreleaseINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEPT_S8_:
   60|  18.6k|  T* autorelease(T* x) {
   61|  18.6k|    Autorelease<T>::mark(x);
   62|  18.6k|    return x;
   63|  18.6k|  }
_ZN6hobbes11AutoreleaseINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE4markEPS6_:
   49|  18.6k|    static void mark(T* x) {
   50|  18.6k|      thread_local bool saved = false;
   51|  18.6k|      if (!saved) {
  ------------------
  |  Branch (51:11): [True: 1, False: 18.6k]
  ------------------
   52|      1|        AutoreleaseSet::registerClearFn<&Autorelease<T>::reset>();
   53|      1|        saved = true;
   54|      1|      }
   55|  18.6k|      vals().push_back(x);
   56|  18.6k|    }
_ZN6hobbes14AutoreleaseSet15registerClearFnIXadL_ZNS_11AutoreleaseINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE5resetEvEEEEbv:
   20|      1|    static bool registerClearFn() {
   21|      1|      resetFns().push_back(fn);
   22|      1|      return true;
   23|      1|    }
_ZN6hobbes11AutoreleaseINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE5resetEv:
   41|     30|    static void reset() {
   42|     30|      Vals& vs = vals();
   43|  18.6k|      for (auto i = vs.begin(); i != vs.end(); ++i) {
  ------------------
  |  Branch (43:33): [True: 18.6k, False: 30]
  ------------------
   44|  18.6k|        delete *i;
   45|  18.6k|      }
   46|     30|      vs.clear();
   47|     30|    }
_ZN6hobbes11AutoreleaseINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE4valsEv:
   36|  18.6k|    static Vals& vals() {
   37|  18.6k|      thread_local Vals vs;
   38|  18.6k|      return vs;
   39|  18.6k|    }
_ZN6hobbes11autoreleaseISt6vectorISt10shared_ptrINS_9ModuleDefEESaIS4_EEEEPT_S8_:
   60|     27|  T* autorelease(T* x) {
   61|     27|    Autorelease<T>::mark(x);
   62|     27|    return x;
   63|     27|  }
_ZN6hobbes11AutoreleaseISt6vectorISt10shared_ptrINS_9ModuleDefEESaIS4_EEE4markEPS6_:
   49|     27|    static void mark(T* x) {
   50|     27|      thread_local bool saved = false;
   51|     27|      if (!saved) {
  ------------------
  |  Branch (51:11): [True: 1, False: 26]
  ------------------
   52|      1|        AutoreleaseSet::registerClearFn<&Autorelease<T>::reset>();
   53|      1|        saved = true;
   54|      1|      }
   55|     27|      vals().push_back(x);
   56|     27|    }
_ZN6hobbes14AutoreleaseSet15registerClearFnIXadL_ZNS_11AutoreleaseISt6vectorISt10shared_ptrINS_9ModuleDefEESaIS6_EEE5resetEvEEEEbv:
   20|      1|    static bool registerClearFn() {
   21|      1|      resetFns().push_back(fn);
   22|      1|      return true;
   23|      1|    }
_ZN6hobbes11AutoreleaseISt6vectorISt10shared_ptrINS_9ModuleDefEESaIS4_EEE5resetEv:
   41|     30|    static void reset() {
   42|     30|      Vals& vs = vals();
   43|     57|      for (auto i = vs.begin(); i != vs.end(); ++i) {
  ------------------
  |  Branch (43:33): [True: 27, False: 30]
  ------------------
   44|     27|        delete *i;
   45|     27|      }
   46|     30|      vs.clear();
   47|     30|    }
_ZN6hobbes11AutoreleaseISt6vectorISt10shared_ptrINS_9ModuleDefEESaIS4_EEE4valsEv:
   36|     57|    static Vals& vals() {
   37|     57|      thread_local Vals vs;
   38|     57|      return vs;
   39|     57|    }
_ZN6hobbes11autoreleaseISt6vectorISt4pairIS1_INSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS8_EESA_ESaISB_EEEEPT_SF_:
   60|     32|  T* autorelease(T* x) {
   61|     32|    Autorelease<T>::mark(x);
   62|     32|    return x;
   63|     32|  }
_ZN6hobbes11AutoreleaseISt6vectorISt4pairIS1_INSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS8_EESA_ESaISB_EEE4markEPSD_:
   49|     32|    static void mark(T* x) {
   50|     32|      thread_local bool saved = false;
   51|     32|      if (!saved) {
  ------------------
  |  Branch (51:11): [True: 1, False: 31]
  ------------------
   52|      1|        AutoreleaseSet::registerClearFn<&Autorelease<T>::reset>();
   53|      1|        saved = true;
   54|      1|      }
   55|     32|      vals().push_back(x);
   56|     32|    }
_ZN6hobbes14AutoreleaseSet15registerClearFnIXadL_ZNS_11AutoreleaseISt6vectorISt4pairIS3_INSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISA_EESC_ESaISD_EEE5resetEvEEEEbv:
   20|      1|    static bool registerClearFn() {
   21|      1|      resetFns().push_back(fn);
   22|      1|      return true;
   23|      1|    }
_ZN6hobbes11AutoreleaseISt6vectorISt4pairIS1_INSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS8_EESA_ESaISB_EEE5resetEv:
   41|     30|    static void reset() {
   42|     30|      Vals& vs = vals();
   43|     62|      for (auto i = vs.begin(); i != vs.end(); ++i) {
  ------------------
  |  Branch (43:33): [True: 32, False: 30]
  ------------------
   44|     32|        delete *i;
   45|     32|      }
   46|     30|      vs.clear();
   47|     30|    }
_ZN6hobbes11AutoreleaseISt6vectorISt4pairIS1_INSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS8_EESA_ESaISB_EEE4valsEv:
   36|     62|    static Vals& vals() {
   37|     62|      thread_local Vals vs;
   38|     62|      return vs;
   39|     62|    }
_ZN6hobbes11autoreleaseISt4pairISt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS8_EESA_EEEPT_SD_:
   60|     60|  T* autorelease(T* x) {
   61|     60|    Autorelease<T>::mark(x);
   62|     60|    return x;
   63|     60|  }
_ZN6hobbes11AutoreleaseISt4pairISt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS8_EESA_EE4markEPSB_:
   49|     60|    static void mark(T* x) {
   50|     60|      thread_local bool saved = false;
   51|     60|      if (!saved) {
  ------------------
  |  Branch (51:11): [True: 1, False: 59]
  ------------------
   52|      1|        AutoreleaseSet::registerClearFn<&Autorelease<T>::reset>();
   53|      1|        saved = true;
   54|      1|      }
   55|     60|      vals().push_back(x);
   56|     60|    }
_ZN6hobbes14AutoreleaseSet15registerClearFnIXadL_ZNS_11AutoreleaseISt4pairISt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISA_EESC_EE5resetEvEEEEbv:
   20|      1|    static bool registerClearFn() {
   21|      1|      resetFns().push_back(fn);
   22|      1|      return true;
   23|      1|    }
_ZN6hobbes11AutoreleaseISt4pairISt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS8_EESA_EE5resetEv:
   41|     30|    static void reset() {
   42|     30|      Vals& vs = vals();
   43|     90|      for (auto i = vs.begin(); i != vs.end(); ++i) {
  ------------------
  |  Branch (43:33): [True: 60, False: 30]
  ------------------
   44|     60|        delete *i;
   45|     60|      }
   46|     30|      vs.clear();
   47|     30|    }
_ZN6hobbes11AutoreleaseISt4pairISt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS8_EESA_EE4valsEv:
   36|     90|    static Vals& vals() {
   37|     90|      thread_local Vals vs;
   38|     90|      return vs;
   39|     90|    }
_ZN6hobbes11autoreleaseISt6vectorISt10shared_ptrINS_11MVarTypeDefEESaIS4_EEEEPT_S8_:
   60|     80|  T* autorelease(T* x) {
   61|     80|    Autorelease<T>::mark(x);
   62|     80|    return x;
   63|     80|  }
_ZN6hobbes11AutoreleaseISt6vectorISt10shared_ptrINS_11MVarTypeDefEESaIS4_EEE4markEPS6_:
   49|     80|    static void mark(T* x) {
   50|     80|      thread_local bool saved = false;
   51|     80|      if (!saved) {
  ------------------
  |  Branch (51:11): [True: 1, False: 79]
  ------------------
   52|      1|        AutoreleaseSet::registerClearFn<&Autorelease<T>::reset>();
   53|      1|        saved = true;
   54|      1|      }
   55|     80|      vals().push_back(x);
   56|     80|    }
_ZN6hobbes14AutoreleaseSet15registerClearFnIXadL_ZNS_11AutoreleaseISt6vectorISt10shared_ptrINS_11MVarTypeDefEESaIS6_EEE5resetEvEEEEbv:
   20|      1|    static bool registerClearFn() {
   21|      1|      resetFns().push_back(fn);
   22|      1|      return true;
   23|      1|    }
_ZN6hobbes11AutoreleaseISt6vectorISt10shared_ptrINS_11MVarTypeDefEESaIS4_EEE5resetEv:
   41|     30|    static void reset() {
   42|     30|      Vals& vs = vals();
   43|    110|      for (auto i = vs.begin(); i != vs.end(); ++i) {
  ------------------
  |  Branch (43:33): [True: 80, False: 30]
  ------------------
   44|     80|        delete *i;
   45|     80|      }
   46|     30|      vs.clear();
   47|     30|    }
_ZN6hobbes11AutoreleaseISt6vectorISt10shared_ptrINS_11MVarTypeDefEESaIS4_EEE4valsEv:
   36|    110|    static Vals& vals() {
   37|    110|      thread_local Vals vs;
   38|    110|      return vs;
   39|    110|    }
_ZN6hobbes11autoreleaseISt6vectorISt10shared_ptrINS_7MVarDefEESaIS4_EEEEPT_S8_:
   60|    546|  T* autorelease(T* x) {
   61|    546|    Autorelease<T>::mark(x);
   62|    546|    return x;
   63|    546|  }
_ZN6hobbes11AutoreleaseISt6vectorISt10shared_ptrINS_7MVarDefEESaIS4_EEE4markEPS6_:
   49|    546|    static void mark(T* x) {
   50|    546|      thread_local bool saved = false;
   51|    546|      if (!saved) {
  ------------------
  |  Branch (51:11): [True: 1, False: 545]
  ------------------
   52|      1|        AutoreleaseSet::registerClearFn<&Autorelease<T>::reset>();
   53|      1|        saved = true;
   54|      1|      }
   55|    546|      vals().push_back(x);
   56|    546|    }
_ZN6hobbes14AutoreleaseSet15registerClearFnIXadL_ZNS_11AutoreleaseISt6vectorISt10shared_ptrINS_7MVarDefEESaIS6_EEE5resetEvEEEEbv:
   20|      1|    static bool registerClearFn() {
   21|      1|      resetFns().push_back(fn);
   22|      1|      return true;
   23|      1|    }
_ZN6hobbes11AutoreleaseISt6vectorISt10shared_ptrINS_7MVarDefEESaIS4_EEE5resetEv:
   41|     30|    static void reset() {
   42|     30|      Vals& vs = vals();
   43|    576|      for (auto i = vs.begin(); i != vs.end(); ++i) {
  ------------------
  |  Branch (43:33): [True: 546, False: 30]
  ------------------
   44|    546|        delete *i;
   45|    546|      }
   46|     30|      vs.clear();
   47|     30|    }
_ZN6hobbes11AutoreleaseISt6vectorISt10shared_ptrINS_7MVarDefEESaIS4_EEE4valsEv:
   36|    576|    static Vals& vals() {
   37|    576|      thread_local Vals vs;
   38|    576|      return vs;
   39|    576|    }
_ZN6hobbes11autoreleaseISt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS7_EEEEPT_SB_:
   60|  1.24k|  T* autorelease(T* x) {
   61|  1.24k|    Autorelease<T>::mark(x);
   62|  1.24k|    return x;
   63|  1.24k|  }
_ZN6hobbes11AutoreleaseISt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS7_EEE4markEPS9_:
   49|  1.24k|    static void mark(T* x) {
   50|  1.24k|      thread_local bool saved = false;
   51|  1.24k|      if (!saved) {
  ------------------
  |  Branch (51:11): [True: 1, False: 1.24k]
  ------------------
   52|      1|        AutoreleaseSet::registerClearFn<&Autorelease<T>::reset>();
   53|      1|        saved = true;
   54|      1|      }
   55|  1.24k|      vals().push_back(x);
   56|  1.24k|    }
_ZN6hobbes14AutoreleaseSet15registerClearFnIXadL_ZNS_11AutoreleaseISt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EEE5resetEvEEEEbv:
   20|      1|    static bool registerClearFn() {
   21|      1|      resetFns().push_back(fn);
   22|      1|      return true;
   23|      1|    }
_ZN6hobbes11AutoreleaseISt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS7_EEE5resetEv:
   41|     30|    static void reset() {
   42|     30|      Vals& vs = vals();
   43|  1.27k|      for (auto i = vs.begin(); i != vs.end(); ++i) {
  ------------------
  |  Branch (43:33): [True: 1.24k, False: 30]
  ------------------
   44|  1.24k|        delete *i;
   45|  1.24k|      }
   46|     30|      vs.clear();
   47|     30|    }
_ZN6hobbes11AutoreleaseISt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS7_EEE4valsEv:
   36|  1.27k|    static Vals& vals() {
   37|  1.27k|      thread_local Vals vs;
   38|  1.27k|      return vs;
   39|  1.27k|    }
_ZN6hobbes11autoreleaseISt6vectorISt10shared_ptrINS_8MonoTypeEESaIS4_EEEEPT_S8_:
   60|  7.02k|  T* autorelease(T* x) {
   61|  7.02k|    Autorelease<T>::mark(x);
   62|  7.02k|    return x;
   63|  7.02k|  }
_ZN6hobbes11AutoreleaseISt6vectorISt10shared_ptrINS_8MonoTypeEESaIS4_EEE4markEPS6_:
   49|  7.02k|    static void mark(T* x) {
   50|  7.02k|      thread_local bool saved = false;
   51|  7.02k|      if (!saved) {
  ------------------
  |  Branch (51:11): [True: 1, False: 7.02k]
  ------------------
   52|      1|        AutoreleaseSet::registerClearFn<&Autorelease<T>::reset>();
   53|      1|        saved = true;
   54|      1|      }
   55|  7.02k|      vals().push_back(x);
   56|  7.02k|    }
_ZN6hobbes14AutoreleaseSet15registerClearFnIXadL_ZNS_11AutoreleaseISt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EEE5resetEvEEEEbv:
   20|      1|    static bool registerClearFn() {
   21|      1|      resetFns().push_back(fn);
   22|      1|      return true;
   23|      1|    }
_ZN6hobbes11AutoreleaseISt6vectorISt10shared_ptrINS_8MonoTypeEESaIS4_EEE5resetEv:
   41|     30|    static void reset() {
   42|     30|      Vals& vs = vals();
   43|  7.05k|      for (auto i = vs.begin(); i != vs.end(); ++i) {
  ------------------
  |  Branch (43:33): [True: 7.02k, False: 30]
  ------------------
   44|  7.02k|        delete *i;
   45|  7.02k|      }
   46|     30|      vs.clear();
   47|     30|    }
_ZN6hobbes11AutoreleaseISt6vectorISt10shared_ptrINS_8MonoTypeEESaIS4_EEE4valsEv:
   36|  7.05k|    static Vals& vals() {
   37|  7.05k|      thread_local Vals vs;
   38|  7.05k|      return vs;
   39|  7.05k|    }
_ZN6hobbes11autoreleaseISt6vectorISt4pairISt10shared_ptrINS_7PatternEES3_INS_4ExprEEESaIS8_EEEEPT_SC_:
   60|    254|  T* autorelease(T* x) {
   61|    254|    Autorelease<T>::mark(x);
   62|    254|    return x;
   63|    254|  }
_ZN6hobbes11AutoreleaseISt6vectorISt4pairISt10shared_ptrINS_7PatternEES3_INS_4ExprEEESaIS8_EEE4markEPSA_:
   49|    254|    static void mark(T* x) {
   50|    254|      thread_local bool saved = false;
   51|    254|      if (!saved) {
  ------------------
  |  Branch (51:11): [True: 1, False: 253]
  ------------------
   52|      1|        AutoreleaseSet::registerClearFn<&Autorelease<T>::reset>();
   53|      1|        saved = true;
   54|      1|      }
   55|    254|      vals().push_back(x);
   56|    254|    }
_ZN6hobbes14AutoreleaseSet15registerClearFnIXadL_ZNS_11AutoreleaseISt6vectorISt4pairISt10shared_ptrINS_7PatternEES5_INS_4ExprEEESaISA_EEE5resetEvEEEEbv:
   20|      1|    static bool registerClearFn() {
   21|      1|      resetFns().push_back(fn);
   22|      1|      return true;
   23|      1|    }
_ZN6hobbes11AutoreleaseISt6vectorISt4pairISt10shared_ptrINS_7PatternEES3_INS_4ExprEEESaIS8_EEE5resetEv:
   41|     30|    static void reset() {
   42|     30|      Vals& vs = vals();
   43|    284|      for (auto i = vs.begin(); i != vs.end(); ++i) {
  ------------------
  |  Branch (43:33): [True: 254, False: 30]
  ------------------
   44|    254|        delete *i;
   45|    254|      }
   46|     30|      vs.clear();
   47|     30|    }
_ZN6hobbes11AutoreleaseISt6vectorISt4pairISt10shared_ptrINS_7PatternEES3_INS_4ExprEEESaIS8_EEE4valsEv:
   36|    284|    static Vals& vals() {
   37|    284|      thread_local Vals vs;
   38|    284|      return vs;
   39|    284|    }
_ZN6hobbes11autoreleaseISt4pairISt10shared_ptrINS_7PatternEES2_INS_4ExprEEEEEPT_S9_:
   60|    485|  T* autorelease(T* x) {
   61|    485|    Autorelease<T>::mark(x);
   62|    485|    return x;
   63|    485|  }
_ZN6hobbes11AutoreleaseISt4pairISt10shared_ptrINS_7PatternEES2_INS_4ExprEEEE4markEPS7_:
   49|    485|    static void mark(T* x) {
   50|    485|      thread_local bool saved = false;
   51|    485|      if (!saved) {
  ------------------
  |  Branch (51:11): [True: 1, False: 484]
  ------------------
   52|      1|        AutoreleaseSet::registerClearFn<&Autorelease<T>::reset>();
   53|      1|        saved = true;
   54|      1|      }
   55|    485|      vals().push_back(x);
   56|    485|    }
_ZN6hobbes14AutoreleaseSet15registerClearFnIXadL_ZNS_11AutoreleaseISt4pairISt10shared_ptrINS_7PatternEES4_INS_4ExprEEEE5resetEvEEEEbv:
   20|      1|    static bool registerClearFn() {
   21|      1|      resetFns().push_back(fn);
   22|      1|      return true;
   23|      1|    }
_ZN6hobbes11AutoreleaseISt4pairISt10shared_ptrINS_7PatternEES2_INS_4ExprEEEE5resetEv:
   41|     30|    static void reset() {
   42|     30|      Vals& vs = vals();
   43|    515|      for (auto i = vs.begin(); i != vs.end(); ++i) {
  ------------------
  |  Branch (43:33): [True: 485, False: 30]
  ------------------
   44|    485|        delete *i;
   45|    485|      }
   46|     30|      vs.clear();
   47|     30|    }
_ZN6hobbes11AutoreleaseISt4pairISt10shared_ptrINS_7PatternEES2_INS_4ExprEEEE4valsEv:
   36|    515|    static Vals& vals() {
   37|    515|      thread_local Vals vs;
   38|    515|      return vs;
   39|    515|    }
_ZN6hobbes11autoreleaseISt6vectorISt10shared_ptrINS_4ExprEESaIS4_EEEEPT_S8_:
   60|  3.05k|  T* autorelease(T* x) {
   61|  3.05k|    Autorelease<T>::mark(x);
   62|  3.05k|    return x;
   63|  3.05k|  }
_ZN6hobbes11AutoreleaseISt6vectorISt10shared_ptrINS_4ExprEESaIS4_EEE4markEPS6_:
   49|  3.05k|    static void mark(T* x) {
   50|  3.05k|      thread_local bool saved = false;
   51|  3.05k|      if (!saved) {
  ------------------
  |  Branch (51:11): [True: 1, False: 3.05k]
  ------------------
   52|      1|        AutoreleaseSet::registerClearFn<&Autorelease<T>::reset>();
   53|      1|        saved = true;
   54|      1|      }
   55|  3.05k|      vals().push_back(x);
   56|  3.05k|    }
_ZN6hobbes14AutoreleaseSet15registerClearFnIXadL_ZNS_11AutoreleaseISt6vectorISt10shared_ptrINS_4ExprEESaIS6_EEE5resetEvEEEEbv:
   20|      1|    static bool registerClearFn() {
   21|      1|      resetFns().push_back(fn);
   22|      1|      return true;
   23|      1|    }
_ZN6hobbes11AutoreleaseISt6vectorISt10shared_ptrINS_4ExprEESaIS4_EEE5resetEv:
   41|     30|    static void reset() {
   42|     30|      Vals& vs = vals();
   43|  3.08k|      for (auto i = vs.begin(); i != vs.end(); ++i) {
  ------------------
  |  Branch (43:33): [True: 3.05k, False: 30]
  ------------------
   44|  3.05k|        delete *i;
   45|  3.05k|      }
   46|     30|      vs.clear();
   47|     30|    }
_ZN6hobbes11AutoreleaseISt6vectorISt10shared_ptrINS_4ExprEESaIS4_EEE4valsEv:
   36|  3.08k|    static Vals& vals() {
   37|  3.08k|      thread_local Vals vs;
   38|  3.08k|      return vs;
   39|  3.08k|    }
_ZN6hobbes11autoreleaseISt6vectorISt10shared_ptrINS_10CSelectionEESaIS4_EEEEPT_S8_:
   60|     19|  T* autorelease(T* x) {
   61|     19|    Autorelease<T>::mark(x);
   62|     19|    return x;
   63|     19|  }
_ZN6hobbes11AutoreleaseISt6vectorISt10shared_ptrINS_10CSelectionEESaIS4_EEE4markEPS6_:
   49|     19|    static void mark(T* x) {
   50|     19|      thread_local bool saved = false;
   51|     19|      if (!saved) {
  ------------------
  |  Branch (51:11): [True: 1, False: 18]
  ------------------
   52|      1|        AutoreleaseSet::registerClearFn<&Autorelease<T>::reset>();
   53|      1|        saved = true;
   54|      1|      }
   55|     19|      vals().push_back(x);
   56|     19|    }
_ZN6hobbes14AutoreleaseSet15registerClearFnIXadL_ZNS_11AutoreleaseISt6vectorISt10shared_ptrINS_10CSelectionEESaIS6_EEE5resetEvEEEEbv:
   20|      1|    static bool registerClearFn() {
   21|      1|      resetFns().push_back(fn);
   22|      1|      return true;
   23|      1|    }
_ZN6hobbes11AutoreleaseISt6vectorISt10shared_ptrINS_10CSelectionEESaIS4_EEE5resetEv:
   41|     18|    static void reset() {
   42|     18|      Vals& vs = vals();
   43|     37|      for (auto i = vs.begin(); i != vs.end(); ++i) {
  ------------------
  |  Branch (43:33): [True: 19, False: 18]
  ------------------
   44|     19|        delete *i;
   45|     19|      }
   46|     18|      vs.clear();
   47|     18|    }
_ZN6hobbes11AutoreleaseISt6vectorISt10shared_ptrINS_10CSelectionEESaIS4_EEE4valsEv:
   36|     37|    static Vals& vals() {
   37|     37|      thread_local Vals vs;
   38|     37|      return vs;
   39|     37|    }
_ZN6hobbes11autoreleaseISt6vectorINS_10PatternRowESaIS2_EEEEPT_S6_:
   60|     56|  T* autorelease(T* x) {
   61|     56|    Autorelease<T>::mark(x);
   62|     56|    return x;
   63|     56|  }
_ZN6hobbes11AutoreleaseISt6vectorINS_10PatternRowESaIS2_EEE4markEPS4_:
   49|     56|    static void mark(T* x) {
   50|     56|      thread_local bool saved = false;
   51|     56|      if (!saved) {
  ------------------
  |  Branch (51:11): [True: 1, False: 55]
  ------------------
   52|      1|        AutoreleaseSet::registerClearFn<&Autorelease<T>::reset>();
   53|      1|        saved = true;
   54|      1|      }
   55|     56|      vals().push_back(x);
   56|     56|    }
_ZN6hobbes14AutoreleaseSet15registerClearFnIXadL_ZNS_11AutoreleaseISt6vectorINS_10PatternRowESaIS4_EEE5resetEvEEEEbv:
   20|      1|    static bool registerClearFn() {
   21|      1|      resetFns().push_back(fn);
   22|      1|      return true;
   23|      1|    }
_ZN6hobbes11AutoreleaseISt6vectorINS_10PatternRowESaIS2_EEE5resetEv:
   41|     30|    static void reset() {
   42|     30|      Vals& vs = vals();
   43|     86|      for (auto i = vs.begin(); i != vs.end(); ++i) {
  ------------------
  |  Branch (43:33): [True: 56, False: 30]
  ------------------
   44|     56|        delete *i;
   45|     56|      }
   46|     30|      vs.clear();
   47|     30|    }
_ZN6hobbes11AutoreleaseISt6vectorINS_10PatternRowESaIS2_EEE4valsEv:
   36|     86|    static Vals& vals() {
   37|     86|      thread_local Vals vs;
   38|     86|      return vs;
   39|     86|    }
_ZN6hobbes11autoreleaseINS_10PatternRowEEEPT_S3_:
   60|    141|  T* autorelease(T* x) {
   61|    141|    Autorelease<T>::mark(x);
   62|    141|    return x;
   63|    141|  }
_ZN6hobbes11AutoreleaseINS_10PatternRowEE4markEPS1_:
   49|    141|    static void mark(T* x) {
   50|    141|      thread_local bool saved = false;
   51|    141|      if (!saved) {
  ------------------
  |  Branch (51:11): [True: 1, False: 140]
  ------------------
   52|      1|        AutoreleaseSet::registerClearFn<&Autorelease<T>::reset>();
   53|      1|        saved = true;
   54|      1|      }
   55|    141|      vals().push_back(x);
   56|    141|    }
_ZN6hobbes14AutoreleaseSet15registerClearFnIXadL_ZNS_11AutoreleaseINS_10PatternRowEE5resetEvEEEEbv:
   20|      1|    static bool registerClearFn() {
   21|      1|      resetFns().push_back(fn);
   22|      1|      return true;
   23|      1|    }
_ZN6hobbes11AutoreleaseINS_10PatternRowEE5resetEv:
   41|     30|    static void reset() {
   42|     30|      Vals& vs = vals();
   43|    171|      for (auto i = vs.begin(); i != vs.end(); ++i) {
  ------------------
  |  Branch (43:33): [True: 141, False: 30]
  ------------------
   44|    141|        delete *i;
   45|    141|      }
   46|     30|      vs.clear();
   47|     30|    }
_ZN6hobbes11AutoreleaseINS_10PatternRowEE4valsEv:
   36|    171|    static Vals& vals() {
   37|    171|      thread_local Vals vs;
   38|    171|      return vs;
   39|    171|    }
_ZN6hobbes11autoreleaseISt6vectorISt10shared_ptrINS_7PatternEESaIS4_EEEEPT_S8_:
   60|    308|  T* autorelease(T* x) {
   61|    308|    Autorelease<T>::mark(x);
   62|    308|    return x;
   63|    308|  }
_ZN6hobbes11AutoreleaseISt6vectorISt10shared_ptrINS_7PatternEESaIS4_EEE4markEPS6_:
   49|    308|    static void mark(T* x) {
   50|    308|      thread_local bool saved = false;
   51|    308|      if (!saved) {
  ------------------
  |  Branch (51:11): [True: 1, False: 307]
  ------------------
   52|      1|        AutoreleaseSet::registerClearFn<&Autorelease<T>::reset>();
   53|      1|        saved = true;
   54|      1|      }
   55|    308|      vals().push_back(x);
   56|    308|    }
_ZN6hobbes14AutoreleaseSet15registerClearFnIXadL_ZNS_11AutoreleaseISt6vectorISt10shared_ptrINS_7PatternEESaIS6_EEE5resetEvEEEEbv:
   20|      1|    static bool registerClearFn() {
   21|      1|      resetFns().push_back(fn);
   22|      1|      return true;
   23|      1|    }
_ZN6hobbes11AutoreleaseISt6vectorISt10shared_ptrINS_7PatternEESaIS4_EEE5resetEv:
   41|     30|    static void reset() {
   42|     30|      Vals& vs = vals();
   43|    338|      for (auto i = vs.begin(); i != vs.end(); ++i) {
  ------------------
  |  Branch (43:33): [True: 308, False: 30]
  ------------------
   44|    308|        delete *i;
   45|    308|      }
   46|     30|      vs.clear();
   47|     30|    }
_ZN6hobbes11AutoreleaseISt6vectorISt10shared_ptrINS_7PatternEESaIS4_EEE4valsEv:
   36|    338|    static Vals& vals() {
   37|    338|      thread_local Vals vs;
   38|    338|      return vs;
   39|    338|    }
_ZN6hobbes11autoreleaseISt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_4ExprEEESaISC_EEEEPT_SG_:
   60|      4|  T* autorelease(T* x) {
   61|      4|    Autorelease<T>::mark(x);
   62|      4|    return x;
   63|      4|  }
_ZN6hobbes11AutoreleaseISt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_4ExprEEESaISC_EEE4markEPSE_:
   49|      4|    static void mark(T* x) {
   50|      4|      thread_local bool saved = false;
   51|      4|      if (!saved) {
  ------------------
  |  Branch (51:11): [True: 1, False: 3]
  ------------------
   52|      1|        AutoreleaseSet::registerClearFn<&Autorelease<T>::reset>();
   53|      1|        saved = true;
   54|      1|      }
   55|      4|      vals().push_back(x);
   56|      4|    }
_ZN6hobbes14AutoreleaseSet15registerClearFnIXadL_ZNS_11AutoreleaseISt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_4ExprEEESaISE_EEE5resetEvEEEEbv:
   20|      1|    static bool registerClearFn() {
   21|      1|      resetFns().push_back(fn);
   22|      1|      return true;
   23|      1|    }
_ZN6hobbes11AutoreleaseISt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_4ExprEEESaISC_EEE5resetEv:
   41|     16|    static void reset() {
   42|     16|      Vals& vs = vals();
   43|     20|      for (auto i = vs.begin(); i != vs.end(); ++i) {
  ------------------
  |  Branch (43:33): [True: 4, False: 16]
  ------------------
   44|      4|        delete *i;
   45|      4|      }
   46|     16|      vs.clear();
   47|     16|    }
_ZN6hobbes11AutoreleaseISt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_4ExprEEESaISC_EEE4valsEv:
   36|     20|    static Vals& vals() {
   37|     20|      thread_local Vals vs;
   38|     20|      return vs;
   39|     20|    }
_ZN6hobbes11autoreleaseISt6vectorINS_4Case7BindingESaIS3_EEEEPT_S7_:
   60|     62|  T* autorelease(T* x) {
   61|     62|    Autorelease<T>::mark(x);
   62|     62|    return x;
   63|     62|  }
_ZN6hobbes11AutoreleaseISt6vectorINS_4Case7BindingESaIS3_EEE4markEPS5_:
   49|     62|    static void mark(T* x) {
   50|     62|      thread_local bool saved = false;
   51|     62|      if (!saved) {
  ------------------
  |  Branch (51:11): [True: 1, False: 61]
  ------------------
   52|      1|        AutoreleaseSet::registerClearFn<&Autorelease<T>::reset>();
   53|      1|        saved = true;
   54|      1|      }
   55|     62|      vals().push_back(x);
   56|     62|    }
_ZN6hobbes14AutoreleaseSet15registerClearFnIXadL_ZNS_11AutoreleaseISt6vectorINS_4Case7BindingESaIS5_EEE5resetEvEEEEbv:
   20|      1|    static bool registerClearFn() {
   21|      1|      resetFns().push_back(fn);
   22|      1|      return true;
   23|      1|    }
_ZN6hobbes11AutoreleaseISt6vectorINS_4Case7BindingESaIS3_EEE5resetEv:
   41|     27|    static void reset() {
   42|     27|      Vals& vs = vals();
   43|     89|      for (auto i = vs.begin(); i != vs.end(); ++i) {
  ------------------
  |  Branch (43:33): [True: 62, False: 27]
  ------------------
   44|     62|        delete *i;
   45|     62|      }
   46|     27|      vs.clear();
   47|     27|    }
_ZN6hobbes11AutoreleaseISt6vectorINS_4Case7BindingESaIS3_EEE4valsEv:
   36|     89|    static Vals& vals() {
   37|     89|      thread_local Vals vs;
   38|     89|      return vs;
   39|     89|    }
_ZN6hobbes11autoreleaseINS_4Case7BindingEEEPT_S4_:
   60|    124|  T* autorelease(T* x) {
   61|    124|    Autorelease<T>::mark(x);
   62|    124|    return x;
   63|    124|  }
_ZN6hobbes11AutoreleaseINS_4Case7BindingEE4markEPS2_:
   49|    124|    static void mark(T* x) {
   50|    124|      thread_local bool saved = false;
   51|    124|      if (!saved) {
  ------------------
  |  Branch (51:11): [True: 1, False: 123]
  ------------------
   52|      1|        AutoreleaseSet::registerClearFn<&Autorelease<T>::reset>();
   53|      1|        saved = true;
   54|      1|      }
   55|    124|      vals().push_back(x);
   56|    124|    }
_ZN6hobbes14AutoreleaseSet15registerClearFnIXadL_ZNS_11AutoreleaseINS_4Case7BindingEE5resetEvEEEEbv:
   20|      1|    static bool registerClearFn() {
   21|      1|      resetFns().push_back(fn);
   22|      1|      return true;
   23|      1|    }
_ZN6hobbes11AutoreleaseINS_4Case7BindingEE5resetEv:
   41|     27|    static void reset() {
   42|     27|      Vals& vs = vals();
   43|    151|      for (auto i = vs.begin(); i != vs.end(); ++i) {
  ------------------
  |  Branch (43:33): [True: 124, False: 27]
  ------------------
   44|    124|        delete *i;
   45|    124|      }
   46|     27|      vs.clear();
   47|     27|    }
_ZN6hobbes11AutoreleaseINS_4Case7BindingEE4valsEv:
   36|    151|    static Vals& vals() {
   37|    151|      thread_local Vals vs;
   38|    151|      return vs;
   39|    151|    }
_ZN6hobbes11autoreleaseISt10shared_ptrINS_8MonoTypeEEEEPT_S5_:
   60|  12.0k|  T* autorelease(T* x) {
   61|  12.0k|    Autorelease<T>::mark(x);
   62|  12.0k|    return x;
   63|  12.0k|  }
_ZN6hobbes11AutoreleaseISt10shared_ptrINS_8MonoTypeEEE4markEPS3_:
   49|  12.0k|    static void mark(T* x) {
   50|  12.0k|      thread_local bool saved = false;
   51|  12.0k|      if (!saved) {
  ------------------
  |  Branch (51:11): [True: 1, False: 12.0k]
  ------------------
   52|      1|        AutoreleaseSet::registerClearFn<&Autorelease<T>::reset>();
   53|      1|        saved = true;
   54|      1|      }
   55|  12.0k|      vals().push_back(x);
   56|  12.0k|    }
_ZN6hobbes14AutoreleaseSet15registerClearFnIXadL_ZNS_11AutoreleaseISt10shared_ptrINS_8MonoTypeEEE5resetEvEEEEbv:
   20|      1|    static bool registerClearFn() {
   21|      1|      resetFns().push_back(fn);
   22|      1|      return true;
   23|      1|    }
_ZN6hobbes11AutoreleaseISt10shared_ptrINS_8MonoTypeEEE5resetEv:
   41|     30|    static void reset() {
   42|     30|      Vals& vs = vals();
   43|  12.0k|      for (auto i = vs.begin(); i != vs.end(); ++i) {
  ------------------
  |  Branch (43:33): [True: 12.0k, False: 30]
  ------------------
   44|  12.0k|        delete *i;
   45|  12.0k|      }
   46|     30|      vs.clear();
   47|     30|    }
_ZN6hobbes11AutoreleaseISt10shared_ptrINS_8MonoTypeEEE4valsEv:
   36|  12.0k|    static Vals& vals() {
   37|  12.0k|      thread_local Vals vs;
   38|  12.0k|      return vs;
   39|  12.0k|    }
_ZN6hobbes11autoreleaseISt6vectorISt10shared_ptrINS_10ConstraintEESaIS4_EEEEPT_S8_:
   60|    523|  T* autorelease(T* x) {
   61|    523|    Autorelease<T>::mark(x);
   62|    523|    return x;
   63|    523|  }
_ZN6hobbes11AutoreleaseISt6vectorISt10shared_ptrINS_10ConstraintEESaIS4_EEE4markEPS6_:
   49|    523|    static void mark(T* x) {
   50|    523|      thread_local bool saved = false;
   51|    523|      if (!saved) {
  ------------------
  |  Branch (51:11): [True: 1, False: 522]
  ------------------
   52|      1|        AutoreleaseSet::registerClearFn<&Autorelease<T>::reset>();
   53|      1|        saved = true;
   54|      1|      }
   55|    523|      vals().push_back(x);
   56|    523|    }
_ZN6hobbes14AutoreleaseSet15registerClearFnIXadL_ZNS_11AutoreleaseISt6vectorISt10shared_ptrINS_10ConstraintEESaIS6_EEE5resetEvEEEEbv:
   20|      1|    static bool registerClearFn() {
   21|      1|      resetFns().push_back(fn);
   22|      1|      return true;
   23|      1|    }
_ZN6hobbes11AutoreleaseISt6vectorISt10shared_ptrINS_10ConstraintEESaIS4_EEE5resetEv:
   41|     30|    static void reset() {
   42|     30|      Vals& vs = vals();
   43|    553|      for (auto i = vs.begin(); i != vs.end(); ++i) {
  ------------------
  |  Branch (43:33): [True: 523, False: 30]
  ------------------
   44|    523|        delete *i;
   45|    523|      }
   46|     30|      vs.clear();
   47|     30|    }
_ZN6hobbes11AutoreleaseISt6vectorISt10shared_ptrINS_10ConstraintEESaIS4_EEE4valsEv:
   36|    553|    static Vals& vals() {
   37|    553|      thread_local Vals vs;
   38|    553|      return vs;
   39|    553|    }
_ZN6hobbes11autoreleaseISt6vectorINS_6Record6MemberESaIS3_EEEEPT_S7_:
   60|     19|  T* autorelease(T* x) {
   61|     19|    Autorelease<T>::mark(x);
   62|     19|    return x;
   63|     19|  }
_ZN6hobbes11AutoreleaseISt6vectorINS_6Record6MemberESaIS3_EEE4markEPS5_:
   49|     19|    static void mark(T* x) {
   50|     19|      thread_local bool saved = false;
   51|     19|      if (!saved) {
  ------------------
  |  Branch (51:11): [True: 1, False: 18]
  ------------------
   52|      1|        AutoreleaseSet::registerClearFn<&Autorelease<T>::reset>();
   53|      1|        saved = true;
   54|      1|      }
   55|     19|      vals().push_back(x);
   56|     19|    }
_ZN6hobbes14AutoreleaseSet15registerClearFnIXadL_ZNS_11AutoreleaseISt6vectorINS_6Record6MemberESaIS5_EEE5resetEvEEEEbv:
   20|      1|    static bool registerClearFn() {
   21|      1|      resetFns().push_back(fn);
   22|      1|      return true;
   23|      1|    }
_ZN6hobbes11AutoreleaseISt6vectorINS_6Record6MemberESaIS3_EEE5resetEv:
   41|     17|    static void reset() {
   42|     17|      Vals& vs = vals();
   43|     36|      for (auto i = vs.begin(); i != vs.end(); ++i) {
  ------------------
  |  Branch (43:33): [True: 19, False: 17]
  ------------------
   44|     19|        delete *i;
   45|     19|      }
   46|     17|      vs.clear();
   47|     17|    }
_ZN6hobbes11AutoreleaseISt6vectorINS_6Record6MemberESaIS3_EEE4valsEv:
   36|     36|    static Vals& vals() {
   37|     36|      thread_local Vals vs;
   38|     36|      return vs;
   39|     36|    }
_ZN6hobbes11autoreleaseISt6vectorINS_7Variant6MemberESaIS3_EEEEPT_S7_:
   60|      2|  T* autorelease(T* x) {
   61|      2|    Autorelease<T>::mark(x);
   62|      2|    return x;
   63|      2|  }
_ZN6hobbes11AutoreleaseISt6vectorINS_7Variant6MemberESaIS3_EEE4markEPS5_:
   49|      2|    static void mark(T* x) {
   50|      2|      thread_local bool saved = false;
   51|      2|      if (!saved) {
  ------------------
  |  Branch (51:11): [True: 1, False: 1]
  ------------------
   52|      1|        AutoreleaseSet::registerClearFn<&Autorelease<T>::reset>();
   53|      1|        saved = true;
   54|      1|      }
   55|      2|      vals().push_back(x);
   56|      2|    }
_ZN6hobbes14AutoreleaseSet15registerClearFnIXadL_ZNS_11AutoreleaseISt6vectorINS_7Variant6MemberESaIS5_EEE5resetEvEEEEbv:
   20|      1|    static bool registerClearFn() {
   21|      1|      resetFns().push_back(fn);
   22|      1|      return true;
   23|      1|    }
_ZN6hobbes11AutoreleaseISt6vectorINS_7Variant6MemberESaIS3_EEE5resetEv:
   41|     17|    static void reset() {
   42|     17|      Vals& vs = vals();
   43|     19|      for (auto i = vs.begin(); i != vs.end(); ++i) {
  ------------------
  |  Branch (43:33): [True: 2, False: 17]
  ------------------
   44|      2|        delete *i;
   45|      2|      }
   46|     17|      vs.clear();
   47|     17|    }
_ZN6hobbes11AutoreleaseISt6vectorINS_7Variant6MemberESaIS3_EEE4valsEv:
   36|     19|    static Vals& vals() {
   37|     19|      thread_local Vals vs;
   38|     19|      return vs;
   39|     19|    }

_ZNK6hobbes7genHashISt5tupleIJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEjEEEclERKSB_:
   42|   176k|    inline size_t operator()(const std::tuple<Ts...>& xs) const {
   43|   176k|      size_t r = 0;
   44|   176k|      hashTuple<0, Ts...>(&r, xs);
   45|   176k|      return r;
   46|   176k|    }
_ZN6hobbes9hashTupleILm0EJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEjEEENSt9enable_ifIXltT_sZT0_EvE4typeEPmRKSt5tupleIJDpT0_EE:
   36|   176k|  inline typename std::enable_if<i < sizeof...(Ts), void>::type hashTuple(std::size_t* r, const std::tuple<Ts...>& ms) {
   37|   176k|    hashAppend(*r, std::get<i>(ms));
   38|   176k|    hashTuple<i+1, Ts...>(r, ms);
   39|   176k|  }
_ZN6hobbes10hashAppendINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEvRmRKT_:
   26|   461k|  inline void hashAppend(std::size_t& seed, const T& x) {
   27|   461k|    genHash<T> hasher;
   28|   461k|    seed ^= hasher(x) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
   29|   461k|  }
_ZNK6hobbes7genHashINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEclERKS6_:
   19|   461k|    inline size_t operator()(const T& x) const {
   20|   461k|      static std::hash<T> h;
   21|   461k|      return h(x);
   22|   461k|    }
_ZN6hobbes9hashTupleILm1EJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEjEEENSt9enable_ifIXltT_sZT0_EvE4typeEPmRKSt5tupleIJDpT0_EE:
   36|   176k|  inline typename std::enable_if<i < sizeof...(Ts), void>::type hashTuple(std::size_t* r, const std::tuple<Ts...>& ms) {
   37|   176k|    hashAppend(*r, std::get<i>(ms));
   38|   176k|    hashTuple<i+1, Ts...>(r, ms);
   39|   176k|  }
_ZN6hobbes10hashAppendISt10shared_ptrINS_8MonoTypeEEEEvRmRKT_:
   26|   340k|  inline void hashAppend(std::size_t& seed, const T& x) {
   27|   340k|    genHash<T> hasher;
   28|   340k|    seed ^= hasher(x) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
   29|   340k|  }
_ZN6hobbes9hashTupleILm2EJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEjEEENSt9enable_ifIXltT_sZT0_EvE4typeEPmRKSt5tupleIJDpT0_EE:
   36|   176k|  inline typename std::enable_if<i < sizeof...(Ts), void>::type hashTuple(std::size_t* r, const std::tuple<Ts...>& ms) {
   37|   176k|    hashAppend(*r, std::get<i>(ms));
   38|   176k|    hashTuple<i+1, Ts...>(r, ms);
   39|   176k|  }
_ZN6hobbes10hashAppendIjEEvRmRKT_:
   26|   177k|  inline void hashAppend(std::size_t& seed, const T& x) {
   27|   177k|    genHash<T> hasher;
   28|   177k|    seed ^= hasher(x) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
   29|   177k|  }
_ZNK6hobbes7genHashIjEclERKj:
   19|   177k|    inline size_t operator()(const T& x) const {
   20|   177k|      static std::hash<T> h;
   21|   177k|      return h(x);
   22|   177k|    }
_ZN6hobbes9hashTupleILm3EJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEjEEENSt9enable_ifIXeqT_sZT0_EvE4typeEPmRKSt5tupleIJDpT0_EE:
   33|   176k|  inline typename std::enable_if<i == sizeof...(Ts), void>::type hashTuple(std::size_t*, const std::tuple<Ts...>&) {
   34|   176k|  }
_ZNK6hobbes7genHashISt5tupleIJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEEEclERKSB_:
   42|  49.8k|    inline size_t operator()(const std::tuple<Ts...>& xs) const {
   43|  49.8k|      size_t r = 0;
   44|  49.8k|      hashTuple<0, Ts...>(&r, xs);
   45|  49.8k|      return r;
   46|  49.8k|    }
_ZN6hobbes9hashTupleILm0EJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEEENSt9enable_ifIXltT_sZT0_EvE4typeEPmRKSt5tupleIJDpT0_EE:
   36|  49.8k|  inline typename std::enable_if<i < sizeof...(Ts), void>::type hashTuple(std::size_t* r, const std::tuple<Ts...>& ms) {
   37|  49.8k|    hashAppend(*r, std::get<i>(ms));
   38|  49.8k|    hashTuple<i+1, Ts...>(r, ms);
   39|  49.8k|  }
_ZN6hobbes9hashTupleILm1EJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEEENSt9enable_ifIXltT_sZT0_EvE4typeEPmRKSt5tupleIJDpT0_EE:
   36|  49.8k|  inline typename std::enable_if<i < sizeof...(Ts), void>::type hashTuple(std::size_t* r, const std::tuple<Ts...>& ms) {
   37|  49.8k|    hashAppend(*r, std::get<i>(ms));
   38|  49.8k|    hashTuple<i+1, Ts...>(r, ms);
   39|  49.8k|  }
_ZN6hobbes9hashTupleILm2EJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEEENSt9enable_ifIXeqT_sZT0_EvE4typeEPmRKSt5tupleIJDpT0_EE:
   33|  49.8k|  inline typename std::enable_if<i == sizeof...(Ts), void>::type hashTuple(std::size_t*, const std::tuple<Ts...>&) {
   34|  49.8k|  }
_ZNK6hobbes7genHashISt5tupleIJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEjbEEEclERKS8_:
   42|    643|    inline size_t operator()(const std::tuple<Ts...>& xs) const {
   43|    643|      size_t r = 0;
   44|    643|      hashTuple<0, Ts...>(&r, xs);
   45|    643|      return r;
   46|    643|    }
_ZN6hobbes9hashTupleILm0EJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEjbEEENSt9enable_ifIXltT_sZT0_EvE4typeEPmRKSt5tupleIJDpT0_EE:
   36|    643|  inline typename std::enable_if<i < sizeof...(Ts), void>::type hashTuple(std::size_t* r, const std::tuple<Ts...>& ms) {
   37|    643|    hashAppend(*r, std::get<i>(ms));
   38|    643|    hashTuple<i+1, Ts...>(r, ms);
   39|    643|  }
_ZN6hobbes9hashTupleILm1EJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEjbEEENSt9enable_ifIXltT_sZT0_EvE4typeEPmRKSt5tupleIJDpT0_EE:
   36|    643|  inline typename std::enable_if<i < sizeof...(Ts), void>::type hashTuple(std::size_t* r, const std::tuple<Ts...>& ms) {
   37|    643|    hashAppend(*r, std::get<i>(ms));
   38|    643|    hashTuple<i+1, Ts...>(r, ms);
   39|    643|  }
_ZN6hobbes9hashTupleILm2EJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEjbEEENSt9enable_ifIXltT_sZT0_EvE4typeEPmRKSt5tupleIJDpT0_EE:
   36|    643|  inline typename std::enable_if<i < sizeof...(Ts), void>::type hashTuple(std::size_t* r, const std::tuple<Ts...>& ms) {
   37|    643|    hashAppend(*r, std::get<i>(ms));
   38|    643|    hashTuple<i+1, Ts...>(r, ms);
   39|    643|  }
_ZN6hobbes10hashAppendIbEEvRmRKT_:
   26|    643|  inline void hashAppend(std::size_t& seed, const T& x) {
   27|    643|    genHash<T> hasher;
   28|    643|    seed ^= hasher(x) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
   29|    643|  }
_ZNK6hobbes7genHashIbEclERKb:
   19|    643|    inline size_t operator()(const T& x) const {
   20|    643|      static std::hash<T> h;
   21|    643|      return h(x);
   22|    643|    }
_ZN6hobbes9hashTupleILm3EJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEjbEEENSt9enable_ifIXeqT_sZT0_EvE4typeEPmRKSt5tupleIJDpT0_EE:
   33|    643|  inline typename std::enable_if<i == sizeof...(Ts), void>::type hashTuple(std::size_t*, const std::tuple<Ts...>&) {
   34|    643|  }
_ZNK6hobbes7genHashISt5tupleIJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEclERKS8_:
   42|   234k|    inline size_t operator()(const std::tuple<Ts...>& xs) const {
   43|   234k|      size_t r = 0;
   44|   234k|      hashTuple<0, Ts...>(&r, xs);
   45|   234k|      return r;
   46|   234k|    }
_ZN6hobbes9hashTupleILm0EJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEENSt9enable_ifIXltT_sZT0_EvE4typeEPmRKSt5tupleIJDpT0_EE:
   36|   234k|  inline typename std::enable_if<i < sizeof...(Ts), void>::type hashTuple(std::size_t* r, const std::tuple<Ts...>& ms) {
   37|   234k|    hashAppend(*r, std::get<i>(ms));
   38|   234k|    hashTuple<i+1, Ts...>(r, ms);
   39|   234k|  }
_ZN6hobbes9hashTupleILm1EJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEENSt9enable_ifIXeqT_sZT0_EvE4typeEPmRKSt5tupleIJDpT0_EE:
   33|   234k|  inline typename std::enable_if<i == sizeof...(Ts), void>::type hashTuple(std::size_t*, const std::tuple<Ts...>&) {
   34|   234k|  }
_ZNK6hobbes7genHashISt5tupleIJiEEEclERKS2_:
   42|  19.5k|    inline size_t operator()(const std::tuple<Ts...>& xs) const {
   43|  19.5k|      size_t r = 0;
   44|  19.5k|      hashTuple<0, Ts...>(&r, xs);
   45|  19.5k|      return r;
   46|  19.5k|    }
_ZN6hobbes9hashTupleILm0EJiEEENSt9enable_ifIXltT_sZT0_EvE4typeEPmRKSt5tupleIJDpT0_EE:
   36|  19.5k|  inline typename std::enable_if<i < sizeof...(Ts), void>::type hashTuple(std::size_t* r, const std::tuple<Ts...>& ms) {
   37|  19.5k|    hashAppend(*r, std::get<i>(ms));
   38|  19.5k|    hashTuple<i+1, Ts...>(r, ms);
   39|  19.5k|  }
_ZN6hobbes10hashAppendIiEEvRmRKT_:
   26|  19.5k|  inline void hashAppend(std::size_t& seed, const T& x) {
   27|  19.5k|    genHash<T> hasher;
   28|  19.5k|    seed ^= hasher(x) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
   29|  19.5k|  }
_ZNK6hobbes7genHashIiEclERKi:
   19|  19.5k|    inline size_t operator()(const T& x) const {
   20|  19.5k|      static std::hash<T> h;
   21|  19.5k|      return h(x);
   22|  19.5k|    }
_ZN6hobbes9hashTupleILm1EJiEEENSt9enable_ifIXeqT_sZT0_EvE4typeEPmRKSt5tupleIJDpT0_EE:
   33|  19.5k|  inline typename std::enable_if<i == sizeof...(Ts), void>::type hashTuple(std::size_t*, const std::tuple<Ts...>&) {
   34|  19.5k|  }
_ZNK6hobbes7genHashISt5tupleIJSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS8_EESt10shared_ptrINS_8MonoTypeEEEEEclERKSE_:
   42|    123|    inline size_t operator()(const std::tuple<Ts...>& xs) const {
   43|    123|      size_t r = 0;
   44|    123|      hashTuple<0, Ts...>(&r, xs);
   45|    123|      return r;
   46|    123|    }
_ZN6hobbes9hashTupleILm0EJSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS7_EESt10shared_ptrINS_8MonoTypeEEEEENSt9enable_ifIXltT_sZT0_EvE4typeEPmRKSt5tupleIJDpT0_EE:
   36|    123|  inline typename std::enable_if<i < sizeof...(Ts), void>::type hashTuple(std::size_t* r, const std::tuple<Ts...>& ms) {
   37|    123|    hashAppend(*r, std::get<i>(ms));
   38|    123|    hashTuple<i+1, Ts...>(r, ms);
   39|    123|  }
_ZN6hobbes10hashAppendISt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS7_EEEEvRmRKT_:
   26|    123|  inline void hashAppend(std::size_t& seed, const T& x) {
   27|    123|    genHash<T> hasher;
   28|    123|    seed ^= hasher(x) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
   29|    123|  }
_ZNK6hobbes7genHashISt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS7_EEEclERKS9_:
   63|    123|    inline size_t operator()(const std::vector<T>& xs) const {
   64|    123|      size_t r = 0;
   65|    123|      hashAppend<size_t>(r, xs.size());
   66|    221|      for (const auto& x : xs) {
  ------------------
  |  Branch (66:26): [True: 221, False: 123]
  ------------------
   67|    221|        hashAppend<T>(r, x);
   68|    221|      }
   69|    123|      return r;
   70|    123|    }
_ZN6hobbes10hashAppendImEEvRmRKT_:
   26|  91.0k|  inline void hashAppend(std::size_t& seed, const T& x) {
   27|  91.0k|    genHash<T> hasher;
   28|  91.0k|    seed ^= hasher(x) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
   29|  91.0k|  }
_ZNK6hobbes7genHashImEclERKm:
   19|  91.0k|    inline size_t operator()(const T& x) const {
   20|  91.0k|      static std::hash<T> h;
   21|  91.0k|      return h(x);
   22|  91.0k|    }
_ZN6hobbes9hashTupleILm1EJSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS7_EESt10shared_ptrINS_8MonoTypeEEEEENSt9enable_ifIXltT_sZT0_EvE4typeEPmRKSt5tupleIJDpT0_EE:
   36|    123|  inline typename std::enable_if<i < sizeof...(Ts), void>::type hashTuple(std::size_t* r, const std::tuple<Ts...>& ms) {
   37|    123|    hashAppend(*r, std::get<i>(ms));
   38|    123|    hashTuple<i+1, Ts...>(r, ms);
   39|    123|  }
_ZN6hobbes9hashTupleILm2EJSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS7_EESt10shared_ptrINS_8MonoTypeEEEEENSt9enable_ifIXeqT_sZT0_EvE4typeEPmRKSt5tupleIJDpT0_EE:
   33|    123|  inline typename std::enable_if<i == sizeof...(Ts), void>::type hashTuple(std::size_t*, const std::tuple<Ts...>&) {
   34|    123|  }
_ZNK6hobbes7genHashISt5tupleIJSt10shared_ptrINS_8MonoTypeEESt6vectorIS4_SaIS4_EEEEEclERKS8_:
   42|  3.82k|    inline size_t operator()(const std::tuple<Ts...>& xs) const {
   43|  3.82k|      size_t r = 0;
   44|  3.82k|      hashTuple<0, Ts...>(&r, xs);
   45|  3.82k|      return r;
   46|  3.82k|    }
_ZN6hobbes9hashTupleILm0EJSt10shared_ptrINS_8MonoTypeEESt6vectorIS3_SaIS3_EEEEENSt9enable_ifIXltT_sZT0_EvE4typeEPmRKSt5tupleIJDpT0_EE:
   36|  3.82k|  inline typename std::enable_if<i < sizeof...(Ts), void>::type hashTuple(std::size_t* r, const std::tuple<Ts...>& ms) {
   37|  3.82k|    hashAppend(*r, std::get<i>(ms));
   38|  3.82k|    hashTuple<i+1, Ts...>(r, ms);
   39|  3.82k|  }
_ZN6hobbes9hashTupleILm1EJSt10shared_ptrINS_8MonoTypeEESt6vectorIS3_SaIS3_EEEEENSt9enable_ifIXltT_sZT0_EvE4typeEPmRKSt5tupleIJDpT0_EE:
   36|  3.82k|  inline typename std::enable_if<i < sizeof...(Ts), void>::type hashTuple(std::size_t* r, const std::tuple<Ts...>& ms) {
   37|  3.82k|    hashAppend(*r, std::get<i>(ms));
   38|  3.82k|    hashTuple<i+1, Ts...>(r, ms);
   39|  3.82k|  }
_ZN6hobbes10hashAppendISt6vectorISt10shared_ptrINS_8MonoTypeEESaIS4_EEEEvRmRKT_:
   26|  3.82k|  inline void hashAppend(std::size_t& seed, const T& x) {
   27|  3.82k|    genHash<T> hasher;
   28|  3.82k|    seed ^= hasher(x) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
   29|  3.82k|  }
_ZNK6hobbes7genHashISt6vectorISt10shared_ptrINS_8MonoTypeEESaIS4_EEEclERKS6_:
   63|  3.82k|    inline size_t operator()(const std::vector<T>& xs) const {
   64|  3.82k|      size_t r = 0;
   65|  3.82k|      hashAppend<size_t>(r, xs.size());
   66|  7.42k|      for (const auto& x : xs) {
  ------------------
  |  Branch (66:26): [True: 7.42k, False: 3.82k]
  ------------------
   67|  7.42k|        hashAppend<T>(r, x);
   68|  7.42k|      }
   69|  3.82k|      return r;
   70|  3.82k|    }
_ZN6hobbes9hashTupleILm2EJSt10shared_ptrINS_8MonoTypeEESt6vectorIS3_SaIS3_EEEEENSt9enable_ifIXeqT_sZT0_EvE4typeEPmRKSt5tupleIJDpT0_EE:
   33|  3.82k|  inline typename std::enable_if<i == sizeof...(Ts), void>::type hashTuple(std::size_t*, const std::tuple<Ts...>&) {
   34|  3.82k|  }
_ZNK6hobbes7genHashISt5tupleIJSt10shared_ptrINS_8MonoTypeEES4_EEEclERKS5_:
   42|  39.4k|    inline size_t operator()(const std::tuple<Ts...>& xs) const {
   43|  39.4k|      size_t r = 0;
   44|  39.4k|      hashTuple<0, Ts...>(&r, xs);
   45|  39.4k|      return r;
   46|  39.4k|    }
_ZN6hobbes9hashTupleILm0EJSt10shared_ptrINS_8MonoTypeEES3_EEENSt9enable_ifIXltT_sZT0_EvE4typeEPmRKSt5tupleIJDpT0_EE:
   36|  39.4k|  inline typename std::enable_if<i < sizeof...(Ts), void>::type hashTuple(std::size_t* r, const std::tuple<Ts...>& ms) {
   37|  39.4k|    hashAppend(*r, std::get<i>(ms));
   38|  39.4k|    hashTuple<i+1, Ts...>(r, ms);
   39|  39.4k|  }
_ZN6hobbes9hashTupleILm1EJSt10shared_ptrINS_8MonoTypeEES3_EEENSt9enable_ifIXltT_sZT0_EvE4typeEPmRKSt5tupleIJDpT0_EE:
   36|  39.4k|  inline typename std::enable_if<i < sizeof...(Ts), void>::type hashTuple(std::size_t* r, const std::tuple<Ts...>& ms) {
   37|  39.4k|    hashAppend(*r, std::get<i>(ms));
   38|  39.4k|    hashTuple<i+1, Ts...>(r, ms);
   39|  39.4k|  }
_ZN6hobbes9hashTupleILm2EJSt10shared_ptrINS_8MonoTypeEES3_EEENSt9enable_ifIXeqT_sZT0_EvE4typeEPmRKSt5tupleIJDpT0_EE:
   33|  39.4k|  inline typename std::enable_if<i == sizeof...(Ts), void>::type hashTuple(std::size_t*, const std::tuple<Ts...>&) {
   34|  39.4k|  }
_ZNK6hobbes7genHashISt5tupleIJSt10shared_ptrINS_8MonoTypeEEEEEclERKS5_:
   42|  23.4k|    inline size_t operator()(const std::tuple<Ts...>& xs) const {
   43|  23.4k|      size_t r = 0;
   44|  23.4k|      hashTuple<0, Ts...>(&r, xs);
   45|  23.4k|      return r;
   46|  23.4k|    }
_ZN6hobbes9hashTupleILm0EJSt10shared_ptrINS_8MonoTypeEEEEENSt9enable_ifIXltT_sZT0_EvE4typeEPmRKSt5tupleIJDpT0_EE:
   36|  23.4k|  inline typename std::enable_if<i < sizeof...(Ts), void>::type hashTuple(std::size_t* r, const std::tuple<Ts...>& ms) {
   37|  23.4k|    hashAppend(*r, std::get<i>(ms));
   38|  23.4k|    hashTuple<i+1, Ts...>(r, ms);
   39|  23.4k|  }
_ZN6hobbes9hashTupleILm1EJSt10shared_ptrINS_8MonoTypeEEEEENSt9enable_ifIXeqT_sZT0_EvE4typeEPmRKSt5tupleIJDpT0_EE:
   33|  23.4k|  inline typename std::enable_if<i == sizeof...(Ts), void>::type hashTuple(std::size_t*, const std::tuple<Ts...>&) {
   34|  23.4k|  }
_ZNK6hobbes7genHashISt5tupleIJSt6vectorINS_7Variant6MemberESaIS4_EEEEEclERKS7_:
   42|  10.5k|    inline size_t operator()(const std::tuple<Ts...>& xs) const {
   43|  10.5k|      size_t r = 0;
   44|  10.5k|      hashTuple<0, Ts...>(&r, xs);
   45|  10.5k|      return r;
   46|  10.5k|    }
_ZN6hobbes9hashTupleILm0EJSt6vectorINS_7Variant6MemberESaIS3_EEEEENSt9enable_ifIXltT_sZT0_EvE4typeEPmRKSt5tupleIJDpT0_EE:
   36|  10.5k|  inline typename std::enable_if<i < sizeof...(Ts), void>::type hashTuple(std::size_t* r, const std::tuple<Ts...>& ms) {
   37|  10.5k|    hashAppend(*r, std::get<i>(ms));
   38|  10.5k|    hashTuple<i+1, Ts...>(r, ms);
   39|  10.5k|  }
_ZN6hobbes10hashAppendISt6vectorINS_7Variant6MemberESaIS3_EEEEvRmRKT_:
   26|  10.5k|  inline void hashAppend(std::size_t& seed, const T& x) {
   27|  10.5k|    genHash<T> hasher;
   28|  10.5k|    seed ^= hasher(x) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
   29|  10.5k|  }
_ZNK6hobbes7genHashISt6vectorINS_7Variant6MemberESaIS3_EEEclERKS5_:
   63|  10.5k|    inline size_t operator()(const std::vector<T>& xs) const {
   64|  10.5k|      size_t r = 0;
   65|  10.5k|      hashAppend<size_t>(r, xs.size());
   66|  21.0k|      for (const auto& x : xs) {
  ------------------
  |  Branch (66:26): [True: 21.0k, False: 10.5k]
  ------------------
   67|  21.0k|        hashAppend<T>(r, x);
   68|  21.0k|      }
   69|  10.5k|      return r;
   70|  10.5k|    }
_ZN6hobbes10hashAppendINS_7Variant6MemberEEEvRmRKT_:
   26|  21.0k|  inline void hashAppend(std::size_t& seed, const T& x) {
   27|  21.0k|    genHash<T> hasher;
   28|  21.0k|    seed ^= hasher(x) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
   29|  21.0k|  }
_ZN6hobbes9hashTupleILm1EJSt6vectorINS_7Variant6MemberESaIS3_EEEEENSt9enable_ifIXeqT_sZT0_EvE4typeEPmRKSt5tupleIJDpT0_EE:
   33|  10.5k|  inline typename std::enable_if<i == sizeof...(Ts), void>::type hashTuple(std::size_t*, const std::tuple<Ts...>&) {
   34|  10.5k|  }
_ZNK6hobbes7genHashISt5tupleIJSt6vectorINS_6Record6MemberESaIS4_EEEEEclERKS7_:
   42|  72.4k|    inline size_t operator()(const std::tuple<Ts...>& xs) const {
   43|  72.4k|      size_t r = 0;
   44|  72.4k|      hashTuple<0, Ts...>(&r, xs);
   45|  72.4k|      return r;
   46|  72.4k|    }
_ZN6hobbes9hashTupleILm0EJSt6vectorINS_6Record6MemberESaIS3_EEEEENSt9enable_ifIXltT_sZT0_EvE4typeEPmRKSt5tupleIJDpT0_EE:
   36|  72.4k|  inline typename std::enable_if<i < sizeof...(Ts), void>::type hashTuple(std::size_t* r, const std::tuple<Ts...>& ms) {
   37|  72.4k|    hashAppend(*r, std::get<i>(ms));
   38|  72.4k|    hashTuple<i+1, Ts...>(r, ms);
   39|  72.4k|  }
_ZN6hobbes10hashAppendISt6vectorINS_6Record6MemberESaIS3_EEEEvRmRKT_:
   26|  72.4k|  inline void hashAppend(std::size_t& seed, const T& x) {
   27|  72.4k|    genHash<T> hasher;
   28|  72.4k|    seed ^= hasher(x) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
   29|  72.4k|  }
_ZNK6hobbes7genHashISt6vectorINS_6Record6MemberESaIS3_EEEclERKS5_:
   63|  72.4k|    inline size_t operator()(const std::vector<T>& xs) const {
   64|  72.4k|      size_t r = 0;
   65|  72.4k|      hashAppend<size_t>(r, xs.size());
   66|   155k|      for (const auto& x : xs) {
  ------------------
  |  Branch (66:26): [True: 155k, False: 72.4k]
  ------------------
   67|   155k|        hashAppend<T>(r, x);
   68|   155k|      }
   69|  72.4k|      return r;
   70|  72.4k|    }
_ZN6hobbes10hashAppendINS_6Record6MemberEEEvRmRKT_:
   26|   155k|  inline void hashAppend(std::size_t& seed, const T& x) {
   27|   155k|    genHash<T> hasher;
   28|   155k|    seed ^= hasher(x) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
   29|   155k|  }
_ZN6hobbes9hashTupleILm1EJSt6vectorINS_6Record6MemberESaIS3_EEEEENSt9enable_ifIXeqT_sZT0_EvE4typeEPmRKSt5tupleIJDpT0_EE:
   33|  72.4k|  inline typename std::enable_if<i == sizeof...(Ts), void>::type hashTuple(std::size_t*, const std::tuple<Ts...>&) {
   34|  72.4k|  }
_ZNK6hobbes7genHashISt5tupleIJlEEEclERKS2_:
   42|  5.80k|    inline size_t operator()(const std::tuple<Ts...>& xs) const {
   43|  5.80k|      size_t r = 0;
   44|  5.80k|      hashTuple<0, Ts...>(&r, xs);
   45|  5.80k|      return r;
   46|  5.80k|    }
_ZN6hobbes9hashTupleILm0EJlEEENSt9enable_ifIXltT_sZT0_EvE4typeEPmRKSt5tupleIJDpT0_EE:
   36|  5.80k|  inline typename std::enable_if<i < sizeof...(Ts), void>::type hashTuple(std::size_t* r, const std::tuple<Ts...>& ms) {
   37|  5.80k|    hashAppend(*r, std::get<i>(ms));
   38|  5.80k|    hashTuple<i+1, Ts...>(r, ms);
   39|  5.80k|  }
_ZN6hobbes10hashAppendIlEEvRmRKT_:
   26|  5.80k|  inline void hashAppend(std::size_t& seed, const T& x) {
   27|  5.80k|    genHash<T> hasher;
   28|  5.80k|    seed ^= hasher(x) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
   29|  5.80k|  }
_ZNK6hobbes7genHashIlEclERKl:
   19|  5.80k|    inline size_t operator()(const T& x) const {
   20|  5.80k|      static std::hash<T> h;
   21|  5.80k|      return h(x);
   22|  5.80k|    }
_ZN6hobbes9hashTupleILm1EJlEEENSt9enable_ifIXeqT_sZT0_EvE4typeEPmRKSt5tupleIJDpT0_EE:
   33|  5.80k|  inline typename std::enable_if<i == sizeof...(Ts), void>::type hashTuple(std::size_t*, const std::tuple<Ts...>&) {
   34|  5.80k|  }
_ZN6hobbes10hashAppendIPvEEvRmRKT_:
   26|  2.35k|  inline void hashAppend(std::size_t& seed, const T& x) {
   27|  2.35k|    genHash<T> hasher;
   28|  2.35k|    seed ^= hasher(x) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
   29|  2.35k|  }
_ZNK6hobbes7genHashIPvEclERKS1_:
   19|  2.35k|    inline size_t operator()(const T& x) const {
   20|  2.35k|      static std::hash<T> h;
   21|  2.35k|      return h(x);
   22|  2.35k|    }
_ZNK6hobbes7genHashISt6vectorINS_10PatternRowESaIS2_EEEclERKS4_:
   63|  1.79k|    inline size_t operator()(const std::vector<T>& xs) const {
   64|  1.79k|      size_t r = 0;
   65|  1.79k|      hashAppend<size_t>(r, xs.size());
   66|  2.35k|      for (const auto& x : xs) {
  ------------------
  |  Branch (66:26): [True: 2.35k, False: 1.79k]
  ------------------
   67|  2.35k|        hashAppend<T>(r, x);
   68|  2.35k|      }
   69|  1.79k|      return r;
   70|  1.79k|    }
_ZN6hobbes10hashAppendINS_10PatternRowEEEvRmRKT_:
   26|  2.35k|  inline void hashAppend(std::size_t& seed, const T& x) {
   27|  2.35k|    genHash<T> hasher;
   28|  2.35k|    seed ^= hasher(x) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
   29|  2.35k|  }
_ZNK6hobbes7genHashINS_10PatternRowEEclERKS1_:
   19|  2.35k|    inline size_t operator()(const T& x) const {
   20|  2.35k|      static std::hash<T> h;
   21|  2.35k|      return h(x);
   22|  2.35k|    }

_ZN6hobbes11withContextIZNS_8voidTypeEvEUlRN4llvm11LLVMContextEE_EEDcT_:
  110|    140|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|    140|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|    140|  return fn(*threadSafeContext().getContext());
  121|    140|#endif
  122|    140|}
_ZN6hobbes11withContextIZNS_8boolTypeEvEUlRN4llvm11LLVMContextEE_EEDcT_:
  110|  1.94k|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|  1.94k|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|  1.94k|  return fn(*threadSafeContext().getContext());
  121|  1.94k|#endif
  122|  1.94k|}
_ZN6hobbes11withContextIZNS_8charTypeEvEUlRN4llvm11LLVMContextEE_EEDcT_:
  110|  1.99k|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|  1.99k|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|  1.99k|  return fn(*threadSafeContext().getContext());
  121|  1.99k|#endif
  122|  1.99k|}
_ZN6hobbes11withContextIZNS_9shortTypeEvEUlRN4llvm11LLVMContextEE_EEDcT_:
  110|    472|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|    472|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|    472|  return fn(*threadSafeContext().getContext());
  121|    472|#endif
  122|    472|}
_ZN6hobbes11withContextIZNS_7intTypeEvEUlRN4llvm11LLVMContextEE_EEDcT_:
  110|    297|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|    297|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|    297|  return fn(*threadSafeContext().getContext());
  121|    297|#endif
  122|    297|}
_ZN6hobbes11withContextIZNS_8longTypeEvEUlRN4llvm11LLVMContextEE_EEDcT_:
  110|    968|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|    968|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|    968|  return fn(*threadSafeContext().getContext());
  121|    968|#endif
  122|    968|}
_ZN6hobbes11withContextIZNS_10int128TypeEvEUlRN4llvm11LLVMContextEE_EEDcT_:
  110|      2|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      2|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      2|  return fn(*threadSafeContext().getContext());
  121|      2|#endif
  122|      2|}
_ZN6hobbes11withContextIZNS_9floatTypeEvEUlRN4llvm11LLVMContextEE_EEDcT_:
  110|      2|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      2|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      2|  return fn(*threadSafeContext().getContext());
  121|      2|#endif
  122|      2|}
_ZN6hobbes11withContextIZNS_10doubleTypeEvEUlRN4llvm11LLVMContextEE_EEDcT_:
  110|      2|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      2|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      2|  return fn(*threadSafeContext().getContext());
  121|      2|#endif
  122|      2|}
_ZN6hobbes11withContextIZNS_16packedRecordTypeERKSt6vectorIPN4llvm4TypeESaIS4_EEEUlRNS2_11LLVMContextEE_EEDcT_:
  110|     66|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|     66|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|     66|  return fn(*threadSafeContext().getContext());
  121|     66|#endif
  122|     66|}
_ZN6hobbes11withContextIZNS_10recordTypeERKSt6vectorIPN4llvm4TypeESaIS4_EEEUlRNS2_11LLVMContextEE_EEDcT_:
  110|    332|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|    332|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|    332|  return fn(*threadSafeContext().getContext());
  121|    332|#endif
  122|    332|}
_ZN6hobbes11withContextIZNS_7civalueEjEUlRN4llvm11LLVMContextEE_EEDcT_:
  110|     19|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|     19|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|     19|  return fn(*threadSafeContext().getContext());
  121|     19|#endif
  122|     19|}
_ZN6hobbes11withContextIZNS_7civalueElEUlRN4llvm11LLVMContextEE_EEDcT_:
  110|      4|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      4|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      4|  return fn(*threadSafeContext().getContext());
  121|      4|#endif
  122|      4|}
_ZN6hobbes17threadSafeContextEv:
  105|  25.1k|inline llvm::orc::ThreadSafeContext& threadSafeContext() {
  106|  25.1k|  static auto c = llvm::orc::ThreadSafeContext(std::make_unique<llvm::LLVMContext>());
  107|  25.1k|  return c;
  108|  25.1k|}
_ZN6hobbes8voidTypeEv:
  129|    140|inline llvm::Type* voidType() {
  130|    140|  return withContext([](llvm::LLVMContext& c) { return llvm::Type::getVoidTy(c); });
  131|    140|}
_ZN6hobbes8boolTypeEv:
  133|  1.94k|inline llvm::Type* boolType() {
  134|  1.94k|  return withContext([](llvm::LLVMContext& c) { return llvm::Type::getInt1Ty(c); });
  135|  1.94k|}
_ZN6hobbes8charTypeEv:
  137|  1.99k|inline llvm::Type* charType() {
  138|  1.99k|  return withContext([](llvm::LLVMContext& c) { return llvm::Type::getInt8Ty(c); });
  139|  1.99k|}
_ZN6hobbes8byteTypeEv:
  141|    627|inline llvm::Type* byteType() {
  142|    627|  return charType();
  143|    627|}
_ZN6hobbes9shortTypeEv:
  145|    472|inline llvm::Type* shortType() {
  146|    472|  return withContext([](llvm::LLVMContext& c) { return llvm::Type::getInt16Ty(c); });
  147|    472|}
_ZN6hobbes7intTypeEv:
  149|    297|inline llvm::Type* intType() {
  150|    297|  return withContext([](llvm::LLVMContext& c) { return llvm::Type::getInt32Ty(c); });
  151|    297|}
_ZN6hobbes8longTypeEv:
  153|    968|inline llvm::Type* longType() {
  154|    968|  return withContext([](llvm::LLVMContext& c) { return llvm::Type::getInt64Ty(c); });
  155|    968|}
_ZN6hobbes10int128TypeEv:
  157|      2|inline llvm::Type* int128Type() {
  158|      2|  return withContext([](llvm::LLVMContext& c) { return llvm::Type::getIntNTy(c, 128); });
  159|      2|}
_ZN6hobbes9floatTypeEv:
  161|      2|inline llvm::Type* floatType() {
  162|      2|  return withContext([](llvm::LLVMContext& c) { return llvm::Type::getFloatTy(c); });
  163|      2|}
_ZN6hobbes10doubleTypeEv:
  165|      2|inline llvm::Type* doubleType() {
  166|      2|  return withContext([](llvm::LLVMContext& c) { return llvm::Type::getDoubleTy(c); });
  167|      2|}
_ZN6hobbes7ptrTypeEPN4llvm4TypeE:
  169|    336|inline llvm::PointerType* ptrType(llvm::Type* ty) {
  170|    336|#if LLVM_VERSION_MAJOR >= 18
  171|    336|  return llvm::PointerType::get(ty->getContext(), 0);
  172|       |#else
  173|       |  return llvm::PointerType::getUnqual(ty);
  174|       |#endif
  175|    336|}
_ZN6hobbes9arrayTypeEPN4llvm4TypeEm:
  177|    410|inline llvm::ArrayType* arrayType(llvm::Type* ty, size_t sz) {
  178|       |  // we can be a little dishonest in describing the type of arrays of unit, since LLVM barfs on arrays of unit
  179|       |  // and we should never need to look at the "data" in an array of unit values _anyway_!
  180|    410|  return llvm::ArrayType::get(ty->isVoidTy() ? boolType() : ty, static_cast<uint64_t>(sz));
  ------------------
  |  Branch (180:31): [True: 2, False: 408]
  ------------------
  181|    410|}
_ZN6hobbes16packedRecordTypeERKSt6vectorIPN4llvm4TypeESaIS3_EE:
  183|     66|inline llvm::StructType* packedRecordType(const Types& tys) {
  184|     66|  return withContext([&tys](llvm::LLVMContext& c) { return llvm::StructType::get(c, tys, true); });
  185|     66|}
_ZN6hobbes10recordTypeERKSt6vectorIPN4llvm4TypeESaIS3_EE:
  187|    332|inline llvm::StructType* recordType(const Types& tys) {
  188|    332|  return withContext([&tys](llvm::LLVMContext& c) { return llvm::StructType::get(c, tys); });
  189|    332|}
_ZN6hobbes10recordTypeEPN4llvm4TypeES2_:
  195|    332|inline llvm::StructType* recordType(llvm::Type* t0, llvm::Type* t1) {
  196|    332|  return recordType(list(t0, t1));
  197|    332|}
_ZN6hobbes12functionTypeERKSt6vectorIPN4llvm4TypeESaIS3_EES3_:
  219|    275|inline llvm::FunctionType* functionType(const Types& argTys, llvm::Type* rty) {
  220|    275|  return llvm::FunctionType::get(rty, argTys, false);
  221|    275|}
_ZN6hobbes12varArrayTypeEPN4llvm4TypeEm:
  223|    305|inline llvm::StructType* varArrayType(llvm::Type* elemty, size_t sz = 1) {
  224|    305|  return recordType(longType(), arrayType(elemty, sz));
  225|    305|}
_ZN6hobbes4castEPN4llvm9IRBuilderINS0_14ConstantFolderENS0_24IRBuilderDefaultInserterEEEPNS0_4TypeEPNS0_5ValueE:
  228|     29|inline llvm::Value* cast(llvm::IRBuilder<>* b, llvm::Type* ty, llvm::Value* v) {
  229|     29|#if LLVM_VERSION_MAJOR >= 18
  230|       |  // with opaque pointers, ptr-to-ptr bitcast is identity
  231|     29|  if (v->getType()->isPointerTy() && ty->isPointerTy())
  ------------------
  |  Branch (231:7): [True: 29, False: 0]
  |  Branch (231:38): [True: 29, False: 0]
  ------------------
  232|     29|    return v;
  233|      0|#endif
  234|      0|  return b->CreateBitCast(v, ty);
  235|     29|}
_ZN6hobbes5ccastEPN4llvm4TypeEPNS0_8ConstantE:
  237|      9|inline llvm::Constant* ccast(llvm::Type* ty, llvm::Constant* v) {
  238|      9|#if LLVM_VERSION_MAJOR >= 18
  239|       |  // with opaque pointers, ptr-to-ptr bitcast is identity
  240|      9|  if (v->getType()->isPointerTy() && ty->isPointerTy())
  ------------------
  |  Branch (240:7): [True: 9, False: 0]
  |  Branch (240:38): [True: 9, False: 0]
  ------------------
  241|      9|    return v;
  242|      0|#endif
  243|      0|  return llvm::ConstantExpr::getBitCast(v, ty);
  244|      9|}
_ZN6hobbes6cvalueEb:
  247|    258|inline llvm::Constant* cvalue(bool x) {
  248|    258|  return llvm::Constant::getIntegerValue(boolType(), llvm::APInt(1, x ? 1 : 0, false));
  ------------------
  |  Branch (248:69): [True: 234, False: 24]
  ------------------
  249|    258|}
_ZN6hobbes6cvalueEc:
  251|    647|inline llvm::Constant* cvalue(char x) {
  252|    647|  return llvm::Constant::getIntegerValue(charType(), llvm::APInt(8, x, true));
  253|    647|}
_ZN6hobbes6cvalueEh:
  255|    137|inline llvm::Constant* cvalue(unsigned char x) {
  256|    137|  return llvm::Constant::getIntegerValue(charType(), llvm::APInt(8, x, false));
  257|    137|}
_ZN6hobbes6cvalueEi:
  263|    129|inline llvm::Constant* cvalue(int x) {
  264|    129|  return llvm::Constant::getIntegerValue(intType(), llvm::APInt(32, x, true));
  265|    129|}
_ZN6hobbes6cvalueEj:
  267|     83|inline llvm::Constant* cvalue(unsigned int x) {
  268|     83|  return llvm::Constant::getIntegerValue(intType(), llvm::APInt(32, x, true));
  269|     83|}
_ZN6hobbes6cvalueEl:
  271|    481|inline llvm::Constant* cvalue(long x) {
  272|    481|  return llvm::Constant::getIntegerValue(longType(), llvm::APInt(64, x, true));
  273|    481|}
_ZN6hobbes7civalueEj:
  321|     19|inline llvm::ConstantInt* civalue(unsigned int x) {
  322|     19|  return withContext([x](llvm::LLVMContext& c) {
  323|     19|    return llvm::ConstantInt::get(llvm::IntegerType::get(c, 32), static_cast<uint64_t>(x));
  324|     19|  });
  325|     19|}
_ZN6hobbes7civalueEl:
  327|      4|inline llvm::ConstantInt* civalue(long x) {
  328|      4|  return withContext([x](llvm::LLVMContext& c) {
  329|      4|    return llvm::ConstantInt::get(llvm::IntegerType::get(c, 64), static_cast<uint64_t>(x));
  330|      4|  });
  331|      4|}
_ZN6hobbes6prepgvEPN4llvm14GlobalVariableEj:
  549|     39|inline llvm::GlobalVariable* prepgv(llvm::GlobalVariable* gv, unsigned int align = sizeof(void*)) {
  550|     39|#if LLVM_VERSION_MAJOR >= 10
  551|     39|  gv->setAlignment(llvm::MaybeAlign(align));
  552|       |#else  
  553|       |  gv->setAlignment(align);
  554|       |#endif
  555|     39|  return gv;
  556|     39|}
_ZN6hobbes8constantEPN4llvm5ValueEb:
  560|     59|inline llvm::Constant* constant(llvm::Value* v, bool globalPtrRefs) {
  561|     59|  if (auto* gv = llvm::dyn_cast<llvm::GlobalVariable>(v)) {
  ------------------
  |  Branch (561:13): [True: 0, False: 59]
  ------------------
  562|      0|    if (gv->isConstant()) {
  ------------------
  |  Branch (562:9): [True: 0, False: 0]
  ------------------
  563|      0|      if (globalPtrRefs) {
  ------------------
  |  Branch (563:11): [True: 0, False: 0]
  ------------------
  564|      0|        return gv;
  565|      0|      } else {
  566|      0|        return gv->hasInitializer() ? gv->getInitializer() : nullptr;
  ------------------
  |  Branch (566:16): [True: 0, False: 0]
  ------------------
  567|      0|      }
  568|      0|    } else {
  569|      0|      return nullptr;
  570|      0|    }
  571|     59|  } else if (auto* c = llvm::dyn_cast<llvm::Constant>(v)) {
  ------------------
  |  Branch (571:20): [True: 36, False: 23]
  ------------------
  572|     36|    return c;
  573|     36|  } else {
  574|     23|    return nullptr;
  575|     23|  }
  576|     59|}
_ZN6hobbes17varArrayConstantsERKSt6vectorIPN4llvm5ValueESaIS3_EEb:
  593|     32|inline Constants varArrayConstants(const Values& vs, bool globalPtrRefs) {
  594|     32|  Constants r;
  595|     34|  for (auto *v : vs) {
  ------------------
  |  Branch (595:16): [True: 34, False: 29]
  ------------------
  596|     34|    if (llvm::Constant* c = constant(v, globalPtrRefs)) {
  ------------------
  |  Branch (596:25): [True: 31, False: 3]
  ------------------
  597|     31|      r.push_back(c);
  598|     31|    } else {
  599|      3|      return Constants();
  600|      3|    }
  601|     34|  }
  602|     29|  return r;
  603|     32|}
_ZN6hobbes10constArrayEPN4llvm6ModuleERKSt6vectorIPNS0_8ConstantESaIS5_EEPNS0_4TypeEb:
  613|     38|inline llvm::Constant* constArray(llvm::Module* m, const Constants& cs, llvm::Type* elemTy, bool boxAsGlobalRefs = false) {
  614|     38|  llvm::ArrayType*  aty  = arrayType(elemTy, cs.size());
  615|     38|  llvm::StructType* saty = varArrayType(elemTy, cs.size());
  616|       |
  617|     38|  long      arrayLen = cs.size();
  618|     38|  Constants ncs      = elemTy->isVoidTy() ? Constants() : cs;
  ------------------
  |  Branch (618:24): [True: 0, False: 38]
  ------------------
  619|       |
  620|     38|  if (boxAsGlobalRefs) {
  ------------------
  |  Branch (620:7): [True: 0, False: 38]
  ------------------
  621|      0|    ncs = liftAsGlobalRefs(m, ncs);
  622|      0|  }
  623|       |
  624|     38|  return llvm::ConstantStruct::get(saty, list<llvm::Constant*>(cvalue(arrayLen), llvm::ConstantArray::get(aty, ncs)));
  625|     38|}
_ZN6hobbes18tryMkConstVarArrayEPN4llvm9IRBuilderINS0_14ConstantFolderENS0_24IRBuilderDefaultInserterEEEPNS0_6ModuleEPNS0_4TypeERKSt6vectorIPNS0_5ValueESaISC_EEb:
  627|     32|inline llvm::Value* tryMkConstVarArray(llvm::IRBuilder<>* b, llvm::Module* m, llvm::Type* elemTy, const Values& vs, bool globalPtrRefs) {
  628|     32|  Constants cs = varArrayConstants(vs, globalPtrRefs);
  629|     32|  if (cs.size() != vs.size()) {
  ------------------
  |  Branch (629:7): [True: 3, False: 29]
  ------------------
  630|      3|    return nullptr;
  631|     29|  } else {
  632|     29|    llvm::StructType* saty = varArrayType(elemTy, cs.size());
  633|     29|    llvm::StructType* caty = varArrayType(elemTy);
  634|       |
  635|     29|    return
  636|     29|      cast(b, ptrType(caty),
  637|     29|        new llvm::GlobalVariable(
  638|     29|          *m,
  639|     29|          saty,
  640|     29|          true,
  641|     29|          llvm::GlobalVariable::InternalLinkage,
  642|     29|          constArray(m, cs, elemTy)
  643|     29|        )
  644|     29|      );
  645|     29|  }
  646|     32|}
_ZN6hobbes7memCopyEPN4llvm9IRBuilderINS0_14ConstantFolderENS0_24IRBuilderDefaultInserterEEEPNS0_5ValueEjS7_jS7_:
  656|     31|inline llvm::Value* memCopy(llvm::IRBuilder<>* b, llvm::Value* dst, uint32_t dstAlign, llvm::Value* src, uint32_t srcAlign, llvm::Value* sz) {
  657|       |#if LLVM_VERSION_MAJOR == 3 || LLVM_VERSION_MAJOR == 4 || LLVM_VERSION_MAJOR == 5 || LLVM_VERSION_MAJOR <= 6
  658|       |  (void)dstAlign;
  659|       |  return b->CreateMemCpy(dst, src, sz, srcAlign);
  660|       |#elif LLVM_VERSION_MAJOR <= 9
  661|       |  return b->CreateMemCpy(dst, dstAlign, src, srcAlign, sz);
  662|       |#else
  663|     31|  return b->CreateMemCpy(dst, llvm::MaybeAlign(dstAlign), src, llvm::MaybeAlign(srcAlign), sz);
  664|     31|#endif
  665|     31|}
_ZN6hobbes7memCopyEPN4llvm9IRBuilderINS0_14ConstantFolderENS0_24IRBuilderDefaultInserterEEEPNS0_5ValueEjS7_jj:
  667|     19|inline llvm::Value* memCopy(llvm::IRBuilder<>* b, llvm::Value* dst, uint32_t dstAlign, llvm::Value* src, uint32_t srcAlign, unsigned int sz) {
  668|     19|  return memCopy(b, dst, dstAlign, src, srcAlign, civalue(sz));
  669|     19|}
_ZN6hobbes17recordUZConstantsERKSt4pairISt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS7_EES1_IPN4llvm5ValueESaISC_EEEPKNS_6RecordE:
  704|     20|inline Constants recordUZConstants(const UnzRecValues& rps, const Record* rty) {
  705|     20|  Constants r;
  706|     25|  for (size_t i = 0; i < rps.second.size(); ++i) {
  ------------------
  |  Branch (706:22): [True: 25, False: 0]
  ------------------
  707|     25|    if (llvm::Constant* c = constant(rps.second[i], is<Array>(rty->member(rps.first[i])) != nullptr)) { // not pretty ...
  ------------------
  |  Branch (707:25): [True: 5, False: 20]
  ------------------
  708|      5|      r.push_back(c);
  709|     20|    } else {
  710|     20|      return Constants();
  711|     20|    }
  712|     25|  }
  713|      0|  return r;
  714|     20|}
_ZN6hobbes16tryMkConstRecordEPN4llvm9IRBuilderINS0_14ConstantFolderENS0_24IRBuilderDefaultInserterEEEPNS0_6ModuleERKSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPNS0_5ValueEESaISI_EEPKNS_6RecordE:
  734|     20|inline llvm::Value* tryMkConstRecord(llvm::IRBuilder<>*, llvm::Module* m, const RecordValue& rv, const Record* rty) {
  735|     20|  Constants crv = recordUZConstants(unzip(rv), rty);
  736|     20|  if (crv.size() != rv.size()) {
  ------------------
  |  Branch (736:7): [True: 20, False: 0]
  ------------------
  737|     20|    return nullptr;
  738|     20|  } else {
  739|      0|    Constants         pcs = mergePadding(crv, rty->alignedMembers());
  740|      0|    llvm::StructType* sty = packedRecordType(types(pcs));
  741|       |
  742|      0|    return prepgv(
  743|      0|      new llvm::GlobalVariable(
  744|      0|        *m,
  745|      0|        sty,
  746|      0|        true,
  747|      0|        llvm::GlobalVariable::InternalLinkage,
  748|      0|        llvm::ConstantStruct::getAnon(pcs, true)
  749|      0|      ),
  750|      0|      1
  751|      0|    );
  752|      0|  }
  753|     20|}
_ZN6hobbes6offsetEPN4llvm9IRBuilderINS0_14ConstantFolderENS0_24IRBuilderDefaultInserterEEEPNS0_4TypeEPNS0_5ValueES9_:
  758|    171|inline llvm::Value* offset(llvm::IRBuilder<>* b, llvm::Type* elemTy, llvm::Value* p, llvm::Value* o0) {
  759|    171|  return b->CreateGEP(elemTy, p, {o0});
  760|    171|}
_ZN6hobbes6offsetEPN4llvm9IRBuilderINS0_14ConstantFolderENS0_24IRBuilderDefaultInserterEEEPNS0_4TypeEPNS0_5ValueEi:
  762|     77|inline llvm::Value* offset(llvm::IRBuilder<>* b, llvm::Type* elemTy, llvm::Value* p, int o0) {
  763|     77|  return offset(b, elemTy, p, cvalue(o0));
  764|     77|}
_ZN6hobbes12structOffsetEPN4llvm9IRBuilderINS0_14ConstantFolderENS0_24IRBuilderDefaultInserterEEEPNS0_4TypeEPNS0_5ValueEj:
  774|    351|inline llvm::Value* structOffset(llvm::IRBuilder<>* b, llvm::Type* structTy, llvm::Value* p, unsigned int fieldOffset) {
  775|    351|  return b->CreateStructGEP(structTy, p, fieldOffset);
  776|    351|}
_ZN6hobbes6fncallEPN4llvm9IRBuilderINS0_14ConstantFolderENS0_24IRBuilderDefaultInserterEEEPNS0_5ValueEPNS0_4TypeERKSt6vectorIS7_SaIS7_EE:
  912|    527|inline llvm::Value* fncall(llvm::IRBuilder<>* b, llvm::Value* vfn, llvm::Type* tfn, const Values& args) {
  913|    527|    (void)tfn;
  914|       |#if LLVM_VERSION_MINOR >= 6 || LLVM_VERSION_MAJOR == 4 || LLVM_VERSION_MAJOR <= 6
  915|       |  llvm::Module* thisMod = b->GetInsertBlock()->getParent()->getParent();
  916|       |
  917|       |  llvm::Function* fn = llvm::dyn_cast<llvm::Function>(vfn);
  918|       |  if (!fn || fn->getParent() == thisMod) {
  919|       |    // same module or local variable, all is well
  920|       |    return b->CreateCall(vfn, args);
  921|       |  } else {
  922|       |    // looks like we're trying to make a call to a function in another module
  923|       |    if (auto newF = cloneFunction(fn, thisMod))
  924|       |      return b->CreateCall(newF, args);
  925|       |    return b->CreateCall(externDecl(fn, thisMod), args);
  926|       |  }
  927|       |#elif LLVM_VERSION_MAJOR <= 10
  928|       |  return b->CreateCall(vfn, args);
  929|       |#elif LLVM_VERSION_MAJOR <= 12
  930|       |  if (auto *ty = llvm::dyn_cast<llvm::FunctionType>(tfn)) {
  931|       |    auto *inst =  b->CreateCall(ty, vfn, args);
  932|       |    if (ty->getReturnType() == boolType()) {
  933|       |      inst->addAttribute(llvm::AttributeList::ReturnIndex, llvm::Attribute::ZExt);
  934|       |    }
  935|       |    return inst;
  936|       |  } else {
  937|       |    throw std::runtime_error("fncall(...) invoked on non-function type (internal error)");
  938|       |  }
  939|       |  return nullptr;
  940|       |#else
  941|    527|  if (auto *ty = llvm::dyn_cast<llvm::FunctionType>(tfn)) {
  ------------------
  |  Branch (941:13): [True: 527, False: 0]
  ------------------
  942|    527|    auto *inst =  b->CreateCall(ty, vfn, args);
  943|    527|    if (ty->getReturnType() == boolType()) {
  ------------------
  |  Branch (943:9): [True: 18, False: 509]
  ------------------
  944|     18|      inst->addRetAttr(llvm::Attribute::ZExt);
  945|     18|    }
  946|    527|    return inst;
  947|    527|  } else {
  948|      0|    throw std::runtime_error("fncall(...) invoked on non-function type (internal error)");
  949|      0|  }
  950|      0|  return nullptr;
  951|    527|#endif
  952|    527|}
_ZN6hobbes22maybeInlineFunctionsInERN4llvm6ModuleE:
  958|      5|inline void maybeInlineFunctionsIn(llvm::Module& m) {
  959|       |  // If there is an IR function in current module is already large (instructions
  960|       |  // > `HOBBES_FUNCTION_INLINE_THRESHOLD`), then keep inlining it makes it even
  961|       |  // larger, 10x larger. We simply stop applying FunctionInlining pass on this
  962|       |  // module in such kinds of scenario.
  963|      5|  static const auto allFunctionsAreSmall = [](const llvm::Module& m) {
  964|      5|    static unsigned fnInliningThreshold = [] {
  965|      5|      const char* v = std::getenv("HOBBES_FUNCTION_INLINE_THRESHOLD");
  966|      5|      if (v == nullptr) {
  967|      5|        return 30'000U; // arbitrarily chosen, but should be conservative enough
  968|      5|      }
  969|      5|      return static_cast<unsigned>(strtoul(v, nullptr, 10));
  970|      5|    }();
  971|       |
  972|       |    // early llvm versions either don't have
  973|       |    // llvm::Function::getInstructionCount() or failed to make it const, so we
  974|       |    // provide our simplified version
  975|      5|    static const auto getFunctionInstructionCount =
  976|      5|        [](const llvm::Function& f) {
  977|      5|          unsigned num = 0;
  978|       |#if LLVM_VERSION_MAJOR < 16
  979|       |          for (const auto& b : f.getBasicBlockList()) {
  980|       |#else
  981|      5|          for (const auto& b : f) {
  982|      5|#endif
  983|      5|            num += b.size();
  984|      5|          }
  985|      5|          return num;
  986|      5|        };
  987|       |
  988|       |    // if any functions in this module has instruction number above threshold,
  989|       |    // then should not inline anything
  990|      5|    return std::none_of(m.begin(), m.end(), [](const llvm::Function& f) {
  991|      5|      return getFunctionInstructionCount(f) > fnInliningThreshold;
  992|      5|    });
  993|      5|  };
  994|       |
  995|      5|  if (allFunctionsAreSmall(m)) {
  ------------------
  |  Branch (995:7): [True: 5, False: 0]
  ------------------
  996|      5|#if LLVM_VERSION_MAJOR >= 18
  997|      5|    llvm::PassBuilder PB;
  998|      5|    llvm::LoopAnalysisManager LAM;
  999|      5|    llvm::FunctionAnalysisManager FAM;
 1000|      5|    llvm::CGSCCAnalysisManager CGAM;
 1001|      5|    llvm::ModuleAnalysisManager MAM;
 1002|      5|    PB.registerModuleAnalyses(MAM);
 1003|      5|    PB.registerCGSCCAnalyses(CGAM);
 1004|      5|    PB.registerFunctionAnalyses(FAM);
 1005|      5|    PB.registerLoopAnalyses(LAM);
 1006|      5|    PB.crossRegisterProxies(LAM, FAM, CGAM, MAM);
 1007|      5|    llvm::ModulePassManager MPM;
 1008|      5|    MPM.addPass(llvm::ModuleInlinerPass());
 1009|      5|    MPM.run(m, MAM);
 1010|       |#else
 1011|       |    auto mpm = llvm::legacy::PassManager();
 1012|       |    mpm.add(llvm::createFunctionInliningPass());
 1013|       |    mpm.run(m);
 1014|       |#endif
 1015|      5|  }
 1016|      5|}
_ZN6hobbes11withContextIZNS_6not_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|      8|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      8|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      8|  return fn(*threadSafeContext().getContext());
  121|      8|#endif
  122|      8|}
_ZN6hobbes11withContextIZNS_7bnot_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|      1|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      1|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      1|  return fn(*threadSafeContext().getContext());
  121|      1|#endif
  122|      1|}
_ZN6hobbes11withContextIZNS_6b2i_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|      1|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      1|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      1|  return fn(*threadSafeContext().getContext());
  121|      1|#endif
  122|      1|}
_ZN6hobbes11withContextIZNS_6b2l_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|      3|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      3|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      3|  return fn(*threadSafeContext().getContext());
  121|      3|#endif
  122|      3|}
_ZN6hobbes11withContextIZNS_6i2d_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|      1|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      1|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      1|  return fn(*threadSafeContext().getContext());
  121|      1|#endif
  122|      1|}
_ZN6hobbes11withContextIZNS_6i2l_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|     24|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|     24|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|     24|  return fn(*threadSafeContext().getContext());
  121|     24|#endif
  122|     24|}
_ZN6hobbes11withContextIZNS_6l2d_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|      1|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      1|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      1|  return fn(*threadSafeContext().getContext());
  121|      1|#endif
  122|      1|}
_ZN6hobbes11withContextIZNS_8l2i16_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|      3|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      3|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      3|  return fn(*threadSafeContext().getContext());
  121|      3|#endif
  122|      3|}
_ZN6hobbes11withContextIZNS_6l2f_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|      1|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      1|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      1|  return fn(*threadSafeContext().getContext());
  121|      1|#endif
  122|      1|}
_ZN6hobbes11withContextIZNS_6s2i_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|      4|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      4|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      4|  return fn(*threadSafeContext().getContext());
  121|      4|#endif
  122|      4|}
_ZN6hobbes11withContextIZNS_6f2d_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|      1|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      1|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      1|  return fn(*threadSafeContext().getContext());
  121|      1|#endif
  122|      1|}
_ZN6hobbes11withContextIZNS_7tl2b_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|      3|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      3|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      3|  return fn(*threadSafeContext().getContext());
  121|      3|#endif
  122|      3|}
_ZN6hobbes11withContextIZNS_7ineg_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|      2|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      2|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      2|  return fn(*threadSafeContext().getContext());
  121|      2|#endif
  122|      2|}
_ZN6hobbes11withContextIZNS_7lneg_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|      2|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      2|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      2|  return fn(*threadSafeContext().getContext());
  121|      2|#endif
  122|      2|}
_ZN6hobbes11withContextIZNS_7clte_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|      2|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      2|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      2|  return fn(*threadSafeContext().getContext());
  121|      2|#endif
  122|      2|}
_ZN6hobbes11withContextIZNS_7cgte_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|      2|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      2|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      2|  return fn(*threadSafeContext().getContext());
  121|      2|#endif
  122|      2|}
_ZN6hobbes11withContextIZNS_6beq_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|      2|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      2|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      2|  return fn(*threadSafeContext().getContext());
  121|      2|#endif
  122|      2|}
_ZN6hobbes11withContextIZNS_6leq_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|     48|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|     48|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|     48|  return fn(*threadSafeContext().getContext());
  121|     48|#endif
  122|     48|}
_ZN6hobbes11withContextIZNS_6llt_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|     48|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|     48|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|     48|  return fn(*threadSafeContext().getContext());
  121|     48|#endif
  122|     48|}
_ZN6hobbes11withContextIZNS_7llte_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|      6|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      6|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      6|  return fn(*threadSafeContext().getContext());
  121|      6|#endif
  122|      6|}
_ZN6hobbes11withContextIZNS_6lgt_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|      7|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      7|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      7|  return fn(*threadSafeContext().getContext());
  121|      7|#endif
  122|      7|}
_ZN6hobbes11withContextIZNS_7lgte_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|     15|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|     15|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|     15|  return fn(*threadSafeContext().getContext());
  121|     15|#endif
  122|     15|}
_ZN6hobbes11withContextIZNS_7bshl_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|      2|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      2|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      2|  return fn(*threadSafeContext().getContext());
  121|      2|#endif
  122|      2|}
_ZN6hobbes11withContextIZNS_8bashr_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|      2|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      2|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      2|  return fn(*threadSafeContext().getContext());
  121|      2|#endif
  122|      2|}
_ZN6hobbes11withContextIZNS_7band_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|      3|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      3|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      3|  return fn(*threadSafeContext().getContext());
  121|      3|#endif
  122|      3|}
_ZN6hobbes11withContextIZNS_6bor_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|      1|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      1|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      1|  return fn(*threadSafeContext().getContext());
  121|      1|#endif
  122|      1|}
_ZN6hobbes11withContextIZNS_7cadd_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|      2|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      2|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      2|  return fn(*threadSafeContext().getContext());
  121|      2|#endif
  122|      2|}
_ZN6hobbes11withContextIZNS_7csub_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|      2|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      2|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      2|  return fn(*threadSafeContext().getContext());
  121|      2|#endif
  122|      2|}
_ZN6hobbes11withContextIZNS_7isub_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|      1|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      1|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      1|  return fn(*threadSafeContext().getContext());
  121|      1|#endif
  122|      1|}
_ZN6hobbes11withContextIZNS_7ladd_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|     80|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|     80|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|     80|  return fn(*threadSafeContext().getContext());
  121|     80|#endif
  122|     80|}
_ZN6hobbes11withContextIZNS_7lsub_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|     20|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|     20|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|     20|  return fn(*threadSafeContext().getContext());
  121|     20|#endif
  122|     20|}
_ZN6hobbes11withContextIZNS_7lmul_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|     12|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|     12|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|     12|  return fn(*threadSafeContext().getContext());
  121|     12|#endif
  122|     12|}
_ZN6hobbes11withContextIZNS_7ldiv_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|      5|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      5|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      5|  return fn(*threadSafeContext().getContext());
  121|      5|#endif
  122|      5|}
_ZN6hobbes11withContextIZNS_7lrem_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|      1|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      1|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      1|  return fn(*threadSafeContext().getContext());
  121|      1|#endif
  122|      1|}
_ZN6hobbes11withContextIZNS_7fsub_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|      1|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      1|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      1|  return fn(*threadSafeContext().getContext());
  121|      1|#endif
  122|      1|}
_ZN6hobbes11withContextIZNS_7fmul_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|      1|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      1|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      1|  return fn(*threadSafeContext().getContext());
  121|      1|#endif
  122|      1|}
_ZN6hobbes11withContextIZNS_7fdiv_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|      1|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      1|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      1|  return fn(*threadSafeContext().getContext());
  121|      1|#endif
  122|      1|}
_ZN6hobbes11withContextIZNS_7dsub_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|      1|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      1|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      1|  return fn(*threadSafeContext().getContext());
  121|      1|#endif
  122|      1|}
_ZN6hobbes11withContextIZNS_7dmul_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|      1|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      1|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      1|  return fn(*threadSafeContext().getContext());
  121|      1|#endif
  122|      1|}
_ZN6hobbes11withContextIZNS_7ddiv_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|      1|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      1|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      1|  return fn(*threadSafeContext().getContext());
  121|      1|#endif
  122|      1|}
_ZN6hobbes11withContextIZNS_5ifexp5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRN4llvm11LLVMContextEE_EEDcT_:
  110|    132|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|    132|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|    132|  return fn(*threadSafeContext().getContext());
  121|    132|#endif
  122|    132|}
_ZZN6hobbes8boolTypeEvENKUlRN4llvm11LLVMContextEE_clES2_:
  134|  1.94k|  return withContext([](llvm::LLVMContext& c) { return llvm::Type::getInt1Ty(c); });
_ZN6hobbes11withContextIZNS_7castexp5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E0_EEDcSK_:
  110|     96|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|     96|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|     96|  return fn(*threadSafeContext().getContext());
  121|     96|#endif
  122|     96|}
_ZN6hobbes11withContextIZNS_10newArrayfn5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|     30|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|     30|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|     30|  return fn(*threadSafeContext().getContext());
  121|     30|#endif
  122|     30|}
_ZZN6hobbes8longTypeEvENKUlRN4llvm11LLVMContextEE_clES2_:
  154|    968|  return withContext([](llvm::LLVMContext& c) { return llvm::Type::getInt64Ty(c); });
_ZN6hobbes11withContextIZNS_10newArrayfn5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E0_EEDcSK_:
  110|     30|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|     30|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|     30|  return fn(*threadSafeContext().getContext());
  121|     30|#endif
  122|     30|}
_ZZN6hobbes10recordTypeERKSt6vectorIPN4llvm4TypeESaIS3_EEENKUlRNS1_11LLVMContextEE_clES9_:
  188|    332|  return withContext([&tys](llvm::LLVMContext& c) { return llvm::StructType::get(c, tys); });
_ZN6hobbes11withContextIZNS_7alenexp5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|     70|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|     70|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|     70|  return fn(*threadSafeContext().getContext());
  121|     70|#endif
  122|     70|}
_ZN6hobbes11withContextIZNS_10aconcatexp5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|      6|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      6|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      6|  return fn(*threadSafeContext().getContext());
  121|      6|#endif
  122|      6|}
_ZZN6hobbes7intTypeEvENKUlRN4llvm11LLVMContextEE_clES2_:
  150|    297|  return withContext([](llvm::LLVMContext& c) { return llvm::Type::getInt32Ty(c); });
_ZZN6hobbes8charTypeEvENKUlRN4llvm11LLVMContextEE_clES2_:
  138|  1.99k|  return withContext([](llvm::LLVMContext& c) { return llvm::Type::getInt8Ty(c); });
_ZN6hobbes11withContextIZNS_9packLongF5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|      8|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      8|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      8|  return fn(*threadSafeContext().getContext());
  121|      8|#endif
  122|      8|}
_ZZN6hobbes9shortTypeEvENKUlRN4llvm11LLVMContextEE_clES2_:
  146|    472|  return withContext([](llvm::LLVMContext& c) { return llvm::Type::getInt16Ty(c); });
_ZN6hobbes11withContextIZNS_10cptrrefbyF5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS7_EERKS7_RKS4_IS5_INS_4ExprEESaISF_EEEUlRT_E_EEDcSK_:
  110|      6|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      6|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      6|  return fn(*threadSafeContext().getContext());
  121|      6|#endif
  122|      6|}
jitcc.C:_ZN6hobbes11withContextIZNS_12ConstantList12loadConstantEN4llvm9StringRefERNS2_6ModuleERNS2_9IRBuilderINS2_14ConstantFolderENS2_24IRBuilderDefaultInserterEEEE3$_0EEDcT_:
  110|     35|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|     35|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|     35|  return fn(*threadSafeContext().getContext());
  121|     35|#endif
  122|     35|}
jitcc.C:_ZN6hobbes11withContextIZNS_5jitccC1ERKSt10shared_ptrINS_4TEnvEEE3$_0EEDcT_:
  110|      1|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      1|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      1|  return fn(*threadSafeContext().getContext());
  121|      1|#endif
  122|      1|}
jitcc.C:_ZN6hobbes11withContextIZNS_5jitcc6moduleEvE3$_0EEDcT_:
  110|      5|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      5|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      5|  return fn(*threadSafeContext().getContext());
  121|      5|#endif
  122|      5|}
jitcc.C:_ZN6hobbes11withContextIZNS_5jitcc14getMachineCodeEPN4llvm8FunctionEPNS2_16JITEventListenerEE3$_0EEDcT_:
  110|      5|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      5|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      5|  return fn(*threadSafeContext().getContext());
  121|      5|#endif
  122|      5|}
jitcc.C:_ZN6hobbes11withContextIZNS_5jitcc10bindGlobalERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_8MonoTypeEEPvE3$_0EEDcT_:
  110|    124|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|    124|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|    124|  return fn(*threadSafeContext().getContext());
  121|    124|#endif
  122|    124|}
jitcc.C:_ZN6hobbes11withContextIZNS_5jitcc10bindGlobalERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_8MonoTypeEEPvE3$_1EEDcT_:
  110|      2|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      2|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      2|  return fn(*threadSafeContext().getContext());
  121|      2|#endif
  122|      2|}
jitcc.C:_ZN6hobbes11withContextIZNS_5jitcc15lookupGlobalVarERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE3$_0EEDcT_:
  110|     99|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|     99|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|     99|  return fn(*threadSafeContext().getContext());
  121|     99|#endif
  122|     99|}
jitcc.C:_ZN6hobbes11withContextIZNS_5jitcc12loadConstantERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE3$_0EEDcT_:
  110|     39|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|     39|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|     39|  return fn(*threadSafeContext().getContext());
  121|     39|#endif
  122|     39|}
jitcc.C:_ZN6hobbes11withContextIZNS_5jitcc12defineGlobalERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_4ExprEEE3$_0EEDcT_:
  110|    134|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|    134|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|    134|  return fn(*threadSafeContext().getContext());
  121|    134|#endif
  122|    134|}
jitcc.C:_ZN6hobbes11withContextIZNS_5jitcc12defineGlobalERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_4ExprEEE3$_1EEDcT_:
  110|     12|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|     12|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|     12|  return fn(*threadSafeContext().getContext());
  121|     12|#endif
  122|     12|}
jitcc.C:_ZN6hobbes11withContextIZNS_5jitcc12defineGlobalERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_4ExprEEE3$_2EEDcT_:
  110|      2|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      2|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      2|  return fn(*threadSafeContext().getContext());
  121|      2|#endif
  122|      2|}
jitcc.C:_ZN6hobbes11withContextIZNS_5jitcc12defineGlobalERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_4ExprEEE3$_3EEDcT_:
  110|      2|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      2|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      2|  return fn(*threadSafeContext().getContext());
  121|      2|#endif
  122|      2|}
jitcc.C:_ZN6hobbes11withContextIZNS_5jitcc12defineGlobalERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_4ExprEEE3$_5EEDcT_:
  110|      2|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      2|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      2|  return fn(*threadSafeContext().getContext());
  121|      2|#endif
  122|      2|}
jitcc.C:_ZN6hobbes11withContextIZNS_5jitcc9lookupVarERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_8MonoTypeEEE3$_0EEDcT_:
  110|  1.81k|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|  1.81k|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|  1.81k|  return fn(*threadSafeContext().getContext());
  121|  1.81k|#endif
  122|  1.81k|}
jitcc.C:_ZN6hobbes11withContextIZNS_5jitcc9lookupVarERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_8MonoTypeEEE3$_1EEDcT_:
  110|      2|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      2|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      2|  return fn(*threadSafeContext().getContext());
  121|      2|#endif
  122|      2|}
jitcc.C:_ZN6hobbes11withContextIZNS_5jitcc14lookupFunctionERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE3$_0EEDcT_:
  110|    275|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|    275|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|    275|  return fn(*threadSafeContext().getContext());
  121|    275|#endif
  122|    275|}
jitcc.C:_ZN6hobbes11withContextIZNS_5jitcc22unsafeCompileFunctionsEPSt6vectorINS1_3UCFESaIS3_EEE3$_0EEDcT_:
  110|    205|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|    205|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|    205|  return fn(*threadSafeContext().getContext());
  121|    205|#endif
  122|    205|}
jitcc.C:_ZN6hobbes11withContextIZNS_5jitcc22unsafeCompileFunctionsEPSt6vectorINS1_3UCFESaIS3_EEE3$_1EEDcT_:
  110|    308|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|    308|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|    308|  return fn(*threadSafeContext().getContext());
  121|    308|#endif
  122|    308|}
jitcc.C:_ZN6hobbes11withContextIZNS_5jitcc22unsafeCompileFunctionsEPSt6vectorINS1_3UCFESaIS3_EEE3$_2EEDcT_:
  110|    308|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|    308|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|    308|  return fn(*threadSafeContext().getContext());
  121|    308|#endif
  122|    308|}
jitcc.C:_ZN6hobbes11withContextIZNS_5jitcc22unsafeCompileFunctionsEPSt6vectorINS1_3UCFESaIS3_EEE3$_4EEDcT_:
  110|    308|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|    308|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|    308|  return fn(*threadSafeContext().getContext());
  121|    308|#endif
  122|    308|}
jitcc.C:_ZN6hobbes11withContextIZNS_5jitcc16compileAllocStmtEPN4llvm5ValueES4_PNS2_4TypeEbE3$_0EEDcT_:
  110|    127|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|    127|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|    127|  return fn(*threadSafeContext().getContext());
  121|    127|#endif
  122|    127|}
jitcc.C:_ZN6hobbes11withContextIZNS_5jitcc13allocFunctionERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaISD_EERKSD_E3$_0EEDcT_:
  110|    310|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|    310|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|    310|  return fn(*threadSafeContext().getContext());
  121|    310|#endif
  122|    310|}
jitcc.C:_ZN6hobbes11withContextIZNS_5jitcc13allocFunctionERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaISD_EERKSD_E3$_1EEDcT_:
  110|    169|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|    169|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|    169|  return fn(*threadSafeContext().getContext());
  121|    169|#endif
  122|    169|}
jitcc.C:_ZN6hobbes11withContextIZNS_11compileArgsEPNS_5jitccERKSt6vectorISt10shared_ptrINS_4ExprEESaIS6_EEE3$_0EEDcT_:
  110|    270|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|    270|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|    270|  return fn(*threadSafeContext().getContext());
  121|    270|#endif
  122|    270|}
_ZZN6hobbes22maybeInlineFunctionsInERN4llvm6ModuleEENKUlRKS1_E_clES4_:
  963|      5|  static const auto allFunctionsAreSmall = [](const llvm::Module& m) {
  964|      5|    static unsigned fnInliningThreshold = [] {
  965|      5|      const char* v = std::getenv("HOBBES_FUNCTION_INLINE_THRESHOLD");
  966|      5|      if (v == nullptr) {
  967|      5|        return 30'000U; // arbitrarily chosen, but should be conservative enough
  968|      5|      }
  969|      5|      return static_cast<unsigned>(strtoul(v, nullptr, 10));
  970|      5|    }();
  971|       |
  972|       |    // early llvm versions either don't have
  973|       |    // llvm::Function::getInstructionCount() or failed to make it const, so we
  974|       |    // provide our simplified version
  975|      5|    static const auto getFunctionInstructionCount =
  976|      5|        [](const llvm::Function& f) {
  977|      5|          unsigned num = 0;
  978|       |#if LLVM_VERSION_MAJOR < 16
  979|       |          for (const auto& b : f.getBasicBlockList()) {
  980|       |#else
  981|      5|          for (const auto& b : f) {
  982|      5|#endif
  983|      5|            num += b.size();
  984|      5|          }
  985|      5|          return num;
  986|      5|        };
  987|       |
  988|       |    // if any functions in this module has instruction number above threshold,
  989|       |    // then should not inline anything
  990|      5|    return std::none_of(m.begin(), m.end(), [](const llvm::Function& f) {
  991|      5|      return getFunctionInstructionCount(f) > fnInliningThreshold;
  992|      5|    });
  993|      5|  };
_ZZZN6hobbes22maybeInlineFunctionsInERN4llvm6ModuleEENKUlRKS1_E_clES4_ENKUlvE_clEv:
  964|      1|    static unsigned fnInliningThreshold = [] {
  965|      1|      const char* v = std::getenv("HOBBES_FUNCTION_INLINE_THRESHOLD");
  966|      1|      if (v == nullptr) {
  ------------------
  |  Branch (966:11): [True: 1, False: 0]
  ------------------
  967|      1|        return 30'000U; // arbitrarily chosen, but should be conservative enough
  968|      1|      }
  969|      0|      return static_cast<unsigned>(strtoul(v, nullptr, 10));
  970|      1|    }();
_ZZZN6hobbes22maybeInlineFunctionsInERN4llvm6ModuleEENKUlRKS1_E_clES4_ENKUlRKNS0_8FunctionEE0_clES8_:
  990|    373|    return std::none_of(m.begin(), m.end(), [](const llvm::Function& f) {
  991|    373|      return getFunctionInstructionCount(f) > fnInliningThreshold;
  992|    373|    });
_ZZZN6hobbes22maybeInlineFunctionsInERN4llvm6ModuleEENKUlRKS1_E_clES4_ENKUlRKNS0_8FunctionEE_clES8_:
  976|    373|        [](const llvm::Function& f) {
  977|    373|          unsigned num = 0;
  978|       |#if LLVM_VERSION_MAJOR < 16
  979|       |          for (const auto& b : f.getBasicBlockList()) {
  980|       |#else
  981|    626|          for (const auto& b : f) {
  ------------------
  |  Branch (981:30): [True: 626, False: 373]
  ------------------
  982|    626|#endif
  983|    626|            num += b.size();
  984|    626|          }
  985|    373|          return num;
  986|    373|        };
orcjitcc.C:_ZN6hobbes11withContextIZNS_6ORCJIT9addModuleESt10unique_ptrIN4llvm6ModuleESt14default_deleteIS4_EEE3$_0EEDcT_:
  110|      5|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      5|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      5|  return fn(*threadSafeContext().getContext());
  121|      5|#endif
  122|      5|}
_ZZN6hobbes7civalueEjENKUlRN4llvm11LLVMContextEE_clES2_:
  322|     19|  return withContext([x](llvm::LLVMContext& c) {
  323|     19|    return llvm::ConstantInt::get(llvm::IntegerType::get(c, 32), static_cast<uint64_t>(x));
  324|     19|  });
_ZZN6hobbes7civalueElENKUlRN4llvm11LLVMContextEE_clES2_:
  328|      4|  return withContext([x](llvm::LLVMContext& c) {
  329|      4|    return llvm::ConstantInt::get(llvm::IntegerType::get(c, 64), static_cast<uint64_t>(x));
  330|      4|  });
_ZZN6hobbes10int128TypeEvENKUlRN4llvm11LLVMContextEE_clES2_:
  158|      2|  return withContext([](llvm::LLVMContext& c) { return llvm::Type::getIntNTy(c, 128); });
_ZN6hobbes11withContextIZNKS_11compileExpF4withEPKNS_3AppEEUlRT_E_EEDcS5_:
  110|    347|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|    347|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|    347|  return fn(*threadSafeContext().getContext());
  121|    347|#endif
  122|    347|}
_ZN6hobbes11withContextIZNKS_11compileExpF10compileRefERKSt10shared_ptrINS_4ExprEEEUlRT_E_EEDcS7_:
  110|      2|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      2|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      2|  return fn(*threadSafeContext().getContext());
  121|      2|#endif
  122|      2|}
_ZN6hobbes11withContextIZNKS_11compileExpF10compileRefERKSt10shared_ptrINS_4ExprEEEUlRT_E0_EEDcS7_:
  110|     33|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|     33|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|     33|  return fn(*threadSafeContext().getContext());
  121|     33|#endif
  122|     33|}
_ZN6hobbes11withContextIZNKS_11compileExpF10compileRefERKSt10shared_ptrINS_4ExprEEEUlRT_E1_EEDcS7_:
  110|     33|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|     33|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|     33|  return fn(*threadSafeContext().getContext());
  121|     33|#endif
  122|     33|}
_ZN6hobbes11withContextIZNKS_11compileExpF14structFieldPtrEPN4llvm5ValueEjPNS2_4TypeEEUlRT_E_EEDcS7_:
  110|    127|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|    127|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|    127|  return fn(*threadSafeContext().getContext());
  121|    127|#endif
  122|    127|}
_ZN6hobbes11withContextIZNKS_11compileExpF4withEPKNS_6AssignEEUlRT_E_EEDcS5_:
  110|     38|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|     38|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|     38|  return fn(*threadSafeContext().getContext());
  121|     38|#endif
  122|     38|}
_ZN6hobbes11withContextIZNKS_11compileExpF17compileConstArrayERKSt10shared_ptrINS_8MonoTypeEERKSt6vectorIPN4llvm5ValueESaISA_EEEUlRT_E_EEDcSF_:
  110|     32|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|     32|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|     32|  return fn(*threadSafeContext().getContext());
  121|     32|#endif
  122|     32|}
_ZN6hobbes11withContextIZNKS_11compileExpF4withEPKNS_7MkArrayEEUlRT_E_EEDcS5_:
  110|      3|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      3|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      3|  return fn(*threadSafeContext().getContext());
  121|      3|#endif
  122|      3|}
_ZN6hobbes11withContextIZNKS_11compileExpF4withEPKNS_9MkVariantEEUlRT_E0_EEDcS5_:
  110|     66|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|     66|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|     66|  return fn(*threadSafeContext().getContext());
  121|     66|#endif
  122|     66|}
_ZN6hobbes11withContextIZNKS_11compileExpF18compileConstRecordERKSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPN4llvm5ValueEESaISD_EEPKNS_6RecordEEUlRT_E_EEDcSL_:
  110|     20|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|     20|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|     20|  return fn(*threadSafeContext().getContext());
  121|     20|#endif
  122|     20|}
_ZZN6hobbes16packedRecordTypeERKSt6vectorIPN4llvm4TypeESaIS3_EEENKUlRNS1_11LLVMContextEE_clES9_:
  184|     66|  return withContext([&tys](llvm::LLVMContext& c) { return llvm::StructType::get(c, tys, true); });
_ZN6hobbes11withContextIZNKS_11compileExpF4withEPKNS_8MkRecordEEUlRT_E_EEDcS5_:
  110|     48|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|     48|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|     48|  return fn(*threadSafeContext().getContext());
  121|     48|#endif
  122|     48|}
_ZN6hobbes11withContextIZNKS_11compileExpF4withEPKNS_6AIndexEEUlRT_E_EEDcS5_:
  110|     49|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|     49|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|     49|  return fn(*threadSafeContext().getContext());
  121|     49|#endif
  122|     49|}
_ZN6hobbes11withContextIZNKS_11compileExpF4withEPKNS_4CaseEEUlRT_E_EEDcS5_:
  110|     17|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|     17|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|     17|  return fn(*threadSafeContext().getContext());
  121|     17|#endif
  122|     17|}
_ZN6hobbes11withContextIZNKS_11compileExpF4withEPKNS_4CaseEEUlRT_E0_EEDcS5_:
  110|     17|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|     17|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|     17|  return fn(*threadSafeContext().getContext());
  121|     17|#endif
  122|     17|}
_ZN6hobbes11withContextIZNKS_11compileExpF4withEPKNS_4CaseEEUlRT_E1_EEDcS5_:
  110|     17|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|     17|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|     17|  return fn(*threadSafeContext().getContext());
  121|     17|#endif
  122|     17|}
_ZN6hobbes11withContextIZNKS_11compileExpF4withEPKNS_4CaseEEUlRN4llvm11LLVMContextEE_EEDcT_:
  110|     17|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|     17|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|     17|  return fn(*threadSafeContext().getContext());
  121|     17|#endif
  122|     17|}
_ZN6hobbes11withContextIZNKS_11compileExpF4withEPKNS_4CaseEEUlRN4llvm11LLVMContextEE0_EEDcT_:
  110|     17|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|     17|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|     17|  return fn(*threadSafeContext().getContext());
  121|     17|#endif
  122|     17|}
_ZN6hobbes11withContextIZNKS_11compileExpF4withEPKNS_4CaseEEUlRT_E2_EEDcS5_:
  110|     17|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|     17|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|     17|  return fn(*threadSafeContext().getContext());
  121|     17|#endif
  122|     17|}
_ZN6hobbes11withContextIZNKS_11compileExpF4withEPKNS_4CaseEEUlRN4llvm11LLVMContextEE1_EEDcT_:
  110|     34|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|     34|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|     34|  return fn(*threadSafeContext().getContext());
  121|     34|#endif
  122|     34|}
_ZN6hobbes11withContextIZNKS_11compileExpF4withEPKNS_4CaseEEUlRT_E3_EEDcS5_:
  110|     17|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|     17|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|     17|  return fn(*threadSafeContext().getContext());
  121|     17|#endif
  122|     17|}
_ZN6hobbes11withContextIZNKS_11compileExpF4withEPKNS_6SwitchEEUlRT_E_EEDcS5_:
  110|      2|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      2|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      2|  return fn(*threadSafeContext().getContext());
  121|      2|#endif
  122|      2|}
_ZN6hobbes11withContextIZNKS_11compileExpF4withEPKNS_6SwitchEEUlRN4llvm11LLVMContextEE_EEDcT_:
  110|      2|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      2|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      2|  return fn(*threadSafeContext().getContext());
  121|      2|#endif
  122|      2|}
_ZN6hobbes11withContextIZNKS_11compileExpF4withEPKNS_6SwitchEEUlRN4llvm11LLVMContextEE0_EEDcT_:
  110|      2|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      2|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      2|  return fn(*threadSafeContext().getContext());
  121|      2|#endif
  122|      2|}
_ZN6hobbes11withContextIZNKS_11compileExpF4withEPKNS_6SwitchEEUlRT_E0_EEDcS5_:
  110|      2|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      2|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      2|  return fn(*threadSafeContext().getContext());
  121|      2|#endif
  122|      2|}
_ZN6hobbes11withContextIZNKS_11compileExpF4withEPKNS_6SwitchEEUlRT_E1_EEDcS5_:
  110|      2|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      2|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      2|  return fn(*threadSafeContext().getContext());
  121|      2|#endif
  122|      2|}
_ZN6hobbes11withContextIZNKS_11compileExpF4withEPKNS_4ProjEEUlRT_E_EEDcS5_:
  110|     76|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|     76|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|     76|  return fn(*threadSafeContext().getContext());
  121|     76|#endif
  122|     76|}
_ZN6hobbes11withContextIZNKS_11compileExpF4withEPKNS_4PackEEUlRT_E_EEDcS5_:
  110|      5|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      5|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      5|  return fn(*threadSafeContext().getContext());
  121|      5|#endif
  122|      5|}
_ZN6hobbes11withContextIZNKS_16compileConstExpF4withEPKNS_7MkArrayEEUlRT_E_EEDcS5_:
  110|      9|template <typename Fn> auto withContext(Fn fn) -> decltype(auto) {
  111|       |#if LLVM_VERSION_MAJOR >= 21
  112|       |  return threadSafeContext().withContextDo([&](llvm::LLVMContext *ctx) {
  113|       |    return fn(*ctx);
  114|       |  });
  115|       |#else
  116|      9|  auto lk = threadSafeContext().getLock();
  117|       |#if LLVM_VERSION_MAJOR == 16
  118|       |  threadSafeContext().getContext()->setOpaquePointers(false);
  119|       |#endif
  120|      9|  return fn(*threadSafeContext().getContext());
  121|      9|#endif
  122|      9|}
_ZZN6hobbes8voidTypeEvENKUlRN4llvm11LLVMContextEE_clES2_:
  130|    140|  return withContext([](llvm::LLVMContext& c) { return llvm::Type::getVoidTy(c); });
_ZZN6hobbes9floatTypeEvENKUlRN4llvm11LLVMContextEE_clES2_:
  162|      2|  return withContext([](llvm::LLVMContext& c) { return llvm::Type::getFloatTy(c); });
_ZZN6hobbes10doubleTypeEvENKUlRN4llvm11LLVMContextEE_clES2_:
  166|      2|  return withContext([](llvm::LLVMContext& c) { return llvm::Type::getDoubleTy(c); });

_ZN6hobbes5rcastIPvPFbRNS_7storage11TransactionElEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFPKhRNS_7storage11TransactionElEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFPKhRNS_7storage11TransactionEllEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPFvPNS_7storage11TransactionEEPvEET_T0_:
  115|      3|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes2isINS_7VariantENS_8MonoTypeEEEPT_RKSt10shared_ptrIT0_E:
  146|  3.64k|  T* is(const std::shared_ptr<S>& s) {
  147|  3.64k|    return isM<T, S>(s.get());
  148|  3.64k|  }
_ZN6hobbes3isMINS_7VariantENS_8MonoTypeEEEPT_PT0_:
  137|  3.64k|  T* isM(S* s) {
  138|  3.64k|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (138:9): [True: 3.64k, False: 0]
  |  Branch (138:14): [True: 2.32k, False: 1.31k]
  ------------------
  139|  2.32k|      return rcast<T*>(s);
  140|  2.32k|    } else {
  141|  1.31k|      return nullptr;
  142|  1.31k|    }
  143|  3.64k|  }
_ZN6hobbes5rcastIPNS_7VariantEPNS_8MonoTypeEEET_T0_:
  115|  2.32k|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes2isINS_4PrimENS_8MonoTypeEEEPT_RKSt10shared_ptrIT0_E:
  146|  12.5k|  T* is(const std::shared_ptr<S>& s) {
  147|  12.5k|    return isM<T, S>(s.get());
  148|  12.5k|  }
_ZN6hobbes3isMINS_4PrimENS_8MonoTypeEEEPT_PT0_:
  137|  12.5k|  T* isM(S* s) {
  138|  12.5k|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (138:9): [True: 12.5k, False: 0]
  |  Branch (138:14): [True: 11.5k, False: 994]
  ------------------
  139|  11.5k|      return rcast<T*>(s);
  140|  11.5k|    } else {
  141|    994|      return nullptr;
  142|    994|    }
  143|  12.5k|  }
_ZN6hobbes5rcastIPNS_4PrimEPNS_8MonoTypeEEET_T0_:
  115|  11.5k|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes2isINS_4FuncENS_8MonoTypeEEEPT_RKSt10shared_ptrIT0_E:
  146|  12.5k|  T* is(const std::shared_ptr<S>& s) {
  147|  12.5k|    return isM<T, S>(s.get());
  148|  12.5k|  }
_ZN6hobbes3isMINS_4FuncENS_8MonoTypeEEEPT_PT0_:
  137|  12.5k|  T* isM(S* s) {
  138|  12.5k|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (138:9): [True: 12.5k, False: 0]
  |  Branch (138:14): [True: 4.50k, False: 8.03k]
  ------------------
  139|  4.50k|      return rcast<T*>(s);
  140|  8.03k|    } else {
  141|  8.03k|      return nullptr;
  142|  8.03k|    }
  143|  12.5k|  }
_ZN6hobbes5rcastIPNS_4FuncEPNS_8MonoTypeEEET_T0_:
  115|  4.50k|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes2isINS_4TAppENS_8MonoTypeEEEPT_RKSt10shared_ptrIT0_E:
  146|  17.0k|  T* is(const std::shared_ptr<S>& s) {
  147|  17.0k|    return isM<T, S>(s.get());
  148|  17.0k|  }
_ZN6hobbes3isMINS_4TAppENS_8MonoTypeEEEPT_PT0_:
  137|  17.0k|  T* isM(S* s) {
  138|  17.0k|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (138:9): [True: 17.0k, False: 0]
  |  Branch (138:14): [True: 882, False: 16.1k]
  ------------------
  139|    882|      return rcast<T*>(s);
  140|  16.1k|    } else {
  141|  16.1k|      return nullptr;
  142|  16.1k|    }
  143|  17.0k|  }
_ZN6hobbes5rcastIPNS_4TAppEPNS_8MonoTypeEEET_T0_:
  115|    882|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPNS_8MonoTypeEEET_T0_:
  115|   340k|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes2isINS_4BoolENS_9PrimitiveEEEPKT_PKT0_:
  128|    102|  const T* is(const S* s) {
  129|    102|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (129:9): [True: 102, False: 0]
  |  Branch (129:14): [True: 102, False: 0]
  ------------------
  130|    102|      return rcast<const T*>(s);
  131|    102|    } else {
  132|      0|      return nullptr;
  133|      0|    }
  134|    102|  }
_ZN6hobbes5rcastIPKNS_4BoolEPKNS_9PrimitiveEEET_T0_:
  115|    102|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes2isINS_3IntENS_9PrimitiveEEEPKT_PKT0_:
  128|    900|  const T* is(const S* s) {
  129|    900|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (129:9): [True: 900, False: 0]
  |  Branch (129:14): [True: 900, False: 0]
  ------------------
  130|    900|      return rcast<const T*>(s);
  131|    900|    } else {
  132|      0|      return nullptr;
  133|      0|    }
  134|    900|  }
_ZN6hobbes5rcastIPKNS_3IntEPKNS_9PrimitiveEEET_T0_:
  115|    900|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes2isINS_4LongENS_9PrimitiveEEEPKT_PKT0_:
  128|    134|  const T* is(const S* s) {
  129|    134|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (129:9): [True: 134, False: 0]
  |  Branch (129:14): [True: 134, False: 0]
  ------------------
  130|    134|      return rcast<const T*>(s);
  131|    134|    } else {
  132|      0|      return nullptr;
  133|      0|    }
  134|    134|  }
_ZN6hobbes5rcastIPKNS_4LongEPKNS_9PrimitiveEEET_T0_:
  115|    134|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes2isINS_3VarENS_4ExprEEEPKT_PKT0_:
  128|  1.20k|  const T* is(const S* s) {
  129|  1.20k|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (129:9): [True: 1.20k, False: 0]
  |  Branch (129:14): [True: 1.20k, False: 0]
  ------------------
  130|  1.20k|      return rcast<const T*>(s);
  131|  1.20k|    } else {
  132|      0|      return nullptr;
  133|      0|    }
  134|  1.20k|  }
_ZN6hobbes5rcastIPKNS_3VarEPKNS_4ExprEEET_T0_:
  115|  1.20k|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes2isINS_6RecordENS_8MonoTypeEEEPT_RKSt10shared_ptrIT0_E:
  146|  30.4k|  T* is(const std::shared_ptr<S>& s) {
  147|  30.4k|    return isM<T, S>(s.get());
  148|  30.4k|  }
_ZN6hobbes3isMINS_6RecordENS_8MonoTypeEEEPT_PT0_:
  137|  30.4k|  T* isM(S* s) {
  138|  30.4k|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (138:9): [True: 30.4k, False: 0]
  |  Branch (138:14): [True: 24.1k, False: 6.30k]
  ------------------
  139|  24.1k|      return rcast<T*>(s);
  140|  24.1k|    } else {
  141|  6.30k|      return nullptr;
  142|  6.30k|    }
  143|  30.4k|  }
_ZN6hobbes5rcastIPNS_6RecordEPNS_8MonoTypeEEET_T0_:
  115|  24.1k|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes2isINS_6ExistsENS_8MonoTypeEEEPT_RKSt10shared_ptrIT0_E:
  146|  1.92k|  T* is(const std::shared_ptr<S>& s) {
  147|  1.92k|    return isM<T, S>(s.get());
  148|  1.92k|  }
_ZN6hobbes3isMINS_6ExistsENS_8MonoTypeEEEPT_PT0_:
  137|  1.92k|  T* isM(S* s) {
  138|  1.92k|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (138:9): [True: 1.92k, False: 0]
  |  Branch (138:14): [True: 1.90k, False: 23]
  ------------------
  139|  1.90k|      return rcast<T*>(s);
  140|  1.90k|    } else {
  141|     23|      return nullptr;
  142|     23|    }
  143|  1.92k|  }
_ZN6hobbes5rcastIPNS_6ExistsEPNS_8MonoTypeEEET_T0_:
  115|  1.90k|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes2isINS_6AssumpENS_4ExprEEEPT_RKSt10shared_ptrIT0_E:
  146|  4.97k|  T* is(const std::shared_ptr<S>& s) {
  147|  4.97k|    return isM<T, S>(s.get());
  148|  4.97k|  }
_ZN6hobbes3isMINS_6AssumpENS_4ExprEEEPT_PT0_:
  137|  4.97k|  T* isM(S* s) {
  138|  4.97k|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (138:9): [True: 4.97k, False: 0]
  |  Branch (138:14): [True: 2.36k, False: 2.60k]
  ------------------
  139|  2.36k|      return rcast<T*>(s);
  140|  2.60k|    } else {
  141|  2.60k|      return nullptr;
  142|  2.60k|    }
  143|  4.97k|  }
_ZN6hobbes5rcastIPNS_6AssumpEPNS_4ExprEEET_T0_:
  115|  2.36k|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes2isINS_10FixedArrayENS_8MonoTypeEEEPT_RKSt10shared_ptrIT0_E:
  146|  1.04k|  T* is(const std::shared_ptr<S>& s) {
  147|  1.04k|    return isM<T, S>(s.get());
  148|  1.04k|  }
_ZN6hobbes3isMINS_10FixedArrayENS_8MonoTypeEEEPT_PT0_:
  137|  1.04k|  T* isM(S* s) {
  138|  1.04k|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (138:9): [True: 1.04k, False: 0]
  |  Branch (138:14): [True: 20, False: 1.02k]
  ------------------
  139|     20|      return rcast<T*>(s);
  140|  1.02k|    } else {
  141|  1.02k|      return nullptr;
  142|  1.02k|    }
  143|  1.04k|  }
_ZN6hobbes5rcastIPNS_10FixedArrayEPNS_8MonoTypeEEET_T0_:
  115|     20|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes2isINS_5ArrayENS_8MonoTypeEEEPT_RKSt10shared_ptrIT0_E:
  146|  4.04k|  T* is(const std::shared_ptr<S>& s) {
  147|  4.04k|    return isM<T, S>(s.get());
  148|  4.04k|  }
_ZN6hobbes3isMINS_5ArrayENS_8MonoTypeEEEPT_PT0_:
  137|  4.04k|  T* isM(S* s) {
  138|  4.04k|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (138:9): [True: 4.04k, False: 0]
  |  Branch (138:14): [True: 3.16k, False: 884]
  ------------------
  139|  3.16k|      return rcast<T*>(s);
  140|  3.16k|    } else {
  141|    884|      return nullptr;
  142|    884|    }
  143|  4.04k|  }
_ZN6hobbes5rcastIPNS_5ArrayEPNS_8MonoTypeEEET_T0_:
  115|  3.16k|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes2isINS_9OpaquePtrENS_8MonoTypeEEEPT_RKSt10shared_ptrIT0_E:
  146|  8.12k|  T* is(const std::shared_ptr<S>& s) {
  147|  8.12k|    return isM<T, S>(s.get());
  148|  8.12k|  }
_ZN6hobbes3isMINS_9OpaquePtrENS_8MonoTypeEEEPT_PT0_:
  137|  8.12k|  T* isM(S* s) {
  138|  8.12k|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (138:9): [True: 8.12k, False: 0]
  |  Branch (138:14): [True: 205, False: 7.92k]
  ------------------
  139|    205|      return rcast<T*>(s);
  140|  7.92k|    } else {
  141|  7.92k|      return nullptr;
  142|  7.92k|    }
  143|  8.12k|  }
_ZN6hobbes5rcastIPNS_9OpaquePtrEPNS_8MonoTypeEEET_T0_:
  115|    205|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes2isINS_9RecursiveENS_8MonoTypeEEEPT_RKSt10shared_ptrIT0_E:
  146|    614|  T* is(const std::shared_ptr<S>& s) {
  147|    614|    return isM<T, S>(s.get());
  148|    614|  }
_ZN6hobbes3isMINS_9RecursiveENS_8MonoTypeEEEPT_PT0_:
  137|    614|  T* isM(S* s) {
  138|    614|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (138:9): [True: 614, False: 0]
  |  Branch (138:14): [True: 420, False: 194]
  ------------------
  139|    420|      return rcast<T*>(s);
  140|    420|    } else {
  141|    194|      return nullptr;
  142|    194|    }
  143|    614|  }
_ZN6hobbes5rcastIPNS_9RecursiveEPNS_8MonoTypeEEET_T0_:
  115|    420|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPKNS_4PrimEPKNS_8MonoTypeEEET_T0_:
  115|  38.7k|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPKNS_9OpaquePtrEPKNS_8MonoTypeEEET_T0_:
  115|    577|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPKNS_4TVarEPKNS_8MonoTypeEEET_T0_:
  115|   206k|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPKNS_4TGenEPKNS_8MonoTypeEEET_T0_:
  115|  60.4k|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPKNS_4TAppEPKNS_8MonoTypeEEET_T0_:
  115|  4.16k|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPKNS_10FixedArrayEPKNS_8MonoTypeEEET_T0_:
  115|    974|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPKNS_5ArrayEPKNS_8MonoTypeEEET_T0_:
  115|  27.0k|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPKNS_7VariantEPKNS_8MonoTypeEEET_T0_:
  115|  10.0k|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPKNS_6RecordEPKNS_8MonoTypeEEET_T0_:
  115|  83.5k|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPKNS_4FuncEPKNS_8MonoTypeEEET_T0_:
  115|  37.5k|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPKNS_6ExistsEPKNS_8MonoTypeEEET_T0_:
  115|  8.87k|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPKNS_9RecursiveEPKNS_8MonoTypeEEET_T0_:
  115|  7.57k|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPKNS_7TStringEPKNS_8MonoTypeEEET_T0_:
  115|   174k|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPKNS_5TLongEPKNS_8MonoTypeEEET_T0_:
  115|  3.02k|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPKNS_5TExprEPKNS_8MonoTypeEEET_T0_:
  115|  1.20k|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes2isINS_4TVarENS_8MonoTypeEEEPT_RKSt10shared_ptrIT0_E:
  146|   248k|  T* is(const std::shared_ptr<S>& s) {
  147|   248k|    return isM<T, S>(s.get());
  148|   248k|  }
_ZN6hobbes3isMINS_4TVarENS_8MonoTypeEEEPT_PT0_:
  137|   248k|  T* isM(S* s) {
  138|   248k|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (138:9): [True: 248k, False: 0]
  |  Branch (138:14): [True: 113k, False: 135k]
  ------------------
  139|   113k|      return rcast<T*>(s);
  140|   135k|    } else {
  141|   135k|      return nullptr;
  142|   135k|    }
  143|   248k|  }
_ZN6hobbes5rcastIPNS_4TVarEPNS_8MonoTypeEEET_T0_:
  115|   113k|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes6crcastIPNS_4UnitENS_4ExprEEET_PKT0_:
  116|  3.24k|template <typename V, typename U> V crcast(const U* x) { return reinterpret_cast<V>(const_cast<U*>(x)); }
_ZN6hobbes6crcastIPNS_4BoolENS_4ExprEEET_PKT0_:
  116|  1.27k|template <typename V, typename U> V crcast(const U* x) { return reinterpret_cast<V>(const_cast<U*>(x)); }
_ZN6hobbes6crcastIPNS_4CharENS_4ExprEEET_PKT0_:
  116|  2.61k|template <typename V, typename U> V crcast(const U* x) { return reinterpret_cast<V>(const_cast<U*>(x)); }
_ZN6hobbes6crcastIPNS_4ByteENS_4ExprEEET_PKT0_:
  116|  1.84k|template <typename V, typename U> V crcast(const U* x) { return reinterpret_cast<V>(const_cast<U*>(x)); }
_ZN6hobbes6crcastIPNS_5ShortENS_4ExprEEET_PKT0_:
  116|     31|template <typename V, typename U> V crcast(const U* x) { return reinterpret_cast<V>(const_cast<U*>(x)); }
_ZN6hobbes6crcastIPNS_3IntENS_4ExprEEET_PKT0_:
  116|  3.10k|template <typename V, typename U> V crcast(const U* x) { return reinterpret_cast<V>(const_cast<U*>(x)); }
_ZN6hobbes6crcastIPNS_4LongENS_4ExprEEET_PKT0_:
  116|  6.87k|template <typename V, typename U> V crcast(const U* x) { return reinterpret_cast<V>(const_cast<U*>(x)); }
_ZN6hobbes6crcastIPNS_6Int128ENS_4ExprEEET_PKT0_:
  116|     18|template <typename V, typename U> V crcast(const U* x) { return reinterpret_cast<V>(const_cast<U*>(x)); }
_ZN6hobbes6crcastIPNS_5FloatENS_4ExprEEET_PKT0_:
  116|     18|template <typename V, typename U> V crcast(const U* x) { return reinterpret_cast<V>(const_cast<U*>(x)); }
_ZN6hobbes6crcastIPNS_6DoubleENS_4ExprEEET_PKT0_:
  116|     18|template <typename V, typename U> V crcast(const U* x) { return reinterpret_cast<V>(const_cast<U*>(x)); }
_ZN6hobbes6crcastIPNS_3VarENS_4ExprEEET_PKT0_:
  116|   129k|template <typename V, typename U> V crcast(const U* x) { return reinterpret_cast<V>(const_cast<U*>(x)); }
_ZN6hobbes6crcastIPNS_3LetENS_4ExprEEET_PKT0_:
  116|  12.7k|template <typename V, typename U> V crcast(const U* x) { return reinterpret_cast<V>(const_cast<U*>(x)); }
_ZN6hobbes6crcastIPNS_6LetRecENS_4ExprEEET_PKT0_:
  116|     60|template <typename V, typename U> V crcast(const U* x) { return reinterpret_cast<V>(const_cast<U*>(x)); }
_ZN6hobbes6crcastIPNS_2FnENS_4ExprEEET_PKT0_:
  116|  5.83k|template <typename V, typename U> V crcast(const U* x) { return reinterpret_cast<V>(const_cast<U*>(x)); }
_ZN6hobbes6crcastIPNS_3AppENS_4ExprEEET_PKT0_:
  116|  53.2k|template <typename V, typename U> V crcast(const U* x) { return reinterpret_cast<V>(const_cast<U*>(x)); }
_ZN6hobbes6crcastIPNS_6AssignENS_4ExprEEET_PKT0_:
  116|  2.14k|template <typename V, typename U> V crcast(const U* x) { return reinterpret_cast<V>(const_cast<U*>(x)); }
_ZN6hobbes6crcastIPNS_7MkArrayENS_4ExprEEET_PKT0_:
  116|  1.42k|template <typename V, typename U> V crcast(const U* x) { return reinterpret_cast<V>(const_cast<U*>(x)); }
_ZN6hobbes6crcastIPNS_9MkVariantENS_4ExprEEET_PKT0_:
  116|  1.35k|template <typename V, typename U> V crcast(const U* x) { return reinterpret_cast<V>(const_cast<U*>(x)); }
_ZN6hobbes6crcastIPNS_8MkRecordENS_4ExprEEET_PKT0_:
  116|  1.69k|template <typename V, typename U> V crcast(const U* x) { return reinterpret_cast<V>(const_cast<U*>(x)); }
_ZN6hobbes6crcastIPNS_6AIndexENS_4ExprEEET_PKT0_:
  116|  4.03k|template <typename V, typename U> V crcast(const U* x) { return reinterpret_cast<V>(const_cast<U*>(x)); }
_ZN6hobbes6crcastIPNS_4CaseENS_4ExprEEET_PKT0_:
  116|  1.23k|template <typename V, typename U> V crcast(const U* x) { return reinterpret_cast<V>(const_cast<U*>(x)); }
_ZN6hobbes6crcastIPNS_6SwitchENS_4ExprEEET_PKT0_:
  116|    104|template <typename V, typename U> V crcast(const U* x) { return reinterpret_cast<V>(const_cast<U*>(x)); }
_ZN6hobbes6crcastIPNS_4ProjENS_4ExprEEET_PKT0_:
  116|  5.79k|template <typename V, typename U> V crcast(const U* x) { return reinterpret_cast<V>(const_cast<U*>(x)); }
_ZN6hobbes6crcastIPNS_6AssumpENS_4ExprEEET_PKT0_:
  116|  30.7k|template <typename V, typename U> V crcast(const U* x) { return reinterpret_cast<V>(const_cast<U*>(x)); }
_ZN6hobbes6crcastIPNS_4PackENS_4ExprEEET_PKT0_:
  116|    312|template <typename V, typename U> V crcast(const U* x) { return reinterpret_cast<V>(const_cast<U*>(x)); }
_ZN6hobbes6crcastIPNS_6UnpackENS_4ExprEEET_PKT0_:
  116|     88|template <typename V, typename U> V crcast(const U* x) { return reinterpret_cast<V>(const_cast<U*>(x)); }
_ZN6hobbes2isINS_7MImportENS_9ModuleDefEEEPT_RKSt10shared_ptrIT0_E:
  146|  1.41k|  T* is(const std::shared_ptr<S>& s) {
  147|  1.41k|    return isM<T, S>(s.get());
  148|  1.41k|  }
_ZN6hobbes3isMINS_7MImportENS_9ModuleDefEEEPT_PT0_:
  137|  1.41k|  T* isM(S* s) {
  138|  1.41k|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (138:9): [True: 1.41k, False: 0]
  |  Branch (138:14): [True: 0, False: 1.41k]
  ------------------
  139|      0|      return rcast<T*>(s);
  140|  1.41k|    } else {
  141|  1.41k|      return nullptr;
  142|  1.41k|    }
  143|  1.41k|  }
_ZN6hobbes2isINS_8ClassDefENS_9ModuleDefEEEPT_RKSt10shared_ptrIT0_E:
  146|  1.41k|  T* is(const std::shared_ptr<S>& s) {
  147|  1.41k|    return isM<T, S>(s.get());
  148|  1.41k|  }
_ZN6hobbes3isMINS_8ClassDefENS_9ModuleDefEEEPT_PT0_:
  137|  1.41k|  T* isM(S* s) {
  138|  1.41k|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (138:9): [True: 1.41k, False: 0]
  |  Branch (138:14): [True: 97, False: 1.32k]
  ------------------
  139|     97|      return rcast<T*>(s);
  140|  1.32k|    } else {
  141|  1.32k|      return nullptr;
  142|  1.32k|    }
  143|  1.41k|  }
_ZN6hobbes5rcastIPNS_8ClassDefEPNS_9ModuleDefEEET_T0_:
  115|     97|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes2isINS_11InstanceDefENS_9ModuleDefEEEPT_RKSt10shared_ptrIT0_E:
  146|  2.46k|  T* is(const std::shared_ptr<S>& s) {
  147|  2.46k|    return isM<T, S>(s.get());
  148|  2.46k|  }
_ZN6hobbes3isMINS_11InstanceDefENS_9ModuleDefEEEPT_PT0_:
  137|  2.46k|  T* isM(S* s) {
  138|  2.46k|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (138:9): [True: 2.46k, False: 0]
  |  Branch (138:14): [True: 1.24k, False: 1.22k]
  ------------------
  139|  1.24k|      return rcast<T*>(s);
  140|  1.24k|    } else {
  141|  1.22k|      return nullptr;
  142|  1.22k|    }
  143|  2.46k|  }
_ZN6hobbes5rcastIPNS_11InstanceDefEPNS_9ModuleDefEEET_T0_:
  115|  1.24k|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes2isINS_8MTypeDefENS_9ModuleDefEEEPT_RKSt10shared_ptrIT0_E:
  146|    700|  T* is(const std::shared_ptr<S>& s) {
  147|    700|    return isM<T, S>(s.get());
  148|    700|  }
_ZN6hobbes3isMINS_8MTypeDefENS_9ModuleDefEEEPT_PT0_:
  137|    700|  T* isM(S* s) {
  138|    700|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (138:9): [True: 700, False: 0]
  |  Branch (138:14): [True: 13, False: 687]
  ------------------
  139|     13|      return rcast<T*>(s);
  140|    687|    } else {
  141|    687|      return nullptr;
  142|    687|    }
  143|    700|  }
_ZN6hobbes5rcastIPNS_8MTypeDefEPNS_9ModuleDefEEET_T0_:
  115|     13|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes2isINS_7MVarDefENS_9ModuleDefEEEPT_RKSt10shared_ptrIT0_E:
  146|  3.52k|  T* is(const std::shared_ptr<S>& s) {
  147|  3.52k|    return isM<T, S>(s.get());
  148|  3.52k|  }
_ZN6hobbes3isMINS_7MVarDefENS_9ModuleDefEEEPT_PT0_:
  137|  3.52k|  T* isM(S* s) {
  138|  3.52k|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (138:9): [True: 3.52k, False: 0]
  |  Branch (138:14): [True: 831, False: 2.69k]
  ------------------
  139|    831|      return rcast<T*>(s);
  140|  2.69k|    } else {
  141|  2.69k|      return nullptr;
  142|  2.69k|    }
  143|  3.52k|  }
_ZN6hobbes5rcastIPNS_7MVarDefEPNS_9ModuleDefEEET_T0_:
  115|    831|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes2isINS_11MVarTypeDefENS_9ModuleDefEEEPT_RKSt10shared_ptrIT0_E:
  146|    410|  T* is(const std::shared_ptr<S>& s) {
  147|    410|    return isM<T, S>(s.get());
  148|    410|  }
_ZN6hobbes3isMINS_11MVarTypeDefENS_9ModuleDefEEEPT_PT0_:
  137|    410|  T* isM(S* s) {
  138|    410|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (138:9): [True: 410, False: 0]
  |  Branch (138:14): [True: 260, False: 150]
  ------------------
  139|    260|      return rcast<T*>(s);
  140|    260|    } else {
  141|    150|      return nullptr;
  142|    150|    }
  143|    410|  }
_ZN6hobbes5rcastIPNS_11MVarTypeDefEPNS_9ModuleDefEEET_T0_:
  115|    260|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes2isINS_16MUnsafePragmaDefENS_9ModuleDefEEEPT_RKSt10shared_ptrIT0_E:
  146|  1.56k|  T* is(const std::shared_ptr<S>& s) {
  147|  1.56k|    return isM<T, S>(s.get());
  148|  1.56k|  }
_ZN6hobbes3isMINS_16MUnsafePragmaDefENS_9ModuleDefEEEPT_PT0_:
  137|  1.56k|  T* isM(S* s) {
  138|  1.56k|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (138:9): [True: 1.56k, False: 0]
  |  Branch (138:14): [True: 186, False: 1.38k]
  ------------------
  139|    186|      return rcast<T*>(s);
  140|  1.38k|    } else {
  141|  1.38k|      return nullptr;
  142|  1.38k|    }
  143|  1.56k|  }
_ZN6hobbes5rcastIPNS_16MUnsafePragmaDefEPNS_9ModuleDefEEET_T0_:
  115|    186|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes2isINS_14MSafePragmaDefENS_9ModuleDefEEEPT_RKSt10shared_ptrIT0_E:
  146|  1.47k|  T* is(const std::shared_ptr<S>& s) {
  147|  1.47k|    return isM<T, S>(s.get());
  148|  1.47k|  }
_ZN6hobbes3isMINS_14MSafePragmaDefENS_9ModuleDefEEEPT_PT0_:
  137|  1.47k|  T* isM(S* s) {
  138|  1.47k|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (138:9): [True: 1.47k, False: 0]
  |  Branch (138:14): [True: 114, False: 1.36k]
  ------------------
  139|    114|      return rcast<T*>(s);
  140|  1.36k|    } else {
  141|  1.36k|      return nullptr;
  142|  1.36k|    }
  143|  1.47k|  }
_ZN6hobbes5rcastIPNS_14MSafePragmaDefEPNS_9ModuleDefEEET_T0_:
  115|    114|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFmRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFcRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEmEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFPcmmEEET_T0_:
  115|      3|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFvvEEET_T0_:
  115|      3|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5alignImEET_S1_S1_:
  119|  78.3k|  T align(T x, T m) {
  120|  78.3k|    if (m == 0 || (x % m) == 0) {
  ------------------
  |  Branch (120:9): [True: 0, False: 78.3k]
  |  Branch (120:19): [True: 78.3k, False: 11]
  ------------------
  121|  78.3k|      return x;
  122|  78.3k|    } else {
  123|     11|      return (1 + (x / m)) * m;
  124|     11|    }
  125|  78.3k|  }
_ZN6hobbes5rcastIPvPFPNS_5arrayINS_11RegionStateEEEvEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFmmEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFmPKNS_5arrayIcEEEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFvmEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFPKNS_5arrayIcEEcEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFPKNS_5arrayIcEEhEEET_T0_:
  115|      2|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFPKNS_5arrayIcEEsEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFPKNS_5arrayIcEEiEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFPKNS_5arrayIcEElEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFPKNS_5arrayIcEEnEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFPKNS_5arrayIcEEfiEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFPKNS_5arrayIcEEdiEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFPKNS_5arrayIcEEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFPKNS_5arrayIcEENS_9timespanTEEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFPKNS_5arrayIcEENS_5timeTEEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFPKNS_5arrayIcEENS_9datetimeTEEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFPKNS_5arrayIcEES5_lEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFPKNS_5arrayIcEES5_NS_9datetimeTEEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFNS_9datetimeTEvEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFNS_9datetimeTES2_EEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFNS_5timeTENS_9datetimeTEEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFNS_9datetimeTES2_NS_5timeTEEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFNS_9timespanTENS_9datetimeTEEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFPKNS_3CTMENS_9datetimeTEEEET_T0_:
  115|      2|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFvPNS_5arrayIcEEEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFPKNS_5arrayIcEEvEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFPKNS_7variantIJNS_4unitEcEEEPKNS_5arrayIcEEEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFPKNS_7variantIJNS_4unitEhEEEPKNS_5arrayIcEEEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFPKNS_7variantIJNS_4unitEsEEEPKNS_5arrayIcEEEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFPKNS_7variantIJNS_4unitEiEEEPKNS_5arrayIcEEEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFPKNS_7variantIJNS_4unitElEEEPKNS_5arrayIcEEEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFPKNS_7variantIJNS_4unitEnEEEPKNS_5arrayIcEEEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFPKNS_7variantIJNS_4unitEfEEEPKNS_5arrayIcEEEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFPKNS_7variantIJNS_4unitEdEEEPKNS_5arrayIcEEEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFvPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPNS_5arrayIcEEEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFdddEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFlllEEET_T0_:
  115|      2|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFldEEET_T0_:
  115|      3|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFddEEET_T0_:
  115|      3|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFvPKNS_5arrayIcEEmS5_PcEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFllllEEET_T0_:
  115|      3|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFmPcEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFcPcmEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFvPclEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFbiEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFvibEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFhiEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFvihEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFciEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFvicEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFsiEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFvisEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFiiEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFviiEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFliEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFvilEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFniEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFvinEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFfiEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFvifEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFdiEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFvidEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFviPKNS_5arrayIcEEEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFviPKNS_5arrayIhEEEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFPKNS_5arrayIhEES5_EEET_T0_:
  115|      2|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFvNS_9timespanTEPFbvEEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFmRKSt6vectorIhSaIhEEmEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFPKcRKSt6vectorIhSaIhEEEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes2isINS_2FnENS_4ExprEEEPT_RKSt10shared_ptrIT0_E:
  146|    301|  T* is(const std::shared_ptr<S>& s) {
  147|    301|    return isM<T, S>(s.get());
  148|    301|  }
_ZN6hobbes3isMINS_2FnENS_4ExprEEEPT_PT0_:
  137|    301|  T* isM(S* s) {
  138|    301|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (138:9): [True: 301, False: 0]
  |  Branch (138:14): [True: 282, False: 19]
  ------------------
  139|    282|      return rcast<T*>(s);
  140|    282|    } else {
  141|     19|      return nullptr;
  142|     19|    }
  143|    301|  }
_ZN6hobbes5rcastIPNS_2FnEPNS_4ExprEEET_T0_:
  115|    282|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes2isINS_7TStringENS_8MonoTypeEEEPT_RKSt10shared_ptrIT0_E:
  146|   206k|  T* is(const std::shared_ptr<S>& s) {
  147|   206k|    return isM<T, S>(s.get());
  148|   206k|  }
_ZN6hobbes3isMINS_7TStringENS_8MonoTypeEEEPT_PT0_:
  137|   206k|  T* isM(S* s) {
  138|   206k|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (138:9): [True: 206k, False: 0]
  |  Branch (138:14): [True: 205k, False: 479]
  ------------------
  139|   205k|      return rcast<T*>(s);
  140|   205k|    } else {
  141|    479|      return nullptr;
  142|    479|    }
  143|   206k|  }
_ZN6hobbes5rcastIPNS_7TStringEPNS_8MonoTypeEEET_T0_:
  115|   205k|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes2isINS_5TExprENS_8MonoTypeEEEPT_RKSt10shared_ptrIT0_E:
  146|  11.8k|  T* is(const std::shared_ptr<S>& s) {
  147|  11.8k|    return isM<T, S>(s.get());
  148|  11.8k|  }
_ZN6hobbes3isMINS_5TExprENS_8MonoTypeEEEPT_PT0_:
  137|  11.8k|  T* isM(S* s) {
  138|  11.8k|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (138:9): [True: 11.8k, False: 0]
  |  Branch (138:14): [True: 11.8k, False: 12]
  ------------------
  139|  11.8k|      return rcast<T*>(s);
  140|  11.8k|    } else {
  141|     12|      return nullptr;
  142|     12|    }
  143|  11.8k|  }
_ZN6hobbes5rcastIPNS_5TExprEPNS_8MonoTypeEEET_T0_:
  115|  11.8k|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes2isINS_5TLongENS_8MonoTypeEEEPT_RKSt10shared_ptrIT0_E:
  146|  13.2k|  T* is(const std::shared_ptr<S>& s) {
  147|  13.2k|    return isM<T, S>(s.get());
  148|  13.2k|  }
_ZN6hobbes3isMINS_5TLongENS_8MonoTypeEEEPT_PT0_:
  137|  13.2k|  T* isM(S* s) {
  138|  13.2k|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (138:9): [True: 13.2k, False: 0]
  |  Branch (138:14): [True: 13.2k, False: 26]
  ------------------
  139|  13.2k|      return rcast<T*>(s);
  140|  13.2k|    } else {
  141|     26|      return nullptr;
  142|     26|    }
  143|  13.2k|  }
_ZN6hobbes5rcastIPNS_5TLongEPNS_8MonoTypeEEET_T0_:
  115|  13.2k|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFmmPFPciEEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFvlEEET_T0_:
  115|      3|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes2isINS_3VarENS_4ExprEEEPT_RKSt10shared_ptrIT0_E:
  146|  6.39k|  T* is(const std::shared_ptr<S>& s) {
  147|  6.39k|    return isM<T, S>(s.get());
  148|  6.39k|  }
_ZN6hobbes3isMINS_3VarENS_4ExprEEEPT_PT0_:
  137|  6.39k|  T* isM(S* s) {
  138|  6.39k|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (138:9): [True: 6.39k, False: 0]
  |  Branch (138:14): [True: 4.84k, False: 1.54k]
  ------------------
  139|  4.84k|      return rcast<T*>(s);
  140|  4.84k|    } else {
  141|  1.54k|      return nullptr;
  142|  1.54k|    }
  143|  6.39k|  }
_ZN6hobbes5rcastIPNS_3VarEPNS_4ExprEEET_T0_:
  115|  4.84k|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes2isINS_4ProjENS_4ExprEEEPT_RKSt10shared_ptrIT0_E:
  146|    112|  T* is(const std::shared_ptr<S>& s) {
  147|    112|    return isM<T, S>(s.get());
  148|    112|  }
_ZN6hobbes3isMINS_4ProjENS_4ExprEEEPT_PT0_:
  137|    112|  T* isM(S* s) {
  138|    112|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (138:9): [True: 112, False: 0]
  |  Branch (138:14): [True: 26, False: 86]
  ------------------
  139|     26|      return rcast<T*>(s);
  140|     86|    } else {
  141|     86|      return nullptr;
  142|     86|    }
  143|    112|  }
_ZN6hobbes5rcastIPNS_4ProjEPNS_4ExprEEET_T0_:
  115|     26|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes2isINS_3AppENS_4ExprEEEPT_RKSt10shared_ptrIT0_E:
  146|    379|  T* is(const std::shared_ptr<S>& s) {
  147|    379|    return isM<T, S>(s.get());
  148|    379|  }
_ZN6hobbes3isMINS_3AppENS_4ExprEEEPT_PT0_:
  137|    379|  T* isM(S* s) {
  138|    379|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (138:9): [True: 379, False: 0]
  |  Branch (138:14): [True: 0, False: 379]
  ------------------
  139|      0|      return rcast<T*>(s);
  140|    379|    } else {
  141|    379|      return nullptr;
  142|    379|    }
  143|    379|  }
_ZN6hobbes16unique_refc_mapsIJNS_15unique_refc_mapIKNS_4PrimEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEEENS1_IKNS_9OpaquePtrEJS9_jbEEENS1_IKNS_4TVarEJS9_EEENS1_IKNS_4TGenEJiEEENS1_IKNS_4TAbsEJSt6vectorIS9_SaIS9_EESC_EEENS1_IKNS_4TAppEJSC_SP_ISC_SaISC_EEEEENS1_IKNS_10FixedArrayEJSC_SC_EEENS1_IKNS_5ArrayEJSC_EEENS1_IKNS_7VariantEJSP_INS14_6MemberESaIS16_EEEEENS1_IKNS_6RecordEJSP_INS1A_6MemberESaIS1C_EEEEENS1_IKNS_4FuncEJSC_SC_EEENS1_IKNS_6ExistsEJS9_SC_EEENS1_IKNS_9RecursiveEJS9_SC_EEENS1_IKNS_7TStringEJS9_EEENS1_IKNS_5TLongEJlEEENS1_IKNS_5TExprEJS9_EEEEE7compactEv:
  103|      1|    size_t compact() {
  104|      1|      size_t tc = 0;
  105|     12|      while (true) {
  ------------------
  |  Branch (105:14): [True: 12, Folded]
  ------------------
  106|     12|        size_t c = compactAll<0>(this->refcMaps);
  107|     12|        tc += c;
  108|     12|        if (c == 0) break;
  ------------------
  |  Branch (108:13): [True: 1, False: 11]
  ------------------
  109|     12|      }
  110|      1|      return tc;
  111|      1|    }
_ZN6hobbes10compactAllILm0EJNS_15unique_refc_mapIKNS_4PrimEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEEENS1_IKNS_9OpaquePtrEJS9_jbEEENS1_IKNS_4TVarEJS9_EEENS1_IKNS_4TGenEJiEEENS1_IKNS_4TAbsEJSt6vectorIS9_SaIS9_EESC_EEENS1_IKNS_4TAppEJSC_SP_ISC_SaISC_EEEEENS1_IKNS_10FixedArrayEJSC_SC_EEENS1_IKNS_5ArrayEJSC_EEENS1_IKNS_7VariantEJSP_INS14_6MemberESaIS16_EEEEENS1_IKNS_6RecordEJSP_INS1A_6MemberESaIS1C_EEEEENS1_IKNS_4FuncEJSC_SC_EEENS1_IKNS_6ExistsEJS9_SC_EEENS1_IKNS_9RecursiveEJS9_SC_EEENS1_IKNS_7TStringEJS9_EEENS1_IKNS_5TLongEJlEEENS1_IKNS_5TExprEJS9_EEEEEENSt9enable_ifIXltT_sZT0_EmE4typeERSt5tupleIJDpT0_EE:
   73|     12|  inline typename std::enable_if<i < sizeof...(UniqueRefcMaps), size_t>::type compactAll(std::tuple<UniqueRefcMaps...>& ms) {
   74|     12|    return std::get<i>(ms).compact() + compactAll<i+1, UniqueRefcMaps...>(ms);
   75|     12|  }
_ZN6hobbes15unique_refc_mapIKNS_4PrimEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEE7compactEv:
   48|     12|    size_t compact() {
   49|     12|      size_t c = 0;
   50|     12|      std::lock_guard<std::recursive_mutex> lock(mutex);
   51|    228|      for (auto v = this->values.begin(); v != this->values.end();) {
  ------------------
  |  Branch (51:43): [True: 216, False: 12]
  ------------------
   52|    216|        if (v->second.use_count() == 1) {
  ------------------
  |  Branch (52:13): [True: 26, False: 190]
  ------------------
   53|     26|          v = this->values.erase(v);
   54|     26|          ++c;
   55|    190|        } else {
   56|    190|          ++v;
   57|    190|        }
   58|    216|      }
   59|     12|      return c;
   60|     12|    }
_ZN6hobbes10compactAllILm1EJNS_15unique_refc_mapIKNS_4PrimEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEEENS1_IKNS_9OpaquePtrEJS9_jbEEENS1_IKNS_4TVarEJS9_EEENS1_IKNS_4TGenEJiEEENS1_IKNS_4TAbsEJSt6vectorIS9_SaIS9_EESC_EEENS1_IKNS_4TAppEJSC_SP_ISC_SaISC_EEEEENS1_IKNS_10FixedArrayEJSC_SC_EEENS1_IKNS_5ArrayEJSC_EEENS1_IKNS_7VariantEJSP_INS14_6MemberESaIS16_EEEEENS1_IKNS_6RecordEJSP_INS1A_6MemberESaIS1C_EEEEENS1_IKNS_4FuncEJSC_SC_EEENS1_IKNS_6ExistsEJS9_SC_EEENS1_IKNS_9RecursiveEJS9_SC_EEENS1_IKNS_7TStringEJS9_EEENS1_IKNS_5TLongEJlEEENS1_IKNS_5TExprEJS9_EEEEEENSt9enable_ifIXltT_sZT0_EmE4typeERSt5tupleIJDpT0_EE:
   73|     12|  inline typename std::enable_if<i < sizeof...(UniqueRefcMaps), size_t>::type compactAll(std::tuple<UniqueRefcMaps...>& ms) {
   74|     12|    return std::get<i>(ms).compact() + compactAll<i+1, UniqueRefcMaps...>(ms);
   75|     12|  }
_ZN6hobbes15unique_refc_mapIKNS_9OpaquePtrEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEjbEE7compactEv:
   48|     12|    size_t compact() {
   49|     12|      size_t c = 0;
   50|     12|      std::lock_guard<std::recursive_mutex> lock(mutex);
   51|     50|      for (auto v = this->values.begin(); v != this->values.end();) {
  ------------------
  |  Branch (51:43): [True: 38, False: 12]
  ------------------
   52|     38|        if (v->second.use_count() == 1) {
  ------------------
  |  Branch (52:13): [True: 7, False: 31]
  ------------------
   53|      7|          v = this->values.erase(v);
   54|      7|          ++c;
   55|     31|        } else {
   56|     31|          ++v;
   57|     31|        }
   58|     38|      }
   59|     12|      return c;
   60|     12|    }
_ZN6hobbes10compactAllILm2EJNS_15unique_refc_mapIKNS_4PrimEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEEENS1_IKNS_9OpaquePtrEJS9_jbEEENS1_IKNS_4TVarEJS9_EEENS1_IKNS_4TGenEJiEEENS1_IKNS_4TAbsEJSt6vectorIS9_SaIS9_EESC_EEENS1_IKNS_4TAppEJSC_SP_ISC_SaISC_EEEEENS1_IKNS_10FixedArrayEJSC_SC_EEENS1_IKNS_5ArrayEJSC_EEENS1_IKNS_7VariantEJSP_INS14_6MemberESaIS16_EEEEENS1_IKNS_6RecordEJSP_INS1A_6MemberESaIS1C_EEEEENS1_IKNS_4FuncEJSC_SC_EEENS1_IKNS_6ExistsEJS9_SC_EEENS1_IKNS_9RecursiveEJS9_SC_EEENS1_IKNS_7TStringEJS9_EEENS1_IKNS_5TLongEJlEEENS1_IKNS_5TExprEJS9_EEEEEENSt9enable_ifIXltT_sZT0_EmE4typeERSt5tupleIJDpT0_EE:
   73|     12|  inline typename std::enable_if<i < sizeof...(UniqueRefcMaps), size_t>::type compactAll(std::tuple<UniqueRefcMaps...>& ms) {
   74|     12|    return std::get<i>(ms).compact() + compactAll<i+1, UniqueRefcMaps...>(ms);
   75|     12|  }
_ZN6hobbes15unique_refc_mapIKNS_4TVarEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE7compactEv:
   48|     12|    size_t compact() {
   49|     12|      size_t c = 0;
   50|     12|      std::lock_guard<std::recursive_mutex> lock(mutex);
   51|  42.2k|      for (auto v = this->values.begin(); v != this->values.end();) {
  ------------------
  |  Branch (51:43): [True: 42.2k, False: 12]
  ------------------
   52|  42.2k|        if (v->second.use_count() == 1) {
  ------------------
  |  Branch (52:13): [True: 19.0k, False: 23.2k]
  ------------------
   53|  19.0k|          v = this->values.erase(v);
   54|  19.0k|          ++c;
   55|  23.2k|        } else {
   56|  23.2k|          ++v;
   57|  23.2k|        }
   58|  42.2k|      }
   59|     12|      return c;
   60|     12|    }
_ZN6hobbes10compactAllILm3EJNS_15unique_refc_mapIKNS_4PrimEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEEENS1_IKNS_9OpaquePtrEJS9_jbEEENS1_IKNS_4TVarEJS9_EEENS1_IKNS_4TGenEJiEEENS1_IKNS_4TAbsEJSt6vectorIS9_SaIS9_EESC_EEENS1_IKNS_4TAppEJSC_SP_ISC_SaISC_EEEEENS1_IKNS_10FixedArrayEJSC_SC_EEENS1_IKNS_5ArrayEJSC_EEENS1_IKNS_7VariantEJSP_INS14_6MemberESaIS16_EEEEENS1_IKNS_6RecordEJSP_INS1A_6MemberESaIS1C_EEEEENS1_IKNS_4FuncEJSC_SC_EEENS1_IKNS_6ExistsEJS9_SC_EEENS1_IKNS_9RecursiveEJS9_SC_EEENS1_IKNS_7TStringEJS9_EEENS1_IKNS_5TLongEJlEEENS1_IKNS_5TExprEJS9_EEEEEENSt9enable_ifIXltT_sZT0_EmE4typeERSt5tupleIJDpT0_EE:
   73|     12|  inline typename std::enable_if<i < sizeof...(UniqueRefcMaps), size_t>::type compactAll(std::tuple<UniqueRefcMaps...>& ms) {
   74|     12|    return std::get<i>(ms).compact() + compactAll<i+1, UniqueRefcMaps...>(ms);
   75|     12|  }
_ZN6hobbes15unique_refc_mapIKNS_4TGenEJiEE7compactEv:
   48|     12|    size_t compact() {
   49|     12|      size_t c = 0;
   50|     12|      std::lock_guard<std::recursive_mutex> lock(mutex);
   51|    121|      for (auto v = this->values.begin(); v != this->values.end();) {
  ------------------
  |  Branch (51:43): [True: 109, False: 12]
  ------------------
   52|    109|        if (v->second.use_count() == 1) {
  ------------------
  |  Branch (52:13): [True: 30, False: 79]
  ------------------
   53|     30|          v = this->values.erase(v);
   54|     30|          ++c;
   55|     79|        } else {
   56|     79|          ++v;
   57|     79|        }
   58|    109|      }
   59|     12|      return c;
   60|     12|    }
_ZN6hobbes10compactAllILm4EJNS_15unique_refc_mapIKNS_4PrimEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEEENS1_IKNS_9OpaquePtrEJS9_jbEEENS1_IKNS_4TVarEJS9_EEENS1_IKNS_4TGenEJiEEENS1_IKNS_4TAbsEJSt6vectorIS9_SaIS9_EESC_EEENS1_IKNS_4TAppEJSC_SP_ISC_SaISC_EEEEENS1_IKNS_10FixedArrayEJSC_SC_EEENS1_IKNS_5ArrayEJSC_EEENS1_IKNS_7VariantEJSP_INS14_6MemberESaIS16_EEEEENS1_IKNS_6RecordEJSP_INS1A_6MemberESaIS1C_EEEEENS1_IKNS_4FuncEJSC_SC_EEENS1_IKNS_6ExistsEJS9_SC_EEENS1_IKNS_9RecursiveEJS9_SC_EEENS1_IKNS_7TStringEJS9_EEENS1_IKNS_5TLongEJlEEENS1_IKNS_5TExprEJS9_EEEEEENSt9enable_ifIXltT_sZT0_EmE4typeERSt5tupleIJDpT0_EE:
   73|     12|  inline typename std::enable_if<i < sizeof...(UniqueRefcMaps), size_t>::type compactAll(std::tuple<UniqueRefcMaps...>& ms) {
   74|     12|    return std::get<i>(ms).compact() + compactAll<i+1, UniqueRefcMaps...>(ms);
   75|     12|  }
_ZN6hobbes15unique_refc_mapIKNS_4TAbsEJSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EESt10shared_ptrINS_8MonoTypeEEEE7compactEv:
   48|     12|    size_t compact() {
   49|     12|      size_t c = 0;
   50|     12|      std::lock_guard<std::recursive_mutex> lock(mutex);
   51|    102|      for (auto v = this->values.begin(); v != this->values.end();) {
  ------------------
  |  Branch (51:43): [True: 90, False: 12]
  ------------------
   52|     90|        if (v->second.use_count() == 1) {
  ------------------
  |  Branch (52:13): [True: 9, False: 81]
  ------------------
   53|      9|          v = this->values.erase(v);
   54|      9|          ++c;
   55|     81|        } else {
   56|     81|          ++v;
   57|     81|        }
   58|     90|      }
   59|     12|      return c;
   60|     12|    }
_ZN6hobbes10compactAllILm5EJNS_15unique_refc_mapIKNS_4PrimEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEEENS1_IKNS_9OpaquePtrEJS9_jbEEENS1_IKNS_4TVarEJS9_EEENS1_IKNS_4TGenEJiEEENS1_IKNS_4TAbsEJSt6vectorIS9_SaIS9_EESC_EEENS1_IKNS_4TAppEJSC_SP_ISC_SaISC_EEEEENS1_IKNS_10FixedArrayEJSC_SC_EEENS1_IKNS_5ArrayEJSC_EEENS1_IKNS_7VariantEJSP_INS14_6MemberESaIS16_EEEEENS1_IKNS_6RecordEJSP_INS1A_6MemberESaIS1C_EEEEENS1_IKNS_4FuncEJSC_SC_EEENS1_IKNS_6ExistsEJS9_SC_EEENS1_IKNS_9RecursiveEJS9_SC_EEENS1_IKNS_7TStringEJS9_EEENS1_IKNS_5TLongEJlEEENS1_IKNS_5TExprEJS9_EEEEEENSt9enable_ifIXltT_sZT0_EmE4typeERSt5tupleIJDpT0_EE:
   73|     12|  inline typename std::enable_if<i < sizeof...(UniqueRefcMaps), size_t>::type compactAll(std::tuple<UniqueRefcMaps...>& ms) {
   74|     12|    return std::get<i>(ms).compact() + compactAll<i+1, UniqueRefcMaps...>(ms);
   75|     12|  }
_ZN6hobbes15unique_refc_mapIKNS_4TAppEJSt10shared_ptrINS_8MonoTypeEESt6vectorIS5_SaIS5_EEEE7compactEv:
   48|     12|    size_t compact() {
   49|     12|      size_t c = 0;
   50|     12|      std::lock_guard<std::recursive_mutex> lock(mutex);
   51|    653|      for (auto v = this->values.begin(); v != this->values.end();) {
  ------------------
  |  Branch (51:43): [True: 641, False: 12]
  ------------------
   52|    641|        if (v->second.use_count() == 1) {
  ------------------
  |  Branch (52:13): [True: 220, False: 421]
  ------------------
   53|    220|          v = this->values.erase(v);
   54|    220|          ++c;
   55|    421|        } else {
   56|    421|          ++v;
   57|    421|        }
   58|    641|      }
   59|     12|      return c;
   60|     12|    }
_ZN6hobbes10compactAllILm6EJNS_15unique_refc_mapIKNS_4PrimEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEEENS1_IKNS_9OpaquePtrEJS9_jbEEENS1_IKNS_4TVarEJS9_EEENS1_IKNS_4TGenEJiEEENS1_IKNS_4TAbsEJSt6vectorIS9_SaIS9_EESC_EEENS1_IKNS_4TAppEJSC_SP_ISC_SaISC_EEEEENS1_IKNS_10FixedArrayEJSC_SC_EEENS1_IKNS_5ArrayEJSC_EEENS1_IKNS_7VariantEJSP_INS14_6MemberESaIS16_EEEEENS1_IKNS_6RecordEJSP_INS1A_6MemberESaIS1C_EEEEENS1_IKNS_4FuncEJSC_SC_EEENS1_IKNS_6ExistsEJS9_SC_EEENS1_IKNS_9RecursiveEJS9_SC_EEENS1_IKNS_7TStringEJS9_EEENS1_IKNS_5TLongEJlEEENS1_IKNS_5TExprEJS9_EEEEEENSt9enable_ifIXltT_sZT0_EmE4typeERSt5tupleIJDpT0_EE:
   73|     12|  inline typename std::enable_if<i < sizeof...(UniqueRefcMaps), size_t>::type compactAll(std::tuple<UniqueRefcMaps...>& ms) {
   74|     12|    return std::get<i>(ms).compact() + compactAll<i+1, UniqueRefcMaps...>(ms);
   75|     12|  }
_ZN6hobbes15unique_refc_mapIKNS_10FixedArrayEJSt10shared_ptrINS_8MonoTypeEES5_EE7compactEv:
   48|     12|    size_t compact() {
   49|     12|      size_t c = 0;
   50|     12|      std::lock_guard<std::recursive_mutex> lock(mutex);
   51|    306|      for (auto v = this->values.begin(); v != this->values.end();) {
  ------------------
  |  Branch (51:43): [True: 294, False: 12]
  ------------------
   52|    294|        if (v->second.use_count() == 1) {
  ------------------
  |  Branch (52:13): [True: 98, False: 196]
  ------------------
   53|     98|          v = this->values.erase(v);
   54|     98|          ++c;
   55|    196|        } else {
   56|    196|          ++v;
   57|    196|        }
   58|    294|      }
   59|     12|      return c;
   60|     12|    }
_ZN6hobbes10compactAllILm7EJNS_15unique_refc_mapIKNS_4PrimEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEEENS1_IKNS_9OpaquePtrEJS9_jbEEENS1_IKNS_4TVarEJS9_EEENS1_IKNS_4TGenEJiEEENS1_IKNS_4TAbsEJSt6vectorIS9_SaIS9_EESC_EEENS1_IKNS_4TAppEJSC_SP_ISC_SaISC_EEEEENS1_IKNS_10FixedArrayEJSC_SC_EEENS1_IKNS_5ArrayEJSC_EEENS1_IKNS_7VariantEJSP_INS14_6MemberESaIS16_EEEEENS1_IKNS_6RecordEJSP_INS1A_6MemberESaIS1C_EEEEENS1_IKNS_4FuncEJSC_SC_EEENS1_IKNS_6ExistsEJS9_SC_EEENS1_IKNS_9RecursiveEJS9_SC_EEENS1_IKNS_7TStringEJS9_EEENS1_IKNS_5TLongEJlEEENS1_IKNS_5TExprEJS9_EEEEEENSt9enable_ifIXltT_sZT0_EmE4typeERSt5tupleIJDpT0_EE:
   73|     12|  inline typename std::enable_if<i < sizeof...(UniqueRefcMaps), size_t>::type compactAll(std::tuple<UniqueRefcMaps...>& ms) {
   74|     12|    return std::get<i>(ms).compact() + compactAll<i+1, UniqueRefcMaps...>(ms);
   75|     12|  }
_ZN6hobbes15unique_refc_mapIKNS_5ArrayEJSt10shared_ptrINS_8MonoTypeEEEE7compactEv:
   48|     12|    size_t compact() {
   49|     12|      size_t c = 0;
   50|     12|      std::lock_guard<std::recursive_mutex> lock(mutex);
   51|  4.03k|      for (auto v = this->values.begin(); v != this->values.end();) {
  ------------------
  |  Branch (51:43): [True: 4.01k, False: 12]
  ------------------
   52|  4.01k|        if (v->second.use_count() == 1) {
  ------------------
  |  Branch (52:13): [True: 2.08k, False: 1.93k]
  ------------------
   53|  2.08k|          v = this->values.erase(v);
   54|  2.08k|          ++c;
   55|  2.08k|        } else {
   56|  1.93k|          ++v;
   57|  1.93k|        }
   58|  4.01k|      }
   59|     12|      return c;
   60|     12|    }
_ZN6hobbes10compactAllILm8EJNS_15unique_refc_mapIKNS_4PrimEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEEENS1_IKNS_9OpaquePtrEJS9_jbEEENS1_IKNS_4TVarEJS9_EEENS1_IKNS_4TGenEJiEEENS1_IKNS_4TAbsEJSt6vectorIS9_SaIS9_EESC_EEENS1_IKNS_4TAppEJSC_SP_ISC_SaISC_EEEEENS1_IKNS_10FixedArrayEJSC_SC_EEENS1_IKNS_5ArrayEJSC_EEENS1_IKNS_7VariantEJSP_INS14_6MemberESaIS16_EEEEENS1_IKNS_6RecordEJSP_INS1A_6MemberESaIS1C_EEEEENS1_IKNS_4FuncEJSC_SC_EEENS1_IKNS_6ExistsEJS9_SC_EEENS1_IKNS_9RecursiveEJS9_SC_EEENS1_IKNS_7TStringEJS9_EEENS1_IKNS_5TLongEJlEEENS1_IKNS_5TExprEJS9_EEEEEENSt9enable_ifIXltT_sZT0_EmE4typeERSt5tupleIJDpT0_EE:
   73|     12|  inline typename std::enable_if<i < sizeof...(UniqueRefcMaps), size_t>::type compactAll(std::tuple<UniqueRefcMaps...>& ms) {
   74|     12|    return std::get<i>(ms).compact() + compactAll<i+1, UniqueRefcMaps...>(ms);
   75|     12|  }
_ZN6hobbes15unique_refc_mapIKNS_7VariantEJSt6vectorINS1_6MemberESaIS4_EEEE7compactEv:
   48|     12|    size_t compact() {
   49|     12|      size_t c = 0;
   50|     12|      std::lock_guard<std::recursive_mutex> lock(mutex);
   51|  2.02k|      for (auto v = this->values.begin(); v != this->values.end();) {
  ------------------
  |  Branch (51:43): [True: 2.01k, False: 12]
  ------------------
   52|  2.01k|        if (v->second.use_count() == 1) {
  ------------------
  |  Branch (52:13): [True: 1.34k, False: 675]
  ------------------
   53|  1.34k|          v = this->values.erase(v);
   54|  1.34k|          ++c;
   55|  1.34k|        } else {
   56|    675|          ++v;
   57|    675|        }
   58|  2.01k|      }
   59|     12|      return c;
   60|     12|    }
_ZN6hobbes10compactAllILm9EJNS_15unique_refc_mapIKNS_4PrimEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEEENS1_IKNS_9OpaquePtrEJS9_jbEEENS1_IKNS_4TVarEJS9_EEENS1_IKNS_4TGenEJiEEENS1_IKNS_4TAbsEJSt6vectorIS9_SaIS9_EESC_EEENS1_IKNS_4TAppEJSC_SP_ISC_SaISC_EEEEENS1_IKNS_10FixedArrayEJSC_SC_EEENS1_IKNS_5ArrayEJSC_EEENS1_IKNS_7VariantEJSP_INS14_6MemberESaIS16_EEEEENS1_IKNS_6RecordEJSP_INS1A_6MemberESaIS1C_EEEEENS1_IKNS_4FuncEJSC_SC_EEENS1_IKNS_6ExistsEJS9_SC_EEENS1_IKNS_9RecursiveEJS9_SC_EEENS1_IKNS_7TStringEJS9_EEENS1_IKNS_5TLongEJlEEENS1_IKNS_5TExprEJS9_EEEEEENSt9enable_ifIXltT_sZT0_EmE4typeERSt5tupleIJDpT0_EE:
   73|     12|  inline typename std::enable_if<i < sizeof...(UniqueRefcMaps), size_t>::type compactAll(std::tuple<UniqueRefcMaps...>& ms) {
   74|     12|    return std::get<i>(ms).compact() + compactAll<i+1, UniqueRefcMaps...>(ms);
   75|     12|  }
_ZN6hobbes15unique_refc_mapIKNS_6RecordEJSt6vectorINS1_6MemberESaIS4_EEEE7compactEv:
   48|     12|    size_t compact() {
   49|     12|      size_t c = 0;
   50|     12|      std::lock_guard<std::recursive_mutex> lock(mutex);
   51|  20.4k|      for (auto v = this->values.begin(); v != this->values.end();) {
  ------------------
  |  Branch (51:43): [True: 20.4k, False: 12]
  ------------------
   52|  20.4k|        if (v->second.use_count() == 1) {
  ------------------
  |  Branch (52:13): [True: 9.95k, False: 10.5k]
  ------------------
   53|  9.95k|          v = this->values.erase(v);
   54|  9.95k|          ++c;
   55|  10.5k|        } else {
   56|  10.5k|          ++v;
   57|  10.5k|        }
   58|  20.4k|      }
   59|     12|      return c;
   60|     12|    }
_ZN6hobbes10compactAllILm10EJNS_15unique_refc_mapIKNS_4PrimEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEEENS1_IKNS_9OpaquePtrEJS9_jbEEENS1_IKNS_4TVarEJS9_EEENS1_IKNS_4TGenEJiEEENS1_IKNS_4TAbsEJSt6vectorIS9_SaIS9_EESC_EEENS1_IKNS_4TAppEJSC_SP_ISC_SaISC_EEEEENS1_IKNS_10FixedArrayEJSC_SC_EEENS1_IKNS_5ArrayEJSC_EEENS1_IKNS_7VariantEJSP_INS14_6MemberESaIS16_EEEEENS1_IKNS_6RecordEJSP_INS1A_6MemberESaIS1C_EEEEENS1_IKNS_4FuncEJSC_SC_EEENS1_IKNS_6ExistsEJS9_SC_EEENS1_IKNS_9RecursiveEJS9_SC_EEENS1_IKNS_7TStringEJS9_EEENS1_IKNS_5TLongEJlEEENS1_IKNS_5TExprEJS9_EEEEEENSt9enable_ifIXltT_sZT0_EmE4typeERSt5tupleIJDpT0_EE:
   73|     12|  inline typename std::enable_if<i < sizeof...(UniqueRefcMaps), size_t>::type compactAll(std::tuple<UniqueRefcMaps...>& ms) {
   74|     12|    return std::get<i>(ms).compact() + compactAll<i+1, UniqueRefcMaps...>(ms);
   75|     12|  }
_ZN6hobbes15unique_refc_mapIKNS_4FuncEJSt10shared_ptrINS_8MonoTypeEES5_EE7compactEv:
   48|     12|    size_t compact() {
   49|     12|      size_t c = 0;
   50|     12|      std::lock_guard<std::recursive_mutex> lock(mutex);
   51|  10.6k|      for (auto v = this->values.begin(); v != this->values.end();) {
  ------------------
  |  Branch (51:43): [True: 10.5k, False: 12]
  ------------------
   52|  10.5k|        if (v->second.use_count() == 1) {
  ------------------
  |  Branch (52:13): [True: 9.43k, False: 1.16k]
  ------------------
   53|  9.43k|          v = this->values.erase(v);
   54|  9.43k|          ++c;
   55|  9.43k|        } else {
   56|  1.16k|          ++v;
   57|  1.16k|        }
   58|  10.5k|      }
   59|     12|      return c;
   60|     12|    }
_ZN6hobbes10compactAllILm11EJNS_15unique_refc_mapIKNS_4PrimEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEEENS1_IKNS_9OpaquePtrEJS9_jbEEENS1_IKNS_4TVarEJS9_EEENS1_IKNS_4TGenEJiEEENS1_IKNS_4TAbsEJSt6vectorIS9_SaIS9_EESC_EEENS1_IKNS_4TAppEJSC_SP_ISC_SaISC_EEEEENS1_IKNS_10FixedArrayEJSC_SC_EEENS1_IKNS_5ArrayEJSC_EEENS1_IKNS_7VariantEJSP_INS14_6MemberESaIS16_EEEEENS1_IKNS_6RecordEJSP_INS1A_6MemberESaIS1C_EEEEENS1_IKNS_4FuncEJSC_SC_EEENS1_IKNS_6ExistsEJS9_SC_EEENS1_IKNS_9RecursiveEJS9_SC_EEENS1_IKNS_7TStringEJS9_EEENS1_IKNS_5TLongEJlEEENS1_IKNS_5TExprEJS9_EEEEEENSt9enable_ifIXltT_sZT0_EmE4typeERSt5tupleIJDpT0_EE:
   73|     12|  inline typename std::enable_if<i < sizeof...(UniqueRefcMaps), size_t>::type compactAll(std::tuple<UniqueRefcMaps...>& ms) {
   74|     12|    return std::get<i>(ms).compact() + compactAll<i+1, UniqueRefcMaps...>(ms);
   75|     12|  }
_ZN6hobbes15unique_refc_mapIKNS_6ExistsEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEE7compactEv:
   48|     12|    size_t compact() {
   49|     12|      size_t c = 0;
   50|     12|      std::lock_guard<std::recursive_mutex> lock(mutex);
   51|    389|      for (auto v = this->values.begin(); v != this->values.end();) {
  ------------------
  |  Branch (51:43): [True: 377, False: 12]
  ------------------
   52|    377|        if (v->second.use_count() == 1) {
  ------------------
  |  Branch (52:13): [True: 215, False: 162]
  ------------------
   53|    215|          v = this->values.erase(v);
   54|    215|          ++c;
   55|    215|        } else {
   56|    162|          ++v;
   57|    162|        }
   58|    377|      }
   59|     12|      return c;
   60|     12|    }
_ZN6hobbes10compactAllILm12EJNS_15unique_refc_mapIKNS_4PrimEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEEENS1_IKNS_9OpaquePtrEJS9_jbEEENS1_IKNS_4TVarEJS9_EEENS1_IKNS_4TGenEJiEEENS1_IKNS_4TAbsEJSt6vectorIS9_SaIS9_EESC_EEENS1_IKNS_4TAppEJSC_SP_ISC_SaISC_EEEEENS1_IKNS_10FixedArrayEJSC_SC_EEENS1_IKNS_5ArrayEJSC_EEENS1_IKNS_7VariantEJSP_INS14_6MemberESaIS16_EEEEENS1_IKNS_6RecordEJSP_INS1A_6MemberESaIS1C_EEEEENS1_IKNS_4FuncEJSC_SC_EEENS1_IKNS_6ExistsEJS9_SC_EEENS1_IKNS_9RecursiveEJS9_SC_EEENS1_IKNS_7TStringEJS9_EEENS1_IKNS_5TLongEJlEEENS1_IKNS_5TExprEJS9_EEEEEENSt9enable_ifIXltT_sZT0_EmE4typeERSt5tupleIJDpT0_EE:
   73|     12|  inline typename std::enable_if<i < sizeof...(UniqueRefcMaps), size_t>::type compactAll(std::tuple<UniqueRefcMaps...>& ms) {
   74|     12|    return std::get<i>(ms).compact() + compactAll<i+1, UniqueRefcMaps...>(ms);
   75|     12|  }
_ZN6hobbes15unique_refc_mapIKNS_9RecursiveEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEE7compactEv:
   48|     12|    size_t compact() {
   49|     12|      size_t c = 0;
   50|     12|      std::lock_guard<std::recursive_mutex> lock(mutex);
   51|    383|      for (auto v = this->values.begin(); v != this->values.end();) {
  ------------------
  |  Branch (51:43): [True: 371, False: 12]
  ------------------
   52|    371|        if (v->second.use_count() == 1) {
  ------------------
  |  Branch (52:13): [True: 191, False: 180]
  ------------------
   53|    191|          v = this->values.erase(v);
   54|    191|          ++c;
   55|    191|        } else {
   56|    180|          ++v;
   57|    180|        }
   58|    371|      }
   59|     12|      return c;
   60|     12|    }
_ZN6hobbes10compactAllILm13EJNS_15unique_refc_mapIKNS_4PrimEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEEENS1_IKNS_9OpaquePtrEJS9_jbEEENS1_IKNS_4TVarEJS9_EEENS1_IKNS_4TGenEJiEEENS1_IKNS_4TAbsEJSt6vectorIS9_SaIS9_EESC_EEENS1_IKNS_4TAppEJSC_SP_ISC_SaISC_EEEEENS1_IKNS_10FixedArrayEJSC_SC_EEENS1_IKNS_5ArrayEJSC_EEENS1_IKNS_7VariantEJSP_INS14_6MemberESaIS16_EEEEENS1_IKNS_6RecordEJSP_INS1A_6MemberESaIS1C_EEEEENS1_IKNS_4FuncEJSC_SC_EEENS1_IKNS_6ExistsEJS9_SC_EEENS1_IKNS_9RecursiveEJS9_SC_EEENS1_IKNS_7TStringEJS9_EEENS1_IKNS_5TLongEJlEEENS1_IKNS_5TExprEJS9_EEEEEENSt9enable_ifIXltT_sZT0_EmE4typeERSt5tupleIJDpT0_EE:
   73|     12|  inline typename std::enable_if<i < sizeof...(UniqueRefcMaps), size_t>::type compactAll(std::tuple<UniqueRefcMaps...>& ms) {
   74|     12|    return std::get<i>(ms).compact() + compactAll<i+1, UniqueRefcMaps...>(ms);
   75|     12|  }
_ZN6hobbes15unique_refc_mapIKNS_7TStringEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE7compactEv:
   48|     12|    size_t compact() {
   49|     12|      size_t c = 0;
   50|     12|      std::lock_guard<std::recursive_mutex> lock(mutex);
   51|    210|      for (auto v = this->values.begin(); v != this->values.end();) {
  ------------------
  |  Branch (51:43): [True: 198, False: 12]
  ------------------
   52|    198|        if (v->second.use_count() == 1) {
  ------------------
  |  Branch (52:13): [True: 193, False: 5]
  ------------------
   53|    193|          v = this->values.erase(v);
   54|    193|          ++c;
   55|    193|        } else {
   56|      5|          ++v;
   57|      5|        }
   58|    198|      }
   59|     12|      return c;
   60|     12|    }
_ZN6hobbes10compactAllILm14EJNS_15unique_refc_mapIKNS_4PrimEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEEENS1_IKNS_9OpaquePtrEJS9_jbEEENS1_IKNS_4TVarEJS9_EEENS1_IKNS_4TGenEJiEEENS1_IKNS_4TAbsEJSt6vectorIS9_SaIS9_EESC_EEENS1_IKNS_4TAppEJSC_SP_ISC_SaISC_EEEEENS1_IKNS_10FixedArrayEJSC_SC_EEENS1_IKNS_5ArrayEJSC_EEENS1_IKNS_7VariantEJSP_INS14_6MemberESaIS16_EEEEENS1_IKNS_6RecordEJSP_INS1A_6MemberESaIS1C_EEEEENS1_IKNS_4FuncEJSC_SC_EEENS1_IKNS_6ExistsEJS9_SC_EEENS1_IKNS_9RecursiveEJS9_SC_EEENS1_IKNS_7TStringEJS9_EEENS1_IKNS_5TLongEJlEEENS1_IKNS_5TExprEJS9_EEEEEENSt9enable_ifIXltT_sZT0_EmE4typeERSt5tupleIJDpT0_EE:
   73|     12|  inline typename std::enable_if<i < sizeof...(UniqueRefcMaps), size_t>::type compactAll(std::tuple<UniqueRefcMaps...>& ms) {
   74|     12|    return std::get<i>(ms).compact() + compactAll<i+1, UniqueRefcMaps...>(ms);
   75|     12|  }
_ZN6hobbes15unique_refc_mapIKNS_5TLongEJlEE7compactEv:
   48|     12|    size_t compact() {
   49|     12|      size_t c = 0;
   50|     12|      std::lock_guard<std::recursive_mutex> lock(mutex);
   51|     73|      for (auto v = this->values.begin(); v != this->values.end();) {
  ------------------
  |  Branch (51:43): [True: 61, False: 12]
  ------------------
   52|     61|        if (v->second.use_count() == 1) {
  ------------------
  |  Branch (52:13): [True: 12, False: 49]
  ------------------
   53|     12|          v = this->values.erase(v);
   54|     12|          ++c;
   55|     49|        } else {
   56|     49|          ++v;
   57|     49|        }
   58|     61|      }
   59|     12|      return c;
   60|     12|    }
_ZN6hobbes10compactAllILm15EJNS_15unique_refc_mapIKNS_4PrimEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEEENS1_IKNS_9OpaquePtrEJS9_jbEEENS1_IKNS_4TVarEJS9_EEENS1_IKNS_4TGenEJiEEENS1_IKNS_4TAbsEJSt6vectorIS9_SaIS9_EESC_EEENS1_IKNS_4TAppEJSC_SP_ISC_SaISC_EEEEENS1_IKNS_10FixedArrayEJSC_SC_EEENS1_IKNS_5ArrayEJSC_EEENS1_IKNS_7VariantEJSP_INS14_6MemberESaIS16_EEEEENS1_IKNS_6RecordEJSP_INS1A_6MemberESaIS1C_EEEEENS1_IKNS_4FuncEJSC_SC_EEENS1_IKNS_6ExistsEJS9_SC_EEENS1_IKNS_9RecursiveEJS9_SC_EEENS1_IKNS_7TStringEJS9_EEENS1_IKNS_5TLongEJlEEENS1_IKNS_5TExprEJS9_EEEEEENSt9enable_ifIXltT_sZT0_EmE4typeERSt5tupleIJDpT0_EE:
   73|     12|  inline typename std::enable_if<i < sizeof...(UniqueRefcMaps), size_t>::type compactAll(std::tuple<UniqueRefcMaps...>& ms) {
   74|     12|    return std::get<i>(ms).compact() + compactAll<i+1, UniqueRefcMaps...>(ms);
   75|     12|  }
_ZN6hobbes15unique_refc_mapIKNS_5TExprEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE7compactEv:
   48|     12|    size_t compact() {
   49|     12|      size_t c = 0;
   50|     12|      std::lock_guard<std::recursive_mutex> lock(mutex);
   51|    107|      for (auto v = this->values.begin(); v != this->values.end();) {
  ------------------
  |  Branch (51:43): [True: 95, False: 12]
  ------------------
   52|     95|        if (v->second.use_count() == 1) {
  ------------------
  |  Branch (52:13): [True: 89, False: 6]
  ------------------
   53|     89|          v = this->values.erase(v);
   54|     89|          ++c;
   55|     89|        } else {
   56|      6|          ++v;
   57|      6|        }
   58|     95|      }
   59|     12|      return c;
   60|     12|    }
_ZN6hobbes10compactAllILm16EJNS_15unique_refc_mapIKNS_4PrimEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEEENS1_IKNS_9OpaquePtrEJS9_jbEEENS1_IKNS_4TVarEJS9_EEENS1_IKNS_4TGenEJiEEENS1_IKNS_4TAbsEJSt6vectorIS9_SaIS9_EESC_EEENS1_IKNS_4TAppEJSC_SP_ISC_SaISC_EEEEENS1_IKNS_10FixedArrayEJSC_SC_EEENS1_IKNS_5ArrayEJSC_EEENS1_IKNS_7VariantEJSP_INS14_6MemberESaIS16_EEEEENS1_IKNS_6RecordEJSP_INS1A_6MemberESaIS1C_EEEEENS1_IKNS_4FuncEJSC_SC_EEENS1_IKNS_6ExistsEJS9_SC_EEENS1_IKNS_9RecursiveEJS9_SC_EEENS1_IKNS_7TStringEJS9_EEENS1_IKNS_5TLongEJlEEENS1_IKNS_5TExprEJS9_EEEEEENSt9enable_ifIXeqT_sZT0_EmE4typeERSt5tupleIJDpT0_EE:
   68|     12|  inline typename std::enable_if<i == sizeof...(UniqueRefcMaps), size_t>::type compactAll(std::tuple<UniqueRefcMaps...>&) {
   69|     12|    return 0;
   70|     12|  }
_ZN6hobbes16unique_refc_mapsIJNS_15unique_refc_mapIKNS_4PrimEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEEENS1_IKNS_9OpaquePtrEJS9_jbEEENS1_IKNS_4TVarEJS9_EEENS1_IKNS_4TGenEJiEEENS1_IKNS_4TAbsEJSt6vectorIS9_SaIS9_EESC_EEENS1_IKNS_4TAppEJSC_SP_ISC_SaISC_EEEEENS1_IKNS_10FixedArrayEJSC_SC_EEENS1_IKNS_5ArrayEJSC_EEENS1_IKNS_7VariantEJSP_INS14_6MemberESaIS16_EEEEENS1_IKNS_6RecordEJSP_INS1A_6MemberESaIS1C_EEEEENS1_IKNS_4FuncEJSC_SC_EEENS1_IKNS_6ExistsEJS9_SC_EEENS1_IKNS_9RecursiveEJS9_SC_EEENS1_IKNS_7TStringEJS9_EEENS1_IKNS_5TLongEJlEEENS1_IKNS_5TExprEJS9_EEEEE2atISD_EERNSt13tuple_elementIXsr9TypeIndexILi0ET_SD_SG_SJ_SM_SS_SX_S10_S13_S19_S1F_S1I_S1L_S1O_S1R_S1U_S1X_EE5valueESt5tupleIJSD_SG_SJ_SM_SS_SX_S10_S13_S19_S1F_S1I_S1L_S1O_S1R_S1U_S1X_EEE4typeEv:
   99|  36.2k|      typename std::tuple_element<TypeIndex<0, T, UniqueRefcMaps...>::value, RefcMaps>::type& at() {
  100|  36.2k|        return std::get<TypeIndex<0, T, UniqueRefcMaps...>::value>(this->refcMaps);
  101|  36.2k|      }
_ZN6hobbes15unique_refc_mapIKNS_4PrimEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEE3getERKSt8functionIFPS2_S8_SB_EERKS8_RKSB_:
   26|  36.2k|    std::shared_ptr<T> get(const std::function<T*(Args...)>& mk, const Args&... args) {
   27|  36.2k|      std::lock_guard<std::recursive_mutex> lock(mutex);
   28|  36.2k|      auto k = std::tuple<Args...>(args...);
   29|       |
   30|  36.2k|      auto found = this->values.find(k);
   31|  36.2k|      if (found != this->values.end() && found->second) {
  ------------------
  |  Branch (31:11): [True: 36.1k, False: 38]
  |  Branch (31:11): [True: 36.1k, False: 38]
  |  Branch (31:42): [True: 36.1k, False: 0]
  ------------------
   32|  36.1k|        return found->second;
   33|  36.1k|      }
   34|       |
   35|       |      // no reference into the map is held across mk(): constructing a type can
   36|       |      // intern the types it is made of, re-entering this map (the mutex is
   37|       |      // recursive for that reason), and an insertion there can rehash it. So
   38|       |      // construct first, then look the key up again, and keep whichever entry
   39|       |      // is there -- mk() may have interned this very key on the way.
   40|     38|      std::shared_ptr<T> made(mk(args...));
   41|     38|      std::shared_ptr<T>& slot = this->values[k];
   42|     38|      if (!slot) {
  ------------------
  |  Branch (42:11): [True: 38, False: 0]
  ------------------
   43|     38|        slot = made;
   44|     38|      }
   45|     38|      return slot;
   46|  36.2k|    }
_ZN6hobbes16unique_refc_mapsIJNS_15unique_refc_mapIKNS_4PrimEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEEENS1_IKNS_9OpaquePtrEJS9_jbEEENS1_IKNS_4TVarEJS9_EEENS1_IKNS_4TGenEJiEEENS1_IKNS_4TAbsEJSt6vectorIS9_SaIS9_EESC_EEENS1_IKNS_4TAppEJSC_SP_ISC_SaISC_EEEEENS1_IKNS_10FixedArrayEJSC_SC_EEENS1_IKNS_5ArrayEJSC_EEENS1_IKNS_7VariantEJSP_INS14_6MemberESaIS16_EEEEENS1_IKNS_6RecordEJSP_INS1A_6MemberESaIS1C_EEEEENS1_IKNS_4FuncEJSC_SC_EEENS1_IKNS_6ExistsEJS9_SC_EEENS1_IKNS_9RecursiveEJS9_SC_EEENS1_IKNS_7TStringEJS9_EEENS1_IKNS_5TLongEJlEEENS1_IKNS_5TExprEJS9_EEEEE2atISG_EERNSt13tuple_elementIXsr9TypeIndexILi0ET_SD_SG_SJ_SM_SS_SX_S10_S13_S19_S1F_S1I_S1L_S1O_S1R_S1U_S1X_EE5valueESt5tupleIJSD_SG_SJ_SM_SS_SX_S10_S13_S19_S1F_S1I_S1L_S1O_S1R_S1U_S1X_EEE4typeEv:
   99|    634|      typename std::tuple_element<TypeIndex<0, T, UniqueRefcMaps...>::value, RefcMaps>::type& at() {
  100|    634|        return std::get<TypeIndex<0, T, UniqueRefcMaps...>::value>(this->refcMaps);
  101|    634|      }
_ZN6hobbes15unique_refc_mapIKNS_9OpaquePtrEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEjbEE3getERKSt8functionIFPS2_S8_jbEERKS8_RKjRKb:
   26|    634|    std::shared_ptr<T> get(const std::function<T*(Args...)>& mk, const Args&... args) {
   27|    634|      std::lock_guard<std::recursive_mutex> lock(mutex);
   28|    634|      auto k = std::tuple<Args...>(args...);
   29|       |
   30|    634|      auto found = this->values.find(k);
   31|    634|      if (found != this->values.end() && found->second) {
  ------------------
  |  Branch (31:11): [True: 625, False: 9]
  |  Branch (31:11): [True: 625, False: 9]
  |  Branch (31:42): [True: 625, False: 0]
  ------------------
   32|    625|        return found->second;
   33|    625|      }
   34|       |
   35|       |      // no reference into the map is held across mk(): constructing a type can
   36|       |      // intern the types it is made of, re-entering this map (the mutex is
   37|       |      // recursive for that reason), and an insertion there can rehash it. So
   38|       |      // construct first, then look the key up again, and keep whichever entry
   39|       |      // is there -- mk() may have interned this very key on the way.
   40|      9|      std::shared_ptr<T> made(mk(args...));
   41|      9|      std::shared_ptr<T>& slot = this->values[k];
   42|      9|      if (!slot) {
  ------------------
  |  Branch (42:11): [True: 9, False: 0]
  ------------------
   43|      9|        slot = made;
   44|      9|      }
   45|      9|      return slot;
   46|    634|    }
_ZN6hobbes16unique_refc_mapsIJNS_15unique_refc_mapIKNS_4PrimEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEEENS1_IKNS_9OpaquePtrEJS9_jbEEENS1_IKNS_4TVarEJS9_EEENS1_IKNS_4TGenEJiEEENS1_IKNS_4TAbsEJSt6vectorIS9_SaIS9_EESC_EEENS1_IKNS_4TAppEJSC_SP_ISC_SaISC_EEEEENS1_IKNS_10FixedArrayEJSC_SC_EEENS1_IKNS_5ArrayEJSC_EEENS1_IKNS_7VariantEJSP_INS14_6MemberESaIS16_EEEEENS1_IKNS_6RecordEJSP_INS1A_6MemberESaIS1C_EEEEENS1_IKNS_4FuncEJSC_SC_EEENS1_IKNS_6ExistsEJS9_SC_EEENS1_IKNS_9RecursiveEJS9_SC_EEENS1_IKNS_7TStringEJS9_EEENS1_IKNS_5TLongEJlEEENS1_IKNS_5TExprEJS9_EEEEE2atISJ_EERNSt13tuple_elementIXsr9TypeIndexILi0ET_SD_SG_SJ_SM_SS_SX_S10_S13_S19_S1F_S1I_S1L_S1O_S1R_S1U_S1X_EE5valueESt5tupleIJSD_SG_SJ_SM_SS_SX_S10_S13_S19_S1F_S1I_S1L_S1O_S1R_S1U_S1X_EEE4typeEv:
   99|   179k|      typename std::tuple_element<TypeIndex<0, T, UniqueRefcMaps...>::value, RefcMaps>::type& at() {
  100|   179k|        return std::get<TypeIndex<0, T, UniqueRefcMaps...>::value>(this->refcMaps);
  101|   179k|      }
_ZN6hobbes15unique_refc_mapIKNS_4TVarEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE3getERKSt8functionIFPS2_S8_EERKS8_:
   26|   179k|    std::shared_ptr<T> get(const std::function<T*(Args...)>& mk, const Args&... args) {
   27|   179k|      std::lock_guard<std::recursive_mutex> lock(mutex);
   28|   179k|      auto k = std::tuple<Args...>(args...);
   29|       |
   30|   179k|      auto found = this->values.find(k);
   31|   179k|      if (found != this->values.end() && found->second) {
  ------------------
  |  Branch (31:11): [True: 160k, False: 19.0k]
  |  Branch (31:11): [True: 160k, False: 19.0k]
  |  Branch (31:42): [True: 160k, False: 0]
  ------------------
   32|   160k|        return found->second;
   33|   160k|      }
   34|       |
   35|       |      // no reference into the map is held across mk(): constructing a type can
   36|       |      // intern the types it is made of, re-entering this map (the mutex is
   37|       |      // recursive for that reason), and an insertion there can rehash it. So
   38|       |      // construct first, then look the key up again, and keep whichever entry
   39|       |      // is there -- mk() may have interned this very key on the way.
   40|  19.0k|      std::shared_ptr<T> made(mk(args...));
   41|  19.0k|      std::shared_ptr<T>& slot = this->values[k];
   42|  19.0k|      if (!slot) {
  ------------------
  |  Branch (42:11): [True: 19.0k, False: 0]
  ------------------
   43|  19.0k|        slot = made;
   44|  19.0k|      }
   45|  19.0k|      return slot;
   46|   179k|    }
_ZN6hobbes16unique_refc_mapsIJNS_15unique_refc_mapIKNS_4PrimEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEEENS1_IKNS_9OpaquePtrEJS9_jbEEENS1_IKNS_4TVarEJS9_EEENS1_IKNS_4TGenEJiEEENS1_IKNS_4TAbsEJSt6vectorIS9_SaIS9_EESC_EEENS1_IKNS_4TAppEJSC_SP_ISC_SaISC_EEEEENS1_IKNS_10FixedArrayEJSC_SC_EEENS1_IKNS_5ArrayEJSC_EEENS1_IKNS_7VariantEJSP_INS14_6MemberESaIS16_EEEEENS1_IKNS_6RecordEJSP_INS1A_6MemberESaIS1C_EEEEENS1_IKNS_4FuncEJSC_SC_EEENS1_IKNS_6ExistsEJS9_SC_EEENS1_IKNS_9RecursiveEJS9_SC_EEENS1_IKNS_7TStringEJS9_EEENS1_IKNS_5TLongEJlEEENS1_IKNS_5TExprEJS9_EEEEE2atISM_EERNSt13tuple_elementIXsr9TypeIndexILi0ET_SD_SG_SJ_SM_SS_SX_S10_S13_S19_S1F_S1I_S1L_S1O_S1R_S1U_S1X_EE5valueESt5tupleIJSD_SG_SJ_SM_SS_SX_S10_S13_S19_S1F_S1I_S1L_S1O_S1R_S1U_S1X_EEE4typeEv:
   99|  19.5k|      typename std::tuple_element<TypeIndex<0, T, UniqueRefcMaps...>::value, RefcMaps>::type& at() {
  100|  19.5k|        return std::get<TypeIndex<0, T, UniqueRefcMaps...>::value>(this->refcMaps);
  101|  19.5k|      }
_ZN6hobbes15unique_refc_mapIKNS_4TGenEJiEE3getERKSt8functionIFPS2_iEERKi:
   26|  19.5k|    std::shared_ptr<T> get(const std::function<T*(Args...)>& mk, const Args&... args) {
   27|  19.5k|      std::lock_guard<std::recursive_mutex> lock(mutex);
   28|  19.5k|      auto k = std::tuple<Args...>(args...);
   29|       |
   30|  19.5k|      auto found = this->values.find(k);
   31|  19.5k|      if (found != this->values.end() && found->second) {
  ------------------
  |  Branch (31:11): [True: 19.5k, False: 34]
  |  Branch (31:11): [True: 19.5k, False: 34]
  |  Branch (31:42): [True: 19.5k, False: 0]
  ------------------
   32|  19.5k|        return found->second;
   33|  19.5k|      }
   34|       |
   35|       |      // no reference into the map is held across mk(): constructing a type can
   36|       |      // intern the types it is made of, re-entering this map (the mutex is
   37|       |      // recursive for that reason), and an insertion there can rehash it. So
   38|       |      // construct first, then look the key up again, and keep whichever entry
   39|       |      // is there -- mk() may have interned this very key on the way.
   40|     34|      std::shared_ptr<T> made(mk(args...));
   41|     34|      std::shared_ptr<T>& slot = this->values[k];
   42|     34|      if (!slot) {
  ------------------
  |  Branch (42:11): [True: 34, False: 0]
  ------------------
   43|     34|        slot = made;
   44|     34|      }
   45|     34|      return slot;
   46|  19.5k|    }
_ZN6hobbes16unique_refc_mapsIJNS_15unique_refc_mapIKNS_4PrimEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEEENS1_IKNS_9OpaquePtrEJS9_jbEEENS1_IKNS_4TVarEJS9_EEENS1_IKNS_4TGenEJiEEENS1_IKNS_4TAbsEJSt6vectorIS9_SaIS9_EESC_EEENS1_IKNS_4TAppEJSC_SP_ISC_SaISC_EEEEENS1_IKNS_10FixedArrayEJSC_SC_EEENS1_IKNS_5ArrayEJSC_EEENS1_IKNS_7VariantEJSP_INS14_6MemberESaIS16_EEEEENS1_IKNS_6RecordEJSP_INS1A_6MemberESaIS1C_EEEEENS1_IKNS_4FuncEJSC_SC_EEENS1_IKNS_6ExistsEJS9_SC_EEENS1_IKNS_9RecursiveEJS9_SC_EEENS1_IKNS_7TStringEJS9_EEENS1_IKNS_5TLongEJlEEENS1_IKNS_5TExprEJS9_EEEEE2atISS_EERNSt13tuple_elementIXsr9TypeIndexILi0ET_SD_SG_SJ_SM_SS_SX_S10_S13_S19_S1F_S1I_S1L_S1O_S1R_S1U_S1X_EE5valueESt5tupleIJSD_SG_SJ_SM_SS_SX_S10_S13_S19_S1F_S1I_S1L_S1O_S1R_S1U_S1X_EEE4typeEv:
   99|    110|      typename std::tuple_element<TypeIndex<0, T, UniqueRefcMaps...>::value, RefcMaps>::type& at() {
  100|    110|        return std::get<TypeIndex<0, T, UniqueRefcMaps...>::value>(this->refcMaps);
  101|    110|      }
_ZN6hobbes15unique_refc_mapIKNS_4TAbsEJSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EESt10shared_ptrINS_8MonoTypeEEEE3getERKSt8functionIFPS2_SB_SE_EERKSB_RKSE_:
   26|    110|    std::shared_ptr<T> get(const std::function<T*(Args...)>& mk, const Args&... args) {
   27|    110|      std::lock_guard<std::recursive_mutex> lock(mutex);
   28|    110|      auto k = std::tuple<Args...>(args...);
   29|       |
   30|    110|      auto found = this->values.find(k);
   31|    110|      if (found != this->values.end() && found->second) {
  ------------------
  |  Branch (31:11): [True: 97, False: 13]
  |  Branch (31:11): [True: 97, False: 13]
  |  Branch (31:42): [True: 97, False: 0]
  ------------------
   32|     97|        return found->second;
   33|     97|      }
   34|       |
   35|       |      // no reference into the map is held across mk(): constructing a type can
   36|       |      // intern the types it is made of, re-entering this map (the mutex is
   37|       |      // recursive for that reason), and an insertion there can rehash it. So
   38|       |      // construct first, then look the key up again, and keep whichever entry
   39|       |      // is there -- mk() may have interned this very key on the way.
   40|     13|      std::shared_ptr<T> made(mk(args...));
   41|     13|      std::shared_ptr<T>& slot = this->values[k];
   42|     13|      if (!slot) {
  ------------------
  |  Branch (42:11): [True: 13, False: 0]
  ------------------
   43|     13|        slot = made;
   44|     13|      }
   45|     13|      return slot;
   46|    110|    }
_ZN6hobbes16unique_refc_mapsIJNS_15unique_refc_mapIKNS_4PrimEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEEENS1_IKNS_9OpaquePtrEJS9_jbEEENS1_IKNS_4TVarEJS9_EEENS1_IKNS_4TGenEJiEEENS1_IKNS_4TAbsEJSt6vectorIS9_SaIS9_EESC_EEENS1_IKNS_4TAppEJSC_SP_ISC_SaISC_EEEEENS1_IKNS_10FixedArrayEJSC_SC_EEENS1_IKNS_5ArrayEJSC_EEENS1_IKNS_7VariantEJSP_INS14_6MemberESaIS16_EEEEENS1_IKNS_6RecordEJSP_INS1A_6MemberESaIS1C_EEEEENS1_IKNS_4FuncEJSC_SC_EEENS1_IKNS_6ExistsEJS9_SC_EEENS1_IKNS_9RecursiveEJS9_SC_EEENS1_IKNS_7TStringEJS9_EEENS1_IKNS_5TLongEJlEEENS1_IKNS_5TExprEJS9_EEEEE2atISX_EERNSt13tuple_elementIXsr9TypeIndexILi0ET_SD_SG_SJ_SM_SS_SX_S10_S13_S19_S1F_S1I_S1L_S1O_S1R_S1U_S1X_EE5valueESt5tupleIJSD_SG_SJ_SM_SS_SX_S10_S13_S19_S1F_S1I_S1L_S1O_S1R_S1U_S1X_EEE4typeEv:
   99|  3.59k|      typename std::tuple_element<TypeIndex<0, T, UniqueRefcMaps...>::value, RefcMaps>::type& at() {
  100|  3.59k|        return std::get<TypeIndex<0, T, UniqueRefcMaps...>::value>(this->refcMaps);
  101|  3.59k|      }
_ZN6hobbes15unique_refc_mapIKNS_4TAppEJSt10shared_ptrINS_8MonoTypeEESt6vectorIS5_SaIS5_EEEE3getERKSt8functionIFPS2_S5_S8_EERKS5_RKS8_:
   26|  3.59k|    std::shared_ptr<T> get(const std::function<T*(Args...)>& mk, const Args&... args) {
   27|  3.59k|      std::lock_guard<std::recursive_mutex> lock(mutex);
   28|  3.59k|      auto k = std::tuple<Args...>(args...);
   29|       |
   30|  3.59k|      auto found = this->values.find(k);
   31|  3.59k|      if (found != this->values.end() && found->second) {
  ------------------
  |  Branch (31:11): [True: 3.35k, False: 231]
  |  Branch (31:11): [True: 3.35k, False: 231]
  |  Branch (31:42): [True: 3.35k, False: 0]
  ------------------
   32|  3.35k|        return found->second;
   33|  3.35k|      }
   34|       |
   35|       |      // no reference into the map is held across mk(): constructing a type can
   36|       |      // intern the types it is made of, re-entering this map (the mutex is
   37|       |      // recursive for that reason), and an insertion there can rehash it. So
   38|       |      // construct first, then look the key up again, and keep whichever entry
   39|       |      // is there -- mk() may have interned this very key on the way.
   40|    231|      std::shared_ptr<T> made(mk(args...));
   41|    231|      std::shared_ptr<T>& slot = this->values[k];
   42|    231|      if (!slot) {
  ------------------
  |  Branch (42:11): [True: 231, False: 0]
  ------------------
   43|    231|        slot = made;
   44|    231|      }
   45|    231|      return slot;
   46|  3.59k|    }
_ZN6hobbes16unique_refc_mapsIJNS_15unique_refc_mapIKNS_4PrimEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEEENS1_IKNS_9OpaquePtrEJS9_jbEEENS1_IKNS_4TVarEJS9_EEENS1_IKNS_4TGenEJiEEENS1_IKNS_4TAbsEJSt6vectorIS9_SaIS9_EESC_EEENS1_IKNS_4TAppEJSC_SP_ISC_SaISC_EEEEENS1_IKNS_10FixedArrayEJSC_SC_EEENS1_IKNS_5ArrayEJSC_EEENS1_IKNS_7VariantEJSP_INS14_6MemberESaIS16_EEEEENS1_IKNS_6RecordEJSP_INS1A_6MemberESaIS1C_EEEEENS1_IKNS_4FuncEJSC_SC_EEENS1_IKNS_6ExistsEJS9_SC_EEENS1_IKNS_9RecursiveEJS9_SC_EEENS1_IKNS_7TStringEJS9_EEENS1_IKNS_5TLongEJlEEENS1_IKNS_5TExprEJS9_EEEEE2atIS10_EERNSt13tuple_elementIXsr9TypeIndexILi0ET_SD_SG_SJ_SM_SS_SX_S10_S13_S19_S1F_S1I_S1L_S1O_S1R_S1U_S1X_EE5valueESt5tupleIJSD_SG_SJ_SM_SS_SX_S10_S13_S19_S1F_S1I_S1L_S1O_S1R_S1U_S1X_EEE4typeEv:
   99|    911|      typename std::tuple_element<TypeIndex<0, T, UniqueRefcMaps...>::value, RefcMaps>::type& at() {
  100|    911|        return std::get<TypeIndex<0, T, UniqueRefcMaps...>::value>(this->refcMaps);
  101|    911|      }
_ZN6hobbes15unique_refc_mapIKNS_10FixedArrayEJSt10shared_ptrINS_8MonoTypeEES5_EE3getERKSt8functionIFPS2_S5_S5_EERKS5_SE_:
   26|    911|    std::shared_ptr<T> get(const std::function<T*(Args...)>& mk, const Args&... args) {
   27|    911|      std::lock_guard<std::recursive_mutex> lock(mutex);
   28|    911|      auto k = std::tuple<Args...>(args...);
   29|       |
   30|    911|      auto found = this->values.find(k);
   31|    911|      if (found != this->values.end() && found->second) {
  ------------------
  |  Branch (31:11): [True: 812, False: 99]
  |  Branch (31:11): [True: 812, False: 99]
  |  Branch (31:42): [True: 812, False: 0]
  ------------------
   32|    812|        return found->second;
   33|    812|      }
   34|       |
   35|       |      // no reference into the map is held across mk(): constructing a type can
   36|       |      // intern the types it is made of, re-entering this map (the mutex is
   37|       |      // recursive for that reason), and an insertion there can rehash it. So
   38|       |      // construct first, then look the key up again, and keep whichever entry
   39|       |      // is there -- mk() may have interned this very key on the way.
   40|     99|      std::shared_ptr<T> made(mk(args...));
   41|     99|      std::shared_ptr<T>& slot = this->values[k];
   42|     99|      if (!slot) {
  ------------------
  |  Branch (42:11): [True: 99, False: 0]
  ------------------
   43|     99|        slot = made;
   44|     99|      }
   45|     99|      return slot;
   46|    911|    }
_ZN6hobbes16unique_refc_mapsIJNS_15unique_refc_mapIKNS_4PrimEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEEENS1_IKNS_9OpaquePtrEJS9_jbEEENS1_IKNS_4TVarEJS9_EEENS1_IKNS_4TGenEJiEEENS1_IKNS_4TAbsEJSt6vectorIS9_SaIS9_EESC_EEENS1_IKNS_4TAppEJSC_SP_ISC_SaISC_EEEEENS1_IKNS_10FixedArrayEJSC_SC_EEENS1_IKNS_5ArrayEJSC_EEENS1_IKNS_7VariantEJSP_INS14_6MemberESaIS16_EEEEENS1_IKNS_6RecordEJSP_INS1A_6MemberESaIS1C_EEEEENS1_IKNS_4FuncEJSC_SC_EEENS1_IKNS_6ExistsEJS9_SC_EEENS1_IKNS_9RecursiveEJS9_SC_EEENS1_IKNS_7TStringEJS9_EEENS1_IKNS_5TLongEJlEEENS1_IKNS_5TExprEJS9_EEEEE2atIS13_EERNSt13tuple_elementIXsr9TypeIndexILi0ET_SD_SG_SJ_SM_SS_SX_S10_S13_S19_S1F_S1I_S1L_S1O_S1R_S1U_S1X_EE5valueESt5tupleIJSD_SG_SJ_SM_SS_SX_S10_S13_S19_S1F_S1I_S1L_S1O_S1R_S1U_S1X_EEE4typeEv:
   99|  21.4k|      typename std::tuple_element<TypeIndex<0, T, UniqueRefcMaps...>::value, RefcMaps>::type& at() {
  100|  21.4k|        return std::get<TypeIndex<0, T, UniqueRefcMaps...>::value>(this->refcMaps);
  101|  21.4k|      }
_ZN6hobbes15unique_refc_mapIKNS_5ArrayEJSt10shared_ptrINS_8MonoTypeEEEE3getERKSt8functionIFPS2_S5_EERKS5_:
   26|  21.4k|    std::shared_ptr<T> get(const std::function<T*(Args...)>& mk, const Args&... args) {
   27|  21.4k|      std::lock_guard<std::recursive_mutex> lock(mutex);
   28|  21.4k|      auto k = std::tuple<Args...>(args...);
   29|       |
   30|  21.4k|      auto found = this->values.find(k);
   31|  21.4k|      if (found != this->values.end() && found->second) {
  ------------------
  |  Branch (31:11): [True: 19.3k, False: 2.08k]
  |  Branch (31:11): [True: 19.3k, False: 2.08k]
  |  Branch (31:42): [True: 19.3k, False: 0]
  ------------------
   32|  19.3k|        return found->second;
   33|  19.3k|      }
   34|       |
   35|       |      // no reference into the map is held across mk(): constructing a type can
   36|       |      // intern the types it is made of, re-entering this map (the mutex is
   37|       |      // recursive for that reason), and an insertion there can rehash it. So
   38|       |      // construct first, then look the key up again, and keep whichever entry
   39|       |      // is there -- mk() may have interned this very key on the way.
   40|  2.08k|      std::shared_ptr<T> made(mk(args...));
   41|  2.08k|      std::shared_ptr<T>& slot = this->values[k];
   42|  2.08k|      if (!slot) {
  ------------------
  |  Branch (42:11): [True: 2.08k, False: 0]
  ------------------
   43|  2.08k|        slot = made;
   44|  2.08k|      }
   45|  2.08k|      return slot;
   46|  21.4k|    }
_ZN6hobbes16unique_refc_mapsIJNS_15unique_refc_mapIKNS_4PrimEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEEENS1_IKNS_9OpaquePtrEJS9_jbEEENS1_IKNS_4TVarEJS9_EEENS1_IKNS_4TGenEJiEEENS1_IKNS_4TAbsEJSt6vectorIS9_SaIS9_EESC_EEENS1_IKNS_4TAppEJSC_SP_ISC_SaISC_EEEEENS1_IKNS_10FixedArrayEJSC_SC_EEENS1_IKNS_5ArrayEJSC_EEENS1_IKNS_7VariantEJSP_INS14_6MemberESaIS16_EEEEENS1_IKNS_6RecordEJSP_INS1A_6MemberESaIS1C_EEEEENS1_IKNS_4FuncEJSC_SC_EEENS1_IKNS_6ExistsEJS9_SC_EEENS1_IKNS_9RecursiveEJS9_SC_EEENS1_IKNS_7TStringEJS9_EEENS1_IKNS_5TLongEJlEEENS1_IKNS_5TExprEJS9_EEEEE2atIS19_EERNSt13tuple_elementIXsr9TypeIndexILi0ET_SD_SG_SJ_SM_SS_SX_S10_S13_S19_S1F_S1I_S1L_S1O_S1R_S1U_S1X_EE5valueESt5tupleIJSD_SG_SJ_SM_SS_SX_S10_S13_S19_S1F_S1I_S1L_S1O_S1R_S1U_S1X_EEE4typeEv:
   99|  9.17k|      typename std::tuple_element<TypeIndex<0, T, UniqueRefcMaps...>::value, RefcMaps>::type& at() {
  100|  9.17k|        return std::get<TypeIndex<0, T, UniqueRefcMaps...>::value>(this->refcMaps);
  101|  9.17k|      }
_ZN6hobbes15unique_refc_mapIKNS_7VariantEJSt6vectorINS1_6MemberESaIS4_EEEE3getERKSt8functionIFPS2_S6_EERKS6_:
   26|  9.17k|    std::shared_ptr<T> get(const std::function<T*(Args...)>& mk, const Args&... args) {
   27|  9.17k|      std::lock_guard<std::recursive_mutex> lock(mutex);
   28|  9.17k|      auto k = std::tuple<Args...>(args...);
   29|       |
   30|  9.17k|      auto found = this->values.find(k);
   31|  9.17k|      if (found != this->values.end() && found->second) {
  ------------------
  |  Branch (31:11): [True: 7.83k, False: 1.34k]
  |  Branch (31:11): [True: 7.83k, False: 1.34k]
  |  Branch (31:42): [True: 7.83k, False: 0]
  ------------------
   32|  7.83k|        return found->second;
   33|  7.83k|      }
   34|       |
   35|       |      // no reference into the map is held across mk(): constructing a type can
   36|       |      // intern the types it is made of, re-entering this map (the mutex is
   37|       |      // recursive for that reason), and an insertion there can rehash it. So
   38|       |      // construct first, then look the key up again, and keep whichever entry
   39|       |      // is there -- mk() may have interned this very key on the way.
   40|  1.34k|      std::shared_ptr<T> made(mk(args...));
   41|  1.34k|      std::shared_ptr<T>& slot = this->values[k];
   42|  1.34k|      if (!slot) {
  ------------------
  |  Branch (42:11): [True: 1.34k, False: 0]
  ------------------
   43|  1.34k|        slot = made;
   44|  1.34k|      }
   45|  1.34k|      return slot;
   46|  9.17k|    }
_ZN6hobbes5alignIjEET_S1_S1_:
  119|    400|  T align(T x, T m) {
  120|    400|    if (m == 0 || (x % m) == 0) {
  ------------------
  |  Branch (120:9): [True: 0, False: 400]
  |  Branch (120:19): [True: 258, False: 142]
  ------------------
  121|    258|      return x;
  122|    258|    } else {
  123|    142|      return (1 + (x / m)) * m;
  124|    142|    }
  125|    400|  }
_ZN6hobbes16unique_refc_mapsIJNS_15unique_refc_mapIKNS_4PrimEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEEENS1_IKNS_9OpaquePtrEJS9_jbEEENS1_IKNS_4TVarEJS9_EEENS1_IKNS_4TGenEJiEEENS1_IKNS_4TAbsEJSt6vectorIS9_SaIS9_EESC_EEENS1_IKNS_4TAppEJSC_SP_ISC_SaISC_EEEEENS1_IKNS_10FixedArrayEJSC_SC_EEENS1_IKNS_5ArrayEJSC_EEENS1_IKNS_7VariantEJSP_INS14_6MemberESaIS16_EEEEENS1_IKNS_6RecordEJSP_INS1A_6MemberESaIS1C_EEEEENS1_IKNS_4FuncEJSC_SC_EEENS1_IKNS_6ExistsEJS9_SC_EEENS1_IKNS_9RecursiveEJS9_SC_EEENS1_IKNS_7TStringEJS9_EEENS1_IKNS_5TLongEJlEEENS1_IKNS_5TExprEJS9_EEEEE2atIS1F_EERNSt13tuple_elementIXsr9TypeIndexILi0ET_SD_SG_SJ_SM_SS_SX_S10_S13_S19_S1F_S1I_S1L_S1O_S1R_S1U_S1X_EE5valueESt5tupleIJSD_SG_SJ_SM_SS_SX_S10_S13_S19_S1F_S1I_S1L_S1O_S1R_S1U_S1X_EEE4typeEv:
   99|  62.4k|      typename std::tuple_element<TypeIndex<0, T, UniqueRefcMaps...>::value, RefcMaps>::type& at() {
  100|  62.4k|        return std::get<TypeIndex<0, T, UniqueRefcMaps...>::value>(this->refcMaps);
  101|  62.4k|      }
_ZN6hobbes15unique_refc_mapIKNS_6RecordEJSt6vectorINS1_6MemberESaIS4_EEEE3getERKSt8functionIFPS2_S6_EERKS6_:
   26|  62.4k|    std::shared_ptr<T> get(const std::function<T*(Args...)>& mk, const Args&... args) {
   27|  62.4k|      std::lock_guard<std::recursive_mutex> lock(mutex);
   28|  62.4k|      auto k = std::tuple<Args...>(args...);
   29|       |
   30|  62.4k|      auto found = this->values.find(k);
   31|  62.4k|      if (found != this->values.end() && found->second) {
  ------------------
  |  Branch (31:11): [True: 52.4k, False: 9.97k]
  |  Branch (31:11): [True: 52.4k, False: 9.97k]
  |  Branch (31:42): [True: 52.4k, False: 0]
  ------------------
   32|  52.4k|        return found->second;
   33|  52.4k|      }
   34|       |
   35|       |      // no reference into the map is held across mk(): constructing a type can
   36|       |      // intern the types it is made of, re-entering this map (the mutex is
   37|       |      // recursive for that reason), and an insertion there can rehash it. So
   38|       |      // construct first, then look the key up again, and keep whichever entry
   39|       |      // is there -- mk() may have interned this very key on the way.
   40|  9.97k|      std::shared_ptr<T> made(mk(args...));
   41|  9.97k|      std::shared_ptr<T>& slot = this->values[k];
   42|  9.97k|      if (!slot) {
  ------------------
  |  Branch (42:11): [True: 9.97k, False: 0]
  ------------------
   43|  9.97k|        slot = made;
   44|  9.97k|      }
   45|  9.97k|      return slot;
   46|  62.4k|    }
_ZN6hobbes5alignIlEET_S1_S1_:
  119|  14.5k|  T align(T x, T m) {
  120|  14.5k|    if (m == 0 || (x % m) == 0) {
  ------------------
  |  Branch (120:9): [True: 0, False: 14.5k]
  |  Branch (120:19): [True: 14.1k, False: 331]
  ------------------
  121|  14.1k|      return x;
  122|  14.1k|    } else {
  123|    331|      return (1 + (x / m)) * m;
  124|    331|    }
  125|  14.5k|  }
_ZN6hobbes16unique_refc_mapsIJNS_15unique_refc_mapIKNS_4PrimEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEEENS1_IKNS_9OpaquePtrEJS9_jbEEENS1_IKNS_4TVarEJS9_EEENS1_IKNS_4TGenEJiEEENS1_IKNS_4TAbsEJSt6vectorIS9_SaIS9_EESC_EEENS1_IKNS_4TAppEJSC_SP_ISC_SaISC_EEEEENS1_IKNS_10FixedArrayEJSC_SC_EEENS1_IKNS_5ArrayEJSC_EEENS1_IKNS_7VariantEJSP_INS14_6MemberESaIS16_EEEEENS1_IKNS_6RecordEJSP_INS1A_6MemberESaIS1C_EEEEENS1_IKNS_4FuncEJSC_SC_EEENS1_IKNS_6ExistsEJS9_SC_EEENS1_IKNS_9RecursiveEJS9_SC_EEENS1_IKNS_7TStringEJS9_EEENS1_IKNS_5TLongEJlEEENS1_IKNS_5TExprEJS9_EEEEE2atIS1I_EERNSt13tuple_elementIXsr9TypeIndexILi0ET_SD_SG_SJ_SM_SS_SX_S10_S13_S19_S1F_S1I_S1L_S1O_S1R_S1U_S1X_EE5valueESt5tupleIJSD_SG_SJ_SM_SS_SX_S10_S13_S19_S1F_S1I_S1L_S1O_S1R_S1U_S1X_EEE4typeEv:
   99|  28.9k|      typename std::tuple_element<TypeIndex<0, T, UniqueRefcMaps...>::value, RefcMaps>::type& at() {
  100|  28.9k|        return std::get<TypeIndex<0, T, UniqueRefcMaps...>::value>(this->refcMaps);
  101|  28.9k|      }
_ZN6hobbes15unique_refc_mapIKNS_4FuncEJSt10shared_ptrINS_8MonoTypeEES5_EE3getERKSt8functionIFPS2_S5_S5_EERKS5_SE_:
   26|  28.9k|    std::shared_ptr<T> get(const std::function<T*(Args...)>& mk, const Args&... args) {
   27|  28.9k|      std::lock_guard<std::recursive_mutex> lock(mutex);
   28|  28.9k|      auto k = std::tuple<Args...>(args...);
   29|       |
   30|  28.9k|      auto found = this->values.find(k);
   31|  28.9k|      if (found != this->values.end() && found->second) {
  ------------------
  |  Branch (31:11): [True: 19.5k, False: 9.45k]
  |  Branch (31:11): [True: 19.5k, False: 9.45k]
  |  Branch (31:42): [True: 19.5k, False: 0]
  ------------------
   32|  19.5k|        return found->second;
   33|  19.5k|      }
   34|       |
   35|       |      // no reference into the map is held across mk(): constructing a type can
   36|       |      // intern the types it is made of, re-entering this map (the mutex is
   37|       |      // recursive for that reason), and an insertion there can rehash it. So
   38|       |      // construct first, then look the key up again, and keep whichever entry
   39|       |      // is there -- mk() may have interned this very key on the way.
   40|  9.45k|      std::shared_ptr<T> made(mk(args...));
   41|  9.45k|      std::shared_ptr<T>& slot = this->values[k];
   42|  9.45k|      if (!slot) {
  ------------------
  |  Branch (42:11): [True: 9.45k, False: 0]
  ------------------
   43|  9.45k|        slot = made;
   44|  9.45k|      }
   45|  9.45k|      return slot;
   46|  28.9k|    }
_ZN6hobbes16unique_refc_mapsIJNS_15unique_refc_mapIKNS_4PrimEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEEENS1_IKNS_9OpaquePtrEJS9_jbEEENS1_IKNS_4TVarEJS9_EEENS1_IKNS_4TGenEJiEEENS1_IKNS_4TAbsEJSt6vectorIS9_SaIS9_EESC_EEENS1_IKNS_4TAppEJSC_SP_ISC_SaISC_EEEEENS1_IKNS_10FixedArrayEJSC_SC_EEENS1_IKNS_5ArrayEJSC_EEENS1_IKNS_7VariantEJSP_INS14_6MemberESaIS16_EEEEENS1_IKNS_6RecordEJSP_INS1A_6MemberESaIS1C_EEEEENS1_IKNS_4FuncEJSC_SC_EEENS1_IKNS_6ExistsEJS9_SC_EEENS1_IKNS_9RecursiveEJS9_SC_EEENS1_IKNS_7TStringEJS9_EEENS1_IKNS_5TLongEJlEEENS1_IKNS_5TExprEJS9_EEEEE2atIS1L_EERNSt13tuple_elementIXsr9TypeIndexILi0ET_SD_SG_SJ_SM_SS_SX_S10_S13_S19_S1F_S1I_S1L_S1O_S1R_S1U_S1X_EE5valueESt5tupleIJSD_SG_SJ_SM_SS_SX_S10_S13_S19_S1F_S1I_S1L_S1O_S1R_S1U_S1X_EEE4typeEv:
   99|  6.17k|      typename std::tuple_element<TypeIndex<0, T, UniqueRefcMaps...>::value, RefcMaps>::type& at() {
  100|  6.17k|        return std::get<TypeIndex<0, T, UniqueRefcMaps...>::value>(this->refcMaps);
  101|  6.17k|      }
_ZN6hobbes15unique_refc_mapIKNS_6ExistsEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEE3getERKSt8functionIFPS2_S8_SB_EERKS8_RKSB_:
   26|  6.17k|    std::shared_ptr<T> get(const std::function<T*(Args...)>& mk, const Args&... args) {
   27|  6.17k|      std::lock_guard<std::recursive_mutex> lock(mutex);
   28|  6.17k|      auto k = std::tuple<Args...>(args...);
   29|       |
   30|  6.17k|      auto found = this->values.find(k);
   31|  6.17k|      if (found != this->values.end() && found->second) {
  ------------------
  |  Branch (31:11): [True: 5.95k, False: 217]
  |  Branch (31:11): [True: 5.95k, False: 217]
  |  Branch (31:42): [True: 5.95k, False: 0]
  ------------------
   32|  5.95k|        return found->second;
   33|  5.95k|      }
   34|       |
   35|       |      // no reference into the map is held across mk(): constructing a type can
   36|       |      // intern the types it is made of, re-entering this map (the mutex is
   37|       |      // recursive for that reason), and an insertion there can rehash it. So
   38|       |      // construct first, then look the key up again, and keep whichever entry
   39|       |      // is there -- mk() may have interned this very key on the way.
   40|    217|      std::shared_ptr<T> made(mk(args...));
   41|    217|      std::shared_ptr<T>& slot = this->values[k];
   42|    217|      if (!slot) {
  ------------------
  |  Branch (42:11): [True: 217, False: 0]
  ------------------
   43|    217|        slot = made;
   44|    217|      }
   45|    217|      return slot;
   46|  6.17k|    }
_ZN6hobbes16unique_refc_mapsIJNS_15unique_refc_mapIKNS_4PrimEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEEENS1_IKNS_9OpaquePtrEJS9_jbEEENS1_IKNS_4TVarEJS9_EEENS1_IKNS_4TGenEJiEEENS1_IKNS_4TAbsEJSt6vectorIS9_SaIS9_EESC_EEENS1_IKNS_4TAppEJSC_SP_ISC_SaISC_EEEEENS1_IKNS_10FixedArrayEJSC_SC_EEENS1_IKNS_5ArrayEJSC_EEENS1_IKNS_7VariantEJSP_INS14_6MemberESaIS16_EEEEENS1_IKNS_6RecordEJSP_INS1A_6MemberESaIS1C_EEEEENS1_IKNS_4FuncEJSC_SC_EEENS1_IKNS_6ExistsEJS9_SC_EEENS1_IKNS_9RecursiveEJS9_SC_EEENS1_IKNS_7TStringEJS9_EEENS1_IKNS_5TLongEJlEEENS1_IKNS_5TExprEJS9_EEEEE2atIS1O_EERNSt13tuple_elementIXsr9TypeIndexILi0ET_SD_SG_SJ_SM_SS_SX_S10_S13_S19_S1F_S1I_S1L_S1O_S1R_S1U_S1X_EE5valueESt5tupleIJSD_SG_SJ_SM_SS_SX_S10_S13_S19_S1F_S1I_S1L_S1O_S1R_S1U_S1X_EEE4typeEv:
   99|  6.98k|      typename std::tuple_element<TypeIndex<0, T, UniqueRefcMaps...>::value, RefcMaps>::type& at() {
  100|  6.98k|        return std::get<TypeIndex<0, T, UniqueRefcMaps...>::value>(this->refcMaps);
  101|  6.98k|      }
_ZN6hobbes15unique_refc_mapIKNS_9RecursiveEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEE3getERKSt8functionIFPS2_S8_SB_EERKS8_RKSB_:
   26|  6.98k|    std::shared_ptr<T> get(const std::function<T*(Args...)>& mk, const Args&... args) {
   27|  6.98k|      std::lock_guard<std::recursive_mutex> lock(mutex);
   28|  6.98k|      auto k = std::tuple<Args...>(args...);
   29|       |
   30|  6.98k|      auto found = this->values.find(k);
   31|  6.98k|      if (found != this->values.end() && found->second) {
  ------------------
  |  Branch (31:11): [True: 6.79k, False: 191]
  |  Branch (31:11): [True: 6.79k, False: 191]
  |  Branch (31:42): [True: 6.79k, False: 0]
  ------------------
   32|  6.79k|        return found->second;
   33|  6.79k|      }
   34|       |
   35|       |      // no reference into the map is held across mk(): constructing a type can
   36|       |      // intern the types it is made of, re-entering this map (the mutex is
   37|       |      // recursive for that reason), and an insertion there can rehash it. So
   38|       |      // construct first, then look the key up again, and keep whichever entry
   39|       |      // is there -- mk() may have interned this very key on the way.
   40|    191|      std::shared_ptr<T> made(mk(args...));
   41|    191|      std::shared_ptr<T>& slot = this->values[k];
   42|    191|      if (!slot) {
  ------------------
  |  Branch (42:11): [True: 191, False: 0]
  ------------------
   43|    191|        slot = made;
   44|    191|      }
   45|    191|      return slot;
   46|  6.98k|    }
_ZN6hobbes16unique_refc_mapsIJNS_15unique_refc_mapIKNS_4PrimEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEEENS1_IKNS_9OpaquePtrEJS9_jbEEENS1_IKNS_4TVarEJS9_EEENS1_IKNS_4TGenEJiEEENS1_IKNS_4TAbsEJSt6vectorIS9_SaIS9_EESC_EEENS1_IKNS_4TAppEJSC_SP_ISC_SaISC_EEEEENS1_IKNS_10FixedArrayEJSC_SC_EEENS1_IKNS_5ArrayEJSC_EEENS1_IKNS_7VariantEJSP_INS14_6MemberESaIS16_EEEEENS1_IKNS_6RecordEJSP_INS1A_6MemberESaIS1C_EEEEENS1_IKNS_4FuncEJSC_SC_EEENS1_IKNS_6ExistsEJS9_SC_EEENS1_IKNS_9RecursiveEJS9_SC_EEENS1_IKNS_7TStringEJS9_EEENS1_IKNS_5TLongEJlEEENS1_IKNS_5TExprEJS9_EEEEE2atIS1R_EERNSt13tuple_elementIXsr9TypeIndexILi0ET_SD_SG_SJ_SM_SS_SX_S10_S13_S19_S1F_S1I_S1L_S1O_S1R_S1U_S1X_EE5valueESt5tupleIJSD_SG_SJ_SM_SS_SX_S10_S13_S19_S1F_S1I_S1L_S1O_S1R_S1U_S1X_EEE4typeEv:
   99|  35.4k|      typename std::tuple_element<TypeIndex<0, T, UniqueRefcMaps...>::value, RefcMaps>::type& at() {
  100|  35.4k|        return std::get<TypeIndex<0, T, UniqueRefcMaps...>::value>(this->refcMaps);
  101|  35.4k|      }
_ZN6hobbes15unique_refc_mapIKNS_7TStringEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE3getERKSt8functionIFPS2_S8_EERKS8_:
   26|  35.4k|    std::shared_ptr<T> get(const std::function<T*(Args...)>& mk, const Args&... args) {
   27|  35.4k|      std::lock_guard<std::recursive_mutex> lock(mutex);
   28|  35.4k|      auto k = std::tuple<Args...>(args...);
   29|       |
   30|  35.4k|      auto found = this->values.find(k);
   31|  35.4k|      if (found != this->values.end() && found->second) {
  ------------------
  |  Branch (31:11): [True: 35.2k, False: 193]
  |  Branch (31:11): [True: 35.2k, False: 193]
  |  Branch (31:42): [True: 35.2k, False: 0]
  ------------------
   32|  35.2k|        return found->second;
   33|  35.2k|      }
   34|       |
   35|       |      // no reference into the map is held across mk(): constructing a type can
   36|       |      // intern the types it is made of, re-entering this map (the mutex is
   37|       |      // recursive for that reason), and an insertion there can rehash it. So
   38|       |      // construct first, then look the key up again, and keep whichever entry
   39|       |      // is there -- mk() may have interned this very key on the way.
   40|    193|      std::shared_ptr<T> made(mk(args...));
   41|    193|      std::shared_ptr<T>& slot = this->values[k];
   42|    193|      if (!slot) {
  ------------------
  |  Branch (42:11): [True: 193, False: 0]
  ------------------
   43|    193|        slot = made;
   44|    193|      }
   45|    193|      return slot;
   46|  35.4k|    }
_ZN6hobbes16unique_refc_mapsIJNS_15unique_refc_mapIKNS_4PrimEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEEENS1_IKNS_9OpaquePtrEJS9_jbEEENS1_IKNS_4TVarEJS9_EEENS1_IKNS_4TGenEJiEEENS1_IKNS_4TAbsEJSt6vectorIS9_SaIS9_EESC_EEENS1_IKNS_4TAppEJSC_SP_ISC_SaISC_EEEEENS1_IKNS_10FixedArrayEJSC_SC_EEENS1_IKNS_5ArrayEJSC_EEENS1_IKNS_7VariantEJSP_INS14_6MemberESaIS16_EEEEENS1_IKNS_6RecordEJSP_INS1A_6MemberESaIS1C_EEEEENS1_IKNS_4FuncEJSC_SC_EEENS1_IKNS_6ExistsEJS9_SC_EEENS1_IKNS_9RecursiveEJS9_SC_EEENS1_IKNS_7TStringEJS9_EEENS1_IKNS_5TLongEJlEEENS1_IKNS_5TExprEJS9_EEEEE2atIS1U_EERNSt13tuple_elementIXsr9TypeIndexILi0ET_SD_SG_SJ_SM_SS_SX_S10_S13_S19_S1F_S1I_S1L_S1O_S1R_S1U_S1X_EE5valueESt5tupleIJSD_SG_SJ_SM_SS_SX_S10_S13_S19_S1F_S1I_S1L_S1O_S1R_S1U_S1X_EEE4typeEv:
   99|  5.79k|      typename std::tuple_element<TypeIndex<0, T, UniqueRefcMaps...>::value, RefcMaps>::type& at() {
  100|  5.79k|        return std::get<TypeIndex<0, T, UniqueRefcMaps...>::value>(this->refcMaps);
  101|  5.79k|      }
_ZN6hobbes15unique_refc_mapIKNS_5TLongEJlEE3getERKSt8functionIFPS2_lEERKl:
   26|  5.79k|    std::shared_ptr<T> get(const std::function<T*(Args...)>& mk, const Args&... args) {
   27|  5.79k|      std::lock_guard<std::recursive_mutex> lock(mutex);
   28|  5.79k|      auto k = std::tuple<Args...>(args...);
   29|       |
   30|  5.79k|      auto found = this->values.find(k);
   31|  5.79k|      if (found != this->values.end() && found->second) {
  ------------------
  |  Branch (31:11): [True: 5.77k, False: 13]
  |  Branch (31:11): [True: 5.77k, False: 13]
  |  Branch (31:42): [True: 5.77k, False: 0]
  ------------------
   32|  5.77k|        return found->second;
   33|  5.77k|      }
   34|       |
   35|       |      // no reference into the map is held across mk(): constructing a type can
   36|       |      // intern the types it is made of, re-entering this map (the mutex is
   37|       |      // recursive for that reason), and an insertion there can rehash it. So
   38|       |      // construct first, then look the key up again, and keep whichever entry
   39|       |      // is there -- mk() may have interned this very key on the way.
   40|     13|      std::shared_ptr<T> made(mk(args...));
   41|     13|      std::shared_ptr<T>& slot = this->values[k];
   42|     13|      if (!slot) {
  ------------------
  |  Branch (42:11): [True: 13, False: 0]
  ------------------
   43|     13|        slot = made;
   44|     13|      }
   45|     13|      return slot;
   46|  5.79k|    }
_ZN6hobbes16unique_refc_mapsIJNS_15unique_refc_mapIKNS_4PrimEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEEEEENS1_IKNS_9OpaquePtrEJS9_jbEEENS1_IKNS_4TVarEJS9_EEENS1_IKNS_4TGenEJiEEENS1_IKNS_4TAbsEJSt6vectorIS9_SaIS9_EESC_EEENS1_IKNS_4TAppEJSC_SP_ISC_SaISC_EEEEENS1_IKNS_10FixedArrayEJSC_SC_EEENS1_IKNS_5ArrayEJSC_EEENS1_IKNS_7VariantEJSP_INS14_6MemberESaIS16_EEEEENS1_IKNS_6RecordEJSP_INS1A_6MemberESaIS1C_EEEEENS1_IKNS_4FuncEJSC_SC_EEENS1_IKNS_6ExistsEJS9_SC_EEENS1_IKNS_9RecursiveEJS9_SC_EEENS1_IKNS_7TStringEJS9_EEENS1_IKNS_5TLongEJlEEENS1_IKNS_5TExprEJS9_EEEEE2atIS1X_EERNSt13tuple_elementIXsr9TypeIndexILi0ET_SD_SG_SJ_SM_SS_SX_S10_S13_S19_S1F_S1I_S1L_S1O_S1R_S1U_S1X_EE5valueESt5tupleIJSD_SG_SJ_SM_SS_SX_S10_S13_S19_S1F_S1I_S1L_S1O_S1R_S1U_S1X_EEE4typeEv:
   99|    288|      typename std::tuple_element<TypeIndex<0, T, UniqueRefcMaps...>::value, RefcMaps>::type& at() {
  100|    288|        return std::get<TypeIndex<0, T, UniqueRefcMaps...>::value>(this->refcMaps);
  101|    288|      }
_ZN6hobbes15unique_refc_mapIKNS_5TExprEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE3getERKSt8functionIFPS2_S8_EERKS8_:
   26|    288|    std::shared_ptr<T> get(const std::function<T*(Args...)>& mk, const Args&... args) {
   27|    288|      std::lock_guard<std::recursive_mutex> lock(mutex);
   28|    288|      auto k = std::tuple<Args...>(args...);
   29|       |
   30|    288|      auto found = this->values.find(k);
   31|    288|      if (found != this->values.end() && found->second) {
  ------------------
  |  Branch (31:11): [True: 199, False: 89]
  |  Branch (31:11): [True: 199, False: 89]
  |  Branch (31:42): [True: 199, False: 0]
  ------------------
   32|    199|        return found->second;
   33|    199|      }
   34|       |
   35|       |      // no reference into the map is held across mk(): constructing a type can
   36|       |      // intern the types it is made of, re-entering this map (the mutex is
   37|       |      // recursive for that reason), and an insertion there can rehash it. So
   38|       |      // construct first, then look the key up again, and keep whichever entry
   39|       |      // is there -- mk() may have interned this very key on the way.
   40|     89|      std::shared_ptr<T> made(mk(args...));
   41|     89|      std::shared_ptr<T>& slot = this->values[k];
   42|     89|      if (!slot) {
  ------------------
  |  Branch (42:11): [True: 89, False: 0]
  ------------------
   43|     89|        slot = made;
   44|     89|      }
   45|     89|      return slot;
   46|    288|    }
_ZN6hobbes2isINS_4TAbsENS_8MonoTypeEEEPT_RKSt10shared_ptrIT0_E:
  146|      6|  T* is(const std::shared_ptr<S>& s) {
  147|      6|    return isM<T, S>(s.get());
  148|      6|  }
_ZN6hobbes3isMINS_4TAbsENS_8MonoTypeEEEPT_PT0_:
  137|      6|  T* isM(S* s) {
  138|      6|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (138:9): [True: 6, False: 0]
  |  Branch (138:14): [True: 5, False: 1]
  ------------------
  139|      5|      return rcast<T*>(s);
  140|      5|    } else {
  141|      1|      return nullptr;
  142|      1|    }
  143|      6|  }
_ZN6hobbes5rcastIPNS_4TAbsEPNS_8MonoTypeEEET_T0_:
  115|      5|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFPcljEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFPclllEEET_T0_:
  115|      2|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFPcllEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFvlllEEET_T0_:
  115|      2|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFvllEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFlllmEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFlPKNS_5arrayIcEElEEET_T0_:
  115|      2|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFPNS_5arrayISt4pairIhsEEElEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFPNS_10DynDModel0ElbhEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFvPNS_10DynDModel0EPjEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFvPNS_10DynDModel0EEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFPNS_8UCReaderEmmmEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFbPNS_8UCReaderEEEET_T0_:
  115|      3|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFmPNS_8UCReaderEEEET_T0_:
  115|      2|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFhPNS_8UCReaderEPNS_10DynDModel0EEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFvPNS_8UCReaderEEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFPNS_8UCWriterEmmmmEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFbPNS_8UCWriterEEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFmPNS_8UCWriterEEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFPhPNS_8UCWriterEEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFvPNS_8UCWriterEPNS_10DynDModel0EhEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFvPNS_8UCWriterEEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFvljPFblEEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFvlllhPFblEEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPvPFPKNS_5arrayISt4pairIPKNS2_IcEEPKNS2_IS3_ImS3_IhmEEEEEEEvEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes2isINS_6AIndexENS_4ExprEEEPT_RKSt10shared_ptrIT0_E:
  146|     36|  T* is(const std::shared_ptr<S>& s) {
  147|     36|    return isM<T, S>(s.get());
  148|     36|  }
_ZN6hobbes3isMINS_6AIndexENS_4ExprEEEPT_PT0_:
  137|     36|  T* isM(S* s) {
  138|     36|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (138:9): [True: 36, False: 0]
  |  Branch (138:14): [True: 33, False: 3]
  ------------------
  139|     33|      return rcast<T*>(s);
  140|     33|    } else {
  141|      3|      return nullptr;
  142|      3|    }
  143|     36|  }
_ZN6hobbes5rcastIPNS_6AIndexEPNS_4ExprEEET_T0_:
  115|     33|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPKNS_4UnitEiEET_T0_:
  115|     38|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5scastImjEET_T0_:
  114|     34|template <typename V, typename U> V scast (U x)        { return static_cast<V>(x); }
_ZN6hobbes5scastIlmEET_T0_:
  114|     17|template <typename V, typename U> V scast (U x)        { return static_cast<V>(x); }
_ZN6hobbes6crcastIPNS_4LongENS_9PrimitiveEEET_PKT0_:
  116|      4|template <typename V, typename U> V crcast(const U* x) { return reinterpret_cast<V>(const_cast<U*>(x)); }
_ZN6hobbes2isINS_12MatchLiteralENS_7PatternEEEPT_RKSt10shared_ptrIT0_E:
  146|  1.06k|  T* is(const std::shared_ptr<S>& s) {
  147|  1.06k|    return isM<T, S>(s.get());
  148|  1.06k|  }
_ZN6hobbes3isMINS_12MatchLiteralENS_7PatternEEEPT_PT0_:
  137|  1.06k|  T* isM(S* s) {
  138|  1.06k|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (138:9): [True: 1.06k, False: 0]
  |  Branch (138:14): [True: 79, False: 989]
  ------------------
  139|     79|      return rcast<T*>(s);
  140|    989|    } else {
  141|    989|      return nullptr;
  142|    989|    }
  143|  1.06k|  }
_ZN6hobbes5rcastIPNS_12MatchLiteralEPNS_7PatternEEET_T0_:
  115|     79|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes2isINS_4CharENS_9PrimitiveEEEPT_RKSt10shared_ptrIT0_E:
  146|     33|  T* is(const std::shared_ptr<S>& s) {
  147|     33|    return isM<T, S>(s.get());
  148|     33|  }
_ZN6hobbes3isMINS_4CharENS_9PrimitiveEEEPT_PT0_:
  137|     33|  T* isM(S* s) {
  138|     33|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (138:9): [True: 33, False: 0]
  |  Branch (138:14): [True: 33, False: 0]
  ------------------
  139|     33|      return rcast<T*>(s);
  140|     33|    } else {
  141|      0|      return nullptr;
  142|      0|    }
  143|     33|  }
_ZN6hobbes5rcastIPNS_4CharEPNS_9PrimitiveEEET_T0_:
  115|     33|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes2isINS_11MatchRecordENS_7PatternEEEPKT_PKT0_:
  128|      9|  const T* is(const S* s) {
  129|      9|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (129:9): [True: 9, False: 0]
  |  Branch (129:14): [True: 0, False: 9]
  ------------------
  130|      0|      return rcast<const T*>(s);
  131|      9|    } else {
  132|      9|      return nullptr;
  133|      9|    }
  134|      9|  }
_ZN6hobbes2isINS_12MatchVariantENS_7PatternEEEPKT_PKT0_:
  128|     21|  const T* is(const S* s) {
  129|     21|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (129:9): [True: 21, False: 0]
  |  Branch (129:14): [True: 1, False: 20]
  ------------------
  130|      1|      return rcast<const T*>(s);
  131|     20|    } else {
  132|     20|      return nullptr;
  133|     20|    }
  134|     21|  }
_ZN6hobbes5rcastIPKNS_12MatchVariantEPKNS_7PatternEEET_T0_:
  115|      1|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes2isINS_11MatchRecordENS_7PatternEEEPT_RKSt10shared_ptrIT0_E:
  146|    411|  T* is(const std::shared_ptr<S>& s) {
  147|    411|    return isM<T, S>(s.get());
  148|    411|  }
_ZN6hobbes3isMINS_11MatchRecordENS_7PatternEEEPT_PT0_:
  137|    411|  T* isM(S* s) {
  138|    411|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (138:9): [True: 411, False: 0]
  |  Branch (138:14): [True: 200, False: 211]
  ------------------
  139|    200|      return rcast<T*>(s);
  140|    211|    } else {
  141|    211|      return nullptr;
  142|    211|    }
  143|    411|  }
_ZN6hobbes5rcastIPNS_11MatchRecordEPNS_7PatternEEET_T0_:
  115|    200|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes2isINS_12MatchVariantENS_7PatternEEEPT_RKSt10shared_ptrIT0_E:
  146|    462|  T* is(const std::shared_ptr<S>& s) {
  147|    462|    return isM<T, S>(s.get());
  148|    462|  }
_ZN6hobbes3isMINS_12MatchVariantENS_7PatternEEEPT_PT0_:
  137|    462|  T* isM(S* s) {
  138|    462|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (138:9): [True: 462, False: 0]
  |  Branch (138:14): [True: 254, False: 208]
  ------------------
  139|    254|      return rcast<T*>(s);
  140|    254|    } else {
  141|    208|      return nullptr;
  142|    208|    }
  143|    462|  }
_ZN6hobbes5rcastIPNS_12MatchVariantEPNS_7PatternEEET_T0_:
  115|    254|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes2isINS_10MatchArrayENS_7PatternEEEPT_RKSt10shared_ptrIT0_E:
  146|  1.37k|  T* is(const std::shared_ptr<S>& s) {
  147|  1.37k|    return isM<T, S>(s.get());
  148|  1.37k|  }
_ZN6hobbes3isMINS_10MatchArrayENS_7PatternEEEPT_PT0_:
  137|  1.37k|  T* isM(S* s) {
  138|  1.37k|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (138:9): [True: 1.37k, False: 0]
  |  Branch (138:14): [True: 52, False: 1.32k]
  ------------------
  139|     52|      return rcast<T*>(s);
  140|  1.32k|    } else {
  141|  1.32k|      return nullptr;
  142|  1.32k|    }
  143|  1.37k|  }
_ZN6hobbes5rcastIPNS_10MatchArrayEPNS_7PatternEEET_T0_:
  115|     52|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes2isINS_10MatchRegexENS_7PatternEEEPT_RKSt10shared_ptrIT0_E:
  146|    849|  T* is(const std::shared_ptr<S>& s) {
  147|    849|    return isM<T, S>(s.get());
  148|    849|  }
_ZN6hobbes3isMINS_10MatchRegexENS_7PatternEEEPT_PT0_:
  137|    849|  T* isM(S* s) {
  138|    849|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (138:9): [True: 849, False: 0]
  |  Branch (138:14): [True: 9, False: 840]
  ------------------
  139|      9|      return rcast<T*>(s);
  140|    840|    } else {
  141|    840|      return nullptr;
  142|    840|    }
  143|    849|  }
_ZN6hobbes5rcastIPNS_10MatchRegexEPNS_7PatternEEET_T0_:
  115|      9|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes2isINS_8MatchAnyENS_7PatternEEEPT_RKSt10shared_ptrIT0_E:
  146|  2.33k|  T* is(const std::shared_ptr<S>& s) {
  147|  2.33k|    return isM<T, S>(s.get());
  148|  2.33k|  }
_ZN6hobbes3isMINS_8MatchAnyENS_7PatternEEEPT_PT0_:
  137|  2.33k|  T* isM(S* s) {
  138|  2.33k|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (138:9): [True: 2.33k, False: 0]
  |  Branch (138:14): [True: 1.79k, False: 547]
  ------------------
  139|  1.79k|      return rcast<T*>(s);
  140|  1.79k|    } else {
  141|    547|      return nullptr;
  142|    547|    }
  143|  2.33k|  }
_ZN6hobbes5rcastIPNS_8MatchAnyEPNS_7PatternEEET_T0_:
  115|  1.79k|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPKNS_12MatchLiteralEPNS_7PatternEEET_T0_:
  115|    133|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPKNS_8MatchAnyEPNS_7PatternEEET_T0_:
  115|  3.05k|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPKNS_10MatchArrayEPNS_7PatternEEET_T0_:
  115|     48|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPKNS_10MatchRegexEPNS_7PatternEEET_T0_:
  115|      9|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPKNS_11MatchRecordEPNS_7PatternEEET_T0_:
  115|    231|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes5rcastIPKNS_12MatchVariantEPNS_7PatternEEET_T0_:
  115|    471|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes2isINS_9SwitchValENS_6MStateEEEPT_RKSt10shared_ptrIT0_E:
  146|    941|  T* is(const std::shared_ptr<S>& s) {
  147|    941|    return isM<T, S>(s.get());
  148|    941|  }
_ZN6hobbes3isMINS_9SwitchValENS_6MStateEEEPT_PT0_:
  137|    941|  T* isM(S* s) {
  138|    941|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (138:9): [True: 941, False: 0]
  |  Branch (138:14): [True: 19, False: 922]
  ------------------
  139|     19|      return rcast<T*>(s);
  140|    922|    } else {
  141|    922|      return nullptr;
  142|    922|    }
  143|    941|  }
_ZN6hobbes5rcastIPNS_9SwitchValEPNS_6MStateEEET_T0_:
  115|     19|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }
_ZN6hobbes2isINS_10FinishExprENS_6MStateEEEPT_RKSt10shared_ptrIT0_E:
  146|     40|  T* is(const std::shared_ptr<S>& s) {
  147|     40|    return isM<T, S>(s.get());
  148|     40|  }
_ZN6hobbes3isMINS_10FinishExprENS_6MStateEEEPT_PT0_:
  137|     40|  T* isM(S* s) {
  138|     40|    if (s && s->case_id() == T::type_case_id) {
  ------------------
  |  Branch (138:9): [True: 40, False: 0]
  |  Branch (138:14): [True: 40, False: 0]
  ------------------
  139|     40|      return rcast<T*>(s);
  140|     40|    } else {
  141|      0|      return nullptr;
  142|      0|    }
  143|     40|  }
_ZN6hobbes5rcastIPNS_10FinishExprEPNS_6MStateEEET_T0_:
  115|     40|template <typename V, typename U> V rcast (U x)        { return reinterpret_cast<V>(x); }

_ZN6hobbes21checkedArrayAllocSizeEmm:
   72|  5.58k|inline size_t checkedArrayAllocSize(size_t n, size_t esz) {
   73|  5.58k|  size_t bytes = 0;
   74|  5.58k|  if (__builtin_mul_overflow(n, esz, &bytes) ||
  ------------------
  |  Branch (74:7): [True: 0, False: 5.58k]
  ------------------
   75|  5.58k|      __builtin_add_overflow(bytes, sizeof(long), &bytes)) {
  ------------------
  |  Branch (75:7): [True: 0, False: 5.58k]
  ------------------
   76|      0|    throw std::runtime_error("array allocation size is not representable: " +
   77|      0|                             std::to_string(n) + " elements of " + std::to_string(esz) + " bytes");
   78|      0|  }
   79|  5.58k|  return bytes;
   80|  5.58k|}

_ZN6hobbes9range_mapIhSt3setIjSt4lessIjESaIjEENS_14char_range_ordEE10mergeRangeERKhS9_RKSt8functionIFvRS5_EE:
  232|     19|    void mergeRange(const K& k0, const K& k1, const std::function<void(V&)>& f) {
  233|     19|      mergeRange(range(k0,k1),f);
  234|     19|    }
_ZN6hobbes9range_mapIhSt3setIjSt4lessIjESaIjEENS_14char_range_ordEE10mergeRangeESt4pairIhhERKSt8functionIFvRS5_EE:
  137|     19|    void mergeRange(range rr, const std::function<void(V&)>& f) {
  138|     19|      for (size_t i = 0; i < this->rs.size(); ++i) {
  ------------------
  |  Branch (138:26): [True: 0, False: 19]
  ------------------
  139|      0|        range& lr = this->rs[i];
  140|       |
  141|      0|        switch (classifyIntersection(lr, rr)) {
  ------------------
  |  Branch (141:17): [True: 0, False: 0]
  ------------------
  142|      0|        case LLRR:
  ------------------
  |  Branch (142:9): [True: 0, False: 0]
  ------------------
  143|      0|          continue;
  144|      0|        case RRLL:
  ------------------
  |  Branch (144:9): [True: 0, False: 0]
  ------------------
  145|      0|          insAt(i, rr, V());
  146|      0|          f(this->vs[i]);
  147|      0|          assert(rangesValid());
  ------------------
  |  Branch (147:11): [True: 0, False: 0]
  ------------------
  148|      0|          return;
  149|      0|        case EE:
  ------------------
  |  Branch (149:9): [True: 0, False: 0]
  ------------------
  150|      0|          f(this->vs[i]);
  151|      0|          assert(rangesValid());
  ------------------
  |  Branch (151:11): [True: 0, False: 0]
  ------------------
  152|      0|          return;
  153|      0|        case ELR:
  ------------------
  |  Branch (153:9): [True: 0, False: 0]
  ------------------
  154|      0|          f(this->vs[i]);
  155|      0|          rr.first=Ord::succ(lr.second);
  156|      0|          break;
  157|      0|        case ERL: {
  ------------------
  |  Branch (157:9): [True: 0, False: 0]
  ------------------
  158|      0|          range er(Ord::succ(rr.second), lr.second);
  159|      0|          V     ev = this->vs[i];
  160|       |
  161|      0|          lr.second = rr.second;
  162|      0|          f(this->vs[i]);
  163|      0|          insAt(i+1, er, ev);
  164|      0|          assert(rangesValid());
  ------------------
  |  Branch (164:11): [True: 0, False: 0]
  ------------------
  165|      0|          return;
  166|      0|        }
  167|      0|        case LRE:
  ------------------
  |  Branch (167:9): [True: 0, False: 0]
  ------------------
  168|      0|          lr.second = Ord::pred(rr.first);
  169|      0|          insAt(i+1, rr, this->vs[i]);
  170|      0|          f(this->vs[i+1]);
  171|      0|          assert(rangesValid());
  ------------------
  |  Branch (171:11): [True: 0, False: 0]
  ------------------
  172|      0|          return;
  173|      0|        case RLE:
  ------------------
  |  Branch (173:9): [True: 0, False: 0]
  ------------------
  174|      0|          insAt(i, range(rr.first, Ord::pred(lr.first)), V());
  175|      0|          f(this->vs[i]);
  176|      0|          f(this->vs[i+1]);
  177|      0|          assert(rangesValid());
  ------------------
  |  Branch (177:11): [True: 0, False: 0]
  ------------------
  178|      0|          return;
  179|      0|        case LRRL: {
  ------------------
  |  Branch (179:9): [True: 0, False: 0]
  ------------------
  180|      0|          range er(Ord::succ(rr.second), lr.second);
  181|      0|          lr.second = Ord::pred(rr.first);
  182|       |
  183|      0|          insAt(i+1, rr, this->vs[i]);
  184|      0|          f(this->vs[i+1]);
  185|       |
  186|      0|          insAt(i+2, er, this->vs[i]);
  187|      0|          assert(rangesValid());
  ------------------
  |  Branch (187:11): [True: 0, False: 0]
  ------------------
  188|      0|          return;
  189|      0|        }
  190|      0|        case RLLR: {
  ------------------
  |  Branch (190:9): [True: 0, False: 0]
  ------------------
  191|      0|          range nr(Ord::succ(lr.second), rr.second);
  192|      0|          insAt(i, range(rr.first, Ord::pred(lr.first)), V());
  193|      0|          f(this->vs[i]);
  194|      0|          f(this->vs[i+1]);
  195|      0|          rr = nr;
  196|      0|          break;
  197|      0|        }
  198|      0|        case LRLR: {
  ------------------
  |  Branch (198:9): [True: 0, False: 0]
  ------------------
  199|      0|          range mr(rr.first, lr.second);
  200|      0|          range er(Ord::succ(lr.second), rr.second);
  201|      0|          lr.second = Ord::pred(rr.first);
  202|      0|          insAt(i+1, mr, this->vs[i]);
  203|      0|          f(this->vs[i+1]);
  204|      0|          rr = er;
  205|      0|          break;
  206|      0|        }
  207|      0|        case RLRL: {
  ------------------
  |  Branch (207:9): [True: 0, False: 0]
  ------------------
  208|      0|          range br(rr.first, Ord::pred(lr.first));
  209|      0|          range er(Ord::succ(rr.second), lr.second);
  210|      0|          V     ev = this->vs[i];
  211|       |
  212|      0|          lr.second = rr.second;
  213|      0|          f(this->vs[i]);
  214|       |
  215|      0|          insAt(i, br, V());
  216|      0|          f(this->vs[i]);
  217|       |          
  218|      0|          insAt(i+2, er, ev);
  219|      0|          assert(rangesValid());
  ------------------
  |  Branch (219:11): [True: 0, False: 0]
  ------------------
  220|      0|          return;
  221|      0|        }}
  222|      0|      }
  223|       |
  224|       |      // if we get here, the range doesn't intersect anything
  225|       |      // it must go at the end
  226|     19|      this->rs.push_back(rr);
  227|     19|      this->vs.resize(this->vs.size()+1);
  228|     19|      f(this->vs.back());
  229|       |      assert(rangesValid());
  ------------------
  |  Branch (229:7): [True: 19, False: 0]
  ------------------
  230|     19|    }
_ZN6hobbes9range_mapIhSt3setIjSt4lessIjESaIjEENS_14char_range_ordEE20classifyIntersectionERKSt4pairIhhESB_:
  413|     33|    static RangeIntersection classifyIntersection(const range& lr, const range& rr) {
  414|     33|      if (Ord::lt(lr.second, rr.first)) {
  ------------------
  |  Branch (414:11): [True: 4, False: 29]
  ------------------
  415|      4|        return LLRR;
  416|     29|      } else if (Ord::lt(rr.second, lr.first)) {
  ------------------
  |  Branch (416:18): [True: 21, False: 8]
  ------------------
  417|     21|        return RRLL;
  418|     21|      } else if (lr.first == rr.first) {
  ------------------
  |  Branch (418:18): [True: 6, False: 2]
  ------------------
  419|      6|        if (lr.second == rr.second) {
  ------------------
  |  Branch (419:13): [True: 5, False: 1]
  ------------------
  420|      5|          return EE;
  421|      5|        } else if (Ord::lt(lr.second, rr.second)) {
  ------------------
  |  Branch (421:20): [True: 1, False: 0]
  ------------------
  422|      1|          return ELR;
  423|      1|        } else {
  424|      0|          return ERL;
  425|      0|        }
  426|      6|      } else if (lr.second == rr.second) {
  ------------------
  |  Branch (426:18): [True: 1, False: 1]
  ------------------
  427|      1|        if (Ord::lt(lr.first, rr.first)) {
  ------------------
  |  Branch (427:13): [True: 0, False: 1]
  ------------------
  428|      0|          return LRE;
  429|      1|        } else {
  430|      1|          return RLE;
  431|      1|        }
  432|      1|      } else if (Ord::lt(lr.first, rr.first) && Ord::lt(rr.second, lr.second)) {
  ------------------
  |  Branch (432:18): [True: 0, False: 1]
  |  Branch (432:49): [True: 0, False: 0]
  ------------------
  433|      0|        return LRRL;
  434|      1|      } else if (Ord::lt(rr.first, lr.first) && Ord::lt(lr.second, rr.second)) {
  ------------------
  |  Branch (434:18): [True: 1, False: 0]
  |  Branch (434:49): [True: 1, False: 0]
  ------------------
  435|      1|        return RLLR;
  436|      1|      } else if (Ord::lt(rr.first, lr.first) && Ord::lt(rr.second, lr.second)) {
  ------------------
  |  Branch (436:18): [True: 0, False: 0]
  |  Branch (436:49): [True: 0, False: 0]
  ------------------
  437|      0|        return RLRL;
  438|      0|      } else {
  439|      0|        return LRLR;
  440|      0|      }
  441|     33|    }
_ZNK6hobbes9range_mapIhSt3setIjSt4lessIjESaIjEENS_14char_range_ordEE11rangesValidEv:
  373|     19|    bool rangesValid() const { return rangesValid(this->rs); }
_ZN6hobbes9range_mapIhSt3setIjSt4lessIjESaIjEENS_14char_range_ordEE11rangesValidERKSt6vectorISt4pairIhhESaISA_EE:
  365|     62|    static bool rangesValid(const ranges& rs) {
  366|    104|      for (const auto& r : rs) {
  ------------------
  |  Branch (366:26): [True: 104, False: 62]
  ------------------
  367|    104|        if (r.first != r.second && !(Ord::lt(r.first, r.second))) {
  ------------------
  |  Branch (367:13): [True: 66, False: 38]
  |  Branch (367:36): [True: 0, False: 66]
  ------------------
  368|      0|          return false;
  369|      0|        }
  370|    104|      }
  371|     62|      return true;
  372|     62|    }
_ZNK6hobbes9range_mapIhjNS_14char_range_ordEE4sizeEv:
  243|      8|    size_t size() const {
  244|      8|      return this->rs.size();
  245|      8|    }
_ZNK6hobbes9range_mapIhSt3setIjSt4lessIjESaIjEENS_14char_range_ordEE14disjointRangesERKSt6vectorISt4pairIhhESaISA_EE:
  256|     43|    ranges disjointRanges(const ranges& trs) const {
  257|     43|      ranges lrs = this->rs;
  258|     43|      ranges rrs = trs;
  259|       |
  260|     43|      ranges r;
  261|     43|      size_t i = 0, j = 0;
  262|     76|      while (i < lrs.size() && j < rrs.size()) {
  ------------------
  |  Branch (262:14): [True: 46, False: 30]
  |  Branch (262:32): [True: 33, False: 13]
  ------------------
  263|     33|        range& lr = lrs[i];
  264|     33|        range& rr = rrs[j];
  265|       |
  266|     33|        switch (classifyIntersection(lr, rr)) {
  ------------------
  |  Branch (266:17): [True: 33, False: 0]
  ------------------
  267|      4|        case LLRR:
  ------------------
  |  Branch (267:9): [True: 4, False: 29]
  ------------------
  268|      4|          r.push_back(lr);
  269|      4|          ++i;
  270|      4|          break;
  271|     21|        case RRLL:
  ------------------
  |  Branch (271:9): [True: 21, False: 12]
  ------------------
  272|     21|          r.push_back(rr);
  273|     21|          ++j;
  274|     21|          break;
  275|      5|        case EE:
  ------------------
  |  Branch (275:9): [True: 5, False: 28]
  ------------------
  276|      5|          r.push_back(lr);
  277|      5|          ++i;
  278|      5|          ++j;
  279|      5|          break;
  280|      1|        case ELR:
  ------------------
  |  Branch (280:9): [True: 1, False: 32]
  ------------------
  281|      1|          r.push_back(lr);
  282|      1|          ++i;
  283|      1|          rr.first = Ord::succ(lr.second);
  284|      1|          break;
  285|      0|        case ERL:
  ------------------
  |  Branch (285:9): [True: 0, False: 33]
  ------------------
  286|      0|          r.push_back(rr);
  287|      0|          ++j;
  288|      0|          lr.first = Ord::succ(rr.second);
  289|      0|          break;
  290|      0|        case LRE:
  ------------------
  |  Branch (290:9): [True: 0, False: 33]
  ------------------
  291|      0|          r.push_back(range(lr.first, Ord::pred(rr.first)));
  292|      0|          r.push_back(range(rr.first, rr.second));
  293|      0|          ++i;
  294|      0|          ++j;
  295|      0|          break;
  296|      1|        case RLE:
  ------------------
  |  Branch (296:9): [True: 1, False: 32]
  ------------------
  297|      1|          r.push_back(range(rr.first, Ord::pred(lr.first)));
  298|      1|          r.push_back(range(lr.first, lr.second));
  299|      1|          ++i;
  300|      1|          ++j;
  301|      1|          break;
  302|      0|        case LRRL:
  ------------------
  |  Branch (302:9): [True: 0, False: 33]
  ------------------
  303|      0|          r.push_back(range(lr.first, Ord::pred(rr.first)));
  304|      0|          r.push_back(range(rr.first, rr.second));
  305|      0|          ++j;
  306|      0|          lr.first=Ord::succ(rr.second);
  307|      0|          break;
  308|      1|        case RLLR:
  ------------------
  |  Branch (308:9): [True: 1, False: 32]
  ------------------
  309|      1|          r.push_back(range(rr.first, Ord::pred(lr.first)));
  310|      1|          r.push_back(range(lr.first, lr.second));
  311|      1|          ++i;
  312|      1|          rr.first=Ord::succ(lr.second);
  313|      1|          break;
  314|      0|        case LRLR:
  ------------------
  |  Branch (314:9): [True: 0, False: 33]
  ------------------
  315|      0|          r.push_back(range(lr.first, Ord::pred(rr.first)));
  316|      0|          if (rr.first != lr.second) {
  ------------------
  |  Branch (316:15): [True: 0, False: 0]
  ------------------
  317|      0|            r.push_back(range(rr.first, Ord::pred(lr.second)));
  318|      0|          }
  319|      0|          ++i;
  320|      0|          rr.first = lr.second;
  321|      0|          break;
  322|      0|        case RLRL:
  ------------------
  |  Branch (322:9): [True: 0, False: 33]
  ------------------
  323|      0|          r.push_back(range(rr.first, Ord::pred(lr.first)));
  324|      0|          if (lr.first != rr.second) {
  ------------------
  |  Branch (324:15): [True: 0, False: 0]
  ------------------
  325|      0|            r.push_back(range(lr.first, Ord::pred(rr.second)));
  326|      0|          }
  327|      0|          ++j;
  328|      0|          lr.first = rr.second;
  329|      0|          break;
  330|     33|        }
  331|     33|      }
  332|       |
  333|       |      // copy any remaining ranges
  334|     56|      for (; i < lrs.size(); ++i) r.push_back(lrs[i]);
  ------------------
  |  Branch (334:14): [True: 13, False: 43]
  ------------------
  335|     80|      for (; j < rrs.size(); ++j) r.push_back(rrs[j]);
  ------------------
  |  Branch (335:14): [True: 37, False: 43]
  ------------------
  336|       |
  337|     43|      assert(rangesValid(r));
  ------------------
  |  Branch (337:7): [True: 43, False: 0]
  ------------------
  338|     43|      return r;
  339|     43|    }
_ZNK6hobbes9range_mapIhSt3setIjSt4lessIjESaIjEENS_14char_range_ordEE4findERKh:
  375|    284|    size_t find(const K& k) const {
  376|    348|      for (size_t i = 0; i < this->rs.size(); ++i) {
  ------------------
  |  Branch (376:26): [True: 176, False: 172]
  ------------------
  377|    176|        const range& r = this->rs[i];
  378|       |
  379|    176|        if (k == r.first || k == r.second || (Ord::lt(r.first, k) && Ord::lt(k, r.second))) {
  ------------------
  |  Branch (379:13): [True: 32, False: 144]
  |  Branch (379:29): [True: 18, False: 126]
  |  Branch (379:47): [True: 72, False: 54]
  |  Branch (379:70): [True: 8, False: 64]
  ------------------
  380|     58|          return i;
  381|    118|        } else if (Ord::lt(k, r.first)) {
  ------------------
  |  Branch (381:20): [True: 54, False: 64]
  ------------------
  382|     54|          break;
  383|     54|        }
  384|    176|      }
  385|    226|      return this->vs.size();
  386|    284|    }
_ZNK6hobbes9range_mapIhSt3setIjSt4lessIjESaIjEENS_14char_range_ordEE17lookupRangeSubsetERKSt4pairIhhE:
   47|    142|    const V* lookupRangeSubset(const range& kr) const {
   48|    142|      size_t i = find(kr.first);
   49|    142|      size_t j = find(kr.second);
   50|       |
   51|    142|      if (i == j && i < this->vs.size()) {
  ------------------
  |  Branch (51:11): [True: 142, False: 0]
  |  Branch (51:21): [True: 29, False: 113]
  ------------------
   52|     29|        return &this->vs[i];
   53|    113|      } else {
   54|    113|        return nullptr;
   55|    113|      }
   56|    142|    }
_ZN6hobbes9range_mapIhjNS_14char_range_ordEE6insertERKSt4pairIhhERKj:
   60|     21|    void insert(const range& rr, const V& v) {
   61|     47|      for (size_t i = 0; i < this->rs.size(); ++i) {
  ------------------
  |  Branch (61:26): [True: 26, False: 21]
  ------------------
   62|     26|        range& lr = this->rs[i];
   63|       |
   64|     26|        switch (classifyIntersection(lr, rr)) {
  ------------------
  |  Branch (64:17): [True: 26, False: 0]
  ------------------
   65|     26|        case LLRR:
  ------------------
  |  Branch (65:9): [True: 26, False: 0]
  ------------------
   66|     26|          continue;
   67|      0|        case RRLL:
  ------------------
  |  Branch (67:9): [True: 0, False: 26]
  ------------------
   68|      0|          insAt(i, rr, v);
   69|      0|          assert(rangesValid());
  ------------------
  |  Branch (69:11): [True: 0, False: 0]
  ------------------
   70|      0|          return;
   71|      0|        case EE:
  ------------------
  |  Branch (71:9): [True: 0, False: 26]
  ------------------
   72|      0|          this->vs[i] = v;
   73|      0|          assert(rangesValid());
  ------------------
  |  Branch (73:11): [True: 0, False: 0]
  ------------------
   74|      0|          return;
   75|      0|        case ELR:
  ------------------
  |  Branch (75:9): [True: 0, False: 26]
  ------------------
   76|      0|          this->vs[i] = v;
   77|      0|          lr.second = rr.second;
   78|      0|          deleteFrom(i+1, rr);
   79|      0|          assert(rangesValid());
  ------------------
  |  Branch (79:11): [True: 0, False: 0]
  ------------------
   80|      0|          return;
   81|      0|        case ERL:
  ------------------
  |  Branch (81:9): [True: 0, False: 26]
  ------------------
   82|      0|          lr.first = Ord::succ(rr.second); //+1
   83|      0|          insAt(i, rr, v);
   84|      0|          assert(rangesValid());
  ------------------
  |  Branch (84:11): [True: 0, False: 0]
  ------------------
   85|      0|          return;
   86|      0|        case LRE:
  ------------------
  |  Branch (86:9): [True: 0, False: 26]
  ------------------
   87|      0|          lr.second = Ord::pred(rr.first); //-1
   88|      0|          insAt(i+1, rr, v);
   89|      0|          assert(rangesValid());
  ------------------
  |  Branch (89:11): [True: 0, False: 0]
  ------------------
   90|      0|          return;
   91|      0|        case RLE:
  ------------------
  |  Branch (91:9): [True: 0, False: 26]
  ------------------
   92|      0|          lr.first = rr.first;
   93|      0|          this->vs[i] = v;
   94|      0|          assert(rangesValid());
  ------------------
  |  Branch (94:11): [True: 0, False: 0]
  ------------------
   95|      0|          return;
   96|      0|        case LRRL: {
  ------------------
  |  Branch (96:9): [True: 0, False: 26]
  ------------------
   97|      0|          range er(Ord::succ(rr.second), lr.second);
   98|      0|          lr.second = Ord::pred(rr.first);
   99|       |
  100|      0|          insAt(i+1, rr, v);
  101|      0|          insAt(i+2, er, this->vs[i]);
  102|      0|          assert(rangesValid());
  ------------------
  |  Branch (102:11): [True: 0, False: 0]
  ------------------
  103|      0|          return;
  104|      0|        }
  105|      0|        case RLLR:
  ------------------
  |  Branch (105:9): [True: 0, False: 26]
  ------------------
  106|      0|          lr.first = rr.first;
  107|      0|          lr.second = rr.second;
  108|      0|          this->vs[i] = v;
  109|       |
  110|      0|          deleteFrom(i+1, rr);
  111|      0|          assert(rangesValid());
  ------------------
  |  Branch (111:11): [True: 0, False: 0]
  ------------------
  112|      0|          return;
  113|      0|        case LRLR:
  ------------------
  |  Branch (113:9): [True: 0, False: 26]
  ------------------
  114|      0|          lr.second = Ord::pred(rr.first);
  115|      0|          deleteFrom(i+1,rr);
  116|      0|          insAt(i+1, rr, v);
  117|      0|          assert(rangesValid());
  ------------------
  |  Branch (117:11): [True: 0, False: 0]
  ------------------
  118|      0|          return;
  119|      0|        case RLRL:
  ------------------
  |  Branch (119:9): [True: 0, False: 26]
  ------------------
  120|      0|          lr.first = Ord::succ(rr.second);
  121|      0|          insAt(i, rr, v);
  122|      0|          assert(rangesValid());
  ------------------
  |  Branch (122:11): [True: 0, False: 0]
  ------------------
  123|      0|          return;
  124|     26|        }
  125|     26|      }
  126|       |
  127|       |      // if we get here, the range doesn't intersect anything
  128|       |      // it must go at the end
  129|     21|      this->rs.push_back(rr);
  130|     21|      this->vs.push_back(v);
  131|     21|    }
_ZN6hobbes9range_mapIhjNS_14char_range_ordEE20classifyIntersectionERKSt4pairIhhES6_:
  413|     26|    static RangeIntersection classifyIntersection(const range& lr, const range& rr) {
  414|     26|      if (Ord::lt(lr.second, rr.first)) {
  ------------------
  |  Branch (414:11): [True: 26, False: 0]
  ------------------
  415|     26|        return LLRR;
  416|     26|      } else if (Ord::lt(rr.second, lr.first)) {
  ------------------
  |  Branch (416:18): [True: 0, False: 0]
  ------------------
  417|      0|        return RRLL;
  418|      0|      } else if (lr.first == rr.first) {
  ------------------
  |  Branch (418:18): [True: 0, False: 0]
  ------------------
  419|      0|        if (lr.second == rr.second) {
  ------------------
  |  Branch (419:13): [True: 0, False: 0]
  ------------------
  420|      0|          return EE;
  421|      0|        } else if (Ord::lt(lr.second, rr.second)) {
  ------------------
  |  Branch (421:20): [True: 0, False: 0]
  ------------------
  422|      0|          return ELR;
  423|      0|        } else {
  424|      0|          return ERL;
  425|      0|        }
  426|      0|      } else if (lr.second == rr.second) {
  ------------------
  |  Branch (426:18): [True: 0, False: 0]
  ------------------
  427|      0|        if (Ord::lt(lr.first, rr.first)) {
  ------------------
  |  Branch (427:13): [True: 0, False: 0]
  ------------------
  428|      0|          return LRE;
  429|      0|        } else {
  430|      0|          return RLE;
  431|      0|        }
  432|      0|      } else if (Ord::lt(lr.first, rr.first) && Ord::lt(rr.second, lr.second)) {
  ------------------
  |  Branch (432:18): [True: 0, False: 0]
  |  Branch (432:49): [True: 0, False: 0]
  ------------------
  433|      0|        return LRRL;
  434|      0|      } else if (Ord::lt(rr.first, lr.first) && Ord::lt(lr.second, rr.second)) {
  ------------------
  |  Branch (434:18): [True: 0, False: 0]
  |  Branch (434:49): [True: 0, False: 0]
  ------------------
  435|      0|        return RLLR;
  436|      0|      } else if (Ord::lt(rr.first, lr.first) && Ord::lt(rr.second, lr.second)) {
  ------------------
  |  Branch (436:18): [True: 0, False: 0]
  |  Branch (436:49): [True: 0, False: 0]
  ------------------
  437|      0|        return RLRL;
  438|      0|      } else {
  439|      0|        return LRLR;
  440|      0|      }
  441|     26|    }
_ZNK6hobbes9range_mapIhjNS_14char_range_ordEE11rangesValidEv:
  373|      8|    bool rangesValid() const { return rangesValid(this->rs); }
_ZN6hobbes9range_mapIhjNS_14char_range_ordEE11rangesValidERKSt6vectorISt4pairIhhESaIS5_EE:
  365|      8|    static bool rangesValid(const ranges& rs) {
  366|     21|      for (const auto& r : rs) {
  ------------------
  |  Branch (366:26): [True: 21, False: 8]
  ------------------
  367|     21|        if (r.first != r.second && !(Ord::lt(r.first, r.second))) {
  ------------------
  |  Branch (367:13): [True: 14, False: 7]
  |  Branch (367:36): [True: 0, False: 14]
  ------------------
  368|      0|          return false;
  369|      0|        }
  370|     21|      }
  371|      8|      return true;
  372|      8|    }
_ZNK6hobbes9range_mapIhjNS_14char_range_ordEE4keysEPSt3setIhSt4lessIhESaIhEE:
  236|      1|    void keys(std::set<K>* ks) const {
  237|      1|      for (const auto& r : this->rs) {
  ------------------
  |  Branch (237:26): [True: 1, False: 1]
  ------------------
  238|      1|        Ord::copyRange(r.first, r.second, ks);
  239|      1|      }
  240|      1|    }
_ZNK6hobbes9range_mapIhjNS_14char_range_ordEE6lookupERKh:
   37|      1|    const V* lookup(const K& k) const {
   38|      1|      size_t i = find(k);
   39|      1|      if (i < this->vs.size()) {
  ------------------
  |  Branch (39:11): [True: 1, False: 0]
  ------------------
   40|      1|        return &this->vs[i];
   41|      1|      } else {
   42|      0|        return nullptr;
   43|      0|      }
   44|      1|    }
_ZNK6hobbes9range_mapIhjNS_14char_range_ordEE4findERKh:
  375|      1|    size_t find(const K& k) const {
  376|      1|      for (size_t i = 0; i < this->rs.size(); ++i) {
  ------------------
  |  Branch (376:26): [True: 1, False: 0]
  ------------------
  377|      1|        const range& r = this->rs[i];
  378|       |
  379|      1|        if (k == r.first || k == r.second || (Ord::lt(r.first, k) && Ord::lt(k, r.second))) {
  ------------------
  |  Branch (379:13): [True: 1, False: 0]
  |  Branch (379:29): [True: 0, False: 0]
  |  Branch (379:47): [True: 0, False: 0]
  |  Branch (379:70): [True: 0, False: 0]
  ------------------
  380|      1|          return i;
  381|      1|        } else if (Ord::lt(k, r.first)) {
  ------------------
  |  Branch (381:20): [True: 0, False: 0]
  ------------------
  382|      0|          break;
  383|      0|        }
  384|      1|      }
  385|      0|      return this->vs.size();
  386|      1|    }
_ZNK6hobbes9range_mapIhjNS_14char_range_ordEE7mappingEv:
  248|     24|    Mapping mapping() const {
  249|     24|      Mapping r;
  250|     87|      for (size_t i = 0; i < this->rs.size(); ++i) {
  ------------------
  |  Branch (250:26): [True: 63, False: 24]
  ------------------
  251|     63|        r.push_back(std::make_pair(this->rs[i], this->vs[i]));
  252|     63|      }
  253|     24|      return r;
  254|     24|    }
_ZN6hobbes9range_mapIhjNS_14char_range_ordEE7compactEv:
  342|      8|    void compact() {
  343|      8|      if (this->rs.size() >= 2) {
  ------------------
  |  Branch (343:11): [True: 6, False: 2]
  ------------------
  344|      6|        size_t i = 0;
  345|     20|        while (i < this->rs.size()-1) {
  ------------------
  |  Branch (345:16): [True: 14, False: 6]
  ------------------
  346|     14|          range& tr = this->rs[i];
  347|     14|          range& nr = this->rs[i+1];
  348|       |
  349|     14|          if (tr.second == Ord::pred(nr.first) && this->vs[i] == this->vs[i+1]) {
  ------------------
  |  Branch (349:15): [True: 12, False: 2]
  |  Branch (349:51): [True: 0, False: 12]
  ------------------
  350|      0|            tr.second = nr.second;
  351|      0|            this->rs.erase(this->rs.begin()+i+1);
  352|      0|            this->vs.erase(this->vs.begin()+i+1);
  353|     14|          } else {
  354|     14|            ++i;
  355|     14|          }
  356|     14|        }
  357|      6|      }
  358|       |      assert(rangesValid());
  ------------------
  |  Branch (358:7): [True: 8, False: 0]
  ------------------
  359|      8|    }

_ZN6hobbes3str4fromIjEENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKT_:
  101|  16.1k|  std::string from(const T& x) {
  102|  16.1k|    std::ostringstream ss;
  103|  16.1k|    ss << x;
  104|  16.1k|    return ss.str();
  105|  16.1k|  }
_ZN6hobbes3str7stringsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  348|     51|inline seq strings(const std::string& a0) { seq r; r.push_back(a0); return r; }
_ZN6hobbes3str7stringsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_:
  349|     75|inline seq strings(const std::string& a0, const std::string& a1) { seq r; r.push_back(a0); r.push_back(a1); return r; }
_ZN6hobbes3str7stringsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_S8_:
  350|      2|inline seq strings(const std::string& a0, const std::string& a1, const std::string& a2) { seq r; r.push_back(a0); r.push_back(a1); r.push_back(a2); return r; }
_ZN6hobbes3str7stringsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_S8_S8_S8_:
  352|      1|inline seq strings(const std::string& a0, const std::string& a1, const std::string& a2, const std::string& a3, const std::string& a4) { seq r; r.push_back(a0); r.push_back(a1); r.push_back(a2); r.push_back(a3); r.push_back(a4); return r; }
_ZN6hobbes3str4fromIiEENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKT_:
  101|    747|  std::string from(const T& x) {
  102|    747|    std::ostringstream ss;
  103|    747|    ss << x;
  104|    747|    return ss.str();
  105|    747|  }
_ZN6hobbes3str4fromImEENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKT_:
  101|  21.0k|  std::string from(const T& x) {
  102|  21.0k|    std::ostringstream ss;
  103|  21.0k|    ss << x;
  104|  21.0k|    return ss.str();
  105|  21.0k|  }
_ZN6hobbes3str7replaceIcEENSt7__cxx1112basic_stringIT_St11char_traitsIS4_ESaIS4_EEERKS8_SA_SA_:
  181|     95|  std::basic_string<Char> replace(const std::basic_string<Char>& src, const std::basic_string<Char>& old_substr, const std::basic_string<Char>& new_substr) {
  182|     95|    if (old_substr.empty()) {
  ------------------
  |  Branch (182:9): [True: 0, False: 95]
  ------------------
  183|      0|      return src;
  184|      0|    }
  185|       |
  186|     95|    using SZT = typename std::basic_string<Char>::size_type;
  187|     95|    std::basic_string<Char> result;
  188|     95|    SZT                     sz     = src.find(old_substr);
  189|     95|    SZT                     lsz    = 0;
  190|       |
  191|    159|    while (sz != std::basic_string<Char>::npos) {
  ------------------
  |  Branch (191:12): [True: 64, False: 95]
  ------------------
  192|     64|      result += std::string(src.begin() + lsz, src.begin() + sz);
  193|     64|      result += new_substr;
  194|       |
  195|     64|      lsz = sz + old_substr.size();
  196|     64|      sz  = src.find(old_substr, lsz);
  197|     64|    }
  198|       |
  199|     95|    if (lsz != std::basic_string<Char>::npos) {
  ------------------
  |  Branch (199:9): [True: 95, False: 0]
  ------------------
  200|     95|      result += std::string(src.begin() + lsz, src.end());
  201|     95|    }
  202|       |
  203|     95|    return result;
  204|     95|  }
_ZN6hobbes3str4fromIlEENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKT_:
  101|    165|  std::string from(const T& x) {
  102|    165|    std::ostringstream ss;
  103|    165|    ss << x;
  104|    165|    return ss.str();
  105|    165|  }
_ZN6hobbes3str2toImEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
   79|      1|  T to(const std::string& x) {
   80|      1|    std::istringstream ss(x);
   81|      1|    T r = T();
   82|      1|    ss >> r;
   83|      1|    return r;
   84|      1|  }
_ZN6hobbes3str4fromIPvEENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKT_:
  101|      2|  std::string from(const T& x) {
  102|      2|    std::ostringstream ss;
  103|      2|    ss << x;
  104|      2|    return ss.str();
  105|      2|  }
_ZN6hobbes3str5trimqIcEENSt7__cxx1112basic_stringIT_St11char_traitsIS4_ESaIS4_EEERKS8_S4_:
  161|    232|  std::basic_string<Char> trimq(const std::basic_string<Char>& s, Char q = static_cast<Char>('"')) {
  162|    232|    if (s.size() == 0) {
  ------------------
  |  Branch (162:9): [True: 0, False: 232]
  ------------------
  163|      0|      return s;
  164|    232|    } else if (s.size() == 1) {
  ------------------
  |  Branch (164:16): [True: 0, False: 232]
  ------------------
  165|      0|      return (s[0] == q) ? std::basic_string<Char>() : s;
  ------------------
  |  Branch (165:14): [True: 0, False: 0]
  ------------------
  166|    232|    } else {
  167|    232|      const Char* b = s.c_str();
  168|    232|      const Char* e = b + s.size() - 1;
  169|    232|      if (*b == q) {
  ------------------
  |  Branch (169:11): [True: 232, False: 0]
  ------------------
  170|    232|        ++b;
  171|    232|      }
  172|    232|      if (*e == q) {
  ------------------
  |  Branch (172:11): [True: 232, False: 0]
  ------------------
  173|    232|        --e;
  174|    232|      }
  175|    232|      return std::basic_string<Char>(b, e + 1);
  176|    232|    }
  177|    232|  }
_ZN6hobbes3str2toIlEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
   79|  4.76k|  T to(const std::string& x) {
   80|  4.76k|    std::istringstream ss(x);
   81|  4.76k|    T r = T();
   82|  4.76k|    ss >> r;
   83|  4.76k|    return r;
   84|  4.76k|  }

_Z10readInt128RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPn:
  113|      2|inline bool readInt128(const std::string& s, __int128* x) {
  114|      2|  if (s.empty()) return false;
  ------------------
  |  Branch (114:7): [True: 0, False: 2]
  ------------------
  115|       |
  116|      2|  bool neg = s[0] == '-';
  117|      2|  std::string n = neg ? s.substr(1) : s;
  ------------------
  |  Branch (117:19): [True: 0, False: 2]
  ------------------
  118|       |
  119|      2|  unsigned __int128 y = 0U;
  120|      2|  unsigned __int128 a = 1U;
  121|      4|  for (size_t i = n.size(); i > 0; --i) {
  ------------------
  |  Branch (121:29): [True: 2, False: 2]
  ------------------
  122|      2|    char d = n[i-1];
  123|       |
  124|      2|    if (d >= '0' && d <= '9') {
  ------------------
  |  Branch (124:9): [True: 2, False: 0]
  |  Branch (124:21): [True: 2, False: 0]
  ------------------
  125|      2|      y += a * static_cast<unsigned __int128>(d-'0');
  126|      2|      if (neg && y > HOBBES_ABS_INT128_NEG) {
  ------------------
  |  |   77|      0|#define HOBBES_ABS_INT128_NEG ( static_cast<unsigned __int128>(1) << 127U)
  ------------------
  |  Branch (126:11): [True: 0, False: 2]
  |  Branch (126:18): [True: 0, False: 0]
  ------------------
  127|      0|        return false;
  128|      0|      }
  129|      2|      if ((!neg) && y > HOBBES_ABS_INT128_POS) {
  ------------------
  |  |   76|      2|#define HOBBES_ABS_INT128_POS ((static_cast<unsigned __int128>(1) << 127U) - 1)
  ------------------
  |  Branch (129:11): [True: 2, False: 0]
  |  Branch (129:21): [True: 0, False: 2]
  ------------------
  130|      0|        return false;
  131|      0|      }
  132|      2|      a *= 10U;
  133|      2|    } else {
  134|      0|      return false;
  135|      0|    }
  136|      2|  }
  137|       |
  138|      2|  if (neg) {
  ------------------
  |  Branch (138:7): [True: 0, False: 2]
  ------------------
  139|      0|    if (y == HOBBES_ABS_INT128_NEG) {
  ------------------
  |  |   77|      0|#define HOBBES_ABS_INT128_NEG ( static_cast<unsigned __int128>(1) << 127U)
  ------------------
  |  Branch (139:9): [True: 0, False: 0]
  ------------------
  140|      0|      *x = HOBBES_INT128_MIN;
  ------------------
  |  |   78|      0|#define HOBBES_INT128_MIN     (static_cast<__int128>(static_cast<unsigned __int128>(1) << 127U))
  ------------------
  141|      0|    } else {
  142|      0|      *x = -1 * static_cast<__int128>(y);
  143|      0|    }
  144|      2|  } else {
  145|      2|    *x = static_cast<__int128>(y);
  146|      2|  }
  147|      2|  return true;
  148|      2|}

_ZN6hobbes23saturatingTimespanScaleEml:
   24|      1|inline long saturatingTimespanScale(uint64_t n, long m) {
   25|      1|  static const uint64_t maxts = static_cast<uint64_t>(std::numeric_limits<long>::max());
   26|       |
   27|      1|  const uint64_t um = static_cast<uint64_t>(m);
   28|      1|  if (um == 0 || n > (maxts / um)) {
  ------------------
  |  Branch (28:7): [True: 0, False: 1]
  |  Branch (28:18): [True: 0, False: 1]
  ------------------
   29|      0|    return (um == 0) ? 0 : std::numeric_limits<long>::max();
  ------------------
  |  Branch (29:12): [True: 0, False: 0]
  ------------------
   30|      0|  }
   31|      1|  return static_cast<long>(n * um);
   32|      1|}
_ZN6hobbes21saturatingTimespanAddEll:
   34|      2|inline long saturatingTimespanAdd(long x, long y) {
   35|      2|  static const long maxts = std::numeric_limits<long>::max();
   36|       |
   37|      2|  if (x > (maxts - y)) {
  ------------------
  |  Branch (37:7): [True: 0, False: 2]
  ------------------
   38|      0|    return maxts;
   39|      0|  }
   40|      2|  return x + y;
   41|      2|}
_ZN6hobbes12readTimespanENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
   43|      1|inline long readTimespan(std::string s) {
   44|      1|  long r = 0;
   45|       |
   46|      2|  while (!s.empty()) {
  ------------------
  |  Branch (46:10): [True: 1, False: 1]
  ------------------
   47|      1|    str::pair p = str::readWhile(&str::isDigit,    s);
   48|      1|    str::pair u = str::readWhile(&str::isNotDigit, p.second);
   49|       |
   50|      1|    long m = 1;
   51|      1|    if (u.first == "us") {                            // microseconds
  ------------------
  |  Branch (51:9): [True: 0, False: 1]
  ------------------
   52|      0|      m = 1;
   53|      1|    } else if (u.first == "ms") {                     // milliseconds
  ------------------
  |  Branch (53:16): [True: 0, False: 1]
  ------------------
   54|      0|      m = 1000;
   55|      1|    } else if (u.first == "s") {                      // seconds
  ------------------
  |  Branch (55:16): [True: 1, False: 0]
  ------------------
   56|      1|      m = 1000000;
   57|      1|    } else if (u.first == "m" || u.first == "min") {  // minutes
  ------------------
  |  Branch (57:16): [True: 0, False: 0]
  |  Branch (57:34): [True: 0, False: 0]
  ------------------
   58|      0|      m = 1000000*60;
   59|      0|    } else if (u.first == "h" || u.first == "hour") { // hours
  ------------------
  |  Branch (59:16): [True: 0, False: 0]
  |  Branch (59:34): [True: 0, False: 0]
  ------------------
   60|      0|      m = 1000000L*60*60;
   61|      0|    } else if (u.first == "d" || u.first == "day") {  // days
  ------------------
  |  Branch (61:16): [True: 0, False: 0]
  |  Branch (61:34): [True: 0, False: 0]
  ------------------
   62|      0|      m = 1000000L*60*60*24;
   63|      0|    }
   64|       |
   65|       |    // an out-of-range digit sequence reads as UINT64_MAX, which saturates below
   66|      1|    r = saturatingTimespanAdd(r, saturatingTimespanScale(str::to<uint64_t>(p.first), m));
   67|      1|    s = u.second;
   68|      1|  }
   69|       |
   70|      1|  return r;
   71|      1|}
_ZN6hobbes12readTimespanERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS6_EE:
   73|      1|inline long readTimespan(const str::seq& ss) {
   74|      1|  long r = 0;
   75|      1|  for (const auto& s : ss) {
  ------------------
  |  Branch (75:22): [True: 1, False: 1]
  ------------------
   76|      1|    r = saturatingTimespanAdd(r, readTimespan(s));
   77|      1|  }
   78|      1|  return r;
   79|      1|}

_ZN6hobbes11prefix_treeISt10shared_ptrINS_8MonoTypeEES1_INS_10TCInstanceEENS_6MTyMapEEC2Ev:
   71|    349|    prefix_tree() : root(new node_t) {
   72|    349|    }
_ZN6hobbes11prefix_treeISt10shared_ptrINS_8MonoTypeEESt6vectorIS1_INS_12TCInstanceFnEESaIS6_EENS_6MTyMapEEC2Ev:
   71|    349|    prefix_tree() : root(new node_t) {
   72|    349|    }
_ZN6hobbes11prefix_treeISt10shared_ptrINS_8MonoTypeEEbNS_6MTyMapEEC2Ev:
   71|    698|    prefix_tree() : root(new node_t) {
   72|    698|    }
_ZN6hobbes11prefix_treeISt10shared_ptrINS_8MonoTypeEEbNS_6MTyMapEED2Ev:
   74|    698|    ~prefix_tree() {
   75|    698|      delete this->root;
   76|    698|    }
_ZN6hobbes16prefix_tree_nodeISt10shared_ptrINS_8MonoTypeEEbNS_6MTyMapEED2Ev:
   18|  9.02k|    ~prefix_tree_node() {
   19|  13.7k|      for (typename SubkeyMap::const_iterator c = this->children.begin(); c != this->children.end(); ++c) {
  ------------------
  |  Branch (19:75): [True: 4.71k, False: 9.02k]
  ------------------
   20|  4.71k|        delete c->second;
   21|  4.71k|      }
   22|  9.02k|    }
_ZN6hobbes11prefix_treeISt10shared_ptrINS_8MonoTypeEESt6vectorIS1_INS_12TCInstanceFnEESaIS6_EENS_6MTyMapEED2Ev:
   74|    349|    ~prefix_tree() {
   75|    349|      delete this->root;
   76|    349|    }
_ZN6hobbes16prefix_tree_nodeISt10shared_ptrINS_8MonoTypeEESt6vectorIS1_INS_12TCInstanceFnEESaIS6_EENS_6MTyMapEED2Ev:
   18|  1.73k|    ~prefix_tree_node() {
   19|  3.11k|      for (typename SubkeyMap::const_iterator c = this->children.begin(); c != this->children.end(); ++c) {
  ------------------
  |  Branch (19:75): [True: 1.38k, False: 1.73k]
  ------------------
   20|  1.38k|        delete c->second;
   21|  1.38k|      }
   22|  1.73k|    }
_ZN6hobbes11prefix_treeISt10shared_ptrINS_8MonoTypeEES1_INS_10TCInstanceEENS_6MTyMapEED2Ev:
   74|    349|    ~prefix_tree() {
   75|    349|      delete this->root;
   76|    349|    }
_ZN6hobbes16prefix_tree_nodeISt10shared_ptrINS_8MonoTypeEES1_INS_10TCInstanceEENS_6MTyMapEED2Ev:
   18|  1.08k|    ~prefix_tree_node() {
   19|  1.81k|      for (typename SubkeyMap::const_iterator c = this->children.begin(); c != this->children.end(); ++c) {
  ------------------
  |  Branch (19:75): [True: 731, False: 1.08k]
  ------------------
   20|    731|        delete c->second;
   21|    731|      }
   22|  1.08k|    }
_ZN6hobbes11prefix_treeISt10shared_ptrINS_8MonoTypeEEbNS_6MTyMapEE6insertIN9__gnu_cxx17__normal_iteratorIPKS3_St6vectorIS3_SaIS3_EEEEEEvT_SF_RKb:
   90|  2.87k|      void insert(KIter begin, KIter end, const V& v) {
   91|  2.87k|        makeNode(begin, end)->value = v;
   92|  2.87k|      }
_ZN6hobbes11prefix_treeISt10shared_ptrINS_8MonoTypeEEbNS_6MTyMapEE8makeNodeIN9__gnu_cxx17__normal_iteratorIPKS3_St6vectorIS3_SaIS3_EEEEEEPNS_16prefix_tree_nodeIS3_bS4_EET_SI_:
   45|  2.87k|      node_t* makeNode(KIter begin, KIter end) {
   46|  2.87k|        node_t* r = this->root;
   47|  9.93k|        for (KIter i = begin; i != end; ++i) {
  ------------------
  |  Branch (47:31): [True: 7.06k, False: 2.87k]
  ------------------
   48|  7.06k|          node_t*& nr = r->children[*i];
   49|  7.06k|          if (!nr) {
  ------------------
  |  Branch (49:15): [True: 4.71k, False: 2.34k]
  ------------------
   50|  4.71k|            nr = new node_t;
   51|  4.71k|          }
   52|  7.06k|          r = nr;
   53|  7.06k|        }
   54|  2.87k|        return r;
   55|  2.87k|      }
_ZN6hobbes11prefix_treeISt10shared_ptrINS_8MonoTypeEES1_INS_10TCInstanceEENS_6MTyMapEE6insertIN9__gnu_cxx17__normal_iteratorIPKS3_St6vectorIS3_SaIS3_EEEEEEvT_SH_RKS5_:
   90|    433|      void insert(KIter begin, KIter end, const V& v) {
   91|    433|        makeNode(begin, end)->value = v;
   92|    433|      }
_ZN6hobbes11prefix_treeISt10shared_ptrINS_8MonoTypeEES1_INS_10TCInstanceEENS_6MTyMapEE8makeNodeIN9__gnu_cxx17__normal_iteratorIPKS3_St6vectorIS3_SaIS3_EEEEEEPNS_16prefix_tree_nodeIS3_S5_S6_EET_SK_:
   45|    433|      node_t* makeNode(KIter begin, KIter end) {
   46|    433|        node_t* r = this->root;
   47|  1.26k|        for (KIter i = begin; i != end; ++i) {
  ------------------
  |  Branch (47:31): [True: 836, False: 433]
  ------------------
   48|    836|          node_t*& nr = r->children[*i];
   49|    836|          if (!nr) {
  ------------------
  |  Branch (49:15): [True: 731, False: 105]
  ------------------
   50|    731|            nr = new node_t;
   51|    731|          }
   52|    836|          r = nr;
   53|    836|        }
   54|    433|        return r;
   55|    433|      }
_ZNK6hobbes11prefix_treeISt10shared_ptrINS_8MonoTypeEESt6vectorIS1_INS_12TCInstanceFnEESaIS6_EENS_6MTyMapEE6lookupIN9__gnu_cxx17__normal_iteratorIPKS3_S4_IS3_SaIS3_EEEEEEPS8_T_SK_:
   95|    637|      V* lookup(KIter begin, KIter end) const {
   96|    637|        const node_t* n = findNode(begin, end);
   97|    637|        return n ? const_cast<V*>(get<V>(n->value)) : nullptr;
  ------------------
  |  Branch (97:16): [True: 65, False: 572]
  ------------------
   98|    637|      }
_ZNK6hobbes11prefix_treeISt10shared_ptrINS_8MonoTypeEESt6vectorIS1_INS_12TCInstanceFnEESaIS6_EENS_6MTyMapEE8findNodeIN9__gnu_cxx17__normal_iteratorIPKS3_S4_IS3_SaIS3_EEEEEEPKNS_16prefix_tree_nodeIS3_S8_S9_EET_SN_:
   58|    637|      const node_t* findNode(KIter begin, KIter end) const {
   59|    637|        const node_t* r = this->root;
   60|    965|        for (KIter i = begin; i != end; ++i) {
  ------------------
  |  Branch (60:31): [True: 900, False: 65]
  ------------------
   61|    900|          auto c = r->children.find(*i);
   62|    900|          if (c == r->children.end()) {
  ------------------
  |  Branch (62:15): [True: 572, False: 328]
  ------------------
   63|    572|            return nullptr;
   64|    572|          } else {
   65|    328|            r = c->second;
   66|    328|          }
   67|    900|        }
   68|     65|        return r;
   69|    637|      }
_ZN6hobbes11prefix_treeISt10shared_ptrINS_8MonoTypeEESt6vectorIS1_INS_12TCInstanceFnEESaIS6_EENS_6MTyMapEE6insertIN9__gnu_cxx17__normal_iteratorIPKS3_S4_IS3_SaIS3_EEEEEEvT_SJ_RKS8_:
   90|    572|      void insert(KIter begin, KIter end, const V& v) {
   91|    572|        makeNode(begin, end)->value = v;
   92|    572|      }
_ZN6hobbes11prefix_treeISt10shared_ptrINS_8MonoTypeEESt6vectorIS1_INS_12TCInstanceFnEESaIS6_EENS_6MTyMapEE8makeNodeIN9__gnu_cxx17__normal_iteratorIPKS3_S4_IS3_SaIS3_EEEEEEPNS_16prefix_tree_nodeIS3_S8_S9_EET_SM_:
   45|    572|      node_t* makeNode(KIter begin, KIter end) {
   46|    572|        node_t* r = this->root;
   47|  2.16k|        for (KIter i = begin; i != end; ++i) {
  ------------------
  |  Branch (47:31): [True: 1.59k, False: 572]
  ------------------
   48|  1.59k|          node_t*& nr = r->children[*i];
   49|  1.59k|          if (!nr) {
  ------------------
  |  Branch (49:15): [True: 1.38k, False: 209]
  ------------------
   50|  1.38k|            nr = new node_t;
   51|  1.38k|          }
   52|  1.59k|          r = nr;
   53|  1.59k|        }
   54|    572|        return r;
   55|    572|      }
_ZN6hobbes11prefix_treeISt10shared_ptrINS_8MonoTypeEEbNS_6MTyMapEE5clearEv:
   83|  3.60k|    void clear() {
   84|  3.60k|      node_t* fresh = new node_t; // before the old tree goes, so a failed allocation leaves it intact
   85|  3.60k|      delete this->root;
   86|  3.60k|      this->root = fresh;
   87|  3.60k|    }
_ZNK6hobbes11prefix_treeISt10shared_ptrINS_8MonoTypeEESt6vectorIS1_INS_12TCInstanceFnEESaIS6_EENS_6MTyMapEE7valueAtEPv:
  154|    218|    V* valueAt(point_t base) const {
  155|    218|      return get<V>(reinterpret_cast<node_t*>(base)->value);
  156|    218|    }
_ZNK6hobbes11prefix_treeISt10shared_ptrINS_8MonoTypeEESt6vectorIS1_INS_12TCInstanceFnEESaIS6_EENS_6MTyMapEE11keyPointsAtEPS4_ISt4pairIS3_PvESaISD_EESC_:
  146|    408|    void keyPointsAt(KeyPointSeq* kps, point_t base) const {
  147|    408|      const node_t* n = reinterpret_cast<node_t*>(base);
  148|       |
  149|  1.11k|      for (auto c = n->children.begin(); c != n->children.end(); ++c) {
  ------------------
  |  Branch (149:42): [True: 711, False: 408]
  ------------------
  150|    711|        kps->push_back(KeyPoint(c->first, c->second));
  151|    711|      }
  152|    408|    }
_ZNK6hobbes11prefix_treeISt10shared_ptrINS_8MonoTypeEESt6vectorIS1_INS_12TCInstanceFnEESaIS6_EENS_6MTyMapEE9rootPointEv:
  121|    176|    point_t rootPoint() const { return this->root; }
_ZNK6hobbes11prefix_treeISt10shared_ptrINS_8MonoTypeEES1_INS_10TCInstanceEENS_6MTyMapEE7valueAtEPv:
  154|  2.26k|    V* valueAt(point_t base) const {
  155|  2.26k|      return get<V>(reinterpret_cast<node_t*>(base)->value);
  156|  2.26k|    }
_ZNK6hobbes11prefix_treeISt10shared_ptrINS_8MonoTypeEES1_INS_10TCInstanceEENS_6MTyMapEE6moveToERKS3_Pv:
  123|  7.08k|    point_t moveTo(const K& k, point_t base) const {
  124|  7.08k|      const node_t* n = reinterpret_cast<node_t*>(base);
  125|  7.08k|      auto c = n->children.find(k);
  126|  7.08k|      return (c == n->children.end()) ? 0 : c->second;
  ------------------
  |  Branch (126:14): [True: 1.01k, False: 6.06k]
  ------------------
  127|  7.08k|    }
_ZNK6hobbes11prefix_treeISt10shared_ptrINS_8MonoTypeEES1_INS_10TCInstanceEENS_6MTyMapEE11keyPointsAtEPSt6vectorISt4pairIS3_PvESaISB_EESA_:
  146|  1.38k|    void keyPointsAt(KeyPointSeq* kps, point_t base) const {
  147|  1.38k|      const node_t* n = reinterpret_cast<node_t*>(base);
  148|       |
  149|  3.79k|      for (auto c = n->children.begin(); c != n->children.end(); ++c) {
  ------------------
  |  Branch (149:42): [True: 2.41k, False: 1.38k]
  ------------------
  150|  2.41k|        kps->push_back(KeyPoint(c->first, c->second));
  151|  2.41k|      }
  152|  1.38k|    }
_ZNK6hobbes11prefix_treeISt10shared_ptrINS_8MonoTypeEES1_INS_10TCInstanceEENS_6MTyMapEE9rootPointEv:
  121|  4.69k|    point_t rootPoint() const { return this->root; }
_ZNK6hobbes11prefix_treeISt10shared_ptrINS_8MonoTypeEEbNS_6MTyMapEE6lookupIN9__gnu_cxx17__normal_iteratorIPKS3_St6vectorIS3_SaIS3_EEEEEEPbT_SG_:
   95|  8.94k|      V* lookup(KIter begin, KIter end) const {
   96|  8.94k|        const node_t* n = findNode(begin, end);
   97|  8.94k|        return n ? const_cast<V*>(get<V>(n->value)) : nullptr;
  ------------------
  |  Branch (97:16): [True: 5.60k, False: 3.33k]
  ------------------
   98|  8.94k|      }
_ZNK6hobbes11prefix_treeISt10shared_ptrINS_8MonoTypeEEbNS_6MTyMapEE8findNodeIN9__gnu_cxx17__normal_iteratorIPKS3_St6vectorIS3_SaIS3_EEEEEEPKNS_16prefix_tree_nodeIS3_bS4_EET_SJ_:
   58|  8.94k|      const node_t* findNode(KIter begin, KIter end) const {
   59|  8.94k|        const node_t* r = this->root;
   60|  25.7k|        for (KIter i = begin; i != end; ++i) {
  ------------------
  |  Branch (60:31): [True: 20.1k, False: 5.60k]
  ------------------
   61|  20.1k|          auto c = r->children.find(*i);
   62|  20.1k|          if (c == r->children.end()) {
  ------------------
  |  Branch (62:15): [True: 3.33k, False: 16.8k]
  ------------------
   63|  3.33k|            return nullptr;
   64|  16.8k|          } else {
   65|  16.8k|            r = c->second;
   66|  16.8k|          }
   67|  20.1k|        }
   68|  5.60k|        return r;
   69|  8.94k|      }
_ZNK6hobbes11prefix_treeISt10shared_ptrINS_8MonoTypeEES1_INS_10TCInstanceEENS_6MTyMapEE6valuesEv:
  113|  7.74k|    ValueSeq values() const {
  114|  7.74k|      ValueSeq vs;
  115|  7.74k|      values(&vs);
  116|  7.74k|      return vs;
  117|  7.74k|    }
_ZNK6hobbes11prefix_treeISt10shared_ptrINS_8MonoTypeEES1_INS_10TCInstanceEENS_6MTyMapEE6valuesEPSt6vectorIS5_SaIS5_EE:
  109|  7.74k|    void values(ValueSeq* vs) const {
  110|  7.74k|      this->root->values(vs);
  111|  7.74k|    }
_ZNK6hobbes16prefix_tree_nodeISt10shared_ptrINS_8MonoTypeEES1_INS_10TCInstanceEENS_6MTyMapEE6valuesEPSt6vectorIS5_SaIS5_EE:
   27|  36.5k|    void values(std::vector<V>* vs) const {
   28|  36.5k|      if (const V* v = get<V>(this->value)) {
  ------------------
  |  Branch (28:20): [True: 15.7k, False: 20.7k]
  ------------------
   29|  15.7k|        vs->push_back(*v);
   30|  15.7k|      }
   31|       |
   32|  65.2k|      for (auto c = this->children.begin(); c != this->children.end(); ++c) {
  ------------------
  |  Branch (32:45): [True: 28.7k, False: 36.5k]
  ------------------
   33|  28.7k|        c->second->values(vs);
   34|  28.7k|      }
   35|  36.5k|    }
_ZN6hobbes11prefix_treeISt10shared_ptrINS_8MonoTypeEES1_INS_10ConstraintEENS_6MTyMapEED2Ev:
   74|  19.3k|    ~prefix_tree() {
   75|  19.3k|      delete this->root;
   76|  19.3k|    }
_ZN6hobbes16prefix_tree_nodeISt10shared_ptrINS_8MonoTypeEES1_INS_10ConstraintEENS_6MTyMapEED2Ev:
   18|   114k|    ~prefix_tree_node() {
   19|   210k|      for (typename SubkeyMap::const_iterator c = this->children.begin(); c != this->children.end(); ++c) {
  ------------------
  |  Branch (19:75): [True: 95.5k, False: 114k]
  ------------------
   20|  95.5k|        delete c->second;
   21|  95.5k|      }
   22|   114k|    }
_ZN6hobbes11prefix_treeISt10shared_ptrINS_8MonoTypeEES1_INS_10ConstraintEENS_6MTyMapEEC2Ev:
   71|  19.3k|    prefix_tree() : root(new node_t) {
   72|  19.3k|    }
_ZNK6hobbes11prefix_treeISt10shared_ptrINS_8MonoTypeEES1_INS_10ConstraintEENS_6MTyMapEE6lookupIN9__gnu_cxx17__normal_iteratorIPKS3_St6vectorIS3_SaIS3_EEEEEEPS5_T_SI_:
   95|  61.5k|      V* lookup(KIter begin, KIter end) const {
   96|  61.5k|        const node_t* n = findNode(begin, end);
   97|  61.5k|        return n ? const_cast<V*>(get<V>(n->value)) : nullptr;
  ------------------
  |  Branch (97:16): [True: 2.34k, False: 59.1k]
  ------------------
   98|  61.5k|      }
_ZNK6hobbes11prefix_treeISt10shared_ptrINS_8MonoTypeEES1_INS_10ConstraintEENS_6MTyMapEE8findNodeIN9__gnu_cxx17__normal_iteratorIPKS3_St6vectorIS3_SaIS3_EEEEEEPKNS_16prefix_tree_nodeIS3_S5_S6_EET_SL_:
   58|  61.5k|      const node_t* findNode(KIter begin, KIter end) const {
   59|  61.5k|        const node_t* r = this->root;
   60|  91.0k|        for (KIter i = begin; i != end; ++i) {
  ------------------
  |  Branch (60:31): [True: 88.6k, False: 2.34k]
  ------------------
   61|  88.6k|          auto c = r->children.find(*i);
   62|  88.6k|          if (c == r->children.end()) {
  ------------------
  |  Branch (62:15): [True: 59.1k, False: 29.4k]
  ------------------
   63|  59.1k|            return nullptr;
   64|  59.1k|          } else {
   65|  29.4k|            r = c->second;
   66|  29.4k|          }
   67|  88.6k|        }
   68|  2.34k|        return r;
   69|  61.5k|      }
_ZNK6hobbes11prefix_treeISt10shared_ptrINS_8MonoTypeEES1_INS_10ConstraintEENS_6MTyMapEE7valueAtEPv:
  154|    762|    V* valueAt(point_t base) const {
  155|    762|      return get<V>(reinterpret_cast<node_t*>(base)->value);
  156|    762|    }
_ZNK6hobbes11prefix_treeISt10shared_ptrINS_8MonoTypeEES1_INS_10ConstraintEENS_6MTyMapEE6moveToERKS3_Pv:
  123|  32.5k|    point_t moveTo(const K& k, point_t base) const {
  124|  32.5k|      const node_t* n = reinterpret_cast<node_t*>(base);
  125|  32.5k|      auto c = n->children.find(k);
  126|  32.5k|      return (c == n->children.end()) ? 0 : c->second;
  ------------------
  |  Branch (126:14): [True: 22.2k, False: 10.3k]
  ------------------
  127|  32.5k|    }
_ZNK6hobbes11prefix_treeISt10shared_ptrINS_8MonoTypeEES1_INS_10ConstraintEENS_6MTyMapEE11keyPointsAtEPSt6vectorISt4pairIS3_PvESaISB_EESA_:
  146|  6.81k|    void keyPointsAt(KeyPointSeq* kps, point_t base) const {
  147|  6.81k|      const node_t* n = reinterpret_cast<node_t*>(base);
  148|       |
  149|  14.1k|      for (auto c = n->children.begin(); c != n->children.end(); ++c) {
  ------------------
  |  Branch (149:42): [True: 7.36k, False: 6.81k]
  ------------------
  150|  7.36k|        kps->push_back(KeyPoint(c->first, c->second));
  151|  7.36k|      }
  152|  6.81k|    }
_ZNK6hobbes11prefix_treeISt10shared_ptrINS_8MonoTypeEES1_INS_10ConstraintEENS_6MTyMapEE9rootPointEv:
  121|  22.4k|    point_t rootPoint() const { return this->root; }
_ZN6hobbes11prefix_treeISt10shared_ptrINS_8MonoTypeEES1_INS_10ConstraintEENS_6MTyMapEE6insertIN9__gnu_cxx17__normal_iteratorIPKS3_St6vectorIS3_SaIS3_EEEEEEvT_SH_RKS5_:
   90|  29.4k|      void insert(KIter begin, KIter end, const V& v) {
   91|  29.4k|        makeNode(begin, end)->value = v;
   92|  29.4k|      }
_ZN6hobbes11prefix_treeISt10shared_ptrINS_8MonoTypeEES1_INS_10ConstraintEENS_6MTyMapEE8makeNodeIN9__gnu_cxx17__normal_iteratorIPKS3_St6vectorIS3_SaIS3_EEEEEEPNS_16prefix_tree_nodeIS3_S5_S6_EET_SK_:
   45|  29.4k|      node_t* makeNode(KIter begin, KIter end) {
   46|  29.4k|        node_t* r = this->root;
   47|   135k|        for (KIter i = begin; i != end; ++i) {
  ------------------
  |  Branch (47:31): [True: 105k, False: 29.4k]
  ------------------
   48|   105k|          node_t*& nr = r->children[*i];
   49|   105k|          if (!nr) {
  ------------------
  |  Branch (49:15): [True: 95.5k, False: 10.3k]
  ------------------
   50|  95.5k|            nr = new node_t;
   51|  95.5k|          }
   52|   105k|          r = nr;
   53|   105k|        }
   54|  29.4k|        return r;
   55|  29.4k|      }
_ZNK6hobbes11prefix_treeISt10shared_ptrINS_8MonoTypeEES1_INS_10ConstraintEENS_6MTyMapEE6valuesEv:
  113|  19.3k|    ValueSeq values() const {
  114|  19.3k|      ValueSeq vs;
  115|  19.3k|      values(&vs);
  116|  19.3k|      return vs;
  117|  19.3k|    }
_ZNK6hobbes11prefix_treeISt10shared_ptrINS_8MonoTypeEES1_INS_10ConstraintEENS_6MTyMapEE6valuesEPSt6vectorIS5_SaIS5_EE:
  109|  19.3k|    void values(ValueSeq* vs) const {
  110|  19.3k|      this->root->values(vs);
  111|  19.3k|    }
_ZNK6hobbes16prefix_tree_nodeISt10shared_ptrINS_8MonoTypeEES1_INS_10ConstraintEENS_6MTyMapEE6valuesEPSt6vectorIS5_SaIS5_EE:
   27|   114k|    void values(std::vector<V>* vs) const {
   28|   114k|      if (const V* v = get<V>(this->value)) {
  ------------------
  |  Branch (28:20): [True: 29.4k, False: 85.5k]
  ------------------
   29|  29.4k|        vs->push_back(*v);
   30|  29.4k|      }
   31|       |
   32|   210k|      for (auto c = this->children.begin(); c != this->children.end(); ++c) {
  ------------------
  |  Branch (32:45): [True: 95.5k, False: 114k]
  ------------------
   33|  95.5k|        c->second->values(vs);
   34|  95.5k|      }
   35|   114k|    }

_ZN6hobbes19equivalence_mappingISt10shared_ptrINS_8MonoTypeEENS_8UTypeRecENS_9LiftUTypeENS_15MoreDefinedTypeEEC2Ev:
   30|  23.7k|    equivalence_mapping() : eqsz(0) {
   31|  23.7k|    }
_ZN6hobbes19equivalence_mappingISt10shared_ptrINS_8MonoTypeEENS_8UTypeRecENS_9LiftUTypeENS_15MoreDefinedTypeEE4findERKS3_:
   39|   537k|    V& find(const K& k) {
   40|   537k|      return findNode(k)->value;
   41|   537k|    }
_ZN6hobbes19equivalence_mappingISt10shared_ptrINS_8MonoTypeEENS_8UTypeRecENS_9LiftUTypeENS_15MoreDefinedTypeEE8findNodeERKS3_:
  122|   598k|    node_t* findNode(const K& k) {
  123|   598k|      typename nodes_t::const_iterator n = this->nodes.find(k);
  124|       |
  125|   598k|      if (n != this->nodes.end()) {
  ------------------
  |  Branch (125:11): [True: 502k, False: 95.9k]
  ------------------
  126|   502k|        return findRepresentative(n->second.get());
  127|   502k|      } else {
  128|  95.9k|        auto* n = new node_t(k, KVLift::apply(k));
  129|  95.9k|        this->nodes[k] = nodep(n);
  130|  95.9k|        return n;
  131|  95.9k|      }
  132|   598k|    }
_ZN6hobbes19equivalence_mappingISt10shared_ptrINS_8MonoTypeEENS_8UTypeRecENS_9LiftUTypeENS_15MoreDefinedTypeEE18findRepresentativeEPNS_8eqsetmemIS3_S4_EE:
  106|   508k|    static node_t* findRepresentative(node_t* n) {
  107|       |      // first find the root
  108|   508k|      auto* root = n;
  109|   649k|      while (root != root->representative) {
  ------------------
  |  Branch (109:14): [True: 140k, False: 508k]
  ------------------
  110|   140k|        root = root->representative;
  111|   140k|      }
  112|       |
  113|       |      // then update all nodes along the way (they all have the same representative)
  114|   649k|      while (n != root) {
  ------------------
  |  Branch (114:14): [True: 140k, False: 508k]
  ------------------
  115|   140k|        auto* s = n->representative;
  116|   140k|        n->representative = root;
  117|   140k|        n = s;
  118|   140k|      }
  119|   508k|      return root;
  120|   508k|    }
_ZN6hobbes8eqsetmemISt10shared_ptrINS_8MonoTypeEENS_8UTypeRecEEC2ERKS3_RKS4_:
   17|   102k|    eqsetmem(const K& key, const V& value) : key(key), value(value), rank(0) {
   18|   102k|      representative = this;
   19|   102k|    }
_ZN6hobbes19equivalence_mappingISt10shared_ptrINS_8MonoTypeEENS_8UTypeRecENS_9LiftUTypeENS_15MoreDefinedTypeEE4joinERKS3_S9_:
   44|  30.1k|    void join(const K& k0, const K& k1) {
   45|  30.1k|      node_t* lhs = findNode(k0);
   46|  30.1k|      node_t* rhs = findNode(k1);
   47|       |
   48|  30.1k|      if (lhs->rank < rhs->rank) {
  ------------------
  |  Branch (48:11): [True: 3.56k, False: 26.6k]
  ------------------
   49|  3.56k|        lhs->representative = rhs;
   50|  3.56k|        rhs->value = VPlus::apply(rhs->value, lhs->value);
   51|  26.6k|      } else if (lhs->rank > rhs->rank) {
  ------------------
  |  Branch (51:18): [True: 5.28k, False: 21.3k]
  ------------------
   52|  5.28k|        rhs->representative = lhs;
   53|  5.28k|        lhs->value = VPlus::apply(lhs->value, rhs->value);
   54|  21.3k|      } else if (lhs == rhs) {
  ------------------
  |  Branch (54:18): [True: 10, False: 21.3k]
  ------------------
   55|       |        // these are the same thing, don't pretend that we've added information
   56|     10|        return;
   57|  21.3k|      } else {
   58|  21.3k|        rhs->representative = lhs;
   59|  21.3k|        lhs->rank += 1;
   60|  21.3k|        lhs->value = VPlus::apply(lhs->value, rhs->value);
   61|  21.3k|      }
   62|       |
   63|  30.1k|      ++this->eqsz;
   64|  30.1k|    }
_ZN6hobbes19equivalence_mappingISt10shared_ptrINS_8MonoTypeEENS_8UTypeRecENS_9LiftUTypeENS_15MoreDefinedTypeEE5mergeERKS7_:
   67|  1.78k|    size_t merge(const equivalence_mapping<K, V, KVLift, VPlus>& rhs) {
   68|       |      // count the number of extra bindings that we add
   69|  1.78k|      size_t c = this->eqsz;
   70|       |
   71|       |      // add new nodes to this set
   72|  6.56k|      for (const auto& kn : rhs.nodes) {
  ------------------
  |  Branch (72:27): [True: 6.56k, False: 1.78k]
  ------------------
   73|  6.56k|        if (this->nodes.find(kn.first) == this->nodes.end()) {
  ------------------
  |  Branch (73:13): [True: 6.56k, False: 0]
  ------------------
   74|  6.56k|          this->nodes[kn.first] = nodep(new node_t(kn.first, KVLift::apply(kn.first)));
   75|  6.56k|        }
   76|  6.56k|      }
   77|       |
   78|       |      // now for these new nodes, apply the equivalence bindings from the input set
   79|  6.56k|      for (const auto& kn : rhs.nodes) {
  ------------------
  |  Branch (79:27): [True: 6.56k, False: 1.78k]
  ------------------
   80|  6.56k|        node_t* rrep = findRepresentative(kn.second.get());
   81|  6.56k|        if (kn.first != rrep->key) {
  ------------------
  |  Branch (81:13): [True: 1.02k, False: 5.53k]
  ------------------
   82|  1.02k|          join(kn.first, rrep->key);
   83|  1.02k|        }
   84|  6.56k|      }
   85|       |
   86|  1.78k|      return this->eqsz - c;
   87|  1.78k|    }
_ZNK6hobbes19equivalence_mappingISt10shared_ptrINS_8MonoTypeEENS_8UTypeRecENS_9LiftUTypeENS_15MoreDefinedTypeEE6valuesEv:
   90|    642|    std::vector<K> values() const {
   91|    642|      std::vector<K> vs;
   92|    642|      vs.reserve(nodes.size());
   93|  4.62k|      for (const auto& kn : this->nodes) {
  ------------------
  |  Branch (93:27): [True: 4.62k, False: 642]
  ------------------
   94|  4.62k|        vs.push_back(kn.first);
   95|  4.62k|      }
   96|    642|      return vs;
   97|    642|    }

_ZN6hobbes15compileBootCodeERNS_2ccE:
    9|      1|void compileBootCode(cc& ctx) {
   10|     27|  for (size_t i = 0; module_defs[i] != nullptr; ++i) {
  ------------------
  |  Branch (10:22): [True: 26, False: 1]
  ------------------
   11|     26|    compile(&ctx, ctx.readModule(std::string(reinterpret_cast<const char*>(module_defs[i]), module_lens[i])));
   12|     26|  }
   13|      1|}

_ZN6hobbes8fileTypeEbRKSt10shared_ptrINS_8MonoTypeEE:
   14|      2|MonoTypePtr fileType(bool writeable, const MonoTypePtr& stype) {
   15|      2|  return tapp(primty("file"), list(tlong(writeable ? 1 : 0), stype));
  ------------------
  |  Branch (15:42): [True: 1, False: 1]
  ------------------
   16|      2|}
_ZN6hobbes14unpackFileTypeERKSt10shared_ptrINS_8MonoTypeEEPSt4pairIbS2_E:
   34|  5.09k|bool unpackFileType(const MonoTypePtr& fty, UTFileConfig* fcfg) {
   35|  5.09k|  if (const TApp* ap = is<TApp>(fty)) {
  ------------------
  |  Branch (35:19): [True: 0, False: 5.09k]
  ------------------
   36|      0|    if (ap->args().size() == 2) {
  ------------------
  |  Branch (36:9): [True: 0, False: 0]
  ------------------
   37|      0|      if (const Prim* f = is<Prim>(ap->fn())) {
  ------------------
  |  Branch (37:23): [True: 0, False: 0]
  ------------------
   38|      0|        if (f->name() == "file") {
  ------------------
  |  Branch (38:13): [True: 0, False: 0]
  ------------------
   39|      0|          if (auto fm = fileModeFlags(ap->args()[0])) {
  ------------------
  |  Branch (39:20): [True: 0, False: 0]
  ------------------
   40|      0|            *fcfg = UTFileConfig(isWriteable(fm), ap->args()[1]);
   41|      0|            return true;
   42|      0|          }
   43|      0|        }
   44|      0|      }
   45|      0|    }
   46|      0|  }
   47|  5.09k|  return false;
   48|  5.09k|}
_ZN6hobbes14unpackFileTypeERKSt10shared_ptrINS_8MonoTypeEEPSt4pairIbPKNS_6RecordEE:
   51|  5.09k|bool unpackFileType(const MonoTypePtr& fty, FileConfig* fcfg) {
   52|  5.09k|  UTFileConfig ufcfg;
   53|  5.09k|  if (unpackFileType(fty, &ufcfg)) {
  ------------------
  |  Branch (53:7): [True: 0, False: 5.09k]
  ------------------
   54|      0|    if (const Record* fr = is<Record>(ufcfg.second)) {
  ------------------
  |  Branch (54:23): [True: 0, False: 0]
  ------------------
   55|      0|      *fcfg = FileConfig(ufcfg.first, fr);
   56|      0|      return true;
   57|      0|    }
   58|      0|  }
   59|  5.09k|  return false;
   60|  5.09k|}
_ZNK6hobbes13DBFieldLookup9satisfiedERKSt10shared_ptrINS_4TEnvEERKNS_8HasFieldEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISJ_EE:
  828|     71|bool DBFieldLookup::satisfied(const TEnvPtr&, const HasField& hf, Definitions*) const {
  829|     71|  auto rty   = hf.recordType;
  830|     71|  auto fname = hf.fieldName;
  831|     71|  auto fty   = hf.fieldType;
  832|       |
  833|     71|  if (hf.recordExpr) {
  ------------------
  |  Branch (833:7): [True: 71, False: 0]
  ------------------
  834|     71|    if (isMonoSingular(rty)) {
  ------------------
  |  Branch (834:9): [True: 0, False: 71]
  ------------------
  835|      0|      FileConfig fcfg;
  836|      0|      if (unpackFileType(rty, &fcfg)) {
  ------------------
  |  Branch (836:11): [True: 0, False: 0]
  ------------------
  837|      0|        if (const TString* lbl = is<TString>(fname)) {
  ------------------
  |  Branch (837:28): [True: 0, False: 0]
  ------------------
  838|      0|          MonoTypePtr frtype = injFileReferences(fcfg.second->member(lbl->value()), hf.recordExpr);
  839|       |
  840|      0|          return *fty == *frtype;
  841|      0|        }
  842|      0|      }
  843|      0|    }
  844|     71|  }
  845|     71|  return false;
  846|     71|}
_ZNK6hobbes13DBFieldLookup11satisfiableERKSt10shared_ptrINS_4TEnvEERKNS_8HasFieldEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISJ_EE:
  848|  5.09k|bool DBFieldLookup::satisfiable(const TEnvPtr& tenv, const HasField& hf, Definitions*) const {
  849|  5.09k|  auto dir   = hf.direction;
  850|  5.09k|  auto rty   = hf.recordType;
  851|  5.09k|  auto fname = hf.fieldName;
  852|  5.09k|  auto fty   = hf.fieldType;
  853|       |
  854|  5.09k|  FileConfig fcfg;
  855|  5.09k|  if (unpackFileType(rty, &fcfg)) {
  ------------------
  |  Branch (855:7): [True: 0, False: 5.09k]
  ------------------
  856|      0|    if (!fcfg.first && dir == HasField::Write) {
  ------------------
  |  Branch (856:9): [True: 0, False: 0]
  |  Branch (856:24): [True: 0, False: 0]
  ------------------
  857|      0|      return false;
  858|      0|    }
  859|       |
  860|      0|    if (!hf.recordExpr) {
  ------------------
  |  Branch (860:9): [True: 0, False: 0]
  ------------------
  861|      0|      return false;
  862|      0|    }
  863|       |
  864|      0|    if (const TString* lbl = is<TString>(fname)) {
  ------------------
  |  Branch (864:24): [True: 0, False: 0]
  ------------------
  865|      0|      MonoTypePtr frtype = injFileReferences(fcfg.second->member(lbl->value()), hf.recordExpr);
  866|       |
  867|      0|      return unifiable(tenv, fty, frtype);
  868|      0|    } else {
  869|      0|      return is<TVar>(fname) != nullptr;
  870|      0|    }
  871|  5.09k|  } else {
  872|  5.09k|    if (const TApp* ap = is<TApp>(rty)) {
  ------------------
  |  Branch (872:21): [True: 0, False: 5.09k]
  ------------------
  873|      0|      if (ap->args().size() == 2) {
  ------------------
  |  Branch (873:11): [True: 0, False: 0]
  ------------------
  874|      0|        if (const Prim* f = is<Prim>(ap->fn())) {
  ------------------
  |  Branch (874:25): [True: 0, False: 0]
  ------------------
  875|      0|          if (f->name() == "file") {
  ------------------
  |  Branch (875:15): [True: 0, False: 0]
  ------------------
  876|      0|            if ((is<TVar>(ap->args()[0]) != nullptr) || isFileMode(ap->args()[0])) {
  ------------------
  |  Branch (876:17): [True: 0, False: 0]
  |  Branch (876:57): [True: 0, False: 0]
  ------------------
  877|      0|              return (is<TVar>(ap->args()[1]) != nullptr) || (is<Record>(ap->args()[1]) != nullptr);
  ------------------
  |  Branch (877:22): [True: 0, False: 0]
  |  Branch (877:62): [True: 0, False: 0]
  ------------------
  878|      0|            }
  879|      0|          }
  880|      0|        }
  881|      0|      }
  882|      0|    }
  883|  5.09k|    return false;
  884|  5.09k|  }
  885|  5.09k|}
_ZN6hobbes19initStorageFileDefsEPNS_13FieldVerifierERNS_2ccE:
 1204|      1|void initStorageFileDefs(FieldVerifier* fv, cc& c) {
 1205|       |  // allow compile-time loading of files (to allow type-inference based on actual file contents)
 1206|      1|  c.typeEnv()->bind("LoadFile", UnqualifierPtr(new LoadFileP()));
 1207|       |
 1208|       |  // resolve references to values stored in files
 1209|      1|  fv->addEliminator(std::make_shared<DBFieldLookup>());
 1210|       |
 1211|       |  // read/write top-level values out-of/into a storage file
 1212|      1|  c.bindLLFunc(".DBVLoad",  new dbloadVF());
 1213|      1|  c.bindLLFunc(".DBVStore", new dbstoreVF());
 1214|       |
 1215|       |  // load a value out of a root file offset (determined at file load-time)
 1216|      1|  c.bind(".dbloado", &dbloado);
 1217|       |
 1218|       |  // load a value out of a file from an internal offset (determined at run-time)
 1219|      1|  c.bind(".dbloadv",    &dbloadv);
 1220|      1|  c.bind(".dbloaddarr", &dbloaddarr);
 1221|      1|  c.bind(".dbloadarr",  &dbloadarr);
 1222|      1|  c.bindLLFunc("load", new dbloadF());
 1223|      1|  c.bindLLFunc("pload", new dbloadPF());
 1224|       |
 1225|       |  // read the file part out of a typed file reference
 1226|      1|  c.bindLLFunc("file", new dbRefFileF());
 1227|       |
 1228|       |  // unload a value that's been loaded from a file
 1229|      1|  c.bind(".dbunloadv", &dbunloadv);
 1230|      1|  c.bind(".dbunloaddarr", &dbunloaddarr);
 1231|      1|  c.bind(".dbunloadarr", &dbunloadarr);
 1232|      1|  c.bindLLFunc("unload", new dbunloadF());
 1233|       |
 1234|       |  // allocate a fixed-size value out of a file
 1235|      1|  c.bind(".dballoc", &dballoc);
 1236|      1|  c.bindLLFunc("store",  new dbstoreF());
 1237|      1|  c.bindLLFunc("pstore", new dbstorePF());
 1238|       |
 1239|       |  // allocate an values/arrays out of a file
 1240|      1|  c.bind(".dballocarr", &dballocarr);
 1241|      1|  c.bindLLFunc("allocate",       new dballocF());
 1242|      1|  c.bindLLFunc("allocateArray",  new dballocArrF());
 1243|      1|  c.bindLLFunc("pallocateArray", new dballocArrPF());
 1244|       |
 1245|       |  // get stored array capacity
 1246|      1|  c.bind(".dbdarrcapacity", &dbdarrcapacity);
 1247|      1|  c.bindLLFunc("capacity",  new dbarrCapacityF());
 1248|      1|  c.bindLLFunc("pcapacity", new dbarrCapacityPF());
 1249|       |
 1250|       |  // open a storage file for writing
 1251|      1|  c.bind(".writeFileRT", &writeFileRT);
 1252|      1|  c.bindLLFunc("writeFile", new openFileF(true, ".writeFileRT"));
 1253|       |
 1254|       |  // signal file update
 1255|      1|  c.bind(".dbsignalupdate", &dbsignalupdate);
 1256|      1|  c.bindLLFunc("signalUpdate", new signalUpdateF());
 1257|       |
 1258|       |  // open a storage file for reading
 1259|      1|  c.bind(".readFileRT", &readFileRT);
 1260|      1|  c.bindLLFunc("readFile", new openFileF(false, ".readFileRT"));
 1261|       |
 1262|       |  // show a summary view of a file
 1263|      1|  c.bind(".printFile", &printFileUF);
 1264|      1|  c.bindLLFunc("printFile", new printFileF(".printFile"));
 1265|       |
 1266|      1|  c.bind(".pageEntries", &pageEntries);
 1267|      1|  c.bindLLFunc("pageEntries", new pageEntriesF(".pageEntries"));
 1268|       |
 1269|       |  // import signalling functions on files as well
 1270|      1|  initSignalsDefs(fv, c);
 1271|       |
 1272|       |  // import compressed storage functions
 1273|      1|  initCStorageFileDefs(fv, c);
 1274|      1|}
_ZNK6hobbes9LoadFileP6lookupERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
 1162|  1.82k|  PolyTypePtr lookup(const std::string& vn) const override {
 1163|  1.82k|    if (vn == READ_FILE_SYM) {
  ------------------
  |  |  996|  1.82k|#define READ_FILE_SYM "inputFile"
  ------------------
  |  Branch (1163:9): [True: 0, False: 1.82k]
  ------------------
 1164|      0|      return polytype(2, qualtype(list(std::make_shared<Constraint>("LoadFile", list(tgen(0), fileType(false, tgen(1))))), fileType(false, tgen(1))));
 1165|  1.82k|    } else if (vn == WRITE_FILE_SYM) {
  ------------------
  |  |  997|  1.82k|#define WRITE_FILE_SYM "outputFile"
  ------------------
  |  Branch (1165:16): [True: 0, False: 1.82k]
  ------------------
 1166|      0|      return polytype(2, qualtype(list(std::make_shared<Constraint>("LoadFile", list(tgen(0), fileType(true, tgen(1))))), fileType(true, tgen(1))));
 1167|  1.82k|    } else {
 1168|  1.82k|      return PolyTypePtr();
 1169|  1.82k|    }
 1170|  1.82k|  }
_ZNK6hobbes9LoadFileP8bindingsB5cxx11Ev:
 1172|      1|  SymSet bindings() const override {
 1173|      1|    SymSet r;
 1174|      1|    r.insert(READ_FILE_SYM);
  ------------------
  |  |  996|      1|#define READ_FILE_SYM "inputFile"
  ------------------
 1175|      1|    r.insert(WRITE_FILE_SYM);
  ------------------
  |  |  997|      1|#define WRITE_FILE_SYM "outputFile"
  ------------------
 1176|      1|    return r;
 1177|      1|  }
_ZNK6hobbes8dbloadVF4typeERNS_6typedbE:
  212|      1|  PolyTypePtr type(typedb&) const override {
  213|      1|    static MonoTypePtr tg0(TGen::make(0));
  214|      1|    static MonoTypePtr tg1(TGen::make(1));
  215|      1|    static MonoTypePtr tg2(TGen::make(2));
  216|      1|    static PolyTypePtr npty(new PolyType(3, qualtype(Func::make(tuplety(list(tapp(primty("file"), list(tg0, tg1)), primty("int"))), tg2))));
  217|      1|    return npty;
  218|      1|  }
_ZNK6hobbes9dbstoreVF4typeERNS_6typedbE:
  254|      1|  PolyTypePtr type(typedb&) const override {
  255|      1|    static MonoTypePtr tg0(TGen::make(0));
  256|      1|    static MonoTypePtr tg1(TGen::make(1));
  257|      1|    static MonoTypePtr tg2(TGen::make(2));
  258|      1|    static PolyTypePtr npty(new PolyType(3, qualtype(Func::make(tuplety(list(tapp(primty("file"), list(tg0, tg1)), primty("int"), tg2)), primty("unit")))));
  259|      1|    return npty;
  260|      1|  }
_ZNK6hobbes7dbloadF4typeERNS_6typedbE:
  310|      1|  PolyTypePtr type(typedb&) const override {
  311|      1|    static MonoTypePtr tg0(TGen::make(0));
  312|      1|    static MonoTypePtr tg1(TGen::make(1));
  313|      1|    static PolyTypePtr npty(new PolyType(2, qualtype(Func::make(tuplety(list(fileRefTy(tg0, tg1))), tg0))));
  314|      1|    return npty;
  315|      1|  }
_ZNK6hobbes8dbloadPF4typeERNS_6typedbE:
  362|      1|  PolyTypePtr type(typedb&) const override {
  363|      1|    static MonoTypePtr tg0(TGen::make(0));
  364|      1|    static MonoTypePtr tg1(TGen::make(1));
  365|      1|    static MonoTypePtr tg2(TGen::make(2));
  366|      1|    static PolyTypePtr npty(new PolyType(3, qualtype(Func::make(tuplety(list(tapp(primty("file"), list(tg0, tg1)), fileRefTy(tg2))), tg2))));
  367|      1|    return npty;
  368|      1|  }
_ZNK6hobbes10dbRefFileF4typeERNS_6typedbE:
  384|      1|  PolyTypePtr type(typedb&) const override {
  385|      1|    MonoTypePtr tg0(TGen::make(0));
  386|      1|    MonoTypePtr tg1(TGen::make(1));
  387|      1|    MonoTypePtr tg2(TGen::make(2));
  388|      1|    MonoTypePtr tg3(TGen::make(3));
  389|      1|    PolyTypePtr npty(new PolyType(4, qualtype(Func::make(tuplety(list(fileRefTy(tg0, tg1))), tapp(primty("file"), list(tg2, tg3))))));
  390|      1|    return npty;
  391|      1|  }
_ZNK6hobbes9dbunloadF4typeERNS_6typedbE:
  440|      1|  PolyTypePtr type(typedb&) const override {
  441|      1|    static MonoTypePtr tg0(TGen::make(0));
  442|      1|    static MonoTypePtr tg1(TGen::make(1));
  443|      1|    static MonoTypePtr tg2(TGen::make(2));
  444|      1|    static PolyTypePtr npty(new PolyType(3, qualtype(Func::make(tuplety(list(tapp(primty("file"), list(tg0, tg1)), tg2)), primty("unit")))));
  445|      1|    return npty;
  446|      1|  }
_ZNK6hobbes8dbstoreF4typeERNS_6typedbE:
  505|      1|  PolyTypePtr type(typedb&) const override {
  506|      1|    static MonoTypePtr tg0(TGen::make(0));
  507|      1|    static MonoTypePtr tg1(TGen::make(1));
  508|      1|    static PolyTypePtr npty(new PolyType(2, qualtype(Func::make(tuplety(list(tg0)), fileRefTy(tg0, tg1)))));
  509|      1|    return npty;
  510|      1|  }
_ZNK6hobbes9dbstorePF4typeERNS_6typedbE:
  541|      1|  PolyTypePtr type(typedb&) const override {
  542|      1|    static MonoTypePtr tg0(TGen::make(0));
  543|      1|    static MonoTypePtr tg1(TGen::make(1));
  544|      1|    static PolyTypePtr npty(new PolyType(2, qualtype(Func::make(tuplety(list(tapp(primty("file"), list(tlong(1), tg0)), tg1)), fileRefTy(tg1)))));
  545|      1|    return npty;
  546|      1|  }
_ZNK6hobbes8dballocF4typeERNS_6typedbE:
  469|      1|  PolyTypePtr type(typedb&) const override {
  470|      1|    return std::make_shared<PolyType>(2, qualtype(Func::make(tuplety(list(primty("unit"))), fileRefTy(tgen(0), tgen(1)))));
  471|      1|  }
_ZNK6hobbes11dballocArrF4typeERNS_6typedbE:
  570|      1|  PolyTypePtr type(typedb&) const override {
  571|      1|    static MonoTypePtr tg0(TGen::make(0));
  572|      1|    static MonoTypePtr tg1(TGen::make(1));
  573|      1|    static PolyTypePtr npty(new PolyType(2, qualtype(Func::make(tuplety(list(primty("long"))), fileRefTy(arrayty(tg0), tg1)))));
  574|      1|    return npty;
  575|      1|  }
_ZNK6hobbes12dballocArrPF4typeERNS_6typedbE:
  592|      1|  PolyTypePtr type(typedb&) const override {
  593|      1|    static MonoTypePtr tg0(TGen::make(0));
  594|      1|    static MonoTypePtr tg1(TGen::make(1));
  595|      1|    static PolyTypePtr npty(new PolyType(2, qualtype(Func::make(tuplety(list(tapp(primty("file"), list(tlong(1), tg0)), primty("long"))), fileRefTy(arrayty(tg1))))));
  596|      1|    return npty;
  597|      1|  }
_ZNK6hobbes14dbarrCapacityF4typeERNS_6typedbE:
  621|      1|  PolyTypePtr type(typedb&) const override {
  622|      1|    static MonoTypePtr tg0(TGen::make(0));
  623|      1|    static MonoTypePtr tg1(TGen::make(1));
  624|      1|    static PolyTypePtr npty(new PolyType(3, qualtype(Func::make(tuplety(list(fileRefTy(darrayty(tg0), tg1))), primty("long")))));
  625|      1|    return npty;
  626|      1|  }
_ZNK6hobbes15dbarrCapacityPF4typeERNS_6typedbE:
  643|      1|  PolyTypePtr type(typedb&) const override {
  644|      1|    static MonoTypePtr tg0(TGen::make(0));
  645|      1|    static MonoTypePtr tg1(TGen::make(1));
  646|      1|    static MonoTypePtr tg2(TGen::make(2));
  647|      1|    static PolyTypePtr npty(new PolyType(3, qualtype(Func::make(tuplety(list(tapp(primty("file"), list(tg0, tg1)), fileRefTy(darrayty(tg2)))), primty("long")))));
  648|      1|    return npty;
  649|      1|  }
_ZN6hobbes9openFileFC2EbRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  735|      2|  openFileF(bool writeable, const std::string& loadf) : writeable(writeable), loadf(loadf) {
  736|      2|  }
_ZNK6hobbes9openFileF4typeERNS_6typedbE:
  766|      2|  PolyTypePtr type(typedb&) const override {
  767|       |    // writeFile :: [char] -> file(1L, a)
  768|      2|    return polytype(1, qualtype(functy(list(arrayty(primty("char"))), fileType(this->writeable, tgen(0)))));
  769|      2|  }
_ZNK6hobbes13signalUpdateF4typeERNS_6typedbE:
  690|      1|  PolyTypePtr type(typedb&) const override {
  691|      1|    return std::make_shared<PolyType>(3, qualtype(Func::make(tuplety(list(tapp(primty("file"), list(tlong(1), tgen(0))))), primty("unit"))));
  692|      1|  }
_ZN6hobbes10printFileFC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  780|      1|  printFileF(const std::string& showf) : showf(showf) {
  781|      1|  }
_ZNK6hobbes10printFileF4typeERNS_6typedbE:
  788|      1|  PolyTypePtr type(typedb&) const override {
  789|       |    // showFile :: file(a, b) -> ()
  790|      1|    return polytype(2, qualtype(functy(list(tapp(primty("file"), list(tgen(0), tgen(1)))), primty("unit"))));
  791|      1|  }
_ZN6hobbes12pageEntriesFC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
 1192|      1|  pageEntriesF(const std::string& f) : f(f) {
 1193|      1|  }
_ZNK6hobbes12pageEntriesF4typeERNS_6typedbE:
 1198|      1|  PolyTypePtr type(typedb&) const override {
 1199|      1|    return polytype(2, qualtype(functy(list(tapp(primty("file"), list(tgen(0), tgen(1)))), lift<reader::PageEntries*>::type(nulltdb))));
 1200|      1|  }

_ZN6hobbes20initCStorageFileDefsEPNS_13FieldVerifierERNS_2ccE:
  372|      1|void initCStorageFileDefs(FieldVerifier*, cc& c) {
  373|      1|  c.bind("ddmMake",    &makeDynDModel0);
  374|      1|  c.bind("ddmInit",    memberfn(&DynDModel0::init));
  ------------------
  |  |  522|      1|#define memberfn(e) &hobbes::mfnThunk<decltype(e), decltype(e), e>::fn
  ------------------
  375|      1|  c.bind("ddmDestroy", &destroyDynDModel0);
  376|       |
  377|      1|  c.bind("ucReaderMake",     &makeUCReader);
  378|      1|  c.bind("ucReaderStep",     memberfn(&UCReader::step));
  ------------------
  |  |  522|      1|#define memberfn(e) &hobbes::mfnThunk<decltype(e), decltype(e), e>::fn
  ------------------
  379|      1|  c.bind("ucReaderSkipPage", memberfn(&UCReader::skipPage));
  ------------------
  |  |  522|      1|#define memberfn(e) &hobbes::mfnThunk<decltype(e), decltype(e), e>::fn
  ------------------
  380|      1|  c.bind("ucReaderEOF",      memberfn(&UCReader::eof));
  ------------------
  |  |  522|      1|#define memberfn(e) &hobbes::mfnThunk<decltype(e), decltype(e), e>::fn
  ------------------
  381|      1|  c.bind("ucReaderFileRef",  memberfn(&UCReader::fileRef));
  ------------------
  |  |  522|      1|#define memberfn(e) &hobbes::mfnThunk<decltype(e), decltype(e), e>::fn
  ------------------
  382|      1|  c.bind("ucReaderModel",    memberfn(&UCReader::currentInitModel));
  ------------------
  |  |  522|      1|#define memberfn(e) &hobbes::mfnThunk<decltype(e), decltype(e), e>::fn
  ------------------
  383|      1|  c.bind("ucReaderRead",     memberfn(&UCReader::read));
  ------------------
  |  |  522|      1|#define memberfn(e) &hobbes::mfnThunk<decltype(e), decltype(e), e>::fn
  ------------------
  384|      1|  c.bind("ucReaderDestroy",  &destroyUCReader);
  385|       |
  386|      1|  c.bind("ucWriterMake",      &makeUCWriter);
  387|      1|  c.bind("ucWriterStep",      memberfn(&UCWriter::step));
  ------------------
  |  |  522|      1|#define memberfn(e) &hobbes::mfnThunk<decltype(e), decltype(e), e>::fn
  ------------------
  388|      1|  c.bind("ucWriterModel",     memberfn(&UCWriter::currentInitModel));
  ------------------
  |  |  522|      1|#define memberfn(e) &hobbes::mfnThunk<decltype(e), decltype(e), e>::fn
  ------------------
  389|      1|  c.bind("ucWriterModelData", memberfn(&UCWriter::currentInitModelData));
  ------------------
  |  |  522|      1|#define memberfn(e) &hobbes::mfnThunk<decltype(e), decltype(e), e>::fn
  ------------------
  390|      1|  c.bind("ucWriterWrite",     memberfn(&UCWriter::write));
  ------------------
  |  |  522|      1|#define memberfn(e) &hobbes::mfnThunk<decltype(e), decltype(e), e>::fn
  ------------------
  391|      1|  c.bind("ucWriterDestroy",   &destroyUCWriter);
  392|      1|}

_ZN6hobbes8darraytyERKSt10shared_ptrINS_8MonoTypeEE:
   40|      2|MonoTypePtr darrayty(const MonoTypePtr& t) {
   41|      2|  return tapp(primty("darray", tabs(str::strings("x"), arrayty(t))), list(t));
   42|      2|}

_ZN6hobbes11sigFileExprERKSt10shared_ptrINS_4ExprEE:
  337|    379|ExprPtr sigFileExpr(const ExprPtr& e) {
  338|    379|  if (const App* a = is<App>(e)) {
  ------------------
  |  Branch (338:18): [True: 0, False: 379]
  ------------------
  339|      0|    if (const Var* f = is<Var>(a->fn())) {
  ------------------
  |  Branch (339:20): [True: 0, False: 0]
  ------------------
  340|      0|      if (f->value() == "signals" && a->args().size() == 1) {
  ------------------
  |  Branch (340:11): [True: 0, False: 0]
  |  Branch (340:38): [True: 0, False: 0]
  ------------------
  341|      0|        return a->args()[0];
  342|      0|      }
  343|      0|    }
  344|      0|  }
  345|    379|  throw annotated_error(*e, "Not a file signal expression: " + show(e));
  346|    379|}
_ZN6hobbes16AddDBFieldSignal6refineERKSt10shared_ptrINS_4TEnvEERKNS_8HasFieldEPNS_15MonoTypeUnifierEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISL_EE:
  357|    315|bool AddDBFieldSignal::refine(const TEnvPtr&, const HasField& hf, MonoTypeUnifier* u, Definitions*) {
  358|    315|  auto dir   = hf.direction;
  359|    315|  auto rty   = hf.recordType;
  360|    315|  auto fname = hf.fieldName;
  361|    315|  auto fty   = hf.fieldType;
  362|       |
  363|    315|  if (dir == HasField::Write) {
  ------------------
  |  Branch (363:7): [True: 315, False: 0]
  ------------------
  364|    315|    if (const TString* fn = is<TString>(fname)) {
  ------------------
  |  Branch (364:24): [True: 315, False: 0]
  ------------------
  365|    315|      if (hf.recordExpr) {
  ------------------
  |  Branch (365:11): [True: 315, False: 0]
  ------------------
  366|    315|        try {
  367|    315|          size_t uc = u->size();
  368|    315|          mgu(fty, sigFnType(fn->value(), sigFileExpr(hf.recordExpr)), u);
  369|    315|          return uc != u->size();
  370|    315|        } catch (...) {
  371|    315|          return false;
  372|    315|        }
  373|    315|      }
  374|    315|    }
  375|    315|  }
  376|      0|  return false;
  377|    315|}
_ZNK6hobbes16AddDBFieldSignal9satisfiedERKSt10shared_ptrINS_4TEnvEERKNS_8HasFieldEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISJ_EE:
  379|    135|bool AddDBFieldSignal::satisfied(const TEnvPtr&, const HasField& hf, Definitions*) const {
  380|    135|  auto dir   = hf.direction;
  381|    135|  auto rty   = hf.recordType;
  382|    135|  auto fname = hf.fieldName;
  383|    135|  auto fty   = hf.fieldType;
  384|       |
  385|    135|  if (dir == HasField::Write) {
  ------------------
  |  Branch (385:7): [True: 64, False: 71]
  ------------------
  386|     64|    if (const TString* fn = is<TString>(fname)) {
  ------------------
  |  Branch (386:24): [True: 64, False: 0]
  ------------------
  387|     64|      if (hf.recordExpr) {
  ------------------
  |  Branch (387:11): [True: 64, False: 0]
  ------------------
  388|     64|        try {
  389|     64|          return *fty == *sigFnType(fn->value(), sigFileExpr(hf.recordExpr));
  390|     64|        } catch (...) {
  391|     64|          return false;
  392|     64|        }
  393|     64|      }
  394|     64|    }
  395|     64|  }
  396|     71|  return false;
  397|    135|}
_ZNK6hobbes16AddDBFieldSignal11satisfiableERKSt10shared_ptrINS_4TEnvEERKNS_8HasFieldEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISJ_EE:
  399|  5.09k|bool AddDBFieldSignal::satisfiable(const TEnvPtr& tenv, const HasField& hf, Definitions* ds) const {
  400|  5.09k|  auto dir   = hf.direction;
  401|  5.09k|  auto rty   = hf.recordType;
  402|  5.09k|  auto fname = hf.fieldName;
  403|  5.09k|  auto fty   = hf.fieldType;
  404|       |
  405|  5.09k|  if (dir != HasField::Write) return false;
  ------------------
  |  Branch (405:7): [True: 4.71k, False: 379]
  ------------------
  406|       |
  407|    379|  if (is<TString>(fname) != nullptr) {
  ------------------
  |  Branch (407:7): [True: 379, False: 0]
  ------------------
  408|    379|    if (hf.recordExpr) {
  ------------------
  |  Branch (408:9): [True: 379, False: 0]
  ------------------
  409|    379|      return !isMonoSingular(fty) || satisfied(tenv, hf, ds);
  ------------------
  |  Branch (409:14): [True: 315, False: 64]
  |  Branch (409:38): [True: 0, False: 64]
  ------------------
  410|    379|    } else {
  411|      0|      return is<TVar>(rty) != nullptr;
  412|      0|    }
  413|    379|  } else {
  414|      0|    return is<TVar>(fname) != nullptr;
  415|      0|  }
  416|    379|}
_ZN6hobbes15initSignalsDefsEPNS_13FieldVerifierERNS_2ccE:
  526|      1|void initSignalsDefs(FieldVerifier* fv, cc& c) {
  527|       |  // add signals for top-level file variables
  528|      1|  c.bind(".addFileSOSignal", &addFileSOSignal);
  529|      1|  c.bindLLFunc("signals", new signalsF());
  530|      1|  fv->addEliminator(std::make_shared<AddDBFieldSignal>());
  531|       |
  532|      1|  c.bind(".addFileSignal", &addFileSignal);
  533|      1|  c.bindLLFunc("addFileSignal", new addFileSignalF());
  534|       |
  535|       |  // allow inspection of the file watch data here
  536|      1|  c.bind("fileWatchData", &fileWatchData);
  537|      1|}
_ZNK6hobbes8signalsF4typeERNS_6typedbE:
  309|      1|  PolyTypePtr type(typedb&) const override {
  310|      1|    MonoTypePtr fty = tapp(primty("file"), list(tgen(0), tgen(1)));
  311|      1|    MonoTypePtr sty = tapp(primty("signals", primty("unit")), list(tgen(1)));
  312|      1|    return polytype(2, qualtype(functy(list(fty), sty)));
  313|      1|  }
_ZNK6hobbes14addFileSignalF4typeERNS_6typedbE:
  279|      1|  PolyTypePtr type(typedb&) const override {
  280|      1|    MonoTypePtr tg0(TGen::make(0));
  281|      1|    MonoTypePtr tg1(TGen::make(1));
  282|      1|    MonoTypePtr fr = fileRefTy(tg0, tg1);
  283|      1|    PolyTypePtr npty(new PolyType(3, qualtype(functy(list(fr, functy(list(fr), primty("bool"))), primty("unit")))));
  284|      1|    return npty;
  285|      1|  }

_ZN6hobbes5hlockC2Ev:
   38|  12.5k|hlock:: hlock() { hccmtx.lock();   }
_ZN6hobbes5hlockD2Ev:
   39|  12.5k|hlock::~hlock() { hccmtx.unlock(); }
_ZN6hobbes2ccC2Ev:
   44|      1|  readModuleFileF(&defReadModuleFile),
   45|      1|  readModuleF(&defReadModule),
   46|      1|  readExprDefnF(&defReadExprDefn),
   47|      1|  readExprF(&defReadExpr),
   48|      1|  drainingDefs(false),
   49|      1|  unreachableMatchRowsPtr(nullptr),
   50|      1|  genInterpretedMatch(false),
   51|      1|  checkMatchReachability(true),
   52|      1|  lowerPrimMatchTables(false),
   53|      1|  columnwiseMatches(false),
   54|      1|  tenv(new TEnv()),
   55|      1|  objs(new Objs())
   56|      1|{
   57|       |  // protect access to LLVM
   58|      1|  hlock _;
   59|      1|  this->jit = new jitcc(this->tenv);
   60|       |
   61|       |  // initialize the environment of primitive instructions
   62|      1|  initDefOperators(this);
   63|       |
   64|       |  // this seems to want to be a very primitive type class ...
   65|      1|  TClass::Members cvtcms;
   66|      1|  cvtcms["convert"] = functy(list(tgen(0)), tgen(1));
   67|      1|  auto* cvtc = new TClass("Convert", 2, cvtcms, FunDeps(), LexicalAnnotation::null());
   68|      1|  this->tenv->bind("Convert", UnqualifierPtr(cvtc));
   69|       |
   70|       |  // support equality constraints
   71|      1|  this->tenv->bind(EqualTypes::constraintName(),    UnqualifierPtr(new EqualTypes()));
   72|      1|  this->tenv->bind(NotEqualTypes::constraintName(), UnqualifierPtr(new NotEqualTypes()));
   73|       |
   74|       |  // support destructuring types
   75|      1|  this->tenv->bind(DeconstructP::constraintName(), UnqualifierPtr(new DeconstructP()));
   76|       |
   77|       |  // support reversing opaque type aliases
   78|      1|  this->tenv->bind(DataP::constraintName(), UnqualifierPtr(new DataP()));
   79|       |
   80|       |  // support type-level string functions (a hack until type and value levels can be merged)
   81|      1|  initStrPredicates(this->tenv);
   82|       |
   83|       |  // support association by expression type
   84|      1|  this->tenv->bind(TypeofP::constraintName(), UnqualifierPtr(new TypeofP()));
   85|       |
   86|       |  // determine type storage sizes
   87|      1|  this->tenv->bind(SizeOfP::constraintName(), UnqualifierPtr(new SizeOfP()));
   88|       |
   89|       |  // support intro/elim of existential types (necessary for closures)
   90|      1|  this->tenv->bind(Existentials::constraintName(), UnqualifierPtr(new Existentials()));
   91|       |
   92|       |  // support intro/elim of recursive types
   93|      1|  this->tenv->bind(FixIsoRecur::constraintName(), UnqualifierPtr(new FixIsoRecur()));
   94|       |
   95|       |  // support subtype constraints (including safe upcasting between C++ objects)
   96|      1|  auto* subuq = new SubtypeUnqualifier();
   97|      1|  subuq->addEliminator(this->objs);
   98|      1|  this->tenv->bind(SubtypeUnqualifier::constraintName(), UnqualifierPtr(subuq));
   99|       |
  100|       |  // support constraints on "field projection" (for records, "objects", ...)
  101|      1|  auto* fv = new FieldVerifier();
  102|      1|  this->tenv->bind(FieldVerifier::constraintName(), UnqualifierPtr(fv));
  103|       |
  104|       |  // support constraints on "selective construction" (for variants, ...)
  105|      1|  this->tenv->bind(CtorVerifier::constraintName(), UnqualifierPtr(new CtorVerifier()));
  106|       |
  107|       |  // support deconstructing records (compile-time reflection on records)
  108|      1|  this->tenv->bind(RecordDeconstructor::constraintName(), UnqualifierPtr(new RecordDeconstructor()));
  109|       |
  110|       |  // support deconstructing variants (compile-time reflection on variants)
  111|      1|  this->tenv->bind(VariantDeconstructor::constraintName(), UnqualifierPtr(new VariantDeconstructor()));
  112|      1|  this->tenv->bind(VariantAppP::constraintName(), UnqualifierPtr(new VariantAppP()));
  113|      1|  this->tenv->bind(VariantTruncP::constraintName(), UnqualifierPtr(new VariantTruncP()));
  114|       |
  115|       |  // support appending (appendable) types
  116|      1|  this->tenv->bind(AppendsToUnqualifier::constraintName(), UnqualifierPtr(new AppendsToUnqualifier()));
  117|       |
  118|       |  // support translation of hobbes type descs to C++ type descs
  119|      1|  this->tenv->bind(CPPTypeDescP::constraintName(), UnqualifierPtr(new CPPTypeDescP()));
  120|       |
  121|       |  // support connecting to remote processes
  122|      1|  initNetworkDefs(*this);
  123|       |
  124|       |  // support sub-process I/O -- ProcessP is registered with spawning
  125|       |  // disabled by default (STRFR-433927): resolving a (Process "cmd" p)
  126|       |  // constraint must not execute untrusted programs as a side effect
  127|       |  // of type-checking. Embedding applications that need this must opt in
  128|       |  // explicitly via cc::enableProcessSpawning with a command allowlist.
  129|      1|  this->tenv->bind(ProcessP::constraintName(), UnqualifierPtr(new ProcessP(fv)));
  130|       |
  131|       |  // initialize the macro environment (maybe this should be user-controlled, the set of macros is hard-coded for now)
  132|      1|  initMacroEnvironment(this->tenv);
  133|       |
  134|       |  // initialize default built-in functions
  135|      1|  initStdFuncDefs(*this);
  136|       |
  137|       |  // initialize structured storage support
  138|      1|  initStorageFileDefs(fv, *this);
  139|       |
  140|       |  // boot
  141|      1|  compileBootCode(*this);
  142|      1|}
_ZN6hobbes2ccD2Ev:
  143|      1|cc::~cc() {
  144|      1|  hlock _;
  145|      1|  delete this->jit;
  146|      1|}
_ZN6hobbes2cc10readModuleERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  156|     27|ModulePtr cc::readModule(const std::string& x) { hlock _; return this->readModuleF(this, x); }
_ZN6hobbes2cc8readExprERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  162|      3|ExprPtr cc::readExpr(const std::string& x) { hlock _; return this->readExprF(this, x); }
_ZN6hobbes2cc19unsweetenExpressionERKSt10shared_ptrINS_4TEnvEERKS1_INS_4ExprEE:
  176|    278|ExprPtr cc::unsweetenExpression(const TEnvPtr& te, const ExprPtr& e) {
  177|    278|  return unsweetenExpression(te, "", e);
  178|    278|}
_ZN6hobbes2cc9normalizeERKSt10shared_ptrINS_4ExprEE:
  188|    275|ExprPtr cc::normalize(const ExprPtr& e) {
  189|    275|  return unsweetenExpression(this->tenv, e);
  190|    275|}
_ZN6hobbes2cc14forwardDeclareERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_8QualTypeEE:
  206|    260|void cc::forwardDeclare(const std::string& vname, const QualTypePtr& qt) {
  207|    260|  hlock _;
  208|    260|  this->tenv->bind(vname, hobbes::generalize(qt));
  209|    260|}
_ZN6hobbes2cc15hasValueBindingERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  211|    532|bool cc::hasValueBinding(const std::string& vname) {
  212|    532|  hlock _;
  213|       |  // either we have a bound/compiled mono-typed value, or we have a polytype value (through a generated or user-defined type class)
  214|    532|  return this->jit->isDefined(vname) || isClassMember(this->tenv, vname);
  ------------------
  |  Branch (214:10): [True: 0, False: 532]
  |  Branch (214:41): [True: 0, False: 532]
  ------------------
  215|    532|}
_ZN6hobbes2cc19unsweetenExpressionERKSt10shared_ptrINS_4TEnvEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS1_INS_4ExprEE:
  233|    810|ExprPtr cc::unsweetenExpression(const TEnvPtr& te, const std::string& vname, const ExprPtr& e) {
  234|    810|  hlock _;
  235|    810|  Definitions ds;
  236|       |
  237|    810|  ExprPtr result;
  238|    810|  try {
  239|    810|    result = macroExpand(unqualifyTypes(te, validateType(te, vname, closureConvert(this->tenv, vname, e), &ds), &ds));
  240|    810|  } catch (std::exception& ex) {
  241|       |    // the residual definitions are half-resolved and the drain will usually
  242|       |    // fail on them too; that failure must not replace the one being reported
  243|      0|    try {
  244|      0|      drainUnqualifyDefs(ds);
  245|      0|    } catch (...) {
  246|      0|    }
  247|      0|    throw;
  248|      0|  }
  249|       |
  250|    810|  drainUnqualifyDefs(ds);
  251|    810|  return result;
  252|    810|}
_ZN6hobbes2cc18drainUnqualifyDefsERKSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_4ExprEEESaISC_EE:
  258|  1.12k|void cc::drainUnqualifyDefs(const Definitions& ds) {
  259|  1.12k|  hlock _;
  260|       |
  261|       |  // a nested drain just adds to the batch being accumulated
  262|  1.12k|  if (this->drainingDefs) {
  ------------------
  |  Branch (262:7): [True: 141, False: 982]
  ------------------
  263|    141|    unsweetenDefs(ds);
  264|    141|    return;
  265|    141|  }
  266|       |
  267|       |  // the outermost drain owns the batch, however it ends: left behind after a
  268|       |  // failure, it would silently poison every later compile ('drainingDefs' stuck
  269|       |  // on means nothing is ever handed to the JIT again)
  270|    982|  this->drainingDefs = true;
  271|    982|  str::seq typed;
  272|    982|  try {
  273|    982|    unsweetenDefs(ds);
  274|    982|    this->drainingDefs = false; // compiling may drain batches of its own
  275|       |
  276|    982|    LetRec::Bindings bs;
  277|    982|    bs.swap(this->drainDefs);
  278|    982|    typed.swap(this->drainTypeBindings);
  279|    982|    if (!bs.empty()) {
  ------------------
  |  Branch (279:9): [True: 38, False: 944]
  ------------------
  280|     38|      this->jit->compileFunctions(bs);
  281|     38|    }
  282|    982|  } catch (...) {
  283|      0|    this->drainingDefs = false;
  284|      0|    this->drainDefs.clear();
  285|      0|    typed.insert(typed.end(), this->drainTypeBindings.begin(), this->drainTypeBindings.end());
  286|      0|    this->drainTypeBindings.clear();
  287|       |
  288|       |    // whatever the batch typed but never compiled must not stay visible
  289|      0|    for (const auto& vname : typed) {
  ------------------
  |  Branch (289:28): [True: 0, False: 0]
  ------------------
  290|      0|      if (this->tenv->hasBinding(vname) && !hasValueBinding(vname)) {
  ------------------
  |  Branch (290:11): [True: 0, False: 0]
  |  Branch (290:44): [True: 0, False: 0]
  ------------------
  291|      0|        this->tenv->unbind(vname);
  292|      0|      }
  293|      0|    }
  294|      0|    throw;
  295|      0|  }
  296|    982|}
_ZN6hobbes2cc13unsweetenDefsERKSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_4ExprEEESaISC_EE:
  299|  1.12k|void cc::unsweetenDefs(const Definitions& ds) {
  300|  1.12k|  for (const auto &d : ds) {
  ------------------
  |  Branch (300:22): [True: 141, False: 1.12k]
  ------------------
  301|    141|    const std::string& vname = d.first;
  302|    141|    const ExprPtr&     e     = d.second;
  303|       |
  304|    141|    bool forwardDeclared = this->tenv->hasBinding(vname) && !hasValueBinding(vname);
  ------------------
  |  Branch (304:28): [True: 141, False: 0]
  |  Branch (304:61): [True: 141, False: 0]
  ------------------
  305|       |
  306|    141|    ExprPtr     ne   = forwardDeclared ? ExprPtr(new Assump(e, this->tenv->lookup(vname)->instantiate(), e->la())) : e;
  ------------------
  |  Branch (306:24): [True: 141, False: 0]
  ------------------
  307|    141|    ExprPtr     xe   = unsweetenExpression(this->tenv, vname, ne);
  308|    141|    PolyTypePtr xety = hobbes::generalize(xe->type());
  309|       |
  310|    141|    if (isMonotype(xety)) {
  ------------------
  |  Branch (310:9): [True: 141, False: 0]
  ------------------
  311|    141|      this->drainDefs.push_back(LetRec::Binding(vname, xe));
  312|    141|      if (!forwardDeclared) {
  ------------------
  |  Branch (312:11): [True: 0, False: 141]
  ------------------
  313|      0|        this->tenv->bind(vname, xety);
  314|      0|        this->drainTypeBindings.push_back(vname);
  315|      0|      }
  316|    141|    } else {
  317|      0|      if (forwardDeclared) {
  ------------------
  |  Branch (317:11): [True: 0, False: 0]
  ------------------
  318|      0|        if (vname.substr(0, 4) == ".rfn" || isMonotype(this->tenv->lookup(vname))) {
  ------------------
  |  Branch (318:13): [True: 0, False: 0]
  |  Branch (318:13): [True: 0, False: 0]
  |  Branch (318:45): [True: 0, False: 0]
  ------------------
  319|      0|          raiseUnsolvedCsts(*this, vname, xe, this->tenv->lookup(vname));
  320|      0|        }
  321|      0|        this->tenv->unbind(vname);
  322|      0|      }
  323|      0|      definePolyValue(vname, xe);
  324|      0|    }
  325|    141|  }
  326|  1.12k|}
_ZN6hobbes2cc6defineERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_4ExprEE:
  328|    391|void cc::define(const std::string& vname, const ExprPtr& e) {
  329|    391|  hlock _;
  330|       |
  331|       |  // don't allow redefinitions of existing bindings
  332|    391|  if (hasValueBinding(vname)) {
  ------------------
  |  Branch (332:7): [True: 0, False: 391]
  ------------------
  333|      0|    throw annotated_error(*e, "Variable already defined: " + vname);
  334|      0|  }
  335|       |
  336|       |  // define this either as a monotyped value (in which case it can be machine-represented)
  337|       |  //                 or as a polytyped value (in which case we need to internalize the definition in a hidden type class)
  338|    391|  bool forwardDeclared = this->tenv->hasBinding(vname);
  339|       |
  340|    391|  ExprPtr     ne   = forwardDeclared ? ExprPtr(new Assump(e, this->tenv->lookup(vname)->instantiate(), e->la())) : e;
  ------------------
  |  Branch (340:22): [True: 260, False: 131]
  ------------------
  341|    391|  ExprPtr     xe   = unsweetenExpression(this->tenv, vname, ne);
  342|    391|  PolyTypePtr xety = hobbes::generalize(xe->type());
  343|       |
  344|    391|  if (isMonotype(xety)) {
  ------------------
  |  Branch (344:7): [True: 140, False: 251]
  ------------------
  345|    140|    this->jit->defineGlobal(vname, xe);
  346|       |
  347|    140|    if (!forwardDeclared) {
  ------------------
  |  Branch (347:9): [True: 116, False: 24]
  ------------------
  348|    116|      this->tenv->bind(vname, xety);
  349|    116|    }
  350|    251|  } else {
  351|    251|    if (forwardDeclared) {
  ------------------
  |  Branch (351:9): [True: 236, False: 15]
  ------------------
  352|    236|      if (isMonotype(this->tenv->lookup(vname))) {
  ------------------
  |  Branch (352:11): [True: 0, False: 236]
  ------------------
  353|      0|        raiseUnsolvedCsts(*this, vname, xe, this->tenv->lookup(vname));
  354|      0|      }
  355|    236|      this->tenv->unbind(vname);
  356|    236|    }
  357|       |
  358|    251|    definePolyValue(vname, xe);
  359|    251|  }
  360|    391|}
_ZN6hobbes2cc15definePolyValueERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_4ExprEE:
  365|    251|void cc::definePolyValue(const std::string& vname, const ExprPtr& unsweetExpr) {
  366|    251|  hlock _;
  367|    251|  definePrivateClass(this->tenv, vname, unsweetExpr);
  368|    251|}
_ZN6hobbes2cc15defineTypeAliasERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt6vectorIS6_SaIS6_EERKSt10shared_ptrINS_8MonoTypeEE:
  382|      4|void cc::defineTypeAlias(const std::string& name, const str::seq& argNames, const MonoTypePtr& ty) {
  383|      4|  this->ttyDefs[name] = TTyDef(argNames, ty);
  384|      4|}
_ZNK6hobbes2cc15isTypeAliasNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  386|  6.18k|bool cc::isTypeAliasName(const std::string& name) const {
  387|  6.18k|  return this->ttyDefs.find(name) != this->ttyDefs.end();
  388|  6.18k|}
_ZNK6hobbes2cc18replaceTypeAliasesERKSt10shared_ptrINS_8MonoTypeEE:
  435|  2.16k|MonoTypePtr cc::replaceTypeAliases(const MonoTypePtr& ty) const {
  436|  2.16k|  hlock _;
  437|  2.16k|  return switchOf(ty, repTypeAliasesF(this->ttyDefs));
  438|  2.16k|}
_ZN6hobbes2cc17opaquePtrMonoTypeERKSt9type_infojb:
  451|     43|MonoTypePtr cc::opaquePtrMonoType(const std::type_info& ti, unsigned int sz, bool inStruct) {
  452|     43|  hlock _;
  453|       |
  454|       |  // we don't necesarily *HAVE* to make this type opaque, if we've previously been given a type mapping AND the type has a pointer representation
  455|     43|  auto t = this->typeAliases.find(ti.name());
  456|       |
  457|     43|  if (t != this->typeAliases.end() && hasPointerRep(t->second)) {
  ------------------
  |  Branch (457:7): [True: 0, False: 43]
  |  Branch (457:7): [True: 0, False: 43]
  |  Branch (457:39): [True: 0, False: 0]
  ------------------
  458|      0|    return requireMonotype(t->second);
  459|     43|  } else {
  460|     43|    this->objs->add(ti);
  461|       |
  462|       |    // OK, we don't know what this type looks like so we'll give it an opaque pointer type
  463|       |    // but strip the pointer char from the name, we assume opaqueptr types are always pointers
  464|     43|    std::string tn = str::demangle(ti.name());
  465|     86|    while (!tn.empty() && tn.back()=='*') {
  ------------------
  |  Branch (465:12): [True: 86, False: 0]
  |  Branch (465:27): [True: 43, False: 43]
  ------------------
  466|     43|      tn=tn.substr(0,tn.size()-1);
  467|     43|    }
  468|     43|    return MonoTypePtr(OpaquePtr::make(tn, sz, inStruct));
  469|     43|  }
  470|     43|}
_ZNK6hobbes2cc10generalizeERKSt10shared_ptrINS_8MonoTypeEE:
  472|    124|PolyTypePtr cc::generalize(const MonoTypePtr& mt) const {
  473|    124|  hlock _;
  474|    124|  return this->objs->generalize(mt);
  475|    124|}
_ZN6hobbes2cc8overloadERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaISC_EERKSA_INS_4ExprEE:
  499|     52|void cc::overload(const std::string& tyclass, const MonoTypes& tys, const ExprPtr& e) {
  500|     52|  hlock _;
  501|     52|  UnqualifierPtr tyc = this->tenv->lookupUnqualifier(tyclass);
  502|     52|  TClassPtr      c   = std::dynamic_pointer_cast<TClass>(tyc);
  503|       |  
  504|     52|  if (c.get() == nullptr) {
  ------------------
  |  Branch (504:7): [True: 0, False: 52]
  ------------------
  505|      0|    throw std::runtime_error("Cannot define overload in '" + tyclass + "', class does not exist.");
  506|     52|  } else if (c->members().size() != 1) {
  ------------------
  |  Branch (506:14): [True: 0, False: 52]
  ------------------
  507|      0|    throw std::runtime_error("Cannot define partial overload for type class '" + tyclass + "', which has " + str::from(c->members().size()) + " members.");
  508|      0|  }
  509|       |
  510|     52|  MemberMapping insts;
  511|     52|  insts[c->members().begin()->first] = e;
  512|       |
  513|     52|  if (tgenSize(tys) == 0) {
  ------------------
  |  Branch (513:7): [True: 52, False: 0]
  ------------------
  514|     52|    Definitions ds;
  515|     52|    c->insert(typeEnv(), std::make_shared<TCInstance>(tyclass, tys, insts, e->la()), &ds);
  516|     52|    drainUnqualifyDefs(ds);
  517|     52|  } else {
  518|      0|    throw std::runtime_error("cc::overload forgot how to produce instance functions");
  519|      0|  }
  520|     52|}
_ZN6hobbes2cc8overloadERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaISC_EES8_:
  522|     52|void cc::overload(const std::string& tyclass, const MonoTypes& tys, const std::string& v) {
  523|     52|  overload(tyclass, tys, var(v, LexicalAnnotation::null()));
  524|     52|}
_ZN6hobbes2cc15defineNamedTypeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt6vectorIS6_SaIS6_EERKSt10shared_ptrINS_8MonoTypeEE:
  533|     26|MonoTypePtr cc::defineNamedType(const std::string& name, const str::seq& argNames, const MonoTypePtr& ty) {
  534|     26|  hlock _;
  535|     26|  if (!argNames.empty()) {
  ------------------
  |  Branch (535:7): [True: 8, False: 18]
  ------------------
  536|      8|    MonoTypePtr tfn    = tabs(argNames, ty);
  537|      8|    MonoTypePtr talias = MonoTypePtr(Prim::make(name, tfn));
  538|      8|    MonoTypePtr tappd  = tapp(talias, typeVars(argNames));
  539|      8|    this->tenv->alias(name, tfn);
  540|      8|    this->overload("Convert", list(tappd, ty), ".cast");
  541|      8|    this->overload("Convert", list(ty, tappd), ".cast");
  542|      8|    return talias;
  543|     18|  } else {
  544|     18|    MonoTypePtr talias(Prim::make(name, ty));
  545|     18|    this->tenv->alias(name, ty);
  546|     18|    this->overload("Convert", list(talias, ty), ".cast");
  547|     18|    this->overload("Convert", list(ty, talias), ".cast");
  548|     18|    return talias;
  549|     18|  }
  550|     26|}
_ZNK6hobbes2cc23namedTypeRepresentationERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  552|    122|MonoTypePtr cc::namedTypeRepresentation(const std::string& tn) const {
  553|    122|  hlock _;
  554|    122|  return this->tenv->unalias(tn);
  555|    122|}
_ZNK6hobbes2cc10isTypeNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  557|  6.14k|bool cc::isTypeName(const std::string& tn) const {
  558|  6.14k|  hlock _;
  559|  6.14k|  return this->tenv->isOpaqueTypeAlias(tn);
  560|  6.14k|}
_ZNK6hobbes2cc7typeEnvEv:
  601|  2.43k|const TEnvPtr& cc::typeEnv() const {
  602|  2.43k|  return this->tenv;
  603|  2.43k|}
_ZN6hobbes2cc10bindLLFuncERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPNS_2opE:
  637|    181|void cc::bindLLFunc(const std::string& fname, op* f) {
  638|    181|  hlock _;
  639|    181|  this->tenv->bind(fname, f->type(*this));
  640|    181|  this->jit->bindInstruction(fname, f);
  641|    181|}
_ZN6hobbes2cc18bindExternFunctionERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_8MonoTypeEEPv:
  643|    124|void cc::bindExternFunction(const std::string& fname, const MonoTypePtr& fty, void* fn) {
  644|    124|  hlock _;
  645|    124|  this->tenv->bind(fname, generalize(fty));
  646|    124|  this->jit->bindGlobal(fname, fty, fn);
  647|    124|}
_ZN6hobbes2cc15unsafeCompileFnERKSt10shared_ptrINS_8MonoTypeEERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISC_EERKS6_IS3_SaIS3_EERKS1_INS_4ExprEE:
  666|      3|void* cc::unsafeCompileFn(const MonoTypePtr& retTy, const str::seq& tnames, const MonoTypes& argTys, const ExprPtr& exp) {
  667|      3|  hlock _;
  668|      3|  str::seq names = tnames;
  669|       |
  670|      3|  if (names.empty() && argTys.size() == 1 && isUnit(argTys[0])) {
  ------------------
  |  Branch (670:7): [True: 0, False: 3]
  |  Branch (670:24): [True: 0, False: 0]
  |  Branch (670:46): [True: 0, False: 0]
  ------------------
  671|      0|    names.push_back("_");
  672|      3|  } else if (names.size() != argTys.size()) {
  ------------------
  |  Branch (672:14): [True: 0, False: 3]
  ------------------
  673|      0|    std::ostringstream ss;
  674|      0|    ss << "Function parameter name list [" << str::cdelim(names, ", ") << "] and parameter type list [" << str::cdelim(show(argTys), ", ") << "] have inconsistent lengths.";
  675|      0|    throw annotated_error(*exp, ss.str());
  676|      0|  }
  677|       |
  678|      3|  return
  679|      3|    this->jit->reifyMachineCodeForFn(
  680|      3|      retTy,
  681|      3|      names,
  682|      3|      argTys,
  683|      3|      unsweetenExpression(allocTEnvFrame(names, argTys, this->tenv), assume(exp, retTy, exp->la()))
  684|      3|    );
  685|      3|}
_ZN6hobbes2cc15unsafeCompileFnERKSt10shared_ptrINS_8MonoTypeEERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISC_EERKS1_INS_4ExprEE:
  687|      3|void* cc::unsafeCompileFn(const MonoTypePtr& fnTy, const str::seq& names, const ExprPtr& exp) {
  688|      3|  if (const Func* fty = is<Func>(fnTy)) {
  ------------------
  |  Branch (688:19): [True: 3, False: 0]
  ------------------
  689|      3|    return unsafeCompileFn(fty->result(), names, fty->parameters(), exp);
  690|      3|  } else {
  691|      0|    throw annotated_error(*exp, "Expected function type: " + show(fnTy));
  692|      0|  }
  693|      3|}
_ZNK6hobbes2cc13moduleOptionsB5cxx11Ev:
  759|     27|std::vector<std::string> cc::moduleOptions() const {
  760|     27|  hlock _;
  761|     27|  return this->modOpts;
  762|     27|}
_ZNK6hobbes2cc24requireMatchReachabilityEv:
  768|    669|bool cc::requireMatchReachability() const { return this->checkMatchReachability; }
_ZNK6hobbes2cc26alwaysLowerPrimMatchTablesEv:
  774|    131|bool cc::alwaysLowerPrimMatchTables() const { return this->lowerPrimMatchTables; }
_ZNK6hobbes2cc22buildColumnwiseMatchesEv:
  777|    929|bool cc::buildColumnwiseMatches() const { return this->columnwiseMatches; }
_ZNK6hobbes2cc19regexMaxExprDFASizeEv:
  780|      1|size_t cc::regexMaxExprDFASize() const { return this->maxExprDFASize; }
_ZNK6hobbes2cc26regexMaxExprDFATransitionsEv:
  783|      1|size_t cc::regexMaxExprDFATransitions() const { return this->maxExprDFATransitions; }
_ZNK6hobbes2cc17regexMaxDFAStatesEv:
  786|      8|size_t cc::regexMaxDFAStates() const { return this->maxDFAStates; }
_ZNK6hobbes2cc19throwOnHugeRegexDFAEv:
  792|      8|bool cc::throwOnHugeRegexDFA() const { return this-> shouldThrowOnHugeRegexDFA; }
_ZN6hobbes15repTypeAliasesFC2ERKSt13unordered_mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairISt6vectorIS7_SaIS7_EESt10shared_ptrINS_8MonoTypeEEESt4hashIS7_ESt8equal_toIS7_ESaIS8_IKS7_SF_EEE:
  400|  2.16k|  repTypeAliasesF(const TTyDefs& ttyDefs) : ttyDefs(ttyDefs) {
  401|  2.16k|  }
_ZNK6hobbes15repTypeAliasesF4withEPKNS_4PrimE:
  403|  1.74k|  MonoTypePtr with(const Prim* v) const override {
  404|  1.74k|    if (!v->representation()) {
  ------------------
  |  Branch (404:9): [True: 1.50k, False: 249]
  ------------------
  405|  1.50k|      auto td = this->ttyDefs.find(v->name());
  406|  1.50k|      if (td != this->ttyDefs.end()) {
  ------------------
  |  Branch (406:11): [True: 0, False: 1.50k]
  ------------------
  407|      0|        if (td->second.first.empty()) {
  ------------------
  |  Branch (407:13): [True: 0, False: 0]
  ------------------
  408|      0|          return td->second.second;
  409|      0|        }
  410|      0|      }
  411|  1.50k|    }
  412|  1.74k|    return Prim::make(v->name(), v->representation());
  413|  1.74k|  }
_ZNK6hobbes15repTypeAliasesF4withEPKNS_4TAppE:
  415|    443|  MonoTypePtr with(const TApp* v) const override {
  416|    443|    if (const Prim* f = is<Prim>(v->fn())) {
  ------------------
  |  Branch (416:21): [True: 304, False: 139]
  ------------------
  417|    304|      auto td = this->ttyDefs.find(f->name());
  418|    304|      if (td != this->ttyDefs.end()) {
  ------------------
  |  Branch (418:11): [True: 20, False: 284]
  ------------------
  419|     20|        if (v->args().size() != td->second.first.size()) {
  ------------------
  |  Branch (419:13): [True: 0, False: 20]
  ------------------
  420|      0|          throw std::runtime_error("The type constructor '" + f->name() + "' requires exactly " + str::from(td->second.first.size()) + " arguments");
  421|      0|        }
  422|       |
  423|     20|        MonoTypeSubst s;
  424|     40|        for (size_t i = 0; i < v->args().size(); ++i) {
  ------------------
  |  Branch (424:28): [True: 20, False: 20]
  ------------------
  425|     20|          s[td->second.first[i]] = switchOf(v->args()[i], *this);
  426|     20|        }
  427|     20|        return substituteStep(s, td->second.second);
  428|     20|      }
  429|    304|    }
  430|       |
  431|    423|    return MonoTypePtr(TApp::make(switchOf(v->fn(), *this), switchOf(v->args(), *this)));
  432|    443|  }
_ZN6hobbes14allocTEnvFrameERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS6_EERKS0_ISt10shared_ptrINS_8MonoTypeEESaISD_EERKSB_INS_4TEnvEE:
  653|      3|inline TEnvPtr allocTEnvFrame(const str::seq& names, const MonoTypes& tys, const TEnvPtr& ptenv) {
  654|      3|  if (names.empty()) {
  ------------------
  |  Branch (654:7): [True: 0, False: 3]
  ------------------
  655|      0|    return ptenv;
  656|      3|  } else {
  657|      3|    TEnvPtr r(new TEnv(ptenv));
  658|      3|    unsigned int n = std::min<unsigned int>(names.size(), tys.size());
  659|      6|    for (unsigned int i = 0; i < n; ++i) {
  ------------------
  |  Branch (659:30): [True: 3, False: 3]
  ------------------
  660|      3|      r->bind(names[i], polytype(tys[i]));
  661|      3|    }
  662|      3|    return r;
  663|      3|  }
  664|      3|}

_ZN6hobbes17toLLVMConstantIntERKSt10shared_ptrINS_9PrimitiveEE:
   68|      4|llvm::ConstantInt* toLLVMConstantInt(const PrimitivePtr& p) {
   69|      4|  return switchOf(p, compileIntConstF());
   70|      4|}
_ZN6hobbes6toLLVMEPNS_5jitccERKSt10shared_ptrINS_4ExprEE:
  793|  2.71k|llvm::Value* toLLVM(jitcc* c, const ExprPtr& exp) {
  794|  2.71k|  return switchOf(exp, compileExpF("", c));
  795|  2.71k|}
_ZN6hobbes14toLLVMConstantEPNS_5jitccERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_4ExprEE:
  941|    148|llvm::Constant* toLLVMConstant(jitcc* c, const std::string& vname, const ExprPtr& e) {
  942|    148|  return switchOf(e, compileConstExpF(c, vname));
  943|    148|}
_ZNK6hobbes16compileIntConstF4withEPKNS_4LongE:
   58|      4|  llvm::ConstantInt* with(const Long*   v) const override { return civalue(v->value()); }
_ZN6hobbes11compileExpFC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPNS_5jitccE:
   75|  3.97k|  compileExpF(const std::string& vname, jitcc* c) : c(c), vname(vname) {
   76|  3.97k|  }
_ZNK6hobbes11compileExpF4withEPKNS_4UnitE:
   78|    128|  llvm::Value* with(const Unit*    ) const override { return cvalue(true); } // should get optimized away -- unit should have no runtime representation
_ZNK6hobbes11compileExpF4withEPKNS_4BoolE:
   79|     42|  llvm::Value* with(const Bool*   v) const override { return cvalue(v->value()); }
_ZNK6hobbes11compileExpF4withEPKNS_4CharE:
   80|     69|  llvm::Value* with(const Char*   v) const override { return cvalue(v->value()); }
_ZNK6hobbes11compileExpF4withEPKNS_4ByteE:
   81|      9|  llvm::Value* with(const Byte*   v) const override { return cvalue(v->value()); }
_ZNK6hobbes11compileExpF4withEPKNS_3IntE:
   83|     50|  llvm::Value* with(const Int*    v) const override { return cvalue(v->value()); }
_ZNK6hobbes11compileExpF4withEPKNS_4LongE:
   84|    159|  llvm::Value* with(const Long*   v) const override { return cvalue(v->value()); }
_ZNK6hobbes11compileExpF4withEPKNS_3VarE:
   89|  1.78k|  llvm::Value* with(const Var* v) const override {
   90|  1.78k|    return c->lookupVar(v->value(), requireMonotype(v->type()));
   91|  1.78k|  }
_ZNK6hobbes11compileExpF4withEPKNS_3LetE:
   93|    203|  llvm::Value* with(const Let* v) const override {
   94|       |    // compile the bound variable's value
   95|    203|    llvm::Value* var  = compile(v->varExpr());
   96|    203|    llvm::Value* body = nullptr;
   97|       |
   98|    203|    try {
   99|    203|      beginScope(v->var(), var);
  100|    203|      body = compile(v->bodyExpr());
  101|    203|      endScope();
  102|    203|    } catch (...) {
  103|      0|      endScope();
  104|      0|      throw;
  105|      0|    }
  106|       |
  107|    203|    return body;
  108|    203|  }
_ZNK6hobbes11compileExpF7compileERKSt10shared_ptrINS_4ExprEE:
  649|  1.18k|  llvm::Value* compile(const ExprPtr& e) const {
  650|  1.18k|    return switchOf(e, compileExpF("",this->c));
  651|  1.18k|  }
_ZNK6hobbes11compileExpF10beginScopeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPN4llvm5ValueE:
  669|    242|  void beginScope(const std::string& vname, llvm::Value* v) const {
  670|    242|    this->c->pushScope();
  671|    242|    this->c->bindScope(vname, v);
  672|    242|  }
_ZNK6hobbes11compileExpF8endScopeEv:
  674|    242|  void endScope() const {
  675|    242|    this->c->popScope();
  676|    242|  }
_ZNK6hobbes11compileExpF4withEPKNS_2FnE:
  123|     30|  llvm::Value* with(const Fn* v) const override {
  124|     30|    Func* fty = is<Func>(requireMonotype(v->type()));
  125|     30|    if (fty == nullptr) {
  ------------------
  |  Branch (125:9): [True: 0, False: 30]
  ------------------
  126|      0|      throw annotated_error(*v, "Internal compiler error, not a function type: " + show(v->type()));
  127|      0|    }
  128|       |
  129|     30|    try {
  130|     30|      this->c->pushScope();
  131|     30|      llvm::Value* f = compileFunction(this->vname, v->varNames(), fty->parameters(), v->body());
  132|     30|      this->c->popScope();
  133|     30|      return f;
  134|     30|    } catch (...) {
  135|      0|      this->c->popScope();
  136|      0|      throw;
  137|      0|    }
  138|     30|  }
_ZNK6hobbes11compileExpF15compileFunctionERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt6vectorIS6_SaIS6_EERKS9_ISt10shared_ptrINS_8MonoTypeEESaISG_EERKSE_INS_4ExprEE:
  661|     30|  llvm::Function* compileFunction(const std::string& name, const str::seq& argns, const MonoTypes& argtys, const ExprPtr& exp) const {
  662|     30|    return this->c->compileFunction(name, argns, argtys, exp);
  663|     30|  }
_ZNK6hobbes11compileExpF4withEPKNS_3AppE:
  140|  1.22k|  llvm::Value* with(const App* v) const override {
  141|       |    // for the special case of "operators", we should allow them to decide how to compile
  142|       |    //   this allows us to use primitive instructions / control-flow
  143|  1.22k|    if (Var* fv = is<Var>(stripAssumpHead(v->fn()))) {
  ------------------
  |  Branch (143:14): [True: 1.22k, False: 5]
  ------------------
  144|  1.22k|      if (op* o = lookupOp(fv->value())) {
  ------------------
  |  Branch (144:15): [True: 879, False: 342]
  ------------------
  145|    879|        return o->apply(this->c, requireMonotype(this->c->typeEnv(), v->args()), requireMonotype(v->type()), v->args());
  146|    879|      }
  147|  1.22k|    }
  148|       |
  149|       |    // it's a standard function call, invoke it in the standard way
  150|    347|    return withContext([this, v](auto&) {
  151|    347|      return fncall(builder(),
  152|    347|                    compile(v->fn()),
  153|    347|                    toLLVM(requireMonotype(this->c->typeEnv(), v->fn())),
  154|    347|                    compileArgs(this->c, v->args()));
  155|    347|    });
  156|  1.22k|  }
_ZNK6hobbes11compileExpF8lookupOpERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  657|  1.22k|  op* lookupOp(const std::string& fname) const {
  658|  1.22k|    return this->c->lookupOp(fname);
  659|  1.22k|  }
_ZZNK6hobbes11compileExpF4withEPKNS_3AppEENKUlRT_E_clIN4llvm11LLVMContextEEEDaS5_:
  150|    347|    return withContext([this, v](auto&) {
  151|    347|      return fncall(builder(),
  152|    347|                    compile(v->fn()),
  153|    347|                    toLLVM(requireMonotype(this->c->typeEnv(), v->fn())),
  154|    347|                    compileArgs(this->c, v->args()));
  155|    347|    });
_ZNK6hobbes11compileExpF7builderEv:
  653|  1.51k|  llvm::IRBuilder<>* builder() const {
  654|  1.51k|    return this->c->builder();
  655|  1.51k|  }
_ZNK6hobbes11compileExpF4withEPKNS_6AssignE:
  158|     39|  llvm::Value* with(const Assign* v) const override {
  159|     39|    MonoTypePtr lty = requireMonotype(v->left()->type());
  160|     39|    MonoTypePtr rty = requireMonotype(v->right()->type());
  161|       |
  162|     39|    if (!isUnit(rty)) {
  ------------------
  |  Branch (162:9): [True: 38, False: 1]
  ------------------
  163|     38|      llvm::Value* lhs = compileRef(v->left());
  164|     38|      llvm::Value* rhs = compile(v->right());
  165|       |
  166|     38|      withContext([&](auto&) {
  167|     38|        if (isLargeType(rty)) {
  168|     38|          memCopy(builder(), lhs, 8, rhs, 8, sizeOf(rty));
  169|     38|        } else {
  170|     38|          builder()->CreateStore(rhs, lhs);
  171|     38|        }
  172|     38|      });
  173|       |
  174|     38|      return with(rcast<const Unit*>(0));
  175|     38|    } else {
  176|      1|      return compile(v->right());
  177|      1|    }
  178|     39|  }
_ZNK6hobbes11compileExpF10compileRefERKSt10shared_ptrINS_4ExprEE:
  703|     38|  llvm::Value* compileRef(const ExprPtr& ae) const {
  704|     38|    const ExprPtr& e = stripAssumpHead(ae);
  705|       |
  706|     38|    if (const Var* gv = is<Var>(e)) {
  ------------------
  |  Branch (706:20): [True: 2, False: 36]
  ------------------
  707|      2|      MonoTypePtr  vty = requireMonotype(gv->type());
  708|      2|      llvm::Value* vl  = this->c->lookupVarRef(gv->value());
  709|       |
  710|      2|      if (vl == nullptr) {
  ------------------
  |  Branch (710:11): [True: 0, False: 2]
  ------------------
  711|      0|        throw annotated_error(*e, "Failed to get reference to global variable: " + gv->value());
  712|      0|      }
  713|       |
  714|      2|#if LLVM_VERSION_MAJOR >= 18
  715|      2|      return withContext([&](auto&) { return isLargeType(vty) ? builder()->CreateLoad(toLLVM(vty, true), vl) : vl; });
  716|       |#elif LLVM_VERSION_MAJOR >= 16
  717|       |      return withContext([&](auto&) { return isLargeType(vty) ? builder()->CreateLoad(vl->getType()->getPointerElementType(), vl) : vl; });
  718|       |#else
  719|       |      return withContext([&](auto&) { return isLargeType(vty) ? builder()->CreateLoad(vl) : vl; });
  720|       |#endif
  721|     36|    } else if (const AIndex* ai = is<AIndex>(e)) {
  ------------------
  |  Branch (721:30): [True: 33, False: 3]
  ------------------
  722|     33|      MonoTypePtr  aity = requireMonotype(ai->type());
  723|     33|      llvm::Value* ar   = compile(ai->array());
  724|     33|      llvm::Value* ir   = compile(ai->index());
  725|       |
  726|     33|#if LLVM_VERSION_MAJOR >= 18
  727|     33|      bool isElemPtr = (is<OpaquePtr>(aity) != nullptr) || (is<Func>(aity) != nullptr);
  ------------------
  |  Branch (727:24): [True: 0, False: 33]
  |  Branch (727:60): [True: 0, False: 33]
  ------------------
  728|     33|      llvm::Type* elemLLTy = toLLVM(aity, isElemPtr);
  729|     33|      llvm::Value* ard = withContext([&](auto&) {
  730|     33|        return structOffset(builder(), varArrayType(elemLLTy), ar, 1);
  731|     33|      });
  732|     33|      llvm::Value* p   = withContext([&](auto&) {
  733|     33|        return offset(builder(), elemLLTy, ard, ir);
  734|     33|      });
  735|       |#else
  736|       |      llvm::Value* ard = withContext([this, ar](auto&) {
  737|       |        return structOffset(builder(), ar, 1); // get the array's 'data' pointer
  738|       |      });
  739|       |      llvm::Value* p   = withContext([&](auto&) {
  740|       |        return offset(builder(), ard, 0, ir);  // and index into it
  741|       |      });
  742|       |#endif
  743|       |
  744|     33|      return p;
  745|     33|    } else if (const Proj* rp = is<Proj>(e)) {
  ------------------
  |  Branch (745:28): [True: 3, False: 0]
  ------------------
  746|      3|      auto* rty = is<Record>(requireMonotype(rp->record()->type()));
  747|      3|      if (rty == nullptr) {
  ------------------
  |  Branch (747:11): [True: 0, False: 3]
  ------------------
  748|      0|        throw annotated_error(*e, "Internal compiler error (received non-record type in projection).");
  749|      0|      }
  750|       |
  751|      3|      llvm::Value* rec  = compile(rp->record());
  752|      3|      MonoTypePtr  fty  = requireMonotype(rp->type());
  753|       |
  754|       |      // switched to using packed records and manually-determined padding
  755|      3|#if LLVM_VERSION_MAJOR >= 18
  756|      3|      llvm::Value* p = structFieldPtr(rec, rty->alignedIndex(rp->field()), toLLVM(requireMonotype(rp->record()->type())));
  757|       |#else
  758|       |      llvm::Value* p = structFieldPtr(rec, rty->alignedIndex(rp->field()));
  759|       |#endif
  760|       |
  761|      3|      if (auto* op = is<OpaquePtr>(fty)) {
  ------------------
  |  Branch (761:17): [True: 0, False: 3]
  ------------------
  762|      0|        if (op->storedContiguously()) {
  ------------------
  |  Branch (762:13): [True: 0, False: 0]
  ------------------
  763|      0|          return withContext([&](auto&) {
  764|      0|            return builder()->CreateBitCast(p, ptrType(byteType()));
  765|      0|          });
  766|      0|        }
  767|      0|      }
  768|       |
  769|      3|      return p;
  770|      3|    } else if (const App* ap = is<App>(e)) {
  ------------------
  |  Branch (770:27): [True: 0, False: 0]
  ------------------
  771|      0|      if (const Var* f = is<Var>(ap->fn())) {
  ------------------
  |  Branch (771:22): [True: 0, False: 0]
  ------------------
  772|      0|        if (f->value() == "saelem" && ap->args().size() == 2) {
  ------------------
  |  Branch (772:13): [True: 0, False: 0]
  |  Branch (772:39): [True: 0, False: 0]
  ------------------
  773|      0|          llvm::Value* ar = compile(ap->args()[0]);
  774|      0|          llvm::Value* i  = compile(ap->args()[1]);
  775|       |
  776|      0|#if LLVM_VERSION_MAJOR >= 18
  777|      0|          {
  778|      0|            MonoTypePtr elemTy = requireMonotype(ap->type());
  779|      0|            bool isElemPtr = (is<OpaquePtr>(elemTy) != nullptr) || (is<Func>(elemTy) != nullptr);
  ------------------
  |  Branch (779:30): [True: 0, False: 0]
  |  Branch (779:68): [True: 0, False: 0]
  ------------------
  780|      0|            return withContext([&](auto&) { return offset(builder(), toLLVM(elemTy, isElemPtr), ar, i); });
  781|      0|          }
  782|       |#else
  783|       |          return withContext([&](auto&) { return offset(builder(), ar, 0, i); });
  784|       |#endif
  785|      0|        }
  786|      0|      }
  787|      0|    }
  788|       |
  789|      0|    throw annotated_error(*e, "Cannot assign to non l-value: " + show(e));
  790|     38|  }
_ZZNK6hobbes11compileExpF10compileRefERKSt10shared_ptrINS_4ExprEEENKUlRT_E_clIN4llvm11LLVMContextEEEDaS7_:
  715|      2|      return withContext([&](auto&) { return isLargeType(vty) ? builder()->CreateLoad(toLLVM(vty, true), vl) : vl; });
  ------------------
  |  Branch (715:46): [True: 2, False: 0]
  ------------------
_ZZNK6hobbes11compileExpF10compileRefERKSt10shared_ptrINS_4ExprEEENKUlRT_E0_clIN4llvm11LLVMContextEEEDaS7_:
  729|     33|      llvm::Value* ard = withContext([&](auto&) {
  730|     33|        return structOffset(builder(), varArrayType(elemLLTy), ar, 1);
  731|     33|      });
_ZZNK6hobbes11compileExpF10compileRefERKSt10shared_ptrINS_4ExprEEENKUlRT_E1_clIN4llvm11LLVMContextEEEDaS7_:
  732|     33|      llvm::Value* p   = withContext([&](auto&) {
  733|     33|        return offset(builder(), elemLLTy, ard, ir);
  734|     33|      });
_ZNK6hobbes11compileExpF14structFieldPtrEPN4llvm5ValueEjPNS1_4TypeE:
  679|    127|  llvm::Value* structFieldPtr(llvm::Value* r, unsigned int i, llvm::Type* structTy) const {
  680|    127|    return withContext([=](auto&) { return structOffset(builder(), structTy, r, i); });
  681|    127|  }
_ZZNK6hobbes11compileExpF14structFieldPtrEPN4llvm5ValueEjPNS1_4TypeEENKUlRT_E_clINS1_11LLVMContextEEEDaS7_:
  680|    127|    return withContext([=](auto&) { return structOffset(builder(), structTy, r, i); });
_ZZNK6hobbes11compileExpF4withEPKNS_6AssignEENKUlRT_E_clIN4llvm11LLVMContextEEEDaS5_:
  166|     38|      withContext([&](auto&) {
  167|     38|        if (isLargeType(rty)) {
  ------------------
  |  Branch (167:13): [True: 2, False: 36]
  ------------------
  168|      2|          memCopy(builder(), lhs, 8, rhs, 8, sizeOf(rty));
  169|     36|        } else {
  170|     36|          builder()->CreateStore(rhs, lhs);
  171|     36|        }
  172|     38|      });
_ZNK6hobbes11compileExpF4withEPKNS_7MkArrayE:
  180|     32|  llvm::Value* with(const MkArray* v) const override {
  181|     32|    MonoTypePtr ty  = requireMonotype(v->type());
  182|     32|    auto*      aty = is<Array>(ty);
  183|     32|    if (aty == nullptr) {
  ------------------
  |  Branch (183:9): [True: 0, False: 32]
  ------------------
  184|      0|      throw annotated_error(*v, "Internal compiler error -- can't make array out of non-array type: " + show(ty));
  185|      0|    }
  186|       |
  187|     32|    Values vs = switchOf(v->values(), compileExpF("", this->c));
  188|       |
  189|     32|    if (llvm::Value* cr = compileConstArray(aty->type(), vs)) {
  ------------------
  |  Branch (189:22): [True: 29, False: 3]
  ------------------
  190|     29|      return cr;
  191|     29|    } else {
  192|      3|      bool         isStoredPtr = (is<OpaquePtr>(aty->type()) != nullptr) || (is<Func>(aty->type()) != nullptr); // consistent with ctype.C, store opaque ptrs and functions in arrays as pointers
  ------------------
  |  Branch (192:34): [True: 0, False: 3]
  |  Branch (192:77): [True: 0, False: 3]
  ------------------
  193|      3|      llvm::Type*  elemTy      = toLLVM(aty->type(), isStoredPtr);
  194|      3|      llvm::Value* p           = compileAllocStmt(sizeof(long) + sizeOf(aty->type()) * vs.size(), std::max<size_t>(sizeof(long), alignment(aty->type())), ptrType(llvmVarArrType(elemTy)));
  195|       |
  196|      3|      withContext([&](auto&) {
  197|       |        // store the array length
  198|      3|#if LLVM_VERSION_MAJOR >= 18
  199|      3|        llvm::Type* varrTy = varArrayType(elemTy);
  200|      3|        llvm::Value* alenp = structOffset(builder(), varrTy, p, 0);
  201|       |#else
  202|       |        llvm::Value* alenp = structOffset(builder(), p, 0);
  203|       |#endif
  204|      3|        builder()->CreateStore(llvm::Constant::getIntegerValue(longType(), llvm::APInt(64, vs.size(), true)), alenp);
  205|       |
  206|       |        // store the array contents
  207|      3|        if (!isUnit(aty->type())) {
  208|      3|#if LLVM_VERSION_MAJOR >= 18
  209|      3|          llvm::Value* adatap = structOffset(builder(), varrTy, p, 1);
  210|       |#else
  211|       |          llvm::Value* adatap = structOffset(builder(), p, 1);
  212|       |#endif
  213|       |
  214|      3|          for (size_t i = 0; i < vs.size(); ++i) {
  215|      3|            llvm::Value* ev = vs[i];
  216|      3|#if LLVM_VERSION_MAJOR >= 18
  217|      3|            llvm::Value* ap = offset(builder(), elemTy, adatap, static_cast<int>(i));
  218|       |#else
  219|       |            llvm::Value* ap = offset(builder(), adatap, 0, i);
  220|       |#endif
  221|       |
  222|       |            // we only memcopy into an array if the data is large and isn't an opaque pointer (always write opaque pointers as pointers)
  223|      3|            if (!isStoredPtr && isLargeType(aty->type())) {
  224|      3|              memCopy(builder(), ap, 8, ev, 8, sizeOf(aty->type()));
  225|      3|            } else {
  226|      3|              builder()->CreateStore(ev, ap);
  227|      3|            }
  228|      3|          }
  229|      3|        }
  230|      3|      });
  231|       |
  232|      3|      return p;
  233|      3|    }
  234|     32|  }
_ZNK6hobbes11compileExpF17compileConstArrayERKSt10shared_ptrINS_8MonoTypeEERKSt6vectorIPN4llvm5ValueESaIS9_EE:
  633|     32|  llvm::Value* compileConstArray(const MonoTypePtr& ty, const Values& vs) const {
  634|     32|    auto *elemTy = is<Func>(ty) != nullptr ? ptrType(toLLVM(ty)) : toLLVM(ty);
  ------------------
  |  Branch (634:20): [True: 0, False: 32]
  ------------------
  635|     32|    return withContext([&](auto&) {
  636|       |       // take care to refer to global array constants by reference (a bit awkward!)
  637|       |       // Use elemTy->isPointerTy() rather than is<Array>(ty) to correctly handle
  638|       |       // type aliases (e.g. darray) that resolve to Array through TAbs substitution
  639|     32|       return tryMkConstVarArray(builder(), this->c->module(), elemTy, vs, elemTy->isPointerTy());
  640|     32|    });
  641|     32|  }
_ZZNK6hobbes11compileExpF17compileConstArrayERKSt10shared_ptrINS_8MonoTypeEERKSt6vectorIPN4llvm5ValueESaIS9_EEENKUlRT_E_clINS7_11LLVMContextEEEDaSF_:
  635|     32|    return withContext([&](auto&) {
  636|       |       // take care to refer to global array constants by reference (a bit awkward!)
  637|       |       // Use elemTy->isPointerTy() rather than is<Array>(ty) to correctly handle
  638|       |       // type aliases (e.g. darray) that resolve to Array through TAbs substitution
  639|     32|       return tryMkConstVarArray(builder(), this->c->module(), elemTy, vs, elemTy->isPointerTy());
  640|     32|    });
_ZNK6hobbes11compileExpF16compileAllocStmtEmmPN4llvm4TypeE:
  665|     89|  llvm::Value* compileAllocStmt(size_t sz, size_t asz, llvm::Type* mty) const {
  666|     89|    return this->c->compileAllocStmt(sz, asz, mty);
  667|     89|  }
_ZZNK6hobbes11compileExpF4withEPKNS_7MkArrayEENKUlRT_E_clIN4llvm11LLVMContextEEEDaS5_:
  196|      3|      withContext([&](auto&) {
  197|       |        // store the array length
  198|      3|#if LLVM_VERSION_MAJOR >= 18
  199|      3|        llvm::Type* varrTy = varArrayType(elemTy);
  200|      3|        llvm::Value* alenp = structOffset(builder(), varrTy, p, 0);
  201|       |#else
  202|       |        llvm::Value* alenp = structOffset(builder(), p, 0);
  203|       |#endif
  204|      3|        builder()->CreateStore(llvm::Constant::getIntegerValue(longType(), llvm::APInt(64, vs.size(), true)), alenp);
  205|       |
  206|       |        // store the array contents
  207|      3|        if (!isUnit(aty->type())) {
  ------------------
  |  Branch (207:13): [True: 3, False: 0]
  ------------------
  208|      3|#if LLVM_VERSION_MAJOR >= 18
  209|      3|          llvm::Value* adatap = structOffset(builder(), varrTy, p, 1);
  210|       |#else
  211|       |          llvm::Value* adatap = structOffset(builder(), p, 1);
  212|       |#endif
  213|       |
  214|      8|          for (size_t i = 0; i < vs.size(); ++i) {
  ------------------
  |  Branch (214:30): [True: 5, False: 3]
  ------------------
  215|      5|            llvm::Value* ev = vs[i];
  216|      5|#if LLVM_VERSION_MAJOR >= 18
  217|      5|            llvm::Value* ap = offset(builder(), elemTy, adatap, static_cast<int>(i));
  218|       |#else
  219|       |            llvm::Value* ap = offset(builder(), adatap, 0, i);
  220|       |#endif
  221|       |
  222|       |            // we only memcopy into an array if the data is large and isn't an opaque pointer (always write opaque pointers as pointers)
  223|      5|            if (!isStoredPtr && isLargeType(aty->type())) {
  ------------------
  |  Branch (223:17): [True: 5, False: 0]
  |  Branch (223:33): [True: 0, False: 5]
  ------------------
  224|      0|              memCopy(builder(), ap, 8, ev, 8, sizeOf(aty->type()));
  225|      5|            } else {
  226|      5|              builder()->CreateStore(ev, ap);
  227|      5|            }
  228|      5|          }
  229|      3|        }
  230|      3|      });
_ZNK6hobbes11compileExpF4withEPKNS_9MkVariantE:
  236|     66|  llvm::Value* with(const MkVariant* v) const override {
  237|     66|    MonoTypePtr mvty = requireMonotype(v->type());
  238|     66|    const Variant *vty = is<Variant>(mvty);
  239|     66|    if (vty == nullptr && show(v->value()) == "()") {
  ------------------
  |  Branch (239:9): [True: 0, False: 66]
  |  Branch (239:9): [True: 0, False: 66]
  |  Branch (239:27): [True: 0, False: 0]
  ------------------
  240|      0|      vty = isVariantPEnum(mvty);
  241|      0|      if (vty != nullptr) {
  ------------------
  |  Branch (241:11): [True: 0, False: 0]
  ------------------
  242|      0|        llvm::Type *uty = toLLVM(mvty);
  243|      0|        return withContext([&](auto &) {
  244|      0|          return llvm::Constant::getIntegerValue(
  245|      0|              uty, llvm::APInt(8 * sizeOf(mvty), vty->id(v->label())));
  246|      0|        });
  247|      0|      }
  248|      0|    }
  249|     66|    if (vty == nullptr) { throw annotated_error(*v, "Internal compiler error, compiling variant without penum/variant type: " + show(v) + " :: " + show(v->type())); }
  ------------------
  |  Branch (249:9): [True: 0, False: 66]
  ------------------
  250|       |
  251|     66|    llvm::Value* p  = compileAllocStmt(sizeOf(mvty), alignment(mvty), ptrType(byteType()));
  252|     66|    llvm::Value* tg = cvalue(vty->id(v->label()));
  253|     66|    llvm::Value* tv = compile(v->value());
  254|       |
  255|     66|    return withContext([&](auto&) {
  256|       |      // store the variant tag
  257|     66|      builder()->CreateStore(tg, builder()->CreateBitCast(p, ptrType(intType())));
  258|       |
  259|       |      // store the variant value
  260|     66|      MonoTypePtr  valty = requireMonotype(v->value()->type());
  261|     66|#if LLVM_VERSION_MAJOR >= 18
  262|     66|      llvm::Value* pp    = offset(builder(), charType(), p, vty->payloadOffset());
  263|       |#else
  264|       |      llvm::Value* pp    = offset(builder(), p, vty->payloadOffset());
  265|       |#endif
  266|       |
  267|     66|      if (isLargeType(valty)) {
  268|     66|        memCopy(builder(), pp, 8, tv, 8, sizeOf(valty));
  269|     66|      } else if (isUnit(valty)) {
  270|       |        // don't store unit values
  271|     66|      } else {
  272|       |        // store data for this case inline in the variant
  273|       |        // (functions should be stored as pointers)
  274|     66|        builder()->CreateStore(tv, builder()->CreateBitCast(pp, ptrType(toLLVM(valty, is<Func>(valty)))));
  275|     66|      }
  276|       |
  277|     66|      return builder()->CreateBitCast(p, toLLVM(mvty, true));
  278|     66|    });
  279|     66|  }
_ZZNK6hobbes11compileExpF4withEPKNS_9MkVariantEENKUlRT_E0_clIN4llvm11LLVMContextEEEDaS5_:
  255|     66|    return withContext([&](auto&) {
  256|       |      // store the variant tag
  257|     66|      builder()->CreateStore(tg, builder()->CreateBitCast(p, ptrType(intType())));
  258|       |
  259|       |      // store the variant value
  260|     66|      MonoTypePtr  valty = requireMonotype(v->value()->type());
  261|     66|#if LLVM_VERSION_MAJOR >= 18
  262|     66|      llvm::Value* pp    = offset(builder(), charType(), p, vty->payloadOffset());
  263|       |#else
  264|       |      llvm::Value* pp    = offset(builder(), p, vty->payloadOffset());
  265|       |#endif
  266|       |
  267|     66|      if (isLargeType(valty)) {
  ------------------
  |  Branch (267:11): [True: 10, False: 56]
  ------------------
  268|     10|        memCopy(builder(), pp, 8, tv, 8, sizeOf(valty));
  269|     56|      } else if (isUnit(valty)) {
  ------------------
  |  Branch (269:18): [True: 42, False: 14]
  ------------------
  270|       |        // don't store unit values
  271|     42|      } else {
  272|       |        // store data for this case inline in the variant
  273|       |        // (functions should be stored as pointers)
  274|     14|        builder()->CreateStore(tv, builder()->CreateBitCast(pp, ptrType(toLLVM(valty, is<Func>(valty)))));
  275|     14|      }
  276|       |
  277|     66|      return builder()->CreateBitCast(p, toLLVM(mvty, true));
  278|     66|    });
_ZNK6hobbes11compileExpF4withEPKNS_8MkRecordE:
  281|     20|  llvm::Value* with(const MkRecord* v) const override {
  282|     20|    MonoTypePtr mrty = requireMonotype(v->type());
  283|     20|    auto*     rty  = is<Record>(mrty);
  284|     20|    if (rty == nullptr) { throw annotated_error(*v, "Internal compiler error, compiling record without record type: " + show(v) + " :: " + show(v->type())); }
  ------------------
  |  Branch (284:9): [True: 0, False: 20]
  ------------------
  285|       |
  286|     20|    RecordValue vs = compileRecordFields(v->fields());
  287|       |
  288|       |    // for the odd case where all fields are unit
  289|     20|    if (vs.empty()) {
  ------------------
  |  Branch (289:9): [True: 0, False: 20]
  ------------------
  290|      0|      return cvalue(true);
  291|      0|    }
  292|       |
  293|     20|    if (llvm::Value* cr = compileConstRecord(vs, rty)) {
  ------------------
  |  Branch (293:22): [True: 0, False: 20]
  ------------------
  294|      0|      return cr;
  295|     20|    } else {
  296|     20|      llvm::Value* p = compileAllocStmt(sizeOf(mrty), alignment(mrty), toLLVM(mrty, true));
  297|       |
  298|     48|      for (const auto &v : vs) {
  ------------------
  |  Branch (298:26): [True: 48, False: 20]
  ------------------
  299|     48|        llvm::Value* fv  = v.second;
  300|     48|#if LLVM_VERSION_MAJOR >= 18
  301|     48|        llvm::Value* fp  = structFieldPtr(p, rty->alignedIndex(v.first), toLLVM(mrty));
  302|       |#else
  303|       |        llvm::Value* fp  = structFieldPtr(p, rty->alignedIndex(v.first));
  304|       |#endif
  305|     48|        MonoTypePtr  fty = rty->member(v.first);
  306|       |
  307|     48|        withContext([&](auto&) {
  308|     48|          if (isLargeType(fty)) {
  309|     48|            memCopy(builder(), fp, 8, fv, 8, sizeOf(fty));
  310|     48|          } else {
  311|     48|            builder()->CreateStore(fv, fp);
  312|     48|          }
  313|     48|        });
  314|     48|      }
  315|       |
  316|     20|      return p;
  317|     20|    }
  318|     20|  }
_ZNK6hobbes11compileExpF19compileRecordFieldsERKSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_4ExprEEESaISC_EE:
  688|     20|  RecordValue compileRecordFields(const MkRecord::FieldDefs& fs) const {
  689|     20|    RecordValue r;
  690|     48|    for (const auto &f : fs) {
  ------------------
  |  Branch (690:24): [True: 48, False: 20]
  ------------------
  691|     48|      if (!isUnit(requireMonotype(f.second->type()))) {
  ------------------
  |  Branch (691:11): [True: 48, False: 0]
  ------------------
  692|     48|        llvm::Value* v = compile(f.second);
  693|     48|        r.push_back(FieldValue(f.first, v));
  694|     48|      }
  695|     48|    }
  696|     20|    return r;
  697|     20|  }
_ZNK6hobbes11compileExpF18compileConstRecordERKSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPN4llvm5ValueEESaISC_EEPKNS_6RecordE:
  643|     20|  llvm::Value* compileConstRecord(const RecordValue& vs, const Record* rty) const {
  644|     20|    return withContext([&](auto&) {
  645|     20|      return tryMkConstRecord(builder(), this->c->module(), vs, rty);
  646|     20|    });
  647|     20|  }
_ZZNK6hobbes11compileExpF18compileConstRecordERKSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPN4llvm5ValueEESaISC_EEPKNS_6RecordEENKUlRT_E_clINS9_11LLVMContextEEEDaSL_:
  644|     20|    return withContext([&](auto&) {
  645|     20|      return tryMkConstRecord(builder(), this->c->module(), vs, rty);
  646|     20|    });
_ZZNK6hobbes11compileExpF4withEPKNS_8MkRecordEENKUlRT_E_clIN4llvm11LLVMContextEEEDaS5_:
  307|     48|        withContext([&](auto&) {
  308|     48|          if (isLargeType(fty)) {
  ------------------
  |  Branch (308:15): [True: 7, False: 41]
  ------------------
  309|      7|            memCopy(builder(), fp, 8, fv, 8, sizeOf(fty));
  310|     41|          } else {
  311|     41|            builder()->CreateStore(fv, fp);
  312|     41|          }
  313|     48|        });
_ZNK6hobbes11compileExpF4withEPKNS_6AIndexE:
  320|     49|  llvm::Value* with(const AIndex* v) const override {
  321|     49|    MonoTypePtr  aity = requireMonotype(v->type());
  322|     49|    llvm::Value* ar   = compile(v->array());
  323|     49|    llvm::Value* ir   = compile(v->index());
  324|     49|    if (isUnit(aity)) {
  ------------------
  |  Branch (324:9): [True: 0, False: 49]
  ------------------
  325|      0|      return with(rcast<const Unit*>(0));
  326|      0|    }
  327|       |
  328|     49|    return withContext([&](auto&) -> llvm::Value* {
  329|     49|#if LLVM_VERSION_MAJOR >= 18
  330|     49|      bool isElemPtr = (is<OpaquePtr>(aity) != nullptr) || (is<Func>(aity) != nullptr);
  331|     49|      llvm::Type* elemLLTy = toLLVM(aity, isElemPtr);
  332|     49|      llvm::Value* ard = structOffset(builder(), varArrayType(elemLLTy), ar, 1);
  333|     49|      llvm::Value* p   = offset(builder(), elemLLTy, ard, ir);
  334|     49|      if (isLargeType(aity)) {
  335|     49|        return p;
  336|     49|      } else {
  337|     49|        return builder()->CreateLoad(elemLLTy, p, false);
  338|     49|      }
  339|       |#else
  340|       |      llvm::Value* ard = structOffset(builder(), ar, 1); // get the array's data pointer
  341|       |      llvm::Value* p   = offset(builder(), ard, 0, ir);  // and index into it
  342|       |
  343|       |      if (isLargeType(aity)) {
  344|       |        return p;
  345|       |      } else {
  346|       |#if LLVM_VERSION_MAJOR < 16
  347|       |        return builder()->CreateLoad(p, false);
  348|       |#else
  349|       |        return builder()->CreateLoad(p->getType()->getPointerElementType(), p, false);
  350|       |#endif
  351|       |      }
  352|       |#endif
  353|     49|    });
  354|     49|  }
_ZZNK6hobbes11compileExpF4withEPKNS_6AIndexEENKUlRT_E_clIN4llvm11LLVMContextEEEPNS8_5ValueES5_:
  328|     49|    return withContext([&](auto&) -> llvm::Value* {
  329|     49|#if LLVM_VERSION_MAJOR >= 18
  330|     49|      bool isElemPtr = (is<OpaquePtr>(aity) != nullptr) || (is<Func>(aity) != nullptr);
  ------------------
  |  Branch (330:24): [True: 0, False: 49]
  |  Branch (330:60): [True: 0, False: 49]
  ------------------
  331|     49|      llvm::Type* elemLLTy = toLLVM(aity, isElemPtr);
  332|     49|      llvm::Value* ard = structOffset(builder(), varArrayType(elemLLTy), ar, 1);
  333|     49|      llvm::Value* p   = offset(builder(), elemLLTy, ard, ir);
  334|     49|      if (isLargeType(aity)) {
  ------------------
  |  Branch (334:11): [True: 4, False: 45]
  ------------------
  335|      4|        return p;
  336|     45|      } else {
  337|     45|        return builder()->CreateLoad(elemLLTy, p, false);
  338|     45|      }
  339|       |#else
  340|       |      llvm::Value* ard = structOffset(builder(), ar, 1); // get the array's data pointer
  341|       |      llvm::Value* p   = offset(builder(), ard, 0, ir);  // and index into it
  342|       |
  343|       |      if (isLargeType(aity)) {
  344|       |        return p;
  345|       |      } else {
  346|       |#if LLVM_VERSION_MAJOR < 16
  347|       |        return builder()->CreateLoad(p, false);
  348|       |#else
  349|       |        return builder()->CreateLoad(p->getType()->getPointerElementType(), p, false);
  350|       |#endif
  351|       |      }
  352|       |#endif
  353|     49|    });
_ZNK6hobbes11compileExpF4withEPKNS_4CaseE:
  369|     17|  llvm::Value* with(const Case* v) const override {
  370|     17|    MonoTypePtr casety = requireMonotype(v->type());
  371|     17|    MonoTypePtr varty  = requireMonotype(v->variant()->type());
  372|     17|    auto*    vty    = is<Variant>(varty);
  373|     17|    if (vty == nullptr) {
  ------------------
  |  Branch (373:9): [True: 0, False: 17]
  ------------------
  374|      0|      throw annotated_error(*v, "Internal compiler error (received non-variant type in case).");
  375|      0|    }
  376|     17|    resolveCaseDefault(vty, const_cast<Case*>(v));
  377|       |
  378|       |    // compile the variant and pull out the tag and value
  379|     17|    llvm::Value* var  = compile(v->variant());
  380|     17|#if LLVM_VERSION_MAJOR >= 18
  381|     17|    llvm::Value* tag  = withContext([this, var](auto&) { return builder()->CreateLoad(intType(), var, false); });
  382|     17|    llvm::Value* pval = withContext([&, this](auto&) { return builder()->CreateGEP(charType(), var, {cvalue(vty->payloadOffset())}); });
  383|       |#else
  384|       |    llvm::Value* ptag = withContext([this, var](auto&) { return builder()->CreateBitCast(var, ptrType(intType())); });
  385|       |#if LLVM_VERSION_MAJOR < 16
  386|       |    llvm::Value* tag  = withContext([this, ptag](auto&) { return builder()->CreateLoad(ptag, false); });
  387|       |#else
  388|       |    llvm::Value* tag  = withContext([this, ptag](auto&) { return builder()->CreateLoad(ptag->getType()->getPointerElementType(), ptag, false); });
  389|       |#endif
  390|       |
  391|       |    std::vector<llvm::Value*> idxs;
  392|       |    idxs.push_back(cvalue(0));
  393|       |    idxs.push_back(cvalue(vty->payloadOffset()));
  394|       |#if LLVM_VERSION_MAJOR < 16
  395|       |    llvm::Value* pval = withContext([&, this](auto&) { return builder()->CreateGEP(var, idxs); });
  396|       |#else
  397|       |    llvm::Value* pval = withContext([&, this](auto&) { return builder()->CreateGEP(var->getType()->getPointerElementType(), var, idxs); });
  398|       |#endif
  399|       |#endif
  400|       |
  401|     17|    llvm::Function*   thisFn     = withContext([this](auto&) { return builder()->GetInsertBlock()->getParent(); });
  402|     17|    llvm::BasicBlock* failBlock  = withContext([thisFn](llvm::LLVMContext& c) {
  403|     17|      return llvm::BasicBlock::Create(c, "casefail", thisFn);
  404|     17|    });
  405|     17|    llvm::BasicBlock* mergeBlock = withContext([thisFn](llvm::LLVMContext& c) {
  406|     17|      return llvm::BasicBlock::Create(c, "casemerge", thisFn);
  407|     17|    });
  408|     17|    llvm::SwitchInst* s          = withContext([&](auto&) {
  409|     17|      return builder()->CreateSwitch(tag, failBlock, v->bindings().size());
  410|     17|    });
  411|       |
  412|     17|    using MergeLink = std::pair<llvm::Value *, llvm::BasicBlock *>;
  413|     17|    using MergeLinks = std::vector<MergeLink>;
  414|     17|    MergeLinks mergeLinks;
  415|       |
  416|     34|    for (const auto &b : v->bindings()) {
  ------------------
  |  Branch (416:24): [True: 34, False: 17]
  ------------------
  417|     34|      unsigned int      caseID    = vty->id(b.selector);
  418|     34|      withContext([&](llvm::LLVMContext& c) {
  419|     34|        llvm::BasicBlock* caseBlock = llvm::BasicBlock::Create(c, "case_" + str::from(caseID), thisFn);
  420|       |
  421|     34|        builder()->SetInsertPoint(caseBlock);
  422|     34|        bool scoped = false; // the payload's type can fail to lower before its scope opens
  423|     34|        try {
  424|     34|          MonoTypePtr valty = vty->payload(b.selector);
  425|       |
  426|     34|          if (isUnit(valty)) {
  427|     34|            beginScope(b.vname, cvalue(true)); // this is unit, so should never be looked at
  428|     34|            scoped = true;
  429|     34|          } else {
  430|       |            // otherwise the data here is available inline
  431|       |            // (and functions are stored as pointers)
  432|     34|            llvm::Type*  lty      = toLLVM(valty, is<Func>(valty) != nullptr);
  433|     34|#if LLVM_VERSION_MAJOR >= 18
  434|     34|            llvm::Value* val      = isLargeType(valty) ? pval : builder()->CreateLoad(lty, pval, false);
  435|       |#else
  436|       |            llvm::Value* pointval = builder()->CreateBitCast(pval, ptrType(lty));
  437|       |#if LLVM_VERSION_MAJOR < 16
  438|       |            llvm::Value* val      = isLargeType(valty) ? pointval : builder()->CreateLoad(pointval, false);
  439|       |#else
  440|       |            llvm::Value* val      = isLargeType(valty) ? pointval : builder()->CreateLoad(pointval->getType()->getPointerElementType(), pointval, false);
  441|       |#endif
  442|       |#endif
  443|       |
  444|     34|            beginScope(b.vname, val);
  445|     34|            scoped = true;
  446|     34|          }
  447|       |
  448|     34|          llvm::Value* caseValue = switchOf(b.exp, compileExpF("", this->c));
  449|     34|          mergeLinks.push_back(MergeLink(caseValue, builder()->GetInsertBlock()));
  450|     34|          builder()->CreateBr(mergeBlock);
  451|     34|          endScope();
  452|     34|        } catch (...) {
  453|     34|          if (scoped) endScope();
  454|     34|          throw;
  455|     34|        }
  456|       |
  457|     34|        s->addCase(llvm::ConstantInt::get(llvm::IntegerType::get(c, 32),
  458|     34|                                          scast<uint64_t>(caseID)), caseBlock);
  459|     34|      });
  460|     34|    }
  461|       |
  462|       |    // fill in the default (failure) target for variant matching
  463|     17|    llvm::Function* f = this->c->lookupFunction(".failvarmatch");
  464|     17|    if (f == nullptr) { throw std::runtime_error("Internal compiler error -- no default variant match failure handler defined."); }
  ------------------
  |  Branch (464:9): [True: 0, False: 17]
  ------------------
  465|       |
  466|     17|    auto ltxts = v->la().lines(v->la().p0.first-1, v->la().p1.first);
  467|     17|    auto ltxt  = !ltxts.empty() ? ltxts[0] : "???";
  ------------------
  |  Branch (467:18): [True: 17, False: 0]
  ------------------
  468|       |
  469|     17|    return withContext([&](auto&) -> llvm::Value* {
  470|     17|      builder()->SetInsertPoint(failBlock);
  471|     17|      fncall(builder(), f, f->getFunctionType(), list(
  472|     17|        this->c->internConstString(v->la().filename()),
  473|     17|        cvalue(scast<long>(v->la().p0.first)),
  474|     17|        this->c->internConstString(ltxt),
  475|     17|        builder()->CreateBitCast(var, ptrType(charType()))
  476|     17|      ));
  477|     17|      builder()->CreateUnreachable();
  478|       |
  479|       |      // now if the result type is unit, it can be trivially constructed, else merge potential branch results
  480|     17|      builder()->SetInsertPoint(mergeBlock);
  481|     17|      if (isUnit(casety)) {
  482|     17|        return cvalue(true);
  483|     17|      } else {
  484|     17|        llvm::PHINode* pn = builder()->CreatePHI(toLLVM(casety, true), mergeLinks.size());
  485|     17|        for (const auto &mergeLink : mergeLinks) {
  486|     17|          pn->addIncoming(mergeLink.first, mergeLink.second);
  487|     17|        }
  488|     17|        return pn;
  489|     17|      }
  490|     17|    });
  491|     17|  }
_ZNK6hobbes11compileExpF18resolveCaseDefaultEPKNS_7VariantEPNS_4CaseE:
  357|     17|  void resolveCaseDefault(const Variant* vty, Case* v) const {
  358|     17|    if (v->defaultExpr().get() != nullptr) {
  ------------------
  |  Branch (358:9): [True: 11, False: 6]
  ------------------
  359|     11|      std::string pn = freshName();
  360|       |
  361|     22|      for (const auto &vm : vty->members()) {
  ------------------
  |  Branch (361:27): [True: 22, False: 11]
  ------------------
  362|     22|        if (!v->hasBinding(vm.selector)) {
  ------------------
  |  Branch (362:13): [True: 11, False: 11]
  ------------------
  363|     11|          v->addBinding(vm.selector, pn, v->defaultExpr());
  364|     11|        }
  365|     22|      }
  366|     11|    }
  367|     17|  }
_ZZNK6hobbes11compileExpF4withEPKNS_4CaseEENKUlRT_E_clIN4llvm11LLVMContextEEEDaS5_:
  381|     17|    llvm::Value* tag  = withContext([this, var](auto&) { return builder()->CreateLoad(intType(), var, false); });
_ZZNK6hobbes11compileExpF4withEPKNS_4CaseEENKUlRT_E0_clIN4llvm11LLVMContextEEEDaS5_:
  382|     17|    llvm::Value* pval = withContext([&, this](auto&) { return builder()->CreateGEP(charType(), var, {cvalue(vty->payloadOffset())}); });
_ZZNK6hobbes11compileExpF4withEPKNS_4CaseEENKUlRT_E1_clIN4llvm11LLVMContextEEEDaS5_:
  401|     17|    llvm::Function*   thisFn     = withContext([this](auto&) { return builder()->GetInsertBlock()->getParent(); });
_ZZNK6hobbes11compileExpF4withEPKNS_4CaseEENKUlRN4llvm11LLVMContextEE_clES6_:
  402|     17|    llvm::BasicBlock* failBlock  = withContext([thisFn](llvm::LLVMContext& c) {
  403|     17|      return llvm::BasicBlock::Create(c, "casefail", thisFn);
  404|     17|    });
_ZZNK6hobbes11compileExpF4withEPKNS_4CaseEENKUlRN4llvm11LLVMContextEE0_clES6_:
  405|     17|    llvm::BasicBlock* mergeBlock = withContext([thisFn](llvm::LLVMContext& c) {
  406|     17|      return llvm::BasicBlock::Create(c, "casemerge", thisFn);
  407|     17|    });
_ZZNK6hobbes11compileExpF4withEPKNS_4CaseEENKUlRT_E2_clIN4llvm11LLVMContextEEEDaS5_:
  408|     17|    llvm::SwitchInst* s          = withContext([&](auto&) {
  409|     17|      return builder()->CreateSwitch(tag, failBlock, v->bindings().size());
  410|     17|    });
_ZZNK6hobbes11compileExpF4withEPKNS_4CaseEENKUlRN4llvm11LLVMContextEE1_clES6_:
  418|     34|      withContext([&](llvm::LLVMContext& c) {
  419|     34|        llvm::BasicBlock* caseBlock = llvm::BasicBlock::Create(c, "case_" + str::from(caseID), thisFn);
  420|       |
  421|     34|        builder()->SetInsertPoint(caseBlock);
  422|     34|        bool scoped = false; // the payload's type can fail to lower before its scope opens
  423|     34|        try {
  424|     34|          MonoTypePtr valty = vty->payload(b.selector);
  425|       |
  426|     34|          if (isUnit(valty)) {
  ------------------
  |  Branch (426:15): [True: 16, False: 18]
  ------------------
  427|     16|            beginScope(b.vname, cvalue(true)); // this is unit, so should never be looked at
  428|     16|            scoped = true;
  429|     18|          } else {
  430|       |            // otherwise the data here is available inline
  431|       |            // (and functions are stored as pointers)
  432|     18|            llvm::Type*  lty      = toLLVM(valty, is<Func>(valty) != nullptr);
  433|     18|#if LLVM_VERSION_MAJOR >= 18
  434|     18|            llvm::Value* val      = isLargeType(valty) ? pval : builder()->CreateLoad(lty, pval, false);
  ------------------
  |  Branch (434:37): [True: 11, False: 7]
  ------------------
  435|       |#else
  436|       |            llvm::Value* pointval = builder()->CreateBitCast(pval, ptrType(lty));
  437|       |#if LLVM_VERSION_MAJOR < 16
  438|       |            llvm::Value* val      = isLargeType(valty) ? pointval : builder()->CreateLoad(pointval, false);
  439|       |#else
  440|       |            llvm::Value* val      = isLargeType(valty) ? pointval : builder()->CreateLoad(pointval->getType()->getPointerElementType(), pointval, false);
  441|       |#endif
  442|       |#endif
  443|       |
  444|     18|            beginScope(b.vname, val);
  445|     18|            scoped = true;
  446|     18|          }
  447|       |
  448|     34|          llvm::Value* caseValue = switchOf(b.exp, compileExpF("", this->c));
  449|     34|          mergeLinks.push_back(MergeLink(caseValue, builder()->GetInsertBlock()));
  450|     34|          builder()->CreateBr(mergeBlock);
  451|     34|          endScope();
  452|     34|        } catch (...) {
  453|      0|          if (scoped) endScope();
  ------------------
  |  Branch (453:15): [True: 0, False: 0]
  ------------------
  454|      0|          throw;
  455|      0|        }
  456|       |
  457|     34|        s->addCase(llvm::ConstantInt::get(llvm::IntegerType::get(c, 32),
  458|     34|                                          scast<uint64_t>(caseID)), caseBlock);
  459|     34|      });
_ZZNK6hobbes11compileExpF4withEPKNS_4CaseEENKUlRT_E3_clIN4llvm11LLVMContextEEEPNS8_5ValueES5_:
  469|     17|    return withContext([&](auto&) -> llvm::Value* {
  470|     17|      builder()->SetInsertPoint(failBlock);
  471|     17|      fncall(builder(), f, f->getFunctionType(), list(
  472|     17|        this->c->internConstString(v->la().filename()),
  473|     17|        cvalue(scast<long>(v->la().p0.first)),
  474|     17|        this->c->internConstString(ltxt),
  475|     17|        builder()->CreateBitCast(var, ptrType(charType()))
  476|     17|      ));
  477|     17|      builder()->CreateUnreachable();
  478|       |
  479|       |      // now if the result type is unit, it can be trivially constructed, else merge potential branch results
  480|     17|      builder()->SetInsertPoint(mergeBlock);
  481|     17|      if (isUnit(casety)) {
  ------------------
  |  Branch (481:11): [True: 3, False: 14]
  ------------------
  482|      3|        return cvalue(true);
  483|     14|      } else {
  484|     14|        llvm::PHINode* pn = builder()->CreatePHI(toLLVM(casety, true), mergeLinks.size());
  485|     28|        for (const auto &mergeLink : mergeLinks) {
  ------------------
  |  Branch (485:36): [True: 28, False: 14]
  ------------------
  486|     28|          pn->addIncoming(mergeLink.first, mergeLink.second);
  487|     28|        }
  488|     14|        return pn;
  489|     14|      }
  490|     17|    });
_ZNK6hobbes11compileExpF4withEPKNS_6SwitchE:
  493|      2|  llvm::Value* with(const Switch* v) const override {
  494|      2|    MonoTypePtr casety = requireMonotype(v->type());
  495|       |
  496|       |    // prepare to switch on the discriminant
  497|      2|    llvm::Value* e = compile(v->expr());
  498|       |
  499|      2|    llvm::Function*   thisFn     = withContext([this](auto&) {
  500|      2|      return builder()->GetInsertBlock()->getParent();
  501|      2|    });
  502|      2|    llvm::BasicBlock* failBlock  = withContext([thisFn](llvm::LLVMContext& c) {
  503|      2|      return llvm::BasicBlock::Create(c, "casefail", thisFn);
  504|      2|    });
  505|      2|    llvm::BasicBlock* mergeBlock = withContext([thisFn](llvm::LLVMContext& c) {
  506|      2|      return llvm::BasicBlock::Create(c, "casemerge", thisFn);
  507|      2|    });
  508|      2|    llvm::SwitchInst* s          = withContext([&](auto&) {
  509|      2|      return builder()->CreateSwitch(e, failBlock, v->bindings().size());
  510|      2|    });
  511|       |
  512|      2|    using MergeLink = std::pair<llvm::Value *, llvm::BasicBlock *>;
  513|      2|    using MergeLinks = std::vector<MergeLink>;
  514|      2|    MergeLinks mergeLinks;
  515|       |
  516|      2|    return withContext([&](auto& c) -> llvm::Value* {
  517|      2|      size_t i = 0;
  518|      2|      for (const auto& b : v->bindings()) {
  519|      2|        size_t caseID = i++;
  520|      2|        llvm::BasicBlock* caseBlock = llvm::BasicBlock::Create(c, "case_" + str::from(caseID), thisFn);
  521|       |
  522|      2|        builder()->SetInsertPoint(caseBlock);
  523|      2|        llvm::Value* caseValue = compile(b.exp);
  524|      2|        mergeLinks.push_back(MergeLink(caseValue, builder()->GetInsertBlock()));
  525|      2|        builder()->CreateBr(mergeBlock);
  526|       |
  527|      2|        s->addCase(toLLVMConstantInt(b.value), caseBlock);
  528|      2|      }
  529|       |
  530|       |      // fill in the default (failure) target
  531|      2|      if (v->defaultExpr()) {
  532|      2|        builder()->SetInsertPoint(failBlock);
  533|      2|        llvm::Value* defValue = compile(v->defaultExpr());
  534|      2|        mergeLinks.push_back(MergeLink(defValue, builder()->GetInsertBlock()));
  535|      2|        builder()->CreateBr(mergeBlock);
  536|      2|      } else {
  537|      2|        builder()->CreateUnreachable();
  538|      2|      }
  539|       |
  540|       |      // now just merge each of the case blocks to a final value
  541|      2|      builder()->SetInsertPoint(mergeBlock);
  542|      2|      if (isUnit(casety)) {
  543|      2|        return cvalue(true);
  544|      2|      } else {
  545|      2|        llvm::PHINode* pn = builder()->CreatePHI(toLLVM(casety, true), mergeLinks.size());
  546|      2|        for (const auto &mergeLink : mergeLinks) {
  547|      2|          pn->addIncoming(mergeLink.first, mergeLink.second);
  548|      2|        }
  549|      2|        return pn;
  550|      2|      }
  551|      2|    });
  552|      2|  }
_ZZNK6hobbes11compileExpF4withEPKNS_6SwitchEENKUlRT_E_clIN4llvm11LLVMContextEEEDaS5_:
  499|      2|    llvm::Function*   thisFn     = withContext([this](auto&) {
  500|      2|      return builder()->GetInsertBlock()->getParent();
  501|      2|    });
_ZZNK6hobbes11compileExpF4withEPKNS_6SwitchEENKUlRN4llvm11LLVMContextEE_clES6_:
  502|      2|    llvm::BasicBlock* failBlock  = withContext([thisFn](llvm::LLVMContext& c) {
  503|      2|      return llvm::BasicBlock::Create(c, "casefail", thisFn);
  504|      2|    });
_ZZNK6hobbes11compileExpF4withEPKNS_6SwitchEENKUlRN4llvm11LLVMContextEE0_clES6_:
  505|      2|    llvm::BasicBlock* mergeBlock = withContext([thisFn](llvm::LLVMContext& c) {
  506|      2|      return llvm::BasicBlock::Create(c, "casemerge", thisFn);
  507|      2|    });
_ZZNK6hobbes11compileExpF4withEPKNS_6SwitchEENKUlRT_E0_clIN4llvm11LLVMContextEEEDaS5_:
  508|      2|    llvm::SwitchInst* s          = withContext([&](auto&) {
  509|      2|      return builder()->CreateSwitch(e, failBlock, v->bindings().size());
  510|      2|    });
_ZZNK6hobbes11compileExpF4withEPKNS_6SwitchEENKUlRT_E1_clIN4llvm11LLVMContextEEEPNS8_5ValueES5_:
  516|      2|    return withContext([&](auto& c) -> llvm::Value* {
  517|      2|      size_t i = 0;
  518|      4|      for (const auto& b : v->bindings()) {
  ------------------
  |  Branch (518:26): [True: 4, False: 2]
  ------------------
  519|      4|        size_t caseID = i++;
  520|      4|        llvm::BasicBlock* caseBlock = llvm::BasicBlock::Create(c, "case_" + str::from(caseID), thisFn);
  521|       |
  522|      4|        builder()->SetInsertPoint(caseBlock);
  523|      4|        llvm::Value* caseValue = compile(b.exp);
  524|      4|        mergeLinks.push_back(MergeLink(caseValue, builder()->GetInsertBlock()));
  525|      4|        builder()->CreateBr(mergeBlock);
  526|       |
  527|      4|        s->addCase(toLLVMConstantInt(b.value), caseBlock);
  528|      4|      }
  529|       |
  530|       |      // fill in the default (failure) target
  531|      2|      if (v->defaultExpr()) {
  ------------------
  |  Branch (531:11): [True: 2, False: 0]
  ------------------
  532|      2|        builder()->SetInsertPoint(failBlock);
  533|      2|        llvm::Value* defValue = compile(v->defaultExpr());
  534|      2|        mergeLinks.push_back(MergeLink(defValue, builder()->GetInsertBlock()));
  535|      2|        builder()->CreateBr(mergeBlock);
  536|      2|      } else {
  537|      0|        builder()->CreateUnreachable();
  538|      0|      }
  539|       |
  540|       |      // now just merge each of the case blocks to a final value
  541|      2|      builder()->SetInsertPoint(mergeBlock);
  542|      2|      if (isUnit(casety)) {
  ------------------
  |  Branch (542:11): [True: 0, False: 2]
  ------------------
  543|      0|        return cvalue(true);
  544|      2|      } else {
  545|      2|        llvm::PHINode* pn = builder()->CreatePHI(toLLVM(casety, true), mergeLinks.size());
  546|      6|        for (const auto &mergeLink : mergeLinks) {
  ------------------
  |  Branch (546:36): [True: 6, False: 2]
  ------------------
  547|      6|          pn->addIncoming(mergeLink.first, mergeLink.second);
  548|      6|        }
  549|      2|        return pn;
  550|      2|      }
  551|      2|    });
_ZNK6hobbes11compileExpF4withEPKNS_4ProjE:
  554|     76|  llvm::Value* with(const Proj* v) const override {
  555|     76|    auto* rty = is<Record>(requireMonotype(v->record()->type()));
  556|     76|    if (rty == nullptr) {
  ------------------
  |  Branch (556:9): [True: 0, False: 76]
  ------------------
  557|      0|      throw annotated_error(*v, "Internal compiler error (received non-record type in projection).");
  558|      0|    }
  559|       |
  560|     76|    llvm::Value* rec  = compile(v->record());
  561|     76|    MonoTypePtr  fty  = rty->member(v->field());
  562|       |
  563|     76|    if (isUnit(fty)) {
  ------------------
  |  Branch (563:9): [True: 0, False: 76]
  ------------------
  564|       |      // we don't need to look up unit
  565|      0|      return cvalue(true);
  566|      0|    }
  567|       |
  568|       |    // switched to using packed records and manually-determined padding
  569|     76|#if LLVM_VERSION_MAJOR >= 18
  570|     76|    llvm::Value* rp = structFieldPtr(rec, rty->alignedIndex(v->field()), toLLVM(requireMonotype(v->record()->type())));
  571|       |#else
  572|       |    llvm::Value* rp = structFieldPtr(rec, rty->alignedIndex(v->field()));
  573|       |#endif
  574|       |
  575|     76|    return withContext([&](auto&) -> llvm::Value* {
  576|     76|      if (auto* op = is<OpaquePtr>(fty)) {
  577|     76|        if (op->storedContiguously()) {
  578|     76|          return builder()->CreateBitCast(rp, ptrType(byteType()));
  579|     76|        } else {
  580|     76|#if LLVM_VERSION_MAJOR >= 18
  581|     76|          return builder()->CreateLoad(toLLVM(fty), rp, false);
  582|       |#elif LLVM_VERSION_MAJOR >= 16
  583|       |          return builder()->CreateLoad(rp->getType()->getPointerElementType(), rp, false);
  584|       |#else
  585|       |          return builder()->CreateLoad(rp, false);
  586|       |#endif
  587|     76|        }
  588|     76|      } else if (isLargeType(fty)) {
  589|     76|        return rp;
  590|     76|      } else {
  591|     76|#if LLVM_VERSION_MAJOR >= 18
  592|     76|        return builder()->CreateLoad(toLLVM(fty, true), rp, false);
  593|       |#elif LLVM_VERSION_MAJOR >= 16
  594|       |        return builder()->CreateLoad(rp->getType()->getPointerElementType(), rp, false);
  595|       |#else
  596|       |        return builder()->CreateLoad(rp, false);
  597|       |#endif
  598|     76|      }
  599|     76|    });
  600|     76|  }
_ZZNK6hobbes11compileExpF4withEPKNS_4ProjEENKUlRT_E_clIN4llvm11LLVMContextEEEPNS8_5ValueES5_:
  575|     76|    return withContext([&](auto&) -> llvm::Value* {
  576|     76|      if (auto* op = is<OpaquePtr>(fty)) {
  ------------------
  |  Branch (576:17): [True: 8, False: 68]
  ------------------
  577|      8|        if (op->storedContiguously()) {
  ------------------
  |  Branch (577:13): [True: 0, False: 8]
  ------------------
  578|      0|          return builder()->CreateBitCast(rp, ptrType(byteType()));
  579|      8|        } else {
  580|      8|#if LLVM_VERSION_MAJOR >= 18
  581|      8|          return builder()->CreateLoad(toLLVM(fty), rp, false);
  582|       |#elif LLVM_VERSION_MAJOR >= 16
  583|       |          return builder()->CreateLoad(rp->getType()->getPointerElementType(), rp, false);
  584|       |#else
  585|       |          return builder()->CreateLoad(rp, false);
  586|       |#endif
  587|      8|        }
  588|     68|      } else if (isLargeType(fty)) {
  ------------------
  |  Branch (588:18): [True: 9, False: 59]
  ------------------
  589|      9|        return rp;
  590|     59|      } else {
  591|     59|#if LLVM_VERSION_MAJOR >= 18
  592|     59|        return builder()->CreateLoad(toLLVM(fty, true), rp, false);
  593|       |#elif LLVM_VERSION_MAJOR >= 16
  594|       |        return builder()->CreateLoad(rp->getType()->getPointerElementType(), rp, false);
  595|       |#else
  596|       |        return builder()->CreateLoad(rp, false);
  597|       |#endif
  598|     59|      }
  599|     76|    });
_ZNK6hobbes11compileExpF4withEPKNS_6AssumpE:
  602|    588|  llvm::Value* with(const Assump* v) const override {
  603|       |    // because we explicitly discard these type assumptions before compilation, this case should never happen
  604|    588|    return switchOf(v->expr(), *this);
  605|    588|  }
_ZNK6hobbes11compileExpF4withEPKNS_4PackE:
  607|      5|  llvm::Value* with(const Pack* v) const override {
  608|      5|    llvm::Value* ev = compile(v->expr());
  609|      5|    llvm::Type*  et = toLLVM(requireMonotype(v->type()), true);
  610|       |
  611|      5|    return withContext([&](auto&) { return builder()->CreateBitCast(ev, et); });
  612|      5|  }
_ZZNK6hobbes11compileExpF4withEPKNS_4PackEENKUlRT_E_clIN4llvm11LLVMContextEEEDaS5_:
  611|      5|    return withContext([&](auto&) { return builder()->CreateBitCast(ev, et); });
_ZNK6hobbes11compileExpF4withEPKNS_6UnpackE:
  614|      5|  llvm::Value* with(const Unpack* v) const override {
  615|      5|    llvm::Value* var  = compile(v->package());
  616|      5|    llvm::Value* body = nullptr;
  617|       |
  618|      5|    try {
  619|      5|      beginScope(v->varName(), var);
  620|      5|      body = compile(v->expr());
  621|      5|      endScope();
  622|      5|    } catch (...) {
  623|      0|      endScope();
  624|      0|      throw;
  625|      0|    }
  626|       |
  627|      5|    return body;
  628|      5|  }
_ZN6hobbes16compileConstExpFC2EPNS_5jitccERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  806|    148|  compileConstExpF(jitcc* c, const std::string& vname) : vname(vname), c(c) { }
_ZNK6hobbes16compileConstExpF4withEPKNS_4CharE:
  810|    578|  llvm::Constant* with(const Char*   v) const override { return cvalue(v->value()); }
_ZNK6hobbes16compileConstExpF4withEPKNS_4ByteE:
  811|    128|  llvm::Constant* with(const Byte*   v) const override { return cvalue(v->value()); }
_ZNK6hobbes16compileConstExpF4withEPKNS_3IntE:
  813|      2|  llvm::Constant* with(const Int*    v) const override { return cvalue(v->value()); }
_ZNK6hobbes16compileConstExpF4withEPKNS_4LongE:
  814|      1|  llvm::Constant* with(const Long*   v) const override { return cvalue(v->value()); }
_ZNK6hobbes16compileConstExpF4withEPKNS_3LetE:
  830|      2|  llvm::Constant* with(const Let*) const override {
  831|      2|    return nullptr;
  832|      2|  }
_ZNK6hobbes16compileConstExpF4withEPKNS_2FnE:
  838|    134|  llvm::Constant* with(const Fn* v) const override {
  839|    134|    Func* fty = is<Func>(requireMonotype(v->type()));
  840|    134|    if (fty == nullptr) {
  ------------------
  |  Branch (840:9): [True: 0, False: 134]
  ------------------
  841|      0|      throw annotated_error(*v, "Internal compiler error, not a function type: " + show(v->type()));
  842|      0|    }
  843|       |
  844|    134|    try {
  845|    134|      this->c->pushScope();
  846|    134|      llvm::Function* f = this->c->compileFunction(this->vname, v->varNames(), fty->parameters(), v->body());
  847|    134|      this->c->popScope();
  848|    134|      return f;
  849|    134|    } catch (...) {
  850|      0|      this->c->popScope();
  851|      0|      throw;
  852|      0|    }
  853|    134|  }
_ZNK6hobbes16compileConstExpF4withEPKNS_7MkArrayE:
  863|      9|  llvm::Constant* with(const MkArray* v) const override {
  864|      9|    MonoTypePtr ty  = requireMonotype(v->type());
  865|      9|    auto*      aty = is<Array>(ty);
  866|      9|    if (aty == nullptr) {
  ------------------
  |  Branch (866:9): [True: 0, False: 9]
  ------------------
  867|      0|      throw annotated_error(*v, "Internal compiler error -- can't make array out of non-array type: " + show(ty));
  868|      0|    }
  869|       |
  870|      9|    Constants cs = switchOf(v->values(), *this);
  871|    706|    for (auto *c : cs) { if (c == nullptr) return nullptr; }
  ------------------
  |  Branch (871:18): [True: 706, False: 9]
  |  Branch (871:30): [True: 0, False: 706]
  ------------------
  872|       |
  873|      9|    llvm::Type* elemTy = toLLVM(aty->type(), false);
  874|      9|    llvm::StructType* saty = varArrayType(elemTy, cs.size());
  875|      9|    llvm::StructType* caty = varArrayType(elemTy);
  876|       |    
  877|      9|    return withContext([&](auto&) {
  878|      9|      return ccast(ptrType(caty),
  879|      9|        new llvm::GlobalVariable(
  880|      9|          *this->c->module(),
  881|      9|          saty,
  882|      9|          true,
  883|      9|          llvm::GlobalVariable::InternalLinkage,
  884|      9|          constArray(this->c->module(), cs, elemTy)
  885|      9|        )
  886|      9|      );
  887|      9|    });
  888|      9|  }
_ZZNK6hobbes16compileConstExpF4withEPKNS_7MkArrayEENKUlRT_E_clIN4llvm11LLVMContextEEEDaS5_:
  877|      9|    return withContext([&](auto&) {
  878|      9|      return ccast(ptrType(caty),
  879|      9|        new llvm::GlobalVariable(
  880|      9|          *this->c->module(),
  881|      9|          saty,
  882|      9|          true,
  883|      9|          llvm::GlobalVariable::InternalLinkage,
  884|      9|          constArray(this->c->module(), cs, elemTy)
  885|      9|        )
  886|      9|      );
  887|      9|    });
_ZNK6hobbes16compileConstExpF4withEPKNS_6AssumpE:
  926|    286|  llvm::Constant* with(const Assump* v) const override {
  927|    286|    return switchOf(v->expr(), *this);
  928|    286|  }

_ZN6hobbes14applyTypeDefnsERKSt10shared_ptrINS_6ModuleEEPNS_2ccERKS0_INS_8MonoTypeEE:
  147|  4.80k|MonoTypePtr applyTypeDefns(const ModulePtr &m, cc *e, const MonoTypePtr &t) {
  148|  4.80k|  auto ua = e->unappTyDefns.find(t);
  149|  4.80k|  if (ua != e->unappTyDefns.end())
  ------------------
  |  Branch (149:7): [True: 3.95k, False: 849]
  ------------------
  150|  3.95k|    return ua->second;
  151|       |
  152|    849|  MonoTypePtr r = switchOf(t, appTyDefnF(m, e));
  153|    849|  e->unappTyDefns[t] = r;
  154|    849|  return r;
  155|  4.80k|}
_ZN6hobbes14applyTypeDefnsERKSt10shared_ptrINS_6ModuleEEPNS_2ccERKSt6vectorIS0_INS_8MonoTypeEESaIS9_EE:
  157|    253|MonoTypes applyTypeDefns(const ModulePtr &m, cc *e, const MonoTypes &ts) {
  158|    253|  MonoTypes r;
  159|    607|  for (const auto &t : ts) {
  ------------------
  |  Branch (159:22): [True: 607, False: 253]
  ------------------
  160|    607|    r.push_back(applyTypeDefns(m, e, t));
  161|    607|  }
  162|    253|  return r;
  163|    253|}
_ZN6hobbes14applyTypeDefnsERKSt10shared_ptrINS_6ModuleEEPNS_2ccERKS0_INS_8QualTypeEE:
  165|  4.19k|QualTypePtr applyTypeDefns(const ModulePtr &m, cc *e, const QualTypePtr &t) {
  166|  4.19k|  Constraints cs;
  167|  4.19k|  for (const auto &c : t->constraints()) {
  ------------------
  |  Branch (167:22): [True: 253, False: 4.19k]
  ------------------
  168|    253|    cs.push_back(std::make_shared<Constraint>(
  169|    253|        c->name(), applyTypeDefns(m, e, c->arguments())));
  170|    253|  }
  171|  4.19k|  return std::make_shared<QualType>(cs, applyTypeDefns(m, e, t->monoType()));
  172|  4.19k|}
_ZN6hobbes14applyTypeDefnsERKSt10shared_ptrINS_6ModuleEEPNS_2ccERKS0_INS_9ModuleDefEE:
  200|  1.41k|ModuleDefPtr applyTypeDefns(const ModulePtr &m, cc *e, const ModuleDefPtr &md) {
  201|  1.41k|  return switchOf(md, appTyDefnMF(m, e));
  202|  1.41k|}
_ZN6hobbes12nameIndexingERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS6_EE:
  220|    718|NameIndexing nameIndexing(const str::seq &ns) {
  221|    718|  NameIndexing r;
  222|  1.80k|  for (size_t i = 0; i < ns.size(); ++i) {
  ------------------
  |  Branch (222:22): [True: 1.08k, False: 718]
  ------------------
  223|  1.08k|    if (r.find(ns[i]) != r.end()) {
  ------------------
  |  Branch (223:9): [True: 0, False: 1.08k]
  ------------------
  224|      0|      throw std::runtime_error("Duplicate name '" + ns[i] + "'");
  225|  1.08k|    } else {
  226|  1.08k|      r[ns[i]] = i;
  227|  1.08k|    }
  228|  1.08k|  }
  229|    718|  return r;
  230|    718|}
_ZN6hobbes12nameIndexingERKSt3setINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4lessIS6_ESaIS6_EE:
  232|    621|NameIndexing nameIndexing(const std::set<std::string> &ns) {
  233|    621|  return nameIndexing(str::seq(ns.begin(), ns.end()));
  234|    621|}
_ZN6hobbes9nameIndexERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiSt4lessIS6_ESaISt4pairIKS6_iEEERSA_:
  236|    162|int nameIndex(const NameIndexing &ns, const std::string &vn) {
  237|    162|  auto ni = ns.find(vn);
  238|    162|  if (ni == ns.end()) {
  ------------------
  |  Branch (238:7): [True: 0, False: 162]
  ------------------
  239|      0|    throw std::runtime_error("Undefined type name, '" + vn + "'");
  240|    162|  } else {
  241|    162|    return ni->second;
  242|    162|  }
  243|    162|}
_ZN6hobbes9nameIndexERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiSt4lessIS6_ESaISt4pairIKS6_iEEERKSt6vectorIS6_SaIS6_EE:
  245|     60|std::vector<int> nameIndex(const NameIndexing &ns, const str::seq &vns) {
  246|     60|  std::vector<int> r;
  247|     86|  for (const auto &vn : vns) {
  ------------------
  |  Branch (247:23): [True: 86, False: 60]
  ------------------
  248|     86|    r.push_back(nameIndex(ns, vn));
  249|     86|  }
  250|     60|  return r;
  251|     60|}
_ZN6hobbes12substitutionERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiSt4lessIS6_ESaISt4pairIKS6_iEEE:
  253|     97|MonoTypeSubst substitution(const NameIndexing &ns) {
  254|     97|  MonoTypeSubst s;
  255|    196|  for (const auto &n : ns) {
  ------------------
  |  Branch (255:22): [True: 196, False: 97]
  ------------------
  256|    196|    s[n.first] = MonoTypePtr(TGen::make(n.second));
  257|    196|  }
  258|     97|  return s;
  259|     97|}
_ZN6hobbes12resolveNamesERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiSt4lessIS6_ESaISt4pairIKS6_iEEERKS9_ISt6vectorIS6_SaIS6_EESI_EPSG_IS9_ISG_IiSaIiEEiESaISO_EE:
  271|     60|                  FunDeps *out) {
  272|     60|  VarIDs lhs = nameIndex(ns, nfdep.first);
  273|     76|  for (const auto &vn : nfdep.second) {
  ------------------
  |  Branch (273:23): [True: 76, False: 60]
  ------------------
  274|     76|    out->push_back(FunDep(lhs, nameIndex(ns, vn)));
  275|     76|  }
  276|     60|}
_ZN6hobbes12resolveNamesERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiSt4lessIS6_ESaISt4pairIKS6_iEEERKSt6vectorIS9_ISG_IS6_SaIS6_EESI_ESaISJ_EE:
  278|     97|FunDeps resolveNames(const NameIndexing &ns, const CFunDepDefs &nfdeps) {
  279|     97|  FunDeps r;
  280|     97|  for (const auto &nfdep : nfdeps) {
  ------------------
  |  Branch (280:26): [True: 60, False: 97]
  ------------------
  281|     60|    resolveNames(ns, nfdep, &r);
  282|     60|  }
  283|     97|  return r;
  284|     97|}
_ZN6hobbes14resolveMembersERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEESt4lessIS6_ESaISt4pairIKS6_S9_EEERKSt6vectorIS7_INS_11MVarTypeDefEESaISL_EE:
  288|     97|                               const MVarTypeDefs &mvtds) {
  289|     97|  TClass::Members r;
  290|     97|  for (const auto &mvtd : mvtds) {
  ------------------
  |  Branch (290:25): [True: 95, False: 97]
  ------------------
  291|     95|    if (r.find(mvtd->varName()) != r.end()) {
  ------------------
  |  Branch (291:9): [True: 0, False: 95]
  ------------------
  292|      0|      throw annotated_error(*mvtd, "Duplicate class member name, '" +
  293|      0|                                       mvtd->varName() + "'");
  294|     95|    } else {
  295|     95|      r[mvtd->varName()] = requireMonotype(substitute(s, mvtd->varType()));
  296|     95|    }
  297|     95|  }
  298|     97|  return r;
  299|     97|}
_ZN6hobbes7compileERKSt10shared_ptrINS_6ModuleEEPNS_2ccEPKNS_8ClassDefE:
  302|     97|void compile(const ModulePtr &, cc *e, const ClassDef *cd) {
  303|     97|  try {
  304|     97|    NameIndexing tns = nameIndexing(cd->vars());
  305|     97|    MonoTypeSubst s = substitution(tns);
  306|     97|    Constraints reqs = substitute(s, cd->constraints());
  307|     97|    FunDeps fds = resolveNames(tns, cd->fundeps());
  308|     97|    TClass::Members mems = resolveMembers(s, cd->members());
  309|       |
  310|     97|    e->typeEnv()->bind(
  311|     97|        cd->name(),
  312|     97|        UnqualifierPtr(new TClass(
  313|     97|            reqs, cd->name(), tns.size(), mems,
  314|     97|            mergeFundeps(inferFundeps(e->typeEnv(), reqs), fds), cd->la())));
  315|     97|  } catch (std::exception &ex) {
  316|      0|    throw annotated_error(*cd, ex.what());
  317|      0|  }
  318|     97|}
_ZN6hobbes14compileMembersB5cxx11ERKSt10shared_ptrINS_6ModuleEEPNS_15MonoTypeUnifierERKS0_INS_6TClassEERKSt6vectorIS0_INS_8MonoTypeEESaISD_EEPNS_2ccERKSB_IS0_INS_7MVarDefEESaISL_EEb:
  323|    621|                             const MVarDefs &ds, bool asfn) {
  324|       |  // Class X => Instance Y, X unify Y applied to class member types should yield
  325|       |  // instance member types
  326|    621|  MonoTypes cargs = freshTypeVars(c->typeVars());
  327|    621|  mgu(targs, cargs, u);
  328|       |
  329|       |  // compile each member symbol binding
  330|    621|  MemberMapping ms;
  331|    747|  for (const auto &d : ds) {
  ------------------
  |  Branch (331:22): [True: 747, False: 621]
  ------------------
  332|    747|    std::string n = d->varWithArgs()[0];
  333|       |
  334|    747|    if (ms.find(n) != ms.end()) {
  ------------------
  |  Branch (334:9): [True: 0, False: 747]
  ------------------
  335|      0|      throw annotated_error(*d, "Duplicate instance member name, '" + n + "'");
  336|      0|    }
  337|       |
  338|       |    // generate the expression for the member definition
  339|    747|    bool gendef = d->varWithArgs().size() > 1;
  340|    747|    ExprPtr mexp;
  341|    747|    if (gendef) {
  ------------------
  |  Branch (341:9): [True: 520, False: 227]
  ------------------
  342|    520|      Fn::VarNames vns(d->varWithArgs().begin() + 1, d->varWithArgs().end());
  343|    520|      mexp = ExprPtr(new Fn(vns, d->varExpr(), d->la()));
  344|    520|    } else {
  345|    227|      mexp = d->varExpr();
  346|    227|    }
  347|    747|    mexp = translateExprWithOpts(m, mexp);
  348|       |
  349|       |    // determine how to store this member depending on whether we're making an
  350|       |    // instance function, or if we're generating a new function for a ground
  351|       |    // instance
  352|    747|    if (asfn) {
  ------------------
  |  Branch (352:9): [True: 472, False: 275]
  ------------------
  353|    472|      ms[n] = mexp;
  354|    472|    } else {
  355|    275|      MonoTypePtr expectedMemberType =
  356|    275|          instantiate(u->substitute(cargs), c->memberType(n));
  357|       |
  358|    275|      if (!gendef) {
  ------------------
  |  Branch (358:11): [True: 162, False: 113]
  ------------------
  359|    162|        ms[n] = e->normalize(assume(mexp, expectedMemberType, mexp->la()));
  360|    162|      } else {
  361|    113|        std::string fn = "." + n + freshName();
  362|    113|        e->define(fn, assume(mexp, expectedMemberType, mexp->la()));
  363|    113|        ms[n] = e->normalize(ExprPtr(new Var(fn, mexp->la())));
  364|    113|      }
  365|    275|    }
  366|    747|  }
  367|    621|  return ms;
  368|    621|}
_ZN6hobbes7compileERKSt10shared_ptrINS_6ModuleEEPNS_2ccEPKNS_11InstanceDefE:
  371|    621|void compile(const ModulePtr &m, cc *e, const InstanceDef *id) {
  372|    621|  try {
  373|    621|    UnqualifierPtr tyc = e->typeEnv()->lookupUnqualifier(id->className());
  374|    621|    TClassPtr c = std::dynamic_pointer_cast<TClass>(tyc);
  375|       |
  376|    621|    if (c.get() == nullptr) {
  ------------------
  |  Branch (376:9): [True: 0, False: 621]
  ------------------
  377|      0|      throw std::runtime_error("Cannot define overload in '" + id->className() +
  378|      0|                               "', class does not exist.");
  379|      0|    }
  380|       |
  381|    621|    MonoTypeUnifier u(e->typeEnv());
  382|       |
  383|    621|    NameIndexing tns = nameIndexing(tvarNames(id->args()));
  384|    621|    MonoTypes targs = id->args();
  385|    621|    bool asfn = !id->constraints().empty() || !tvarNames(targs).empty();
  ------------------
  |  Branch (385:17): [True: 286, False: 335]
  |  Branch (385:47): [True: 100, False: 235]
  ------------------
  386|    621|    MemberMapping ms = compileMembers(m, &u, c, targs, e, id->members(), asfn);
  387|       |
  388|       |    // is this a ground instance or an instance function?
  389|    621|    if (!asfn) {
  ------------------
  |  Branch (389:9): [True: 235, False: 386]
  ------------------
  390|    235|      Definitions ds;
  391|    235|      try {
  392|    235|        c->insert(
  393|    235|            e->typeEnv(),
  394|    235|            std::make_shared<TCInstance>(id->className(), targs, ms, id->la()),
  395|    235|            &ds);
  396|    235|        e->drainUnqualifyDefs(ds);
  397|    235|      } catch (...) {
  398|      0|        e->drainUnqualifyDefs(ds);
  399|      0|        throw;
  400|      0|      }
  401|    386|    } else {
  402|    386|      c->insert(std::make_shared<TCInstanceFn>(
  403|    386|          id->className(), id->constraints(), targs, ms, id->la()));
  404|    386|    }
  405|    621|  } catch (annotated_error &) {
  406|      0|    throw;
  407|      0|  } catch (std::exception &ex) {
  408|      0|    throw annotated_error(*id, ex.what());
  409|      0|  }
  410|    621|}
_ZN6hobbes13forceMonotypeEPNS_2ccERKSt10shared_ptrINS_8QualTypeEERKNS_17LexicalAnnotationE:
  426|     13|                          const LexicalAnnotation &la) {
  427|     13|  MonoTypeUnifier u(e->typeEnv());
  428|     13|  Definitions ds;
  429|     13|  while (refine(e->typeEnv(), qt->constraints(), &u, &ds)) {
  ------------------
  |  Branch (429:10): [True: 0, False: 13]
  ------------------
  430|      0|    e->drainUnqualifyDefs(ds);
  431|      0|    ds.clear();
  432|      0|  }
  433|     13|  e->drainUnqualifyDefs(ds);
  434|     13|  ds.clear();
  435|       |
  436|       |  // make sure that the output type exists and is realizable
  437|     13|  if (hobbes::satisfied(e->typeEnv(), qt->constraints(), &ds)) {
  ------------------
  |  Branch (437:7): [True: 13, False: 0]
  ------------------
  438|     13|    e->drainUnqualifyDefs(ds);
  439|     13|    return u.substitute(qt->monoType());
  440|     13|  } else {
  441|      0|    throw annotated_error(la, "Cannot resolve qualifications in type");
  442|      0|  }
  443|     13|}
_ZN6hobbes7compileERKSt10shared_ptrINS_6ModuleEEPNS_2ccEPKNS_8MTypeDefE:
  445|     13|void compile(const ModulePtr &, cc *e, const MTypeDef *mtd) {
  446|     13|  switch (mtd->visibility()) {
  447|      4|  case MTypeDef::Transparent:
  ------------------
  |  Branch (447:3): [True: 4, False: 9]
  ------------------
  448|      4|    e->defineTypeAlias(mtd->name(), mtd->arguments(),
  449|      4|                       forceMonotype(e, mtd->type(), mtd->la()));
  450|      4|    break;
  451|      9|  case MTypeDef::Opaque:
  ------------------
  |  Branch (451:3): [True: 9, False: 4]
  ------------------
  452|      9|    e->defineNamedType(mtd->name(), mtd->arguments(),
  453|      9|                       forceMonotype(e, mtd->type(), mtd->la()));
  454|      9|    break;
  455|      0|  default:
  ------------------
  |  Branch (455:3): [True: 0, False: 13]
  ------------------
  456|      0|    break;
  457|     13|  }
  458|     13|}
_ZN6hobbes7compileERKSt10shared_ptrINS_6ModuleEEPNS_2ccEPKNS_7MVarDefE:
  461|    277|void compile(const ModulePtr &m, cc *e, const MVarDef *mvd) {
  462|    277|  ExprPtr vde = translateExprWithOpts(
  463|    277|      m, (mvd->varWithArgs().size() == 1)
  ------------------
  |  Branch (463:10): [True: 11, False: 266]
  ------------------
  464|    277|             ? mvd->varExpr()
  465|    277|             : ExprPtr(new Fn(Fn::VarNames(mvd->varWithArgs().begin() + 1,
  466|    266|                                           mvd->varWithArgs().end()),
  467|    266|                              mvd->varExpr(), mvd->la())));
  468|       |
  469|       |  // make sure that globals with inaccessible names (evaluated for side-effects)
  470|       |  // have monomorphic type (otherwise they'll quietly fail to run)
  471|    277|  if (!mvd->varWithArgs().empty() && !mvd->varWithArgs()[0].empty() &&
  ------------------
  |  Branch (471:7): [True: 277, False: 0]
  |  Branch (471:38): [True: 277, False: 0]
  ------------------
  472|    277|      mvd->varWithArgs()[0][0] == '.') {
  ------------------
  |  Branch (472:7): [True: 0, False: 277]
  ------------------
  473|      0|    requireMonotype(e->typeEnv(),
  474|      0|                    e->unsweetenExpression(mvd->varWithArgs()[0], vde));
  475|      0|  }
  476|       |
  477|       |  // ok we're fine, define this variable
  478|    277|  e->define(mvd->varWithArgs()[0], vde);
  479|    277|}
_ZN6hobbes7compileERKSt10shared_ptrINS_6ModuleEEPNS_2ccEPKNS_11MVarTypeDefE:
  482|    260|void compile(const ModulePtr &, cc *e, const MVarTypeDef *vtd) {
  483|    260|  try {
  484|    260|    e->forwardDeclare(vtd->varName(), vtd->varType());
  485|    260|  } catch (std::exception &ex) {
  486|      0|    throw annotated_error(*vtd, ex.what());
  487|      0|  }
  488|    260|}
_ZN6hobbes7SafeSet11setUnsafeFnERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  741|     93|void SafeSet::setUnsafeFn(std::string const &varName) {
  742|     93|  SafeExpr::with([varName](SafeExpr::Map &m) {
  743|     93|    auto &v = m[varName];
  744|     93|    v.varName() = varName;
  745|     93|    v.varStatus() = SafeExpr::Status::UnSafe;
  746|     93|  });
  747|     93|}
_ZN6hobbes7SafeSet9setSafeFnERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  749|     57|void SafeSet::setSafeFn(std::string const &varName) {
  750|     57|  SafeExpr::with([varName](SafeExpr::Map &m) {
  751|     57|    auto &v = m[varName];
  752|     57|    v.varName() = varName;
  753|     57|    v.varStatus() = SafeExpr::Status::Safe;
  754|     57|  });
  755|     57|}
_ZN6hobbes7compileERKSt10shared_ptrINS_6ModuleEEPNS_2ccEPKNS_16MUnsafePragmaDefE:
  915|     93|void compile(const ModulePtr &, cc *, const MUnsafePragmaDef *mpd) {
  916|     93|  SafeSet::setUnsafeFn(mpd->symbolValue());
  917|     93|  SafeExpr::with([&](SafeExpr::Map &m) {
  918|     93|    auto &v = m[mpd->symbolValue()];
  919|     93|    v.la() = mpd->la();
  920|     93|  });
  921|     93|}
_ZN6hobbes7compileERKSt10shared_ptrINS_6ModuleEEPNS_2ccEPKNS_14MSafePragmaDefE:
  925|     57|void compile(const ModulePtr &m, cc *, const MSafePragmaDef *mpd) {
  926|       |  // SafeSet::setSafeFn marks the name Safe in process-wide state, and the
  927|       |  // deny check treats a Safe entry as not deny-listed at all -- so a module
  928|       |  // consisting of nothing but {-# SAFE pexec #-} used to lift the denial for
  929|       |  // the rest of the process, at the prompt and in every module loaded after
  930|       |  // it. Pragmas are applied after the definition loop, so the module itself
  931|       |  // never had to name the primitive to do it. A module cannot be allowed to
  932|       |  // do that while it is itself being compiled under Safe (STRFR-434028).
  933|     57|  if (safeInEffect(m)) {
  ------------------
  |  Branch (933:7): [True: 0, False: 57]
  ------------------
  934|      0|    throw annotated_error(mpd->la(),
  935|      0|      "{-# SAFE " + mpd->symbolValue() + " #-} is not allowed while 'option Safe' is in effect: "
  936|      0|      "a module cannot lift a Safe-mode denial for the process that loaded it");
  937|      0|  }
  938|     57|  SafeSet::setSafeFn(mpd->symbolValue());
  939|     57|  SafeExpr::with([&](SafeExpr::Map &m) {
  940|     57|    auto &v = m[mpd->symbolValue()];
  941|     57|    v.la() = mpd->la();
  942|     57|  });
  943|     57|}
_ZN6hobbes7compileEPNS_2ccERKSt10shared_ptrINS_6ModuleEESt8functionIFbvEE:
  989|     27|void compile(cc *e, const ModulePtr &m, std::function<bool()> stopFn) {
  990|     27|  ScopedModuleOptions _opts(e, m);
  991|       |
  992|  1.41k|  for (const auto& tmd : m->definitions()) {
  ------------------
  |  Branch (992:24): [True: 1.41k, False: 27]
  ------------------
  993|  1.41k|    if (stopFn()) {
  ------------------
  |  Branch (993:9): [True: 0, False: 1.41k]
  ------------------
  994|      0|      return;
  995|      0|    }
  996|  1.41k|    ModuleDefPtr md;
  997|  1.41k|    try {
  998|  1.41k|      md = applyTypeDefns(m, e, tmd);
  999|  1.41k|    } catch (const annotated_error &) {
 1000|      0|      throw;
 1001|      0|    } catch (const std::exception &ex) {
 1002|      0|      throw annotated_error(*tmd, ex.what());
 1003|      0|    }
 1004|       |
 1005|  1.41k|    if (const MImport *imp = is<MImport>(md)) {
  ------------------
  |  Branch (1005:24): [True: 0, False: 1.41k]
  ------------------
 1006|      0|      compile(m, e, imp);
 1007|  1.41k|    } else if (const ClassDef *cd = is<ClassDef>(md)) {
  ------------------
  |  Branch (1007:32): [True: 97, False: 1.32k]
  ------------------
 1008|     97|      compile(m, e, cd);
 1009|  1.32k|    } else if (const InstanceDef *id = is<InstanceDef>(md)) {
  ------------------
  |  Branch (1009:35): [True: 621, False: 700]
  ------------------
 1010|    621|      compile(m, e, id);
 1011|    700|    } else if (const MTypeDef *td = is<MTypeDef>(md)) {
  ------------------
  |  Branch (1011:32): [True: 13, False: 687]
  ------------------
 1012|     13|      compile(m, e, td);
 1013|    687|    } else if (const MVarDef *vd = is<MVarDef>(md)) {
  ------------------
  |  Branch (1013:31): [True: 277, False: 410]
  ------------------
 1014|    277|      compile(m, e, vd);
 1015|    410|    } else if (const MVarTypeDef *vtd = is<MVarTypeDef>(md)) {
  ------------------
  |  Branch (1015:35): [True: 260, False: 150]
  ------------------
 1016|    260|      compile(m, e, vtd);
 1017|    260|    } else if (const MUnsafePragmaDef *vpd = is<MUnsafePragmaDef>(md)) {
  ------------------
  |  Branch (1017:40): [True: 93, False: 57]
  ------------------
 1018|     93|      (void)vpd;
 1019|     93|    } else if (const MSafePragmaDef *vpd = is<MSafePragmaDef>(md)) {
  ------------------
  |  Branch (1019:38): [True: 57, False: 0]
  ------------------
 1020|     57|      (void)vpd;
 1021|     57|    } else {
 1022|      0|      throw std::runtime_error("Cannot compile module definition: " + show(md));
 1023|      0|    }
 1024|  1.41k|  }
 1025|       |
 1026|       |  // compile unsafe pragma
 1027|  1.41k|  for (const auto& tmd : m->definitions()) {
  ------------------
  |  Branch (1027:24): [True: 1.41k, False: 27]
  ------------------
 1028|  1.41k|    if (stopFn()) {
  ------------------
  |  Branch (1028:9): [True: 0, False: 1.41k]
  ------------------
 1029|      0|      return;
 1030|      0|    }
 1031|  1.41k|    if (const MUnsafePragmaDef *vpd = is<MUnsafePragmaDef>(tmd)) {
  ------------------
  |  Branch (1031:33): [True: 93, False: 1.32k]
  ------------------
 1032|     93|      compile(m, e, vpd);
 1033|     93|    }
 1034|  1.41k|  }
 1035|       |
 1036|       |  // compile safe pragma
 1037|  1.41k|  for (const auto& tmd : m->definitions()) {
  ------------------
  |  Branch (1037:24): [True: 1.41k, False: 27]
  ------------------
 1038|  1.41k|    if (stopFn()) {
  ------------------
  |  Branch (1038:9): [True: 0, False: 1.41k]
  ------------------
 1039|      0|      return;
 1040|      0|    }
 1041|  1.41k|    if (const MSafePragmaDef *vpd = is<MSafePragmaDef>(tmd)) {
  ------------------
  |  Branch (1041:31): [True: 57, False: 1.36k]
  ------------------
 1042|     57|      compile(m, e, vpd);
 1043|     57|    }
 1044|  1.41k|  }
 1045|       |
 1046|       |  // generate unsafe transitive closure
 1047|  1.41k|  for (const auto& tmd : m->definitions()) {
  ------------------
  |  Branch (1047:24): [True: 1.41k, False: 27]
  ------------------
 1048|  1.41k|    if (stopFn()) {
  ------------------
  |  Branch (1048:9): [True: 0, False: 1.41k]
  ------------------
 1049|      0|      return;
 1050|      0|    }
 1051|  1.41k|    if (const MVarDef *vd = is<MVarDef>(tmd)) {
  ------------------
  |  Branch (1051:24): [True: 277, False: 1.14k]
  ------------------
 1052|    277|      switchOf(vd->varExpr(), buildTransitiveUnsafePragmaClosure(*vd));
 1053|    277|    }
 1054|  1.41k|  }
 1055|     27|}
_ZN6hobbes21translateExprWithOptsERKSt10shared_ptrINS_6ModuleEERKS0_INS_4ExprEE:
 1220|  1.02k|ExprPtr translateExprWithOpts(const ModulePtr &m, const ExprPtr &e) {
 1221|  1.02k|  return translateExprWithOpts(m->options(), e);
 1222|  1.02k|}
_ZN6hobbes21translateExprWithOptsERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS6_EERKSt10shared_ptrINS_4ExprEERKSt8functionIFvRKS6_EE:
 1226|  1.02k|    std::function<void(std::string const &)> const &exceptionFn) {
 1227|  1.02k|  auto dispatch =
 1228|  1.02k|      std::map<std::string,
 1229|  1.02k|               std::function<ExprPtr(std::string const &, const ExprPtr &)>>{
 1230|  1.02k|          {"Safe",
 1231|  1.02k|           [&exceptionFn](std::string const &, const ExprPtr &e) -> ExprPtr {
 1232|  1.02k|             auto ms = makeSafe();
 1233|  1.02k|             auto r = switchOf(e, ms);
 1234|  1.02k|             if (!ms.collectUnsafes.empty()) {
 1235|  1.02k|               exceptionFn(ms.show());
 1236|  1.02k|             };
 1237|  1.02k|             return r;
 1238|  1.02k|           }},
 1239|  1.02k|          {"SafeArrays",
 1240|  1.02k|           [](std::string const &, const ExprPtr &e) -> ExprPtr {
 1241|  1.02k|             return switchOf(e, makeSafeArrays());
 1242|  1.02k|           }},
 1243|  1.02k|          {"IgnoreUnreachableMatches",
 1244|  1.02k|           [](std::string const &, const ExprPtr &e) -> ExprPtr {
 1245|  1.02k|             return e;
 1246|  1.02k|           }},
 1247|  1.02k|      };
 1248|  1.02k|  thread_local auto ignoreFn = [](std::string const &optName,
 1249|  1.02k|                                  const ExprPtr &e) -> ExprPtr {
 1250|  1.02k|    throw std::runtime_error("unsupported option, " + optName);
 1251|  1.02k|    return e;
 1252|  1.02k|  };
 1253|       |
 1254|  1.02k|  ExprPtr r = e;
 1255|  1.02k|  for (const auto &opt : opts) {
  ------------------
  |  Branch (1255:24): [True: 0, False: 1.02k]
  ------------------
 1256|      0|    r = dispatch.insert(std::make_pair(opt, ignoreFn)).first->second(opt, r);
 1257|      0|  }
 1258|  1.02k|  return r;
 1259|  1.02k|}
_ZN6hobbes10appTyDefnFC2ERKSt10shared_ptrINS_6ModuleEEPNS_2ccE:
  102|    849|  appTyDefnF(const ModulePtr &m, cc *e) : m(m), e(e) {}
_ZNK6hobbes10appTyDefnF4withEPKNS_4TVarE:
  103|  1.68k|  MonoTypePtr with(const TVar *v) const override {
  104|  1.68k|    const auto &tn = v->name();
  105|       |
  106|  1.68k|    if (isPrimName(tn)) {
  ------------------
  |  Branch (106:9): [True: 0, False: 1.68k]
  ------------------
  107|      0|      return e->replaceTypeAliases(Prim::make(tn));
  108|  1.68k|    } else if (e->isTypeAliasName(tn)) {
  ------------------
  |  Branch (108:16): [True: 0, False: 1.68k]
  ------------------
  109|       |      // an alias with parameters only means something applied to arguments
  110|       |      // (the applied form is resolved by with(TApp)); bare, it would survive
  111|       |      // as an opaque primitive that nothing can satisfy
  112|      0|      size_t n = e->typeAliasArity(tn);
  113|      0|      if (n > 0) {
  ------------------
  |  Branch (113:11): [True: 0, False: 0]
  ------------------
  114|      0|        throw std::runtime_error(
  115|      0|            "The type alias '" + tn + "' takes " + str::from(n) + " type argument" +
  116|      0|            (n == 1 ? "" : "s") + " but is used here without any (apply it in "
  ------------------
  |  Branch (116:14): [True: 0, False: 0]
  ------------------
  117|      0|            "parentheses, as '(" + tn + " t)')");
  118|      0|      }
  119|      0|      return e->replaceTypeAliases(Prim::make(tn));
  120|  1.68k|    } else if (e->isTypeName(tn)) {
  ------------------
  |  Branch (120:16): [True: 40, False: 1.64k]
  ------------------
  121|     40|      return Prim::make(tn, e->namedTypeRepresentation(tn));
  122|  1.64k|    } else {
  123|  1.64k|      return TVar::make(tn);
  124|  1.64k|    }
  125|  1.68k|  }
_ZNK6hobbes10appTyDefnF4withEPKNS_4TAppE:
  127|    109|  MonoTypePtr with(const TApp *ap) const override {
  128|       |    // the constructor of an application that names an alias is expanded
  129|       |    // together with its arguments below, so it is not a bare use
  130|    109|    MonoTypePtr f;
  131|    109|    if (const TVar *fv = is<TVar>(ap->fn())) {
  ------------------
  |  Branch (131:21): [True: 45, False: 64]
  ------------------
  132|     45|      if (e->isTypeAliasName(fv->name())) {
  ------------------
  |  Branch (132:11): [True: 20, False: 25]
  ------------------
  133|     20|        f = Prim::make(fv->name());
  134|     20|      }
  135|     45|    }
  136|    109|    if (!f) {
  ------------------
  |  Branch (136:9): [True: 89, False: 20]
  ------------------
  137|     89|      f = switchOf(ap->fn(), *this);
  138|     89|    }
  139|    109|    return e->replaceTypeAliases(TApp::make(f, switchOf(ap->args(), *this)));
  140|    109|  }
_ZN6hobbes11appTyDefnMFC2ERKSt10shared_ptrINS_6ModuleEEPNS_2ccE:
  192|  1.41k|  appTyDefnMF(const ModulePtr &m, cc *e) : m(m), e(e) {}
_ZNK6hobbes11appTyDefnMF6withTyERKSt10shared_ptrINS_8QualTypeEE:
  193|  4.19k|  QualTypePtr withTy(const QualTypePtr &t) const override {
  194|  4.19k|    if (t)
  ------------------
  |  Branch (194:9): [True: 4.19k, False: 0]
  ------------------
  195|  4.19k|      return applyTypeDefns(this->m, this->e, t);
  196|      0|    else
  197|      0|      return t;
  198|  4.19k|  }
_ZN6hobbes8SafeExpr4withERKSt8functionIFvRSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_10UnsafeDefsESt4lessIS8_ESaISt4pairIKS8_S9_EEEEE:
  534|    961|  static auto with(std::function<void(Map &)> const &mapModifier) -> void {
  535|    961|    instance()._with(mapModifier);
  536|    961|  };
_ZN6hobbes8SafeExpr8instanceEv:
  561|  5.14k|  static auto instance() -> SafeExpr & {
  562|       |    // pexec/writefile/removefile/openfd/readfile/fdReadLine (bin/hi/funcdefs.C)
  563|       |    // and linkTarget/slurpFile (bin/hi/www.C) are process/filesystem
  564|       |    // primitives meant for "local evaluations" (funcdefs.C's own comment)
  565|       |    // but bound into the same compiler context handed to hi's
  566|       |    // unauthenticated net REPL and web server; deny-listing them here is
  567|       |    // what makes 'option Safe' (on by default, bin/hi/evaluator.H) actually
  568|       |    // withhold them from those remote surfaces (STRFR-433924).
  569|       |    //
  570|       |    // fdReadLine reads a caller-chosen fd number rather than a path, so
  571|       |    // denying openfd doesn't make it inert on its own: a guessed low fd in
  572|       |    // an event-driven server can already be open for something else (e.g.
  573|       |    // another client's in-flight connection socket), letting one request
  574|       |    // read bytes that belong to a different connection.
  575|  5.14k|    thread_local SafeExpr ms{Map{{"element", {"element", "elementM"}},
  576|  5.14k|                                 {"newArray", {"newArray", {}}},
  577|  5.14k|                                 {"newPrim", {"newPrim", {}}},
  578|  5.14k|                                 {"newPrimZ", {"newPrimZ", {}}},
  579|  5.14k|                                 {"unsafeCast", {"unsafeCast", {}}},
  580|       |                                 // 'element' above is rewritten to elementM,
  581|       |                                 // which bounds the index (boot/amapping.hob:
  582|       |                                 // elementM x i = getElementByIndex(x, saelem,
  583|       |                                 // i, size(x))). saelem and saacopy are the
  584|       |                                 // raw accessors that rewrite is built out of:
  585|       |                                 // saelem emits a bare GEP+load at a
  586|       |                                 // caller-chosen index, and saacopy memCopy's
  587|       |                                 // a caller-chosen number of bytes into the
  588|       |                                 // fixed array, neither with any bound. Naming
  589|       |                                 // them directly walks around the checked
  590|       |                                 // wrapper, so they cannot pass Safe either.
  591|       |                                 // ('salength' is not here: it returns the
  592|       |                                 // static length and touches no memory.)
  593|  5.14k|                                 {"saelem", {"saelem", {}}},
  594|  5.14k|                                 {"saacopy", {"saacopy", {}}},
  595|       |                                 // stdstrelem is the same shape for the
  596|       |                                 // <std.string> Array instance: a bare GEP+load
  597|       |                                 // at a caller-chosen index (func.C,
  598|       |                                 // stdstrelemF), wrapped by that instance's
  599|       |                                 // bounds-checking elementM (amapping.hob:
  600|       |                                 // elementM x i = getElementByIndex(x,
  601|       |                                 // stdstrelem, i, stdstrsize(x))). Naming it
  602|       |                                 // directly walks around the check, the same
  603|       |                                 // way saelem does for [:a|n:] (STRFR-434029).
  604|       |                                 // stdstrsize, like salength, only reads the
  605|       |                                 // size and is left alone.
  606|  5.14k|                                 {"stdstrelem", {"stdstrelem", {}}},
  607|       |                                 // cstrelem is the same shape again for the
  608|       |                                 // <char> C-string Array instance: a bare
  609|       |                                 // x[i] load at a caller-chosen index
  610|       |                                 // (funcdefs.C, cstrelem), wrapped by that instance's
  611|       |                                 // bounds-checking elementM (amapping.hob:
  612|       |                                 // elementM x i = getElementByIndex(x,
  613|       |                                 // cstrelem, i, cstrlen(x))). C strings are an
  614|       |                                 // ordinary Safe-visible type, so its raw
  615|       |                                 // accessor is denied too. (cptrrefby, the raw
  616|       |                                 // accessor for the (<char>*long)/(long*<char>)
  617|       |                                 // pointer-pair instances, is the same shape
  618|       |                                 // but the finding scopes it out as an accepted
  619|       |                                 // follow-up, so it is left for that ticket.)
  620|  5.14k|                                 {"cstrelem", {"cstrelem", {}}},
  621|       |                                 // and 'unsafeSetLength' writes a
  622|       |                                 // caller-chosen long into a variable-length
  623|       |                                 // array's length field (func.C, asetlen),
  624|       |                                 // which is the very bound elementM checks
  625|       |                                 // against for [a] (size = length). Leaving it
  626|       |                                 // reachable makes the rewrite of 'element'
  627|       |                                 // decoration too: set the length, then index
  628|       |                                 // within the length you just claimed.
  629|  5.14k|                                 {"unsafeSetLength", {"unsafeSetLength", {}}},
  630|       |                                 // raw-pointer Client bridges (generated-code
  631|       |                                 // only; both current dot-prefixed and legacy
  632|       |                                 // plain names) must never pass Safe mode
  633|  5.14k|                                 {"unsafeClientRead", {"unsafeClientRead", {}}},
  634|  5.14k|                                 {"unsafeAppendClientReadFn", {"unsafeAppendClientReadFn", {}}},
  635|  5.14k|                                 {".unsafeClientRead", {".unsafeClientRead", {}}},
  636|  5.14k|                                 {".unsafeAppendClientReadFn", {".unsafeAppendClientReadFn", {}}},
  637|  5.14k|                                 {".printConnection", {".printConnection", {}}},
  638|  5.14k|                                 {"pexec", {"pexec", {}}},
  639|  5.14k|                                 {"writefile", {"writefile", {}}},
  640|  5.14k|                                 {"removefile", {"removefile", {}}},
  641|  5.14k|                                 {"openfd", {"openfd", {}}},
  642|  5.14k|                                 {"readfile", {"readfile", {}}},
  643|  5.14k|                                 {"fdReadLine", {"fdReadLine", {}}},
  644|  5.14k|                                 {"linkTarget", {"linkTarget", {}}},
  645|  5.14k|                                 {"slurpFile", {"slurpFile", {}}},
  646|       |                                 // closefd is openfd's twin and closes a
  647|       |                                 // caller-chosen descriptor number. Denying
  648|       |                                 // openfd but not this one leaves the same
  649|       |                                 // fd-guessing problem fdReadLine is denied
  650|       |                                 // for, in the other direction: closefd(5)
  651|       |                                 // can shut another in-flight client's
  652|       |                                 // socket, the listener itself, or a storage
  653|       |                                 // descriptor whose number the next open then
  654|       |                                 // reuses.
  655|  5.14k|                                 {"closefd", {"closefd", {}}},
  656|       |                                 // the structured-storage entry points open a
  657|       |                                 // caller-named path too: writeFileRT does
  658|       |                                 // 'new writer(fname)' on whatever string it
  659|       |                                 // is handed (db/bindings.C), and both are
  660|       |                                 // bound as ordinary user-nameable functions.
  661|       |                                 // The content an untrusted caller controls
  662|       |                                 // is weaker than writefile's -- the bytes
  663|       |                                 // are hobbes storage format, not arbitrary
  664|       |                                 // text -- but creating or clobbering a file
  665|       |                                 // at a chosen path is the same capability
  666|       |                                 // the names above are denied for. Both the
  667|       |                                 // plain names and the dot-prefixed bridges
  668|       |                                 // they compile down to have to be listed.
  669|       |                                 //
  670|       |                                 // Note this does not close off learning
  671|       |                                 // whether a path exists: a (LoadFile "path"
  672|       |                                 // t) annotation still opens an input file
  673|       |                                 // during constraint resolution, and only the
  674|       |                                 // write side of that is gated
  675|       |                                 // (cc::enableFileWrites). What it closes is
  676|       |                                 // creating and clobbering by name.
  677|  5.14k|                                 {"writeFile", {"writeFile", {}}},
  678|  5.14k|                                 {"readFile", {"readFile", {}}},
  679|  5.14k|                                 {".writeFileRT", {".writeFileRT", {}}},
  680|  5.14k|                                 {".readFileRT", {".readFileRT", {}}}}};
  681|  5.14k|    return ms;
  682|  5.14k|  }
_ZN6hobbes8SafeExpr10UnsafeDefsC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES9_:
  496|     28|        : var(var), fn(fn_), status(Status::UnSafe) {}
_ZN6hobbes8SafeExprC2ERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_10UnsafeDefsESt4lessIS7_ESaISt4pairIKS7_S8_EEE:
  685|      1|  SafeExpr(Map const &map) : map(map) {}
_ZN6hobbes8SafeExpr5_withERKSt8functionIFvRSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_10UnsafeDefsESt4lessIS8_ESaISt4pairIKS8_S9_EEEEE:
  546|    961|  auto _with(std::function<void(Map &)> const &mapModifier) -> void {
  547|    961|    mapModifier(map);
  548|    961|  }
cmodule.C:_ZN6hobbesL12safeInEffectERKSt10shared_ptrINS_6ModuleEE:
  984|     57|static bool safeInEffect(const ModulePtr& m) {
  985|     57|  const auto& os = m->options();
  986|     57|  return std::find(os.begin(), os.end(), std::string("Safe")) != os.end();
  987|     57|}
cmodule.C:_ZN6hobbes12_GLOBAL__N_119ScopedModuleOptionsC2EPNS_2ccESt10shared_ptrINS_6ModuleEE:
  968|     27|  ScopedModuleOptions(cc *e, ModulePtr m) : m(std::move(m)), saved(this->m->options()) {
  969|     27|    std::vector<std::string> merged = this->saved;
  970|     27|    for (const auto& o : e->moduleOptions()) {
  ------------------
  |  Branch (970:24): [True: 0, False: 27]
  ------------------
  971|      0|      if (std::find(merged.begin(), merged.end(), o) == merged.end()) {
  ------------------
  |  Branch (971:11): [True: 0, False: 0]
  ------------------
  972|      0|        merged.push_back(o);
  973|      0|      }
  974|      0|    }
  975|     27|    this->m->setOptions(merged);
  976|     27|  }
_ZN6hobbes34buildTransitiveUnsafePragmaClosureC2ERKNS_7MVarDefE:
  791|    277|  buildTransitiveUnsafePragmaClosure(MVarDef const &mvd) : mvd(mvd) {}
_ZNK6hobbes34buildTransitiveUnsafePragmaClosure4withEPKNS_3VarE:
  807|  4.18k|  details::Bool with(const Var *v) const override {
  808|  4.18k|    return SafeExpr::with<bool>(
  809|  4.18k|        v->value(),
  810|  4.18k|        [&](const SafeExpr::UnsafeDefs &) {
  811|  4.18k|          SafeExpr::with([&](SafeExpr::Map &m) {
  812|  4.18k|            auto varName = mvd.varWithArgs()[0];
  813|  4.18k|            auto r = m.insert({varName, {}});
  814|  4.18k|            auto &var = r.first->second;
  815|  4.18k|            if (r.second) {
  816|  4.18k|              var.varName() = varName;
  817|  4.18k|              var.la() = mvd.la();
  818|  4.18k|            }
  819|  4.18k|            auto &status = var.varStatus();
  820|  4.18k|            if (status != SafeExpr::Status::Safe) {
  821|  4.18k|              status = SafeExpr::Status::UnSafe;
  822|  4.18k|              var.unSafeRefs().insert(v->value());
  823|  4.18k|            }
  824|  4.18k|          });
  825|  4.18k|          return true;
  826|  4.18k|        },
  827|  4.18k|        []() { return false; });
  828|  4.18k|  }
_ZN6hobbes8SafeExpr4withIbEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt8functionIFS2_RKNS0_10UnsafeDefsEEERKSB_IFS2_vEE:
  541|  4.18k|                   std::function<R(void)> const &miss) -> R {
  542|  4.18k|    return instance()._with(n, hit, miss);
  543|  4.18k|  }
_ZN6hobbes8SafeExpr5_withIbEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt8functionIFS2_RKNS0_10UnsafeDefsEEERKSB_IFS2_vEE:
  553|  4.18k|             std::function<R(void)> const &miss) -> R {
  554|  4.18k|    auto it = map.find(n);
  555|  4.18k|    if (it != std::end(map) && it->second.varStatus() != SafeExpr::Status::Safe)
  ------------------
  |  Branch (555:9): [True: 437, False: 3.75k]
  |  Branch (555:9): [True: 384, False: 3.80k]
  |  Branch (555:32): [True: 384, False: 53]
  ------------------
  556|    384|      return hit(it->second);
  557|  3.80k|    else
  558|  3.80k|      return miss();
  559|  4.18k|  }
_ZN6hobbes8SafeExpr10UnsafeDefs9varStatusEv:
  507|    971|    Status &varStatus() { return status; }
_ZZNK6hobbes34buildTransitiveUnsafePragmaClosure4withEPKNS_3VarEENKUlRKNS_8SafeExpr10UnsafeDefsEE_clES7_:
  810|    384|        [&](const SafeExpr::UnsafeDefs &) {
  811|    384|          SafeExpr::with([&](SafeExpr::Map &m) {
  812|    384|            auto varName = mvd.varWithArgs()[0];
  813|    384|            auto r = m.insert({varName, {}});
  814|    384|            auto &var = r.first->second;
  815|    384|            if (r.second) {
  816|    384|              var.varName() = varName;
  817|    384|              var.la() = mvd.la();
  818|    384|            }
  819|    384|            auto &status = var.varStatus();
  820|    384|            if (status != SafeExpr::Status::Safe) {
  821|    384|              status = SafeExpr::Status::UnSafe;
  822|    384|              var.unSafeRefs().insert(v->value());
  823|    384|            }
  824|    384|          });
  825|    384|          return true;
  826|    384|        },
_ZZZNK6hobbes34buildTransitiveUnsafePragmaClosure4withEPKNS_3VarEENKUlRKNS_8SafeExpr10UnsafeDefsEE_clES7_ENKUlRSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_St4lessISF_ESaISt4pairIKSF_S5_EEEE_clESN_:
  811|    384|          SafeExpr::with([&](SafeExpr::Map &m) {
  812|    384|            auto varName = mvd.varWithArgs()[0];
  813|    384|            auto r = m.insert({varName, {}});
  814|    384|            auto &var = r.first->second;
  815|    384|            if (r.second) {
  ------------------
  |  Branch (815:17): [True: 24, False: 360]
  ------------------
  816|     24|              var.varName() = varName;
  817|     24|              var.la() = mvd.la();
  818|     24|            }
  819|    384|            auto &status = var.varStatus();
  820|    384|            if (status != SafeExpr::Status::Safe) {
  ------------------
  |  Branch (820:17): [True: 283, False: 101]
  ------------------
  821|    283|              status = SafeExpr::Status::UnSafe;
  822|    283|              var.unSafeRefs().insert(v->value());
  823|    283|            }
  824|    384|          });
_ZN6hobbes8SafeExpr10UnsafeDefsC2Ev:
  494|    534|    UnsafeDefs() = default;
_ZN6hobbes8SafeExpr10UnsafeDefs7varNameB5cxx11Ev:
  505|    174|    std::string &varName() { return var; }
_ZN6hobbes8SafeExpr10UnsafeDefs2laEv:
  508|    174|    LexicalAnnotation &la() { return lexAnno; }
_ZN6hobbes8SafeExpr10UnsafeDefs10unSafeRefsB5cxx11Ev:
  506|    283|    std::set<std::string> &unSafeRefs() { return closure; }
_ZZNK6hobbes34buildTransitiveUnsafePragmaClosure4withEPKNS_3VarEENKUlvE_clEv:
  827|  3.80k|        []() { return false; });
_ZN6hobbes7details4BoolC2Eb:
  779|  7.89k|  Bool(bool v) : i(v ? 1 : 0) {}
  ------------------
  |  Branch (779:20): [True: 4.09k, False: 3.80k]
  ------------------
_ZNK6hobbes34buildTransitiveUnsafePragmaClosure4withEPKNS_3LetE:
  829|    455|  details::Bool with(const Let *v) const override {
  830|    455|    switchOf(v->varExpr(), *this);
  831|    455|    switchOf(v->bodyExpr(), *this);
  832|    455|    return true;
  833|    455|  }
_ZNK6hobbes34buildTransitiveUnsafePragmaClosure4withEPKNS_6LetRecE:
  834|      4|  details::Bool with(const LetRec *v) const override {
  835|      4|    str::set vns = toSet(v->varNames());
  836|      4|    LetRec::Bindings bs;
  837|      4|    for (const auto &b : v->bindings()) {
  ------------------
  |  Branch (837:24): [True: 4, False: 4]
  ------------------
  838|      4|      switchOf(b.second, *this);
  839|      4|    }
  840|      4|    switchOf(v->bodyExpr(), *this);
  841|      4|    return true;
  842|      4|  }
_ZNK6hobbes34buildTransitiveUnsafePragmaClosure4withEPKNS_2FnE:
  843|     47|  details::Bool with(const Fn *v) const override {
  844|     47|    switchOf(v->body(), *this);
  845|     47|    return true;
  846|     47|  }
_ZNK6hobbes34buildTransitiveUnsafePragmaClosure4withEPKNS_3AppE:
  847|  1.78k|  details::Bool with(const App *v) const override {
  848|  1.78k|    switchOf(v->fn(), *this);
  849|  1.78k|    switchOf(v->args(), *this);
  850|  1.78k|    return true;
  851|  1.78k|  }
_ZNK6hobbes34buildTransitiveUnsafePragmaClosure4withEPKNS_6AssignE:
  852|     72|  details::Bool with(const Assign *v) const override {
  853|     72|    switchOf(v->left(), *this);
  854|     72|    switchOf(v->right(), *this);
  855|     72|    return true;
  856|     72|  }
_ZNK6hobbes34buildTransitiveUnsafePragmaClosure4withEPKNS_7MkArrayE:
  857|     45|  details::Bool with(const MkArray *v) const override {
  858|     45|    switchOf(v->values(), *this);
  859|     45|    return true;
  860|     45|  }
_ZNK6hobbes34buildTransitiveUnsafePragmaClosure4withEPKNS_9MkVariantE:
  861|     31|  details::Bool with(const MkVariant *v) const override {
  862|     31|    switchOf(v->value(), *this);
  863|     31|    return true;
  864|     31|  }
_ZNK6hobbes34buildTransitiveUnsafePragmaClosure4withEPKNS_8MkRecordE:
  865|     43|  details::Bool with(const MkRecord *v) const override {
  866|     43|    switchOf(v->fields(), *this);
  867|     43|    return true;
  868|     43|  }
_ZNK6hobbes34buildTransitiveUnsafePragmaClosure4withEPKNS_6AIndexE:
  869|    174|  details::Bool with(const AIndex *) const override { return true; }
_ZNK6hobbes34buildTransitiveUnsafePragmaClosure4withEPKNS_4CaseE:
  870|     37|  details::Bool with(const Case *v) const override {
  871|     37|    const Case::Bindings &cbs = v->bindings();
  872|     37|    Case::Bindings rcbs;
  873|     56|    for (const auto &cb : cbs) {
  ------------------
  |  Branch (873:25): [True: 56, False: 37]
  ------------------
  874|     56|      switchOf(cb.exp, *this);
  875|     56|    }
  876|     37|    ExprPtr de = v->defaultExpr();
  877|     37|    if (de.get() != nullptr) {
  ------------------
  |  Branch (877:9): [True: 18, False: 19]
  ------------------
  878|     18|      switchOf(de, *this);
  879|     18|    }
  880|     37|    switchOf(v->variant(), *this);
  881|     37|    return true;
  882|     37|  }
_ZNK6hobbes34buildTransitiveUnsafePragmaClosure4withEPKNS_6SwitchE:
  883|      4|  details::Bool with(const Switch *v) const override {
  884|      4|    Switch::Bindings rsbs;
  885|      8|    for (const auto& sb : v->bindings()) {
  ------------------
  |  Branch (885:25): [True: 8, False: 4]
  ------------------
  886|      8|      switchOf(sb.exp, *this);
  887|      8|    }
  888|      4|    ExprPtr de = v->defaultExpr();
  889|      4|    if (de) {
  ------------------
  |  Branch (889:9): [True: 4, False: 0]
  ------------------
  890|      4|      switchOf(de, *this);
  891|      4|    }
  892|      4|    switchOf(v->expr(), *this);
  893|      4|    return true;
  894|      4|  }
_ZNK6hobbes34buildTransitiveUnsafePragmaClosure4withEPKNS_4ProjE:
  895|    149|  details::Bool with(const Proj *v) const override {
  896|    149|    switchOf(v->record(), *this);
  897|    149|    return true;
  898|    149|  }
_ZNK6hobbes34buildTransitiveUnsafePragmaClosure4withEPKNS_6AssumpE:
  899|     70|  details::Bool with(const Assump *v) const override {
  900|     70|    switchOf(v->expr(), *this);
  901|     70|    return true;
  902|     70|  }
_ZNK6hobbes34buildTransitiveUnsafePragmaClosure4withEPKNS_6UnpackE:
  907|      1|  details::Bool with(const Unpack *v) const override {
  908|      1|    switchOf(v->package(), *this);
  909|      1|    switchOf(v->expr(), *this);
  910|      1|    return true;
  911|      1|  }
_ZNK6hobbes34buildTransitiveUnsafePragmaClosure9withConstEPKNS_4ExprE:
  806|    786|  details::Bool withConst(const Expr *) const override { return true; };
_ZN6hobbes34buildTransitiveUnsafePragmaClosureD2Ev:
  793|    277|  ~buildTransitiveUnsafePragmaClosure() {
  794|    277|    SafeExpr::with([&](SafeExpr::Map &m) {
  795|    277|      auto iter = m.find(mvd.varWithArgs()[0]);
  796|    277|      if (iter != m.end()) {
  797|    277|        auto &var = iter->second;
  798|    277|        std::stringstream ss;
  799|    277|        mvd.show(ss);
  800|    277|        var.exprDef() = ss.str();
  801|    277|      }
  802|    277|    });
  803|    277|  }
_ZZN6hobbes34buildTransitiveUnsafePragmaClosureD1EvENKUlRSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS_8SafeExpr10UnsafeDefsESt4lessIS7_ESaISt4pairIKS7_S9_EEEE_clESH_:
  794|    277|    SafeExpr::with([&](SafeExpr::Map &m) {
  795|    277|      auto iter = m.find(mvd.varWithArgs()[0]);
  796|    277|      if (iter != m.end()) {
  ------------------
  |  Branch (796:11): [True: 174, False: 103]
  ------------------
  797|    174|        auto &var = iter->second;
  798|    174|        std::stringstream ss;
  799|    174|        mvd.show(ss);
  800|    174|        var.exprDef() = ss.str();
  801|    174|      }
  802|    277|    });
_ZN6hobbes8SafeExpr10UnsafeDefs7exprDefB5cxx11Ev:
  509|    174|    std::string &exprDef() { return typeDesc; }
cmodule.C:_ZN6hobbes12_GLOBAL__N_119ScopedModuleOptionsD2Ev:
  977|     27|  ~ScopedModuleOptions() { this->m->setOptions(this->saved); }
cmodule.C:_ZZN6hobbes7SafeSet11setUnsafeFnERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEENK3$_0clERSt3mapIS6_NS_8SafeExpr10UnsafeDefsESt4lessIS6_ESaISt4pairIS7_SC_EEE:
  742|     93|  SafeExpr::with([varName](SafeExpr::Map &m) {
  743|     93|    auto &v = m[varName];
  744|     93|    v.varName() = varName;
  745|     93|    v.varStatus() = SafeExpr::Status::UnSafe;
  746|     93|  });
cmodule.C:_ZZN6hobbes7SafeSet9setSafeFnERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEENK3$_0clERSt3mapIS6_NS_8SafeExpr10UnsafeDefsESt4lessIS6_ESaISt4pairIS7_SC_EEE:
  750|     57|  SafeExpr::with([varName](SafeExpr::Map &m) {
  751|     57|    auto &v = m[varName];
  752|     57|    v.varName() = varName;
  753|     57|    v.varStatus() = SafeExpr::Status::Safe;
  754|     57|  });
cmodule.C:_ZZN6hobbes7compileERKSt10shared_ptrINS_6ModuleEEPNS_2ccEPKNS_16MUnsafePragmaDefEENK3$_0clERSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS_8SafeExpr10UnsafeDefsESt4lessISH_ESaISt4pairIKSH_SJ_EEE:
  917|     93|  SafeExpr::with([&](SafeExpr::Map &m) {
  918|     93|    auto &v = m[mpd->symbolValue()];
  919|     93|    v.la() = mpd->la();
  920|     93|  });
cmodule.C:_ZZN6hobbes7compileERKSt10shared_ptrINS_6ModuleEEPNS_2ccEPKNS_14MSafePragmaDefEENK3$_0clERSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS_8SafeExpr10UnsafeDefsESt4lessISH_ESaISt4pairIKSH_SJ_EEE:
  939|     57|  SafeExpr::with([&](SafeExpr::Map &m) {
  940|     57|    auto &v = m[mpd->symbolValue()];
  941|     57|    v.la() = mpd->la();
  942|     57|  });

_ZN6hobbes8llvmPrimERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
    9|     22|llvm::Type* llvmPrim(const std::string& name) {
   10|     22|  if (name == "unit") {
  ------------------
  |  Branch (10:7): [True: 1, False: 21]
  ------------------
   11|      1|    return voidType();
   12|     21|  } else if (name == "void") {
  ------------------
  |  Branch (12:14): [True: 0, False: 21]
  ------------------
   13|       |    // this type is impossible to construct, so we might as well say it's anything
   14|      0|    return ptrType(byteType());
   15|     21|  } else if (name == "bool") {
  ------------------
  |  Branch (15:14): [True: 2, False: 19]
  ------------------
   16|      2|    return boolType();
   17|     19|  } else if (name == "char") {
  ------------------
  |  Branch (17:14): [True: 2, False: 17]
  ------------------
   18|      2|    return charType();
   19|     17|  } else if (name == "byte") {
  ------------------
  |  Branch (19:14): [True: 2, False: 15]
  ------------------
   20|      2|    return byteType();
   21|     15|  } else if (name == "short") {
  ------------------
  |  Branch (21:14): [True: 2, False: 13]
  ------------------
   22|      2|    return shortType();
   23|     13|  } else if (name == "int") {
  ------------------
  |  Branch (23:14): [True: 2, False: 11]
  ------------------
   24|      2|    return intType();
   25|     11|  } else if (name == "long") {
  ------------------
  |  Branch (25:14): [True: 5, False: 6]
  ------------------
   26|      5|    return longType();
   27|      6|  } else if (name == "int128") {
  ------------------
  |  Branch (27:14): [True: 2, False: 4]
  ------------------
   28|      2|    return int128Type();
   29|      4|  } else if (name == "float") {
  ------------------
  |  Branch (29:14): [True: 2, False: 2]
  ------------------
   30|      2|    return floatType();
   31|      2|  } else if (name == "double") {
  ------------------
  |  Branch (31:14): [True: 2, False: 0]
  ------------------
   32|      2|    return doubleType();
   33|      2|  } else {
   34|      0|    throw std::runtime_error("Can't convert type to LLVM, unknown primitive type: " + name);
   35|      0|  }
   36|     22|}
_ZN6hobbes14llvmVarArrTypeEPN4llvm4TypeEi:
   39|     27|llvm::Type* llvmVarArrType(llvm::Type* elemty, int size) {
   40|     27|  return recordType(longType(), arrayType(elemty, size));
   41|     27|}
_ZN6hobbes6toLLVMERKSt10shared_ptrINS_8MonoTypeEEb:
  188|  4.83k|llvm::Type* toLLVM(const MonoTypePtr& ty, bool asArg) {
  189|  4.83k|  if (isUnit(ty)) {
  ------------------
  |  Branch (189:7): [True: 139, False: 4.69k]
  ------------------
  190|    139|    return voidType();
  191|  4.69k|  } else {
  192|  4.69k|    return translateType(ty, asArg);
  193|  4.69k|  }
  194|  4.83k|}
_ZN6hobbes6toLLVMERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS3_EEb:
  196|  1.00k|Types toLLVM(const MonoTypes& tys, bool asArg) {
  197|  1.00k|  Types r;
  198|  2.42k|  for (const auto &ty : tys) {
  ------------------
  |  Branch (198:23): [True: 2.42k, False: 1.00k]
  ------------------
  199|  2.42k|    if (!asArg || !isUnit(ty)) {
  ------------------
  |  Branch (199:9): [True: 0, False: 2.42k]
  |  Branch (199:19): [True: 2.29k, False: 128]
  ------------------
  200|  2.29k|      r.push_back(toLLVM(ty, asArg));
  201|  2.29k|    }
  202|  2.42k|  }
  203|  1.00k|  return r;
  204|  1.00k|}
ctype.C:_ZN6hobbesL13translateTypeERKSt10shared_ptrINS_8MonoTypeEEb:
  177|  4.89k|static llvm::Type* translateType(const MonoTypePtr& ty, bool asArg) {
  178|  4.89k|  const size_t i = asArg ? 1 : 0;
  ------------------
  |  Branch (178:20): [True: 3.60k, False: 1.29k]
  ------------------
  179|  4.89k|  if (ty->llvmTypeMemo[i] != nullptr) {
  ------------------
  |  Branch (179:7): [True: 4.45k, False: 440]
  ------------------
  180|  4.45k|    return static_cast<llvm::Type*>(ty->llvmTypeMemo[i]);
  181|  4.45k|  }
  182|       |
  183|    440|  llvm::Type* r = switchOf(ty, translateTypeF(asArg));
  184|    440|  ty->llvmTypeMemo[i] = r;
  185|    440|  return r;
  186|  4.89k|}
_ZN6hobbes14translateTypeFC2Eb:
   56|    440|  translateTypeF(bool asArg) : asArg(asArg) { }
_ZNK6hobbes14translateTypeF4withEPKNS_4PrimE:
   58|     26|  llvm::Type* with(const Prim* v) const override {
   59|     26|    if (v->representation().get() != nullptr) {
  ------------------
  |  Branch (59:9): [True: 4, False: 22]
  ------------------
   60|      4|      return switchOf(v->representation(), *this);
   61|     22|    } else {
   62|     22|      return llvmPrim(v->name());
   63|     22|    }
   64|     26|  }
_ZNK6hobbes14translateTypeF4withEPKNS_9OpaquePtrE:
   66|     10|  llvm::Type* with(const OpaquePtr* v) const override {
   67|     10|    if (!asArg && v->storedContiguously()) {
  ------------------
  |  Branch (67:9): [True: 2, False: 8]
  |  Branch (67:19): [True: 0, False: 2]
  ------------------
   68|      0|      return arrayType(byteType(), v->size());
   69|     10|    } else {
   70|     10|      return ptrType(byteType());
   71|     10|    }
   72|     10|  }
_ZNK6hobbes14translateTypeF4withEPKNS_4TAppE:
   86|      2|  llvm::Type* with(const TApp* v) const override {
   87|       |    // TODO: fold these special cases into TApp/TFn applications
   88|      2|    if (const Prim* f = is<Prim>(v->fn())) {
  ------------------
  |  Branch (88:21): [True: 2, False: 0]
  ------------------
   89|      2|      if (f->name() == "->" && v->args().size() == 2) {
  ------------------
  |  Branch (89:11): [True: 0, False: 2]
  |  Branch (89:32): [True: 0, False: 0]
  ------------------
   90|      0|        return switchOf(MonoTypePtr(Func::make(v->args()[0], v->args()[1])), *this);
   91|      2|      } else if (f->name() == "[]" && v->args().size() == 1) {
  ------------------
  |  Branch (91:18): [True: 0, False: 2]
  |  Branch (91:39): [True: 0, False: 0]
  ------------------
   92|      0|        return switchOf(MonoTypePtr(Array::make(v->args()[0])), *this);
   93|      2|      } else if (f->name() == "list" && v->args().size() == 1) {
  ------------------
  |  Branch (93:18): [True: 0, False: 2]
  |  Branch (93:41): [True: 0, False: 0]
  ------------------
   94|      0|        return switchOf(MonoTypePtr(Recursive::make("x", sumtype(primty("unit"), tuplety(list(v->args()[0], tvar("x")))))), *this);
   95|      2|      } else if (f->name() == "file") {
  ------------------
  |  Branch (95:18): [True: 1, False: 1]
  ------------------
   96|      1|        return longType();
   97|      1|      } else if (f->name() == "fileref") {
  ------------------
  |  Branch (97:18): [True: 0, False: 1]
  ------------------
   98|      0|        return longType();
   99|      1|      } else if (f->name() == "process") {
  ------------------
  |  Branch (99:18): [True: 0, False: 1]
  ------------------
  100|      0|        return longType();
  101|      1|      } else if (f->name() == "connection") {
  ------------------
  |  Branch (101:18): [True: 0, False: 1]
  ------------------
  102|      0|        return voidType();
  103|      1|      } else if (f->name() == "quote") {
  ------------------
  |  Branch (103:18): [True: 0, False: 1]
  ------------------
  104|      0|        return voidType();
  105|      1|      } else if (f->name() == "promise") {
  ------------------
  |  Branch (105:18): [True: 0, False: 1]
  ------------------
  106|      0|        return longType();
  107|      1|      } else if (const TAbs* tf = is<TAbs>(f->representation())) {
  ------------------
  |  Branch (107:30): [True: 1, False: 0]
  ------------------
  108|      1|        return switchOf(substitute(substitution(tf->args(), v->args()), tf->body()), *this);
  109|      1|      }
  110|      2|    }
  111|      0|    throw std::runtime_error("Can't translate to LLVM monotype: " + show(v));
  112|      2|  }
_ZNK6hobbes14translateTypeF4withEPKNS_10FixedArrayE:
  114|      5|  llvm::Type* with(const FixedArray* v) const override {
  115|      5|    bool innerPtrs = is<Func>(v->type()) != nullptr;
  116|      5|    return asPtrIf(arrayType(translateType(v->type(), innerPtrs), v->requireLength()), asArg);
  117|      5|  }
_ZN6hobbes14translateTypeF7asPtrIfEPN4llvm4TypeEb:
  172|    399|  static llvm::Type* asPtrIf(llvm::Type* ty, bool asptr) {
  173|    399|    return asptr ? ptrType(ty) : ty;
  ------------------
  |  Branch (173:12): [True: 119, False: 280]
  ------------------
  174|    399|  }
_ZNK6hobbes14translateTypeF4withEPKNS_5ArrayE:
  119|     24|  llvm::Type* with(const Array* v) const override {
  120|     24|    bool innerPtrs = (is<OpaquePtr>(v->type()) != nullptr) || (is<Func>(v->type()) != nullptr);
  ------------------
  |  Branch (120:22): [True: 0, False: 24]
  |  Branch (120:63): [True: 0, False: 24]
  ------------------
  121|     24|    return asPtrIf(llvmVarArrType(translateType(v->type(), innerPtrs)), true);
  122|     24|  }
_ZNK6hobbes14translateTypeF4withEPKNS_7VariantE:
  124|     29|  llvm::Type* with(const Variant* v) const override {
  125|     29|    return asPtrIf(arrayType(byteType(), v->size()), asArg);
  126|     29|  }
_ZNK6hobbes14translateTypeF4withEPKNS_6RecordE:
  128|     66|  llvm::Type* with(const Record* v) const override {
  129|     66|    const Record::Members& ams = v->alignedMembers();
  130|       |
  131|     66|    Types cms;
  132|    171|    for (const auto &am : ams) {
  ------------------
  |  Branch (132:25): [True: 171, False: 66]
  ------------------
  133|       |      // some types go into records as pointers
  134|    171|      if (!isUnit(am.type)) {
  ------------------
  |  Branch (134:11): [True: 171, False: 0]
  ------------------
  135|    171|        cms.push_back(translateType(am.type, (is<Func>(am.type) != nullptr) || (is<Array>(am.type) != nullptr)));
  ------------------
  |  Branch (135:46): [True: 20, False: 151]
  |  Branch (135:80): [True: 26, False: 125]
  ------------------
  136|    171|      }
  137|    171|    }
  138|       |
  139|     66|    if (cms.empty()) {
  ------------------
  |  Branch (139:9): [True: 0, False: 66]
  ------------------
  140|      0|      return llvmPrim("unit");
  141|     66|    } else {
  142|     66|      return asPtrIf(packedRecordType(cms), asArg);
  143|     66|    }
  144|     66|  }
_ZNK6hobbes14translateTypeF4withEPKNS_4FuncE:
  146|    275|  llvm::Type* with(const Func* v) const override {
  147|    275|    return asPtrIf(functionType(toLLVM(v->parameters(), true), toLLVM(v->result(), true)), asArg);
  148|    275|  }
_ZNK6hobbes14translateTypeF4withEPKNS_6ExistsE:
  150|      5|  llvm::Type* with(const Exists* v) const override {
  151|      5|    return toLLVM(unpackedType(v), true);
  152|      5|  }
_ZNK6hobbes14translateTypeF4withEPKNS_9RecursiveE:
  154|      3|  llvm::Type* with(const Recursive*) const override {
  155|      3|    return ptrType(byteType());
  156|      3|  }

_ZN6hobbes16initDefOperatorsEPNS_2ccE:
 1284|      1|void initDefOperators(cc* c) {
 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
 1287|       |
 1288|      1|  DEC(not); DEC(bnot);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(not); DEC(bnot);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
 1289|       |
 1290|      1|  DEC(b2i); DEC(b2l); DEC(i2d); DEC(i2l); DEC(l2d); DEC(l2i16); DEC(l2f);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(b2i); DEC(b2l); DEC(i2d); DEC(i2l); DEC(l2d); DEC(l2i16); DEC(l2f);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(b2i); DEC(b2l); DEC(i2d); DEC(i2l); DEC(l2d); DEC(l2i16); DEC(l2f);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(b2i); DEC(b2l); DEC(i2d); DEC(i2l); DEC(l2d); DEC(l2i16); DEC(l2f);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(b2i); DEC(b2l); DEC(i2d); DEC(i2l); DEC(l2d); DEC(l2i16); DEC(l2f);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(b2i); DEC(b2l); DEC(i2d); DEC(i2l); DEC(l2d); DEC(l2i16); DEC(l2f);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(b2i); DEC(b2l); DEC(i2d); DEC(i2l); DEC(l2d); DEC(l2i16); DEC(l2f);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
 1291|      1|  DEC(s2i); DEC(i2f); DEC(f2d);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(s2i); DEC(i2f); DEC(f2d);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(s2i); DEC(i2f); DEC(f2d);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
 1292|       |  
 1293|      1|  DEC(tl2i); DEC(ti2s); DEC(ti2b); DEC(tl2b);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(tl2i); DEC(ti2s); DEC(ti2b); DEC(tl2b);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(tl2i); DEC(ti2s); DEC(ti2b); DEC(tl2b);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(tl2i); DEC(ti2s); DEC(ti2b); DEC(tl2b);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
 1294|       |
 1295|      1|  DEC(sneg); DEC(ineg); DEC(lneg); DEC(i16neg); DEC(fneg); DEC(dneg);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(sneg); DEC(ineg); DEC(lneg); DEC(i16neg); DEC(fneg); DEC(dneg);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(sneg); DEC(ineg); DEC(lneg); DEC(i16neg); DEC(fneg); DEC(dneg);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(sneg); DEC(ineg); DEC(lneg); DEC(i16neg); DEC(fneg); DEC(dneg);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(sneg); DEC(ineg); DEC(lneg); DEC(i16neg); DEC(fneg); DEC(dneg);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(sneg); DEC(ineg); DEC(lneg); DEC(i16neg); DEC(fneg); DEC(dneg);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
 1296|       |
 1297|      1|  DEC(ceq);   DEC(cneq);   DEC(clt);   DEC(clte);   DEC(cgt);   DEC(cgte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(ceq);   DEC(cneq);   DEC(clt);   DEC(clte);   DEC(cgt);   DEC(cgte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(ceq);   DEC(cneq);   DEC(clt);   DEC(clte);   DEC(cgt);   DEC(cgte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(ceq);   DEC(cneq);   DEC(clt);   DEC(clte);   DEC(cgt);   DEC(cgte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(ceq);   DEC(cneq);   DEC(clt);   DEC(clte);   DEC(cgt);   DEC(cgte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(ceq);   DEC(cneq);   DEC(clt);   DEC(clte);   DEC(cgt);   DEC(cgte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
 1298|      1|  DEC(beq);   DEC(bneq);   DEC(blt);   DEC(blte);   DEC(bgt);   DEC(bgte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(beq);   DEC(bneq);   DEC(blt);   DEC(blte);   DEC(bgt);   DEC(bgte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(beq);   DEC(bneq);   DEC(blt);   DEC(blte);   DEC(bgt);   DEC(bgte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(beq);   DEC(bneq);   DEC(blt);   DEC(blte);   DEC(bgt);   DEC(bgte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(beq);   DEC(bneq);   DEC(blt);   DEC(blte);   DEC(bgt);   DEC(bgte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(beq);   DEC(bneq);   DEC(blt);   DEC(blte);   DEC(bgt);   DEC(bgte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
 1299|      1|  DEC(seq);   DEC(sneq);   DEC(slt);   DEC(slte);   DEC(sgt);   DEC(sgte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(seq);   DEC(sneq);   DEC(slt);   DEC(slte);   DEC(sgt);   DEC(sgte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(seq);   DEC(sneq);   DEC(slt);   DEC(slte);   DEC(sgt);   DEC(sgte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(seq);   DEC(sneq);   DEC(slt);   DEC(slte);   DEC(sgt);   DEC(sgte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(seq);   DEC(sneq);   DEC(slt);   DEC(slte);   DEC(sgt);   DEC(sgte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(seq);   DEC(sneq);   DEC(slt);   DEC(slte);   DEC(sgt);   DEC(sgte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
 1300|      1|  DEC(ieq);   DEC(ineq);   DEC(ilt);   DEC(ilte);   DEC(igt);   DEC(igte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(ieq);   DEC(ineq);   DEC(ilt);   DEC(ilte);   DEC(igt);   DEC(igte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(ieq);   DEC(ineq);   DEC(ilt);   DEC(ilte);   DEC(igt);   DEC(igte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(ieq);   DEC(ineq);   DEC(ilt);   DEC(ilte);   DEC(igt);   DEC(igte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(ieq);   DEC(ineq);   DEC(ilt);   DEC(ilte);   DEC(igt);   DEC(igte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(ieq);   DEC(ineq);   DEC(ilt);   DEC(ilte);   DEC(igt);   DEC(igte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
 1301|      1|  DEC(leq);   DEC(lneq);   DEC(llt);   DEC(llte);   DEC(lgt);   DEC(lgte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(leq);   DEC(lneq);   DEC(llt);   DEC(llte);   DEC(lgt);   DEC(lgte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(leq);   DEC(lneq);   DEC(llt);   DEC(llte);   DEC(lgt);   DEC(lgte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(leq);   DEC(lneq);   DEC(llt);   DEC(llte);   DEC(lgt);   DEC(lgte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(leq);   DEC(lneq);   DEC(llt);   DEC(llte);   DEC(lgt);   DEC(lgte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(leq);   DEC(lneq);   DEC(llt);   DEC(llte);   DEC(lgt);   DEC(lgte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
 1302|      1|  DEC(i16eq); DEC(i16neq); DEC(i16lt); DEC(i16lte); DEC(i16gt); DEC(i16gte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(i16eq); DEC(i16neq); DEC(i16lt); DEC(i16lte); DEC(i16gt); DEC(i16gte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(i16eq); DEC(i16neq); DEC(i16lt); DEC(i16lte); DEC(i16gt); DEC(i16gte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(i16eq); DEC(i16neq); DEC(i16lt); DEC(i16lte); DEC(i16gt); DEC(i16gte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(i16eq); DEC(i16neq); DEC(i16lt); DEC(i16lte); DEC(i16gt); DEC(i16gte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(i16eq); DEC(i16neq); DEC(i16lt); DEC(i16lte); DEC(i16gt); DEC(i16gte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
 1303|      1|  DEC(feq);   DEC(fneq);   DEC(flt);   DEC(flte);   DEC(fgt);   DEC(fgte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(feq);   DEC(fneq);   DEC(flt);   DEC(flte);   DEC(fgt);   DEC(fgte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(feq);   DEC(fneq);   DEC(flt);   DEC(flte);   DEC(fgt);   DEC(fgte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(feq);   DEC(fneq);   DEC(flt);   DEC(flte);   DEC(fgt);   DEC(fgte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(feq);   DEC(fneq);   DEC(flt);   DEC(flte);   DEC(fgt);   DEC(fgte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(feq);   DEC(fneq);   DEC(flt);   DEC(flte);   DEC(fgt);   DEC(fgte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
 1304|      1|  DEC(deq);   DEC(dneq);   DEC(dlt);   DEC(dlte);   DEC(dgt);   DEC(dgte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(deq);   DEC(dneq);   DEC(dlt);   DEC(dlte);   DEC(dgt);   DEC(dgte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(deq);   DEC(dneq);   DEC(dlt);   DEC(dlte);   DEC(dgt);   DEC(dgte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(deq);   DEC(dneq);   DEC(dlt);   DEC(dlte);   DEC(dgt);   DEC(dgte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(deq);   DEC(dneq);   DEC(dlt);   DEC(dlte);   DEC(dgt);   DEC(dgte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(deq);   DEC(dneq);   DEC(dlt);   DEC(dlte);   DEC(dgt);   DEC(dgte);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
 1305|       |
 1306|      1|  DEC(bshl); DEC(blshr); DEC(bashr); DEC(band); DEC(bor); DEC(bxor);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(bshl); DEC(blshr); DEC(bashr); DEC(band); DEC(bor); DEC(bxor);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(bshl); DEC(blshr); DEC(bashr); DEC(band); DEC(bor); DEC(bxor);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(bshl); DEC(blshr); DEC(bashr); DEC(band); DEC(bor); DEC(bxor);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(bshl); DEC(blshr); DEC(bashr); DEC(band); DEC(bor); DEC(bxor);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(bshl); DEC(blshr); DEC(bashr); DEC(band); DEC(bor); DEC(bxor);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
 1307|       |
 1308|      1|  DEC(ishl); DEC(ilshr); DEC(iashr); DEC(iand); DEC(ior); DEC(ixor);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(ishl); DEC(ilshr); DEC(iashr); DEC(iand); DEC(ior); DEC(ixor);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(ishl); DEC(ilshr); DEC(iashr); DEC(iand); DEC(ior); DEC(ixor);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(ishl); DEC(ilshr); DEC(iashr); DEC(iand); DEC(ior); DEC(ixor);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(ishl); DEC(ilshr); DEC(iashr); DEC(iand); DEC(ior); DEC(ixor);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(ishl); DEC(ilshr); DEC(iashr); DEC(iand); DEC(ior); DEC(ixor);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
 1309|      1|  DEC(lshl); DEC(llshr); DEC(lashr); DEC(land); DEC(lor); DEC(lxor);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(lshl); DEC(llshr); DEC(lashr); DEC(land); DEC(lor); DEC(lxor);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(lshl); DEC(llshr); DEC(lashr); DEC(land); DEC(lor); DEC(lxor);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(lshl); DEC(llshr); DEC(lashr); DEC(land); DEC(lor); DEC(lxor);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(lshl); DEC(llshr); DEC(lashr); DEC(land); DEC(lor); DEC(lxor);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(lshl); DEC(llshr); DEC(lashr); DEC(land); DEC(lor); DEC(lxor);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
 1310|       |
 1311|      1|  DEC(cadd);   DEC(csub);   DEC(cmul);   DEC(cdiv);   DEC(crem);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(cadd);   DEC(csub);   DEC(cmul);   DEC(cdiv);   DEC(crem);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(cadd);   DEC(csub);   DEC(cmul);   DEC(cdiv);   DEC(crem);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(cadd);   DEC(csub);   DEC(cmul);   DEC(cdiv);   DEC(crem);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(cadd);   DEC(csub);   DEC(cmul);   DEC(cdiv);   DEC(crem);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
 1312|      1|  DEC(badd);   DEC(bsub);   DEC(bmul);   DEC(bdiv);   DEC(brem);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(badd);   DEC(bsub);   DEC(bmul);   DEC(bdiv);   DEC(brem);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(badd);   DEC(bsub);   DEC(bmul);   DEC(bdiv);   DEC(brem);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(badd);   DEC(bsub);   DEC(bmul);   DEC(bdiv);   DEC(brem);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(badd);   DEC(bsub);   DEC(bmul);   DEC(bdiv);   DEC(brem);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
 1313|      1|  DEC(sadd);   DEC(ssub);   DEC(smul);   DEC(sdiv);   DEC(srem);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(sadd);   DEC(ssub);   DEC(smul);   DEC(sdiv);   DEC(srem);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(sadd);   DEC(ssub);   DEC(smul);   DEC(sdiv);   DEC(srem);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(sadd);   DEC(ssub);   DEC(smul);   DEC(sdiv);   DEC(srem);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(sadd);   DEC(ssub);   DEC(smul);   DEC(sdiv);   DEC(srem);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
 1314|      1|  DEC(iadd);   DEC(isub);   DEC(imul);   DEC(idiv);   DEC(irem);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(iadd);   DEC(isub);   DEC(imul);   DEC(idiv);   DEC(irem);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(iadd);   DEC(isub);   DEC(imul);   DEC(idiv);   DEC(irem);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(iadd);   DEC(isub);   DEC(imul);   DEC(idiv);   DEC(irem);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(iadd);   DEC(isub);   DEC(imul);   DEC(idiv);   DEC(irem);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
 1315|      1|  DEC(ladd);   DEC(lsub);   DEC(lmul);   DEC(ldiv);   DEC(lrem);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(ladd);   DEC(lsub);   DEC(lmul);   DEC(ldiv);   DEC(lrem);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(ladd);   DEC(lsub);   DEC(lmul);   DEC(ldiv);   DEC(lrem);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(ladd);   DEC(lsub);   DEC(lmul);   DEC(ldiv);   DEC(lrem);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(ladd);   DEC(lsub);   DEC(lmul);   DEC(ldiv);   DEC(lrem);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
 1316|      1|  DEC(i16add); DEC(i16sub); DEC(i16mul); DEC(i16div); DEC(i16rem);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(i16add); DEC(i16sub); DEC(i16mul); DEC(i16div); DEC(i16rem);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(i16add); DEC(i16sub); DEC(i16mul); DEC(i16div); DEC(i16rem);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(i16add); DEC(i16sub); DEC(i16mul); DEC(i16div); DEC(i16rem);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(i16add); DEC(i16sub); DEC(i16mul); DEC(i16div); DEC(i16rem);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
 1317|      1|  DEC(i16shl); DEC(i16lshr); DEC(i16ashr); DEC(i16and); DEC(i16or);DEC(i16xor);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(i16shl); DEC(i16lshr); DEC(i16ashr); DEC(i16and); DEC(i16or);DEC(i16xor);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(i16shl); DEC(i16lshr); DEC(i16ashr); DEC(i16and); DEC(i16or);DEC(i16xor);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(i16shl); DEC(i16lshr); DEC(i16ashr); DEC(i16and); DEC(i16or);DEC(i16xor);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(i16shl); DEC(i16lshr); DEC(i16ashr); DEC(i16and); DEC(i16or);DEC(i16xor);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(i16shl); DEC(i16lshr); DEC(i16ashr); DEC(i16and); DEC(i16or);DEC(i16xor);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
 1318|       |
 1319|      1|  DEC(fadd);   DEC(fsub);   DEC(fmul);   DEC(fdiv);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(fadd);   DEC(fsub);   DEC(fmul);   DEC(fdiv);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(fadd);   DEC(fsub);   DEC(fmul);   DEC(fdiv);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(fadd);   DEC(fsub);   DEC(fmul);   DEC(fdiv);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
 1320|      1|  DEC(dadd);   DEC(dsub);   DEC(dmul);   DEC(ddiv);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(dadd);   DEC(dsub);   DEC(dmul);   DEC(ddiv);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(dadd);   DEC(dsub);   DEC(dmul);   DEC(ddiv);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
                DEC(dadd);   DEC(dsub);   DEC(dmul);   DEC(ddiv);
  ------------------
  |  | 1286|      1|# define DEC(inst)  BINDF(#inst, new inst##_op())
  |  |  ------------------
  |  |  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  |  |  ------------------
  ------------------
 1321|       |
 1322|      1|  BINDF("if",         new ifexp());
  ------------------
  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  ------------------
 1323|      1|  BINDF("id",         new idexp());
  ------------------
  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  ------------------
 1324|      1|  BINDF(".cast",      new castexp());
  ------------------
  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  ------------------
 1325|      1|  BINDF("unsafeCast", new castexp()); // perhaps qualify this so that 'memory-representation equivalence' can be decided safely at compile-time?
  ------------------
  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  ------------------
 1326|       |
 1327|       |  // allocate space for some type
 1328|      1|  BINDF("newPrim",  new newPrimfn(false));  // <-- don't 0-fill memory
  ------------------
  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  ------------------
 1329|      1|  BINDF("newPrimZ", new newPrimfn(true));   // <-- _do_ 0-fill memory
  ------------------
  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  ------------------
 1330|      1|  BINDF("newArray", new newArrayfn());
  ------------------
  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  ------------------
 1331|       |
 1332|       |  // polymorphic dynamic-size array functions
 1333|      1|  BINDF("length",          new alenexp());
  ------------------
  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  ------------------
 1334|      1|  BINDF("append",          new aconcatexp());
  ------------------
  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  ------------------
 1335|      1|  BINDF("unsafeSetLength", new asetlen());
  ------------------
  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  ------------------
 1336|       |
 1337|       |  // polymorphic static-size array functions
 1338|      1|  BINDF("salength", new salenexp());
  ------------------
  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  ------------------
 1339|      1|  BINDF("saelem",   new saelem());
  ------------------
  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  ------------------
 1340|      1|  BINDF("saacopy",  new saacopy());
  ------------------
  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  ------------------
 1341|       |
 1342|       |  // apply a C function generically
 1343|      1|  BINDF("applyCFn", new applyCFn());
  ------------------
  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  ------------------
 1344|       |
 1345|       |  // hidden runtime functions for C++ inheritance / pointer-adjustment
 1346|      1|  BINDF(".adjustPtr",     new adjptr());
  ------------------
  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  ------------------
 1347|      1|  BINDF(".adjustVtblPtr", new adjvtblptr());
  ------------------
  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  ------------------
 1348|       |
 1349|       |  // hidden functions for generic record I/O
 1350|      1|  BINDF(".recordHeadLabel", new recHLabel());
  ------------------
  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  ------------------
 1351|      1|  BINDF(".recordHeadValue", new recHValue());
  ------------------
  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  ------------------
 1352|      1|  BINDF(".recordTail",      new recTail());
  ------------------
  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  ------------------
 1353|       |
 1354|       |  // hidden functions for generic variant I/O
 1355|      1|  BINDF(".variantHeadLabel",  new varHLabel());
  ------------------
  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  ------------------
 1356|      1|  BINDF(".variantSplit",      new varSplit());
  ------------------
  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  ------------------
 1357|      1|  BINDF(".variantInjectHead", new varInjH());
  ------------------
  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  ------------------
 1358|       |
 1359|      1|  BINDF("penumShow",          new penumShow());
  ------------------
  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  ------------------
 1360|       |
 1361|       |  // access std::string fields
 1362|      1|  c->bind("stdstrsize", &stdstrsize);
 1363|      1|  c->bind("stdstrelem", &stdstrelem);
 1364|       |
 1365|       |  // pack primitive types (a bit of a hack to make pattern matching on strings faster)
 1366|      1|  BINDF("packLong",  new packLongF());
  ------------------
  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  ------------------
 1367|      1|  BINDF("packInt",   new packIntF());
  ------------------
  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  ------------------
 1368|      1|  BINDF("packShort", new packShortF());
  ------------------
  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  ------------------
 1369|       |
 1370|       |  // dereference through char pointers
 1371|      1|  BINDF("cptrrefby", new cptrrefbyF());
  ------------------
  |  | 1285|      1|# define BINDF(n,v) c->bindLLFunc(n,v)
  ------------------
 1372|      1|}
_ZNK6hobbes6not_op4typeERNS_6typedbE:
   21|      1|    PolyTypePtr type(typedb&) const { \
   22|      1|      return polytype(prim<rty(aty0)>()); \
   23|      1|    } \
_ZN6hobbes6not_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
   17|      8|    llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) { \
   18|      8|      llvm::Value* x = c->compile(es[0]); \
   19|      8|      return withContext([&](auto&) { return c->builder()->mem(x, "t"); }); \
   20|      8|    } \
_ZZN6hobbes6not_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
   19|      8|      return withContext([&](auto&) { return c->builder()->mem(x, "t"); }); \
_ZNK6hobbes7bnot_op4typeERNS_6typedbE:
   21|      1|    PolyTypePtr type(typedb&) const { \
   22|      1|      return polytype(prim<rty(aty0)>()); \
   23|      1|    } \
_ZN6hobbes7bnot_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
   17|      1|    llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) { \
   18|      1|      llvm::Value* x = c->compile(es[0]); \
   19|      1|      return withContext([&](auto&) { return c->builder()->mem(x, "t"); }); \
   20|      1|    } \
_ZZN6hobbes7bnot_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
   19|      1|      return withContext([&](auto&) { return c->builder()->mem(x, "t"); }); \
_ZNK6hobbes6b2i_op4typeERNS_6typedbE:
   46|      1|    PolyTypePtr type(typedb&) const { \
   47|      1|      return polytype(prim<outty(inty)>()); \
   48|      1|    } \
_ZN6hobbes6b2i_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
   42|      1|    llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) { \
   43|      1|      llvm::Value* e = c->compile(es[0]); \
   44|      1|      return withContext([&](auto&) { return c->builder()->CreateCast(cflag, e, toLLVM(prim<outty>()), "t"); }); \
   45|      1|    } \
_ZZN6hobbes6b2i_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
   44|      1|      return withContext([&](auto&) { return c->builder()->CreateCast(cflag, e, toLLVM(prim<outty>()), "t"); }); \
_ZNK6hobbes6b2l_op4typeERNS_6typedbE:
   46|      1|    PolyTypePtr type(typedb&) const { \
   47|      1|      return polytype(prim<outty(inty)>()); \
   48|      1|    } \
_ZN6hobbes6b2l_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
   42|      3|    llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) { \
   43|      3|      llvm::Value* e = c->compile(es[0]); \
   44|      3|      return withContext([&](auto&) { return c->builder()->CreateCast(cflag, e, toLLVM(prim<outty>()), "t"); }); \
   45|      3|    } \
_ZZN6hobbes6b2l_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
   44|      3|      return withContext([&](auto&) { return c->builder()->CreateCast(cflag, e, toLLVM(prim<outty>()), "t"); }); \
_ZNK6hobbes6i2d_op4typeERNS_6typedbE:
   46|      1|    PolyTypePtr type(typedb&) const { \
   47|      1|      return polytype(prim<outty(inty)>()); \
   48|      1|    } \
_ZN6hobbes6i2d_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
   42|      1|    llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) { \
   43|      1|      llvm::Value* e = c->compile(es[0]); \
   44|      1|      return withContext([&](auto&) { return c->builder()->CreateCast(cflag, e, toLLVM(prim<outty>()), "t"); }); \
   45|      1|    } \
_ZZN6hobbes6i2d_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
   44|      1|      return withContext([&](auto&) { return c->builder()->CreateCast(cflag, e, toLLVM(prim<outty>()), "t"); }); \
_ZNK6hobbes6i2l_op4typeERNS_6typedbE:
   46|      1|    PolyTypePtr type(typedb&) const { \
   47|      1|      return polytype(prim<outty(inty)>()); \
   48|      1|    } \
_ZN6hobbes6i2l_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
   42|     24|    llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) { \
   43|     24|      llvm::Value* e = c->compile(es[0]); \
   44|     24|      return withContext([&](auto&) { return c->builder()->CreateCast(cflag, e, toLLVM(prim<outty>()), "t"); }); \
   45|     24|    } \
_ZZN6hobbes6i2l_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
   44|     24|      return withContext([&](auto&) { return c->builder()->CreateCast(cflag, e, toLLVM(prim<outty>()), "t"); }); \
_ZNK6hobbes6l2d_op4typeERNS_6typedbE:
   46|      1|    PolyTypePtr type(typedb&) const { \
   47|      1|      return polytype(prim<outty(inty)>()); \
   48|      1|    } \
_ZN6hobbes6l2d_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
   42|      1|    llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) { \
   43|      1|      llvm::Value* e = c->compile(es[0]); \
   44|      1|      return withContext([&](auto&) { return c->builder()->CreateCast(cflag, e, toLLVM(prim<outty>()), "t"); }); \
   45|      1|    } \
_ZZN6hobbes6l2d_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
   44|      1|      return withContext([&](auto&) { return c->builder()->CreateCast(cflag, e, toLLVM(prim<outty>()), "t"); }); \
_ZNK6hobbes8l2i16_op4typeERNS_6typedbE:
   46|      1|    PolyTypePtr type(typedb&) const { \
   47|      1|      return polytype(prim<outty(inty)>()); \
   48|      1|    } \
_ZN6hobbes8l2i16_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
   42|      3|    llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) { \
   43|      3|      llvm::Value* e = c->compile(es[0]); \
   44|      3|      return withContext([&](auto&) { return c->builder()->CreateCast(cflag, e, toLLVM(prim<outty>()), "t"); }); \
   45|      3|    } \
_ZZN6hobbes8l2i16_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
   44|      3|      return withContext([&](auto&) { return c->builder()->CreateCast(cflag, e, toLLVM(prim<outty>()), "t"); }); \
_ZNK6hobbes6l2f_op4typeERNS_6typedbE:
   46|      1|    PolyTypePtr type(typedb&) const { \
   47|      1|      return polytype(prim<outty(inty)>()); \
   48|      1|    } \
_ZN6hobbes6l2f_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
   42|      1|    llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) { \
   43|      1|      llvm::Value* e = c->compile(es[0]); \
   44|      1|      return withContext([&](auto&) { return c->builder()->CreateCast(cflag, e, toLLVM(prim<outty>()), "t"); }); \
   45|      1|    } \
_ZZN6hobbes6l2f_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
   44|      1|      return withContext([&](auto&) { return c->builder()->CreateCast(cflag, e, toLLVM(prim<outty>()), "t"); }); \
_ZNK6hobbes6s2i_op4typeERNS_6typedbE:
   46|      1|    PolyTypePtr type(typedb&) const { \
   47|      1|      return polytype(prim<outty(inty)>()); \
   48|      1|    } \
_ZN6hobbes6s2i_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
   42|      4|    llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) { \
   43|      4|      llvm::Value* e = c->compile(es[0]); \
   44|      4|      return withContext([&](auto&) { return c->builder()->CreateCast(cflag, e, toLLVM(prim<outty>()), "t"); }); \
   45|      4|    } \
_ZZN6hobbes6s2i_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
   44|      4|      return withContext([&](auto&) { return c->builder()->CreateCast(cflag, e, toLLVM(prim<outty>()), "t"); }); \
_ZNK6hobbes6i2f_op4typeERNS_6typedbE:
   46|      1|    PolyTypePtr type(typedb&) const { \
   47|      1|      return polytype(prim<outty(inty)>()); \
   48|      1|    } \
_ZNK6hobbes6f2d_op4typeERNS_6typedbE:
   46|      1|    PolyTypePtr type(typedb&) const { \
   47|      1|      return polytype(prim<outty(inty)>()); \
   48|      1|    } \
_ZN6hobbes6f2d_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
   42|      1|    llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) { \
   43|      1|      llvm::Value* e = c->compile(es[0]); \
   44|      1|      return withContext([&](auto&) { return c->builder()->CreateCast(cflag, e, toLLVM(prim<outty>()), "t"); }); \
   45|      1|    } \
_ZZN6hobbes6f2d_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
   44|      1|      return withContext([&](auto&) { return c->builder()->CreateCast(cflag, e, toLLVM(prim<outty>()), "t"); }); \
_ZNK6hobbes7tl2i_op4typeERNS_6typedbE:
   46|      1|    PolyTypePtr type(typedb&) const { \
   47|      1|      return polytype(prim<outty(inty)>()); \
   48|      1|    } \
_ZNK6hobbes7ti2s_op4typeERNS_6typedbE:
   46|      1|    PolyTypePtr type(typedb&) const { \
   47|      1|      return polytype(prim<outty(inty)>()); \
   48|      1|    } \
_ZNK6hobbes7ti2b_op4typeERNS_6typedbE:
   46|      1|    PolyTypePtr type(typedb&) const { \
   47|      1|      return polytype(prim<outty(inty)>()); \
   48|      1|    } \
_ZNK6hobbes7tl2b_op4typeERNS_6typedbE:
   46|      1|    PolyTypePtr type(typedb&) const { \
   47|      1|      return polytype(prim<outty(inty)>()); \
   48|      1|    } \
_ZN6hobbes7tl2b_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
   42|      3|    llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) { \
   43|      3|      llvm::Value* e = c->compile(es[0]); \
   44|      3|      return withContext([&](auto&) { return c->builder()->CreateCast(cflag, e, toLLVM(prim<outty>()), "t"); }); \
   45|      3|    } \
_ZZN6hobbes7tl2b_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
   44|      3|      return withContext([&](auto&) { return c->builder()->CreateCast(cflag, e, toLLVM(prim<outty>()), "t"); }); \
_ZNK6hobbes7sneg_op4typeERNS_6typedbE:
   21|      1|    PolyTypePtr type(typedb&) const { \
   22|      1|      return polytype(prim<rty(aty0)>()); \
   23|      1|    } \
_ZNK6hobbes7ineg_op4typeERNS_6typedbE:
   21|      1|    PolyTypePtr type(typedb&) const { \
   22|      1|      return polytype(prim<rty(aty0)>()); \
   23|      1|    } \
_ZN6hobbes7ineg_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
   17|      2|    llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) { \
   18|      2|      llvm::Value* x = c->compile(es[0]); \
   19|      2|      return withContext([&](auto&) { return c->builder()->mem(x, "t"); }); \
   20|      2|    } \
_ZZN6hobbes7ineg_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
   19|      2|      return withContext([&](auto&) { return c->builder()->mem(x, "t"); }); \
_ZNK6hobbes7lneg_op4typeERNS_6typedbE:
   21|      1|    PolyTypePtr type(typedb&) const { \
   22|      1|      return polytype(prim<rty(aty0)>()); \
   23|      1|    } \
_ZN6hobbes7lneg_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
   17|      2|    llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) { \
   18|      2|      llvm::Value* x = c->compile(es[0]); \
   19|      2|      return withContext([&](auto&) { return c->builder()->mem(x, "t"); }); \
   20|      2|    } \
_ZZN6hobbes7lneg_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
   19|      2|      return withContext([&](auto&) { return c->builder()->mem(x, "t"); }); \
_ZNK6hobbes9i16neg_op4typeERNS_6typedbE:
   21|      1|    PolyTypePtr type(typedb&) const { \
   22|      1|      return polytype(prim<rty(aty0)>()); \
   23|      1|    } \
_ZNK6hobbes7fneg_op4typeERNS_6typedbE:
   21|      1|    PolyTypePtr type(typedb&) const { \
   22|      1|      return polytype(prim<rty(aty0)>()); \
   23|      1|    } \
_ZNK6hobbes7dneg_op4typeERNS_6typedbE:
   21|      1|    PolyTypePtr type(typedb&) const { \
   22|      1|      return polytype(prim<rty(aty0)>()); \
   23|      1|    } \
_ZNK6hobbes6ceq_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7cneq_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes6clt_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7clte_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZN6hobbes7clte_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
   29|      2|    llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) { \
   30|      2|      llvm::Value* left  = c->compile(es[0]); \
   31|      2|      llvm::Value* right = c->compile(es[1]); \
   32|      2|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
   33|      2|    } \
_ZZN6hobbes7clte_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
   32|      2|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
_ZNK6hobbes6cgt_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7cgte_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZN6hobbes7cgte_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
   29|      2|    llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) { \
   30|      2|      llvm::Value* left  = c->compile(es[0]); \
   31|      2|      llvm::Value* right = c->compile(es[1]); \
   32|      2|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
   33|      2|    } \
_ZZN6hobbes7cgte_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
   32|      2|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
_ZNK6hobbes6beq_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZN6hobbes6beq_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
   29|      2|    llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) { \
   30|      2|      llvm::Value* left  = c->compile(es[0]); \
   31|      2|      llvm::Value* right = c->compile(es[1]); \
   32|      2|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
   33|      2|    } \
_ZZN6hobbes6beq_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
   32|      2|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
_ZNK6hobbes7bneq_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes6blt_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7blte_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes6bgt_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7bgte_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes6seq_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7sneq_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes6slt_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7slte_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes6sgt_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7sgte_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes6ieq_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7ineq_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes6ilt_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7ilte_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes6igt_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7igte_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes6leq_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZN6hobbes6leq_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
   29|     48|    llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) { \
   30|     48|      llvm::Value* left  = c->compile(es[0]); \
   31|     48|      llvm::Value* right = c->compile(es[1]); \
   32|     48|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
   33|     48|    } \
_ZZN6hobbes6leq_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
   32|     48|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
_ZNK6hobbes7lneq_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes6llt_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZN6hobbes6llt_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
   29|     48|    llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) { \
   30|     48|      llvm::Value* left  = c->compile(es[0]); \
   31|     48|      llvm::Value* right = c->compile(es[1]); \
   32|     48|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
   33|     48|    } \
_ZZN6hobbes6llt_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
   32|     48|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
_ZNK6hobbes7llte_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZN6hobbes7llte_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
   29|      6|    llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) { \
   30|      6|      llvm::Value* left  = c->compile(es[0]); \
   31|      6|      llvm::Value* right = c->compile(es[1]); \
   32|      6|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
   33|      6|    } \
_ZZN6hobbes7llte_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
   32|      6|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
_ZNK6hobbes6lgt_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZN6hobbes6lgt_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
   29|      7|    llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) { \
   30|      7|      llvm::Value* left  = c->compile(es[0]); \
   31|      7|      llvm::Value* right = c->compile(es[1]); \
   32|      7|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
   33|      7|    } \
_ZZN6hobbes6lgt_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
   32|      7|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
_ZNK6hobbes7lgte_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZN6hobbes7lgte_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
   29|     15|    llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) { \
   30|     15|      llvm::Value* left  = c->compile(es[0]); \
   31|     15|      llvm::Value* right = c->compile(es[1]); \
   32|     15|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
   33|     15|    } \
_ZZN6hobbes7lgte_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
   32|     15|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
_ZNK6hobbes8i16eq_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes9i16neq_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes8i16lt_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes9i16lte_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes8i16gt_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes9i16gte_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes6feq_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7fneq_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes6flt_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7flte_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes6fgt_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7fgte_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes6deq_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7dneq_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes6dlt_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7dlte_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes6dgt_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7dgte_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7bshl_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZN6hobbes7bshl_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
   29|      2|    llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) { \
   30|      2|      llvm::Value* left  = c->compile(es[0]); \
   31|      2|      llvm::Value* right = c->compile(es[1]); \
   32|      2|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
   33|      2|    } \
_ZZN6hobbes7bshl_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
   32|      2|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
_ZNK6hobbes8blshr_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes8bashr_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZN6hobbes8bashr_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
   29|      2|    llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) { \
   30|      2|      llvm::Value* left  = c->compile(es[0]); \
   31|      2|      llvm::Value* right = c->compile(es[1]); \
   32|      2|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
   33|      2|    } \
_ZZN6hobbes8bashr_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
   32|      2|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
_ZNK6hobbes7band_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZN6hobbes7band_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
   29|      3|    llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) { \
   30|      3|      llvm::Value* left  = c->compile(es[0]); \
   31|      3|      llvm::Value* right = c->compile(es[1]); \
   32|      3|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
   33|      3|    } \
_ZZN6hobbes7band_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
   32|      3|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
_ZNK6hobbes6bor_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZN6hobbes6bor_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
   29|      1|    llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) { \
   30|      1|      llvm::Value* left  = c->compile(es[0]); \
   31|      1|      llvm::Value* right = c->compile(es[1]); \
   32|      1|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
   33|      1|    } \
_ZZN6hobbes6bor_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
   32|      1|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
_ZNK6hobbes7bxor_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7ishl_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes8ilshr_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes8iashr_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7iand_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes6ior_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7ixor_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7lshl_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes8llshr_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes8lashr_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7land_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes6lor_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7lxor_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7cadd_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZN6hobbes7cadd_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
   29|      2|    llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) { \
   30|      2|      llvm::Value* left  = c->compile(es[0]); \
   31|      2|      llvm::Value* right = c->compile(es[1]); \
   32|      2|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
   33|      2|    } \
_ZZN6hobbes7cadd_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
   32|      2|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
_ZNK6hobbes7csub_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZN6hobbes7csub_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
   29|      2|    llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) { \
   30|      2|      llvm::Value* left  = c->compile(es[0]); \
   31|      2|      llvm::Value* right = c->compile(es[1]); \
   32|      2|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
   33|      2|    } \
_ZZN6hobbes7csub_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
   32|      2|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
_ZNK6hobbes7cmul_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7cdiv_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7crem_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7badd_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7bsub_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7bmul_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7bdiv_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7brem_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7sadd_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7ssub_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7smul_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7sdiv_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7srem_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7iadd_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7isub_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZN6hobbes7isub_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
   29|      1|    llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) { \
   30|      1|      llvm::Value* left  = c->compile(es[0]); \
   31|      1|      llvm::Value* right = c->compile(es[1]); \
   32|      1|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
   33|      1|    } \
_ZZN6hobbes7isub_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
   32|      1|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
_ZNK6hobbes7imul_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7idiv_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7irem_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7ladd_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZN6hobbes7ladd_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
   29|     80|    llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) { \
   30|     80|      llvm::Value* left  = c->compile(es[0]); \
   31|     80|      llvm::Value* right = c->compile(es[1]); \
   32|     80|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
   33|     80|    } \
_ZZN6hobbes7ladd_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
   32|     80|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
_ZNK6hobbes7lsub_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZN6hobbes7lsub_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
   29|     20|    llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) { \
   30|     20|      llvm::Value* left  = c->compile(es[0]); \
   31|     20|      llvm::Value* right = c->compile(es[1]); \
   32|     20|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
   33|     20|    } \
_ZZN6hobbes7lsub_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
   32|     20|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
_ZNK6hobbes7lmul_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZN6hobbes7lmul_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
   29|     12|    llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) { \
   30|     12|      llvm::Value* left  = c->compile(es[0]); \
   31|     12|      llvm::Value* right = c->compile(es[1]); \
   32|     12|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
   33|     12|    } \
_ZZN6hobbes7lmul_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
   32|     12|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
_ZNK6hobbes7ldiv_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZN6hobbes7ldiv_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
   29|      5|    llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) { \
   30|      5|      llvm::Value* left  = c->compile(es[0]); \
   31|      5|      llvm::Value* right = c->compile(es[1]); \
   32|      5|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
   33|      5|    } \
_ZZN6hobbes7ldiv_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
   32|      5|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
_ZNK6hobbes7lrem_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZN6hobbes7lrem_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
   29|      1|    llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) { \
   30|      1|      llvm::Value* left  = c->compile(es[0]); \
   31|      1|      llvm::Value* right = c->compile(es[1]); \
   32|      1|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
   33|      1|    } \
_ZZN6hobbes7lrem_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
   32|      1|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
_ZNK6hobbes9i16add_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes9i16sub_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes9i16mul_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes9i16div_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes9i16rem_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes9i16shl_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes10i16lshr_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes10i16ashr_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes9i16and_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes8i16or_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes9i16xor_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7fadd_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7fsub_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZN6hobbes7fsub_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
   29|      1|    llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) { \
   30|      1|      llvm::Value* left  = c->compile(es[0]); \
   31|      1|      llvm::Value* right = c->compile(es[1]); \
   32|      1|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
   33|      1|    } \
_ZZN6hobbes7fsub_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
   32|      1|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
_ZNK6hobbes7fmul_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZN6hobbes7fmul_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
   29|      1|    llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) { \
   30|      1|      llvm::Value* left  = c->compile(es[0]); \
   31|      1|      llvm::Value* right = c->compile(es[1]); \
   32|      1|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
   33|      1|    } \
_ZZN6hobbes7fmul_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
   32|      1|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
_ZNK6hobbes7fdiv_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZN6hobbes7fdiv_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
   29|      1|    llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) { \
   30|      1|      llvm::Value* left  = c->compile(es[0]); \
   31|      1|      llvm::Value* right = c->compile(es[1]); \
   32|      1|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
   33|      1|    } \
_ZZN6hobbes7fdiv_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
   32|      1|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
_ZNK6hobbes7dadd_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZNK6hobbes7dsub_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZN6hobbes7dsub_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
   29|      1|    llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) { \
   30|      1|      llvm::Value* left  = c->compile(es[0]); \
   31|      1|      llvm::Value* right = c->compile(es[1]); \
   32|      1|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
   33|      1|    } \
_ZZN6hobbes7dsub_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
   32|      1|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
_ZNK6hobbes7dmul_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZN6hobbes7dmul_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
   29|      1|    llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) { \
   30|      1|      llvm::Value* left  = c->compile(es[0]); \
   31|      1|      llvm::Value* right = c->compile(es[1]); \
   32|      1|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
   33|      1|    } \
_ZZN6hobbes7dmul_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
   32|      1|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
_ZNK6hobbes7ddiv_op4typeERNS_6typedbE:
   34|      1|    PolyTypePtr type(typedb&) const { \
   35|      1|      return polytype(prim<rty(aty0,aty1)>()); \
   36|      1|    } \
_ZN6hobbes7ddiv_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
   29|      1|    llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) { \
   30|      1|      llvm::Value* left  = c->compile(es[0]); \
   31|      1|      llvm::Value* right = c->compile(es[1]); \
   32|      1|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
   33|      1|    } \
_ZZN6hobbes7ddiv_op5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
   32|      1|      return withContext([&](auto&) { return c->builder()->mem(left, right, "t"); }); \
_ZNK6hobbes5ifexp4typeERNS_6typedbE:
  286|      1|  PolyTypePtr type(typedb&) const override {
  287|      1|    static MonoTypePtr tg0(TGen::make(0));
  288|      1|    static PolyTypePtr ifty(new PolyType(1, qualtype(Func::make(tuplety(list(MonoTypePtr(Prim::make("bool")), tg0, tg0)), tg0))));
  289|      1|    return ifty;
  290|      1|  }
_ZN6hobbes5ifexp5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
  234|    132|  llvm::Value* apply(jitcc* c, const MonoTypes& tys, const MonoTypePtr&, const Exprs& es) override {
  235|    132|    return withContext([&](llvm::LLVMContext& ctx) -> llvm::Value* {
  236|    132|      llvm::Function* thisFn = c->builder()->GetInsertBlock()->getParent();
  237|    132|      llvm::Value*    cond   = c->compile(es[0]);
  238|       |
  239|       |      // for a condition, we need a 'then' branch, an 'else' branch, and a 'merge' block joining the two
  240|    132|      llvm::BasicBlock* thenBlock  = llvm::BasicBlock::Create(ctx, "then", thisFn);
  241|    132|      llvm::BasicBlock* elseBlock  = llvm::BasicBlock::Create(ctx, "else");
  242|    132|      llvm::BasicBlock* mergeBlock = llvm::BasicBlock::Create(ctx, "ifmerge");
  243|       |
  244|       |      // compile 'then' branch flowing to 'merge' block
  245|    132|      c->builder()->CreateCondBr(cond, thenBlock, elseBlock);
  246|    132|      c->builder()->SetInsertPoint(thenBlock);
  247|       |
  248|    132|      llvm::Value* thenExp = c->compile(es[1]);
  249|    132|      c->builder()->CreateBr(mergeBlock);
  250|    132|      thenBlock = c->builder()->GetInsertBlock(); // reset block pointer, in case compiling 'then' expression changed the active block
  251|       |
  252|       |      // compile the 'else' branch
  253|       |#if LLVM_VERSION_MAJOR < 16
  254|       |      thisFn->getBasicBlockList().push_back(elseBlock);
  255|       |#else
  256|    132|      thisFn->insert(thisFn->end(), elseBlock);
  257|    132|#endif
  258|    132|      c->builder()->SetInsertPoint(elseBlock);
  259|       |
  260|    132|      llvm::Value* elseExp = c->compile(es[2]);
  261|    132|      c->builder()->CreateBr(mergeBlock);
  262|    132|      elseBlock = c->builder()->GetInsertBlock(); // reset block pointer, in case compiling 'else' expression changed the active block
  263|       |
  264|       |      // finally, merge blocks
  265|       |#if LLVM_VERSION_MAJOR < 16
  266|       |      thisFn->getBasicBlockList().push_back(mergeBlock);
  267|       |#else
  268|    132|      thisFn->insert(thisFn->end(), mergeBlock);
  269|    132|#endif
  270|    132|      c->builder()->SetInsertPoint(mergeBlock);
  271|       |
  272|       |      // and the final value is the phi merge of the two possible branches
  273|       |      //   (unless we're returning unit)
  274|    132|      if (isUnit(tys[1])) {
  275|    132|        return cvalue(true);
  276|    132|      } else {
  277|    132|        llvm::PHINode* pn = c->builder()->CreatePHI(toLLVM(tys[1], true), 2);
  278|    132|        pn->addIncoming(thenExp, thenBlock);
  279|    132|        pn->addIncoming(elseExp, elseBlock);
  280|       |
  281|    132|        return pn;
  282|    132|      }
  283|    132|    });
  284|    132|  }
_ZZN6hobbes5ifexp5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRN4llvm11LLVMContextEE_clESL_:
  235|    132|    return withContext([&](llvm::LLVMContext& ctx) -> llvm::Value* {
  236|    132|      llvm::Function* thisFn = c->builder()->GetInsertBlock()->getParent();
  237|    132|      llvm::Value*    cond   = c->compile(es[0]);
  238|       |
  239|       |      // for a condition, we need a 'then' branch, an 'else' branch, and a 'merge' block joining the two
  240|    132|      llvm::BasicBlock* thenBlock  = llvm::BasicBlock::Create(ctx, "then", thisFn);
  241|    132|      llvm::BasicBlock* elseBlock  = llvm::BasicBlock::Create(ctx, "else");
  242|    132|      llvm::BasicBlock* mergeBlock = llvm::BasicBlock::Create(ctx, "ifmerge");
  243|       |
  244|       |      // compile 'then' branch flowing to 'merge' block
  245|    132|      c->builder()->CreateCondBr(cond, thenBlock, elseBlock);
  246|    132|      c->builder()->SetInsertPoint(thenBlock);
  247|       |
  248|    132|      llvm::Value* thenExp = c->compile(es[1]);
  249|    132|      c->builder()->CreateBr(mergeBlock);
  250|    132|      thenBlock = c->builder()->GetInsertBlock(); // reset block pointer, in case compiling 'then' expression changed the active block
  251|       |
  252|       |      // compile the 'else' branch
  253|       |#if LLVM_VERSION_MAJOR < 16
  254|       |      thisFn->getBasicBlockList().push_back(elseBlock);
  255|       |#else
  256|    132|      thisFn->insert(thisFn->end(), elseBlock);
  257|    132|#endif
  258|    132|      c->builder()->SetInsertPoint(elseBlock);
  259|       |
  260|    132|      llvm::Value* elseExp = c->compile(es[2]);
  261|    132|      c->builder()->CreateBr(mergeBlock);
  262|    132|      elseBlock = c->builder()->GetInsertBlock(); // reset block pointer, in case compiling 'else' expression changed the active block
  263|       |
  264|       |      // finally, merge blocks
  265|       |#if LLVM_VERSION_MAJOR < 16
  266|       |      thisFn->getBasicBlockList().push_back(mergeBlock);
  267|       |#else
  268|    132|      thisFn->insert(thisFn->end(), mergeBlock);
  269|    132|#endif
  270|    132|      c->builder()->SetInsertPoint(mergeBlock);
  271|       |
  272|       |      // and the final value is the phi merge of the two possible branches
  273|       |      //   (unless we're returning unit)
  274|    132|      if (isUnit(tys[1])) {
  ------------------
  |  Branch (274:11): [True: 10, False: 122]
  ------------------
  275|     10|        return cvalue(true);
  276|    122|      } else {
  277|    122|        llvm::PHINode* pn = c->builder()->CreatePHI(toLLVM(tys[1], true), 2);
  278|    122|        pn->addIncoming(thenExp, thenBlock);
  279|    122|        pn->addIncoming(elseExp, elseBlock);
  280|       |
  281|    122|        return pn;
  282|    122|      }
  283|    132|    });
_ZNK6hobbes5idexp4typeERNS_6typedbE:
  593|      1|  PolyTypePtr type(typedb&) const override {
  594|      1|    static MonoTypePtr tg0(TGen::make(0));
  595|      1|    static PolyTypePtr idty(new PolyType(1, qualtype(Func::make(tuplety(list(tg0)), tg0))));
  596|      1|    return idty;
  597|      1|  }
_ZN6hobbes5idexp5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
  589|    207|  llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) override {
  590|    207|    return c->compile(es[0]);
  591|    207|  }
_ZNK6hobbes7castexp4typeERNS_6typedbE:
  624|      2|  PolyTypePtr type(typedb&) const override {
  625|      2|    static MonoTypePtr tg0(TGen::make(0));
  626|      2|    static MonoTypePtr tg1(TGen::make(1));
  627|      2|    static PolyTypePtr idty(new PolyType(2, qualtype(Func::make(tuplety(list(tg0)), tg1))));
  628|      2|    return idty;
  629|      2|  }
_ZN6hobbes7castexp5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
  603|     96|  llvm::Value* apply(jitcc* c, const MonoTypes& tys, const MonoTypePtr& rty, const Exprs& es) override {
  604|     96|    llvm::Value* r = c->compile(es[0]);
  605|     96|    if (isUnit(rty)) {
  ------------------
  |  Branch (605:9): [True: 0, False: 96]
  ------------------
  606|      0|      return cvalue(true);
  607|     96|    } else if (isUnit(tys[0])) {
  ------------------
  |  Branch (607:16): [True: 0, False: 96]
  ------------------
  608|       |      // unit carries no bits to reinterpret (unsafeCast(())::t names a 't' only for its type),
  609|       |      // so make a zero 't' rather than bitcast the unit placeholder to it
  610|      0|      return withContext([&](auto&) {
  611|      0|        return llvm::Constant::getNullValue(toLLVM(rty, true));
  612|      0|      });
  613|     96|    } else {
  614|     96|      return withContext([&](auto&) {
  615|     96|        llvm::Type* ty = toLLVM(rty, true);
  616|     96|        if (!llvm::CastInst::castIsValid(llvm::Instruction::BitCast, r, ty)) {
  617|     96|          throw annotated_error(*es[0], "Cannot cast " + show(tys[0]) + " to " + show(rty) + ", their representations differ");
  618|     96|        }
  619|     96|        return c->builder()->CreateBitCast(r, ty);
  620|     96|      });
  621|     96|    }
  622|     96|  }
_ZZN6hobbes7castexp5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E0_clIN4llvm11LLVMContextEEEDaSK_:
  614|     96|      return withContext([&](auto&) {
  615|     96|        llvm::Type* ty = toLLVM(rty, true);
  616|     96|        if (!llvm::CastInst::castIsValid(llvm::Instruction::BitCast, r, ty)) {
  ------------------
  |  Branch (616:13): [True: 0, False: 96]
  ------------------
  617|      0|          throw annotated_error(*es[0], "Cannot cast " + show(tys[0]) + " to " + show(rty) + ", their representations differ");
  618|      0|        }
  619|     96|        return c->builder()->CreateBitCast(r, ty);
  620|     96|      });
_ZN6hobbes9newPrimfnC2Eb:
  635|      2|  newPrimfn(bool zeroMem = false) : zeroMem(zeroMem) {
  636|      2|  }
_ZNK6hobbes9newPrimfn4typeERNS_6typedbE:
  656|      2|  PolyTypePtr type(typedb&) const override {
  657|      2|    static MonoTypePtr tg0(TGen::make(0));
  658|      2|    static PolyTypePtr npty(new PolyType(1, qualtype(Func::make(tuplety(list(prim<void>())), tg0))));
  659|      2|    return npty;
  660|      2|  }
_ZN6hobbes9newPrimfn5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
  638|      2|  llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr& rty, const Exprs&) override {
  639|      2|    if (isUnit(rty)) {
  ------------------
  |  Branch (639:9): [True: 0, False: 2]
  ------------------
  640|      0|      return cvalue(true);
  641|      2|    } else if (!hasPointerRep(rty)) {
  ------------------
  |  Branch (641:16): [True: 0, False: 2]
  ------------------
  642|      0|      return withContext([&](auto&) {
  643|      0|        llvm::Type* valTy = toLLVM(rty, true);
  644|       |#if LLVM_VERSION_MAJOR < 16
  645|       |        return c->builder()->CreateLoad(c->compileAllocStmt(sizeOf(rty), alignment(rty), ptrType(valTy), this->zeroMem));
  646|       |#else
  647|      0|        llvm::Value* tmp = c->compileAllocStmt(sizeOf(rty), alignment(rty), ptrType(valTy), this->zeroMem);
  648|      0|        return c->builder()->CreateLoad(valTy, tmp);
  649|      0|#endif
  650|      0|      });
  651|      2|    } else {
  652|      2|      return c->compileAllocStmt(sizeOf(rty), alignment(rty), toLLVM(rty, true), this->zeroMem);
  653|      2|    }
  654|      2|  }
_ZNK6hobbes10newArrayfn4typeERNS_6typedbE:
  698|      1|  PolyTypePtr type(typedb&) const override {
  699|      1|    static MonoTypePtr tg0(TGen::make(0));
  700|      1|    static MonoTypePtr tlng = prim<long>();
  701|      1|    static PolyTypePtr npty(new PolyType(1, qualtype(Func::make(tuplety(list(tlng)), arrayty(tg0)))));
  702|      1|    return npty;
  703|      1|  }
_ZN6hobbes10newArrayfn5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
  667|     30|  llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr& rty, const Exprs& es) override {
  668|     30|    const Array* aty = is<Array>(rty);
  669|     30|    if (aty == nullptr) {
  ------------------
  |  Branch (669:9): [True: 0, False: 30]
  ------------------
  670|      0|      throw annotated_error(*es[0], "Invalid usage, newArray called for non-array type");
  671|      0|    }
  672|       |
  673|     30|    llvm::Value* aclen  = c->compile(es[0]);
  674|       |
  675|       |    // the length is an ordinary runtime long, so it can be negative or large
  676|       |    // enough that the product wraps; either gives a small allocation with the
  677|       |    // full claimed length written into the header, and every later index then
  678|       |    // runs off the buffer. Hand the arithmetic to a checker that can refuse it
  679|       |    // instead of doing it inline, where a wrapped product looks like a small
  680|       |    // one (STRFR-433921).
  681|     30|    llvm::Function* szf = c->lookupFunction(".checkedArrayByteSize");
  682|     30|    if (szf == nullptr) { throw std::runtime_error("Internal compiler error -- no array size checker defined."); }
  ------------------
  |  Branch (682:9): [True: 0, False: 30]
  ------------------
  683|       |
  684|     30|    llvm::Value* mlen   = withContext([&](auto&) -> llvm::Value* {
  685|     30|      return fncall(c->builder(), szf, szf->getFunctionType(),
  686|     30|                    list<llvm::Value*>(aclen, cvalue(static_cast<long>(sizeOf(aty->type())))));
  687|     30|    });
  688|     30|    llvm::Value* cmdata = c->compileAllocStmt(mlen, cvalue(std::max<long>(sizeof(long), alignment(aty->type()))), toLLVM(rty));
  689|     30|#if LLVM_VERSION_MAJOR >= 18
  690|     30|    withContext([&](auto&) { c->builder()->CreateStore(aclen, structOffset(c->builder(), varArrayType(boolType()), cmdata, 0)); });
  691|       |#else
  692|       |    withContext([&](auto&) { c->builder()->CreateStore(aclen, structOffset(c->builder(), cmdata, 0)); });
  693|       |#endif
  694|       |
  695|     30|    return cmdata;
  696|     30|  }
_ZZN6hobbes10newArrayfn5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEPNSN_5ValueESK_:
  684|     30|    llvm::Value* mlen   = withContext([&](auto&) -> llvm::Value* {
  685|     30|      return fncall(c->builder(), szf, szf->getFunctionType(),
  686|     30|                    list<llvm::Value*>(aclen, cvalue(static_cast<long>(sizeOf(aty->type())))));
  687|     30|    });
_ZZN6hobbes10newArrayfn5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E0_clIN4llvm11LLVMContextEEEDaSK_:
  690|     30|    withContext([&](auto&) { c->builder()->CreateStore(aclen, structOffset(c->builder(), varArrayType(boolType()), cmdata, 0)); });
_ZNK6hobbes7alenexp4typeERNS_6typedbE:
  311|      1|  PolyTypePtr type(typedb&) const override {
  312|      1|    static MonoTypePtr tg0(TGen::make(0));
  313|      1|    static MonoTypePtr tlong(Prim::make("long"));
  314|      1|    static PolyTypePtr alenty(new PolyType(1, qualtype(Func::make(tuplety(list(MonoTypePtr(Array::make(tg0)))), tlong))));
  315|       |
  316|      1|    return alenty;
  317|      1|  }
_ZN6hobbes7alenexp5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
  296|     70|  llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) override {
  297|     70|    return withContext([c, &es](auto&) {
  298|     70|      llvm::Value* arr = c->compile(es[0]);
  299|     70|#if LLVM_VERSION_MAJOR >= 18
  300|     70|      llvm::Value* v = structOffset(c->builder(), varArrayType(boolType()), arr, 0);
  301|     70|      return c->builder()->CreateLoad(longType(), v, false, "at");
  302|       |#elif LLVM_VERSION_MAJOR >= 16
  303|       |      llvm::Value* v = structOffset(c->builder(), arr, 0);
  304|       |      return c->builder()->CreateLoad(longType(), v, false, "at");
  305|       |#else
  306|       |      return c->builder()->CreateLoad(structOffset(c->builder(), arr, 0), false, "at");
  307|       |#endif
  308|     70|    });
  309|     70|  }
_ZZN6hobbes7alenexp5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
  297|     70|    return withContext([c, &es](auto&) {
  298|     70|      llvm::Value* arr = c->compile(es[0]);
  299|     70|#if LLVM_VERSION_MAJOR >= 18
  300|     70|      llvm::Value* v = structOffset(c->builder(), varArrayType(boolType()), arr, 0);
  301|     70|      return c->builder()->CreateLoad(longType(), v, false, "at");
  302|       |#elif LLVM_VERSION_MAJOR >= 16
  303|       |      llvm::Value* v = structOffset(c->builder(), arr, 0);
  304|       |      return c->builder()->CreateLoad(longType(), v, false, "at");
  305|       |#else
  306|       |      return c->builder()->CreateLoad(structOffset(c->builder(), arr, 0), false, "at");
  307|       |#endif
  308|     70|    });
_ZNK6hobbes10aconcatexp4typeERNS_6typedbE:
  411|      1|  PolyTypePtr type(typedb&) const override {
  412|      1|    static MonoTypePtr tg0(TGen::make(0));
  413|      1|    static MonoTypePtr earr(Array::make(tg0));
  414|      1|    static PolyTypePtr fty(new PolyType(1, qualtype(Func::make(tuplety(list(earr,earr)), earr))));
  415|       |
  416|      1|    return fty;
  417|      1|  }
_ZN6hobbes10aconcatexp5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
  323|      6|  llvm::Value* apply(jitcc* c, const MonoTypes& tys, const MonoTypePtr&, const Exprs& es) override {
  324|      6|    auto* aty = is<Array>(tys[0]);
  325|      6|    if (aty == nullptr) {
  ------------------
  |  Branch (325:9): [True: 0, False: 6]
  ------------------
  326|      0|      throw annotated_error(*es[0], "Internal compiler error -- can't make array out of non-array type: " + show(tys[0]));
  327|      0|    }
  328|       |
  329|      6|    return withContext([&](auto&) {
  330|      6|#if LLVM_VERSION_MAJOR >= 18
  331|      6|      llvm::Type* varrTy = varArrayType(toLLVM(aty->type(), is<OpaquePtr>(aty->type()) || is<Func>(aty->type())));
  332|      6|      llvm::Type* elemArrTy = arrayType(toLLVM(aty->type(), is<OpaquePtr>(aty->type()) || is<Func>(aty->type())), 1);
  333|      6|#endif
  334|       |
  335|      6|      llvm::Value* a0 = c->compile(es[0]);
  336|      6|#if LLVM_VERSION_MAJOR >= 18
  337|      6|      llvm::Value* a00 = structOffset(c->builder(), varrTy, a0, 0);
  338|      6|      llvm::Value* c0 = c->builder()->CreateLoad(longType(), a00);
  339|      6|      llvm::Value* d0 = structOffset(c->builder(), varrTy, a0, 1);
  340|       |#elif LLVM_VERSION_MAJOR >= 16
  341|       |      llvm::Value* a00 = structOffset(c->builder(), a0, 0);
  342|       |      llvm::Value* c0 = c->builder()->CreateLoad(longType(), a00);
  343|       |      llvm::Value* d0 = structOffset(c->builder(), a0, 1);
  344|       |#else
  345|       |      llvm::Value* a00 = structOffset(c->builder(), a0, 0);
  346|       |      llvm::Value* c0 = c->builder()->CreateLoad(a00);
  347|       |      llvm::Value* d0 = structOffset(c->builder(), a0, 1);
  348|       |#endif
  349|      6|      llvm::Value* a1 = c->compile(es[1]);
  350|      6|#if LLVM_VERSION_MAJOR >= 18
  351|      6|      llvm::Value* a10 = structOffset(c->builder(), varrTy, a1, 0);
  352|      6|      llvm::Value* c1 = c->builder()->CreateLoad(longType(), a10);
  353|      6|      llvm::Value* d1 = structOffset(c->builder(), varrTy, a1, 1);
  354|       |#elif LLVM_VERSION_MAJOR >= 16
  355|       |      llvm::Value* a10 = structOffset(c->builder(), a1, 0);
  356|       |      llvm::Value* c1 = c->builder()->CreateLoad(longType(), a10);
  357|       |      llvm::Value* d1 = structOffset(c->builder(), a1, 1);
  358|       |#else
  359|       |      llvm::Value* a10 = structOffset(c->builder(), a1, 0);
  360|       |      llvm::Value* c1 = c->builder()->CreateLoad(a10);
  361|       |      llvm::Value* d1 = structOffset(c->builder(), a1, 1);
  362|       |#endif
  363|       |
  364|       |      // the number of bytes one element occupies in the result -- the same
  365|       |      // value the memcopies below use, including the opaque-pointer special
  366|       |      // case, so the size the allocation is checked against is the size the
  367|       |      // copy actually writes
  368|      6|      const long elemSize = isUnit(aty->type())
  369|      6|        ? 0
  370|      6|        : (is<OpaquePtr>(aty->type()) ? static_cast<long>(sizeof(void*))
  371|      6|                                      : static_cast<long>(sizeOf(aty->type())));
  372|       |
  373|       |      // c0 and c1 are the operands' own length headers, which an array loaded
  374|       |      // from a crafted db file (or set with unsafeSetLength) controls, so the
  375|       |      // sum and the byte product can each wrap -- an undersized allocation
  376|       |      // whose header still claims the huge length, then an OOB memcopy
  377|       |      // (STRFR-433969). Compute the byte size in a helper that refuses to
  378|       |      // wrap; the aclen add below is safe once it has, since the helper has
  379|       |      // already rejected a sum that would overflow.
  380|      6|      llvm::Function* szf = c->lookupFunction(".checkedArrayConcatByteSize");
  381|      6|      if (szf == nullptr) { throw std::runtime_error("Internal compiler error -- no array size checker defined."); }
  382|      6|      llvm::Value* mlen = fncall(c->builder(), szf, szf->getFunctionType(),
  383|      6|        list<llvm::Value*>(c0, c1, cvalue(elemSize)));
  384|       |
  385|      6|      llvm::Value* aclen = c->builder()->CreateAdd(c0, c1);
  386|       |
  387|      6|      llvm::Value* cmdata = c->compileAllocStmt(mlen, cvalue(std::max<long>(sizeof(long), alignment(aty->type()))), toLLVM(tys[0]));
  388|      6|#if LLVM_VERSION_MAJOR >= 18
  389|      6|      c->builder()->CreateStore(aclen, structOffset(c->builder(), varrTy, cmdata, 0));
  390|       |#else
  391|       |      c->builder()->CreateStore(aclen, structOffset(c->builder(), cmdata, 0));
  392|       |#endif
  393|       |
  394|      6|      if (!isUnit(aty->type())) {
  395|       |        // elemSize computed above -- opaque pointers are stored as pointers
  396|       |        // within arrays, and the allocation was sized with this same value
  397|      6|#if LLVM_VERSION_MAJOR >= 18
  398|      6|        llvm::Value* od = structOffset(c->builder(), varrTy, cmdata, 1);
  399|      6|        memCopy(c->builder(), offset(c->builder(), elemArrTy, od, 0), 8, d0, 8, c->builder()->CreateMul(c0, cvalue(elemSize)));
  400|      6|        memCopy(c->builder(), offset(c->builder(), elemArrTy, od, c0), 8, d1, 8, c->builder()->CreateMul(c1, cvalue(elemSize)));
  401|       |#else
  402|       |        llvm::Value* od = structOffset(c->builder(), cmdata, 1);
  403|       |        memCopy(c->builder(), offset(c->builder(), od, 0), 8, d0, 8, c->builder()->CreateMul(c0, cvalue(elemSize)));
  404|       |        memCopy(c->builder(), offset(c->builder(), od, c0), 8, d1, 8, c->builder()->CreateMul(c1, cvalue(elemSize)));
  405|       |#endif
  406|      6|      }
  407|      6|      return cmdata;
  408|      6|    });
  409|      6|  }
_ZZN6hobbes10aconcatexp5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
  329|      6|    return withContext([&](auto&) {
  330|      6|#if LLVM_VERSION_MAJOR >= 18
  331|      6|      llvm::Type* varrTy = varArrayType(toLLVM(aty->type(), is<OpaquePtr>(aty->type()) || is<Func>(aty->type())));
  ------------------
  |  Branch (331:61): [True: 0, False: 6]
  |  Branch (331:91): [True: 0, False: 6]
  ------------------
  332|      6|      llvm::Type* elemArrTy = arrayType(toLLVM(aty->type(), is<OpaquePtr>(aty->type()) || is<Func>(aty->type())), 1);
  ------------------
  |  Branch (332:61): [True: 0, False: 6]
  |  Branch (332:91): [True: 0, False: 6]
  ------------------
  333|      6|#endif
  334|       |
  335|      6|      llvm::Value* a0 = c->compile(es[0]);
  336|      6|#if LLVM_VERSION_MAJOR >= 18
  337|      6|      llvm::Value* a00 = structOffset(c->builder(), varrTy, a0, 0);
  338|      6|      llvm::Value* c0 = c->builder()->CreateLoad(longType(), a00);
  339|      6|      llvm::Value* d0 = structOffset(c->builder(), varrTy, a0, 1);
  340|       |#elif LLVM_VERSION_MAJOR >= 16
  341|       |      llvm::Value* a00 = structOffset(c->builder(), a0, 0);
  342|       |      llvm::Value* c0 = c->builder()->CreateLoad(longType(), a00);
  343|       |      llvm::Value* d0 = structOffset(c->builder(), a0, 1);
  344|       |#else
  345|       |      llvm::Value* a00 = structOffset(c->builder(), a0, 0);
  346|       |      llvm::Value* c0 = c->builder()->CreateLoad(a00);
  347|       |      llvm::Value* d0 = structOffset(c->builder(), a0, 1);
  348|       |#endif
  349|      6|      llvm::Value* a1 = c->compile(es[1]);
  350|      6|#if LLVM_VERSION_MAJOR >= 18
  351|      6|      llvm::Value* a10 = structOffset(c->builder(), varrTy, a1, 0);
  352|      6|      llvm::Value* c1 = c->builder()->CreateLoad(longType(), a10);
  353|      6|      llvm::Value* d1 = structOffset(c->builder(), varrTy, a1, 1);
  354|       |#elif LLVM_VERSION_MAJOR >= 16
  355|       |      llvm::Value* a10 = structOffset(c->builder(), a1, 0);
  356|       |      llvm::Value* c1 = c->builder()->CreateLoad(longType(), a10);
  357|       |      llvm::Value* d1 = structOffset(c->builder(), a1, 1);
  358|       |#else
  359|       |      llvm::Value* a10 = structOffset(c->builder(), a1, 0);
  360|       |      llvm::Value* c1 = c->builder()->CreateLoad(a10);
  361|       |      llvm::Value* d1 = structOffset(c->builder(), a1, 1);
  362|       |#endif
  363|       |
  364|       |      // the number of bytes one element occupies in the result -- the same
  365|       |      // value the memcopies below use, including the opaque-pointer special
  366|       |      // case, so the size the allocation is checked against is the size the
  367|       |      // copy actually writes
  368|      6|      const long elemSize = isUnit(aty->type())
  ------------------
  |  Branch (368:29): [True: 0, False: 6]
  ------------------
  369|      6|        ? 0
  370|      6|        : (is<OpaquePtr>(aty->type()) ? static_cast<long>(sizeof(void*))
  ------------------
  |  Branch (370:12): [True: 0, False: 6]
  ------------------
  371|      6|                                      : static_cast<long>(sizeOf(aty->type())));
  372|       |
  373|       |      // c0 and c1 are the operands' own length headers, which an array loaded
  374|       |      // from a crafted db file (or set with unsafeSetLength) controls, so the
  375|       |      // sum and the byte product can each wrap -- an undersized allocation
  376|       |      // whose header still claims the huge length, then an OOB memcopy
  377|       |      // (STRFR-433969). Compute the byte size in a helper that refuses to
  378|       |      // wrap; the aclen add below is safe once it has, since the helper has
  379|       |      // already rejected a sum that would overflow.
  380|      6|      llvm::Function* szf = c->lookupFunction(".checkedArrayConcatByteSize");
  381|      6|      if (szf == nullptr) { throw std::runtime_error("Internal compiler error -- no array size checker defined."); }
  ------------------
  |  Branch (381:11): [True: 0, False: 6]
  ------------------
  382|      6|      llvm::Value* mlen = fncall(c->builder(), szf, szf->getFunctionType(),
  383|      6|        list<llvm::Value*>(c0, c1, cvalue(elemSize)));
  384|       |
  385|      6|      llvm::Value* aclen = c->builder()->CreateAdd(c0, c1);
  386|       |
  387|      6|      llvm::Value* cmdata = c->compileAllocStmt(mlen, cvalue(std::max<long>(sizeof(long), alignment(aty->type()))), toLLVM(tys[0]));
  388|      6|#if LLVM_VERSION_MAJOR >= 18
  389|      6|      c->builder()->CreateStore(aclen, structOffset(c->builder(), varrTy, cmdata, 0));
  390|       |#else
  391|       |      c->builder()->CreateStore(aclen, structOffset(c->builder(), cmdata, 0));
  392|       |#endif
  393|       |
  394|      6|      if (!isUnit(aty->type())) {
  ------------------
  |  Branch (394:11): [True: 6, False: 0]
  ------------------
  395|       |        // elemSize computed above -- opaque pointers are stored as pointers
  396|       |        // within arrays, and the allocation was sized with this same value
  397|      6|#if LLVM_VERSION_MAJOR >= 18
  398|      6|        llvm::Value* od = structOffset(c->builder(), varrTy, cmdata, 1);
  399|      6|        memCopy(c->builder(), offset(c->builder(), elemArrTy, od, 0), 8, d0, 8, c->builder()->CreateMul(c0, cvalue(elemSize)));
  400|      6|        memCopy(c->builder(), offset(c->builder(), elemArrTy, od, c0), 8, d1, 8, c->builder()->CreateMul(c1, cvalue(elemSize)));
  401|       |#else
  402|       |        llvm::Value* od = structOffset(c->builder(), cmdata, 1);
  403|       |        memCopy(c->builder(), offset(c->builder(), od, 0), 8, d0, 8, c->builder()->CreateMul(c0, cvalue(elemSize)));
  404|       |        memCopy(c->builder(), offset(c->builder(), od, c0), 8, d1, 8, c->builder()->CreateMul(c1, cvalue(elemSize)));
  405|       |#endif
  406|      6|      }
  407|      6|      return cmdata;
  408|      6|    });
_ZNK6hobbes7asetlen4typeERNS_6typedbE:
  438|      1|  PolyTypePtr type(typedb&) const override {
  439|      1|    return polytype(1, qualtype(functy(list(arrayty(tgen(0)), primty("long")), primty("unit"))));
  440|      1|  }
_ZNK6hobbes8salenexp4typeERNS_6typedbE:
  452|      1|  PolyTypePtr type(typedb&) const override {
  453|      1|    static MonoTypePtr tg0(TGen::make(0));
  454|      1|    static MonoTypePtr tg1(TGen::make(1));
  455|      1|    static MonoTypePtr tlong(Prim::make("long"));
  456|      1|    static PolyTypePtr alenty(new PolyType(2, qualtype(Func::make(tuplety(list(MonoTypePtr(FixedArray::make(tg0, tg1)))), tlong))));
  457|       |
  458|      1|    return alenty;
  459|      1|  }
_ZNK6hobbes6saelem4typeERNS_6typedbE:
  500|      1|  PolyTypePtr type(typedb&) const override {
  501|      1|    static MonoTypePtr tg0(TGen::make(0));
  502|      1|    static MonoTypePtr tg1(TGen::make(1));
  503|      1|    static MonoTypePtr tlong(Prim::make("long"));
  504|      1|    static PolyTypePtr aelemty(new PolyType(2, qualtype(Func::make(tuplety(list(MonoTypePtr(FixedArray::make(tg0, tg1)), tlong)), tg0))));
  505|      1|    return aelemty;
  506|      1|  }
_ZNK6hobbes7saacopy4typeERNS_6typedbE:
  533|      1|  PolyTypePtr type(typedb&) const override {
  534|      1|    static MonoTypePtr tg0 (TGen::make(0));
  535|      1|    static MonoTypePtr tg1 (TGen::make(1));
  536|      1|    static MonoTypePtr faty(FixedArray::make(tg0, tg1));
  537|      1|    static MonoTypePtr vaty(Array::make(tg0));
  538|      1|    static MonoTypePtr lty (Prim::make("long"));
  539|      1|    static MonoTypePtr rty (Prim::make("unit"));
  540|      1|    static PolyTypePtr fty(new PolyType(2, qualtype(Func::make(tuplety(list(faty, vaty, lty)), rty))));
  541|      1|    return fty;
  542|      1|  }
_ZNK6hobbes8applyCFn4typeERNS_6typedbE:
  576|      1|  PolyTypePtr type(typedb&) const override {
  577|      1|    static MonoTypePtr tg0(TGen::make(0));
  578|      1|    static MonoTypePtr tg1(TGen::make(1));
  579|      1|    static MonoTypePtr tf(Func::make(tg0, tg1));
  580|      1|    static MonoTypePtr apt(Func::make(tuplety(list(tf, tg0)), tg1));
  581|      1|    static PolyTypePtr appt(new PolyType(2, qualtype(apt)));
  582|      1|    return appt;
  583|      1|  }
_ZNK6hobbes6adjptr4typeERNS_6typedbE:
  721|      1|  PolyTypePtr type(typedb&) const override {
  722|      1|    static MonoTypePtr tg0(TGen::make(0));
  723|      1|    static MonoTypePtr tg1(TGen::make(1));
  724|      1|    static MonoTypePtr tint(Prim::make("int"));
  725|      1|    static PolyTypePtr fty(new PolyType(2, qualtype(Func::make(tuplety(list(tg0, tint)), tg1))));
  726|      1|    return fty;
  727|      1|  }
_ZNK6hobbes10adjvtblptr4typeERNS_6typedbE:
  769|      1|  PolyTypePtr type(typedb&) const override {
  770|      1|    static MonoTypePtr tg0(TGen::make(0));
  771|      1|    static MonoTypePtr tg1(TGen::make(1));
  772|      1|    static MonoTypePtr tint(Prim::make("int"));
  773|      1|    static PolyTypePtr fty(new PolyType(2, qualtype(Func::make(tuplety(list(tg0, tint)), tg1))));
  774|      1|    return fty;
  775|      1|  }
_ZNK6hobbes9recHLabel4typeERNS_6typedbE:
  795|      1|  PolyTypePtr type(typedb&) const override {
  796|      1|    static PolyTypePtr unsafeTy(new PolyType(1, qualtype(functy(list(tgen(0)), arrayty(prim<char>())))));
  797|      1|    return unsafeTy;
  798|      1|  }
_ZNK6hobbes9recHValue4typeERNS_6typedbE:
  817|      1|  PolyTypePtr type(typedb&) const override {
  818|      1|    static PolyTypePtr unsafeTy(new PolyType(2, qualtype(functy(list(tgen(0)), tgen(1)))));
  819|      1|    return unsafeTy;
  820|      1|  }
_ZNK6hobbes7recTail4typeERNS_6typedbE:
  846|      1|  PolyTypePtr type(typedb&) const override {
  847|      1|    static PolyTypePtr unsafeTy(new PolyType(2, qualtype(functy(list(tgen(0)), tgen(1)))));
  848|      1|    return unsafeTy;
  849|      1|  }
_ZNK6hobbes9varHLabel4typeERNS_6typedbE:
  871|      1|  PolyTypePtr type(typedb&) const override {
  872|      1|    static PolyTypePtr unsafeTy(new PolyType(1, qualtype(functy(list(tgen(0)), arrayty(prim<char>())))));
  873|      1|    return unsafeTy;
  874|      1|  }
_ZNK6hobbes8varSplit4typeERNS_6typedbE:
 1073|      1|  PolyTypePtr type(typedb&) const override {
 1074|      1|    static PolyTypePtr unsafeTy(new PolyType(4, qualtype(functy(list(tgen(0), closty(list(tgen(1)), tgen(3)), closty(list(tgen(2)), tgen(3))), tgen(3)))));
 1075|      1|    return unsafeTy;
 1076|      1|  }
_ZNK6hobbes7varInjH4typeERNS_6typedbE:
  893|      1|  PolyTypePtr type(typedb&) const override {
  894|      1|    static PolyTypePtr unsafeTy(new PolyType(2, qualtype(functy(list(tgen(0)), tgen(1)))));
  895|      1|    return unsafeTy;
  896|      1|  }
_ZNK6hobbes9penumShow4typeERNS_6typedbE:
 1095|      1|  hobbes::PolyTypePtr type(typedb &) const override {
 1096|      1|    static PolyTypePtr ty(new PolyType(
 1097|      1|        1, qualtype(functy(list(tgen(0)), arrayty(prim<char>())))));
 1098|      1|    return ty;
 1099|      1|  }
_ZNK6hobbes9packLongF4typeERNS_6typedbE:
 1209|      1|  PolyTypePtr type(typedb& db) const override {
 1210|      1|    MonoTypePtr cty(Prim::make("char"));
 1211|      1|    return polytype(0, qualtype(functy(list(cty, cty, cty, cty, cty, cty, cty, cty), lift<long>::type(db))));
 1212|      1|  }
_ZN6hobbes9packLongF5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
 1193|      8|  llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) override {
 1194|      8|    return withContext([&](auto&) {
 1195|      8|      llvm::Value* c0 = c->builder()->CreateShl(c->builder()->CreateIntCast(c->compile(es[0]), longType(), false), 56);
 1196|      8|      llvm::Value* c1 = c->builder()->CreateShl(c->builder()->CreateIntCast(c->compile(es[1]), longType(), false), 48);
 1197|      8|      llvm::Value* c2 = c->builder()->CreateShl(c->builder()->CreateIntCast(c->compile(es[2]), longType(), false), 40);
 1198|      8|      llvm::Value* c3 = c->builder()->CreateShl(c->builder()->CreateIntCast(c->compile(es[3]), longType(), false), 32);
 1199|      8|      llvm::Value* c4 = c->builder()->CreateShl(c->builder()->CreateIntCast(c->compile(es[4]), longType(), false), 24);
 1200|      8|      llvm::Value* c5 = c->builder()->CreateShl(c->builder()->CreateIntCast(c->compile(es[5]), longType(), false), 16);
 1201|      8|      llvm::Value* c6 = c->builder()->CreateShl(c->builder()->CreateIntCast(c->compile(es[6]), longType(), false), 8);
 1202|      8|      llvm::Value* c7 = c->builder()->CreateIntCast(c->compile(es[7]), longType(), false);
 1203|       |
 1204|      8|      return
 1205|      8|        c->builder()->CreateOr(c0,c->builder()->CreateOr(c1,c->builder()->CreateOr(c2,c->builder()->CreateOr(c3,c->builder()->CreateOr(c4,c->builder()->CreateOr(c5,c->builder()->CreateOr(c6,c7)))))));
 1206|      8|    });
 1207|      8|  }
_ZZN6hobbes9packLongF5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
 1194|      8|    return withContext([&](auto&) {
 1195|      8|      llvm::Value* c0 = c->builder()->CreateShl(c->builder()->CreateIntCast(c->compile(es[0]), longType(), false), 56);
 1196|      8|      llvm::Value* c1 = c->builder()->CreateShl(c->builder()->CreateIntCast(c->compile(es[1]), longType(), false), 48);
 1197|      8|      llvm::Value* c2 = c->builder()->CreateShl(c->builder()->CreateIntCast(c->compile(es[2]), longType(), false), 40);
 1198|      8|      llvm::Value* c3 = c->builder()->CreateShl(c->builder()->CreateIntCast(c->compile(es[3]), longType(), false), 32);
 1199|      8|      llvm::Value* c4 = c->builder()->CreateShl(c->builder()->CreateIntCast(c->compile(es[4]), longType(), false), 24);
 1200|      8|      llvm::Value* c5 = c->builder()->CreateShl(c->builder()->CreateIntCast(c->compile(es[5]), longType(), false), 16);
 1201|      8|      llvm::Value* c6 = c->builder()->CreateShl(c->builder()->CreateIntCast(c->compile(es[6]), longType(), false), 8);
 1202|      8|      llvm::Value* c7 = c->builder()->CreateIntCast(c->compile(es[7]), longType(), false);
 1203|       |
 1204|      8|      return
 1205|      8|        c->builder()->CreateOr(c0,c->builder()->CreateOr(c1,c->builder()->CreateOr(c2,c->builder()->CreateOr(c3,c->builder()->CreateOr(c4,c->builder()->CreateOr(c5,c->builder()->CreateOr(c6,c7)))))));
 1206|      8|    });
_ZNK6hobbes8packIntF4typeERNS_6typedbE:
 1237|      1|  PolyTypePtr type(typedb& db) const override {
 1238|      1|    MonoTypePtr cty(Prim::make("char"));
 1239|      1|    return polytype(0, qualtype(functy(list(cty, cty, cty, cty), lift<int>::type(db))));
 1240|      1|  }
_ZNK6hobbes10packShortF4typeERNS_6typedbE:
 1257|      1|  PolyTypePtr type(typedb& db) const override {
 1258|      1|    MonoTypePtr cty(Prim::make("char"));
 1259|      1|    return polytype(0, qualtype(functy(list(cty, cty), lift<short>::type(db))));
 1260|      1|  }
_ZNK6hobbes10cptrrefbyF4typeERNS_6typedbE:
 1279|      1|  PolyTypePtr type(typedb& db) const override {
 1280|      1|    return polytype(qualtype(functy(list(lift<char*>::type(db), lift<long>::type(db)), lift<char>::type(db))));
 1281|      1|  }
_ZN6hobbes10cptrrefbyF5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EE:
 1264|      6|  llvm::Value* apply(jitcc* c, const MonoTypes&, const MonoTypePtr&, const Exprs& es) override {
 1265|      6|    return withContext([&](auto&) {
 1266|      6|#if LLVM_VERSION_MAJOR >= 18
 1267|      6|      llvm::Value* tmp = offset(c->builder(), charType(), c->compile(es[0]), c->compile(es[1]));
 1268|      6|      return c->builder()->CreateLoad(charType(), tmp, false);
 1269|       |#elif LLVM_VERSION_MAJOR >= 16
 1270|       |      llvm::Value* tmp = offset(c->builder(), c->compile(es[0]), c->compile(es[1]));
 1271|       |      return c->builder()->CreateLoad(tmp->getType()->getPointerElementType(), tmp, false);
 1272|       |#else
 1273|       |      return c->builder()->CreateLoad(
 1274|       |          offset(c->builder(), c->compile(es[0]), c->compile(es[1])), false);
 1275|       |#endif
 1276|      6|    });
 1277|      6|  }
_ZZN6hobbes10cptrrefbyF5applyEPNS_5jitccERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_RKS3_IS4_INS_4ExprEESaISE_EEENKUlRT_E_clIN4llvm11LLVMContextEEEDaSK_:
 1265|      6|    return withContext([&](auto&) {
 1266|      6|#if LLVM_VERSION_MAJOR >= 18
 1267|      6|      llvm::Value* tmp = offset(c->builder(), charType(), c->compile(es[0]), c->compile(es[1]));
 1268|      6|      return c->builder()->CreateLoad(charType(), tmp, false);
 1269|       |#elif LLVM_VERSION_MAJOR >= 16
 1270|       |      llvm::Value* tmp = offset(c->builder(), c->compile(es[0]), c->compile(es[1]));
 1271|       |      return c->builder()->CreateLoad(tmp->getType()->getPointerElementType(), tmp, false);
 1272|       |#else
 1273|       |      return c->builder()->CreateLoad(
 1274|       |          offset(c->builder(), c->compile(es[0]), c->compile(es[1])), false);
 1275|       |#endif
 1276|      6|    });

_ZN6hobbes12threadRegionEv:
   72|  78.3k|region& threadRegion() {
   73|  78.3k|  if (threadRegionp == nullptr) {
  ------------------
  |  Branch (73:7): [True: 1, False: 78.3k]
  ------------------
   74|      1|    threadRegionp  = new region(32768 /* min page size = 32K */);
   75|      1|    threadRegionsp = new Regions();
   76|      1|    threadRegionsp->push_back(NamedRegion("scratch", threadRegionp, true /*owned*/));
   77|      1|    currentRegion = 0;
   78|       |
   79|      1|    pthread_once(&regionCleanupKeyOnce, &makeRegionCleanupKey);
   80|      1|    pthread_setspecific(regionCleanupKey, threadRegionsp);
   81|      1|  }
   82|  78.3k|  return *threadRegionp;
   83|  78.3k|}
_ZN6hobbes15addThreadRegionERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPNS_6regionE:
   92|      1|size_t addThreadRegion(const std::string& n, region* r) {
   93|      1|  Regions& rs = threadRegions();
   94|      1|  rs.push_back(NamedRegion(n, r, false /*caller keeps ownership*/));
   95|      1|  return rs.size() - 1;
   96|      1|}
_ZN6hobbes16findThreadRegionERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
   98|      2|size_t findThreadRegion(const std::string& n) {
   99|      2|  const Regions& rs = threadRegions();
  100|      4|  for (size_t i = 0; i < rs.size(); ++i) {
  ------------------
  |  Branch (100:22): [True: 3, False: 1]
  ------------------
  101|      3|    if (rs[i].name == n) {
  ------------------
  |  Branch (101:9): [True: 1, False: 2]
  ------------------
  102|      1|      return i;
  103|      1|    }
  104|      3|  }
  105|      1|  return -1;
  106|      2|}
_ZN6hobbes15setThreadRegionEm:
  122|      4|size_t setThreadRegion(size_t n) {
  123|      4|  const Regions& rs = threadRegions();
  124|      4|  if (n < rs.size()) {
  ------------------
  |  Branch (124:7): [True: 4, False: 0]
  ------------------
  125|      4|    threadRegionp = rs[n].r;
  126|      4|  } else {
  127|      0|    throw std::runtime_error("Invalid region : " + str::from(n));
  128|      0|  }
  129|       |
  130|      4|  size_t r = currentRegion;
  131|      4|  currentRegion = n;
  132|      4|  return r;
  133|      4|}
_ZN6hobbes8memallocEmm:
  141|  78.3k|char* memalloc(size_t n, size_t asz) {
  142|  78.3k|  return reinterpret_cast<char*>(threadRegion().malloc(n, asz));
  143|  78.3k|}
_ZN6hobbes15resetMemoryPoolEv:
  213|      1|void resetMemoryPool() {
  214|      1|  threadRegion().clear();
  215|      1|}
_ZN6hobbes17scoped_pool_resetD2Ev:
  225|      1|scoped_pool_reset::~scoped_pool_reset() {
  226|      1|  resetMemoryPool();
  227|      1|}
_ZN6hobbes20checkedArrayByteSizeEll:
  562|  8.68k|long checkedArrayByteSize(long len, long esz) {
  563|  8.68k|  const long hdr = static_cast<long>(sizeof(long));
  564|       |
  565|  8.68k|  if (len < 0) {
  ------------------
  |  Branch (565:7): [True: 0, False: 8.68k]
  ------------------
  566|      0|    throw std::runtime_error("Cannot allocate an array of negative length: " + str::from(len));
  567|      0|  }
  568|  8.68k|  if (esz != 0 && len > (std::numeric_limits<long>::max() - hdr) / esz) {
  ------------------
  |  Branch (568:7): [True: 8.68k, False: 0]
  |  Branch (568:19): [True: 0, False: 8.68k]
  ------------------
  569|      0|    throw std::runtime_error(
  570|      0|      "Array allocation size is not representable: " + str::from(len) +
  571|      0|      " elements of " + str::from(esz) + " bytes");
  572|      0|  }
  573|  8.68k|  return hdr + len * esz;
  574|  8.68k|}
_ZN6hobbes15initStdFuncDefsERNS_2ccE:
  757|      1|void initStdFuncDefs(cc& ctx) {
  758|      1|  ctx.bind("malloc",                &memalloc);
  759|      1|  ctx.bind("mallocz",               &memallocz);
  760|      1|  ctx.bind("printMemoryPool",       &printMemoryPool);
  761|      1|  ctx.bind("getMemoryPool",         &getMemoryPool);
  762|      1|  ctx.bind("unsafeSetRegion",       &setThreadRegion);
  763|      1|  ctx.bind("unsafeMakeMemRegion",   &makeMemRegion);
  764|      1|  ctx.bind("unsafeClearMemoryPool", &clearMemoryPool);
  765|      1|  ctx.bind("unsafeAbortAtMemUsage", &abortAtMemUsage);
  766|       |
  767|      1|  ctx.bind("showChar",     &showChar);
  768|      1|  ctx.bind("showByte",     &showByte);
  769|      1|  ctx.bind("showByteV",    &showByteV);
  770|      1|  ctx.bind("showShort",    &showShort);
  771|      1|  ctx.bind("showInt",      &showInt);
  772|      1|  ctx.bind("showLong",     &showLong);
  773|      1|  ctx.bind("showInt128",   &showInt128);
  774|      1|  ctx.bind("showFloat",    &showFloat);
  775|      1|  ctx.bind("showDouble",   &showDouble);
  776|      1|  ctx.bind("showString",   &showString);
  777|      1|  ctx.bind("showTimespan", &showTimespanV);
  778|      1|  ctx.bind("showTime",     &showTimeV);
  779|      1|  ctx.bind("showDateTime", &showDateTimeV);
  780|      1|  ctx.bind("strftime",     &formatTimeV);
  781|      1|  ctx.bind("strfdatetime", &formatDateTime);
  782|      1|  ctx.bind("now",          &now);
  783|      1|  ctx.bind("date",         &truncDate);
  784|      1|  ctx.bind("time",         &truncTime);
  785|      1|  ctx.bind("datetimeAt",   &datetimeAt);
  786|      1|  ctx.bind("gmtoffset",    &gmtoffset);
  787|      1|  ctx.bind("localtime",    &hlocaltime);
  788|      1|  ctx.bind("gmtime",       &hgmtime);
  789|       |
  790|      1|  ctx.bind("captureStdout", &captureStdout);
  791|      1|  ctx.bind("putStr",        &putStr);
  792|      1|  ctx.bind("releaseStdout", &releaseStdout);
  793|       |
  794|      1|  ctx.bind("readChar",   &readChar);
  795|      1|  ctx.bind("readByte",   &readByte);
  796|      1|  ctx.bind("readShort",  &readShort);
  797|      1|  ctx.bind("readInt",    &readInt);
  798|      1|  ctx.bind("readLong",   &readLong);
  799|      1|  ctx.bind("readInt128", static_cast<const maybe<int128_t>::ty*(*)(const array<char>*)>(&readInt128));
  800|      1|  ctx.bind("readFloat",  &readFloat);
  801|      1|  ctx.bind("readDouble", &readDouble);
  802|       |
  803|       |  // std::string* assignment (dangerous and hidden!)
  804|      1|  ctx.bind("stdstringAssign", &stdstringAssign);
  805|       |
  806|       |  // a source of randomness (maybe worth revisiting!)
  807|      1|  srand(::time(nullptr));
  808|      1|  ctx.bind("random", &random);
  809|      1|  ctx.bind("lrand",  &lrand);
  810|      1|  ctx.bind("ceil",   &lceil);
  811|      1|  ctx.bind("floor",  &lfloor);
  812|      1|  ctx.bind("truncd", &truncd);
  813|      1|  ctx.bind("sqrt",   &dsqrt);
  814|      1|  ctx.bind("log",    &dlog);
  815|      1|  ctx.bind("abs",    &dfabs);
  816|       |
  817|       |  // this should never be called, it's only here to do something in the event of variant tag match failure
  818|      1|  ctx.bind(".failvarmatch", &failvarmatch);
  819|       |
  820|       |  // bounds the length newArray was handed before it becomes an allocation
  821|      1|  ctx.bind(".checkedArrayByteSize", &checkedArrayByteSize);
  822|       |  // ... and the summed length two arrays being concatenated would have
  823|      1|  ctx.bind(".checkedArrayConcatByteSize", &checkedArrayConcatByteSize);
  824|       |
  825|       |  // string comparisons
  826|      1|  ctx.bind("cstrlen", &cstrlen);
  827|      1|  ctx.bind("cstrelem", &cstrelem);
  828|       |
  829|       |  // dump some bytes
  830|      1|  ctx.bind(".dumpBytes", &dumpBytes);
  831|       |
  832|       |  // block codecs for primitives (maybe just emit reasonable code for these?)
  833|      1|  ctx.bind("fdReadBool",    &fdRead<bool>);
  834|      1|  ctx.bind("fdWriteBool",   &fdWrite<bool>);
  835|      1|  ctx.bind("fdReadByte",    &fdRead<unsigned char>);
  836|      1|  ctx.bind("fdWriteByte",   &fdWrite<unsigned char>);
  837|      1|  ctx.bind("fdReadChar",    &fdRead<char>);
  838|      1|  ctx.bind("fdWriteChar",   &fdWrite<char>);
  839|      1|  ctx.bind("fdReadShort",   &fdRead<short>);
  840|      1|  ctx.bind("fdWriteShort",  &fdWrite<short>);
  841|      1|  ctx.bind("fdReadInt",     &fdRead<int>);
  842|      1|  ctx.bind("fdWriteInt",    &fdWrite<int>);
  843|      1|  ctx.bind("fdReadLong",    &fdRead<long>);
  844|      1|  ctx.bind("fdWriteLong",   &fdWrite<long>);
  845|      1|  ctx.bind("fdReadInt128",  &fdRead<int128_t>);
  846|      1|  ctx.bind("fdWriteInt128", &fdWrite<int128_t>);
  847|      1|  ctx.bind("fdReadFloat",   &fdRead<float>);
  848|      1|  ctx.bind("fdWriteFloat",  &fdWrite<float>);
  849|      1|  ctx.bind("fdReadDouble",  &fdRead<double>);
  850|      1|  ctx.bind("fdWriteDouble", &fdWrite<double>);
  851|       |
  852|      1|  ctx.bind("fdWriteChars", &fdWriteChars);
  853|      1|  ctx.bind("fdWriteBytes", &fdWriteBytes);
  854|       |
  855|       |  // support basic zlib compression on byte arrays (why not?  we're already linking it in)
  856|      1|  ctx.bind("compress",   &compressBytes);
  857|      1|  ctx.bind("decompress", &uncompressBytes);
  858|       |
  859|      1|  ctx.bind("runEvery", &runEvery);
  860|       |
  861|      1|  ctx.bind("vectorSize", &vectorSize);
  862|      1|  ctx.bind("vectorData", &vectorData);
  863|      1|}
_ZN6hobbes11NamedRegionC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPNS_6regionEb:
   33|      2|  NamedRegion(const std::string& name, region* r, bool owned) : name(name), r(r), owned(owned) { }
funcdefs.C:_ZN6hobbesL20makeRegionCleanupKeyEv:
   68|      1|static void makeRegionCleanupKey() {
   69|      1|  pthread_key_create(&regionCleanupKey, &releaseThreadRegions);
   70|      1|}
funcdefs.C:_ZN6hobbesL13threadRegionsEv:
   85|      7|static Regions& threadRegions() {
   86|      7|  if (threadRegionsp == nullptr) {
  ------------------
  |  Branch (86:7): [True: 1, False: 6]
  ------------------
   87|      1|    threadRegion();
   88|      1|  }
   89|      7|  return *threadRegionsp;
   90|      7|}

_ZN6hobbes12ConstantList11storeFnAddrERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPN4llvm8ConstantE:
  305|    134|                               llvm::Constant *funcAddr) {
  306|    134|  constants[name] = Constant{.value = funcAddr, .ty = Ty::Function};
  307|    134|}
_ZN6hobbes12ConstantList11createGVDefERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERN4llvm6ModuleEPNS9_8ConstantERKSt10shared_ptrINS_8MonoTypeEE:
  311|     12|                               const MonoTypePtr &mtype) {
  312|     12|  llvm::Type *type = toLLVM(mtype);
  313|     12|  new llvm::GlobalVariable(m, type, /*isConstant=*/true,
  314|     12|                           llvm::GlobalVariable::ExternalLinkage, initVal,
  315|     12|                           name);
  316|       |
  317|     12|  const auto vf = [&, type, name](llvm::Module &m) -> llvm::GlobalVariable * {
  318|     12|    return createGVDecl(
  319|     12|        prepgv(new llvm::GlobalVariable(m, type, /*isConstant=*/true,
  320|     12|                                        llvm::GlobalVariable::ExternalLinkage,
  321|     12|                                        /*initializer=*/nullptr, name)),
  322|     12|        m, name);
  323|     12|  };
  324|     12|  const auto tf = [&mtype] {
  325|     12|    if (is<Array>(mtype) != nullptr) {
  326|     12|      return Ty::Array;
  327|     12|    }
  328|     12|    if (hasPointerRep(mtype)) {
  329|     12|      return Ty::HasPointerRep;
  330|     12|    }
  331|     12|    return Ty::Other;
  332|     12|  };
  333|       |
  334|     12|  constants[name] = Constant{
  335|     12|      .value = VarDeclFnTy(vf),
  336|     12|      .ty = tf(),
  337|     12|  };
  338|     12|}
_ZN6hobbes12ConstantList12loadConstantEN4llvm9StringRefERNS1_6ModuleERNS1_9IRBuilderINS1_14ConstantFolderENS1_24IRBuilderDefaultInserterEEE:
  341|     39|                                        llvm::IRBuilder<> &builder) {
  342|     39|  const auto it = constants.find(name);
  343|     39|  if (it == constants.end()) {
  ------------------
  |  Branch (343:7): [True: 4, False: 35]
  ------------------
  344|      4|    return nullptr;
  345|      4|  }
  346|       |
  347|     35|  if (it->second.ty == Ty::Function) {
  ------------------
  |  Branch (347:7): [True: 0, False: 35]
  ------------------
  348|      0|    return *it->second.value.get<llvm::Constant *>();
  349|      0|  }
  350|       |
  351|     35|  return withContext([&](auto &) -> llvm::Value * {
  352|     35|    auto *g = llvm::cast<llvm::GlobalVariable>(
  353|     35|        static_cast<llvm::Value *>((*it->second.value.get<VarDeclFnTy>())(m)));
  354|       |
  355|     35|    switch (it->second.ty) {
  356|     35|    case Ty::Array:
  357|       |#if LLVM_VERSION_MAJOR < 16
  358|       |      return builder.CreateLoad(g);
  359|       |#else
  360|     35|      return builder.CreateLoad(g->getValueType(), g);
  361|     35|#endif
  362|     35|    case Ty::HasPointerRep:
  363|     35|      return g;
  364|     35|    default:
  365|     35|      return builder.CreateAlignedLoad(g->getValueType(), g,
  366|     35|                                       llvm::MaybeAlign(8));
  367|     35|    }
  368|     35|  });
  369|     35|}
_ZN6hobbes5VTEnv15getOrCreateDeclEN4llvm9StringRefERNS1_6ModuleE:
  436|  1.81k|llvm::Value *VTEnv::getOrCreateDecl(llvm::StringRef name, llvm::Module &m) {
  437|  3.40k|  for (auto vb = vtenv.rbegin(); vb != vtenv.rend(); ++vb) {
  ------------------
  |  Branch (437:34): [True: 3.30k, False: 97]
  ------------------
  438|  3.30k|    const auto it = vb->find(name);
  439|  3.30k|    if (it == vb->end()) {
  ------------------
  |  Branch (439:9): [True: 1.58k, False: 1.72k]
  ------------------
  440|  1.58k|      continue;
  441|  1.58k|    }
  442|       |
  443|  1.72k|    if (auto *const f = it->second.get<FnDeclFnTy>()) {
  ------------------
  |  Branch (443:21): [True: 253, False: 1.46k]
  ------------------
  444|    253|      return (*f)(m);
  445|    253|    }
  446|       |
  447|  1.46k|    auto *p = it->second.get<llvm::WeakTrackingVH>();
  448|  1.46k|    if (!p->pointsToAliveValue()) {
  ------------------
  |  Branch (448:9): [True: 0, False: 1.46k]
  ------------------
  449|      0|      throw std::runtime_error((name + " has been invalidated").str());
  450|      0|    }
  451|  1.46k|    return *p;
  452|  1.46k|  }
  453|     97|  return nullptr;
  454|  1.81k|}
_ZN6hobbes7Globals18getOrCreateVarDeclEN4llvm9StringRefERNS1_6ModuleE:
  502|     99|                                                  llvm::Module &m) {
  503|     99|  const auto it = globals.find(name);
  504|     99|  if (it == globals.end() || isFunc(it)) {
  ------------------
  |  Branch (504:7): [True: 39, False: 60]
  |  Branch (504:7): [True: 95, False: 4]
  |  Branch (504:30): [True: 56, False: 4]
  ------------------
  505|     95|    return nullptr;
  506|     95|  }
  507|       |
  508|      4|  auto *p = (*it->second.get<VarDeclFnTy>())(m);
  509|      4|  return llvm::cast<llvm::GlobalVariable>(static_cast<llvm::Value *>(p));
  510|     99|}
_ZN6hobbes7Globals19getOrCreateFuncDeclEN4llvm9StringRefERNS1_6ModuleE:
  513|    275|                                             llvm::Module &m) {
  514|    275|  const auto it = globals.find(name);
  515|    275|  if (it == globals.end() || !isFunc(it)) {
  ------------------
  |  Branch (515:7): [True: 39, False: 236]
  |  Branch (515:7): [True: 39, False: 236]
  |  Branch (515:30): [True: 0, False: 236]
  ------------------
  516|     39|    return nullptr;
  517|     39|  }
  518|       |
  519|    236|  auto *p = (*it->second.get<FnDeclFnTy>())(m);
  520|    236|  return llvm::cast<llvm::Function>(static_cast<llvm::Value *>(p));
  521|    275|}
_ZN6hobbes7Globals3addERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPN4llvm4TypeE:
  523|      2|void Globals::add(const std::string &name, llvm::Type *ty) {
  524|      2|  globals[name] = VarDeclFnTy([ty, name](llvm::Module &m) {
  525|      2|    return createGVDecl(
  526|      2|        prepgv(new llvm::GlobalVariable(m, ty, /*isConstant=*/false,
  527|      2|                                        llvm::GlobalValue::ExternalLinkage,
  528|      2|                                        /*initializer=*/nullptr, name),
  529|      2|               sizeof(void *)),
  530|      2|        m, name);
  531|      2|  });
  532|      2|}
_ZN6hobbes7Globals3addERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPN4llvm12FunctionTypeE:
  534|    293|void Globals::add(const std::string &name, llvm::FunctionType *ty) {
  535|    293|  globals[name] = FnDeclFnTy([ty, name](llvm::Module &m) {
  536|    293|    return createFnDecl(
  537|    293|        llvm::Function::Create(ty, llvm::Function::ExternalLinkage, name, m), m,
  538|    293|        name);
  539|    293|  });
  540|    293|}
_ZN6hobbes5jitccC2ERKSt10shared_ptrINS_4TEnvEE:
  574|      1|    : tenv(tenv), vtenv(std::make_unique<VTEnv>()), ignoreLocalScope(false),
  575|      1|      globals(std::make_unique<Globals>()), globalData(32768 /* min global page size = 32K */),
  576|      1|      constants(std::make_unique<ConstantList>()) {
  577|      1|  llvm::InitializeNativeTarget();
  578|      1|  llvm::InitializeNativeTargetAsmParser();
  579|      1|  llvm::InitializeNativeTargetAsmPrinter();
  580|       |
  581|      1|  this->orcjit = std::make_unique<ORCJIT>();
  582|       |
  583|       |  // allocate an IR builder with an initial dummy basic-block to write into
  584|      1|  this->irbuilder = withContext([](llvm::LLVMContext& c) {
  585|      1|      auto r = std::make_unique<llvm::IRBuilder<>>(c);
  586|      1|      r->SetInsertPoint(llvm::BasicBlock::Create(c, "dummy"));
  587|      1|      return r;
  588|      1|  });
  589|       |
  590|       |  // make sure we've always got one frame for variable defs
  591|      1|  this->pushScope();
  592|      1|}
_ZN6hobbes5jitccD2Ev:
  594|      1|jitcc::~jitcc() {
  595|       |  // release low-level functions
  596|    181|  for (const auto& f : this->fenv) {
  ------------------
  |  Branch (596:22): [True: 181, False: 1]
  ------------------
  597|    181|    delete f.second;
  598|    181|  }
  599|      1|}
_ZNK6hobbes5jitcc7typeEnvEv:
  660|  2.15k|const TEnvPtr& jitcc::typeEnv() const {
  661|  2.15k|  return this->tenv;
  662|  2.15k|}
_ZNK6hobbes5jitcc7builderEv:
  664|  5.46k|llvm::IRBuilder<>* jitcc::builder() const {
  665|  5.46k|  return this->irbuilder.get();
  666|  5.46k|}
_ZN6hobbes5jitcc6moduleEv:
  669|  2.62k|llvm::Module *jitcc::module() {
  670|  2.62k|  if (this->currentModule == nullptr) {
  ------------------
  |  Branch (670:7): [True: 5, False: 2.61k]
  ------------------
  671|      5|    this->currentModule = withContext([](llvm::LLVMContext &c) {
  672|      5|      static std::atomic_int mc{};
  673|      5|      return std::make_unique<llvm::Module>("jitModule" + std::to_string(mc++), c);
  674|      5|    });
  675|      5|  }
  676|  2.62k|  return this->currentModule.get();
  677|  2.62k|}
_ZN6hobbes5jitcc14getMachineCodeEPN4llvm8FunctionEPNS1_16JITEventListenerE:
  691|      5|void* jitcc::getMachineCode(llvm::Function* f, llvm::JITEventListener* /*listener*/) {
  692|      5|  const std::string fname = f->getName().str();
  693|      5|  auto sym = orcjit->lookup(fname);
  694|      5|  if (auto e = sym.takeError()) {
  ------------------
  |  Branch (694:12): [True: 5, False: 0]
  ------------------
  695|      5|    llvm::consumeError(std::move(e));
  696|      5|  } else {
  697|       |#if LLVM_VERSION_MAJOR < 16
  698|       |    return llvm::jitTargetAddressToPointer<void*>(sym->getAddress());
  699|       |#else
  700|      0|    return sym->toPtr<void*>();
  701|      0|#endif
  702|      0|  }
  703|       |
  704|      5|  withContext([&](auto&) {
  705|      5|    const std::string name = this->currentModule->getName().str();
  706|      5|    if (auto e = orcjit->addModule(std::move(this->currentModule))) {
  707|      5|      llvm::logAllUnhandledErrors(std::move(e), llvm::errs());
  708|      5|      throw std::runtime_error("cannot add module " + name);
  709|      5|    }
  710|      5|  });
  711|       |
  712|      5|  sym = orcjit->lookup(fname);
  713|      5|  if (auto e = sym.takeError()) {
  ------------------
  |  Branch (713:12): [True: 0, False: 5]
  ------------------
  714|      0|    logAllUnhandledErrors(std::move(e), llvm::errs());
  715|      0|    throw std::runtime_error(
  716|      0|        "Internal compiler error, no current module and no machine code for (" + fname + ")");
  717|      0|  }
  718|       |
  719|       |#if LLVM_VERSION_MAJOR < 16
  720|       |  return llvm::jitTargetAddressToPointer<void*>(sym->getAddress());
  721|       |#else
  722|      5|  return sym->toPtr<void*>();
  723|      5|#endif
  724|      5|}
_ZNK6hobbes5jitcc9isDefinedERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
 1007|    532|bool jitcc::isDefined(const std::string& vn) const {
 1008|    532|  if (this->globals->contains(vn)) {
  ------------------
  |  Branch (1008:7): [True: 0, False: 532]
  ------------------
 1009|      0|    return true;
 1010|      0|  }
 1011|    532|  if (this->constants->contains(vn)) {
  ------------------
  |  Branch (1011:7): [True: 0, False: 532]
  ------------------
 1012|      0|    return true;
 1013|      0|  }
 1014|    532|  if (lookupOp(vn) != nullptr) {
  ------------------
  |  Branch (1014:7): [True: 0, False: 532]
  ------------------
 1015|      0|    return true;
 1016|      0|  }
 1017|    532|  if (this->vtenv->contains(vn)) {
  ------------------
  |  Branch (1017:7): [True: 0, False: 532]
  ------------------
 1018|      0|    return true;
 1019|      0|  }
 1020|    532|  return false;
 1021|    532|}
_ZN6hobbes5jitcc7compileERKSt10shared_ptrINS_4ExprEE:
 1041|  2.71k|llvm::Value* jitcc::compile(const ExprPtr& exp) {
 1042|  2.71k|  return toLLVM(this, exp);
 1043|  2.71k|}
_ZN6hobbes5jitcc15bindInstructionERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPNS_2opE:
 1049|    181|void jitcc::bindInstruction(const std::string& vn, op* f) {
 1050|    181|  this->fenv[vn] = f;
 1051|    181|}
_ZNK6hobbes5jitcc8lookupOpERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
 1053|  1.75k|op* jitcc::lookupOp(const std::string& vn) const {
 1054|  1.75k|  auto f = this->fenv.find(vn);
 1055|  1.75k|  return (f == this->fenv.end()) ? 0 : f->second;
  ------------------
  |  Branch (1055:10): [True: 874, False: 883]
  ------------------
 1056|  1.75k|}
_ZN6hobbes5jitcc10bindGlobalERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_8MonoTypeEEPv:
 1059|    126|void jitcc::bindGlobal(const std::string &vn, const MonoTypePtr &ty, void *x) {
 1060|    126|  void *value = x;
 1061|    126|  if (is<Func>(ty) != nullptr) {
  ------------------
  |  Branch (1061:7): [True: 124, False: 2]
  ------------------
 1062|    124|    withContext([&](auto &) {
 1063|    124|      this->globals->add(
 1064|    124|          vn, llvm::cast<llvm::FunctionType>(toLLVM(ty, /*asArg=*/false)));
 1065|    124|    });
 1066|    124|    llvm::cantFail(orcjit->addExternalCallableSymbol(vn, value));
 1067|    124|  } else {
 1068|      2|    if (hasPointerRep(ty) || isFileType(ty)) {
  ------------------
  |  Branch (1068:9): [True: 2, False: 0]
  |  Branch (1068:30): [True: 0, False: 0]
  ------------------
 1069|      2|      void **p =
 1070|      2|          reinterpret_cast<void **>(this->globalData.malloc(sizeof(void *)));
 1071|      2|      *p = x;
 1072|      2|      value = p;
 1073|      2|    }
 1074|       |
 1075|      2|    withContext([&](auto &) {
 1076|      2|      return this->globals->add(vn, toLLVM(ty, /*asArg=*/true));
 1077|      2|    });
 1078|      2|    llvm::cantFail(orcjit->addExternalNonCallableSymbol(vn, value));
 1079|      2|  }
 1080|    126|}
_ZN6hobbes5jitcc15lookupGlobalVarERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
 1149|     99|llvm::GlobalVariable* jitcc::lookupGlobalVar(const std::string& vn) {
 1150|     99|  return withContext([&](auto&) { return this->globals->getOrCreateVarDecl(vn, *this->module()); });
 1151|     99|}
_ZN6hobbes5jitcc12lookupVarRefERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
 1185|      2|llvm::GlobalVariable* jitcc::lookupVarRef(const std::string& vn) {
 1186|       |  // if any local variables shadow this global, hide it
 1187|      2|#if LLVM_VERSION_MAJOR >= 11
 1188|      2|  if (this->vtenv->contains(vn)) {
  ------------------
  |  Branch (1188:7): [True: 0, False: 2]
  ------------------
 1189|      0|    return nullptr;
 1190|      0|  }
 1191|       |#else
 1192|       |  for (auto vbs : this->vtenv) {
 1193|       |    if (vbs.find(vn) != vbs.end()) {
 1194|       |      return 0;
 1195|       |    }
 1196|       |  }
 1197|       |#endif
 1198|       |
 1199|       |  // now if we've got a global with this name, we can get a pointer to it
 1200|      2|#if LLVM_VERSION_MAJOR >= 11
 1201|      2|  return lookupGlobalVar(vn);
 1202|       |#else
 1203|       |  return maybeRefGlobal(vn);
 1204|       |#endif
 1205|      2|}
_ZN6hobbes5jitcc12loadConstantERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
 1208|     39|llvm::Value* jitcc::loadConstant(const std::string& vn) {
 1209|     39|  return withContext(
 1210|     39|      [&](auto&) { return this->constants->loadConstant(vn, *this->module(), *builder()); });
 1211|     39|}
_ZN6hobbes5jitcc12defineGlobalERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_4ExprEE:
 1234|    148|void jitcc::defineGlobal(const std::string& vn, const ExprPtr& ue) {
 1235|    148|  std::string vname = vn.empty() ? (".global" + freshName()) : vn;
  ------------------
  |  Branch (1235:23): [True: 0, False: 148]
  ------------------
 1236|    148|  this->globalExprs[vn] = ue;
 1237|    148|  using Thunk = void (*)();
 1238|    148|  MonoTypePtr uety = requireMonotype(this->tenv, ue);
 1239|       |
 1240|    148|  if (isUnit(uety)) {
  ------------------
  |  Branch (1240:7): [True: 0, False: 148]
  ------------------
 1241|       |    // no storage necessary for units
 1242|      0|    Thunk f = reinterpret_cast<Thunk>(reifyMachineCodeForFn(uety, list<std::string>(), list<MonoTypePtr>(), ue));
 1243|      0|    f();
 1244|      0|    releaseMachineCode(reinterpret_cast<void*>(f));
 1245|      0|    resetMemoryPool();
 1246|    148|  } else if (llvm::Constant *c = toLLVMConstant(this, vname, ue)) {
  ------------------
  |  Branch (1246:30): [True: 146, False: 2]
  ------------------
 1247|       |    // make a global constant ...
 1248|    146|#if LLVM_VERSION_MAJOR >= 11
 1249|    146|    if (is<Func>(uety) != nullptr) {
  ------------------
  |  Branch (1249:9): [True: 134, False: 12]
  ------------------
 1250|    134|      withContext(
 1251|    134|          [&](auto &) { return this->constants->storeFnAddr(vname, c); });
 1252|    134|    } else {
 1253|     12|      withContext([&](auto &) {
 1254|     12|        return this->constants->createGVDef(vname, *module(), c, uety);
 1255|     12|      });
 1256|     12|    }
 1257|       |#else
 1258|       |    Constant& cv = this->constants[vname];
 1259|       |    cv.value = c;
 1260|       |    cv.type  = toLLVM(uety);
 1261|       |    cv.mtype = uety;
 1262|       |
 1263|       |    if (is<Func>(uety)) {
 1264|       |      // functions are loaded by name rather than by constant value
 1265|       |      cv.ref = 0;
 1266|       |    } else {
 1267|       |      cv.ref = new llvm::GlobalVariable(*module(), cv.type, true, llvm::GlobalVariable::ExternalLinkage, c, vname);
 1268|       |    }
 1269|       |#endif
 1270|    146|  } else {
 1271|       |    // make some space for this global data ...
 1272|      2|    if (isLargeType(uety)) {
  ------------------
  |  Branch (1272:9): [True: 2, False: 0]
  ------------------
 1273|      2|      void** pdata = reinterpret_cast<void**>(this->globalData.malloc(sizeof(void*)));
 1274|      2|      *pdata = this->globalData.malloc(sizeOf(uety));
 1275|      2|      bindGlobal(vname, uety, pdata);
 1276|      2|    } else {
 1277|      0|      bindGlobal(vname, uety, this->globalData.malloc(sizeOf(uety)));
 1278|      0|    }
 1279|       |
 1280|       |    // compile an initializer function for this expression
 1281|      2|    llvm::BasicBlock* ibb = withContext([this](auto&) { return this->builder()->GetInsertBlock(); });
 1282|      2|    llvm::Function* initfn = allocFunction("." + vname + "_init", MonoTypes(), primty("unit"));
 1283|      2|    if (initfn == nullptr) {
  ------------------
  |  Branch (1283:9): [True: 0, False: 2]
  ------------------
 1284|      0|      throw annotated_error(*ue, "Failed to allocate initializer function for '" + vname + "'.");
 1285|      0|    }
 1286|      2|    try {
 1287|      2|      withContext([&](llvm::LLVMContext& c) {
 1288|      2|        llvm::BasicBlock* bb = llvm::BasicBlock::Create(c, "entry", initfn);
 1289|      2|        this->builder()->SetInsertPoint(bb);
 1290|       |
 1291|      2|        compile(assign(var(vname, uety, ue->la()), ue, ue->la()));
 1292|      2|        this->builder()->CreateRetVoid();
 1293|      2|      });
 1294|      2|    } catch (...) {
 1295|       |      // don't leave the half-built initializer in the live module (the global
 1296|       |      // itself stays bound: its symbol is already registered with the JIT)
 1297|      0|      withContext([&](auto&) {
 1298|      0|        restoreInsertPoint(ibb);
 1299|      0|        this->forgetGlobalDecl(initfn->getName().str());
 1300|      0|        discardFunction(initfn);
 1301|      0|      });
 1302|      0|      this->globalExprs.erase(vn);
 1303|      0|      throw;
 1304|      0|    }
 1305|       |
 1306|       |    // compile and run this function, it should then perform the global variable assignment
 1307|       |    // (make sure that any allocation happens in the global context iff we need it)
 1308|      2|    auto f = reinterpret_cast<Thunk>(getMachineCode(initfn));
 1309|       |
 1310|      2|    if (hasPointerRep(uety)) {
  ------------------
  |  Branch (1310:9): [True: 2, False: 0]
  ------------------
 1311|      2|      size_t oldregion = pushGlobalRegion();
 1312|      2|      f();
 1313|      2|      popGlobalRegion(oldregion);
 1314|      2|    } else {
 1315|      0|      f();
 1316|      0|      resetMemoryPool();
 1317|      0|    }
 1318|       |
 1319|       |    // clean up
 1320|      2|    releaseMachineCode(reinterpret_cast<void*>(f));
 1321|      2|    withContext([this, ibb](auto&) { this->builder()->SetInsertPoint(ibb); });
 1322|       |#if LLVM_VERSION_MAJOR < 11
 1323|       |    initfn->eraseFromParent();
 1324|       |#endif
 1325|      2|  }
 1326|    148|}
_ZN6hobbes5jitcc16pushGlobalRegionEv:
 1328|      2|size_t jitcc::pushGlobalRegion() {
 1329|      2|  std::string n = "global region @ " + str::from(reinterpret_cast<void*>(this));
 1330|      2|  size_t grid = findThreadRegion(n);
 1331|      2|  if (grid == static_cast<size_t>(-1)) {
  ------------------
  |  Branch (1331:7): [True: 1, False: 1]
  ------------------
 1332|      1|    grid = addThreadRegion(n, &this->globalData);
 1333|      1|  }
 1334|      2|  return setThreadRegion(grid);
 1335|      2|}
_ZN6hobbes5jitcc15popGlobalRegionEm:
 1337|      2|void jitcc::popGlobalRegion(size_t x) {
 1338|      2|  setThreadRegion(x);
 1339|      2|}
_ZN6hobbes5jitcc9lookupVarERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_8MonoTypeEE:
 1348|  1.82k|llvm::Value* jitcc::lookupVar(const std::string& vn, const MonoTypePtr& vty) {
 1349|       |  // all units are the same
 1350|  1.82k|  if (isUnit(vty)) {
  ------------------
  |  Branch (1350:7): [True: 4, False: 1.81k]
  ------------------
 1351|      4|    return cvalue(true);
 1352|      4|  }
 1353|       |
 1354|       |  // try to find this variable up the local variable stack (unless we're ignoring local scope)
 1355|  1.81k|#if LLVM_VERSION_MAJOR >= 11
 1356|  1.81k|  if (!this->ignoreLocalScope) {
  ------------------
  |  Branch (1356:7): [True: 1.81k, False: 0]
  ------------------
 1357|  1.81k|    if (auto* fn =
  ------------------
  |  Branch (1357:15): [True: 1.72k, False: 97]
  ------------------
 1358|  1.81k|            withContext([&](auto&) { return this->vtenv->getOrCreateDecl(vn, *this->module()); })) {
 1359|  1.72k|      return fn;
 1360|  1.72k|    }
 1361|  1.81k|  }
 1362|       |#else
 1363|       |  if (!this->ignoreLocalScope) {
 1364|       |    for (size_t i = 0; i < this->vtenv.size(); ++i) {
 1365|       |      const VarBindings& vbs = this->vtenv[this->vtenv.size() - (i + 1)];
 1366|       |      auto vb = vbs.find(vn);
 1367|       |      if (vb != vbs.end()) {
 1368|       |        return maybeRefGlobalV(vb->second);
 1369|       |      }
 1370|       |    }
 1371|       |  }
 1372|       |#endif
 1373|       |
 1374|       |  // try to find this variable as a global
 1375|     97|#if LLVM_VERSION_MAJOR >= 11
 1376|     97|  if (llvm::GlobalVariable* gv = lookupGlobalVar(vn)) {
  ------------------
  |  Branch (1376:29): [True: 2, False: 95]
  ------------------
 1377|       |#else
 1378|       |  if (llvm::GlobalVariable* gv = maybeRefGlobal(vn)) {
 1379|       |#endif
 1380|       |
 1381|       |#if LLVM_VERSION_MAJOR < 16
 1382|       |    return withContext([this, gv](auto&) { return builder()->CreateLoad(gv); });
 1383|       |#else
 1384|      2|    return withContext([this, gv](auto&) { return builder()->CreateLoad(gv->getValueType(), gv); });
 1385|      2|#endif
 1386|      2|  }
 1387|       |
 1388|       |  // maybe it's a function?
 1389|     95|  if (llvm::Function* f = lookupFunction(vn)) {
  ------------------
  |  Branch (1389:23): [True: 56, False: 39]
  ------------------
 1390|     56|    return f;
 1391|     56|  }
 1392|       |
 1393|       |  // try to find this variable as a constant
 1394|     39|  if (llvm::Value* lc = loadConstant(vn)) {
  ------------------
  |  Branch (1394:20): [True: 35, False: 4]
  ------------------
 1395|     35|    return lc;
 1396|     35|  }
 1397|       |
 1398|       |  // maybe it's an op?
 1399|      4|  if (lookupOp(vn) != nullptr) {
  ------------------
  |  Branch (1399:7): [True: 4, False: 0]
  ------------------
 1400|      4|    return compile(etaLift(vn, vty, LexicalAnnotation::null()));
 1401|      4|  }
 1402|       |
 1403|       |  // well there's no other way to find a variable ...
 1404|      0|  throw std::runtime_error("Internal error, reference to undefined variable: " + vn);
 1405|      4|}
_ZN6hobbes5jitcc17internConstStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
 1407|     34|llvm::Value* jitcc::internConstString(const std::string& x) {
 1408|     34|  auto v = this->internConstVars.find(x);
 1409|     34|  if (v != this->internConstVars.end()) return lookupVar(v->second, arrayty(primty("char")));
  ------------------
  |  Branch (1409:7): [True: 26, False: 8]
  ------------------
 1410|       |
 1411|      8|  std::string vn = ".intern.str." + freshName();
 1412|      8|  this->internConstVars[x] = vn;
 1413|      8|  defineGlobal(vn, ExprPtr(mkarray(x, LexicalAnnotation::null())));
 1414|      8|  return lookupVar(vn, arrayty(primty("char")));
 1415|     34|}
_ZN6hobbes5jitcc9pushScopeEv:
 1418|    715|void jitcc::pushScope() {
 1419|    715|  this->vtenv->pushScope();
 1420|    715|}
_ZN6hobbes5jitcc9bindScopeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPN4llvm5ValueE:
 1422|  1.28k|void jitcc::bindScope(const std::string& vn, llvm::Value* v) {
 1423|  1.28k|  this->vtenv->add(vn, v);
 1424|  1.28k|}
_ZN6hobbes5jitcc8popScopeEv:
 1426|    714|void jitcc::popScope() {
 1427|    714|  this->vtenv->popScope();
 1428|    714|}
_ZNK6hobbes5jitcc10scopeDepthEv:
 1430|    205|size_t jitcc::scopeDepth() const {
 1431|    205|  return this->vtenv->depth();
 1432|    205|}
_ZNK6hobbes5jitcc12boundInScopeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
 1434|    308|bool jitcc::boundInScope(const std::string& vn) const {
 1435|    308|  return this->vtenv->containsInCurrentScope(vn);
 1436|    308|}
_ZNK6hobbes5jitcc13hasGlobalDeclERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
 1442|    275|bool jitcc::hasGlobalDecl(const std::string& vn) const {
 1443|    275|  return this->globals->contains(vn);
 1444|    275|}
_ZN6hobbes5jitcc14lookupFunctionERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
 1496|    275|llvm::Function* jitcc::lookupFunction(const std::string& fn) {
 1497|    275|  return withContext(
 1498|    275|      [&](auto&) { return this->globals->getOrCreateFuncDecl(fn, *this->module()); });
 1499|    275|}
_ZN6hobbes5jitcc15compileFunctionERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt6vectorIS6_SaIS6_EERKS9_ISt10shared_ptrINS_8MonoTypeEESaISG_EERKSE_INS_4ExprEE:
 1517|    167|llvm::Function* jitcc::compileFunction(const std::string& name, const str::seq& argns, const MonoTypes& argtys, const ExprPtr& exp) {
 1518|    167|  UCFS fs;
 1519|    167|  fs.push_back(UCF(name, argns, argtys, exp));
 1520|    167|  unsafeCompileFunctions(&fs);
 1521|    167|  return fs[0].result;
 1522|    167|}
_ZN6hobbes5jitcc16compileFunctionsERKSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_4ExprEEESaISC_EEPS1_IPN4llvm8FunctionESaISJ_EE:
 1524|     38|void jitcc::compileFunctions(const LetRec::Bindings& bs, std::vector<llvm::Function*>* result) {
 1525|     38|  UCFS     fs;
 1526|     38|  str::seq newExprs; // what this batch adds to 'globalExprs' (taken back out if it fails)
 1527|     38|  try {
 1528|    141|    for (const auto& b : bs) {
  ------------------
  |  Branch (1528:24): [True: 141, False: 38]
  ------------------
 1529|    141|      if (this->globalExprs.find(b.first) == this->globalExprs.end()) { newExprs.push_back(b.first); }
  ------------------
  |  Branch (1529:11): [True: 141, False: 0]
  ------------------
 1530|    141|      this->globalExprs[b.first] = b.second;
 1531|       |
 1532|    141|      if (const Fn* f = is<Fn>(stripAssumpHead(b.second))) {
  ------------------
  |  Branch (1532:21): [True: 141, False: 0]
  ------------------
 1533|    141|        if (const Func* fty = is<Func>(requireMonotype(this->tenv, b.second))) {
  ------------------
  |  Branch (1533:25): [True: 141, False: 0]
  ------------------
 1534|    141|          fs.push_back(UCF(b.first, f->varNames(), fty->parameters(), f->body()));
 1535|    141|        } else {
 1536|      0|          throw std::runtime_error("Internal error, mutual recursion must be defined over mono-typed functions");
 1537|      0|        }
 1538|    141|      } else {
 1539|      0|        throw std::runtime_error("Internal error, mutual recursion must be defined over functions");
 1540|      0|      }
 1541|    141|    }
 1542|       |
 1543|     38|    unsafeCompileFunctions(&fs);
 1544|     38|  } catch (...) {
 1545|      0|    for (const auto& vn : newExprs) { this->globalExprs.erase(vn); }
  ------------------
  |  Branch (1545:25): [True: 0, False: 0]
  ------------------
 1546|      0|    throw;
 1547|      0|  }
 1548|       |
 1549|     38|  if (result != nullptr) {
  ------------------
  |  Branch (1549:7): [True: 0, False: 38]
  ------------------
 1550|      0|    for (const auto& f : fs) {
  ------------------
  |  Branch (1550:24): [True: 0, False: 0]
  ------------------
 1551|      0|      result->push_back(f.result);
 1552|      0|    }
 1553|      0|  }
 1554|     38|}
_ZN6hobbes5jitcc16compileFunctionsERKSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_4ExprEEESaISC_EE:
 1556|     38|void jitcc::compileFunctions(const LetRec::Bindings& bs) {
 1557|     38|  compileFunctions(bs, nullptr);
 1558|     38|}
_ZN6hobbes5jitcc22unsafeCompileFunctionsEPSt6vectorINS0_3UCFESaIS2_EE:
 1560|    205|void jitcc::unsafeCompileFunctions(UCFS* ufs) {
 1561|    205|  UCFS& fs = *ufs;
 1562|       |
 1563|       |  // save our current write context to restore later
 1564|    205|  llvm::BasicBlock* ibb = withContext([this](auto&) { return this->builder()->GetInsertBlock(); });
 1565|       |
 1566|       |  // if anything below throws, back out of everything this call has done: a
 1567|       |  // half-built function left in the live module crashes the optimizer the next
 1568|       |  // time the module is finalized, and bindings to it would outlive it
 1569|    205|  struct Rollback {
 1570|    205|    jitcc*            c;
 1571|    205|    UCFS&             fs;
 1572|    205|    size_t            depth;
 1573|    205|    llvm::BasicBlock* ibb;
 1574|    205|    bool              armed = true;
 1575|    205|    ~Rollback() { if (armed) { c->discardPartialFunctions(fs, depth, ibb); } }
 1576|    205|  } rollback{this, fs, this->scopeDepth(), ibb};
 1577|       |
 1578|       |  // prepare the environment for these mutually-recursive definitions
 1579|    308|  for (auto &f : fs) {
  ------------------
  |  Branch (1579:16): [True: 308, False: 205]
  ------------------
 1580|    308|    f.newScopeBinding = !this->boundInScope(f.name);
 1581|    308|    f.newGlobalDecl   = f.name.empty() || !this->hasGlobalDecl(f.name);
  ------------------
  |  Branch (1581:25): [True: 33, False: 275]
  |  Branch (1581:43): [True: 275, False: 0]
  ------------------
 1582|       |
 1583|    308|    llvm::Function* fval = allocFunction(f.name.empty() ? ("/" + freshName()) : f.name, f.argtys, requireMonotype(this->tenv, f.exp));
  ------------------
  |  Branch (1583:42): [True: 33, False: 275]
  ------------------
 1584|    308|    if (fval == nullptr) {
  ------------------
  |  Branch (1584:9): [True: 0, False: 308]
  ------------------
 1585|      0|      throw std::runtime_error("Failed to allocate function");
 1586|      0|    }
 1587|       |
 1588|    308|    if (f.newScopeBinding) { this->bindScope(f.name, fval); }
  ------------------
  |  Branch (1588:9): [True: 306, False: 2]
  ------------------
 1589|    308|    f.result = fval;
 1590|    308|  }
 1591|       |
 1592|       |  // now compile each function
 1593|    308|  for (const auto &f : fs) {
  ------------------
  |  Branch (1593:22): [True: 308, False: 205]
  ------------------
 1594|    308|    llvm::Function*   fval = f.result;
 1595|    308|    const UCF&        ucf  = f;
 1596|    308|    MonoTypePtr       rty  = requireMonotype(this->tenv, ucf.exp);
 1597|    308|    llvm::BasicBlock* bb = withContext(
 1598|    308|        [fval](llvm::LLVMContext& c) { return llvm::BasicBlock::Create(c, "entry", fval); });
 1599|       |
 1600|    308|    withContext([this, bb](auto&) { return this->builder()->SetInsertPoint(bb); });
 1601|       |
 1602|       |    // set argument names for safe referencing here
 1603|    308|#if LLVM_VERSION_MAJOR >= 11
 1604|    308|    this->pushScope();
 1605|       |#else
 1606|       |    this->vtenv.push_back(VarBindings());
 1607|       |#endif
 1608|       |
 1609|    308|    llvm::Function::arg_iterator a = fval->arg_begin();
 1610|  1.04k|    for (unsigned int i = 0; i < ucf.argns.size(); ++i) {
  ------------------
  |  Branch (1610:30): [True: 732, False: 308]
  ------------------
 1611|    732|      if (isUnit(ucf.argtys[i])) {
  ------------------
  |  Branch (1611:11): [True: 55, False: 677]
  ------------------
 1612|     55|#if LLVM_VERSION_MAJOR >= 11
 1613|     55|        this->bindScope(ucf.argns[i], cvalue(true)); // this should never even be seen
 1614|       |#else
 1615|       |        this->vtenv.back()[ucf.argns[i]] = cvalue(true); // this should never even be seen
 1616|       |#endif
 1617|    677|      } else {
 1618|    677|        a->setName(ucf.argns[i]);
 1619|       |
 1620|    677|        llvm::Value* argv = &*a;
 1621|    677|        if (is<FixedArray>(ucf.argtys[i]) != nullptr) {
  ------------------
  |  Branch (1621:13): [True: 0, False: 677]
  ------------------
 1622|      0|          argv = withContext([&](auto&) {
 1623|      0|            return cast(this->builder(), ptrType(toLLVM(ucf.argtys[i], false)), argv);
 1624|      0|          });
 1625|      0|        }
 1626|    677|#if LLVM_VERSION_MAJOR >= 11
 1627|    677|        this->bindScope(ucf.argns[i], argv);
 1628|       |#else
 1629|       |        this->vtenv.back()[ucf.argns[i]] = argv;
 1630|       |#endif
 1631|    677|        ++a;
 1632|    677|      }
 1633|    732|    }
 1634|       |
 1635|    308|    withContext([&](auto&) {
 1636|    308|      try {
 1637|       |        // compile the function body
 1638|    308|        llvm::Value* cexp = compile(ucf.exp);
 1639|    308|        if (isUnit(rty)) {
 1640|    308|          this->builder()->CreateRetVoid();
 1641|    308|        } else {
 1642|    308|          this->builder()->CreateRet(cexp);
 1643|    308|        }
 1644|       |
 1645|       |#if LLVM_VERSION_MINOR == 3 or LLVM_VERSION_MINOR == 5
 1646|       |      this->fpm->run(*fval);
 1647|       |#endif
 1648|       |
 1649|       |        // and we're done
 1650|    308|        this->popScope();
 1651|    308|        if (ibb != nullptr) { this->builder()->SetInsertPoint(ibb); }
 1652|    308|      } catch (...) {
 1653|    308|        if (ibb != nullptr) { this->builder()->SetInsertPoint(ibb); }
 1654|    308|        this->popScope();
 1655|    308|        throw;
 1656|    308|      }
 1657|    308|    });
 1658|    308|  }
 1659|       |
 1660|    205|  rollback.armed = false;
 1661|    205|}
_ZN6hobbes5jitcc16compileAllocStmtEPN4llvm5ValueES3_PNS1_4TypeEb:
 1711|    127|llvm::Value* jitcc::compileAllocStmt(llvm::Value* sz, llvm::Value* asz, llvm::Type* mty, bool zeroMem) {
 1712|    127|  llvm::Function* f = lookupFunction(zeroMem ? "mallocz" : "malloc");
  ------------------
  |  Branch (1712:38): [True: 0, False: 127]
  ------------------
 1713|    127|  if (f == nullptr) throw std::runtime_error("Expected heap allocation function as call.");
  ------------------
  |  Branch (1713:7): [True: 0, False: 127]
  ------------------
 1714|    127|  return withContext([&](auto&) {
 1715|    127|    return builder()->CreateBitCast(fncall(builder(), f, f->getFunctionType(), list(sz, asz)), mty);
 1716|    127|  });
 1717|    127|}
_ZN6hobbes5jitcc16compileAllocStmtEmmPN4llvm4TypeEb:
 1719|     91|llvm::Value* jitcc::compileAllocStmt(size_t sz, size_t asz, llvm::Type* mty, bool zeroMem) {
 1720|     91|  return compileAllocStmt(cvalue(static_cast<long>(sz)), cvalue(static_cast<long>(asz)), mty, zeroMem);
 1721|     91|}
_ZN6hobbes5jitcc18releaseMachineCodeEPv:
 1723|      2|void jitcc::releaseMachineCode(void*) {
 1724|      2|}
_ZN6hobbes5jitcc13allocFunctionERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaISC_EERKSC_:
 1727|    310|llvm::Function* jitcc::allocFunction(const std::string& fname, const MonoTypes& argl, const MonoTypePtr& rty) {
 1728|    310|  const auto f = [=](llvm::Module& m) {
 1729|    310|    llvm::Type* retType = toLLVM(rty, true);
 1730|    310|    auto* f = llvm::Function::Create(
 1731|    310|        llvm::FunctionType::get(retType, toLLVM(argl, true), false),
 1732|    310|        fname.find(".patfs.") == 0 ? llvm::Function::InternalLinkage
 1733|    310|                                   : llvm::Function::ExternalLinkage,
 1734|    310|        fname, m);
 1735|       |    // Sub-32-bit return types need sign/zero extension attributes so the
 1736|       |    // callee extends the value in the return register per the platform ABI.
 1737|       |    // Without this, the upper bits may contain garbage on ARM64.
 1738|       |    // See also: https://bugs.llvm.org/show_bug.cgi?id=51163 (bool case)
 1739|    310|    if (retType == boolType() || retType == byteType()) {
 1740|       |#if LLVM_VERSION_MAJOR < 16
 1741|       |      f->addAttribute(llvm::AttributeList::ReturnIndex, llvm::Attribute::ZExt);
 1742|       |#else
 1743|    310|      f->addRetAttr(llvm::Attribute::ZExt);
 1744|    310|#endif
 1745|    310|    } else if (retType == charType() || retType == shortType()) {
 1746|       |#if LLVM_VERSION_MAJOR < 16
 1747|       |      f->addAttribute(llvm::AttributeList::ReturnIndex, llvm::Attribute::SExt);
 1748|       |#else
 1749|    310|      f->addRetAttr(llvm::Attribute::SExt);
 1750|    310|#endif
 1751|    310|    }
 1752|    310|    return f;
 1753|    310|  };
 1754|    310|  llvm::Function* ret = withContext([&](auto&) { return f(*this->module()); });
 1755|       |
 1756|    310|  if (fname.find(".rfn.t") != std::string::npos) {
  ------------------
  |  Branch (1756:7): [True: 141, False: 169]
  ------------------
 1757|    141|    this->vtenv->add(fname, f);
 1758|    169|  } else if (!this->globals->contains(fname)) {
  ------------------
  |  Branch (1758:14): [True: 169, False: 0]
  ------------------
 1759|    169|    withContext([&](auto &) {
 1760|    169|      return this->globals->add(
 1761|    169|          fname, llvm::FunctionType::get(toLLVM(rty, true), toLLVM(argl, true),
 1762|    169|                                         false));
 1763|    169|    });
 1764|    169|  }
 1765|    310|  return ret;
 1766|    310|}
_ZN6hobbes5jitcc21reifyMachineCodeForFnERKSt10shared_ptrINS_8MonoTypeEERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISC_EERKS6_IS3_SaIS3_EERKS1_INS_4ExprEE:
 1779|      3|void* jitcc::reifyMachineCodeForFn(const MonoTypePtr&, const str::seq& names, const MonoTypes& tys, const ExprPtr& exp) {
 1780|      3|  return getMachineCode(compileFunction("", names, tys, exp));
 1781|      3|}
_ZN6hobbes11compileArgsEPNS_5jitccERKSt6vectorISt10shared_ptrINS_4ExprEESaIS5_EE:
 1792|    347|Values compileArgs(jitcc* c, const Exprs& es) {
 1793|    347|  Values r;
 1794|    927|  for (const auto& e : es) {
  ------------------
  |  Branch (1794:22): [True: 927, False: 347]
  ------------------
 1795|    927|    MonoTypePtr  et = requireMonotype(c->typeEnv(), e);
 1796|    927|    llvm::Value* ev = c->compile(e);
 1797|       |
 1798|    927|    if (const Prim* pt = is<Prim>(et)) {
  ------------------
  |  Branch (1798:21): [True: 496, False: 431]
  ------------------
 1799|    496|      if (pt->representation()) {
  ------------------
  |  Branch (1799:11): [True: 9, False: 487]
  ------------------
 1800|      9|        et = pt->representation();
 1801|      9|      }
 1802|    496|    }
 1803|       |
 1804|    927|    if (is<Array>(et) != nullptr) {
  ------------------
  |  Branch (1804:9): [True: 270, False: 657]
  ------------------
 1805|       |      // variable-length arrays need to be cast to a single type to pass LLVM's check
 1806|    270|      r.push_back(withContext([&](auto&) {
 1807|    270|          return c->builder()->CreateBitCast(ev, toLLVM(et));
 1808|    270|      }));
 1809|    657|    } else if (isUnit(et)) {
  ------------------
  |  Branch (1809:16): [True: 12, False: 645]
  ------------------
 1810|       |      // no need to pass unit anywhere
 1811|    645|    } else {
 1812|    645|      r.push_back(ev);
 1813|    645|    }
 1814|    927|  }
 1815|    347|  return r;
 1816|    347|}
_ZN6hobbes2opD2Ev:
 1828|    181|op::~op() = default;
jitcc.C:_ZNR12_GLOBAL__N_111VariantLiteIJSt8functionIFPN4llvm14GlobalVariableERNS2_6ModuleEEEPNS2_8ConstantEEEaSEOSB_:
  191|    146|  VariantLite &operator=(VariantLite &&rhs) & noexcept {
  192|    146|    if (isValid()) {
  ------------------
  |  Branch (192:9): [True: 0, False: 146]
  ------------------
  193|      0|      VariantLiteDeletor<Ts...>::act(N, tag, &storage);
  194|      0|    }
  195|    146|    tag = rhs.tag;
  196|    146|    if (isValid()) {
  ------------------
  |  Branch (196:9): [True: 146, False: 0]
  ------------------
  197|    146|      VariantLiteMoveCreator<Ts...>::act(N, rhs.tag, &storage, &rhs.storage);
  198|    146|    }
  199|    146|    return *this;
  200|    146|  }
jitcc.C:_ZNK12_GLOBAL__N_111VariantLiteIJSt8functionIFPN4llvm14GlobalVariableERNS2_6ModuleEEEPNS2_8ConstantEEE7isValidEv:
  218|    619|  bool isValid() const { return tag != InvalidTag; }
jitcc.C:_ZN12_GLOBAL__N_118VariantLiteDeletorIJSt8functionIFPN4llvm14GlobalVariableERNS2_6ModuleEEEPNS2_8ConstantEEE3actEmmPv:
  110|    292|  static void act(std::size_t N, std::size_t tag, void *storage) {
  111|    292|    if (tag == (N - sizeof...(Ts) - 1)) {
  ------------------
  |  Branch (111:9): [True: 24, False: 268]
  ------------------
  112|     24|      reinterpret_cast<T *>(storage)->~T();
  113|    268|    } else {
  114|    268|      VariantLiteDeletor<Ts...>::act(N, tag, storage);
  115|    268|    }
  116|    292|  }
jitcc.C:_ZN12_GLOBAL__N_118VariantLiteDeletorIJPN4llvm8ConstantEEE3actEmmPv:
  110|    268|  static void act(std::size_t N, std::size_t tag, void *storage) {
  111|    268|    if (tag == (N - sizeof...(Ts) - 1)) {
  ------------------
  |  Branch (111:9): [True: 268, False: 0]
  ------------------
  112|    268|      reinterpret_cast<T *>(storage)->~T();
  113|    268|    } else {
  114|      0|      VariantLiteDeletor<Ts...>::act(N, tag, storage);
  115|      0|    }
  116|    268|  }
jitcc.C:_ZN12_GLOBAL__N_122VariantLiteMoveCreatorIJSt8functionIFPN4llvm14GlobalVariableERNS2_6ModuleEEEPNS2_8ConstantEEE3actEmmPvPKv:
  141|    146|                  const void *other_storage) {
  142|    146|    if (other_tag == (N - sizeof...(Ts) - 1)) {
  ------------------
  |  Branch (142:9): [True: 12, False: 134]
  ------------------
  143|     12|      new (this_storage)
  144|     12|          T(std::move(*reinterpret_cast<const T *>(other_storage)));
  145|    134|    } else {
  146|    134|      VariantLiteMoveCreator<Ts...>::act(N, other_tag, this_storage,
  147|    134|                                         other_storage);
  148|    134|    }
  149|    146|  }
jitcc.C:_ZN12_GLOBAL__N_122VariantLiteMoveCreatorIJPN4llvm8ConstantEEE3actEmmPvPKv:
  141|    134|                  const void *other_storage) {
  142|    134|    if (other_tag == (N - sizeof...(Ts) - 1)) {
  ------------------
  |  Branch (142:9): [True: 134, False: 0]
  ------------------
  143|    134|      new (this_storage)
  144|    134|          T(std::move(*reinterpret_cast<const T *>(other_storage)));
  145|    134|    } else {
  146|      0|      VariantLiteMoveCreator<Ts...>::act(N, other_tag, this_storage,
  147|      0|                                         other_storage);
  148|      0|    }
  149|    134|  }
jitcc.C:_ZZN6hobbes12ConstantList11createGVDefERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERN4llvm6ModuleEPNS9_8ConstantERKSt10shared_ptrINS_8MonoTypeEEENK3$_1clEv:
  324|     12|  const auto tf = [&mtype] {
  325|     12|    if (is<Array>(mtype) != nullptr) {
  ------------------
  |  Branch (325:9): [True: 9, False: 3]
  ------------------
  326|      9|      return Ty::Array;
  327|      9|    }
  328|      3|    if (hasPointerRep(mtype)) {
  ------------------
  |  Branch (328:9): [True: 0, False: 3]
  ------------------
  329|      0|      return Ty::HasPointerRep;
  330|      0|    }
  331|      3|    return Ty::Other;
  332|      3|  };
jitcc.C:_ZZN6hobbes12ConstantList12loadConstantEN4llvm9StringRefERNS1_6ModuleERNS1_9IRBuilderINS1_14ConstantFolderENS1_24IRBuilderDefaultInserterEEEENK3$_0clINS1_11LLVMContextEEEPNS1_5ValueERT_:
  351|     35|  return withContext([&](auto &) -> llvm::Value * {
  352|     35|    auto *g = llvm::cast<llvm::GlobalVariable>(
  353|     35|        static_cast<llvm::Value *>((*it->second.value.get<VarDeclFnTy>())(m)));
  354|       |
  355|     35|    switch (it->second.ty) {
  356|     35|    case Ty::Array:
  ------------------
  |  Branch (356:5): [True: 35, False: 0]
  ------------------
  357|       |#if LLVM_VERSION_MAJOR < 16
  358|       |      return builder.CreateLoad(g);
  359|       |#else
  360|     35|      return builder.CreateLoad(g->getValueType(), g);
  361|      0|#endif
  362|      0|    case Ty::HasPointerRep:
  ------------------
  |  Branch (362:5): [True: 0, False: 35]
  ------------------
  363|      0|      return g;
  364|      0|    default:
  ------------------
  |  Branch (364:5): [True: 0, False: 35]
  ------------------
  365|      0|      return builder.CreateAlignedLoad(g->getValueType(), g,
  366|      0|                                       llvm::MaybeAlign(8));
  367|     35|    }
  368|     35|  });
jitcc.C:_ZN12_GLOBAL__N_111VariantLiteIJSt8functionIFPN4llvm14GlobalVariableERNS2_6ModuleEEEPNS2_8ConstantEEE3getIS8_EEPT_v:
  220|     35|  template <typename T> T *get() {
  221|     35|    static_assert(hasType<T, Ts...>::value, "");
  222|     35|    if (isValid() && VariantLiteTypeMatch<T, Ts...>::act(N, tag)) {
  ------------------
  |  Branch (222:9): [True: 35, False: 0]
  |  Branch (222:22): [True: 35, False: 0]
  ------------------
  223|     35|      return reinterpret_cast<T *>(&storage);
  224|     35|    }
  225|      0|    return nullptr;
  226|     35|  }
jitcc.C:_ZN12_GLOBAL__N_120VariantLiteTypeMatchISt8functionIFPN4llvm14GlobalVariableERNS2_6ModuleEEEJS8_PNS2_8ConstantEEE3actEmm:
   96|     35|  static bool act(std::size_t N, std::size_t tag) {
   97|     35|    if (tag == (N - sizeof...(Ts) - 1U)) {
  ------------------
  |  Branch (97:9): [True: 35, False: 0]
  ------------------
   98|     35|      return std::is_same<U, T>::value;
   99|     35|    } else {
  100|      0|      return VariantLiteTypeMatch<U, Ts...>::act(N, tag);
  101|      0|    }
  102|     35|  }
jitcc.C:_ZNK6hobbes7Globals6isFuncEN4llvm17StringMapIteratorIN12_GLOBAL__N_111VariantLiteIJSt8functionIFPNS1_8FunctionERNS1_6ModuleEEES5_IFPNS1_14GlobalVariableES9_EEEEEEE:
  462|    296|  [[nodiscard]] bool isFunc(decltype(globals)::iterator it) const {
  463|    296|    return it->second.get<FnDeclFnTy>() != nullptr;
  464|    296|  }
jitcc.C:_ZZN6hobbes5jitccC1ERKSt10shared_ptrINS_4TEnvEEENK3$_0clERN4llvm11LLVMContextE:
  584|      1|  this->irbuilder = withContext([](llvm::LLVMContext& c) {
  585|      1|      auto r = std::make_unique<llvm::IRBuilder<>>(c);
  586|      1|      r->SetInsertPoint(llvm::BasicBlock::Create(c, "dummy"));
  587|      1|      return r;
  588|      1|  });
jitcc.C:_ZZN6hobbes5jitcc6moduleEvENK3$_0clERN4llvm11LLVMContextE:
  671|      5|    this->currentModule = withContext([](llvm::LLVMContext &c) {
  672|      5|      static std::atomic_int mc{};
  673|      5|      return std::make_unique<llvm::Module>("jitModule" + std::to_string(mc++), c);
  674|      5|    });
jitcc.C:_ZZN6hobbes5jitcc14getMachineCodeEPN4llvm8FunctionEPNS1_16JITEventListenerEENK3$_0clINS1_11LLVMContextEEEDaRT_:
  704|      5|  withContext([&](auto&) {
  705|      5|    const std::string name = this->currentModule->getName().str();
  706|      5|    if (auto e = orcjit->addModule(std::move(this->currentModule))) {
  ------------------
  |  Branch (706:14): [True: 0, False: 5]
  ------------------
  707|      0|      llvm::logAllUnhandledErrors(std::move(e), llvm::errs());
  708|      0|      throw std::runtime_error("cannot add module " + name);
  709|      0|    }
  710|      5|  });
_ZNK6hobbes7Globals8containsEN4llvm9StringRefE:
  474|    976|  [[nodiscard]] bool contains(llvm::StringRef name) const {
  475|    976|    return globals.find(name) != globals.end();
  476|    976|  }
_ZNK6hobbes12ConstantList8containsEN4llvm9StringRefE:
  290|    532|  [[nodiscard]] bool contains(llvm::StringRef name) const {
  291|    532|    return constants.find(name) != constants.end();
  292|    532|  }
_ZNK6hobbes5VTEnv8containsEN4llvm9StringRefE:
  388|    534|  [[nodiscard]] bool contains(llvm::StringRef name) const {
  389|    534|    return std::any_of(vtenv.rbegin(), vtenv.rend(), [name](const auto &vb) {
  390|    534|      return vb.find(name) != vb.end();
  391|    534|    });
  392|    534|  }
jitcc.C:_ZZNK6hobbes5VTEnv8containsEN4llvm9StringRefEENKUlRKT_E_clINS1_9StringMapIN12_GLOBAL__N_111VariantLiteIJSt8functionIFPNS1_8FunctionERNS1_6ModuleEEENS1_14WeakTrackingVHEEEENS1_15MallocAllocatorEEEEEDaS5_:
  389|    534|    return std::any_of(vtenv.rbegin(), vtenv.rend(), [name](const auto &vb) {
  390|    534|      return vb.find(name) != vb.end();
  391|    534|    });
jitcc.C:_ZZN6hobbes5jitcc10bindGlobalERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_8MonoTypeEEPvENK3$_0clIN4llvm11LLVMContextEEEDaRT_:
 1062|    124|    withContext([&](auto &) {
 1063|    124|      this->globals->add(
 1064|    124|          vn, llvm::cast<llvm::FunctionType>(toLLVM(ty, /*asArg=*/false)));
 1065|    124|    });
jitcc.C:_ZZN6hobbes5jitcc10bindGlobalERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_8MonoTypeEEPvENK3$_1clIN4llvm11LLVMContextEEEDaRT_:
 1075|      2|    withContext([&](auto &) {
 1076|      2|      return this->globals->add(vn, toLLVM(ty, /*asArg=*/true));
 1077|      2|    });
jitcc.C:_ZZN6hobbes5jitcc15lookupGlobalVarERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEENK3$_0clIN4llvm11LLVMContextEEEDaRT_:
 1150|     99|  return withContext([&](auto&) { return this->globals->getOrCreateVarDecl(vn, *this->module()); });
jitcc.C:_ZZN6hobbes5jitcc12loadConstantERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEENK3$_0clIN4llvm11LLVMContextEEEDaRT_:
 1210|     39|      [&](auto&) { return this->constants->loadConstant(vn, *this->module(), *builder()); });
jitcc.C:_ZZN6hobbes5jitcc12defineGlobalERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_4ExprEEENK3$_0clIN4llvm11LLVMContextEEEDaRT_:
 1251|    134|          [&](auto &) { return this->constants->storeFnAddr(vname, c); });
jitcc.C:_ZZN6hobbes5jitcc12defineGlobalERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_4ExprEEENK3$_1clIN4llvm11LLVMContextEEEDaRT_:
 1253|     12|      withContext([&](auto &) {
 1254|     12|        return this->constants->createGVDef(vname, *module(), c, uety);
 1255|     12|      });
jitcc.C:_ZZN6hobbes5jitcc12defineGlobalERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_4ExprEEENK3$_2clIN4llvm11LLVMContextEEEDaRT_:
 1281|      2|    llvm::BasicBlock* ibb = withContext([this](auto&) { return this->builder()->GetInsertBlock(); });
jitcc.C:_ZZN6hobbes5jitcc12defineGlobalERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_4ExprEEENK3$_3clERN4llvm11LLVMContextE:
 1287|      2|      withContext([&](llvm::LLVMContext& c) {
 1288|      2|        llvm::BasicBlock* bb = llvm::BasicBlock::Create(c, "entry", initfn);
 1289|      2|        this->builder()->SetInsertPoint(bb);
 1290|       |
 1291|      2|        compile(assign(var(vname, uety, ue->la()), ue, ue->la()));
 1292|      2|        this->builder()->CreateRetVoid();
 1293|      2|      });
jitcc.C:_ZZN6hobbes5jitcc12defineGlobalERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_4ExprEEENK3$_5clIN4llvm11LLVMContextEEEDaRT_:
 1321|      2|    withContext([this, ibb](auto&) { this->builder()->SetInsertPoint(ibb); });
jitcc.C:_ZZN6hobbes5jitcc9lookupVarERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_8MonoTypeEEENK3$_0clIN4llvm11LLVMContextEEEDaRT_:
 1358|  1.81k|            withContext([&](auto&) { return this->vtenv->getOrCreateDecl(vn, *this->module()); })) {
jitcc.C:_ZZN6hobbes5jitcc9lookupVarERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_8MonoTypeEEENK3$_1clIN4llvm11LLVMContextEEEDaRT_:
 1384|      2|    return withContext([this, gv](auto&) { return builder()->CreateLoad(gv->getValueType(), gv); });
_ZN6hobbes5VTEnv9pushScopeEv:
  427|    715|  void pushScope() { vtenv.emplace_back(); }
jitcc.C:_ZN12_GLOBAL__N_111VariantLiteIJSt8functionIFPN4llvm8FunctionERNS2_6ModuleEEENS2_14WeakTrackingVHEEED2Ev:
  212|  1.28k|  ~VariantLite() {
  213|  1.28k|    if (isValid()) {
  ------------------
  |  Branch (213:9): [True: 1.28k, False: 0]
  ------------------
  214|  1.28k|      VariantLiteDeletor<Ts...>::act(N, tag, &storage);
  215|  1.28k|    }
  216|  1.28k|  }
jitcc.C:_ZNK12_GLOBAL__N_111VariantLiteIJSt8functionIFPN4llvm8FunctionERNS2_6ModuleEEENS2_14WeakTrackingVHEEE7isValidEv:
  218|  5.74k|  bool isValid() const { return tag != InvalidTag; }
jitcc.C:_ZN12_GLOBAL__N_118VariantLiteDeletorIJSt8functionIFPN4llvm8FunctionERNS2_6ModuleEEENS2_14WeakTrackingVHEEE3actEmmPv:
  110|  1.28k|  static void act(std::size_t N, std::size_t tag, void *storage) {
  111|  1.28k|    if (tag == (N - sizeof...(Ts) - 1)) {
  ------------------
  |  Branch (111:9): [True: 141, False: 1.13k]
  ------------------
  112|    141|      reinterpret_cast<T *>(storage)->~T();
  113|  1.13k|    } else {
  114|  1.13k|      VariantLiteDeletor<Ts...>::act(N, tag, storage);
  115|  1.13k|    }
  116|  1.28k|  }
jitcc.C:_ZN12_GLOBAL__N_118VariantLiteDeletorIJN4llvm14WeakTrackingVHEEE3actEmmPv:
  110|  1.13k|  static void act(std::size_t N, std::size_t tag, void *storage) {
  111|  1.13k|    if (tag == (N - sizeof...(Ts) - 1)) {
  ------------------
  |  Branch (111:9): [True: 1.13k, False: 0]
  ------------------
  112|  1.13k|      reinterpret_cast<T *>(storage)->~T();
  113|  1.13k|    } else {
  114|      0|      VariantLiteDeletor<Ts...>::act(N, tag, storage);
  115|      0|    }
  116|  1.13k|  }
_ZN6hobbes5VTEnv3addEN4llvm9StringRefEPNS1_5ValueE:
  400|  1.28k|  void add(llvm::StringRef name, llvm::Value *v) {
  401|       |    // do not allow value overwritten function prototype
  402|       |    // otherwise some decls will not created correctly
  403|  1.28k|    if (this->vtenv.back().find(name) == this->vtenv.back().end()) {
  ------------------
  |  Branch (403:9): [True: 1.13k, False: 141]
  ------------------
  404|  1.13k|      this->vtenv.back()[name] = llvm::WeakTrackingVH(v);
  405|  1.13k|    }
  406|  1.28k|  }
jitcc.C:_ZN12_GLOBAL__N_111VariantLiteIJSt8functionIFPN4llvm8FunctionERNS2_6ModuleEEENS2_14WeakTrackingVHEEEC2Ev:
  158|  1.28k|  VariantLite() = default;
jitcc.C:_ZN12_GLOBAL__N_111VariantLiteIJSt8functionIFPN4llvm8FunctionERNS2_6ModuleEEENS2_14WeakTrackingVHEEEaSIS9_EERSA_T_:
  202|  1.13k|  template <typename T> VariantLite &operator=(T t) {
  203|  1.13k|    static_assert(hasType<T, Ts...>::value, "");
  204|  1.13k|    if (isValid()) {
  ------------------
  |  Branch (204:9): [True: 0, False: 1.13k]
  ------------------
  205|      0|      VariantLiteDeletor<Ts...>::act(N, tag, &storage);
  206|      0|    }
  207|  1.13k|    new (&storage) T(std::move(t));
  208|  1.13k|    tag = IndexByType<T, Ts...>::value;
  209|  1.13k|    return *this;
  210|  1.13k|  }
_ZN6hobbes5VTEnv8popScopeEv:
  430|    714|  void popScope() { vtenv.pop_back(); }
_ZNK6hobbes5VTEnv5depthEv:
  433|    205|  [[nodiscard]] size_t depth() const { return vtenv.size(); }
_ZNK6hobbes5VTEnv22containsInCurrentScopeEN4llvm9StringRefE:
  419|    308|  [[nodiscard]] bool containsInCurrentScope(llvm::StringRef name) const {
  420|    308|    return this->vtenv.back().find(name) != this->vtenv.back().end();
  421|    308|  }
jitcc.C:_ZN12_GLOBAL__N_111VariantLiteIJSt8functionIFPN4llvm8FunctionERNS2_6ModuleEEES1_IFPNS2_14GlobalVariableES6_EEEED2Ev:
  212|    295|  ~VariantLite() {
  213|    295|    if (isValid()) {
  ------------------
  |  Branch (213:9): [True: 295, False: 0]
  ------------------
  214|    295|      VariantLiteDeletor<Ts...>::act(N, tag, &storage);
  215|    295|    }
  216|    295|  }
jitcc.C:_ZNK12_GLOBAL__N_111VariantLiteIJSt8functionIFPN4llvm8FunctionERNS2_6ModuleEEES1_IFPNS2_14GlobalVariableES6_EEEE7isValidEv:
  218|  1.12k|  bool isValid() const { return tag != InvalidTag; }
jitcc.C:_ZN12_GLOBAL__N_118VariantLiteDeletorIJSt8functionIFPN4llvm8FunctionERNS2_6ModuleEEES1_IFPNS2_14GlobalVariableES6_EEEE3actEmmPv:
  110|    295|  static void act(std::size_t N, std::size_t tag, void *storage) {
  111|    295|    if (tag == (N - sizeof...(Ts) - 1)) {
  ------------------
  |  Branch (111:9): [True: 293, False: 2]
  ------------------
  112|    293|      reinterpret_cast<T *>(storage)->~T();
  113|    293|    } else {
  114|      2|      VariantLiteDeletor<Ts...>::act(N, tag, storage);
  115|      2|    }
  116|    295|  }
jitcc.C:_ZN12_GLOBAL__N_118VariantLiteDeletorIJSt8functionIFPN4llvm14GlobalVariableERNS2_6ModuleEEEEE3actEmmPv:
  110|      2|  static void act(std::size_t N, std::size_t tag, void *storage) {
  111|      2|    if (tag == (N - sizeof...(Ts) - 1)) {
  ------------------
  |  Branch (111:9): [True: 2, False: 0]
  ------------------
  112|      2|      reinterpret_cast<T *>(storage)->~T();
  113|      2|    } else {
  114|      0|      VariantLiteDeletor<Ts...>::act(N, tag, storage);
  115|      0|    }
  116|      2|  }
jitcc.C:_ZZN6hobbes5jitcc14lookupFunctionERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEENK3$_0clIN4llvm11LLVMContextEEEDaRT_:
 1498|    275|      [&](auto&) { return this->globals->getOrCreateFuncDecl(fn, *this->module()); });
jitcc.C:_ZZN6hobbes5jitcc22unsafeCompileFunctionsEPSt6vectorINS0_3UCFESaIS2_EEENK3$_0clIN4llvm11LLVMContextEEEDaRT_:
 1564|    205|  llvm::BasicBlock* ibb = withContext([this](auto&) { return this->builder()->GetInsertBlock(); });
jitcc.C:_ZZN6hobbes5jitcc22unsafeCompileFunctionsEPSt6vectorINS0_3UCFESaIS2_EEENK3$_1clERN4llvm11LLVMContextE:
 1598|    308|        [fval](llvm::LLVMContext& c) { return llvm::BasicBlock::Create(c, "entry", fval); });
jitcc.C:_ZZN6hobbes5jitcc22unsafeCompileFunctionsEPSt6vectorINS0_3UCFESaIS2_EEENK3$_2clIN4llvm11LLVMContextEEEDaRT_:
 1600|    308|    withContext([this, bb](auto&) { return this->builder()->SetInsertPoint(bb); });
jitcc.C:_ZZN6hobbes5jitcc22unsafeCompileFunctionsEPSt6vectorINS0_3UCFESaIS2_EEENK3$_4clIN4llvm11LLVMContextEEEDaRT_:
 1635|    308|    withContext([&](auto&) {
 1636|    308|      try {
 1637|       |        // compile the function body
 1638|    308|        llvm::Value* cexp = compile(ucf.exp);
 1639|    308|        if (isUnit(rty)) {
  ------------------
  |  Branch (1639:13): [True: 43, False: 265]
  ------------------
 1640|     43|          this->builder()->CreateRetVoid();
 1641|    265|        } else {
 1642|    265|          this->builder()->CreateRet(cexp);
 1643|    265|        }
 1644|       |
 1645|       |#if LLVM_VERSION_MINOR == 3 or LLVM_VERSION_MINOR == 5
 1646|       |      this->fpm->run(*fval);
 1647|       |#endif
 1648|       |
 1649|       |        // and we're done
 1650|    308|        this->popScope();
 1651|    308|        if (ibb != nullptr) { this->builder()->SetInsertPoint(ibb); }
  ------------------
  |  Branch (1651:13): [True: 308, False: 0]
  ------------------
 1652|    308|      } catch (...) {
 1653|      0|        if (ibb != nullptr) { this->builder()->SetInsertPoint(ibb); }
  ------------------
  |  Branch (1653:13): [True: 0, False: 0]
  ------------------
 1654|      0|        this->popScope();
 1655|      0|        throw;
 1656|      0|      }
 1657|    308|    });
jitcc.C:_ZZN6hobbes5jitcc22unsafeCompileFunctionsEPSt6vectorINS0_3UCFESaIS2_EEEN8RollbackD2Ev:
 1575|    205|    ~Rollback() { if (armed) { c->discardPartialFunctions(fs, depth, ibb); } }
  ------------------
  |  Branch (1575:23): [True: 0, False: 205]
  ------------------
jitcc.C:_ZZN6hobbes5jitcc16compileAllocStmtEPN4llvm5ValueES3_PNS1_4TypeEbENK3$_0clINS1_11LLVMContextEEEDaRT_:
 1714|    127|  return withContext([&](auto&) {
 1715|    127|    return builder()->CreateBitCast(fncall(builder(), f, f->getFunctionType(), list(sz, asz)), mty);
 1716|    127|  });
jitcc.C:_ZZN6hobbes5jitcc13allocFunctionERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaISC_EERKSC_ENK3$_0clIN4llvm11LLVMContextEEEDaRT_:
 1754|    310|  llvm::Function* ret = withContext([&](auto&) { return f(*this->module()); });
jitcc.C:_ZZN6hobbes5jitcc13allocFunctionERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaISC_EERKSC_ENK3$_2clERN4llvm6ModuleE:
 1728|    563|  const auto f = [=](llvm::Module& m) {
 1729|    563|    llvm::Type* retType = toLLVM(rty, true);
 1730|    563|    auto* f = llvm::Function::Create(
 1731|    563|        llvm::FunctionType::get(retType, toLLVM(argl, true), false),
 1732|    563|        fname.find(".patfs.") == 0 ? llvm::Function::InternalLinkage
  ------------------
  |  Branch (1732:9): [True: 0, False: 563]
  ------------------
 1733|    563|                                   : llvm::Function::ExternalLinkage,
 1734|    563|        fname, m);
 1735|       |    // Sub-32-bit return types need sign/zero extension attributes so the
 1736|       |    // callee extends the value in the return register per the platform ABI.
 1737|       |    // Without this, the upper bits may contain garbage on ARM64.
 1738|       |    // See also: https://bugs.llvm.org/show_bug.cgi?id=51163 (bool case)
 1739|    563|    if (retType == boolType() || retType == byteType()) {
  ------------------
  |  Branch (1739:9): [True: 46, False: 517]
  |  Branch (1739:34): [True: 47, False: 470]
  ------------------
 1740|       |#if LLVM_VERSION_MAJOR < 16
 1741|       |      f->addAttribute(llvm::AttributeList::ReturnIndex, llvm::Attribute::ZExt);
 1742|       |#else
 1743|     93|      f->addRetAttr(llvm::Attribute::ZExt);
 1744|     93|#endif
 1745|    470|    } else if (retType == charType() || retType == shortType()) {
  ------------------
  |  Branch (1745:16): [True: 0, False: 470]
  |  Branch (1745:41): [True: 0, False: 470]
  ------------------
 1746|       |#if LLVM_VERSION_MAJOR < 16
 1747|       |      f->addAttribute(llvm::AttributeList::ReturnIndex, llvm::Attribute::SExt);
 1748|       |#else
 1749|      0|      f->addRetAttr(llvm::Attribute::SExt);
 1750|      0|#endif
 1751|      0|    }
 1752|    563|    return f;
 1753|    563|  };
_ZN6hobbes5VTEnv3addERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt8functionIFPN4llvm8FunctionERNSA_6ModuleEEE:
  411|    141|  void add(const std::string &name, FnDeclFnTy f) {
  412|    141|    this->vtenv.back()[name] = FnDeclFnTy(
  413|    141|        [name, f = std::move(f)](llvm::Module &m) -> llvm::Function * {
  414|    141|          return createFnDecl(f(m), m, name);
  415|    141|        });
  416|    141|  }
_ZZN6hobbes5VTEnv3addERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt8functionIFPN4llvm8FunctionERNSA_6ModuleEEEENKUlSE_E_clESE_:
  413|    253|        [name, f = std::move(f)](llvm::Module &m) -> llvm::Function * {
  414|    253|          return createFnDecl(f(m), m, name);
  415|    253|        });
jitcc.C:_ZN12_GLOBAL__N_112createFnDeclEPN4llvm8FunctionERNS0_6ModuleENS0_9StringRefE:
  237|    489|                                            llvm::StringRef name) {
  238|    489|  if (f->getReturnType() == hobbes::boolType()) {
  ------------------
  |  Branch (238:7): [True: 18, False: 471]
  ------------------
  239|       |#if LLVM_VERSION_MAJOR < 16
  240|       |    f->addAttribute(llvm::AttributeList::ReturnIndex, llvm::Attribute::ZExt);
  241|       |#else
  242|     18|    f->addRetAttr(llvm::Attribute::ZExt);
  243|     18|#endif
  244|     18|  }
  245|    489|  if (f->getName() != name) {
  ------------------
  |  Branch (245:7): [True: 432, False: 57]
  ------------------
  246|    432|    f->eraseFromParent();
  247|    432|    return m.getFunction(name);
  248|    432|  }
  249|     57|  return f;
  250|    489|}
jitcc.C:_ZN12_GLOBAL__N_111VariantLiteIJSt8functionIFPN4llvm8FunctionERNS2_6ModuleEEENS2_14WeakTrackingVHEEEaSIS8_EERSA_T_:
  202|    141|  template <typename T> VariantLite &operator=(T t) {
  203|    141|    static_assert(hasType<T, Ts...>::value, "");
  204|    141|    if (isValid()) {
  ------------------
  |  Branch (204:9): [True: 0, False: 141]
  ------------------
  205|      0|      VariantLiteDeletor<Ts...>::act(N, tag, &storage);
  206|      0|    }
  207|    141|    new (&storage) T(std::move(t));
  208|    141|    tag = IndexByType<T, Ts...>::value;
  209|    141|    return *this;
  210|    141|  }
jitcc.C:_ZZN6hobbes5jitcc13allocFunctionERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaISC_EERKSC_ENK3$_1clIN4llvm11LLVMContextEEEDaRT_:
 1759|    169|    withContext([&](auto &) {
 1760|    169|      return this->globals->add(
 1761|    169|          fname, llvm::FunctionType::get(toLLVM(rty, true), toLLVM(argl, true),
 1762|    169|                                         false));
 1763|    169|    });
jitcc.C:_ZZN6hobbes11compileArgsEPNS_5jitccERKSt6vectorISt10shared_ptrINS_4ExprEESaIS5_EEENK3$_0clIN4llvm11LLVMContextEEEDaRT_:
 1806|    270|      r.push_back(withContext([&](auto&) {
 1807|    270|          return c->builder()->CreateBitCast(ev, toLLVM(et));
 1808|    270|      }));
jitcc.C:_ZN12_GLOBAL__N_111VariantLiteIJSt8functionIFPN4llvm14GlobalVariableERNS2_6ModuleEEEPNS2_8ConstantEEEC2Ev:
  158|    146|  VariantLite() = default;
jitcc.C:_ZN12_GLOBAL__N_111VariantLiteIJSt8functionIFPN4llvm14GlobalVariableERNS2_6ModuleEEEPNS2_8ConstantEEEC2ISA_EET_:
  160|    134|  template <typename T> VariantLite(T t) {
  161|    134|    static_assert(hasType<T, Ts...>::value, "");
  162|    134|    new (&storage) T(std::move(t));
  163|    134|    tag = IndexByType<T, Ts...>::value;
  164|    134|  }
jitcc.C:_ZN12_GLOBAL__N_111VariantLiteIJSt8functionIFPN4llvm14GlobalVariableERNS2_6ModuleEEEPNS2_8ConstantEEED2Ev:
  212|    292|  ~VariantLite() {
  213|    292|    if (isValid()) {
  ------------------
  |  Branch (213:9): [True: 292, False: 0]
  ------------------
  214|    292|      VariantLiteDeletor<Ts...>::act(N, tag, &storage);
  215|    292|    }
  216|    292|  }
jitcc.C:_ZZN6hobbes12ConstantList11createGVDefERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERN4llvm6ModuleEPNS9_8ConstantERKSt10shared_ptrINS_8MonoTypeEEENK3$_0clESB_:
  317|     35|  const auto vf = [&, type, name](llvm::Module &m) -> llvm::GlobalVariable * {
  318|     35|    return createGVDecl(
  319|     35|        prepgv(new llvm::GlobalVariable(m, type, /*isConstant=*/true,
  320|     35|                                        llvm::GlobalVariable::ExternalLinkage,
  321|     35|                                        /*initializer=*/nullptr, name)),
  322|     35|        m, name);
  323|     35|  };
jitcc.C:_ZN12_GLOBAL__N_112createGVDeclEPN4llvm14GlobalVariableERNS0_6ModuleENS0_9StringRefE:
  253|     39|createGVDecl(llvm::GlobalVariable *gv, llvm::Module &m, llvm::StringRef name) {
  254|     39|  if (gv->getName() != name) {
  ------------------
  |  Branch (254:7): [True: 27, False: 12]
  ------------------
  255|     27|    gv->eraseFromParent();
  256|     27|    return m.getGlobalVariable(name);
  257|     27|  }
  258|     12|  return gv;
  259|     39|}
jitcc.C:_ZN12_GLOBAL__N_111VariantLiteIJSt8functionIFPN4llvm14GlobalVariableERNS2_6ModuleEEEPNS2_8ConstantEEEC2IS8_EET_:
  160|     12|  template <typename T> VariantLite(T t) {
  161|     12|    static_assert(hasType<T, Ts...>::value, "");
  162|     12|    new (&storage) T(std::move(t));
  163|     12|    tag = IndexByType<T, Ts...>::value;
  164|     12|  }
jitcc.C:_ZN12_GLOBAL__N_111VariantLiteIJSt8functionIFPN4llvm8FunctionERNS2_6ModuleEEENS2_14WeakTrackingVHEEE3getIS8_EEPT_v:
  220|  1.72k|  template <typename T> T *get() {
  221|  1.72k|    static_assert(hasType<T, Ts...>::value, "");
  222|  1.72k|    if (isValid() && VariantLiteTypeMatch<T, Ts...>::act(N, tag)) {
  ------------------
  |  Branch (222:9): [True: 1.72k, False: 0]
  |  Branch (222:22): [True: 253, False: 1.46k]
  ------------------
  223|    253|      return reinterpret_cast<T *>(&storage);
  224|    253|    }
  225|  1.46k|    return nullptr;
  226|  1.72k|  }
jitcc.C:_ZN12_GLOBAL__N_120VariantLiteTypeMatchISt8functionIFPN4llvm8FunctionERNS2_6ModuleEEEJS8_NS2_14WeakTrackingVHEEE3actEmm:
   96|  1.72k|  static bool act(std::size_t N, std::size_t tag) {
   97|  1.72k|    if (tag == (N - sizeof...(Ts) - 1U)) {
  ------------------
  |  Branch (97:9): [True: 253, False: 1.46k]
  ------------------
   98|    253|      return std::is_same<U, T>::value;
   99|  1.46k|    } else {
  100|  1.46k|      return VariantLiteTypeMatch<U, Ts...>::act(N, tag);
  101|  1.46k|    }
  102|  1.72k|  }
jitcc.C:_ZN12_GLOBAL__N_120VariantLiteTypeMatchISt8functionIFPN4llvm8FunctionERNS2_6ModuleEEEJNS2_14WeakTrackingVHEEE3actEmm:
   96|  1.46k|  static bool act(std::size_t N, std::size_t tag) {
   97|  1.46k|    if (tag == (N - sizeof...(Ts) - 1U)) {
  ------------------
  |  Branch (97:9): [True: 1.46k, False: 0]
  ------------------
   98|  1.46k|      return std::is_same<U, T>::value;
   99|  1.46k|    } else {
  100|      0|      return VariantLiteTypeMatch<U, Ts...>::act(N, tag);
  101|      0|    }
  102|  1.46k|  }
jitcc.C:_ZN12_GLOBAL__N_111VariantLiteIJSt8functionIFPN4llvm8FunctionERNS2_6ModuleEEENS2_14WeakTrackingVHEEE3getIS9_EEPT_v:
  220|  1.46k|  template <typename T> T *get() {
  221|  1.46k|    static_assert(hasType<T, Ts...>::value, "");
  222|  1.46k|    if (isValid() && VariantLiteTypeMatch<T, Ts...>::act(N, tag)) {
  ------------------
  |  Branch (222:9): [True: 1.46k, False: 0]
  |  Branch (222:22): [True: 1.46k, False: 0]
  ------------------
  223|  1.46k|      return reinterpret_cast<T *>(&storage);
  224|  1.46k|    }
  225|      0|    return nullptr;
  226|  1.46k|  }
jitcc.C:_ZN12_GLOBAL__N_120VariantLiteTypeMatchIN4llvm14WeakTrackingVHEJSt8functionIFPNS1_8FunctionERNS1_6ModuleEEES2_EE3actEmm:
   96|  1.46k|  static bool act(std::size_t N, std::size_t tag) {
   97|  1.46k|    if (tag == (N - sizeof...(Ts) - 1U)) {
  ------------------
  |  Branch (97:9): [True: 0, False: 1.46k]
  ------------------
   98|      0|      return std::is_same<U, T>::value;
   99|  1.46k|    } else {
  100|  1.46k|      return VariantLiteTypeMatch<U, Ts...>::act(N, tag);
  101|  1.46k|    }
  102|  1.46k|  }
jitcc.C:_ZN12_GLOBAL__N_120VariantLiteTypeMatchIN4llvm14WeakTrackingVHEJS2_EE3actEmm:
   96|  1.46k|  static bool act(std::size_t N, std::size_t tag) {
   97|  1.46k|    if (tag == (N - sizeof...(Ts) - 1U)) {
  ------------------
  |  Branch (97:9): [True: 1.46k, False: 0]
  ------------------
   98|  1.46k|      return std::is_same<U, T>::value;
   99|  1.46k|    } else {
  100|      0|      return VariantLiteTypeMatch<U, Ts...>::act(N, tag);
  101|      0|    }
  102|  1.46k|  }
jitcc.C:_ZN12_GLOBAL__N_111VariantLiteIJSt8functionIFPN4llvm8FunctionERNS2_6ModuleEEES1_IFPNS2_14GlobalVariableES6_EEEE3getIS8_EEPT_v:
  220|    532|  template <typename T> T *get() {
  221|    532|    static_assert(hasType<T, Ts...>::value, "");
  222|    532|    if (isValid() && VariantLiteTypeMatch<T, Ts...>::act(N, tag)) {
  ------------------
  |  Branch (222:9): [True: 532, False: 0]
  |  Branch (222:22): [True: 528, False: 4]
  ------------------
  223|    528|      return reinterpret_cast<T *>(&storage);
  224|    528|    }
  225|      4|    return nullptr;
  226|    532|  }
jitcc.C:_ZN12_GLOBAL__N_120VariantLiteTypeMatchISt8functionIFPN4llvm8FunctionERNS2_6ModuleEEEJS8_S1_IFPNS2_14GlobalVariableES6_EEEE3actEmm:
   96|    532|  static bool act(std::size_t N, std::size_t tag) {
   97|    532|    if (tag == (N - sizeof...(Ts) - 1U)) {
  ------------------
  |  Branch (97:9): [True: 528, False: 4]
  ------------------
   98|    528|      return std::is_same<U, T>::value;
   99|    528|    } else {
  100|      4|      return VariantLiteTypeMatch<U, Ts...>::act(N, tag);
  101|      4|    }
  102|    532|  }
jitcc.C:_ZN12_GLOBAL__N_120VariantLiteTypeMatchISt8functionIFPN4llvm8FunctionERNS2_6ModuleEEEJS1_IFPNS2_14GlobalVariableES6_EEEE3actEmm:
   96|      4|  static bool act(std::size_t N, std::size_t tag) {
   97|      4|    if (tag == (N - sizeof...(Ts) - 1U)) {
  ------------------
  |  Branch (97:9): [True: 4, False: 0]
  ------------------
   98|      4|      return std::is_same<U, T>::value;
   99|      4|    } else {
  100|      0|      return VariantLiteTypeMatch<U, Ts...>::act(N, tag);
  101|      0|    }
  102|      4|  }
jitcc.C:_ZN12_GLOBAL__N_111VariantLiteIJSt8functionIFPN4llvm8FunctionERNS2_6ModuleEEES1_IFPNS2_14GlobalVariableES6_EEEE3getISC_EEPT_v:
  220|      4|  template <typename T> T *get() {
  221|      4|    static_assert(hasType<T, Ts...>::value, "");
  222|      4|    if (isValid() && VariantLiteTypeMatch<T, Ts...>::act(N, tag)) {
  ------------------
  |  Branch (222:9): [True: 4, False: 0]
  |  Branch (222:22): [True: 4, False: 0]
  ------------------
  223|      4|      return reinterpret_cast<T *>(&storage);
  224|      4|    }
  225|      0|    return nullptr;
  226|      4|  }
jitcc.C:_ZN12_GLOBAL__N_120VariantLiteTypeMatchISt8functionIFPN4llvm14GlobalVariableERNS2_6ModuleEEEJS1_IFPNS2_8FunctionES6_EES8_EE3actEmm:
   96|      4|  static bool act(std::size_t N, std::size_t tag) {
   97|      4|    if (tag == (N - sizeof...(Ts) - 1U)) {
  ------------------
  |  Branch (97:9): [True: 0, False: 4]
  ------------------
   98|      0|      return std::is_same<U, T>::value;
   99|      4|    } else {
  100|      4|      return VariantLiteTypeMatch<U, Ts...>::act(N, tag);
  101|      4|    }
  102|      4|  }
jitcc.C:_ZN12_GLOBAL__N_120VariantLiteTypeMatchISt8functionIFPN4llvm14GlobalVariableERNS2_6ModuleEEEJS8_EE3actEmm:
   96|      4|  static bool act(std::size_t N, std::size_t tag) {
   97|      4|    if (tag == (N - sizeof...(Ts) - 1U)) {
  ------------------
  |  Branch (97:9): [True: 4, False: 0]
  ------------------
   98|      4|      return std::is_same<U, T>::value;
   99|      4|    } else {
  100|      0|      return VariantLiteTypeMatch<U, Ts...>::act(N, tag);
  101|      0|    }
  102|      4|  }
jitcc.C:_ZN12_GLOBAL__N_111VariantLiteIJSt8functionIFPN4llvm8FunctionERNS2_6ModuleEEES1_IFPNS2_14GlobalVariableES6_EEEEC2Ev:
  158|    295|  VariantLite() = default;
jitcc.C:_ZZN6hobbes7Globals3addERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPN4llvm4TypeEENK3$_0clERNS9_6ModuleE:
  524|      4|  globals[name] = VarDeclFnTy([ty, name](llvm::Module &m) {
  525|      4|    return createGVDecl(
  526|      4|        prepgv(new llvm::GlobalVariable(m, ty, /*isConstant=*/false,
  527|      4|                                        llvm::GlobalValue::ExternalLinkage,
  528|      4|                                        /*initializer=*/nullptr, name),
  529|      4|               sizeof(void *)),
  530|      4|        m, name);
  531|      4|  });
jitcc.C:_ZN12_GLOBAL__N_111VariantLiteIJSt8functionIFPN4llvm8FunctionERNS2_6ModuleEEES1_IFPNS2_14GlobalVariableES6_EEEEaSISC_EERSD_T_:
  202|      2|  template <typename T> VariantLite &operator=(T t) {
  203|      2|    static_assert(hasType<T, Ts...>::value, "");
  204|      2|    if (isValid()) {
  ------------------
  |  Branch (204:9): [True: 0, False: 2]
  ------------------
  205|      0|      VariantLiteDeletor<Ts...>::act(N, tag, &storage);
  206|      0|    }
  207|      2|    new (&storage) T(std::move(t));
  208|      2|    tag = IndexByType<T, Ts...>::value;
  209|      2|    return *this;
  210|      2|  }
jitcc.C:_ZZN6hobbes7Globals3addERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPN4llvm12FunctionTypeEENK3$_0clERNS9_6ModuleE:
  535|    236|  globals[name] = FnDeclFnTy([ty, name](llvm::Module &m) {
  536|    236|    return createFnDecl(
  537|    236|        llvm::Function::Create(ty, llvm::Function::ExternalLinkage, name, m), m,
  538|    236|        name);
  539|    236|  });
jitcc.C:_ZN12_GLOBAL__N_111VariantLiteIJSt8functionIFPN4llvm8FunctionERNS2_6ModuleEEES1_IFPNS2_14GlobalVariableES6_EEEEaSIS8_EERSD_T_:
  202|    293|  template <typename T> VariantLite &operator=(T t) {
  203|    293|    static_assert(hasType<T, Ts...>::value, "");
  204|    293|    if (isValid()) {
  ------------------
  |  Branch (204:9): [True: 0, False: 293]
  ------------------
  205|      0|      VariantLiteDeletor<Ts...>::act(N, tag, &storage);
  206|      0|    }
  207|    293|    new (&storage) T(std::move(t));
  208|    293|    tag = IndexByType<T, Ts...>::value;
  209|    293|    return *this;
  210|    293|  }
_ZN6hobbes5VTEnvC2Ev:
  381|      1|  VTEnv() = default;
_ZN6hobbes5VTEnvD2Ev:
  386|      1|  ~VTEnv() = default;
_ZN6hobbes7GlobalsC2Ev:
  467|      1|  Globals() = default;
_ZN6hobbes7GlobalsD2Ev:
  472|      1|  ~Globals() = default;
_ZN6hobbes12ConstantListC2Ev:
  283|      1|  ConstantList() = default;
_ZN6hobbes12ConstantListD2Ev:
  288|      1|  ~ConstantList() = default;

_ZN6hobbes6ORCJITC2Ev:
   75|      1|ORCJIT::ORCJIT() {
   76|       |  // this is for testing
   77|       |  // by default, no threading is enabled
   78|      1|  const auto tn = [] {
   79|      1|    const auto clamp = [](int v, int lo, int hi) -> int {
   80|      1|      return v < lo ? lo : (hi < v ? hi : v);
   81|      1|    };
   82|      1|    if (const auto n = llvm::sys::Process::GetEnv("HOBBES_COMPILE_THREADS")) {
   83|      1|      const int i = std::atoi(n->c_str());
   84|      1|      return static_cast<unsigned int>(
   85|      1|          clamp(i, 0, static_cast<int>(std::thread::hardware_concurrency())));
   86|      1|    }
   87|      1|    return 0U;
   88|      1|  }();
   89|       |
   90|      1|#if LLVM_VERSION_MAJOR >= 18
   91|       |  // Use LLJIT (eager) instead of LLLazyJIT to avoid bitcode round-trip
   92|       |  // issues with opaque pointers
   93|      1|  llvm::orc::LLJITBuilder jitBuilder;
   94|      1|  jit = llvm::cantFail(
   95|      1|      jitBuilder
   96|      1|          .setJITTargetMachineBuilder(
   97|      1|              llvm::cantFail(llvm::orc::JITTargetMachineBuilder::detectHost()))
   98|      1|          .setNumCompileThreads(tn)
   99|      1|          .create());
  100|      1|  jit->getIRTransformLayer().setTransform(optimizeModule);
  101|      1|  jit->getMainJITDylib().addGenerator(
  102|      1|      cantFail(llvm::orc::DynamicLibrarySearchGenerator::GetForCurrentProcess(
  103|      1|          jit->getDataLayout().getGlobalPrefix())));
  104|       |#else
  105|       |  llvm::orc::LLLazyJITBuilder jitBuilder;
  106|       |  jit = llvm::cantFail(
  107|       |      jitBuilder
  108|       |          .setJITTargetMachineBuilder(
  109|       |              llvm::cantFail(llvm::orc::JITTargetMachineBuilder::detectHost()))
  110|       |          .setNumCompileThreads(tn)
  111|       |#if LLVM_VERSION_MAJOR < 16
  112|       |          .setLazyCompileFailureAddr(llvm::pointerToJITTargetAddress(+[] {
  113|       |#else
  114|       |          .setLazyCompileFailureAddr(llvm::orc::ExecutorAddr::fromPtr(+[] {
  115|       |#endif
  116|       |            throw std::runtime_error("exiting on lazy call through failure");
  117|       |          }))
  118|       |          .create());
  119|       |  jit->getIRTransformLayer().setTransform(optimizeModule);
  120|       |  jit->getMainJITDylib().addGenerator(
  121|       |      cantFail(llvm::orc::DynamicLibrarySearchGenerator::GetForCurrentProcess(
  122|       |          jit->getDataLayout().getGlobalPrefix())));
  123|       |#endif
  124|       |
  125|      1|  mangle = std::make_unique<llvm::orc::MangleAndInterner>(
  126|      1|      jit->getExecutionSession(), jit->getDataLayout());
  127|      1|}
_ZN6hobbes6ORCJITD2Ev:
  129|      1|ORCJIT::~ORCJIT() = default;
_ZN6hobbes6ORCJIT9addModuleESt10unique_ptrIN4llvm6ModuleESt14default_deleteIS3_EE:
  131|      5|llvm::Error ORCJIT::addModule(std::unique_ptr<llvm::Module> m) {
  132|      5|  return withContext([&, this](auto &) {
  133|      5|#if LLVM_VERSION_MAJOR >= 18
  134|      5|    return jit->addIRModule(
  135|      5|        llvm::orc::ThreadSafeModule(std::move(m), threadSafeContext()));
  136|       |#else
  137|       |    return jit->addLazyIRModule(
  138|       |        llvm::orc::ThreadSafeModule(std::move(m), threadSafeContext()));
  139|       |#endif
  140|      5|  });
  141|      5|}
_ZN6hobbes6ORCJIT6lookupEN4llvm9StringRefE:
  146|     10|llvm::Expected<llvm::orc::ExecutorAddr> ORCJIT::lookup(llvm::StringRef name) {
  147|     10|#endif
  148|     10|  return jit->lookup(name);
  149|     10|}
_ZN6hobbes6ORCJIT25addExternalCallableSymbolEN4llvm9StringRefEPv:
  151|    124|llvm::Error ORCJIT::addExternalCallableSymbol(llvm::StringRef name, void *ptr) {
  152|    124|#if LLVM_VERSION_MAJOR >= 18
  153|    124|  return jit->getMainJITDylib().define(llvm::orc::absoluteSymbols(
  154|    124|      {{(*mangle)(name), {llvm::orc::ExecutorAddr::fromPtr(ptr),
  155|    124|                          llvm::JITSymbolFlags::Exported |
  156|    124|                              llvm::JITSymbolFlags::Callable}}}));
  157|       |#else
  158|       |  return jit->getMainJITDylib().define(llvm::orc::absoluteSymbols(
  159|       |      {{(*mangle)(name), llvm::JITEvaluatedSymbol::fromPointer(
  160|       |                             ptr, llvm::JITSymbolFlags::Exported |
  161|       |                                      llvm::JITSymbolFlags::Callable)}}));
  162|       |#endif
  163|    124|}
_ZN6hobbes6ORCJIT28addExternalNonCallableSymbolEN4llvm9StringRefEPv:
  166|      2|                                                 void *ptr) {
  167|      2|#if LLVM_VERSION_MAJOR >= 18
  168|      2|  return jit->getMainJITDylib().define(llvm::orc::absoluteSymbols(
  169|      2|      {{(*mangle)(name), {llvm::orc::ExecutorAddr::fromPtr(ptr),
  170|      2|                          llvm::JITSymbolFlags::Exported}}}));
  171|       |#else
  172|       |  return jit->getMainJITDylib().define(llvm::orc::absoluteSymbols(
  173|       |      {{(*mangle)(name), llvm::JITEvaluatedSymbol::fromPointer(ptr)}}));
  174|       |#endif
  175|      2|}
orcjitcc.C:_ZZN6hobbes6ORCJITC1EvENK3$_0clEv:
   78|      1|  const auto tn = [] {
   79|      1|    const auto clamp = [](int v, int lo, int hi) -> int {
   80|      1|      return v < lo ? lo : (hi < v ? hi : v);
   81|      1|    };
   82|      1|    if (const auto n = llvm::sys::Process::GetEnv("HOBBES_COMPILE_THREADS")) {
  ------------------
  |  Branch (82:20): [True: 0, False: 1]
  ------------------
   83|      0|      const int i = std::atoi(n->c_str());
   84|      0|      return static_cast<unsigned int>(
   85|      0|          clamp(i, 0, static_cast<int>(std::thread::hardware_concurrency())));
   86|      0|    }
   87|      1|    return 0U;
   88|      1|  }();
orcjitcc.C:_ZN12_GLOBAL__N_114optimizeModuleEN4llvm3orc16ThreadSafeModuleERKNS1_29MaterializationResponsibilityE:
   33|      5|               const llvm::orc::MaterializationResponsibility &) {
   34|      5|  tsm.withModuleDo([](llvm::Module &m) {
   35|      5|#if LLVM_VERSION_MAJOR >= 18
   36|      5|    llvm::PassBuilder PB;
   37|      5|    llvm::LoopAnalysisManager LAM;
   38|      5|    llvm::FunctionAnalysisManager FAM;
   39|      5|    llvm::CGSCCAnalysisManager CGAM;
   40|      5|    llvm::ModuleAnalysisManager MAM;
   41|      5|    PB.registerModuleAnalyses(MAM);
   42|      5|    PB.registerCGSCCAnalyses(CGAM);
   43|      5|    PB.registerFunctionAnalyses(FAM);
   44|      5|    PB.registerLoopAnalyses(LAM);
   45|      5|    PB.crossRegisterProxies(LAM, FAM, CGAM, MAM);
   46|      5|    llvm::FunctionPassManager FPM;
   47|      5|    FPM.addPass(llvm::ReassociatePass());
   48|      5|    FPM.addPass(llvm::NewGVNPass());
   49|      5|    FPM.addPass(llvm::SimplifyCFGPass());
   50|      5|    FPM.addPass(llvm::TailCallElimPass());
   51|      5|    llvm::ModulePassManager MPM;
   52|      5|    MPM.addPass(llvm::createModuleToFunctionPassAdaptor(std::move(FPM)));
   53|      5|    MPM.run(m, MAM);
   54|       |#else
   55|       |    auto fpm = llvm::legacy::FunctionPassManager(&m);
   56|       |    fpm.add(llvm::createReassociatePass());
   57|       |    fpm.add(llvm::createNewGVNPass());
   58|       |    fpm.add(llvm::createCFGSimplificationPass());
   59|       |    fpm.add(llvm::createTailCallEliminationPass());
   60|       |    fpm.doInitialization();
   61|       |    for (auto &f : m) {
   62|       |      fpm.run(f);
   63|       |    }
   64|       |#endif
   65|       |
   66|      5|    hobbes::maybeInlineFunctionsIn(m);
   67|      5|  });
   68|       |
   69|      5|  return tsm;
   70|      5|}
orcjitcc.C:_ZZN12_GLOBAL__N_114optimizeModuleEN4llvm3orc16ThreadSafeModuleERKNS1_29MaterializationResponsibilityEENK3$_0clERNS0_6ModuleE:
   34|      5|  tsm.withModuleDo([](llvm::Module &m) {
   35|      5|#if LLVM_VERSION_MAJOR >= 18
   36|      5|    llvm::PassBuilder PB;
   37|      5|    llvm::LoopAnalysisManager LAM;
   38|      5|    llvm::FunctionAnalysisManager FAM;
   39|      5|    llvm::CGSCCAnalysisManager CGAM;
   40|      5|    llvm::ModuleAnalysisManager MAM;
   41|      5|    PB.registerModuleAnalyses(MAM);
   42|      5|    PB.registerCGSCCAnalyses(CGAM);
   43|      5|    PB.registerFunctionAnalyses(FAM);
   44|      5|    PB.registerLoopAnalyses(LAM);
   45|      5|    PB.crossRegisterProxies(LAM, FAM, CGAM, MAM);
   46|      5|    llvm::FunctionPassManager FPM;
   47|      5|    FPM.addPass(llvm::ReassociatePass());
   48|      5|    FPM.addPass(llvm::NewGVNPass());
   49|      5|    FPM.addPass(llvm::SimplifyCFGPass());
   50|      5|    FPM.addPass(llvm::TailCallElimPass());
   51|      5|    llvm::ModulePassManager MPM;
   52|      5|    MPM.addPass(llvm::createModuleToFunctionPassAdaptor(std::move(FPM)));
   53|      5|    MPM.run(m, MAM);
   54|       |#else
   55|       |    auto fpm = llvm::legacy::FunctionPassManager(&m);
   56|       |    fpm.add(llvm::createReassociatePass());
   57|       |    fpm.add(llvm::createNewGVNPass());
   58|       |    fpm.add(llvm::createCFGSimplificationPass());
   59|       |    fpm.add(llvm::createTailCallEliminationPass());
   60|       |    fpm.doInitialization();
   61|       |    for (auto &f : m) {
   62|       |      fpm.run(f);
   63|       |    }
   64|       |#endif
   65|       |
   66|      5|    hobbes::maybeInlineFunctionsIn(m);
   67|      5|  });
orcjitcc.C:_ZZN6hobbes6ORCJIT9addModuleESt10unique_ptrIN4llvm6ModuleESt14default_deleteIS3_EEENK3$_0clINS2_11LLVMContextEEEDaRT_:
  132|      5|  return withContext([&, this](auto &) {
  133|      5|#if LLVM_VERSION_MAJOR >= 18
  134|      5|    return jit->addIRModule(
  135|      5|        llvm::orc::ThreadSafeModule(std::move(m), threadSafeContext()));
  136|       |#else
  137|       |    return jit->addLazyIRModule(
  138|       |        llvm::orc::ThreadSafeModule(std::move(m), threadSafeContext()));
  139|       |#endif
  140|      5|  });

_ZN6hobbes15initNetworkDefsERNS_2ccE:
  692|      1|void initNetworkDefs(cc& c) {
  693|       |  // we'll want to be able to make connections
  694|      1|  c.typeEnv()->bind(ConnectionP::constraintName(), UnqualifierPtr(new ConnectionP()));
  695|       |
  696|       |  // remotely invoke functions
  697|      1|  c.typeEnv()->bind(InvokeP::constraintName(), UnqualifierPtr(new InvokeP()));
  698|       |
  699|       |  // and read results. These raw-pointer bridges are only for generated code
  700|       |  // (include/hobbes/ipc/net.H): bind them under dot-prefixed names that the
  701|       |  // parser cannot produce, so user expressions cannot name them directly.
  702|       |  // Client::unsafeAppendReadFn/unsafeRead additionally validate the handle
  703|       |  // via isAllocatedConnection as defense in depth against serialized-AST Var
  704|       |  // references reaching these bindings.
  705|      1|  c.typeEnv()->bind(ReceiveP::constraintName(), UnqualifierPtr(new ReceiveP()));
  706|      1|  c.bind(".unsafeAppendClientReadFn", &Client::unsafeAppendReadFn);
  707|      1|  c.bind(".unsafeClientRead",         &Client::unsafeRead);
  708|       |
  709|       |  // some basic utility functions
  710|      1|  c.bind(".printConnection", &printConnectionUF);
  711|      1|  c.bindLLFunc("printConnection", new printConnectionF(".printConnection"));
  712|      1|  c.bindLLFunc("remoteHost", new remoteHostF());
  713|      1|}
_ZN6hobbes11ConnectionP14constraintNameB5cxx11Ev:
   68|      1|  static std::string constraintName() { return "Connect"; }
_ZN6hobbes11ConnectionP10connectVarB5cxx11Ev:
   69|  2.75k|  static std::string connectVar() { return "connection"; }
_ZNK6hobbes11ConnectionP6lookupERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  196|  2.75k|  PolyTypePtr lookup(const std::string& vn) const override {
  197|  2.75k|    if (vn == connectVar()) {
  ------------------
  |  Branch (197:9): [True: 0, False: 2.75k]
  ------------------
  198|      0|      return polytype(2, qualtype(list(std::make_shared<Constraint>(constraintName(), list(tgen(0), tgen(1)))), tgen(1)));
  199|  2.75k|    } else {
  200|  2.75k|      return PolyTypePtr();
  201|  2.75k|    }
  202|  2.75k|  }
_ZNK6hobbes11ConnectionP8bindingsB5cxx11Ev:
  204|      1|  SymSet bindings() const override {
  205|      1|    SymSet r;
  206|      1|    r.insert(connectVar());
  207|      1|    return r;
  208|      1|  }
_ZN6hobbes7InvokeP14constraintNameB5cxx11Ev:
  233|      1|  static std::string constraintName() { return "Invoke"; }
_ZN6hobbes7InvokeP9netInvokeB5cxx11Ev:
  234|  1.97k|  static std::string netInvoke() { return "invoke"; }
_ZNK6hobbes7InvokeP6lookupERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  353|  1.97k|  PolyTypePtr lookup(const std::string& vn) const override {
  354|  1.97k|    if (vn == netInvoke()) {
  ------------------
  |  Branch (354:9): [True: 0, False: 1.97k]
  ------------------
  355|       |      // invoke :: (Invoke ch expr inty outty) => (connection ch, quote expr, inty) -> (promise ch outty)
  356|      0|      return polytype(4,
  357|      0|        qualtype(list(std::make_shared<Constraint>(constraintName(), list(tgen(0), tgen(1), tgen(2), tgen(3)))),
  358|      0|          functy(
  359|      0|            list(
  360|      0|              tapp(primty("connection"), list(tgen(0))),
  361|      0|              tapp(primty("quote"), list(tgen(1))),
  362|      0|              tgen(2)
  363|      0|            ),
  364|      0|            tapp(primty("promise"), list(tgen(0), tgen(3)))
  365|      0|          )
  366|      0|        )
  367|      0|      );
  368|  1.97k|    } else {
  369|  1.97k|      return PolyTypePtr();
  370|  1.97k|    }
  371|  1.97k|  }
_ZNK6hobbes7InvokeP8bindingsB5cxx11Ev:
  373|      1|  SymSet bindings() const override {
  374|      1|    SymSet r;
  375|      1|    r.insert(netInvoke());
  376|      1|    return r;
  377|      1|  }
_ZN6hobbes8ReceiveP14constraintNameB5cxx11Ev:
  477|      1|  static std::string constraintName() { return "Receive"; }
_ZN6hobbes8ReceiveP7receiveB5cxx11Ev:
  478|  1.70k|  static std::string receive()        { return "receive"; }
_ZNK6hobbes8ReceiveP6lookupERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  540|  1.69k|  PolyTypePtr lookup(const std::string& vn) const override {
  541|  1.69k|    if (vn == receive()) {
  ------------------
  |  Branch (541:9): [True: 0, False: 1.69k]
  ------------------
  542|       |      // receive :: (Receive ch outty) => (promise ch ty) -> ty
  543|      0|      return polytype(2,
  544|      0|        qualtype(list(std::make_shared<Constraint>(constraintName(), list(tgen(0), tgen(1)))),
  545|      0|          functy(
  546|      0|            list(
  547|      0|              tapp(primty("promise"), list(tgen(0), tgen(1)))
  548|      0|            ),
  549|      0|            tgen(1)
  550|      0|          )
  551|      0|        )
  552|      0|      );
  553|  1.69k|    } else {
  554|  1.69k|      return PolyTypePtr();
  555|  1.69k|    }
  556|  1.69k|  }
_ZNK6hobbes8ReceiveP8bindingsB5cxx11Ev:
  558|      1|  SymSet bindings() const override {
  559|      1|    SymSet r;
  560|      1|    r.insert(receive());
  561|      1|    return r;
  562|      1|  }
_ZN6hobbes16printConnectionFC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  659|      1|  printConnectionF(const std::string& showf) : showf(showf) {
  660|      1|  }
_ZNK6hobbes16printConnectionF4typeERNS_6typedbE:
  671|      1|  PolyTypePtr type(typedb&) const override {
  672|      1|    return polytype(1, qualtype(functy(list(tapp(primty("connection"), list(tgen(0)))), primty("unit"))));
  673|      1|  }
_ZN6hobbes11remoteHostFC2Ev:
  677|      1|  remoteHostF() = default;
_ZNK6hobbes11remoteHostF4typeERNS_6typedbE:
  687|      1|  PolyTypePtr type(typedb&) const override {
  688|      1|    return polytype(1, qualtype(functy(list(tapp(primty("connection"), list(tgen(0)))), arrayty(primty("char")))));
  689|      1|  }

_ZN6hobbes8ProcessPC2EPNS_13FieldVerifierE:
   10|      1|ProcessP::ProcessP(FieldVerifier* fv) {
   11|      1|  fv->addEliminator(this->procman);
   12|      1|}
_ZN6hobbes8ProcessP14constraintNameB5cxx11Ev:
   23|      1|std::string ProcessP::constraintName() {
   24|      1|  return "Process";
   25|      1|}
_ZNK6hobbes8ProcessP6lookupERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  139|  1.69k|PolyTypePtr ProcessP::lookup(const std::string& vn) const {
  140|  1.69k|  if (vn == PROCESS_SPAWN) {
  ------------------
  |  |    8|  1.69k|#define PROCESS_SPAWN "spawn"
  ------------------
  |  Branch (140:7): [True: 0, False: 1.69k]
  ------------------
  141|      0|    return polytype(2, qualtype(list(std::make_shared<Constraint>(ProcessP::constraintName(), list(tgen(0), tgen(1)))), functy(list(tuplety()), tgen(1))));
  142|  1.69k|  } else {
  143|  1.69k|    return PolyTypePtr();
  144|  1.69k|  }
  145|  1.69k|}
_ZNK6hobbes8ProcessP8bindingsB5cxx11Ev:
  147|      1|SymSet ProcessP::bindings() const {
  148|      1|  SymSet r;
  149|      1|  r.insert(PROCESS_SPAWN);
  ------------------
  |  |    8|      1|#define PROCESS_SPAWN "spawn"
  ------------------
  150|      1|  return r;
  151|      1|}

_ZN6hobbes11ProcManager6refineERKSt10shared_ptrINS_4TEnvEERKNS_8HasFieldEPNS_15MonoTypeUnifierEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISL_EE:
   23|  2.43k|bool ProcManager::refine(const TEnvPtr&, const HasField& hf, MonoTypeUnifier* u, Definitions*) {
   24|  2.43k|  auto rty   = hf.recordType;
   25|  2.43k|  auto fname = hf.fieldName;
   26|  2.43k|  auto hasty = hf.fieldType;
   27|       |
   28|  2.43k|  size_t uc = u->size();
   29|  2.43k|  if (const TString* fn = is<TString>(fname)) {
  ------------------
  |  Branch (29:22): [True: 2.43k, False: 0]
  ------------------
   30|  2.43k|    if (const TLong* pid = pidTy(rty)) {
  ------------------
  |  Branch (30:22): [True: 0, False: 2.43k]
  ------------------
   31|      0|      mgu(hasty, refinedType(lp(pid->value()), fn->value(), hasty), u);
   32|      0|    }
   33|  2.43k|  }
   34|  2.43k|  return uc != u->size();
   35|  2.43k|}
_ZNK6hobbes11ProcManager9satisfiedERKSt10shared_ptrINS_4TEnvEERKNS_8HasFieldEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISJ_EE:
   37|     71|bool ProcManager::satisfied(const TEnvPtr& tenv, const HasField& hf, Definitions* ds) const {
   38|     71|  auto dir   = hf.direction;
   39|     71|  auto rty   = hf.recordType;
   40|     71|  auto fname = hf.fieldName;
   41|     71|  auto hasty = hf.fieldType;
   42|       |
   43|     71|  if (dir == HasField::Write) { return false; }
  ------------------
  |  Branch (43:7): [True: 0, False: 71]
  ------------------
   44|       |
   45|     71|  if (const TString* fn = is<TString>(fname)) {
  ------------------
  |  Branch (45:22): [True: 71, False: 0]
  ------------------
   46|     71|    if (const TLong* pid = pidTy(rty)) {
  ------------------
  |  Branch (46:22): [True: 0, False: 71]
  ------------------
   47|      0|      if (const Func* fty = is<Func>(hasty)) {
  ------------------
  |  Branch (47:23): [True: 0, False: 0]
  ------------------
   48|       |        // this ensures that we _can_ get an invocation ID for the requested function/type
   49|      0|        invocationID(lp(pid->value()), fn->value(), hasty);
   50|       |
   51|       |        // then we're satisfied IFF we can pack the argument and unpack the result
   52|      0|        return isClassSatisfied(tenv, "BlockCodec", list(fty->argument()), ds) &&
  ------------------
  |  Branch (52:16): [True: 0, False: 0]
  ------------------
   53|      0|               isClassSatisfied(tenv, "BlockCodec", list(fty->result()), ds);
  ------------------
  |  Branch (53:16): [True: 0, False: 0]
  ------------------
   54|      0|      }
   55|      0|    }
   56|     71|  }
   57|       |
   58|     71|  return false;
   59|     71|}
_ZNK6hobbes11ProcManager11satisfiableERKSt10shared_ptrINS_4TEnvEERKNS_8HasFieldEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISJ_EE:
   61|  5.09k|bool ProcManager::satisfiable(const TEnvPtr& tenv, const HasField& hf, Definitions* ds) const {
   62|  5.09k|  auto dir   = hf.direction;
   63|  5.09k|  auto rty   = hf.recordType;
   64|  5.09k|  auto fname = hf.fieldName;
   65|  5.09k|  auto hasty = hf.fieldType;
   66|       |
   67|  5.09k|  if (dir == HasField::Write) { return false; }
  ------------------
  |  Branch (67:7): [True: 379, False: 4.71k]
  ------------------
   68|       |
   69|  4.71k|  if (is<TVar>(rty) != nullptr) {
  ------------------
  |  Branch (69:7): [True: 2.43k, False: 2.28k]
  ------------------
   70|  2.43k|    return true;
   71|  2.43k|  } else if (pidTy(rty) == nullptr) {
  ------------------
  |  Branch (71:14): [True: 2.28k, False: 0]
  ------------------
   72|  2.28k|    return false;
   73|  2.28k|  } else if ((is<TVar>(fname) != nullptr) || !isMonoSingular(hasty)) {
  ------------------
  |  Branch (73:14): [True: 0, False: 0]
  |  Branch (73:46): [True: 0, False: 0]
  ------------------
   74|      0|    return true;
   75|      0|  } else {
   76|      0|    return satisfied(tenv, hf, ds);
   77|      0|  }
   78|  4.71k|}
_ZN6hobbes5pidTyERKSt10shared_ptrINS_8MonoTypeEE:
  221|  4.79k|const TLong* pidTy(const MonoTypePtr& mty) {
  222|  4.79k|  if (const TApp* aty = is<TApp>(mty)) {
  ------------------
  |  Branch (222:19): [True: 0, False: 4.79k]
  ------------------
  223|      0|    if (const Prim* tf = is<Prim>(aty->fn())) {
  ------------------
  |  Branch (223:21): [True: 0, False: 0]
  ------------------
  224|      0|      if (tf->name() == "process") {
  ------------------
  |  Branch (224:11): [True: 0, False: 0]
  ------------------
  225|      0|        if (aty->args().size() == 1) {
  ------------------
  |  Branch (225:13): [True: 0, False: 0]
  ------------------
  226|      0|          return is<TLong>(aty->args()[0]);
  227|      0|        }
  228|      0|      }
  229|      0|    }
  230|      0|  }
  231|  4.79k|  return nullptr;
  232|  4.79k|}

_ZN6hobbes9makeTupleERKSt6vectorISt10shared_ptrINS_4ExprEESaIS3_EERKNS_17LexicalAnnotationE:
    8|     44|ExprPtr makeTuple(const Exprs& exprs, const LexicalAnnotation& la) {
    9|     44|  MkRecord::FieldDefs fds;
   10|    126|  for (size_t i = 0; i < exprs.size(); ++i) {
  ------------------
  |  Branch (10:22): [True: 82, False: 44]
  ------------------
   11|     82|    fds.push_back(MkRecord::FieldDef(".f" + str::from(i), exprs[i]));
   12|     82|  }
   13|     44|  return ExprPtr(new MkRecord(fds, la));
   14|     44|}
_ZN6hobbes25concreteClosureMethodTypeERKSt10shared_ptrINS_8MonoTypeEERKSt6vectorIS2_SaIS2_EES4_:
   16|     22|QualTypePtr concreteClosureMethodType(const MonoTypePtr& envty, const MonoTypes& fargtys, const MonoTypePtr& rty) {
   17|     22|  return qualtype(MonoTypePtr(Func::make(tuplety(cons(envty, fargtys)), rty)));
   18|     22|}
_ZN6hobbes19abstractClosureTypeEPKNS_2FnERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EERKS6_:
   20|     22|QualTypePtr abstractClosureType(const Fn*, const MonoTypes& fargtys, const MonoTypePtr& rty) {
   21|     22|  MonoTypes fargs = cons(MonoTypePtr(TVar::make("E")), fargtys);
   22|       |
   23|     22|  return qualtype(MonoTypePtr(Exists::make("E", tuplety(list(MonoTypePtr(Func::make(tuplety(fargs), rty)), MonoTypePtr(TVar::make("E")))))));
   24|     22|}
_ZN6hobbes10closLookupERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt3setIS5_St4lessIS5_ESaIS5_EERKSt10shared_ptrINS_8MonoTypeEERKSF_INS_4ExprEERKNS_17LexicalAnnotationE:
   26|     22|ExprPtr closLookup(const std::string& envVarName, const VarSet& vs, const MonoTypePtr& envty, const ExprPtr& fbody, const LexicalAnnotation& la) {
   27|     22|  ExprPtr result = fbody;
   28|     22|  int i = 0;
   29|     38|  for (const auto& v : vs) {
  ------------------
  |  Branch (29:22): [True: 38, False: 22]
  ------------------
   30|     38|    result = ExprPtr(new Let(v, ExprPtr(new Proj(assume(var(envVarName, la), envty, la), ".f" + str::from(i++), la)), result, la));
   31|     38|  }
   32|     22|  return result;
   33|     22|}
_ZN6hobbes13closureMethodEPKNS_2FnERKSt3setINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4lessIS9_ESaIS9_EERKSt10shared_ptrINS_8MonoTypeEERKSt6vectorISI_SaISI_EESK_RKNS_17LexicalAnnotationE:
   35|     22|ExprPtr closureMethod(const Fn* f, const VarSet& vs, const MonoTypePtr& envty, const MonoTypes& fargtys, const MonoTypePtr& rty, const LexicalAnnotation& la) {
   36|     22|  return assume(ExprPtr(new Fn(cons(std::string(".env"), f->varNames()), closLookup(".env", vs, envty, f->body(), la), la)), concreteClosureMethodType(envty, fargtys, rty), la);
   37|     22|}
_ZN6hobbes10closureEnvERKSt3setINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4lessIS6_ESaIS6_EERKSt10shared_ptrINS_8MonoTypeEERKNS_17LexicalAnnotationE:
   39|     22|ExprPtr closureEnv(const VarSet& vs, const MonoTypePtr& envty, const LexicalAnnotation& la) {
   40|     22|  Exprs es;
   41|     38|  for (const auto& v : vs) {
  ------------------
  |  Branch (41:22): [True: 38, False: 22]
  ------------------
   42|     38|    es.push_back(var(v, la));
   43|     38|  }
   44|     22|  return assume(makeTuple(es, la), envty, la);
   45|     22|}
_ZN6hobbes22concreteClosureEnvTypeEj:
   47|     22|MonoTypePtr concreteClosureEnvType(unsigned int size) {
   48|     22|  return tuplety(freshTypeVars(size));
   49|     22|}
_ZN6hobbes15makeClosureOverEPKNS_2FnERKSt3setINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4lessIS9_ESaIS9_EE:
   51|    587|ExprPtr makeClosureOver(const Fn* f, const VarSet& vs) {
   52|    587|  if (vs.empty()) {
  ------------------
  |  Branch (52:7): [True: 565, False: 22]
  ------------------
   53|    565|    return ExprPtr(f->clone());
   54|    565|  } else {
   55|     22|    MonoTypePtr              envty   = concreteClosureEnvType(vs.size());
   56|     22|    MonoTypes                fargtys = freshTypeVars(f->varNames().size());
   57|     22|    MonoTypePtr              fret    = freshTypeVar();
   58|     22|    const LexicalAnnotation& la      = f->la();
   59|       |
   60|     22|    return assume(ExprPtr(new Pack(makeTuple(list(closureMethod(f, vs, envty, fargtys, fret, la), closureEnv(vs, envty, la)), la), la)), abstractClosureType(f, fargtys, fret), la);
   61|     22|  }
   62|    587|}
_ZN6hobbes14closureConvertERKSt10shared_ptrINS_4TEnvEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS0_INS_4ExprEE:
  165|    810|ExprPtr closureConvert(const TEnvPtr& rootTEnv, const std::string& vn, const ExprPtr& e) {
  166|    810|  TEnvPtr rectenv = bindFrame(rootTEnv, vn, tgen(0));
  167|    810|  return switchOf(e, ClosureConvertF(rectenv, set(rootTEnv, rectenv)));
  168|    810|}
_ZN6hobbes15ClosureConvertFC2ERKSt10shared_ptrINS_4TEnvEERKSt3setIS3_St4lessIS3_ESaIS3_EE:
   79|  2.10k|  ClosureConvertF(const TEnvPtr& tenv, const TEnvs& roots) : tenv(tenv), roots(roots) { }
_ZNK6hobbes15ClosureConvertF4withEPKNS_3LetE:
  105|    621|  ExprPtr with(const Let* v) const override {
  106|    621|    return ExprPtr(new Let(v->var(), switchOf(v->varExpr(), *this), switchOf(v->bodyExpr(), ClosureConvertF(bindFrame(this->tenv, v->var(), tgen(0)), this->roots)), v->la()));
  107|    621|  }
_ZNK6hobbes15ClosureConvertF4withEPKNS_6LetRecE:
  135|      4|  ExprPtr with(const LetRec* v) const override {
  136|      4|    TEnvPtr lrtenv = letRecFrame(this->tenv, v->bindings());
  137|      4|    TEnvs   recRVS = this->roots;
  138|      4|    recRVS.insert(lrtenv);
  139|      4|    ClosureConvertF recF(lrtenv, recRVS);
  140|       |
  141|      4|    LetRec::Bindings bs;
  142|      4|    for (const auto& b : v->bindings()) {
  ------------------
  |  Branch (142:24): [True: 4, False: 4]
  ------------------
  143|      4|      bs.push_back(LetRec::Binding(b.first, switchOf(b.second, recF)));
  144|      4|    }
  145|       |
  146|      4|    return ExprPtr(new LetRec(bs, switchOf(v->bodyExpr(), recF), v->la()));
  147|      4|  }
_ZN6hobbes15ClosureConvertF11letRecFrameERKSt10shared_ptrINS_4TEnvEERKSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISG_EE:
  126|      4|  static TEnvPtr letRecFrame(const TEnvPtr& ptenv, const LetRec::Bindings& bs) {
  127|       |    // assume that letrec bindings must be functions
  128|      4|    TEnvPtr r(new TEnv(ptenv));
  129|      4|    for (const auto& b : bs) {
  ------------------
  |  Branch (129:24): [True: 4, False: 4]
  ------------------
  130|      4|      r->bind(b.first, tgen(0));
  131|      4|    }
  132|      4|    return r;
  133|      4|  }
_ZNK6hobbes15ClosureConvertF4withEPKNS_2FnE:
   99|    587|  ExprPtr with(const Fn* v) const override {
  100|    587|    ExprPtr nbody = switchOf(v->body(), ClosureConvertF(fnFrame(this->tenv, v->varNames()), this->roots));
  101|    587|    const Fn fn(v->varNames(), nbody, v->la());
  102|    587|    return makeClosureOver(&fn, excludeRootVars(setDifference(freeVars(nbody), toSet(v->varNames()))));
  103|    587|  }
_ZN6hobbes15ClosureConvertF7fnFrameERKSt10shared_ptrINS_4TEnvEERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISC_EE:
   91|    587|  static TEnvPtr fnFrame(const TEnvPtr& ptenv, const std::vector<std::string>& vns) {
   92|    587|    TEnvPtr r(new TEnv(ptenv));
   93|  1.50k|    for (const auto& vn : vns) {
  ------------------
  |  Branch (93:25): [True: 1.50k, False: 587]
  ------------------
   94|  1.50k|      r->bind(vn, tgen(0));
   95|  1.50k|    }
   96|    587|    return r;
   97|    587|  }
_ZNK6hobbes15ClosureConvertF15excludeRootVarsERKSt3setINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4lessIS7_ESaIS7_EE:
   81|    587|  VarSet excludeRootVars(const VarSet& vs) const {
   82|    587|    VarSet r;
   83|  2.12k|    for (const auto& v : vs) {
  ------------------
  |  Branch (83:24): [True: 2.12k, False: 587]
  ------------------
   84|  2.12k|      if (!hasRootBinding(v, this->tenv, this->roots)) {
  ------------------
  |  Branch (84:11): [True: 38, False: 2.08k]
  ------------------
   85|     38|        r.insert(v);
   86|     38|      }
   87|  2.12k|    }
   88|    587|    return r;
   89|    587|  }
closcvt.C:_ZN6hobbesL14hasRootBindingERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_4TEnvEERKSt3setISA_St4lessISA_ESaISA_EE:
   66|  4.25k|static bool hasRootBinding(const std::string& vn, const TEnvPtr& tenv, const TEnvs& roots) {
   67|  4.25k|  if (!tenv) {
  ------------------
  |  Branch (67:7): [True: 0, False: 4.25k]
  ------------------
   68|      0|    return true;
   69|  4.25k|  } else if (tenv->hasImmediateBinding(vn)) {
  ------------------
  |  Branch (69:14): [True: 2.12k, False: 2.13k]
  ------------------
   70|  2.12k|    return in(tenv, roots);
   71|  2.13k|  } else {
   72|  2.13k|    return hasRootBinding(vn, tenv->parentTypeEnv(), roots);
   73|  2.13k|  }
   74|  4.25k|}
_ZNK6hobbes15ClosureConvertF4withEPKNS_4CaseE:
  113|     53|  ExprPtr with(const Case* v) const override {
  114|     53|    Case::Bindings cbs;
  115|     77|    for (const auto& b : v->bindings()) {
  ------------------
  |  Branch (115:24): [True: 77, False: 53]
  ------------------
  116|     77|      cbs.push_back(Case::Binding(b.selector, b.vname, switchOf(b.exp, ClosureConvertF(bindFrame(this->tenv, b.vname, tgen(0)), this->roots))));
  117|     77|    }
  118|       |
  119|     53|    if (v->defaultExpr()) {
  ------------------
  |  Branch (119:9): [True: 29, False: 24]
  ------------------
  120|     29|      return ExprPtr(new Case(switchOf(v->variant(), *this), cbs, switchOf(v->defaultExpr(), *this), v->la()));
  121|     29|    } else {
  122|     24|      return ExprPtr(new Case(switchOf(v->variant(), *this), cbs, v->la()));
  123|     24|    }
  124|     53|  }
_ZNK6hobbes15ClosureConvertF4withEPKNS_6UnpackE:
  109|      6|  ExprPtr with(const Unpack* v) const override {
  110|      6|    return ExprPtr(new Unpack(v->varName(), switchOf(v->package(), *this), switchOf(v->expr(), ClosureConvertF(bindFrame(this->tenv, v->varName(), tgen(0)), this->roots)), v->la()));
  111|      6|  }
_ZN6hobbes3setISt10shared_ptrINS_4TEnvEEJS3_EEESt3setIT_St4lessIS5_ESaIS5_EERKS5_DpRKT0_:
  156|    810|  std::set<T> set(const T& x, const Ts& ... xs) {
  157|    810|    std::set<T> r = {x,xs...};
  158|    810|    return r;
  159|    810|  }

_ZN6hobbes11typeSeqFormERKSt10shared_ptrINS_10ConstraintEEPSt6vectorIS0_INS_8MonoTypeEESaIS7_EE:
   13|  32.9k|void typeSeqForm(const ConstraintPtr& c, MonoTypes* mts) {
   14|  32.9k|  const MonoTypes& args = c->arguments();
   15|       |
   16|  32.9k|  mts->push_back(MonoTypePtr(TString::make(c->name())));
   17|  32.9k|  mts->insert(mts->end(), args.begin(), args.end());
   18|  32.9k|}
_ZN6hobbes13ConstraintSetC2Ev:
   20|  19.3k|ConstraintSet::ConstraintSet() = default;
_ZN6hobbes13focusOnFundepERKSt6vectorIiSaIiEERKS0_ISt10shared_ptrINS_8MonoTypeEESaIS7_EE:
   22|  22.4k|MaybePathPoints focusOnFundep(const VarIDs& vs, const MonoTypes& mts) {
   23|       |  // we have to fudge the input IDs with a +1 offset for constraint names
   24|  22.4k|  MaybePathPoints result;
   25|  22.4k|  result.push_back(mts[0]);
   26|   134k|  for (size_t i = 1; i < mts.size(); ++i) {
  ------------------
  |  Branch (26:22): [True: 112k, False: 22.4k]
  ------------------
   27|   112k|    if (in(int(i-1), vs)) {
  ------------------
  |  Branch (27:9): [True: 41.3k, False: 71.0k]
  ------------------
   28|  41.3k|      result.push_back(mts[i]);
   29|  71.0k|    } else {
   30|  71.0k|      result.push_back(MaybePathPoint());
   31|  71.0k|    }
   32|   112k|  }
   33|  22.4k|  return result;
   34|  22.4k|}
_ZN6hobbes13ConstraintSet6insertERKSt10shared_ptrINS_4TEnvEERKS1_INS_10ConstraintEEPNS_15MonoTypeUnifierE:
   36|  31.7k|void ConstraintSet::insert(const TEnvPtr& tenv, const ConstraintPtr& c, MonoTypeUnifier* s) {
   37|       |  // convert this constraint to a normalized form as a sequence of types
   38|  31.7k|  MonoTypes cpath;
   39|  31.7k|  typeSeqForm(c, &cpath);
   40|       |
   41|       |  // if this constraint is already stored, we don't need to insert
   42|  31.7k|  if (this->csts.lookup(cpath) != nullptr) {
  ------------------
  |  Branch (42:7): [True: 1.98k, False: 29.7k]
  ------------------
   43|  1.98k|    return;
   44|  1.98k|  }
   45|       |
   46|       |  // OK, the constraint seems not to be stored
   47|       |  // let's apply functional dependencies from this constraint across other constraints in this set
   48|       |  // that may produce unifications that can further eliminate this constraint
   49|  29.7k|  for (const auto& fd : tenv->lookupUnqualifier(c)->dependencies(c)) {
  ------------------
  |  Branch (49:23): [True: 22.4k, False: 29.7k]
  ------------------
   50|  22.4k|    Constraints mcs;
   51|  22.4k|    this->csts.find(focusOnFundep(fd.first, cpath), &mcs);
   52|       |
   53|  22.4k|    for (const auto& mc : mcs) {
  ------------------
  |  Branch (53:25): [True: 762, False: 22.4k]
  ------------------
   54|    762|      MonoTypes mcpath;
   55|    762|      typeSeqForm(mc, &mcpath);
   56|    762|      mgu(cpath[fd.second+1], mcpath[fd.second+1], s);
   57|    762|    }
   58|  22.4k|  }
   59|       |
   60|       |  // apply any substitutions that might have been made
   61|   107k|  for (size_t i = 1; i < cpath.size(); ++i) {
  ------------------
  |  Branch (61:22): [True: 77.3k, False: 29.7k]
  ------------------
   62|  77.3k|    cpath[i] = s->substitute(cpath[i]);
   63|  77.3k|  }
   64|       |
   65|       |  // now only store the constraint if it's still unique
   66|  29.7k|  if (this->csts.lookup(cpath) == nullptr) {
  ------------------
  |  Branch (66:7): [True: 29.4k, False: 364]
  ------------------
   67|  29.4k|    this->csts.insert(cpath, c);
   68|  29.4k|  }
   69|  29.7k|}
_ZNK6hobbes13ConstraintSet11constraintsEv:
   71|  19.3k|Constraints ConstraintSet::constraints() const {
   72|  19.3k|  return this->csts.values();
   73|  19.3k|}

_ZN6hobbes6clonesERKSt6vectorISt10shared_ptrINS_4ExprEESaIS3_EE:
   17|  6.34k|Exprs clones(const Exprs& es) {
   18|  6.34k|  Exprs r;
   19|  12.9k|  for (const auto &e : es) {
  ------------------
  |  Branch (19:22): [True: 12.9k, False: 6.34k]
  ------------------
   20|  12.9k|    r.push_back(ExprPtr(e->clone()));
   21|  12.9k|  }
   22|  6.34k|  return r;
   23|  6.34k|}
_ZN6hobbes4showB5cxx11ERKNS_4ExprE:
   25|    841|std::string show(const Expr& e) {
   26|    841|  std::ostringstream ss;
   27|    841|  e.show(ss);
   28|    841|  return ss.str();
   29|    841|}
_ZN6hobbes4showB5cxx11ERKSt10shared_ptrINS_4ExprEE:
   31|    841|std::string show(const ExprPtr& e) { return show(*e); }
_ZN6hobbes4ExprC2EiRKNS_17LexicalAnnotationE:
   43|   187k|Expr::Expr(int cid, const LexicalAnnotation& la) : LexicallyAnnotated(la), cid(cid) { }
_ZN6hobbes4ExprD2Ev:
   44|   187k|Expr::~Expr() = default;
_ZN6hobbes3LetD2Ev:
  111|  9.37k|Let::~Let()       { deferRelease(this->e); deferRelease(this->b); drainDeferredReleases(); }
_ZN6hobbes2FnD2Ev:
  112|  5.42k|Fn::~Fn()         { deferRelease(this->e); drainDeferredReleases(); }
_ZN6hobbes3AppD2Ev:
  113|  36.1k|App::~App()       { deferRelease(this->fne); deferRelease(this->argl); drainDeferredReleases(); }
_ZN6hobbes6AssignD2Ev:
  114|  1.41k|Assign::~Assign() { deferRelease(this->lhs); deferRelease(this->rhs); drainDeferredReleases(); }
_ZN6hobbes7MkArrayD2Ev:
  115|    890|MkArray::~MkArray()     { deferRelease(this->es); drainDeferredReleases(); }
_ZN6hobbes9MkVariantD2Ev:
  116|    960|MkVariant::~MkVariant() { deferRelease(this->e); drainDeferredReleases(); }
_ZN6hobbes6AIndexD2Ev:
  117|  2.68k|AIndex::~AIndex() { deferRelease(this->arr); deferRelease(this->i); drainDeferredReleases(); }
_ZN6hobbes4ProjD2Ev:
  118|  4.39k|Proj::~Proj()     { deferRelease(this->r); drainDeferredReleases(); }
_ZN6hobbes6AssumpD2Ev:
  119|  23.8k|Assump::~Assump() { deferRelease(this->e); drainDeferredReleases(); }
_ZN6hobbes4PackD2Ev:
  120|    277|Pack::~Pack()     { deferRelease(this->e); drainDeferredReleases(); }
_ZN6hobbes6UnpackD2Ev:
  121|     63|Unpack::~Unpack() { deferRelease(this->pkg); deferRelease(this->body); drainDeferredReleases(); }
_ZN6hobbes6LetRecD2Ev:
  123|     48|LetRec::~LetRec() {
  124|     48|  for (auto& b : this->bs) {
  ------------------
  |  Branch (124:16): [True: 48, False: 48]
  ------------------
  125|     48|    deferRelease(b.second);
  126|     48|  }
  127|     48|  deferRelease(this->e);
  128|     48|  drainDeferredReleases();
  129|     48|}
_ZN6hobbes8MkRecordD2Ev:
  131|  1.26k|MkRecord::~MkRecord() {
  132|  2.81k|  for (auto& f : this->fs) {
  ------------------
  |  Branch (132:16): [True: 2.81k, False: 1.26k]
  ------------------
  133|  2.81k|    deferRelease(f.second);
  134|  2.81k|  }
  135|  1.26k|  drainDeferredReleases();
  136|  1.26k|}
_ZN6hobbes4CaseD2Ev:
  138|  1.00k|Case::~Case() {
  139|  1.00k|  deferRelease(this->v);
  140|  1.39k|  for (auto& b : this->bs) {
  ------------------
  |  Branch (140:16): [True: 1.39k, False: 1.00k]
  ------------------
  141|  1.39k|    deferRelease(b.exp);
  142|  1.39k|  }
  143|  1.00k|  deferRelease(this->def);
  144|  1.00k|  drainDeferredReleases();
  145|  1.00k|}
_ZN6hobbes6SwitchD2Ev:
  147|     84|Switch::~Switch() {
  148|     84|  deferRelease(this->v);
  149|    253|  for (auto& b : this->bs) {
  ------------------
  |  Branch (149:16): [True: 253, False: 84]
  ------------------
  150|    253|    deferRelease(b.exp);
  151|    253|  }
  152|     84|  deferRelease(this->def);
  153|     84|  drainDeferredReleases();
  154|     84|}
_ZNK6hobbes4Expr4typeEv:
  155|   240k|const QualTypePtr& Expr::type() const { return this->annotatedType; }
_ZN6hobbes4Expr4typeERKSt10shared_ptrINS_8QualTypeEE:
  156|   169k|void Expr::type(const QualTypePtr& ty) { this->annotatedType = ty; }
_ZNK6hobbes4Expr7case_idEv:
  157|   284k|int Expr::case_id() const { return this->cid; }
_ZN6hobbes9PrimitiveC2EiRKNS_17LexicalAnnotationE:
  159|  12.5k|Primitive::Primitive(int cid, const LexicalAnnotation& la) : Expr(cid, la) { }
_ZNK6hobbes9PrimPtrLTclERKSt10shared_ptrINS_9PrimitiveEES5_:
  160|  1.13k|bool PrimPtrLT::operator()(const PrimitivePtr& p0, const PrimitivePtr& p1) const { return *p0 < *p1; }
_ZN6hobbes4UnitC2ERKNS_17LexicalAnnotationE:
  162|  1.99k|Unit::Unit(const LexicalAnnotation& la) : Base(la) { }
_ZNK6hobbes4Unit5cloneEv:
  163|  1.74k|Expr* Unit::clone() const { return new Unit(la()); }
_ZNK6hobbes4Unit4showERSo:
  164|     75|void Unit::show(std::ostream& out) const          { out << "()"; }
_ZNK6hobbes4Unit8primTypeEv:
  168|     24|MonoTypePtr Unit::primType() const { return MonoTypePtr(Prim::make("unit")); }
_ZN6hobbes4BoolC2EbRKNS_17LexicalAnnotationE:
  170|    906|Bool::Bool(bool x, const LexicalAnnotation& la) : Base(la), x(x) { }
_ZNK6hobbes4Bool5valueEv:
  171|     42|bool Bool::value() const { return this->x; }
_ZNK6hobbes4Bool5cloneEv:
  173|    778|Expr* Bool::clone() const { return new Bool(this->x,la()); }
_ZNK6hobbes4Bool4showERSo:
  174|     59|void Bool::show(std::ostream& out)          const { out << (this->x ? "true" : "false"); }
  ------------------
  |  Branch (174:61): [True: 37, False: 22]
  ------------------
_ZNK6hobbes4Bool2ltERKS0_:
  177|    102|bool Bool::lt(const Bool& rhs)              const { return static_cast<int>(this->x) < static_cast<int>(rhs.x); }
_ZNK6hobbes4Bool8primTypeEv:
  178|     16|MonoTypePtr Bool::primType() const { return MonoTypePtr(Prim::make("bool")); }
_ZN6hobbes4CharC2EcRKNS_17LexicalAnnotationE:
  180|  1.84k|Char::Char(char x, const LexicalAnnotation& la) : Base(la), x(x) { }
_ZNK6hobbes4Char5valueEv:
  181|    680|char Char::value() const { return this->x; }
_ZNK6hobbes4Char5cloneEv:
  183|  1.09k|Expr* Char::clone() const { return new Char(this->x,la()); }
_ZNK6hobbes4Char4showERSo:
  184|     42|void Char::show(std::ostream& out)          const { out << "'" << this->x << "'"; }
_ZNK6hobbes4Char8primTypeEv:
  188|     12|MonoTypePtr Char::primType() const { return MonoTypePtr(Prim::make("char")); }
_ZN6hobbes4ByteC2EhRKNS_17LexicalAnnotationE:
  190|  1.09k|Byte::Byte(unsigned char x, const LexicalAnnotation& la) : Base(la), x(x) { }
_ZNK6hobbes4Byte5valueEv:
  191|    137|unsigned char Byte::value() const { return this->x; }
_ZNK6hobbes4Byte5cloneEv:
  193|    923|Expr* Byte::clone() const { return new Byte(this->x,la()); }
_ZNK6hobbes4Byte4showERSo:
  194|      5|void Byte::show(std::ostream& out)          const { out << str::hex(this->x); }
_ZN6hobbes5ShortC2EsRKNS_17LexicalAnnotationE:
  200|     17|Short::Short(short x, const LexicalAnnotation& la) : Base(la), x(x) { }
_ZNK6hobbes5Short5cloneEv:
  203|     14|Expr* Short::clone() const { return new Short(this->x,la()); }
_ZNK6hobbes5Short4showERSo:
  204|      1|void Short::show(std::ostream& out)          const { out << this->x << "S"; }
_ZN6hobbes3IntC2EiRKNS_17LexicalAnnotationE:
  210|  2.19k|Int::Int(int x, const LexicalAnnotation& la) : Base(la), x(x) { }
_ZNK6hobbes3Int5valueEv:
  211|     52|int Int::value() const { return this->x; }
_ZNK6hobbes3Int5cloneEv:
  213|  1.95k|Expr* Int::clone() const { return new Int(this->x,la()); }
_ZNK6hobbes3Int4showERSo:
  214|    115|void Int::show(std::ostream& out)          const { out << this->x; }
_ZNK6hobbes3Int2ltERKS0_:
  217|    900|bool Int::lt(const Int& rhs)               const { return this->x < rhs.x; }
_ZNK6hobbes3Int8primTypeEv:
  218|      2|MonoTypePtr Int::primType() const { return MonoTypePtr(Prim::make("int")); }
_ZN6hobbes4LongC2ElRKNS_17LexicalAnnotationE:
  220|  4.44k|Long::Long(long x, const LexicalAnnotation& la) : Base(la), x(x) { }
_ZNK6hobbes4Long5valueEv:
  221|    164|long Long::value() const { return this->x; }
_ZNK6hobbes4Long5cloneEv:
  223|  4.06k|Expr* Long::clone() const { return new Long(this->x,la()); }
_ZNK6hobbes4Long4showERSo:
  224|    279|void Long::show(std::ostream& out)          const { out << this->x << "L"; }
_ZNK6hobbes4Long2ltERKS0_:
  227|    134|bool Long::lt(const Long& rhs)              const { return this->x < rhs.x; }
_ZNK6hobbes4Long8primTypeEv:
  228|     10|MonoTypePtr Long::primType() const { return MonoTypePtr(Prim::make("long")); }
_ZN6hobbes6Int128C2EnRKNS_17LexicalAnnotationE:
  230|      8|Int128::Int128(int128_t x, const LexicalAnnotation& la) : Base(la), x(x) { }
_ZNK6hobbes6Int1285cloneEv:
  233|      6|Expr* Int128::clone() const { return new Int128(this->x,la()); }
_ZN6hobbes5FloatC2EfRKNS_17LexicalAnnotationE:
  240|      8|Float::Float(float x, const LexicalAnnotation& la) : Base(la), x(x) { }
_ZNK6hobbes5Float5cloneEv:
  243|      6|Expr* Float::clone() const { return new Float(this->x,la()); }
_ZN6hobbes6DoubleC2EdRKNS_17LexicalAnnotationE:
  250|      8|Double::Double(double x, const LexicalAnnotation& la) : Base(la), x(x) { }
_ZNK6hobbes6Double5cloneEv:
  253|      6|Expr* Double::clone() const { return new Double(this->x,la()); }
_ZN6hobbes3VarC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNS_17LexicalAnnotationE:
  260|  86.9k|Var::Var(const std::string& id, const LexicalAnnotation& la) : Base(la), id(id) { }
_ZNK6hobbes3VareqERKS0_:
  261|  1.20k|bool Var::operator==(const Var& rhs) const { return this->id == rhs.id; }
_ZNK6hobbes3Var5valueB5cxx11Ev:
  262|  64.0k|const std::string& Var::value() const { return this->id; }
_ZNK6hobbes3Var5cloneEv:
  264|  68.7k|Expr* Var::clone() const { return new Var(this->id,la()); }
_ZNK6hobbes3Var4showERSo:
  265|  2.89k|void Var::show(std::ostream& out) const { out << this->id; }
_ZN6hobbes3LetC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_4ExprEESD_RKNS_17LexicalAnnotationE:
  268|  9.37k|Let::Let(const std::string& id, const ExprPtr& e, const ExprPtr& b, const LexicalAnnotation& la) : Base(la), id(id), e(e), b(b) { }
_ZNK6hobbes3Let3varB5cxx11Ev:
  271|  9.54k|const std::string& Let::var()      const { return this->id; }
_ZNK6hobbes3Let7varExprEv:
  272|  14.0k|const ExprPtr&     Let::varExpr()  const { return this->e; }
_ZNK6hobbes3Let8bodyExprEv:
  273|  14.0k|const ExprPtr&     Let::bodyExpr() const { return this->b; }
_ZNK6hobbes3Let5cloneEv:
  274|  1.66k|Expr*              Let::clone()    const { return new Let(this->id, ExprPtr(this->e->clone()), ExprPtr(this->b->clone()),la()); }
_ZNK6hobbes3Let4showERSo:
  280|    299|void Let::show(std::ostream& out) const {
  281|    299|  out << "let " << this->id << " = ";
  282|    299|  this->e->show(out);
  283|    299|  out << " in ";
  284|    299|  this->b->show(out);
  285|    299|}
_ZN6hobbes6LetRecC2ERKSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_4ExprEEESaISC_EERKSB_RKNS_17LexicalAnnotationE:
  296|     48|LetRec::LetRec(const Bindings& bs, const ExprPtr& e, const LexicalAnnotation& la) : Base(la), bs(bs), e(e) { }
_ZNK6hobbes6LetRec8bindingsB5cxx11Ev:
  297|     56|const LetRec::Bindings& LetRec::bindings() const { return this->bs; }
_ZNK6hobbes6LetRec8bodyExprEv:
  298|     68|const ExprPtr& LetRec::bodyExpr() const { return this->e; }
_ZN6hobbes6LetRec8bindingsB5cxx11Ev:
  299|     12|LetRec::Bindings& LetRec::bindings() { return this->bs; }
_ZNK6hobbes6LetRec8varNamesB5cxx11Ev:
  315|      8|str::seq LetRec::varNames() const {
  316|      8|  str::seq r;
  317|      8|  for (const auto& b : this->bs) {
  ------------------
  |  Branch (317:22): [True: 8, False: 8]
  ------------------
  318|      8|    r.push_back(b.first);
  319|      8|  }
  320|      8|  return r;
  321|      8|}
_ZNK6hobbes6LetRec5cloneEv:
  323|      8|Expr* LetRec::clone() const {
  324|      8|  Bindings bs;
  325|      8|  for (const auto& b : this->bs) {
  ------------------
  |  Branch (325:22): [True: 8, False: 8]
  ------------------
  326|      8|    bs.push_back(Binding(b.first, ExprPtr(b.second->clone())));
  327|      8|  }
  328|      8|  return new LetRec(bs, ExprPtr(this->e->clone()),la());
  329|      8|}
_ZNK6hobbes6LetRec4showERSo:
  331|      4|void LetRec::show(std::ostream& out) const {
  332|      4|  if (this->bs.empty()) {
  ------------------
  |  Branch (332:7): [True: 0, False: 4]
  ------------------
  333|      0|    out << "letrec {} in ";
  334|      0|    this->e->show(out);
  335|      4|  } else {
  336|      4|    out << "letrec ";
  337|      4|    out << this->bs[0].first << " = ";
  338|      4|    this->bs[0].second->show(out);
  339|      4|    for (size_t i = 1; i < this->bs.size(); ++i) {
  ------------------
  |  Branch (339:24): [True: 0, False: 4]
  ------------------
  340|      0|      out << "; " << this->bs[i].first << " = ";
  341|      0|      this->bs[i].second->show(out);
  342|      0|    }
  343|      4|    out << " in ";
  344|      4|    this->e->show(out);
  345|      4|  }
  346|      4|}
_ZN6hobbes2FnC2ERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS7_EERKSt10shared_ptrINS_4ExprEERKNS_17LexicalAnnotationE:
  365|  5.42k|Fn::Fn(const VarNames& vs, const ExprPtr& e, const LexicalAnnotation& la) : Base(la), vs(vs), e(e) {
  366|       |  // to make type-checking homogeneous, we equate the empty parameter list with a parameter list containing just unit
  367|       |  //   (unit is compiled away to nothing, so it's equivalent)
  368|  5.42k|  if (this->vs.empty()) {
  ------------------
  |  Branch (368:7): [True: 3, False: 5.42k]
  ------------------
  369|      3|    this->vs.push_back("_");
  370|      3|  }
  371|  5.42k|}
_ZNK6hobbes2Fn8varNamesB5cxx11Ev:
  373|  5.41k|const Fn::VarNames& Fn::varNames() const { return this->vs; }
_ZNK6hobbes2Fn4bodyEv:
  374|  7.17k|const ExprPtr& Fn::body() const { return this->e; }
_ZN6hobbes2Fn8varNamesB5cxx11Ev:
  375|  1.17k|Fn::VarNames& Fn::varNames() { return this->vs; }
_ZNK6hobbes2Fn5cloneEv:
  377|    716|Expr* Fn::clone() const { return new Fn(this->vs, ExprPtr(this->e->clone()),la()); }
_ZNK6hobbes2Fn4showERSo:
  378|     14|void Fn::show(std::ostream& out) const {
  379|     14|  out << "\\(";
  380|     14|  if (this->vs[0] != "_") {
  ------------------
  |  Branch (380:7): [True: 11, False: 3]
  ------------------
  381|     11|    out << this->vs[0];
  382|     14|    for (size_t i = 1; i < this->vs.size(); ++i) {
  ------------------
  |  Branch (382:24): [True: 3, False: 11]
  ------------------
  383|      3|      out << ", ";
  384|      3|      out << this->vs[i];
  385|      3|    }
  386|     11|  }
  387|     14|  out << ").(";
  388|     14|  this->e->show(out);
  389|     14|  out << ")";
  390|     14|}
_ZN6hobbes3AppC2ERKSt10shared_ptrINS_4ExprEERKSt6vectorIS3_SaIS3_EERKNS_17LexicalAnnotationE:
  406|  36.1k|App::App(const ExprPtr& fne, const Exprs& argl, const LexicalAnnotation& la) : Base(la), fne(fne), argl(argl) {
  407|       |  // to make type-checking homogeneous, we equate the empty parameter list with a parameter list containing just unit
  408|       |  //   (unit is compiled away to nothing, so it's equivalent)
  409|  36.1k|  if (this->argl.empty()) {
  ------------------
  |  Branch (409:7): [True: 69, False: 36.0k]
  ------------------
  410|     69|    this->argl.push_back(ExprPtr(new Unit(la)));
  411|     69|  }
  412|  36.1k|}
_ZNK6hobbes3App2fnEv:
  427|  63.9k|const ExprPtr& App::fn() const { return this->fne; }
_ZNK6hobbes3App4argsEv:
  428|  63.6k|const Exprs& App::args() const { return this->argl; }
_ZN6hobbes3App4argsEv:
  430|  7.34k|Exprs& App::args() { return this->argl; }
_ZNK6hobbes3App5cloneEv:
  431|  6.20k|Expr* App::clone() const { return new App(ExprPtr(this->fne->clone()), clones(this->argl),la()); }
_ZNK6hobbes3App4showERSo:
  432|  1.69k|void App::show(std::ostream& out) const {
  433|       |  // show the function part
  434|  1.69k|  if (Var* fnv = is<Var>(this->fne)) {
  ------------------
  |  Branch (434:12): [True: 1.68k, False: 10]
  ------------------
  435|  1.68k|    out << fnv->value();
  436|  1.68k|  } else {
  437|     10|    out << "(";
  438|     10|    this->fne->show(out);
  439|     10|    out << ")";
  440|     10|  }
  441|       |
  442|       |  // show the argl part
  443|  1.69k|  out << "(";
  444|  1.69k|  if (!this->argl.empty()) {
  ------------------
  |  Branch (444:7): [True: 1.69k, False: 0]
  ------------------
  445|  1.69k|    auto e = this->argl.begin();
  446|  1.69k|    (*e)->show(out);
  447|  3.60k|    while (++e != this->argl.end()) {
  ------------------
  |  Branch (447:12): [True: 1.90k, False: 1.69k]
  ------------------
  448|  1.90k|      out << ", ";
  449|  1.90k|      (*e)->show(out);
  450|  1.90k|    }
  451|  1.69k|  }
  452|  1.69k|  out << ")";
  453|  1.69k|}
_ZN6hobbes6AssignC2ERKSt10shared_ptrINS_4ExprEES5_RKNS_17LexicalAnnotationE:
  474|  1.41k|Assign::Assign(const ExprPtr& lhs, const ExprPtr& rhs, const LexicalAnnotation& la) : Base(la), lhs(lhs), rhs(rhs) {
  475|  1.41k|}
_ZNK6hobbes6Assign4leftEv:
  479|  2.57k|const ExprPtr& Assign::left()  const { return this->lhs; }
_ZNK6hobbes6Assign5rightEv:
  480|  2.40k|const ExprPtr& Assign::right() const { return this->rhs; }
_ZNK6hobbes6Assign5cloneEv:
  483|    256|Expr* Assign::clone() const { return new Assign(ExprPtr(this->lhs->clone()), ExprPtr(this->rhs->clone()),la()); }
_ZNK6hobbes6Assign4showERSo:
  485|     68|void Assign::show(std::ostream& out) const {
  486|     68|  this->lhs->show(out);
  487|     68|  out << " <- ";
  488|     68|  this->rhs->show(out);
  489|     68|}
_ZN6hobbes7MkArrayC2ERKSt6vectorISt10shared_ptrINS_4ExprEESaIS4_EERKNS_17LexicalAnnotationE:
  497|    890|MkArray::MkArray(const Exprs& es, const LexicalAnnotation& la) : Base(la), es(es) {
  498|    890|}
_ZNK6hobbes7MkArray6valuesEv:
  511|  1.27k|const Exprs& MkArray::values() const { return this->es; }
_ZN6hobbes7MkArray6valuesEv:
  512|    144|Exprs& MkArray::values() { return this->es; }
_ZNK6hobbes7MkArray5cloneEv:
  513|    140|Expr* MkArray::clone() const { return new MkArray(clones(this->es),la()); }
_ZNK6hobbes7MkArray4showERSo:
  514|     22|void MkArray::show(std::ostream& out) const {
  515|     22|  out << "[";
  516|     22|  if (!this->es.empty()) {
  ------------------
  |  Branch (516:7): [True: 3, False: 19]
  ------------------
  517|      3|    this->es[0]->show(out);
  518|      4|    for (size_t i = 1; i < this->es.size(); ++i) {
  ------------------
  |  Branch (518:24): [True: 1, False: 3]
  ------------------
  519|      1|      out << ", ";
  520|      1|      this->es[i]->show(out);
  521|      1|    }
  522|      3|  }
  523|     22|  out << "]";
  524|     22|}
_ZN6hobbes9MkVariantC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_4ExprEERKNS_17LexicalAnnotationE:
  538|    960|MkVariant::MkVariant(const std::string& lbl, const ExprPtr& e, const LexicalAnnotation& la) : Base(la), lbl(lbl), e(e) { }
_ZNK6hobbes9MkVariant5labelB5cxx11Ev:
  540|    980|const std::string& MkVariant::label() const { return this->lbl; }
_ZNK6hobbes9MkVariant5valueEv:
  541|  1.60k|const ExprPtr& MkVariant::value() const { return this->e; }
_ZNK6hobbes9MkVariant5cloneEv:
  544|     96|Expr* MkVariant::clone() const { return new MkVariant(this->lbl, ExprPtr(this->e->clone()),la()); }
_ZNK6hobbes9MkVariant4showERSo:
  545|      8|void MkVariant::show(std::ostream& out) const {
  546|      8|  out << "|" << this->lbl << " = ";
  547|      8|  this->e->show(out);
  548|      8|  out << "|";
  549|      8|}
_ZN6hobbes8MkRecordC2ERKSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_4ExprEEESaISC_EERKNS_17LexicalAnnotationE:
  557|  1.26k|MkRecord::MkRecord(const FieldDefs& fs, const LexicalAnnotation& la) : Base(la), fs(fs) { }
_ZNK6hobbes8MkRecord6fieldsB5cxx11Ev:
  570|  1.47k|const MkRecord::FieldDefs& MkRecord::fields() const { return this->fs; }
_ZN6hobbes8MkRecord6fieldsB5cxx11Ev:
  571|    621|MkRecord::FieldDefs& MkRecord::fields() { return this->fs; }
_ZNK6hobbes8MkRecord7isTupleEv:
  572|     28|bool MkRecord::isTuple() const { return !this->fs.empty() && !this->fs[0].first.empty() && this->fs[0].first[0] == '.'; }
  ------------------
  |  Branch (572:41): [True: 28, False: 0]
  |  Branch (572:62): [True: 28, False: 0]
  |  Branch (572:92): [True: 28, False: 0]
  ------------------
_ZNK6hobbes8MkRecord5cloneEv:
  573|    175|Expr* MkRecord::clone() const {
  574|    175|  FieldDefs cfs;
  575|    392|  for (const auto &f : this->fs) {
  ------------------
  |  Branch (575:22): [True: 392, False: 175]
  ------------------
  576|    392|    cfs.push_back(FieldDef(f.first, ExprPtr(f.second->clone())));
  577|    392|  }
  578|    175|  return new MkRecord(cfs,la());
  579|    175|}
_ZNK6hobbes8MkRecord4showERSo:
  580|     28|void MkRecord::show(std::ostream& out) const {
  581|     28|  if (isTuple()) {
  ------------------
  |  Branch (581:7): [True: 28, False: 0]
  ------------------
  582|     28|    showTuple(out);
  583|     28|  } else {
  584|      0|    showRecord(out);
  585|      0|  }
  586|     28|}
_ZNK6hobbes8MkRecord9showTupleERSo:
  615|     28|void MkRecord::showTuple(std::ostream& out) const {
  616|     28|  out << "(";
  617|     28|  this->fs[0].second->show(out);
  618|     62|  for (size_t i = 1; i < this->fs.size(); ++i) {
  ------------------
  |  Branch (618:22): [True: 34, False: 28]
  ------------------
  619|     34|    out << ", ";
  620|     34|    this->fs[i].second->show(out);
  621|     34|  }
  622|     28|  out << ")";
  623|     28|}
_ZN6hobbes6AIndexC2ERKSt10shared_ptrINS_4ExprEES5_RKNS_17LexicalAnnotationE:
  635|  2.68k|AIndex::AIndex(const ExprPtr& arr, const ExprPtr& i, const LexicalAnnotation& la) : Base(la), arr(arr), i(i) { }
_ZNK6hobbes6AIndex5arrayEv:
  637|  4.37k|const ExprPtr& AIndex::array() const { return this->arr; }
_ZNK6hobbes6AIndex5indexEv:
  638|  5.35k|const ExprPtr& AIndex::index() const { return this->i; }
_ZN6hobbes6AIndex5indexERKSt10shared_ptrINS_4ExprEE:
  640|    245|void AIndex::index(const ExprPtr& ni) { this->i   = ni; }
_ZNK6hobbes6AIndex5cloneEv:
  641|    549|Expr* AIndex::clone() const { return new AIndex(ExprPtr(this->arr->clone()), ExprPtr(this->i->clone()),la()); }
_ZNK6hobbes6AIndex4showERSo:
  642|    237|void AIndex::show(std::ostream& out) const {
  643|    237|  out << "(";
  644|    237|  this->arr->show(out);
  645|    237|  out << ")[";
  646|    237|  this->i->show(out);
  647|    237|  out << "]";
  648|    237|}
_ZN6hobbes4CaseC2ERKSt10shared_ptrINS_4ExprEERKSt6vectorINS0_7BindingESaIS7_EES5_RKNS_17LexicalAnnotationE:
  658|  1.00k|Case::Case(const ExprPtr& v, const Bindings& bs, const ExprPtr& def, const LexicalAnnotation& la) : Base(la), v(v), bs(bs), def(def) {
  659|  1.00k|}
_ZN6hobbes4CaseC2ERKSt10shared_ptrINS_4ExprEERKSt6vectorINS0_7BindingESaIS7_EERKNS_17LexicalAnnotationE:
  661|     86|Case::Case(const ExprPtr& v, const Bindings& bs, const LexicalAnnotation& la) : Case(v, bs, ExprPtr(), la) {
  662|     86|}
_ZNK6hobbes4Case7variantEv:
  689|  1.46k|const ExprPtr&        Case::variant()     const { return this->v; }
_ZNK6hobbes4Case8bindingsEv:
  690|  1.13k|const Case::Bindings& Case::bindings()    const { return this->bs; }
_ZNK6hobbes4Case11defaultExprEv:
  691|  1.57k|const ExprPtr&        Case::defaultExpr() const { return this->def; }
_ZN6hobbes4Case8bindingsEv:
  694|    180|Case::Bindings& Case::bindings()                       { return this->bs; }
_ZNK6hobbes4Case10hasBindingERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  697|     22|bool Case::hasBinding(const std::string& bn) const {
  698|     22|  for (const auto &b : this->bs) {
  ------------------
  |  Branch (698:22): [True: 22, False: 11]
  ------------------
  699|     22|    if (b.selector == bn) {
  ------------------
  |  Branch (699:9): [True: 11, False: 11]
  ------------------
  700|     11|      return true;
  701|     11|    }
  702|     22|  }
  703|     11|  return false;
  704|     22|}
_ZN6hobbes4Case10addBindingERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_RKSt10shared_ptrINS_4ExprEE:
  705|     11|void Case::addBinding(const std::string& selector, const std::string& vname, const ExprPtr& exp) {
  706|     11|  this->bs.push_back(Case::Binding(selector, vname, exp));
  707|     11|}
_ZNK6hobbes4Case5cloneEv:
  708|    152|Expr* Case::clone() const {
  709|    152|  Bindings cbs;
  710|    195|  for (const auto &b : this->bs) {
  ------------------
  |  Branch (710:22): [True: 195, False: 152]
  ------------------
  711|    195|    cbs.push_back(Binding(b.selector, b.vname, ExprPtr(b.exp->clone())));
  712|    195|  }
  713|    152|  return new Case(ExprPtr(this->v->clone()), cbs, this->def.get() != nullptr ? ExprPtr(this->def->clone()) : ExprPtr(),la());
  ------------------
  |  Branch (713:51): [True: 125, False: 27]
  ------------------
  714|    152|}
_ZNK6hobbes4Case4showERSo:
  715|      8|void Case::show(std::ostream& out) const {
  716|      8|  out << "case (";
  717|      8|  this->v->show(out);
  718|      8|  out << ") {";
  719|     20|  for (auto b = this->bs.begin(); b != this->bs.end(); ++b) {
  ------------------
  |  Branch (719:35): [True: 12, False: 8]
  ------------------
  720|     12|    if (b != this->bs.begin()) out << ", ";
  ------------------
  |  Branch (720:9): [True: 4, False: 8]
  ------------------
  721|       |
  722|     12|    if (b->selector != b->vname) {
  ------------------
  |  Branch (722:9): [True: 12, False: 0]
  ------------------
  723|     12|      out << b->selector << ":" << b->vname;
  724|     12|    } else {
  725|      0|      out << b->selector;
  726|      0|    }
  727|     12|    out << ".";
  728|     12|    b->exp->show(out);
  729|     12|  }
  730|      8|  if (this->def.get() != nullptr) {
  ------------------
  |  Branch (730:7): [True: 4, False: 4]
  ------------------
  731|      4|    out << ",default.";
  732|      4|    this->def->show(out);
  733|      4|  }
  734|      8|  out << "}";
  735|      8|}
_ZN6hobbes6SwitchC2ERKSt10shared_ptrINS_4ExprEERKSt6vectorINS0_7BindingESaIS7_EES5_RKNS_17LexicalAnnotationE:
  755|     84|Switch::Switch(const ExprPtr& v, const Bindings& bs, const ExprPtr& def, const LexicalAnnotation& la) : Base(la), v(v), bs(bs), def(def) {
  756|       |  // ensure exhaustive selection
  757|       |  // (only a few primitive types work with no default case)
  758|     84|  bool exhaustive = def != ExprPtr();
  759|       |
  760|     84|  if (!bs.empty()) {
  ------------------
  |  Branch (760:7): [True: 84, False: 0]
  ------------------
  761|     84|    switch (bs[0].value->case_id()) {
  ------------------
  |  Branch (761:13): [True: 16, False: 68]
  ------------------
  762|      0|    case Unit::type_case_id:
  ------------------
  |  Branch (762:5): [True: 0, False: 84]
  ------------------
  763|      0|      exhaustive = true;
  764|      0|      break;
  765|     16|    case Bool::type_case_id:
  ------------------
  |  Branch (765:5): [True: 16, False: 68]
  ------------------
  766|     16|      exhaustive |= bs.size() == 2;
  767|     16|      break;
  768|      0|    case Byte::type_case_id:
  ------------------
  |  Branch (768:5): [True: 0, False: 84]
  ------------------
  769|      0|      exhaustive |= bs.size() == 256;
  770|      0|      break;
  771|      0|    case Case::type_case_id:
  ------------------
  |  Branch (771:5): [True: 0, False: 84]
  ------------------
  772|      0|      exhaustive |= bs.size() == 256;
  773|      0|      break;
  774|     84|    }
  775|     84|  }
  776|       |
  777|     84|  if (!exhaustive) {
  ------------------
  |  Branch (777:7): [True: 0, False: 84]
  ------------------
  778|      0|    std::ostringstream ss;
  779|      0|    ss << "Inexhaustive switch coverage:\n  ";
  780|      0|    show(ss);
  781|      0|    throw annotated_error(la, ss.str());
  782|      0|  }
  783|       |
  784|       |  // ensure unambiguous selection
  785|     84|  PrimitiveSet selectors;
  786|       |
  787|    253|  for (const auto &b : bs) {
  ------------------
  |  Branch (787:22): [True: 253, False: 84]
  ------------------
  788|    253|    if (selectors.find(b.value) != selectors.end()) {
  ------------------
  |  Branch (788:9): [True: 0, False: 253]
  ------------------
  789|      0|      std::ostringstream ss;
  790|      0|      ss << "Duplicate selector in switch expression:\n";
  791|      0|      show(ss);
  792|      0|      throw annotated_error(la, ss.str());
  793|    253|    } else {
  794|    253|      selectors.insert(b.value);
  795|    253|    }
  796|    253|  }
  797|     84|}
_ZNK6hobbes6Switch4exprEv:
  826|    120|const ExprPtr&          Switch::expr()        const { return this->v; }
_ZNK6hobbes6Switch8bindingsEv:
  827|     90|const Switch::Bindings& Switch::bindings()    const { return this->bs; }
_ZNK6hobbes6Switch11defaultExprEv:
  828|    152|const ExprPtr&          Switch::defaultExpr() const { return this->def; }
_ZN6hobbes6Switch8bindingsEv:
  831|     24|Switch::Bindings& Switch::bindings() { return this->bs; }
_ZNK6hobbes6Switch5cloneEv:
  834|     15|Expr* Switch::clone() const {
  835|     15|  ExprPtr cdef = this->def ? ExprPtr(this->def->clone()) : ExprPtr();
  ------------------
  |  Branch (835:18): [True: 15, False: 0]
  ------------------
  836|     15|  Bindings cbs;
  837|     35|  for (const auto& b : this->bs) {
  ------------------
  |  Branch (837:22): [True: 35, False: 15]
  ------------------
  838|       |    // a downcast, not a reinterpretation: clone() is declared on Expr but the
  839|       |    // object really is a Primitive, so let the compiler adjust the pointer
  840|     35|    cbs.push_back(Binding(PrimitivePtr(static_cast<Primitive*>(b.value->clone())), ExprPtr(b.exp->clone())));
  841|     35|  }
  842|     15|  return new Switch(ExprPtr(this->v->clone()), cbs, cdef, la());
  843|     15|}
_ZNK6hobbes6Switch4showERSo:
  845|      4|void Switch::show(std::ostream& out) const {
  846|      4|  out << "switch (";
  847|      4|  this->v->show(out);
  848|      4|  out << ") {";
  849|      8|  for (const auto& b : this->bs) {
  ------------------
  |  Branch (849:22): [True: 8, False: 4]
  ------------------
  850|      8|    b.value->show(out);
  851|      8|    out << " => ";
  852|      8|    b.exp->show(out);
  853|      8|    out << "; ";
  854|      8|  }
  855|      4|  if (this->def) {
  ------------------
  |  Branch (855:7): [True: 4, False: 0]
  ------------------
  856|      4|    out << "default => ";
  857|      4|    this->def->show(out);
  858|      4|    out << "; ";
  859|      4|  }
  860|      4|  out << "}";
  861|      4|}
_ZN6hobbes4ProjC2ERKSt10shared_ptrINS_4ExprEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNS_17LexicalAnnotationE:
  883|  4.39k|Proj::Proj(const ExprPtr& r, const std::string& fn, const LexicalAnnotation& la) : Base(la), r(r), fn(fn) { }
_ZNK6hobbes4Proj6recordEv:
  885|  6.80k|const ExprPtr& Proj::record() const { return this->r; }
_ZNK6hobbes4Proj5fieldB5cxx11Ev:
  886|  3.85k|const std::string& Proj::field() const { return this->fn; }
_ZNK6hobbes4Proj5cloneEv:
  889|    589|Expr* Proj::clone() const { return new Proj(ExprPtr(this->r->clone()), this->fn, la()); }
_ZNK6hobbes4Proj4showERSo:
  891|     89|void Proj::show(std::ostream& out) const {
  892|     89|  this->r->show(out);
  893|     89|  out << "." << this->fn;
  894|     89|}
_ZN6hobbes6AssumpC2ERKSt10shared_ptrINS_4ExprEERKS1_INS_8QualTypeEERKNS_17LexicalAnnotationE:
  902|  23.8k|Assump::Assump(const ExprPtr& e, const QualTypePtr& t, const LexicalAnnotation& la) : Base(la), e(e), t(t) { }
_ZNK6hobbes6Assump5cloneEv:
  904|  1.16k|Expr* Assump::clone() const { return new Assump(ExprPtr(this->e->clone()), hobbes::cloneP(this->t), la()); }
_ZNK6hobbes6Assump4exprEv:
  905|  42.7k|const ExprPtr& Assump::expr() const { return this->e; }
_ZNK6hobbes6Assump2tyEv:
  906|  34.6k|const QualTypePtr& Assump::ty() const { return this->t; }
_ZN6hobbes6Assump2tyERKSt10shared_ptrINS_8QualTypeEE:
  908|  4.01k|void Assump::ty(const QualTypePtr& nt) { this->t = nt; }
_ZNK6hobbes6Assump4showERSo:
  910|    161|void Assump::show(std::ostream& out) const {
  911|    161|  this->e->show(out);
  912|    161|  out << "::";
  913|    161|  out << showNoSimpl(this->t);
  914|    161|}
_ZN6hobbes4PackC2ERKSt10shared_ptrINS_4ExprEERKNS_17LexicalAnnotationE:
  923|    277|Pack::Pack(const ExprPtr& e, const LexicalAnnotation& la) : Base(la), e(e) { }
_ZNK6hobbes4Pack5cloneEv:
  925|     23|Expr* Pack::clone() const { return new Pack(ExprPtr(this->e->clone()), la()); }
_ZNK6hobbes4Pack4exprEv:
  926|    358|const ExprPtr& Pack::expr() const { return this->e; }
_ZN6hobbes6UnpackC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_4ExprEESD_RKNS_17LexicalAnnotationE:
  941|     63|Unpack::Unpack(const std::string& vn, const ExprPtr& pkg, const ExprPtr& body, const LexicalAnnotation& la) : Base(la), vn(vn), pkg(pkg), body(body) { }
_ZNK6hobbes6Unpack5cloneEv:
  943|      6|Expr* Unpack::clone() const { return new Unpack(this->vn, ExprPtr(this->pkg->clone()), ExprPtr(this->body->clone()), la()); }
_ZNK6hobbes6Unpack7varNameB5cxx11Ev:
  944|     78|const std::string& Unpack::varName() const { return this->vn; }
_ZNK6hobbes6Unpack7packageEv:
  945|    100|const ExprPtr&     Unpack::package() const { return this->pkg; }
_ZNK6hobbes6Unpack4exprEv:
  946|    100|const ExprPtr&     Unpack::expr()    const { return this->body; }
_ZN6hobbes10substituteERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_4ExprEESt4lessIS6_ESaISt4pairIKS6_S9_EEERKS9_Pb:
 1096|    462|ExprPtr substitute(const VarMapping& vm, const ExprPtr& e, bool* mapped) {
 1097|    462|  return switchOf(e, substVarF(vm, mapped));
 1098|    462|}
_ZN6hobbes10substituteERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEESt4lessIS6_ESaISt4pairIKS6_S9_EEERKS7_INS_4ExprEE:
 1113|  1.02k|ExprPtr substitute(const MonoTypeSubst& s, const ExprPtr& e) {
 1114|  1.02k|  return switchOf(e, substTyF(s));
 1115|  1.02k|}
_ZN6hobbes7isConstERKSt10shared_ptrINS_4ExprEE:
 1137|     40|bool isConst(const ExprPtr& e) {
 1138|     40|  return switchOf(e, isConstP());
 1139|     40|}
_ZN6hobbes8subExprsERKSt10shared_ptrINS_4ExprEE:
 1208|  61.5k|Exprs subExprs(const ExprPtr& e) {
 1209|  61.5k|  return e ? switchOf(e, subExprsF()) : Exprs();
  ------------------
  |  Branch (1209:10): [True: 61.5k, False: 0]
  ------------------
 1210|  61.5k|}
_ZN6hobbes12nestingDepthERKSt10shared_ptrINS_4ExprEE:
 1216|  3.26k|size_t nestingDepth(const ExprPtr& root) {
 1217|  3.26k|  if (!root) {
  ------------------
  |  Branch (1217:7): [True: 749, False: 2.51k]
  ------------------
 1218|    749|    return 0;
 1219|    749|  }
 1220|       |
 1221|       |  // an expression can reach the same sub-expression by more than one path, so
 1222|       |  // depths are memoized -- without that, a tree of shared sub-expressions takes
 1223|       |  // exponential time to measure
 1224|  2.51k|  std::unordered_map<const Expr*, size_t> depths;
 1225|  2.51k|  std::unordered_set<const Expr*>         pushed;
 1226|       |
 1227|  2.51k|  using Frame = std::pair<ExprPtr, bool>; // the expression, and whether its children are on the stack
 1228|  2.51k|  std::vector<Frame> stack;
 1229|  2.51k|  stack.push_back(Frame(root, false));
 1230|  2.51k|  pushed.insert(root.get());
 1231|       |
 1232|  64.0k|  while (!stack.empty()) {
  ------------------
  |  Branch (1232:10): [True: 61.5k, False: 2.51k]
  ------------------
 1233|  61.5k|    if (!stack.back().second) {
  ------------------
  |  Branch (1233:9): [True: 30.7k, False: 30.7k]
  ------------------
 1234|  30.7k|      stack.back().second = true;
 1235|       |
 1236|  30.7k|      const Exprs cs = subExprs(stack.back().first);
 1237|  30.7k|      for (const auto& c : cs) {
  ------------------
  |  Branch (1237:26): [True: 28.3k, False: 30.7k]
  ------------------
 1238|  28.3k|        if (c && pushed.insert(c.get()).second) {
  ------------------
  |  Branch (1238:13): [True: 28.3k, False: 0]
  |  Branch (1238:13): [True: 28.2k, False: 89]
  |  Branch (1238:18): [True: 28.2k, False: 89]
  ------------------
 1239|  28.2k|          stack.push_back(Frame(c, false));
 1240|  28.2k|        }
 1241|  28.3k|      }
 1242|  30.7k|    } else {
 1243|  30.7k|      const ExprPtr e = stack.back().first;
 1244|  30.7k|      stack.pop_back();
 1245|       |
 1246|  30.7k|      size_t d = 1;
 1247|  30.7k|      for (const auto& c : subExprs(e)) {
  ------------------
  |  Branch (1247:26): [True: 28.3k, False: 30.7k]
  ------------------
 1248|  28.3k|        if (c) {
  ------------------
  |  Branch (1248:13): [True: 28.3k, False: 0]
  ------------------
 1249|  28.3k|          d = std::max(d, depths[c.get()] + 1);
 1250|  28.3k|        }
 1251|  28.3k|      }
 1252|  30.7k|      depths[e.get()] = d;
 1253|  30.7k|    }
 1254|  61.5k|  }
 1255|       |
 1256|  2.51k|  return depths[root.get()];
 1257|  3.26k|}
_ZN6hobbes17checkNestingDepthERKSt10shared_ptrINS_4ExprEE:
 1293|  3.26k|void checkNestingDepth(const ExprPtr& e) {
 1294|  3.26k|  const size_t d = nestingDepth(e);
 1295|  3.26k|  if (d > maxExprNestingDepth) {
  ------------------
  |  Branch (1295:7): [True: 0, False: 3.26k]
  ------------------
 1296|      0|    throw std::runtime_error(
 1297|      0|      "Expression nests " + str::from(d) + " levels deep, past the limit of " + str::from(maxExprNestingDepth)
 1298|      0|    );
 1299|      0|  }
 1300|  3.26k|}
_ZNK6hobbes14switchExprTyFn6withTyERKSt10shared_ptrINS_8QualTypeEE:
 1303|  42.3k|QualTypePtr switchExprTyFn::withTy(const QualTypePtr& qt) const {
 1304|  42.3k|  return qt;
 1305|  42.3k|}
_ZNK6hobbes14switchExprTyFn10wrapWithTyERKSt10shared_ptrINS_8QualTypeEEPNS_4ExprE:
 1307|  87.5k|ExprPtr switchExprTyFn::wrapWithTy(const QualTypePtr& qty, Expr* e) const {
 1308|  87.5k|  e->type(withTy(qty));
 1309|  87.5k|  return ExprPtr(e);
 1310|  87.5k|}
_ZN6hobbes8switchOfERKSt6vectorINS_4Case7BindingESaIS2_EERKNS_10switchExprISt10shared_ptrINS_4ExprEEEE:
 1312|    651|Case::Bindings switchOf(const Case::Bindings& bs, const switchExpr<ExprPtr>& f) {
 1313|    651|  Case::Bindings r;
 1314|    892|  for (const auto &b : bs) {
  ------------------
  |  Branch (1314:22): [True: 892, False: 651]
  ------------------
 1315|    892|    r.push_back(Case::Binding(b.selector, b.vname, switchOf(b.exp, f)));
 1316|    892|  }
 1317|    651|  return r;
 1318|    651|}
_ZN6hobbes8switchOfERKSt6vectorINS_6Switch7BindingESaIS2_EERKNS_10switchExprISt10shared_ptrINS_4ExprEEEE:
 1320|     60|Switch::Bindings switchOf(const Switch::Bindings& bs, const switchExpr<ExprPtr>& f) {
 1321|     60|  Switch::Bindings r;
 1322|    195|  for (const auto& b : bs) {
  ------------------
  |  Branch (1322:22): [True: 195, False: 60]
  ------------------
 1323|    195|    r.push_back(Switch::Binding(b.value, switchOf(b.exp, f)));
 1324|    195|  }
 1325|     60|  return r;
 1326|     60|}
_ZNK6hobbes14switchExprTyFn9withConstEPKNS_4ExprE:
 1328|  6.68k|ExprPtr switchExprTyFn::withConst(const Expr* v)      const { return wrapWithTy(v->type(), v->clone()); }
_ZNK6hobbes14switchExprTyFn4withEPKNS_3VarE:
 1329|  36.2k|ExprPtr switchExprTyFn::with     (const Var* v)       const { return wrapWithTy(v->type(), v->clone()); }
_ZNK6hobbes14switchExprTyFn4withEPKNS_3LetE:
 1330|  5.05k|ExprPtr switchExprTyFn::with     (const Let* v)       const { return wrapWithTy(v->type(), new Let(v->var(), switchOf(v->varExpr(), *this), switchOf(v->bodyExpr(), *this), v->la())); }
_ZNK6hobbes14switchExprTyFn4withEPKNS_2FnE:
 1331|  2.52k|ExprPtr switchExprTyFn::with     (const Fn* v)        const { return wrapWithTy(v->type(), new Fn(v->varNames(), switchOf(v->body(), *this), v->la())); }
_ZNK6hobbes14switchExprTyFn4withEPKNS_3AppE:
 1332|  17.7k|ExprPtr switchExprTyFn::with     (const App* v)       const { return wrapWithTy(v->type(), new App(switchOf(v->fn(), *this), switchOf(v->args(), *this), v->la())); }
_ZNK6hobbes14switchExprTyFn4withEPKNS_6AssignE:
 1333|    648|ExprPtr switchExprTyFn::with     (const Assign* v)    const { return wrapWithTy(v->type(), new Assign(switchOf(v->left(), *this), switchOf(v->right(), *this), v->la())); }
_ZNK6hobbes14switchExprTyFn4withEPKNS_7MkArrayE:
 1334|    487|ExprPtr switchExprTyFn::with     (const MkArray* v)   const { return wrapWithTy(v->type(), new MkArray(switchOf(v->values(), *this), v->la())); }
_ZNK6hobbes14switchExprTyFn4withEPKNS_9MkVariantE:
 1335|    715|ExprPtr switchExprTyFn::with     (const MkVariant* v) const { return wrapWithTy(v->type(), new MkVariant(v->label(), switchOf(v->value(), *this), v->la())); }
_ZNK6hobbes14switchExprTyFn4withEPKNS_8MkRecordE:
 1336|    830|ExprPtr switchExprTyFn::with     (const MkRecord* v)  const { return wrapWithTy(v->type(), new MkRecord(switchOf(v->fields(), *this), v->la())); }
_ZNK6hobbes14switchExprTyFn4withEPKNS_6AIndexE:
 1337|  1.49k|ExprPtr switchExprTyFn::with     (const AIndex* v)    const { return wrapWithTy(v->type(), new AIndex(switchOf(v->array(), *this), switchOf(v->index(), *this), v->la())); }
_ZNK6hobbes14switchExprTyFn4withEPKNS_4ProjE:
 1338|  2.99k|ExprPtr switchExprTyFn::with     (const Proj* v)      const { return wrapWithTy(v->type(), new Proj(switchOf(v->record(), *this), v->field(), v->la())); }
_ZNK6hobbes14switchExprTyFn4withEPKNS_6AssumpE:
 1339|  14.9k|ExprPtr switchExprTyFn::with     (const Assump* v)    const { return wrapWithTy(v->type(), new Assump(switchOf(v->expr(), *this), withTy(v->ty()), v->la())); }
_ZNK6hobbes14switchExprTyFn4withEPKNS_4PackE:
 1340|    209|ExprPtr switchExprTyFn::with     (const Pack* v)      const { return wrapWithTy(v->type(), new Pack(switchOf(v->expr(), *this), v->la())); }
_ZNK6hobbes14switchExprTyFn4withEPKNS_6UnpackE:
 1341|     43|ExprPtr switchExprTyFn::with     (const Unpack* v)    const { return wrapWithTy(v->type(), new Unpack(v->varName(), switchOf(v->package(), *this), switchOf(v->expr(), *this), v->la())); }
_ZNK6hobbes14switchExprTyFn4withEPKNS_6LetRecE:
 1343|     28|ExprPtr switchExprTyFn::with(const LetRec* v) const {
 1344|     28|  LetRec::Bindings bs;
 1345|     28|  for (const auto& b : v->bindings()) {
  ------------------
  |  Branch (1345:22): [True: 28, False: 28]
  ------------------
 1346|     28|    bs.push_back(LetRec::Binding(b.first, switchOf(b.second, *this)));
 1347|     28|  }
 1348|     28|  return wrapWithTy(v->type(), new LetRec(bs, switchOf(v->bodyExpr(), *this), v->la()));
 1349|     28|}
_ZNK6hobbes14switchExprTyFn4withEPKNS_4CaseE:
 1351|    598|ExprPtr switchExprTyFn::with(const Case* v) const {
 1352|    598|  ExprPtr de = v->defaultExpr();
 1353|    598|  if (de.get() != nullptr) { de = switchOf(de, *this); }
  ------------------
  |  Branch (1353:7): [True: 397, False: 201]
  ------------------
 1354|       |
 1355|    598|  return wrapWithTy(v->type(), new Case(switchOf(v->variant(), *this), switchOf(v->bindings(), *this), de, v->la()));
 1356|    598|}
_ZNK6hobbes14switchExprTyFn4withEPKNS_6SwitchE:
 1358|     52|ExprPtr switchExprTyFn::with(const Switch* v) const {
 1359|     52|  ExprPtr de = v->defaultExpr();
 1360|     52|  if (de) { de = switchOf(de, *this); }
  ------------------
  |  Branch (1360:7): [True: 52, False: 0]
  ------------------
 1361|       |
 1362|     52|  return wrapWithTy(v->type(), new Switch(switchOf(v->expr(), *this), switchOf(v->bindings(), *this), de, v->la()));
 1363|     52|}
_ZN6hobbes8switchOfERKSt6vectorINS_4Case7BindingESaIS2_EERKNS_15switchExprTyFnME:
 1366|     69|UnitV switchOf(const Case::Bindings& bs, const switchExprTyFnM& f) {
 1367|     98|  for (const auto &b : bs) {
  ------------------
  |  Branch (1367:22): [True: 98, False: 69]
  ------------------
 1368|     98|    switchOf(b.exp, const_cast<switchExprTyFnM&>(f));
 1369|     98|  }
 1370|     69|  return unitv;
 1371|     69|}
_ZN6hobbes8switchOfERKSt6vectorINS_6Switch7BindingESaIS2_EERKNS_15switchExprTyFnME:
 1373|      8|UnitV switchOf(const Switch::Bindings& bs, const switchExprTyFnM& f) {
 1374|     21|  for (const auto& b : bs) {
  ------------------
  |  Branch (1374:22): [True: 21, False: 8]
  ------------------
 1375|     21|    switchOf(b.exp, const_cast<switchExprTyFnM&>(f));
 1376|     21|  }
 1377|      8|  return unitv;
 1378|      8|}
_ZNK6hobbes15switchExprTyFnM8updateTyEPNS_4ExprE:
 1384|  22.3k|UnitV switchExprTyFnM::updateTy(Expr* e) const {
 1385|  22.3k|  if (e->type() != QualTypePtr()) {
  ------------------
  |  Branch (1385:7): [True: 21.8k, False: 486]
  ------------------
 1386|  21.8k|    e->type(withTy(e->type()));
 1387|  21.8k|  }
 1388|  22.3k|  return unitv;
 1389|  22.3k|}
_ZN6hobbes15switchExprTyFnM4withEPNS_4UnitE:
 1391|    234|UnitV switchExprTyFnM::with(Unit* v) { return updateTy(v); }
_ZN6hobbes15switchExprTyFnM4withEPNS_4BoolE:
 1392|    101|UnitV switchExprTyFnM::with(Bool* v) { return updateTy(v); }
_ZN6hobbes15switchExprTyFnM4withEPNS_4CharE:
 1393|    158|UnitV switchExprTyFnM::with(Char* v) { return updateTy(v); }
_ZN6hobbes15switchExprTyFnM4withEPNS_4ByteE:
 1394|    169|UnitV switchExprTyFnM::with(Byte* v) { return updateTy(v); }
_ZN6hobbes15switchExprTyFnM4withEPNS_5ShortE:
 1395|      5|UnitV switchExprTyFnM::with(Short* v) { return updateTy(v); }
_ZN6hobbes15switchExprTyFnM4withEPNS_3IntE:
 1396|    213|UnitV switchExprTyFnM::with(Int* v) { return updateTy(v); }
_ZN6hobbes15switchExprTyFnM4withEPNS_4LongE:
 1397|    597|UnitV switchExprTyFnM::with(Long* v) { return updateTy(v); }
_ZN6hobbes15switchExprTyFnM4withEPNS_6Int128E:
 1398|      4|UnitV switchExprTyFnM::with(Int128* v) { return updateTy(v); }
_ZN6hobbes15switchExprTyFnM4withEPNS_5FloatE:
 1399|      4|UnitV switchExprTyFnM::with(Float* v) { return updateTy(v); }
_ZN6hobbes15switchExprTyFnM4withEPNS_6DoubleE:
 1400|      4|UnitV switchExprTyFnM::with(Double* v) { return updateTy(v); }
_ZN6hobbes15switchExprTyFnM4withEPNS_3VarE:
 1401|  10.0k|UnitV switchExprTyFnM::with(Var* v) { return updateTy(v); }
_ZN6hobbes15switchExprTyFnM4withEPNS_3LetE:
 1403|    782|UnitV switchExprTyFnM::with(Let* v) {
 1404|    782|  switchOf(v->varExpr(), *this);
 1405|    782|  switchOf(v->bodyExpr(), *this);
 1406|    782|  return updateTy(v);
 1407|    782|}
_ZN6hobbes15switchExprTyFnM4withEPNS_6LetRecE:
 1409|      4|UnitV switchExprTyFnM::with(LetRec* v) {
 1410|      4|  for (const auto& b : v->bindings()) {
  ------------------
  |  Branch (1410:22): [True: 4, False: 4]
  ------------------
 1411|      4|    switchOf(b.second, *this);
 1412|      4|  }
 1413|      4|  switchOf(v->bodyExpr(), *this);
 1414|      4|  return updateTy(v);
 1415|      4|}
_ZN6hobbes15switchExprTyFnM4withEPNS_2FnE:
 1417|    740|UnitV switchExprTyFnM::with(Fn* v) {
 1418|    740|  switchOf(v->body(), *this);
 1419|    740|  return updateTy(v);
 1420|    740|}
_ZN6hobbes15switchExprTyFnM4withEPNS_3AppE:
 1422|  4.05k|UnitV switchExprTyFnM::with(App* v) {
 1423|  4.05k|  switchOf(v->fn(), *this);
 1424|  4.05k|  switchOf(v->args(), *this);
 1425|  4.05k|  return updateTy(v);
 1426|  4.05k|}
_ZN6hobbes15switchExprTyFnM4withEPNS_6AssignE:
 1428|    138|UnitV switchExprTyFnM::with(Assign* v) {
 1429|    138|  switchOf(v->left(), *this);
 1430|    138|  switchOf(v->right(), *this);
 1431|    138|  return updateTy(v);
 1432|    138|}
_ZN6hobbes15switchExprTyFnM4withEPNS_7MkArrayE:
 1434|     77|UnitV switchExprTyFnM::with(MkArray* v) {
 1435|     77|  switchOf(v->values(), *this);
 1436|     77|  return updateTy(v);
 1437|     77|}
_ZN6hobbes15switchExprTyFnM4withEPNS_9MkVariantE:
 1439|    153|UnitV switchExprTyFnM::with(MkVariant* v) {
 1440|    153|  switchOf(v->value(), *this);
 1441|    153|  return updateTy(v);
 1442|    153|}
_ZN6hobbes15switchExprTyFnM4withEPNS_8MkRecordE:
 1444|    111|UnitV switchExprTyFnM::with(MkRecord* v) {
 1445|    111|  switchOf(v->fields(), *this);
 1446|    111|  return updateTy(v);
 1447|    111|}
_ZN6hobbes15switchExprTyFnM4withEPNS_6AIndexE:
 1449|    306|UnitV switchExprTyFnM::with(AIndex* v) {
 1450|    306|  switchOf(v->array(), *this);
 1451|    306|  switchOf(v->index(), *this);
 1452|    306|  return updateTy(v);
 1453|    306|}
_ZN6hobbes15switchExprTyFnM4withEPNS_4CaseE:
 1455|     69|UnitV switchExprTyFnM::with(Case* v) {
 1456|     69|  ExprPtr de = v->defaultExpr();
 1457|     69|  if (de.get() != nullptr) { switchOf(de, *this); }
  ------------------
  |  Branch (1457:7): [True: 40, False: 29]
  ------------------
 1458|       |
 1459|     69|  switchOf(v->variant(), *this);
 1460|     69|  switchOf(v->bindings(), *this);
 1461|     69|  return updateTy(v);
 1462|     69|}
_ZN6hobbes15switchExprTyFnM4withEPNS_6SwitchE:
 1464|      8|UnitV switchExprTyFnM::with(Switch* v) {
 1465|      8|  ExprPtr de = v->defaultExpr();
 1466|      8|  if (de) { switchOf(de, *this); }
  ------------------
  |  Branch (1466:7): [True: 8, False: 0]
  ------------------
 1467|       |
 1468|      8|  switchOf(v->expr(), *this);
 1469|      8|  switchOf(v->bindings(), *this);
 1470|      8|  return updateTy(v);
 1471|      8|}
_ZN6hobbes15switchExprTyFnM4withEPNS_4ProjE:
 1473|    309|UnitV switchExprTyFnM::with(Proj* v) {
 1474|    309|  switchOf(v->record(), *this);
 1475|    309|  return updateTy(v);
 1476|    309|}
_ZN6hobbes15switchExprTyFnM4withEPNS_6AssumpE:
 1478|  4.01k|UnitV switchExprTyFnM::with(Assump* v) {
 1479|  4.01k|  switchOf(v->expr(), *this);
 1480|  4.01k|  v->ty(withTy(v->ty()));
 1481|  4.01k|  return updateTy(v);
 1482|  4.01k|}
_ZN6hobbes15switchExprTyFnM4withEPNS_4PackE:
 1484|     24|UnitV switchExprTyFnM::with(Pack* v) {
 1485|     24|  switchOf(v->expr(), *this);
 1486|     24|  return updateTy(v);
 1487|     24|}
_ZN6hobbes15switchExprTyFnM4withEPNS_6UnpackE:
 1489|     11|UnitV switchExprTyFnM::with(Unpack* v) {
 1490|     11|  switchOf(v->package(), *this);
 1491|     11|  switchOf(v->expr(), *this);
 1492|     11|  return updateTy(v);
 1493|     11|}
_ZN6hobbes15requireMonotypeERKSt10shared_ptrINS_4TEnvEERKS0_INS_4ExprEE:
 1516|  3.65k|const MonoTypePtr& requireMonotype(const TEnvPtr& tenv, const ExprPtr& e) {
 1517|  3.65k|  if (e->type() == QualTypePtr()) {
  ------------------
  |  Branch (1517:7): [True: 0, False: 3.65k]
  ------------------
 1518|      0|    throw annotated_error(*e, "Expression '" + show(e) + "' not explicitly annotated.  Internal compiler error.");
 1519|      0|  }
 1520|       |
 1521|  3.65k|  if (!e->type()->constraints().empty()) {
  ------------------
  |  Branch (1521:7): [True: 0, False: 3.65k]
  ------------------
 1522|      0|    Constraints cs = expandHiddenTCs(tenv, simplifyVarNames(e->type())->constraints());
 1523|      0|    std::ostringstream ss;
 1524|      0|    ss << "Failed to compile expression due to unresolved type constraint" << (cs.size() > 1 ? "s" : "");
  ------------------
  |  Branch (1524:80): [True: 0, False: 0]
  ------------------
 1525|      0|    throw unsolved_constraints(*e, ss.str(), cs);
 1526|      0|  }
 1527|       |  
 1528|  3.65k|  return e->type()->monoType();
 1529|  3.65k|}
_ZN6hobbes15requireMonotypeERKSt10shared_ptrINS_4TEnvEERKSt6vectorIS0_INS_4ExprEESaIS7_EE:
 1531|    879|MonoTypes requireMonotype(const TEnvPtr& tenv, const Exprs& es) {
 1532|    879|  MonoTypes r;
 1533|  1.47k|  for (const auto& e : es) {
  ------------------
  |  Branch (1533:22): [True: 1.47k, False: 879]
  ------------------
 1534|  1.47k|    r.push_back(requireMonotype(tenv, e));
 1535|  1.47k|  }
 1536|    879|  return r;
 1537|    879|}
_ZN6hobbes15stripAssumpHeadERKSt10shared_ptrINS_4ExprEE:
 1553|  3.65k|const ExprPtr& stripAssumpHead(const ExprPtr& e) {
 1554|  3.65k|  if (const Assump* ae = is<Assump>(e)) {
  ------------------
  |  Branch (1554:21): [True: 1.96k, False: 1.68k]
  ------------------
 1555|  1.96k|    return stripAssumpHead(ae->expr());
 1556|  1.96k|  } else {
 1557|  1.68k|    return e;
 1558|  1.68k|  }
 1559|  3.65k|}
_ZN6hobbes8freeVarsB5cxx11ERKSt10shared_ptrINS_4ExprEE:
 1615|  7.50k|VarSet freeVars(const ExprPtr& e) {
 1616|  7.50k|  return switchOf(e, freeVarF());
 1617|  7.50k|}
_ZN6hobbes14mkTimespanExprERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS6_EERKNS_17LexicalAnnotationE:
 1701|      1|ExprPtr mkTimespanExpr(const str::seq& x, const LexicalAnnotation& la) {
 1702|      1|  return assume(fncall(var("convert", la), list(ExprPtr(new Long(readTimespan(x), la))), la), qualtype(primty("timespan", primty("long"))), la);
 1703|      1|}
expr.C:_ZN6hobbes12_GLOBAL__N_112deferReleaseERSt10shared_ptrINS_4ExprEE:
   81|   181k|  void deferRelease(ExprPtr& e) {
   82|   181k|    if (e) {
  ------------------
  |  Branch (82:9): [True: 180k, False: 344]
  ------------------
   83|   180k|      deferredReleases().push_back(std::move(e));
   84|   180k|    }
   85|   181k|  }
expr.C:_ZN6hobbes12_GLOBAL__N_116deferredReleasesEv:
   74|   191k|  Exprs& deferredReleases() {
   75|   191k|    alignas(Exprs) thread_local unsigned char storage[sizeof(Exprs)];
   76|   191k|    thread_local Exprs* es = new (storage) Exprs();
   77|   191k|    return *es;
   78|   191k|  }
expr.C:_ZN6hobbes12_GLOBAL__N_121drainDeferredReleasesEv:
   95|  87.8k|  void drainDeferredReleases() {
   96|  87.8k|    if (drainingReleases) {
  ------------------
  |  Branch (96:9): [True: 77.2k, False: 10.5k]
  ------------------
   97|  77.2k|      return;
   98|  77.2k|    }
   99|  10.5k|    drainingReleases = true;
  100|  10.5k|    Exprs& es = deferredReleases();
  101|   191k|    while (!es.empty()) {
  ------------------
  |  Branch (101:12): [True: 180k, False: 10.5k]
  ------------------
  102|   180k|      ExprPtr e = std::move(es.back());
  103|   180k|      es.pop_back();
  104|   180k|      e.reset();
  105|   180k|    }
  106|  10.5k|    Exprs().swap(es); // hand the buffer back: the list must hold no heap between teardowns
  107|  10.5k|    drainingReleases = false;
  108|  10.5k|  }
expr.C:_ZN6hobbes12_GLOBAL__N_112deferReleaseERSt6vectorISt10shared_ptrINS_4ExprEESaIS4_EE:
   86|  36.9k|  void deferRelease(Exprs& es) {
   87|  76.3k|    for (auto& e : es) {
  ------------------
  |  Branch (87:18): [True: 76.3k, False: 36.9k]
  ------------------
   88|  76.3k|      deferRelease(e);
   89|  76.3k|    }
   90|  36.9k|  }
_ZN6hobbes9substVarFC2ERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_4ExprEESt4lessIS7_ESaISt4pairIKS7_SA_EEEPb:
  994|  1.00k|  substVarF(const VarMapping& vm, bool* mapped) : vm(vm), mapped(mapped) { }
_ZNK6hobbes9substVarF4withEPKNS_3VarE:
 1002|  4.90k|  ExprPtr with(const Var* v) const override {
 1003|  4.90k|    auto ve = this->vm.find(v->value());
 1004|  4.90k|    if (ve == this->vm.end()) {
  ------------------
  |  Branch (1004:9): [True: 4.22k, False: 672]
  ------------------
 1005|  4.22k|      return ExprPtr(v->clone());
 1006|  4.22k|    } else {
 1007|    672|      if (mapped != nullptr) *mapped = true;
  ------------------
  |  Branch (1007:11): [True: 0, False: 672]
  ------------------
 1008|       |
 1009|    672|      return ve->second;
 1010|    672|    }
 1011|  4.90k|  }
_ZNK6hobbes9substVarF4withEPKNS_3LetE:
 1013|    467|  ExprPtr with(const Let* v) const override {
 1014|    467|    return ExprPtr(new Let(v->var(), switchOf(v->varExpr(), *this), withoutNames(v->var(), v->bodyExpr()), v->la()));
 1015|    467|  }
_ZNK6hobbes9substVarF12withoutNamesERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_4ExprEE:
  998|    480|  ExprPtr withoutNames(const std::string& n,  const ExprPtr& e) const { return withoutNames(toSet(list(n)), e); }
_ZNK6hobbes9substVarF12withoutNamesERKSt3setINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4lessIS7_ESaIS7_EERKSt10shared_ptrINS_4ExprEE:
  996|    539|  ExprPtr withoutNames(const str::set&    ns, const ExprPtr& e) const { return switchOf(e, substVarF(drop(this->vm, ns), this->mapped)); }
_ZNK6hobbes9substVarF4withEPKNS_2FnE:
 1026|     59|  ExprPtr with(const Fn* v) const override {
 1027|     59|    return ExprPtr(new Fn(v->varNames(), withoutNames(v->varNames(), v->body()), v->la()));
 1028|     59|  }
_ZNK6hobbes9substVarF12withoutNamesERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS7_EERKSt10shared_ptrINS_4ExprEE:
  997|     59|  ExprPtr withoutNames(const str::seq&    ns, const ExprPtr& e) const { return withoutNames(toSet(ns), e); }
_ZNK6hobbes9substVarF4withEPKNS_3AppE:
 1030|  1.93k|  ExprPtr with(const App* v) const override {
 1031|  1.93k|    return ExprPtr(new App(switchOf(v->fn(), *this), switchOf(v->args(), *this), v->la()));
 1032|  1.93k|  }
_ZNK6hobbes9substVarF4withEPKNS_6AssignE:
 1034|    115|  ExprPtr with(const Assign* v) const override {
 1035|    115|    return ExprPtr(new Assign(switchOf(v->left(), *this), switchOf(v->right(), *this), v->la()));
 1036|    115|  }
_ZNK6hobbes9substVarF4withEPKNS_7MkArrayE:
 1038|     79|  ExprPtr with(const MkArray* v) const override {
 1039|     79|    return ExprPtr(new MkArray(switchOf(v->values(), *this), v->la()));
 1040|     79|  }
_ZNK6hobbes9substVarF4withEPKNS_9MkVariantE:
 1042|      9|  ExprPtr with(const MkVariant* v) const override {
 1043|      9|    return ExprPtr(new MkVariant(v->label(), switchOf(v->value(), *this), v->la()));
 1044|      9|  }
_ZNK6hobbes9substVarF4withEPKNS_8MkRecordE:
 1046|     69|  ExprPtr with(const MkRecord* v) const override {
 1047|     69|    return ExprPtr(new MkRecord(switchOf(v->fields(), *this), v->la()));
 1048|     69|  }
_ZNK6hobbes9substVarF4withEPKNS_6AIndexE:
 1050|    197|  ExprPtr with(const AIndex* v) const override {
 1051|    197|    return ExprPtr(new AIndex(switchOf(v->array(), *this), switchOf(v->index(), *this), v->la()));
 1052|    197|  }
_ZNK6hobbes9substVarF4withEPKNS_4CaseE:
 1054|      7|  ExprPtr with(const Case* v) const override {
 1055|      7|    const Case::Bindings& cbs = v->bindings();
 1056|      7|    Case::Bindings rcbs;
 1057|     13|    for (const auto &cb : cbs) {
  ------------------
  |  Branch (1057:25): [True: 13, False: 7]
  ------------------
 1058|     13|      rcbs.push_back(Case::Binding(cb.selector, cb.vname, withoutNames(cb.vname, cb.exp)));
 1059|     13|    }
 1060|      7|    ExprPtr de = v->defaultExpr();
 1061|      7|    if (de.get() != nullptr) {
  ------------------
  |  Branch (1061:9): [True: 1, False: 6]
  ------------------
 1062|      1|      de = switchOf(de, *this);
 1063|      1|    }
 1064|      7|    return ExprPtr(new Case(switchOf(v->variant(), *this), rcbs, de, v->la()));
 1065|      7|  }
_ZNK6hobbes9substVarF4withEPKNS_4ProjE:
 1079|    149|  ExprPtr with(const Proj* v) const override {
 1080|    149|    return ExprPtr(new Proj(switchOf(v->record(), *this), v->field(), v->la()));
 1081|    149|  }
_ZNK6hobbes9substVarF4withEPKNS_6AssumpE:
 1083|    134|  ExprPtr with(const Assump* v) const override {
 1084|    134|    return ExprPtr(new Assump(switchOf(v->expr(), *this), v->ty(), v->la()));
 1085|    134|  }
_ZNK6hobbes9substVarF9withConstEPKNS_4ExprE:
 1000|    621|  ExprPtr withConst(const Expr* v) const override { return ExprPtr(v->clone()); }
_ZN6hobbes8substTyFC2ERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEESt4lessIS7_ESaISt4pairIKS7_SA_EEE:
 1102|  1.02k|  substTyF(const MonoTypeSubst& s) : s(s) { }
_ZNK6hobbes8substTyF6withTyERKSt10shared_ptrINS_8QualTypeEE:
 1104|  29.5k|  QualTypePtr withTy(const QualTypePtr& qt) const override {
 1105|  29.5k|    if (qt) {
  ------------------
  |  Branch (1105:9): [True: 22.2k, False: 7.26k]
  ------------------
 1106|  22.2k|      return substitute(this->s, qt);
 1107|  22.2k|    } else {
 1108|  7.26k|      return qt;
 1109|  7.26k|    }
 1110|  29.5k|  }
_ZNK6hobbes8isConstP4withEPKNS_3VarE:
 1119|      8|  bool with     (const Var*)       const override { return false; }
_ZNK6hobbes8isConstP4withEPKNS_3AppE:
 1123|      4|  bool with     (const App*)       const override { return false; }
_ZNK6hobbes8isConstP4withEPKNS_8MkRecordE:
 1127|      8|  bool with     (const MkRecord*)  const override { return false; }
_ZNK6hobbes8isConstP9withConstEPKNS_4ExprE:
 1118|     20|  bool withConst(const Expr*)      const override { return true; }
_ZNK6hobbes9subExprsF4withEPKNS_3VarE:
 1144|  33.7k|  Exprs with(const Var*)       const override { return Exprs(); }
_ZNK6hobbes9subExprsF4withEPKNS_3LetE:
 1146|  3.07k|  Exprs with(const Let* v) const override { return list(v->varExpr(), v->bodyExpr()); }
_ZNK6hobbes9subExprsF4withEPKNS_6LetRecE:
 1148|      8|  Exprs with(const LetRec* v) const override {
 1149|      8|    Exprs r;
 1150|      8|    for (const auto& b : v->bindings()) {
  ------------------
  |  Branch (1150:24): [True: 8, False: 8]
  ------------------
 1151|      8|      r.push_back(b.second);
 1152|      8|    }
 1153|      8|    r.push_back(v->bodyExpr());
 1154|      8|    return r;
 1155|      8|  }
_ZNK6hobbes9subExprsF4withEPKNS_2FnE:
 1157|    470|  Exprs with(const Fn* v) const override { return list(v->body()); }
_ZNK6hobbes9subExprsF4withEPKNS_3AppE:
 1159|  13.7k|  Exprs with(const App* v) const override {
 1160|  13.7k|    Exprs r = list(v->fn());
 1161|  13.7k|    r.insert(r.end(), v->args().begin(), v->args().end());
 1162|  13.7k|    return r;
 1163|  13.7k|  }
_ZNK6hobbes9subExprsF4withEPKNS_6AssignE:
 1165|    620|  Exprs with(const Assign* v)    const override { return list(v->left(), v->right()); }
_ZNK6hobbes9subExprsF4withEPKNS_7MkArrayE:
 1166|    484|  Exprs with(const MkArray* v)   const override { return v->values(); }
_ZNK6hobbes9subExprsF4withEPKNS_9MkVariantE:
 1167|    104|  Exprs with(const MkVariant* v) const override { return list(v->value()); }
_ZNK6hobbes9subExprsF4withEPKNS_8MkRecordE:
 1169|    282|  Exprs with(const MkRecord* v) const override {
 1170|    282|    Exprs r;
 1171|    640|    for (const auto& f : v->fields()) {
  ------------------
  |  Branch (1171:24): [True: 640, False: 282]
  ------------------
 1172|    640|      r.push_back(f.second);
 1173|    640|    }
 1174|    282|    return r;
 1175|    282|  }
_ZNK6hobbes9subExprsF4withEPKNS_6AIndexE:
 1177|  1.05k|  Exprs with(const AIndex* v) const override { return list(v->array(), v->index()); }
_ZNK6hobbes9subExprsF4withEPKNS_4CaseE:
 1179|    294|  Exprs with(const Case* v) const override {
 1180|    294|    Exprs r = list(v->variant());
 1181|    450|    for (const auto& b : v->bindings()) {
  ------------------
  |  Branch (1181:24): [True: 450, False: 294]
  ------------------
 1182|    450|      r.push_back(b.exp);
 1183|    450|    }
 1184|    294|    if (v->defaultExpr()) {
  ------------------
  |  Branch (1184:9): [True: 154, False: 140]
  ------------------
 1185|    154|      r.push_back(v->defaultExpr());
 1186|    154|    }
 1187|    294|    return r;
 1188|    294|  }
_ZNK6hobbes9subExprsF4withEPKNS_6SwitchE:
 1191|     14|  Exprs with(const Switch* v) const override {
 1192|     14|    Exprs r = list(v->expr());
 1193|     28|    for (const auto& b : v->bindings()) {
  ------------------
  |  Branch (1193:24): [True: 28, False: 14]
  ------------------
 1194|     28|      r.push_back(b.exp);
 1195|     28|    }
 1196|     14|    if (v->defaultExpr()) {
  ------------------
  |  Branch (1196:9): [True: 14, False: 0]
  ------------------
 1197|     14|      r.push_back(v->defaultExpr());
 1198|     14|    }
 1199|     14|    return r;
 1200|     14|  }
_ZNK6hobbes9subExprsF4withEPKNS_4ProjE:
 1202|  1.29k|  Exprs with(const Proj* v)   const override { return list(v->record()); }
_ZNK6hobbes9subExprsF4withEPKNS_6AssumpE:
 1203|  1.53k|  Exprs with(const Assump* v) const override { return list(v->expr()); }
_ZNK6hobbes9subExprsF4withEPKNS_6UnpackE:
 1205|      4|  Exprs with(const Unpack* v) const override { return list(v->package(), v->expr()); }
_ZNK6hobbes9subExprsF9withConstEPKNS_4ExprE:
 1143|  4.80k|  Exprs withConst(const Expr*) const override { return Exprs(); }
_ZNK6hobbes8freeVarF4withB5cxx11EPKNS_3VarE:
 1564|  7.64k|  VarSet with     (const Var* v)       const override { return toSet(list(v->value())); }
_ZNK6hobbes8freeVarF4withB5cxx11EPKNS_3LetE:
 1565|    792|  VarSet with     (const Let* v)       const override { return setUnion(list(freeVars(v->varExpr()), setDifference(freeVars(v->bodyExpr()), toSet(list(v->var()))))); }
_ZNK6hobbes8freeVarF4withB5cxx11EPKNS_6LetRecE:
 1578|      4|  VarSet with(const LetRec* v) const override {
 1579|      4|    std::vector<VarSet> fvs;
 1580|      4|    str::set            vns = toSet(v->varNames());
 1581|       |
 1582|      4|    for (const auto& b : v->bindings()) {
  ------------------
  |  Branch (1582:24): [True: 4, False: 4]
  ------------------
 1583|      4|      fvs.push_back(setDifference(freeVars(b.second), vns));
 1584|      4|    }
 1585|      4|    fvs.push_back(setDifference(freeVars(v->bodyExpr()), vns));
 1586|       |
 1587|      4|    return setUnion(fvs);
 1588|      4|  }
_ZNK6hobbes8freeVarF4withB5cxx11EPKNS_2FnE:
 1566|     70|  VarSet with     (const Fn* v)        const override { return setDifference(freeVars(v->body()), toSet(v->varNames())); }
_ZNK6hobbes8freeVarF4withB5cxx11EPKNS_3AppE:
 1567|  3.12k|  VarSet with     (const App* v)       const override { return setUnion(cons(freeVars(v->fn()), switchOf(v->args(), *this))); }
_ZNK6hobbes8freeVarF4withB5cxx11EPKNS_6AssignE:
 1568|    110|  VarSet with     (const Assign* v)    const override { return setUnion(list(freeVars(v->left()), freeVars(v->right()))); }
_ZNK6hobbes8freeVarF4withB5cxx11EPKNS_7MkArrayE:
 1569|     76|  VarSet with     (const MkArray* v)   const override { return setUnion(switchOf(v->values(), *this)); }
_ZNK6hobbes8freeVarF4withB5cxx11EPKNS_9MkVariantE:
 1570|     86|  VarSet with     (const MkVariant* v) const override { return freeVars(v->value()); }
_ZNK6hobbes8freeVarF4withB5cxx11EPKNS_8MkRecordE:
 1571|    129|  VarSet with     (const MkRecord* v)  const override { return setUnion(switchOf(exprs(v->fields()), *this)); }
_ZNK6hobbes8freeVarF4withB5cxx11EPKNS_6AIndexE:
 1572|    263|  VarSet with     (const AIndex* v)    const override { return setUnion(list(freeVars(v->array()), freeVars(v->index()))); }
_ZNK6hobbes8freeVarF4withB5cxx11EPKNS_4CaseE:
 1590|     54|  VarSet with(const Case* v) const override {
 1591|     54|    std::vector<VarSet> fvs;
 1592|     54|    fvs.push_back(freeVars(v->variant()));
 1593|     78|    for (const auto &b : v->bindings()) {
  ------------------
  |  Branch (1593:24): [True: 78, False: 54]
  ------------------
 1594|     78|      fvs.push_back(setDifference(freeVars(b.exp), toSet(list(b.vname))));
 1595|     78|    }
 1596|     54|    if (v->defaultExpr().get() != nullptr) {
  ------------------
  |  Branch (1596:9): [True: 30, False: 24]
  ------------------
 1597|     30|      fvs.push_back(freeVars(v->defaultExpr()));
 1598|     30|    }
 1599|     54|    return setUnion(fvs);
 1600|     54|  }
_ZNK6hobbes8freeVarF4withB5cxx11EPKNS_6SwitchE:
 1602|      8|  VarSet with(const Switch* v) const override {
 1603|      8|    std::vector<VarSet> fvs;
 1604|      8|    fvs.push_back(freeVars(v->expr()));
 1605|     21|    for (const auto& sb : v->bindings()) {
  ------------------
  |  Branch (1605:25): [True: 21, False: 8]
  ------------------
 1606|     21|      fvs.push_back(freeVars(sb.exp));
 1607|     21|    }
 1608|      8|    if (v->defaultExpr()) {
  ------------------
  |  Branch (1608:9): [True: 8, False: 0]
  ------------------
 1609|      8|      fvs.push_back(freeVars(v->defaultExpr()));
 1610|      8|    }
 1611|      8|    return setUnion(fvs);
 1612|      8|  }
_ZNK6hobbes8freeVarF4withB5cxx11EPKNS_4ProjE:
 1573|    300|  VarSet with     (const Proj* v)      const override { return freeVars(v->record()); }
_ZNK6hobbes8freeVarF4withB5cxx11EPKNS_6AssumpE:
 1574|    754|  VarSet with     (const Assump* v)    const override { return freeVars(v->expr()); }
_ZNK6hobbes8freeVarF4withB5cxx11EPKNS_4PackE:
 1575|     28|  VarSet with     (const Pack* v)      const override { return freeVars(v->expr()); }
_ZNK6hobbes8freeVarF4withB5cxx11EPKNS_6UnpackE:
 1576|      6|  VarSet with     (const Unpack* v)    const override { return setUnion(list(freeVars(v->package()), setDifference(freeVars(v->expr()), toSet(list(v->varName()))))); }
_ZNK6hobbes8freeVarF9withConstB5cxx11EPKNS_4ExprE:
 1563|  1.05k|  VarSet withConst(const Expr*)        const override { return VarSet(); }

_ZN6hobbes11macroExpandERKSt10shared_ptrINS_4ExprEE:
  116|    810|ExprPtr macroExpand(const ExprPtr& e) {
  117|    810|  return switchOf(e, macroExpandF());
  118|    810|}
_ZN6hobbes20initMacroEnvironmentERKSt10shared_ptrINS_4TEnvEE:
  120|      1|void initMacroEnvironment(const TEnvPtr& tenv) {
  121|      1|  tenv->bind("and", prim<bool(bool,bool)>());
  122|      1|  tenv->bind("or",  prim<bool(bool,bool)>());
  123|      1|}
_ZNK6hobbes12macroExpandF4withEPKNS_3VarE:
   42|  7.74k|  ExprPtr with(const Var* v) const override {
   43|  7.74k|    if (v->value() == "and") {
  ------------------
  |  Branch (43:9): [True: 0, False: 7.74k]
  ------------------
   44|      0|      return macroEtaLiftAnd(v->la());
   45|  7.74k|    } else if (v->value() == "or") {
  ------------------
  |  Branch (45:16): [True: 0, False: 7.74k]
  ------------------
   46|      0|      return macroEtaLiftOr(v->la());
   47|  7.74k|    } else {
   48|  7.74k|      return mk(v, v->clone());
   49|  7.74k|    }
   50|  7.74k|  }
_ZN6hobbes12macroExpandF2mkERKSt10shared_ptrINS_8QualTypeEEPNS_4ExprE:
   10|  19.5k|  static ExprPtr mk(const QualTypePtr& qty, Expr* out) {
   11|  19.5k|    out->type(qty);
   12|  19.5k|    return ExprPtr(out);
   13|  19.5k|  }
_ZN6hobbes12macroExpandF14macroExpandAndERKSt6vectorISt10shared_ptrINS_4ExprEESaIS4_EERKNS_17LexicalAnnotationE:
   88|     17|  static ExprPtr macroExpandAnd(const Exprs& es, const LexicalAnnotation& la) {
   89|     17|    MonoTypePtr tbool = MonoTypePtr(Prim::make("bool"));
   90|     17|    QualTypePtr tbfn  = qualtype(Func::make(tuplety(list(tbool, tbool, tbool)), tbool));
   91|     17|    return mk(tbool, new App(mk(tbfn, new Var("if", la)), list(es[0], es[1], mk(tbool, new Bool(false, la))), la));
   92|     17|  }
_ZN6hobbes12macroExpandF2mkERKSt10shared_ptrINS_8MonoTypeEEPNS_4ExprE:
   14|     52|  static ExprPtr mk(const MonoTypePtr& mty, Expr* out) {
   15|     52|    return mk(qualtype(mty), out);
   16|     52|  }
_ZN6hobbes12macroExpandF13macroExpandOrERKSt6vectorISt10shared_ptrINS_4ExprEESaIS4_EERKNS_17LexicalAnnotationE:
  102|      9|  static ExprPtr macroExpandOr(const Exprs& es, const LexicalAnnotation& la) {
  103|      9|    MonoTypePtr tbool = MonoTypePtr(Prim::make("bool"));
  104|      9|    QualTypePtr tbfn  = qualtype(Func::make(tuplety(list(tbool, tbool, tbool)), tbool));
  105|      9|    return mk(tbool, new App(mk(tbfn, new Var("if", la)), list(es[0], mk(tbool, new Bool(true, la)), es[1]), la));
  106|      9|  }
_ZN6hobbes12macroExpandF2mkEPKNS_4ExprEPS1_:
   17|  19.4k|  static ExprPtr mk(const Expr* src, Expr* out) {
   18|  19.4k|    return mk(src->type(), out);
   19|  19.4k|  }
_ZNK6hobbes12macroExpandF4withEPKNS_3LetE:
   52|    659|  ExprPtr with(const Let* v) const override {
   53|    659|    return mk(v, new Let(v->var(), switchOf(v->varExpr(), *this), switchOf(v->bodyExpr(), *this), v->la()));
   54|    659|  }
_ZNK6hobbes12macroExpandF4withEPKNS_6LetRecE:
   56|      4|  ExprPtr with(const LetRec* v) const override {
   57|      4|    LetRec::Bindings bs;
   58|      4|    for (const auto& b : v->bindings()) {
  ------------------
  |  Branch (58:24): [True: 4, False: 4]
  ------------------
   59|      4|      bs.push_back(LetRec::Binding(b.first, switchOf(b.second, *this)));
   60|      4|    }
   61|      4|    return mk(v, new LetRec(bs, switchOf(v->bodyExpr(), *this), v->la()));
   62|      4|  }
_ZNK6hobbes12macroExpandF4withEPKNS_2FnE:
   22|    587|  ExprPtr with(const Fn* v)         const override { return mk(v, new Fn(v->varNames(), switchOf(v->body(), *this), v->la())); }
_ZNK6hobbes12macroExpandF4withEPKNS_3AppE:
   64|  3.29k|  ExprPtr with(const App* v) const override {
   65|  3.29k|    Var* fn = is<Var>(v->fn());
   66|  3.29k|    if ((fn != nullptr) && fn->value() == "and") {
  ------------------
  |  Branch (66:9): [True: 1.81k, False: 1.48k]
  |  Branch (66:28): [True: 17, False: 1.79k]
  ------------------
   67|     17|      return macroExpandAnd(switchOf(v->args(), *this), v->la());
   68|  3.27k|    } else if ((fn != nullptr) && fn->value() == "or") {
  ------------------
  |  Branch (68:16): [True: 1.79k, False: 1.48k]
  |  Branch (68:35): [True: 9, False: 1.78k]
  ------------------
   69|      9|      return macroExpandOr(switchOf(v->args(), *this), v->la());
   70|  3.26k|    } else {
   71|  3.26k|      return mk(v, new App(switchOf(v->fn(), *this), switchOf(v->args(), *this), v->la()));
   72|  3.26k|    }
   73|  3.29k|  }
_ZNK6hobbes12macroExpandF4withEPKNS_6AssignE:
   75|    109|  ExprPtr with(const Assign* v) const override {
   76|    109|    return mk(v, new Assign(switchOf(v->left(), *this), switchOf(v->right(), *this), v->la()));
   77|    109|  }
_ZNK6hobbes12macroExpandF4withEPKNS_7MkArrayE:
   23|     67|  ExprPtr with(const MkArray* v)    const override { return mk(v, new MkArray(switchOf(v->values(), *this), v->la())); }
_ZNK6hobbes12macroExpandF4withEPKNS_9MkVariantE:
   24|     98|  ExprPtr with(const MkVariant* v)  const override { return mk(v, new MkVariant(v->label(), switchOf(v->value(), *this), v->la())); }
_ZNK6hobbes12macroExpandF4withEPKNS_8MkRecordE:
   25|     99|  ExprPtr with(const MkRecord* v)   const override { return mk(v, new MkRecord(switchOf(v->fields(), *this), v->la())); }
_ZNK6hobbes12macroExpandF4withEPKNS_6AIndexE:
   26|    245|  ExprPtr with(const AIndex* v)     const override { return mk(v, new AIndex(switchOf(v->array(), *this), switchOf(v->index(), *this), v->la())); }
_ZNK6hobbes12macroExpandF4withEPKNS_4CaseE:
   30|     53|  ExprPtr with(const Case* v) const override {
   31|     53|    ExprPtr de = v->defaultExpr();
   32|     53|    if (de.get() != nullptr) { de = switchOf(de, *this); }
  ------------------
  |  Branch (32:9): [True: 29, False: 24]
  ------------------
   33|     53|    return mk(v, new Case(switchOf(v->variant(), *this), switchOf(v->bindings(), *this), de, v->la()));
   34|     53|  }
_ZNK6hobbes12macroExpandF4withEPKNS_6SwitchE:
   36|      8|  ExprPtr with(const Switch* v) const override {
   37|      8|    ExprPtr de = v->defaultExpr();
   38|      8|    if (de) { de = switchOf(de, *this); }
  ------------------
  |  Branch (38:9): [True: 8, False: 0]
  ------------------
   39|      8|    return mk(v, new Switch(switchOf(v->expr(), *this), switchOf(v->bindings(), *this), de, v->la()));
   40|      8|  }
_ZNK6hobbes12macroExpandF4withEPKNS_4ProjE:
   27|    261|  ExprPtr with(const Proj* v)       const override { return mk(v, new Proj(switchOf(v->record(), *this), v->field(), v->la())); }
_ZNK6hobbes12macroExpandF4withEPKNS_6AssumpE:
   28|  5.01k|  ExprPtr with(const Assump* v)     const override { return mk(v, new Assump(switchOf(v->expr(), *this), v->ty(), v->la())); }
_ZNK6hobbes12macroExpandF4withEPKNS_4PackE:
   79|     23|  ExprPtr with(const Pack* v) const override {
   80|     23|    return mk(v, new Pack(switchOf(v->expr(), *this), v->la()));
   81|     23|  }
_ZNK6hobbes12macroExpandF4withEPKNS_6UnpackE:
   83|      6|  ExprPtr with(const Unpack* v) const override {
   84|      6|    return mk(v, new Unpack(v->varName(), switchOf(v->package(), *this), switchOf(v->expr(), *this), v->la()));
   85|      6|  }
_ZNK6hobbes12macroExpandF9withConstEPKNS_4ExprE:
   21|  1.22k|  ExprPtr withConst(const Expr* v)  const override { return mk(v, v->clone()); }

_ZN6hobbes6ModuleC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt6vectorISt10shared_ptrINS_9ModuleDefEESaISC_EE:
   11|     27|Module::Module(const std::string& mname, const ModuleDefs& defs) : mname(mname), defs(defs) { }
_ZNK6hobbes6Module11definitionsEv:
   13|    135|const ModuleDefs&  Module::definitions() const { return this->defs; }
_ZNK6hobbes6Module7optionsB5cxx11Ev:
   35|  1.10k|const std::vector<std::string>& Module::options() const {
   36|  1.10k|  return this->opts;
   37|  1.10k|}
_ZN6hobbes6Module10setOptionsERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS7_EE:
   39|     54|void Module::setOptions(const std::vector<std::string>& os) {
   40|     54|  this->opts = os;
   41|     54|}
_ZN6hobbes9ModuleDefC2EiRKNS_17LexicalAnnotationE:
   44|  4.52k|ModuleDef::ModuleDef(int cid, const LexicalAnnotation& la) : LexicallyAnnotated(la), cid(cid) { }
_ZNK6hobbes9ModuleDef7case_idEv:
   45|  14.3k|int ModuleDef::case_id() const { return this->cid; }
_ZN6hobbes9ModuleDefD2Ev:
   46|  4.52k|ModuleDef::~ModuleDef() = default;
_ZN6hobbes8MTypeDefC2ENS0_10VisibilityERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt6vectorIS7_SaIS7_EERKSt10shared_ptrINS_8QualTypeEERKNS_17LexicalAnnotationE:
   55|     26|MTypeDef::MTypeDef(Visibility v, const std::string& tname, const str::seq& targs, const QualTypePtr& t, const LexicalAnnotation& la) : Base(la), v(v), tname(tname), targs(targs), t(t) { }
_ZNK6hobbes8MTypeDef10visibilityEv:
   57|     26|MTypeDef::Visibility MTypeDef::visibility() const { return this->v; }
_ZNK6hobbes8MTypeDef4nameB5cxx11Ev:
   58|     26|const std::string&   MTypeDef::name()       const { return this->tname; }
_ZNK6hobbes8MTypeDef9argumentsB5cxx11Ev:
   59|     26|const str::seq&      MTypeDef::arguments()  const { return this->targs; }
_ZNK6hobbes8MTypeDef4typeEv:
   60|     26|const QualTypePtr&   MTypeDef::type()       const { return this->t;     }
_ZN6hobbes11MVarTypeDefC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_8QualTypeEERKNS_17LexicalAnnotationE:
   71|    710|MVarTypeDef::MVarTypeDef(const std::string& vname, const QualTypePtr& qty, const LexicalAnnotation& la) : Base(la), vname(vname), qty(qty) { }
_ZNK6hobbes11MVarTypeDef7varNameB5cxx11Ev:
   72|    805|const std::string& MVarTypeDef::varName() const { return this->vname; }
_ZNK6hobbes11MVarTypeDef7varTypeEv:
   73|    710|const QualTypePtr& MVarTypeDef::varType() const { return this->qty; }
_ZN6hobbes10nameBlanksERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS6_EE:
   80|  2.04k|str::seq nameBlanks(const str::seq& xs) {
   81|  2.04k|  str::seq r;
   82|  5.55k|  for (const auto& x : xs) {
  ------------------
  |  Branch (82:22): [True: 5.55k, False: 2.04k]
  ------------------
   83|  5.55k|    if (x == "_") {
  ------------------
  |  Branch (83:9): [True: 0, False: 5.55k]
  ------------------
   84|      0|      r.push_back(freshName());
   85|  5.55k|    } else {
   86|  5.55k|      r.push_back(x);
   87|  5.55k|    }
   88|  5.55k|  }
   89|  2.04k|  return r;
   90|  2.04k|}
_ZN6hobbes7MVarDefC2ERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS7_EERKSt10shared_ptrINS_4ExprEERKNS_17LexicalAnnotationE:
   92|  2.04k|MVarDef::MVarDef(const str::seq& vargl, const ExprPtr& e, const LexicalAnnotation& la) : Base(la), vargl(nameBlanks(vargl)), expr(e) { }
_ZNK6hobbes7MVarDef11varWithArgsB5cxx11Ev:
   93|  6.13k|const str::seq& MVarDef::varWithArgs() const { return this->vargl; }
_ZNK6hobbes7MVarDef7varExprEv:
   94|  3.34k|const ExprPtr&  MVarDef::varExpr() const { return this->expr; }
_ZNK6hobbes7MVarDef4showERSo:
   96|    174|void MVarDef::show(std::ostream& out) const {
   97|    174|  out << str::cdelim(this->vargl, " ") << " = " << hobbes::show(this->expr);
   98|    174|}
_ZN6hobbes8ClassDefC2ERKSt6vectorISt10shared_ptrINS_10ConstraintEESaIS4_EERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS1_ISE_SaISE_EERKS1_ISt4pairISI_SI_ESaISM_EERKS1_IS2_INS_11MVarTypeDefEESaISS_EERKNS_17LexicalAnnotationE:
  102|    194|  Base(la), cs(cs), cname(cname), tvars(tvars), fdeps(fdeps), mvtydefs(mvtydefs)
  103|    194|{}
_ZNK6hobbes8ClassDef11constraintsEv:
  105|    194|const Constraints&  ClassDef::constraints() const { return this->cs; }
_ZNK6hobbes8ClassDef4nameB5cxx11Ev:
  106|    291|const std::string&  ClassDef::name() const { return this->cname; }
_ZNK6hobbes8ClassDef4varsB5cxx11Ev:
  107|    194|const str::seq&     ClassDef::vars() const { return this->tvars; }
_ZNK6hobbes8ClassDef7fundepsB5cxx11Ev:
  108|    194|CFunDepDefs         ClassDef::fundeps() const { return this->fdeps; }
_ZNK6hobbes8ClassDef7membersEv:
  109|    194|const MVarTypeDefs& ClassDef::members() const { return this->mvtydefs; }
_ZN6hobbes11InstanceDefC2ERKSt6vectorISt10shared_ptrINS_10ConstraintEESaIS4_EERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS1_IS2_INS_8MonoTypeEESaISI_EERKS1_IS2_INS_7MVarDefEESaISO_EERKNS_17LexicalAnnotationE:
  127|  1.24k|  Base(la), cs(cs), cname(cname), targs(targs), mdefs(mdefs)
  128|  1.24k|{}
_ZNK6hobbes11InstanceDef11constraintsEv:
  130|  1.62k|const Constraints& InstanceDef::constraints() const { return this->cs; }
_ZNK6hobbes11InstanceDef9classNameB5cxx11Ev:
  131|  1.86k|const std::string& InstanceDef::className()   const { return this->cname; }
_ZNK6hobbes11InstanceDef4argsEv:
  132|  1.86k|const MonoTypes&   InstanceDef::args()        const { return this->targs; }
_ZNK6hobbes11InstanceDef7membersEv:
  133|  1.86k|const MVarDefs&    InstanceDef::members()     const { return this->mdefs; }
_ZNK6hobbes14switchMDefTyFn4withEPKNS_8MTypeDefE:
  213|     13|ModuleDefPtr switchMDefTyFn::with(const MTypeDef*    x) const { return ModuleDefPtr(new MTypeDef(x->visibility(), x->name(), x->arguments(), withTy(x->type()), x->la())); }
_ZNK6hobbes14switchMDefTyFn4withEPKNS_11MVarTypeDefE:
  214|    260|ModuleDefPtr switchMDefTyFn::with(const MVarTypeDef* x) const { return ModuleDefPtr(new MVarTypeDef(x->varName(), withTy(x->varType()), x->la())); }
_ZNK6hobbes14switchMDefTyFn4withEPKNS_16MUnsafePragmaDefE:
  215|     93|ModuleDefPtr switchMDefTyFn::with(const MUnsafePragmaDef* x)  const { return ModuleDefPtr(new MUnsafePragmaDef(x->symbolValue(), x->la())); }  
_ZNK6hobbes14switchMDefTyFn4withEPKNS_14MSafePragmaDefE:
  216|     57|ModuleDefPtr switchMDefTyFn::with(const MSafePragmaDef* x) const { return ModuleDefPtr(new MSafePragmaDef(x->symbolValue(), x->la()));; }
_ZNK6hobbes14switchMDefTyFn4withEPKNS_7MVarDefE:
  223|    277|ModuleDefPtr switchMDefTyFn::with(const MVarDef* x) const {
  224|    277|  return ModuleDefPtr(new MVarDef(x->varWithArgs(), switchOf(x->varExpr(), appMTySwitchF(this)), x->la()));
  225|    277|}
_ZN6hobbes9appMTyTysEPKNS_14switchMDefTyFnERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS6_EE:
  227|  1.22k|MonoTypes appMTyTys(const switchMDefTyFn* f, const MonoTypes& ts) {
  228|  1.22k|  MonoTypes r;
  229|  3.16k|  for (const auto& t : ts) {
  ------------------
  |  Branch (229:22): [True: 3.16k, False: 1.22k]
  ------------------
  230|  3.16k|    r.push_back(f->withTy(qualtype(t))->monoType());
  231|  3.16k|  }
  232|  1.22k|  return r;
  233|  1.22k|}
_ZN6hobbes8appMTyCSEPKNS_14switchMDefTyFnERKSt6vectorISt10shared_ptrINS_10ConstraintEESaIS6_EE:
  234|    718|Constraints appMTyCS(const switchMDefTyFn* f, const Constraints& cs) {
  235|    718|  Constraints r;
  236|    718|  for (const auto& c : cs) {
  ------------------
  |  Branch (236:22): [True: 600, False: 718]
  ------------------
  237|    600|    r.push_back(std::make_shared<Constraint>(c->name(), appMTyTys(f, c->arguments())));
  238|    600|  }
  239|    718|  return r;
  240|    718|}
_ZN6hobbes11appMTyMVTDsEPKNS_14switchMDefTyFnERKSt6vectorISt10shared_ptrINS_11MVarTypeDefEESaIS6_EE:
  241|     97|MVarTypeDefs appMTyMVTDs(const switchMDefTyFn* f, const MVarTypeDefs& tds) {
  242|     97|  MVarTypeDefs r;
  243|     97|  for (const auto& td : tds) {
  ------------------
  |  Branch (243:23): [True: 95, False: 97]
  ------------------
  244|     95|    r.push_back(std::make_shared<MVarTypeDef>(td->varName(), f->withTy(td->varType()), td->la()));
  245|     95|  }
  246|     97|  return r;
  247|     97|}
_ZNK6hobbes14switchMDefTyFn4withEPKNS_8ClassDefE:
  248|     97|ModuleDefPtr switchMDefTyFn::with(const ClassDef* x) const {
  249|     97|  return ModuleDefPtr(new ClassDef(appMTyCS(this, x->constraints()), x->name(), x->vars(), x->fundeps(), appMTyMVTDs(this, x->members()), x->la()));
  250|     97|}
_ZN6hobbes10appMTyMVDsEPKNS_14switchMDefTyFnERKSt6vectorISt10shared_ptrINS_7MVarDefEESaIS6_EE:
  252|    621|MVarDefs appMTyMVDs(const switchMDefTyFn* f, const MVarDefs& vds) {
  253|    621|  MVarDefs r;
  254|    747|  for (const auto& vd : vds) {
  ------------------
  |  Branch (254:23): [True: 747, False: 621]
  ------------------
  255|    747|    r.push_back(std::make_shared<MVarDef>(vd->varWithArgs(), switchOf(vd->varExpr(), appMTySwitchF(f)), vd->la()));
  256|    747|  }
  257|    621|  return r;
  258|    621|}
_ZNK6hobbes14switchMDefTyFn4withEPKNS_11InstanceDefE:
  259|    621|ModuleDefPtr switchMDefTyFn::with(const InstanceDef* x) const {
  260|    621|  return ModuleDefPtr(new InstanceDef(appMTyCS(this, x->constraints()), x->className(), appMTyTys(this, x->args()), appMTyMVDs(this, x->members()), x->la()));
  261|    621|}
_ZN6hobbes13appMTySwitchFC2EPKNS_14switchMDefTyFnE:
  220|  1.02k|  appMTySwitchF(const switchMDefTyFn* f) : f(f) { }
_ZNK6hobbes13appMTySwitchF6withTyERKSt10shared_ptrINS_8QualTypeEE:
  221|  15.9k|  QualTypePtr withTy(const QualTypePtr& t) const override { if (t) return this->f->withTy(t); else return t; }
  ------------------
  |  Branch (221:65): [True: 662, False: 15.2k]
  ------------------

_ZN6hobbes6MStateC2Ei:
   20|  1.66k|MState::MState(int cid) : refs(0), isPrimMatchRoot(false), cid(cid) { }
_ZNK6hobbes6MState7case_idEv:
   21|  1.89k|int MState::case_id() const { return this->cid; }
_ZN6hobbes8LoadVarsC2ERKSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_4ExprEEESaISC_EEm:
   23|     63|LoadVars::LoadVars(const Defs& ds, stateidx_t next) : ds(ds), next(next) { }
_ZNK6hobbes8LoadVars4defsB5cxx11Ev:
   24|     63|const LoadVars::Defs& LoadVars::defs() const { return this->ds; }
_ZNK6hobbes8LoadVars9nextStateEv:
   25|     63|stateidx_t LoadVars::nextState() const { return this->next; }
_ZN6hobbes8LoadVars5stampB5cxx11Ev:
   27|    126|std::string LoadVars::stamp() {
   28|    126|  std::ostringstream ss;
   29|    126|  ss << "l";
   30|    222|  for (const auto& d : this->ds) {
  ------------------
  |  Branch (30:22): [True: 222, False: 126]
  ------------------
   31|    222|    ss << "." << d.first << "=" << reinterpret_cast<void*>(d.second.get()); // assumes that we deliberately share equivalent expressions
   32|    222|  }
   33|    126|  ss << "." << this->next;
   34|    126|  return ss.str();
   35|    126|}
_ZN6hobbes9SwitchValC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt6vectorISt4pairISt10shared_ptrINS_9PrimitiveEEmESaISE_EEm:
   37|     19|SwitchVal::SwitchVal(const std::string& var, const Jumps& jmps, stateidx_t def) : var(var), jmps(jmps), def(def) { }
_ZNK6hobbes9SwitchVal9switchVarB5cxx11Ev:
   38|     19|const std::string& SwitchVal::switchVar() const { return this->var; }
_ZNK6hobbes9SwitchVal5jumpsEv:
   39|     50|const SwitchVal::Jumps& SwitchVal::jumps() const { return this->jmps; }
_ZNK6hobbes9SwitchVal12defaultStateEv:
   40|     26|stateidx_t SwitchVal::defaultState() const { return this->def; }
_ZN6hobbes9SwitchVal5stampB5cxx11Ev:
   42|     38|std::string SwitchVal::stamp() {
   43|     38|  std::ostringstream ss;
   44|     38|  ss << "s." << this->var;
   45|     52|  for (const auto& j : this->jmps) {
  ------------------
  |  Branch (45:22): [True: 52, False: 38]
  ------------------
   46|     52|    ss << ".";
   47|     52|    j.first->show(ss);
   48|     52|    ss << ":" << j.second;
   49|     52|  }
   50|     38|  ss << "." << this->def;
   51|     38|  return ss.str();
   52|     38|}
_ZN6hobbes13SwitchVariantC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt6vectorISt4pairIS6_mESaISB_EEm:
   54|     76|SwitchVariant::SwitchVariant(const std::string& var, const CtorJumps& jmps, stateidx_t def) : var(var), jmps(jmps), def(def) { }
_ZNK6hobbes13SwitchVariant9switchVarB5cxx11Ev:
   55|    160|const std::string& SwitchVariant::switchVar() const { return this->var; }
_ZNK6hobbes13SwitchVariant5jumpsB5cxx11Ev:
   56|     76|const SwitchVariant::CtorJumps& SwitchVariant::jumps() const { return this->jmps; }
_ZNK6hobbes13SwitchVariant12defaultStateEv:
   57|    152|stateidx_t SwitchVariant::defaultState() const { return this->def; }
_ZN6hobbes13SwitchVariant5stampB5cxx11Ev:
   59|    152|std::string SwitchVariant::stamp() {
   60|    152|  std::ostringstream ss;
   61|    152|  ss << "c." << this->var;
   62|    168|  for (const auto& j : this->jmps) {
  ------------------
  |  Branch (62:22): [True: 168, False: 152]
  ------------------
   63|    168|    ss << "." << j.first << "=" << j.second;
   64|    168|  }
   65|    152|  ss << "." << this->def;
   66|    152|  return ss.str();
   67|    152|}
_ZN6hobbes10FinishExprC2ERKSt10shared_ptrINS_4ExprEE:
   69|  1.51k|FinishExpr::FinishExpr(const ExprPtr& exp) : exp(exp) { }
_ZNK6hobbes10FinishExpr4exprEv:
   70|    831|const ExprPtr& FinishExpr::expr() const { return this->exp; }
_ZN6hobbes10FinishExpr5stampB5cxx11Ev:
   72|  2.26k|std::string FinishExpr::stamp() {
   73|  2.26k|  std::ostringstream ss;
   74|  2.26k|  ss << "e." << reinterpret_cast<void*>(this->exp.get());
   75|  2.26k|  return ss.str();
   76|  2.26k|}
_ZN6hobbes10actAndThenERKSt10shared_ptrINS_4ExprEEm:
   79|      6|MStatePtr actAndThen(const ExprPtr& e, stateidx_t s) {
   80|      6|  LoadVars::Defs ds;
   81|      6|  ds.push_back(LoadVars::Def(freshName(), e));
   82|      6|  return MStatePtr(new LoadVars(ds, s));
   83|      6|}
_ZN6hobbes10makeSwitchEPKNS_4MDFAERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt6vectorISt4pairISt10shared_ptrINS_9PrimitiveEEmESaISG_EEm:
   86|     19|MStatePtr makeSwitch(const MDFA* dfa, const std::string& switchVar, const SwitchVal::Jumps& jmps, stateidx_t defState) {
   87|     19|  if (defState != nullState) {
  ------------------
  |  Branch (87:7): [True: 13, False: 6]
  ------------------
   88|       |    // if we've only got a default switch and no cases, just use the default case
   89|       |    // otherwise if this would be a 'switch' on unit, don't bother (just pass the type equality through)
   90|       |    //  -- only the first option can match for unit (or default if there's only a default)
   91|     13|    if (jmps.empty()) {
  ------------------
  |  Branch (91:9): [True: 0, False: 13]
  ------------------
   92|      0|      return dfa->states[defState];
   93|     13|    } else if (isUnit(jmps[0].first->primType())) {
  ------------------
  |  Branch (93:16): [True: 0, False: 13]
  ------------------
   94|      0|      if (dfa->inPrimSel) {
  ------------------
  |  Branch (94:11): [True: 0, False: 0]
  ------------------
   95|      0|        return dfa->states[jmps[0].second];
   96|      0|      }
   97|      0|      return actAndThen(assume(var(switchVar, dfa->rootLA), primty("unit"), dfa->rootLA), jmps[0].second);
   98|     13|    } else {
   99|     13|      return MStatePtr(new SwitchVal(switchVar, jmps, defState));
  100|     13|    }
  101|     13|  } else {
  102|      6|    if (!jmps.empty()) {
  ------------------
  |  Branch (102:9): [True: 6, False: 0]
  ------------------
  103|      6|      MonoTypePtr sty = jmps[0].first->primType();
  104|       |
  105|      6|      if (const Prim* pty = is<Prim>(sty)) {
  ------------------
  |  Branch (105:23): [True: 6, False: 0]
  ------------------
  106|      6|        if (pty->name() == "bool" && jmps.size() == 2) {
  ------------------
  |  Branch (106:13): [True: 0, False: 6]
  |  Branch (106:38): [True: 0, False: 0]
  ------------------
  107|      0|          return MStatePtr(new SwitchVal(switchVar, list(jmps[0]), jmps[1].second));
  108|      6|        } else if ((pty->name() == "char" || pty->name() == "byte") && jmps.size() == 256) {
  ------------------
  |  Branch (108:21): [True: 0, False: 6]
  |  Branch (108:46): [True: 0, False: 6]
  |  Branch (108:72): [True: 0, False: 0]
  ------------------
  109|      0|          return MStatePtr(new SwitchVal(switchVar, SwitchVal::Jumps(jmps.begin(), jmps.end() - 1), jmps[jmps.size() - 1].second));
  110|      6|        } else if (pty->name() == "unit") {
  ------------------
  |  Branch (110:20): [True: 6, False: 0]
  ------------------
  111|      6|          return actAndThen(assume(var(switchVar, dfa->rootLA), primty("unit"), dfa->rootLA), jmps[0].second);
  112|      6|        }
  113|      6|      }
  114|      6|    }
  115|      0|    throw annotated_error(dfa->rootLA, "Inexhaustive patterns in match expression");
  116|      6|  }
  117|     19|}
_ZN6hobbes6addRefEPNS_4MDFAEm:
  120|     24|void addRef(MDFA* dfa, stateidx_t s) {
  121|     24|  dfa->states[s]->refs += 1;
  122|     24|}
_ZN6hobbes8addStateEPNS_4MDFAERKSt10shared_ptrINS_6MStateEEb:
  126|  1.66k|stateidx_t addState(MDFA* dfa, const MStatePtr& state, bool addref = true) {
  127|  1.66k|  StatesIdx::const_iterator si = dfa->statesIdx.find(state->stamp());
  128|  1.66k|  if (si != dfa->statesIdx.end()) {
  ------------------
  |  Branch (128:7): [True: 755, False: 913]
  ------------------
  129|    755|    dfa->states[si->second]->refs += addref ? 1 : 0;
  ------------------
  |  Branch (129:38): [True: 755, False: 0]
  ------------------
  130|    755|    return si->second;
  131|    755|  }
  132|       |
  133|       |  // create a new state, give it a ref count, determine which states it leads to
  134|    913|  stateidx_t s = dfa->states.size();
  135|    913|  dfa->states.push_back(state);
  136|    913|  dfa->statesIdx[state->stamp()] = s;
  137|    913|  state->refs += addref ? 1 : 0;
  ------------------
  |  Branch (137:18): [True: 158, False: 755]
  ------------------
  138|    913|  return s;
  139|  1.66k|}
_ZN6hobbes7varNameEPNS_4MDFAERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  142|    187|ExprPtr varName(MDFA* dfa, const std::string& vn) {
  143|    187|  VarNames::const_iterator ve = dfa->varExps.find(vn);
  144|    187|  if (ve != dfa->varExps.end()) {
  ------------------
  |  Branch (144:7): [True: 55, False: 132]
  ------------------
  145|     55|    return ve->second;
  146|     55|  }
  147|       |
  148|    132|  ExprPtr r = var(vn, dfa->rootLA);
  149|    132|  dfa->varExps[vn] = r;
  150|    132|  return r;
  151|    187|}
_ZN6hobbes12arrayElementEPNS_4MDFAERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEm:
  153|      6|ExprPtr arrayElement(MDFA* dfa, const std::string& vn, size_t i) {
  154|      6|  VarArrayElem::const_iterator ae = dfa->elementExps.find(vn);
  155|      6|  if (ae != dfa->elementExps.end()) {
  ------------------
  |  Branch (155:7): [True: 4, False: 2]
  ------------------
  156|      4|    auto ie = ae->second.find(i);
  157|      4|    if (ie != ae->second.end()) {
  ------------------
  |  Branch (157:9): [True: 2, False: 2]
  ------------------
  158|      2|      return ie->second;
  159|      2|    }
  160|      4|  }
  161|       |
  162|      4|  ExprPtr r = fncall(var("element", dfa->rootLA), list(varName(dfa, vn), ExprPtr(new Long(i, dfa->rootLA))), dfa->rootLA);
  163|      4|  dfa->elementExps[vn][i] = r;
  164|      4|  return r;
  165|      6|}
_ZN6hobbes14charArrElementEPNS_4MDFAERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES9_m:
  167|      2|ExprPtr charArrElement(MDFA* dfa, const std::string& packFn, const std::string& vn, size_t i) {
  168|      2|  VarArrayElem::const_iterator ae = dfa->elementExps.find(vn);
  169|      2|  if (ae != dfa->elementExps.end()) {
  ------------------
  |  Branch (169:7): [True: 0, False: 2]
  ------------------
  170|      0|    auto ie = ae->second.find(i);
  171|      0|    if (ie != ae->second.end()) {
  ------------------
  |  Branch (171:9): [True: 0, False: 0]
  ------------------
  172|      0|      return ie->second;
  173|      0|    }
  174|      0|  }
  175|       |
  176|      2|  ExprPtr r = fncall(var(packFn, dfa->rootLA), list(varName(dfa, vn), ExprPtr(new Long(i, dfa->rootLA))), dfa->rootLA);
  177|      2|  dfa->elementExps[vn][i] = r;
  178|      2|  return r;
  179|      2|}
_ZN6hobbes9openArrayEPNS_4MDFAERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  181|      7|ExprPtr openArray(MDFA* dfa, const std::string& vn) {
  182|      7|  return fncall(var("openArrayView", dfa->rootLA), list(varName(dfa, vn)), dfa->rootLA);
  183|      7|}
_ZN6hobbes9arraySizeEPNS_4MDFAERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  185|      4|ExprPtr arraySize(MDFA* dfa, const std::string& vn) {
  186|      4|  VarArrayLen::const_iterator al = dfa->sizeExps.find(vn);
  187|      4|  if (al != dfa->sizeExps.end()) {
  ------------------
  |  Branch (187:7): [True: 0, False: 4]
  ------------------
  188|      0|    return al->second;
  189|      0|  }
  190|       |
  191|      4|  ExprPtr r = fncall(var("size", dfa->rootLA), list(varName(dfa, vn)), dfa->rootLA);
  192|      4|  dfa->sizeExps[vn] = r;
  193|      4|  return r;
  194|      4|}
_ZN6hobbes5fieldEPNS_4MDFAERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES9_:
  196|     75|ExprPtr field(MDFA* dfa, const std::string& vn, const std::string& fn) {
  197|     75|  VarStructField::const_iterator vsf = dfa->fieldExps.find(vn);
  198|     75|  if (vsf != dfa->fieldExps.end()) {
  ------------------
  |  Branch (198:7): [True: 41, False: 34]
  ------------------
  199|     41|    auto sf = vsf->second.find(fn);
  200|     41|    if (sf != vsf->second.end()) {
  ------------------
  |  Branch (200:9): [True: 4, False: 37]
  ------------------
  201|      4|      return sf->second;
  202|      4|    }
  203|     41|  }
  204|       |
  205|     71|  ExprPtr r = proj(varName(dfa, vn), fn, dfa->rootLA);
  206|     71|  dfa->fieldExps[vn][fn] = r;
  207|     71|  return r;
  208|     75|}
_ZN6hobbes9tableTailEPSt6vectorINS_10PatternRowESaIS1_EERKS3_:
  211|      6|void tableTail(PatternRows* out, const PatternRows& in) {
  212|      6|  out->resize(in.size() - 1);
  213|     16|  for (size_t r = 1; r < in.size(); ++r) {
  ------------------
  |  Branch (213:22): [True: 10, False: 6]
  ------------------
  214|     10|    (*out)[r - 1] = in[r];
  215|     10|  }
  216|      6|}
_ZN6hobbes17dropUnusedColumnsEPSt6vectorINS_10PatternRowESaIS1_EERKS3_:
  219|    912|void dropUnusedColumns(PatternRows* out, const PatternRows& in) {
  220|    912|  if (in.empty()) {
  ------------------
  |  Branch (220:7): [True: 0, False: 912]
  ------------------
  221|      0|    return;
  222|      0|  }
  223|       |
  224|    912|  std::set<size_t> usedColumns;
  225|  1.84k|  for (size_t c = 0; c < in[0].patterns.size(); ++c) {
  ------------------
  |  Branch (225:22): [True: 928, False: 912]
  ------------------
  226|    928|    bool hasUse = false;
  227|  1.08k|    for (const auto &r : in) {
  ------------------
  |  Branch (227:24): [True: 1.08k, False: 777]
  ------------------
  228|  1.08k|      if (is<MatchAny>(r.patterns[c]) == nullptr) {
  ------------------
  |  Branch (228:11): [True: 151, False: 930]
  ------------------
  229|    151|        hasUse = true;
  230|    151|        break;
  231|    151|      }
  232|  1.08k|    }
  233|    928|    if (hasUse) {
  ------------------
  |  Branch (233:9): [True: 151, False: 777]
  ------------------
  234|    151|      usedColumns.insert(c);
  235|    151|    }
  236|    928|  }
  237|       |
  238|    912|  if (usedColumns.size() == in[0].patterns.size()) {
  ------------------
  |  Branch (238:7): [True: 207, False: 705]
  ------------------
  239|    207|    *out = in;
  240|    705|  } else {
  241|    832|    for (const auto &r : in) {
  ------------------
  |  Branch (241:24): [True: 832, False: 705]
  ------------------
  242|    832|      Patterns ps;
  243|    832|      for (const auto c : usedColumns) {
  ------------------
  |  Branch (243:25): [True: 73, False: 832]
  ------------------
  244|     73|        ps.push_back(r.patterns[c]);
  245|     73|      }
  246|    832|      out->push_back(PatternRow(ps, r.guard, r.result));
  247|    832|    }
  248|    705|  }
  249|    912|}
_ZN6hobbes20copyRowWithoutColumnEPSt6vectorINS_10PatternRowESaIS1_EERKS1_m:
  252|    430|void copyRowWithoutColumn(PatternRows* out, const PatternRow& row, size_t c) {
  253|    430|  Patterns ps;
  254|    943|  for (size_t ci = 0; ci < row.patterns.size(); ++ci) {
  ------------------
  |  Branch (254:23): [True: 513, False: 430]
  ------------------
  255|    513|    if (ci != c) {
  ------------------
  |  Branch (255:9): [True: 83, False: 430]
  ------------------
  256|     83|      ps.push_back(row.patterns[ci]);
  257|     83|    }
  258|    513|  }
  259|    430|  out->push_back(PatternRow(ps, row.guard, row.result));
  260|    430|}
_ZN6hobbes15prependPatternsEPNS_10PatternRowERKSt6vectorISt10shared_ptrINS_7PatternEESaIS5_EE:
  263|     91|void prependPatterns(PatternRow* row, const Patterns& ps) {
  264|     91|  row->patterns.insert(row->patterns.begin(), ps.begin(), ps.end());
  265|     91|}
_ZN6hobbes13arrayPatternsERKNS_10MatchArrayE:
  268|      8|Patterns arrayPatterns(const MatchArray& ma) {
  269|      8|  Patterns r;
  270|      8|  r.reserve(ma.size());
  271|     16|  for (size_t i = 0; i < ma.size(); ++i) {
  ------------------
  |  Branch (271:22): [True: 8, False: 8]
  ------------------
  272|      8|    r.push_back(ma.pattern(i));
  273|      8|  }
  274|      8|  return r;
  275|      8|}
_ZN6hobbes15arrayAnyMatchesEm:
  278|     35|Patterns arrayAnyMatches(size_t n) {
  279|     35|  static PatternPtr pany(new MatchAny("_", LexicalAnnotation::null()));
  280|     35|  Patterns r;
  281|     35|  r.resize(n);
  282|     96|  for (size_t i = 0; i < n; ++i) { r[i] = pany; }
  ------------------
  |  Branch (282:22): [True: 61, False: 35]
  ------------------
  283|     35|  return r;
  284|     35|}
_ZN6hobbes19recordFieldPatternsERKNS_11MatchRecordE:
  287|     44|Patterns recordFieldPatterns(const MatchRecord& mr) {
  288|     44|  Patterns r;
  289|     44|  r.resize(mr.size());
  290|    135|  for (size_t i = 0; i < mr.size(); ++i) {
  ------------------
  |  Branch (290:22): [True: 91, False: 44]
  ------------------
  291|     91|    r[i] = mr.pattern(i).second;
  292|     91|  }
  293|     44|  return r;
  294|     44|}
_ZN6hobbes8litValueERKNS_12MatchLiteralE:
  384|     18|PrimitivePtr litValue(const MatchLiteral& ml) { return ml.equivConstant(); }
_ZN6hobbes15makeLitSplitRowERKNS_12MatchLiteralEPSt6vectorINS_10PatternRowESaIS4_EERKS4_m:
  385|     18|void makeLitSplitRow(const MatchLiteral&, PatternRows* out, const PatternRow& r, size_t c) { copyRowWithoutColumn(out, r, c); }
_ZN6hobbes12makeLSAnyRowESt10shared_ptrINS_9PrimitiveEEPSt6vectorINS_10PatternRowESaIS4_EERKS4_m:
  386|     12|void makeLSAnyRow(PrimitivePtr, PatternRows* out, const PatternRow& r, size_t c) { copyRowWithoutColumn(out, r, c); }
_ZN6hobbes15makeLSSuccStateERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_9PrimitiveEEPNS_4MDFAERKSt6vectorINS_10PatternRowESaISE_EE:
  387|     18|stateidx_t makeLSSuccState(const std::string&, PrimitivePtr, MDFA* dfa, const PatternRows& nps) { return makeDFAState(dfa, nps); }
_ZN6hobbes12makeLSSwitchERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPNS_4MDFAERKSt6vectorISt4pairISt10shared_ptrINS_9PrimitiveEEmESaISF_EEm:
  389|     15|MStatePtr makeLSSwitch(const std::string& switchVar, MDFA* dfa, const SwitchVal::Jumps& jmps, stateidx_t defState) {
  390|     15|  return makeSwitch(dfa, switchVar, jmps, defState);
  391|     15|}
_ZN6hobbes17forConvertibilityERKSt10shared_ptrINS_7PatternEE:
  400|     14|bool forConvertibility(const PatternPtr& p) {
  401|     14|  if (const MatchLiteral* ml = is<MatchLiteral>(p)) {
  ------------------
  |  Branch (401:27): [True: 14, False: 0]
  ------------------
  402|     14|    return ml->expression() != ExprPtr();
  403|     14|  } else {
  404|      0|    return false;
  405|      0|  }
  406|     14|}
_ZN6hobbes16makeLiteralStateEPNS_4MDFAERKSt6vectorINS_10PatternRowESaIS3_EEm:
  408|     14|MStatePtr makeLiteralState(MDFA* dfa, const PatternRows& ps, size_t c) {
  409|     14|  if (forConvertibility(ps[0].patterns[c])) {
  ------------------
  |  Branch (409:7): [True: 0, False: 14]
  ------------------
  410|      0|    return
  411|      0|      makeSplitState<
  412|      0|        MatchLiteral,
  413|      0|        PrimitivePtr,
  414|      0|        &litValue,
  415|      0|        &makeLitSplitRow,
  416|      0|        &makeLSAnyRow,
  417|      0|        &makeLSSuccState,
  418|      0|        &makeLSCvtSwitch,
  419|      0|        PrimPtrLT
  420|      0|      >
  421|      0|      (dfa, ps, c);
  422|     14|  } else {
  423|     14|    return
  424|     14|      makeSplitState<
  425|     14|        MatchLiteral,
  426|     14|        PrimitivePtr,
  427|     14|        &litValue,
  428|     14|        &makeLitSplitRow,
  429|     14|        &makeLSAnyRow,
  430|     14|        &makeLSSuccState,
  431|     14|        &makeLSSwitch,
  432|     14|        PrimPtrLT
  433|     14|      >
  434|     14|      (dfa, ps, c);
  435|     14|  }
  436|     14|}
_ZN6hobbes6maSizeERKNS_10MatchArrayE:
  439|      8|size_t maSize(const MatchArray& ma) { return ma.size(); }
_ZN6hobbes13makeASplitRowERKNS_10MatchArrayEPSt6vectorINS_10PatternRowESaIS4_EERKS4_m:
  441|      8|void makeASplitRow(const MatchArray& ma, PatternRows* out, const PatternRow& r, size_t c) {
  442|      8|  copyRowWithoutColumn(out, r, c);
  443|      8|  prependPatterns(&out->back(), arrayPatterns(ma));
  444|      8|}
_ZN6hobbes12makeASAnyRowEmPSt6vectorINS_10PatternRowESaIS1_EERKS1_m:
  446|      7|void makeASAnyRow(size_t len, PatternRows* out, const PatternRow& r, size_t c) {
  447|      7|  copyRowWithoutColumn(out, r, c);
  448|      7|  prependPatterns(&out->back(), arrayAnyMatches(len));
  449|      7|}
_ZN6hobbes15makeASSuccStateERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEmPNS_4MDFAERKSt6vectorINS_10PatternRowESaISB_EE:
  451|      6|stateidx_t makeASSuccState(const std::string& arrayVar, size_t len, MDFA* dfa, const PatternRows& nps) {
  452|      6|  LoadVars::Defs ds;
  453|     12|  for (size_t i = 0; i < len; ++i) {
  ------------------
  |  Branch (453:22): [True: 6, False: 6]
  ------------------
  454|      6|    ds.push_back(LoadVars::Def(arrayVar + "." + str::from(i + 1), arrayElement(dfa, arrayVar, i)));
  455|      6|  }
  456|      6|  return addState(dfa, MStatePtr(new LoadVars(ds, makeDFAState(dfa, nps))));
  457|      6|}
_ZN6hobbes12makeASSwitchERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPNS_4MDFAERKSt6vectorISt4pairImmESaISC_EEm:
  459|      4|MStatePtr makeASSwitch(const std::string& arrayVar, MDFA* dfa, const std::vector< std::pair<size_t, stateidx_t> >& lenjmps, stateidx_t defState) {
  460|       |  // switch on array length, then load that many elements and continue
  461|      4|  std::string switchVar = arrayVar + ".0";
  462|      4|  SwitchVal::Jumps jmps;
  463|      6|  for (const auto& lj : lenjmps) {
  ------------------
  |  Branch (463:23): [True: 6, False: 4]
  ------------------
  464|      6|    jmps.push_back(SwitchVal::Jump(PrimitivePtr(new Long(lj.first, dfa->rootLA)), lj.second));
  465|      6|  }
  466|       |
  467|       |  // open an array view out of this value (for most types this should be a no-op)
  468|       |  // load array length
  469|       |  // and then perform the switch
  470|      4|  std::string oarrayVar = arrayVar + ".a";
  471|       |
  472|      4|  stateidx_t switchState = addState(dfa, makeSwitch(dfa, switchVar, jmps, defState));
  473|      4|  LoadVars::Defs ds;
  474|      4|  ds.push_back(LoadVars::Def(oarrayVar, openArray(dfa, arrayVar)));
  475|      4|  ds.push_back(LoadVars::Def(switchVar, arraySize(dfa, oarrayVar)));
  476|       |
  477|      4|  return MStatePtr(new LoadVars(ds, switchState));
  478|      4|}
_ZN6hobbes14makeArrayStateEPNS_4MDFAERKSt6vectorINS_10PatternRowESaIS3_EEm:
  480|      4|MStatePtr makeArrayState(MDFA* dfa, const PatternRows& ps, size_t c) {
  481|      4|  return
  482|      4|    makeSplitState<
  483|      4|      MatchArray,
  484|      4|      size_t,
  485|      4|      &maSize,
  486|      4|      &makeASplitRow,
  487|      4|      &makeASAnyRow,
  488|      4|      &makeASSuccState,
  489|      4|      &makeASSwitch
  490|      4|    >
  491|      4|    (dfa, ps, c);
  492|      4|}
_ZN6hobbes12maxStringLenERKSt6vectorINS_10PatternRowESaIS1_EEm:
  495|      2|size_t maxStringLen(const PatternRows& ps, size_t c) {
  496|      2|  size_t mlen = 0;
  497|      6|  for (const auto &p : ps) {
  ------------------
  |  Branch (497:22): [True: 6, False: 2]
  ------------------
  498|      6|    if (const MatchArray* ma = is<MatchArray>(p.patterns[c])) {
  ------------------
  |  Branch (498:27): [True: 4, False: 2]
  ------------------
  499|      4|      mlen = std::max<size_t>(ma->size(), mlen);
  500|      4|    }
  501|      6|  }
  502|      2|  return mlen;
  503|      2|}
_ZN6hobbes13packedSValuesEm:
  505|      2|size_t packedSValues(size_t cs) {
  506|      2|  assert(cs % 8 == 0);
  ------------------
  |  Branch (506:3): [True: 2, False: 0]
  ------------------
  507|      2|  return cs / 8;
  508|      2|}
_ZN6hobbes14sarrayPatternsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEmRKNS_10MatchArrayE:
  533|      4|Patterns sarrayPatterns(const std::string& svarName, size_t cs, const MatchArray& ma) {
  534|      4|  Patterns r;
  535|      4|  size_t i  = 0;
  536|      8|  while (cs >= 8) {
  ------------------
  |  Branch (536:10): [True: 4, False: 4]
  ------------------
  537|      4|    PatternPtr qwp(new MatchLiteral(PrimitivePtr(new Long(translatep<unsigned long>(ma, i), ma.la())), ma.la()));
  538|      4|    qwp->name(svarName + ".l" + str::from(i));
  539|      4|    r.push_back(qwp);
  540|       |
  541|      4|    cs -= 8;
  542|      4|    i  += 8;
  543|      4|  }
  544|      4|  assert(cs == 0);
  ------------------
  |  Branch (544:3): [True: 4, False: 0]
  ------------------
  545|      4|  return r;
  546|      4|}
_ZN6hobbes13addSATableRowEmRKNS_10PatternRowEmPSt6vectorIS0_SaIS0_EE:
  548|      6|void addSATableRow(size_t len, const PatternRow& r, size_t c, PatternRows* out) {
  549|      6|  copyRowWithoutColumn(out, r, c);
  550|      6|  if (const MatchArray* ma = is<MatchArray>(r.patterns[c])) {
  ------------------
  |  Branch (550:25): [True: 4, False: 2]
  ------------------
  551|      4|    prependPatterns(&out->back(), sarrayPatterns(r.patterns[c]->name(), len, *ma));
  552|      4|  } else {
  553|      2|    assert(is<MatchAny>(r.patterns[c]));
  ------------------
  |  Branch (553:5): [True: 2, False: 0]
  ------------------
  554|      2|    prependPatterns(&out->back(), arrayAnyMatches(packedSValues(len)));
  555|      2|  }
  556|      6|}
_ZN6hobbes18makeCharArrayStateEPNS_4MDFAERKSt6vectorINS_10PatternRowESaIS3_EEm:
  558|      2|MStatePtr makeCharArrayState(MDFA* dfa, const PatternRows& ps, size_t c) {
  559|      2|  static MonoTypePtr longTy(Prim::make("long"));
  560|       |
  561|      2|  std::string arrayVar = ps[0].patterns[c]->name();
  562|      2|  auto      mlen     = align<size_t>(maxStringLen(ps, c) + 1, 8);
  563|      2|  size_t      cs       = mlen;
  564|       |  
  565|      2|  LoadVars::Defs ds;
  566|       |
  567|       |  // open this array (usually a no-op)
  568|      2|  std::string oarrayVar = arrayVar + ".a";
  569|      2|  ds.push_back(LoadVars::Def(oarrayVar, openArray(dfa, arrayVar)));
  570|       |
  571|       |  // load string values
  572|      2|  size_t i = 0;
  573|      4|  while (cs >= 8) {
  ------------------
  |  Branch (573:10): [True: 2, False: 2]
  ------------------
  574|      2|    ds.push_back(LoadVars::Def(arrayVar + ".l" + str::from(i), assume(charArrElement(dfa, "packCArrLong", oarrayVar, i), longTy, dfa->rootLA)));
  575|      2|    cs -= 8;
  576|      2|    i  += 8;
  577|      2|  }
  578|      2|  assert(cs == 0);
  ------------------
  |  Branch (578:3): [True: 2, False: 0]
  ------------------
  579|       |
  580|       |  // generate the successor table
  581|      2|  PatternRows nps;
  582|      6|  for (const auto &p : ps) {
  ------------------
  |  Branch (582:22): [True: 6, False: 2]
  ------------------
  583|      6|    addSATableRow(mlen, p, c, &nps);
  584|      6|  }
  585|       |
  586|       |  // and that's it!
  587|      2|  return MStatePtr(new LoadVars(ds, makeDFAState(dfa, nps)));
  588|      2|}
_ZN6hobbes21canMakeCharArrayStateERKSt6vectorINS_10PatternRowESaIS1_EEm:
  590|    151|bool canMakeCharArrayState(const PatternRows& ps, size_t c) {
  591|    151|  bool seemsLegit = false;
  592|    162|  for (const auto &p : ps) {
  ------------------
  |  Branch (592:22): [True: 162, False: 6]
  ------------------
  593|    162|    if (const MatchArray* ma = is<MatchArray>(p.patterns[c])) {
  ------------------
  |  Branch (593:27): [True: 10, False: 152]
  ------------------
  594|     21|      for (size_t i = 0; i < ma->size(); ++i) {
  ------------------
  |  Branch (594:26): [True: 13, False: 8]
  ------------------
  595|     13|        if (const MatchLiteral* ml = is<MatchLiteral>(ma->pattern(i))) {
  ------------------
  |  Branch (595:33): [True: 11, False: 2]
  ------------------
  596|     11|          if (is<Char>(ml->equivConstant()) != nullptr) {
  ------------------
  |  Branch (596:15): [True: 11, False: 0]
  ------------------
  597|     11|            seemsLegit = true;
  598|     11|          }
  599|     11|        } else {
  600|      2|          return false;
  601|      2|        }
  602|     13|      }
  603|    152|    } else if (is<MatchAny>(p.patterns[c]) == nullptr) {
  ------------------
  |  Branch (603:16): [True: 143, False: 9]
  ------------------
  604|    143|      return false;
  605|    143|    }
  606|    162|  }
  607|      6|  return seemsLegit;
  608|    151|}
_ZN6hobbes27canMakeCharArrStateAtColumnEPNS_4MDFAERKSt6vectorINS_10PatternRowESaIS3_EE:
  610|    912|size_t canMakeCharArrStateAtColumn(MDFA* dfa, const PatternRows& ps) {
  611|    912|  if (dfa->c->buildColumnwiseMatches()) {
  ------------------
  |  Branch (611:7): [True: 0, False: 912]
  ------------------
  612|      0|    return ps[0].patterns.size(); // don't bother packing strings if we're compiling columnwise
  613|      0|  }
  614|       |
  615|  1.06k|  for (size_t c = 0; c < ps[0].patterns.size(); ++c) {
  ------------------
  |  Branch (615:22): [True: 151, False: 910]
  ------------------
  616|    151|    if (canMakeCharArrayState(ps, c)) {
  ------------------
  |  Branch (616:9): [True: 2, False: 149]
  ------------------
  617|      2|      return c;
  618|      2|    }
  619|    151|  }
  620|    910|  return ps[0].patterns.size();
  621|    912|}
_ZN6hobbes15makeRecordStateEPNS_4MDFAERKSt6vectorINS_10PatternRowESaIS3_EEm:
  624|     36|MStatePtr makeRecordState(MDFA* dfa, const PatternRows& ps, size_t c) {
  625|       |  // get the fields to load
  626|     36|  LoadVars::Defs defs;
  627|       |
  628|     36|  if (const MatchRecord* mr = is<MatchRecord>(ps[0].patterns[c])) {
  ------------------
  |  Branch (628:26): [True: 36, False: 0]
  ------------------
  629|    111|    for (size_t fi = 0; fi < mr->size(); ++fi) {
  ------------------
  |  Branch (629:25): [True: 75, False: 36]
  ------------------
  630|     75|      const MatchRecord::Field& f = mr->pattern(fi);
  631|     75|      defs.push_back(LoadVars::Def(f.second->name(), field(dfa, mr->name(), f.first)));
  632|     75|    }
  633|     36|  } else {
  634|      0|    throw annotated_error(*ps[0].patterns[c], "Internal error, can't make record state from non-record pattern");
  635|      0|  }
  636|       |
  637|       |  // eliminate this column and add new columns for field patterns
  638|     36|  PatternRows cdef;
  639|       |
  640|     70|  for (const auto &p : ps) {
  ------------------
  |  Branch (640:22): [True: 70, False: 36]
  ------------------
  641|     70|    if (const MatchRecord* mr = is<MatchRecord>(p.patterns[c])) {
  ------------------
  |  Branch (641:28): [True: 44, False: 26]
  ------------------
  642|     44|      copyRowWithoutColumn(&cdef, p, c);
  643|     44|      prependPatterns(&cdef.back(), recordFieldPatterns(*mr));
  644|     44|    } else if (is<MatchAny>(p.patterns[c]) != nullptr) {
  ------------------
  |  Branch (644:16): [True: 26, False: 0]
  ------------------
  645|     26|      copyRowWithoutColumn(&cdef, p, c);
  646|     26|      prependPatterns(&cdef.back(), arrayAnyMatches(defs.size()));
  647|     26|    } else {
  648|      0|      throw annotated_error(*p.patterns[c], "Internal error, invalid pattern table received");
  649|      0|    }
  650|     70|  }
  651|       |
  652|       |  // now just load and continue
  653|     36|  return MStatePtr(new LoadVars(defs, makeDFAState(dfa, cdef)));
  654|     36|}
_ZN6hobbes7varCtorB5cxx11ERKNS_12MatchVariantE:
  657|    101|std::string varCtor(const MatchVariant& mv) { return mv.label(); }
_ZN6hobbes19makeVariantSplitRowERKNS_12MatchVariantEPSt6vectorINS_10PatternRowESaIS4_EERKS4_m:
  659|    101|void makeVariantSplitRow(const MatchVariant& mv, PatternRows* out, const PatternRow& r, size_t c) {
  660|    101|  copyRowWithoutColumn(out, r, c);
  661|    101|  out->back().patterns.insert(out->back().patterns.begin(), mv.value());
  662|    101|}
_ZN6hobbes12makeVSAnyRowENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPSt6vectorINS_10PatternRowESaIS7_EERKS7_m:
  664|    101|void makeVSAnyRow(std::string, PatternRows* out, const PatternRow& r, size_t c) {
  665|    101|  copyRowWithoutColumn(out, r, c);
  666|    101|  out->back().patterns.insert(out->back().patterns.begin(), r.patterns[c]);
  667|    101|}
_ZN6hobbes15makeVSSuccStateERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_PNS_4MDFAERKSt6vectorINS_10PatternRowESaISB_EE:
  669|     84|stateidx_t makeVSSuccState(const std::string&, std::string, MDFA* dfa, const PatternRows& nps) {
  670|     84|  return makeDFAState(dfa, nps);
  671|     84|}
_ZN6hobbes12makeVSSwitchERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPNS_4MDFAERKSt6vectorISt4pairIS5_mESaISC_EEm:
  673|     76|MStatePtr makeVSSwitch(const std::string& switchVar, MDFA*, const SwitchVariant::CtorJumps& jmps, stateidx_t defState) {
  674|     76|  return MStatePtr(new SwitchVariant(switchVar, jmps, defState));
  675|     76|}
_ZN6hobbes16makeVariantStateEPNS_4MDFAERKSt6vectorINS_10PatternRowESaIS3_EEm:
  677|     76|MStatePtr makeVariantState(MDFA* dfa, const PatternRows& ps, size_t c) {
  678|     76|  return
  679|     76|    makeSplitState<
  680|     76|      MatchVariant,
  681|     76|      std::string,
  682|     76|      &varCtor,
  683|     76|      &makeVariantSplitRow,
  684|     76|      &makeVSAnyRow,
  685|     76|      &makeVSSuccState,
  686|     76|      &makeVSSwitch
  687|     76|    >
  688|     76|    (dfa, ps, c);
  689|     76|}
_ZN6hobbes20collectColumnRegexesEPSt13unordered_mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS_13ColumnRegexesESt4hashIS6_ESt8equal_toIS6_ESaISt4pairIKS6_S7_EEERKSt6vectorINS_10PatternRowESaISJ_EE:
  751|    669|void collectColumnRegexes(ColumnRegexTables* out, const PatternRows& ps) {
  752|    669|  collectColumnRegexesF f(out);
  753|    755|  for (const auto& r : ps) {
  ------------------
  |  Branch (753:22): [True: 755, False: 669]
  ------------------
  754|    841|    for (const auto& p : r.patterns) {
  ------------------
  |  Branch (754:24): [True: 841, False: 755]
  ------------------
  755|    841|      switchOf(p, f);
  756|    841|    }
  757|    755|  }
  758|    669|}
_ZN6hobbes16columnRegexesForEPNS_4MDFAERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt6vectorISt10shared_ptrINS_5RegexEESaISD_EE:
  763|      1|const ColumnRegexes& columnRegexesFor(MDFA* dfa, const std::string& colVar, const Regexes& rs) {
  764|      1|  ColumnRegexes& crs = dfa->columnRegexes[colVar];
  765|      2|  for (const auto& r : rs) {
  ------------------
  |  Branch (765:22): [True: 2, False: 1]
  ------------------
  766|      2|    collectColumnRegexesF::add(&dfa->columnRegexes, colVar, r);
  767|      2|  }
  768|      1|  return crs;
  769|      1|}
_ZN6hobbes14makeRegexStateEPNS_4MDFAERKSt6vectorINS_10PatternRowESaIS3_EEm:
  771|      1|MStatePtr makeRegexState(MDFA* dfa, const PatternRows& ps, size_t c) {
  772|       |  // remember the match-any rows, and which column regex each other row tests
  773|      1|  std::set<size_t> matchAnyRows;
  774|      1|  Regexes          rowRegexes;
  775|      4|  for (size_t r = 0; r < ps.size(); ++r) {
  ------------------
  |  Branch (775:22): [True: 3, False: 1]
  ------------------
  776|      3|    if (const MatchRegex* mr = is<MatchRegex>(ps[r].patterns[c])) {
  ------------------
  |  Branch (776:27): [True: 2, False: 1]
  ------------------
  777|      2|      rowRegexes.push_back(mr->value());
  778|      2|    } else if (is<MatchAny>(ps[r].patterns[c]) != nullptr) {
  ------------------
  |  Branch (778:16): [True: 1, False: 0]
  ------------------
  779|      1|      matchAnyRows.insert(r);
  780|      1|      rowRegexes.push_back(RegexPtr());
  781|      1|    } else {
  782|      0|      throw annotated_error(*ps[r].patterns[c], "Internal error, invalid pattern table received");
  783|      0|    }
  784|      3|  }
  785|       |
  786|      1|  std::string switchVar = ps[0].patterns[c]->name();
  787|       |
  788|      1|  Regexes testedRegexes;
  789|      3|  for (const auto& r : rowRegexes) {
  ------------------
  |  Branch (789:22): [True: 3, False: 1]
  ------------------
  790|      3|    if (r) { testedRegexes.push_back(r); }
  ------------------
  |  Branch (790:9): [True: 2, False: 1]
  ------------------
  791|      3|  }
  792|      1|  const ColumnRegexes& colRegexes = columnRegexesFor(dfa, switchVar, testedRegexes);
  793|       |
  794|      1|  std::vector<size_t> rowRegexIdx(ps.size(), 0);
  795|      4|  for (size_t r = 0; r < ps.size(); ++r) {
  ------------------
  |  Branch (795:22): [True: 3, False: 1]
  ------------------
  796|      3|    if (rowRegexes[r]) {
  ------------------
  |  Branch (796:9): [True: 2, False: 1]
  ------------------
  797|      2|      rowRegexIdx[r] = colRegexes.index.find(regexKey(rowRegexes[r]))->second;
  798|      2|    }
  799|      3|  }
  800|       |
  801|       |  // make (or reuse) the function that matches every regex in this column
  802|      1|  CRegexes regexFn = makeRegexFn(dfa->c, colRegexes.regexes, dfa->rootLA);
  803|       |
  804|       |  // open a char array on the match value (usually this will be a no-op)
  805|       |  // then call the regex function to get the set of continuation rows to follow and a buffer for captured data
  806|      1|  std::string oarrayVar   = switchVar + ".a";
  807|      1|  std::string rcaptureVar = switchVar + ".rgxcapture";
  808|      1|  std::string rcheckVar   = switchVar + ".rgxcheck";
  809|       |
  810|      1|  LoadVars::Defs ds;
  811|      1|  ds.push_back(LoadVars::Def(oarrayVar, openArray(dfa, switchVar)));
  812|      1|  ds.push_back(LoadVars::Def(rcaptureVar, regexFn.captureBuffer));
  813|      1|  ds.push_back(LoadVars::Def(rcheckVar,
  814|      1|    fncall(
  815|      1|      var(regexFn.fname, dfa->rootLA), list(
  816|      1|        var(rcaptureVar, dfa->rootLA),
  817|      1|        var(oarrayVar, dfa->rootLA),
  818|      1|        constant(static_cast<long>(0), dfa->rootLA),
  819|      1|        fncall(var("size", dfa->rootLA), list(var(oarrayVar, dfa->rootLA)), dfa->rootLA),
  820|      1|        constant(static_cast<int>(0), dfa->rootLA)),
  821|      1|      dfa->rootLA
  822|      1|    )
  823|      1|  ));
  824|       |
  825|       |  // each result of the column function selects the rows here whose regex it
  826|       |  // matched; results that select the same rows lead to the same state, and a
  827|       |  // result that selects none of them is the same as no match at all
  828|      1|  using MatchedRows = std::vector<size_t>;
  829|      1|  std::map<MatchedRows, std::vector<size_t>> resultsByRows;
  830|      2|  for (const auto& rstate : regexFn.rstates) {
  ------------------
  |  Branch (830:27): [True: 2, False: 1]
  ------------------
  831|      2|    MatchedRows rows;
  832|      8|    for (size_t r = 0; r < ps.size(); ++r) {
  ------------------
  |  Branch (832:24): [True: 6, False: 2]
  ------------------
  833|      6|      if (rowRegexes[r] && rstate.second.count(rowRegexIdx[r]) > 0) {
  ------------------
  |  Branch (833:11): [True: 4, False: 2]
  |  Branch (833:28): [True: 2, False: 2]
  ------------------
  834|      2|        rows.push_back(r);
  835|      2|      }
  836|      6|    }
  837|      2|    if (!rows.empty()) {
  ------------------
  |  Branch (837:9): [True: 2, False: 0]
  ------------------
  838|      2|      resultsByRows[rows].push_back(rstate.first);
  839|      2|    }
  840|      2|  }
  841|       |
  842|       |  // based on the match result, branch to a reduced table
  843|      1|  SwitchVal::Jumps sjmps;
  844|      2|  for (const auto& rr : resultsByRows) {
  ------------------
  |  Branch (844:23): [True: 2, False: 1]
  ------------------
  845|      2|    PatternRows ktbl;
  846|      2|    auto anyr = matchAnyRows.begin();
  847|       |
  848|       |    // the captured data to load: that of every regex matched here, in row order
  849|      2|    CVarDefs cvds;
  850|      2|    std::set<size_t> unpacked;
  851|       |
  852|      2|    for (const auto& r : rr.first) {
  ------------------
  |  Branch (852:24): [True: 2, False: 2]
  ------------------
  853|       |      // all match-any values prior to this row must take priority
  854|      2|      for (; anyr != matchAnyRows.end() && *anyr < r; ++anyr) {
  ------------------
  |  Branch (854:14): [True: 2, False: 0]
  |  Branch (854:14): [True: 0, False: 2]
  |  Branch (854:44): [True: 0, False: 2]
  ------------------
  855|      0|        copyRowWithoutColumn(&ktbl, ps[*anyr], c);
  856|      0|      }
  857|       |
  858|       |      // then we've matched this row at this column
  859|      2|      copyRowWithoutColumn(&ktbl, ps[r], c);
  860|       |
  861|      2|      if (unpacked.insert(rowRegexIdx[r]).second) {
  ------------------
  |  Branch (861:11): [True: 2, False: 0]
  ------------------
  862|      2|        CVarDefs rcvds = unpackCaptureVars(switchVar, rcaptureVar, regexFn, rowRegexIdx[r], dfa->rootLA);
  863|      2|        cvds.insert(cvds.end(), rcvds.begin(), rcvds.end());
  864|      2|      }
  865|      2|    }
  866|       |
  867|       |    // include all trailing match-any rows at the end of this reduced table
  868|      4|    for (; anyr != matchAnyRows.end(); ++anyr) {
  ------------------
  |  Branch (868:12): [True: 2, False: 2]
  ------------------
  869|      2|      copyRowWithoutColumn(&ktbl, ps[*anyr], c);
  870|      2|    }
  871|       |
  872|       |    // in this case, follow this continuation and load variables for it
  873|      2|    stateidx_t nextState = makeDFAState(dfa, ktbl);
  874|      2|    if (!cvds.empty()) {
  ------------------
  |  Branch (874:9): [True: 2, False: 0]
  ------------------
  875|      2|      nextState = addState(dfa, MStatePtr(new LoadVars(cvds, nextState)));
  876|      2|    }
  877|       |    // (the state was made with one reference; each further result that
  878|       |    // jumps to it is another)
  879|      4|    for (size_t i = 0; i < rr.second.size(); ++i) {
  ------------------
  |  Branch (879:24): [True: 2, False: 2]
  ------------------
  880|      2|      sjmps.push_back(SwitchVal::Jump(PrimitivePtr(new Int(static_cast<int>(rr.second[i]), dfa->rootLA)), nextState));
  881|      2|      if (i > 0) {
  ------------------
  |  Branch (881:11): [True: 0, False: 2]
  ------------------
  882|      0|        addRef(dfa, nextState);
  883|      0|      }
  884|      2|    }
  885|      2|  }
  886|       |
  887|       |  // otherwise if we didn't match anything, branch to a default table containing just the match-any states (if applicable)
  888|      1|  PatternRows def;
  889|      1|  for (auto r : matchAnyRows) {
  ------------------
  |  Branch (889:15): [True: 1, False: 1]
  ------------------
  890|      1|    copyRowWithoutColumn(&def, ps[r], c);
  891|      1|  }
  892|      1|  stateidx_t defState = !def.empty() ? makeDFAState(dfa, def) : nullState;
  ------------------
  |  Branch (892:25): [True: 1, False: 0]
  ------------------
  893|       |
  894|       |  // and that's our state ... a load for the regex call and a branch on its result
  895|      1|  return MStatePtr(new LoadVars(ds, addState(dfa, makeLSSwitch(rcheckVar, dfa, sjmps, defState))));
  896|      1|}
_ZN6hobbes13makeSuccStateEPNS_4MDFAERKSt6vectorINS_10PatternRowESaIS3_EEm:
  944|    131|MStatePtr makeSuccState(MDFA* dfa, const PatternRows& ps, size_t c) {
  945|    131|  return switchOf(ps[0].patterns[c], makeSuccStateF(dfa, ps, c));
  946|    131|}
_ZN6hobbes11columnScoreERKSt6vectorINS_10PatternRowESaIS1_EEm:
  987|    147|size_t columnScore(const PatternRows& ps, size_t c) {
  988|    147|  size_t s = 0;
  989|    147|  scorePatternF matchCounter;
  990|    350|  for (const auto& p : ps) {
  ------------------
  |  Branch (990:22): [True: 350, False: 147]
  ------------------
  991|    350|    s += switchOf(p.patterns[c], matchCounter);
  992|    350|  }
  993|    147|  return s;
  994|    147|}
_ZN6hobbes17choosePivotColumnERKSt6vectorINS_10PatternRowESaIS1_EE:
  996|    886|size_t choosePivotColumn(const PatternRows& ps) {
  997|    886|  size_t chosenColumn = ps[0].patterns.size();
  998|    886|  size_t currentScore = std::numeric_limits<size_t>::max();
  999|       |
 1000|    886|  size_t bestArrayColumn = ps[0].patterns.size();
 1001|    886|  size_t bestArrayScore  = std::numeric_limits<size_t>::max();
 1002|       |
 1003|  1.03k|  for (size_t c = 0; c < ps[0].patterns.size(); ++c) {
  ------------------
  |  Branch (1003:22): [True: 149, False: 886]
  ------------------
 1004|    149|    if (is<MatchAny>(ps[0].patterns[c]) == nullptr) {
  ------------------
  |  Branch (1004:9): [True: 147, False: 2]
  ------------------
 1005|    147|      size_t csc = 1 + columnScore(ps, c);
 1006|    147|      if (csc < currentScore) {
  ------------------
  |  Branch (1006:11): [True: 135, False: 12]
  ------------------
 1007|    135|        chosenColumn = c;
 1008|    135|        currentScore = csc;
 1009|    135|      }
 1010|       |
 1011|    147|      if ((is<MatchArray>(ps[0].patterns[c]) != nullptr) && csc < bestArrayScore) {
  ------------------
  |  Branch (1011:11): [True: 4, False: 143]
  |  Branch (1011:61): [True: 4, False: 0]
  ------------------
 1012|      4|        bestArrayColumn = c;
 1013|      4|        bestArrayScore  = csc;
 1014|      4|      }
 1015|    147|    }
 1016|    149|  }
 1017|       |
 1018|       |  // prefer array selection (for GLM)
 1019|    886|  if (bestArrayColumn < ps[0].patterns.size()) {
  ------------------
  |  Branch (1019:7): [True: 4, False: 882]
  ------------------
 1020|      4|    return bestArrayColumn;
 1021|    882|  } else {
 1022|    882|    return chosenColumn;
 1023|    882|  }
 1024|    886|}
_ZN6hobbes15isPrimSelectionEbRKSt6vectorINS_10PatternRowESaIS1_EE:
 1027|    131|bool isPrimSelection(bool alwaysLowerPrimMatchTables, const PatternRows& ps) {
 1028|       |  // heuristically avoid prim selection derivation for "small tables"
 1029|    131|  if (!alwaysLowerPrimMatchTables && ps.size() < 500) {
  ------------------
  |  Branch (1029:7): [True: 131, False: 0]
  |  Branch (1029:38): [True: 131, False: 0]
  ------------------
 1030|    131|    return false;
 1031|    131|  }
 1032|       |
 1033|       |  // there can't be any guards in a primitive selection
 1034|      0|  for (const auto &p : ps) {
  ------------------
  |  Branch (1034:22): [True: 0, False: 0]
  ------------------
 1035|      0|    if (p.guard) {
  ------------------
  |  Branch (1035:9): [True: 0, False: 0]
  ------------------
 1036|      0|      return false;
 1037|      0|    }
 1038|      0|  }
 1039|       |
 1040|       |  // any match on a composite value (record, array, variant) doesn't count as primitive
 1041|       |  // we also can't (currently) have convertible values in primitive tests
 1042|      0|  bool seemsLegit = false;
 1043|       |
 1044|      0|  for (size_t c = 0; c < ps[0].patterns.size(); ++c) {
  ------------------
  |  Branch (1044:22): [True: 0, False: 0]
  ------------------
 1045|      0|    for (const auto &p : ps) {
  ------------------
  |  Branch (1045:24): [True: 0, False: 0]
  ------------------
 1046|      0|      if (const MatchLiteral* ml = is<MatchLiteral>(p.patterns[c])) {
  ------------------
  |  Branch (1046:31): [True: 0, False: 0]
  ------------------
 1047|      0|        if (ml->expression()) {
  ------------------
  |  Branch (1047:13): [True: 0, False: 0]
  ------------------
 1048|      0|          return false;
 1049|      0|        } else {
 1050|       |          // one constant is as good as all constants
 1051|      0|          seemsLegit = true;
 1052|      0|          break;
 1053|      0|        }
 1054|      0|      } else if (is<MatchAny>(p.patterns[c]) == nullptr) {
  ------------------
  |  Branch (1054:18): [True: 0, False: 0]
  ------------------
 1055|      0|        return false;
 1056|      0|      }
 1057|      0|    }
 1058|      0|  }
 1059|       |
 1060|      0|  return seemsLegit;
 1061|      0|}
_ZN6hobbes25shouldDecomposeColumnwiseEPNS_4MDFAERKSt6vectorINS_10PatternRowESaIS3_EE:
 1078|    886|bool shouldDecomposeColumnwise(MDFA* dfa, const PatternRows& ps) {
 1079|       |  // it only makes sense to decompose columnwise if the table has at least one row, at least two columns
 1080|    886|  if (ps.empty() || ps[0].patterns.size() <= 1) {
  ------------------
  |  Branch (1080:7): [True: 0, False: 886]
  |  Branch (1080:21): [True: 869, False: 17]
  ------------------
 1081|    869|    return false;
 1082|    869|  }
 1083|       |
 1084|       |  // there's some overhead with this method, so only do it if the user asks for it
 1085|     17|  if (!dfa->c->buildColumnwiseMatches()) {
  ------------------
  |  Branch (1085:7): [True: 17, False: 0]
  ------------------
 1086|     17|    return false;
 1087|     17|  }
 1088|       |
 1089|       |  // don't bother doing this for small tables
 1090|      0|  if (ps.size() * ps[0].patterns.size() < 100) {
  ------------------
  |  Branch (1090:7): [True: 0, False: 0]
  ------------------
 1091|      0|    return false;
 1092|      0|  }
 1093|       |
 1094|       |  // the logic in makeColRowsetCalcExpr assumes column counts fit in a byte
 1095|      0|  if (ps[0].patterns.size() > 256) {
  ------------------
  |  Branch (1095:7): [True: 0, False: 0]
  ------------------
 1096|      0|    return false;
 1097|      0|  }
 1098|       |
 1099|       |  // OK let's do it!
 1100|      0|  return true;
 1101|      0|}
_ZN6hobbes20makeColPivotDFAStateEPNS_4MDFAERKSt6vectorINS_10PatternRowESaIS3_EE:
 1162|    886|stateidx_t makeColPivotDFAState(MDFA* dfa, const PatternRows& ps) {
 1163|    886|  stateidx_t result = nullState;
 1164|       |
 1165|       |  // choose a column to deconstruct
 1166|       |  // if no column can be chosen, there is only one path -- the immediate return expression
 1167|    886|  size_t c = choosePivotColumn(ps);
 1168|    886|  if (c < ps[0].patterns.size()) {
  ------------------
  |  Branch (1168:7): [True: 131, False: 755]
  ------------------
 1169|    131|    if (dfa->inPrimSel || !isPrimSelection(dfa->c->alwaysLowerPrimMatchTables(), ps)) {
  ------------------
  |  Branch (1169:9): [True: 0, False: 131]
  |  Branch (1169:27): [True: 131, False: 0]
  ------------------
 1170|    131|      result = addState(dfa, makeSuccState(dfa, ps, c));
 1171|    131|    } else {
 1172|      0|      dfa->inPrimSel = true;
 1173|      0|      MStatePtr succState = makeSuccState(dfa, ps, c);
 1174|      0|      dfa->inPrimSel = false;
 1175|       |
 1176|      0|      succState->isPrimMatchRoot = true;
 1177|      0|      succState->primFArgs       = makePrimFArgs(ps);
 1178|      0|      result = addState(dfa, succState);
 1179|      0|    }
 1180|    755|  } else if (ps[0].guard) {
  ------------------
  |  Branch (1180:14): [True: 6, False: 749]
  ------------------
 1181|      6|    SwitchVal::Jumps jmps;
 1182|      6|    jmps.push_back(SwitchVal::Jump(PrimitivePtr(new Bool(true, dfa->rootLA)), addState(dfa, MStatePtr(new FinishExpr(ps[0].result)))));
 1183|       |
 1184|      6|    PatternRows tail;
 1185|      6|    tableTail(&tail, ps);
 1186|      6|    if (tail.empty()) {
  ------------------
  |  Branch (1186:9): [True: 0, False: 6]
  ------------------
 1187|      0|      throw annotated_error(*ps[0].guard, "Inexhaustive patterns in match expression after guard");
 1188|      0|    }
 1189|       |
 1190|      6|    size_t guardS = addState(dfa, MStatePtr(new SwitchVal(".guardcheck", jmps, makeDFAState(dfa, tail))));
 1191|       |
 1192|      6|    LoadVars::Defs ds;
 1193|      6|    ds.push_back(LoadVars::Def(".guardcheck", ps[0].guard));
 1194|      6|    result = addState(dfa, MStatePtr(new LoadVars(ds, guardS)));
 1195|    749|  } else {
 1196|    749|    result = addState(dfa, MStatePtr(new FinishExpr(ps[0].result)));
 1197|    749|  }
 1198|       |
 1199|       |  // next time we come through, just use the state implied by the table config
 1200|    886|  dfa->tableCfgStates[ps] = result;
 1201|       |
 1202|       |  // and that's it
 1203|    886|  return result;
 1204|    886|}
_ZN6hobbes12makeDFAStateEPNS_4MDFAERKSt6vectorINS_10PatternRowESaIS3_EE:
 1273|    912|stateidx_t makeDFAState(MDFA* dfa, const PatternRows& xps) {
 1274|    912|  MatchDepth depth(dfa);
 1275|    912|  if (dfa->stateDepth > maxMatchDFADepth) {
  ------------------
  |  Branch (1275:7): [True: 0, False: 912]
  ------------------
 1276|      0|    throw annotated_error(dfa->rootLA, "match expression is too complex to compile (nests more than " + str::from(maxMatchDFADepth) + " states deep)");
 1277|      0|  }
 1278|       |
 1279|    912|  PatternRows ps;
 1280|    912|  dropUnusedColumns(&ps, xps);
 1281|       |
 1282|    912|  if (!ps.empty()) {
  ------------------
  |  Branch (1282:7): [True: 912, False: 0]
  ------------------
 1283|       |    // charged against what is left of the budget, so the sum cannot wrap
 1284|    912|    const size_t cells = ps.size() * ps[0].patterns.size();
 1285|    912|    if (cells > maxMatchTableCells - dfa->tableCells) {
  ------------------
  |  Branch (1285:9): [True: 0, False: 912]
  ------------------
 1286|      0|      throw annotated_error(dfa->rootLA, "match expression is too complex to compile (needs more than " + str::from(maxMatchTableCells) + " pattern table cells)");
 1287|      0|    }
 1288|    912|    dfa->tableCells += cells;
 1289|    912|  }
 1290|       |
 1291|       |  // if we can deconstruct strings here, do it before anything else
 1292|       |  // (it has a potential runtime performance impact and should only be done to reduce compilation time for large schemas)
 1293|    912|  size_t strc = canMakeCharArrStateAtColumn(dfa, ps);
 1294|    912|  if (strc < ps[0].patterns.size()) {
  ------------------
  |  Branch (1294:7): [True: 2, False: 910]
  ------------------
 1295|      2|    return addState(dfa, makeCharArrayState(dfa, ps, strc));
 1296|      2|  }
 1297|       |
 1298|       |  // did we already produce this state?  if so, just add to its ref-count and return it
 1299|    910|  auto tcfg = dfa->tableCfgStates.find(ps);
 1300|    910|  if (tcfg != dfa->tableCfgStates.end()) {
  ------------------
  |  Branch (1300:7): [True: 24, False: 886]
  ------------------
 1301|     24|    addRef(dfa, tcfg->second);
 1302|     24|    return tcfg->second;
 1303|     24|  }
 1304|       |
 1305|       |  // for very large tables, we can avoid giant DFAs and long compile times by column-wise decomposition
 1306|       |  // otherwise, create a branch point with sub-tables based on a chosen column
 1307|    886|  if (shouldDecomposeColumnwise(dfa, ps)) {
  ------------------
  |  Branch (1307:7): [True: 0, False: 886]
  ------------------
 1308|      0|    return makeColAggrDFAState(dfa, ps);
 1309|    886|  } else {
 1310|    886|    return makeColPivotDFAState(dfa, ps);
 1311|    886|  }
 1312|    886|}
_ZN6hobbes7makeDFAEPNS_4MDFAERKSt6vectorINS_10PatternRowESaIS3_EERKNS_17LexicalAnnotationE:
 1315|    669|stateidx_t makeDFA(MDFA* dfa, const PatternRows& ps, const LexicalAnnotation& la) {
 1316|    669|  dfa->rootLA = la;
 1317|       |
 1318|       |  // every regex column is matched by one function, over all of its regexes
 1319|    669|  collectColumnRegexes(&dfa->columnRegexes, ps);
 1320|       |
 1321|       |  // start by adding 0-ref states and placeholder parameters for each final expression
 1322|    669|  std::vector<stateidx_t> finalStates;
 1323|    755|  for (const auto& pr : ps) {
  ------------------
  |  Branch (1323:23): [True: 755, False: 669]
  ------------------
 1324|    755|    stateidx_t fst = addState(dfa, MStatePtr(new FinishExpr(pr.result)), false);
 1325|    755|    finalStates.push_back(fst);
 1326|    755|    dfa->exprIdxs[pr.result.get()] = fst;
 1327|    755|  }
 1328|       |
 1329|       |  // recursively add states for each step of deconstruction of the match table
 1330|    669|  stateidx_t rootS = makeDFAState(dfa, ps);
 1331|       |
 1332|       |  // make sure that every provided final state is reachable
 1333|    669|  if (dfa->c->requireMatchReachability()) {
  ------------------
  |  Branch (1333:7): [True: 669, False: 0]
  ------------------
 1334|    669|    std::vector<size_t> unreachableRows;
 1335|  1.42k|    for (size_t r = 0; r < ps.size(); ++r) {
  ------------------
  |  Branch (1335:24): [True: 755, False: 669]
  ------------------
 1336|    755|      size_t fs = finalStates[r];
 1337|       |
 1338|    755|      if (dfa->states[fs]->refs == 0) {
  ------------------
  |  Branch (1338:11): [True: 0, False: 755]
  ------------------
 1339|      0|        unreachableRows.push_back(r);
 1340|      0|      }
 1341|    755|    }
 1342|       |
 1343|    669|    if (!unreachableRows.empty()) {
  ------------------
  |  Branch (1343:9): [True: 0, False: 669]
  ------------------
 1344|      0|      std::ostringstream fss;
 1345|      0|      fss << "Unreachable row" << (unreachableRows.size() > 1 ? "s" : "") << " in match expression:\n";
  ------------------
  |  Branch (1345:36): [True: 0, False: 0]
  ------------------
 1346|      0|      for (size_t ur : unreachableRows) {
  ------------------
  |  Branch (1346:22): [True: 0, False: 0]
  ------------------
 1347|      0|        fss << "  " << show(ps[ur]) << std::endl;
 1348|      0|      }
 1349|      0|      if (dfa->c->ignoreUnreachableMatches()) {
  ------------------
  |  Branch (1349:11): [True: 0, False: 0]
  ------------------
 1350|      0|        dfa->c->gatherUnreachableMatches({.la = la, .lines = fss.str()});
 1351|      0|      } else {
 1352|      0|        throw annotated_error(la, fss.str());
 1353|      0|      }
 1354|      0|    }
 1355|    669|  }
 1356|       |
 1357|    669|  if (dfa->c->unreachableMatchRowsPtr) {
  ------------------
  |  Branch (1357:7): [True: 0, False: 669]
  ------------------
 1358|      0|    dfa->c->unreachableMatchRowsPtr->reserve(ps.size());
 1359|      0|    for (size_t r = 0; r < ps.size(); ++r) {
  ------------------
  |  Branch (1359:24): [True: 0, False: 0]
  ------------------
 1360|      0|      size_t fs = finalStates[r];
 1361|       |
 1362|      0|      if (dfa->states[fs]->refs == 0) {
  ------------------
  |  Branch (1362:11): [True: 0, False: 0]
  ------------------
 1363|      0|        dfa->c->unreachableMatchRowsPtr->emplace_back(r, ps[r]);
 1364|      0|      }
 1365|      0|    }
 1366|      0|  }
 1367|       |
 1368|       |  // OK, this is a good DFA
 1369|    669|  return rootS;
 1370|    669|}
_ZN6hobbes9checkExprERKSt6vectorISt4pairISt10shared_ptrINS_4ExprEES2_INS_9PrimitiveEEESaIS7_EERKNS_17LexicalAnnotationE:
 1422|     12|ExprPtr checkExpr(const ExprChecks& cs, const LexicalAnnotation& la) {
 1423|     12|  if (cs.empty()) {
  ------------------
  |  Branch (1423:7): [True: 0, False: 12]
  ------------------
 1424|      0|    throw annotated_error(la, "Internal error, can't produce empty check expression");
 1425|     12|  } else {
 1426|     12|    ExprPtr v = fncall(var("===", la), list(cs[0].first, std::dynamic_pointer_cast<Expr>(cs[0].second)), la);
 1427|       |
 1428|     12|    for (size_t i = 1; i < cs.size(); ++i) {
  ------------------
  |  Branch (1428:24): [True: 0, False: 12]
  ------------------
 1429|      0|      v = fncall(var("and", la), list(v, fncall(var("===", la), list(cs[i].first, std::dynamic_pointer_cast<Expr>(cs[i].second)), la)), la);
 1430|      0|    }
 1431|       |
 1432|     12|    return v;
 1433|     12|  }
 1434|     12|}
_ZN6hobbes17compressToIfCheckEPNS_4MDFAERKNS_9SwitchValEPNS_7IfCheckE:
 1444|     19|bool compressToIfCheck(MDFA* dfa, const SwitchVal& sv, IfCheck* out) {
 1445|     19|  if (sv.jumps().size() == 1) {
  ------------------
  |  Branch (1445:7): [True: 12, False: 7]
  ------------------
 1446|     12|    if (out->falseb == nullState || out->falseb == sv.defaultState()) {
  ------------------
  |  Branch (1446:9): [True: 12, False: 0]
  |  Branch (1446:37): [True: 0, False: 0]
  ------------------
 1447|     12|      out->check.push_back(ExprCheck(varName(dfa, sv.switchVar()), sv.jumps()[0].first));
 1448|     12|      out->trueb  = sv.jumps()[0].second;
 1449|     12|      out->falseb = sv.defaultState();
 1450|       |
 1451|     12|      if (const SwitchVal* nsv = is<SwitchVal>(dfa->states[out->trueb])) {
  ------------------
  |  Branch (1451:28): [True: 0, False: 12]
  ------------------
 1452|      0|        compressToIfCheck(dfa, *nsv, out);
 1453|      0|        return true;
 1454|     12|      } else {
 1455|     12|        return true;
 1456|     12|      }
 1457|     12|    } else {
 1458|      0|      return false;
 1459|      0|    }
 1460|     12|  } else {
 1461|      7|    return false;
 1462|      7|  }
 1463|     19|}
_ZN6hobbes32liftDFAExprWithSwitchCompressionEPNS_4MDFAEm:
 1465|    929|ExprPtr liftDFAExprWithSwitchCompression(MDFA* dfa, stateidx_t state) {
 1466|    929|  const MStatePtr& s = dfa->states[state];
 1467|       |
 1468|    929|  if (const SwitchVal* sv = is<SwitchVal>(s)) {
  ------------------
  |  Branch (1468:24): [True: 19, False: 910]
  ------------------
 1469|     19|    IfCheck ifc;
 1470|     19|    if (compressToIfCheck(dfa, *sv, &ifc)) {
  ------------------
  |  Branch (1470:9): [True: 12, False: 7]
  ------------------
 1471|     12|      return fncall(var("if", dfa->rootLA), list(checkExpr(ifc.check, dfa->rootLA), liftDFAExpr(dfa, ifc.trueb), liftDFAExpr(dfa, ifc.falseb)), dfa->rootLA);
 1472|     12|    }
 1473|     19|  }
 1474|       |
 1475|    917|  return switchOf(s, liftDFAExprF(dfa));
 1476|    929|}
_ZN6hobbes18dfaInlineThresholdEv:
 1496|    897|size_t dfaInlineThreshold() {
 1497|    897|  static const size_t inlineThreshold = [] {
 1498|    897|    const char* v = std::getenv("HOBBES_DFA_INLINE_THRESHOLD");
 1499|    897|    if (v == nullptr) {
 1500|    897|      return static_cast<size_t>(100);
 1501|    897|    }
 1502|    897|    const auto i = strtoul(v, nullptr, 10);
 1503|    897|    return i == 0 ? std::numeric_limits<size_t>::max() : static_cast<size_t>(i);
 1504|    897|  }();
 1505|    897|  return inlineThreshold;
 1506|    897|}
_ZN6hobbes17shouldInlineStateEPKNS_4MDFAEm:
 1508|    937|bool shouldInlineState(const MDFA* dfa, stateidx_t state) {
 1509|    937|  const MStatePtr& s = dfa->states[state];
 1510|       |
 1511|    937|  if (dfa->states[state]->isPrimMatchRoot) {
  ------------------
  |  Branch (1511:7): [True: 0, False: 937]
  ------------------
 1512|      0|    return false;
 1513|    937|  } else if (s->refs <= 1 && dfa->inlinedStates < dfaInlineThreshold()) {
  ------------------
  |  Branch (1513:14): [True: 897, False: 40]
  |  Branch (1513:30): [True: 897, False: 0]
  ------------------
 1514|    897|    return true;
 1515|    897|  } else if (const FinishExpr* fe = is<FinishExpr>(s)) {
  ------------------
  |  Branch (1515:32): [True: 40, False: 0]
  ------------------
 1516|     40|    return isConst(fe->expr()) || (is<Var>(fe->expr()) != nullptr);
  ------------------
  |  Branch (1516:12): [True: 20, False: 20]
  |  Branch (1516:35): [True: 8, False: 12]
  ------------------
 1517|     40|  } else {
 1518|      0|    return false;
 1519|      0|  }
 1520|    937|}
_ZN6hobbes11liftDFAExprEPNS_4MDFAEm:
 1524|    937|ExprPtr liftDFAExpr(MDFA* dfa, stateidx_t state) {
 1525|    937|  if (shouldInlineState(dfa, state)) {
  ------------------
  |  Branch (1525:7): [True: 925, False: 12]
  ------------------
 1526|    925|    ++dfa->inlinedStates;
 1527|    925|    return liftDFAExprWithSwitchCompression(dfa, state);
 1528|    925|  } else {
 1529|     12|    FoldedStateCalls::const_iterator fsc = dfa->foldedStateCalls.find(state);
 1530|       |
 1531|     12|    if (fsc != dfa->foldedStateCalls.end()) {
  ------------------
  |  Branch (1531:9): [True: 8, False: 4]
  ------------------
 1532|      8|      return fsc->second;
 1533|      8|    } else if (dfa->states[state]->isPrimMatchRoot) {
  ------------------
  |  Branch (1533:16): [True: 0, False: 4]
  ------------------
 1534|      0|      return liftPrimMatchExpr(dfa, state);
 1535|      4|    } else {
 1536|       |      // a folded state starts a function of its own, with its own room to inline into
 1537|      4|      size_t   outerInlined = dfa->inlinedStates;
 1538|      4|      dfa->inlinedStates = 0;
 1539|      4|      ExprPtr  def   = liftDFAExprWithSwitchCompression(dfa, state);
 1540|      4|      dfa->inlinedStates = outerInlined;
 1541|       |      // the state function takes the variables it uses as arguments, except
 1542|       |      // those it can reach anyway: globals, and the state functions lifted
 1543|       |      // before it. Asking the environment about each free variable is much
 1544|       |      // cheaper than enumerating every global for every fold (boot alone
 1545|       |      // folds over six hundred states against thousands of globals)
 1546|      4|      str::seq fvns;
 1547|      4|      for (const auto& fvn : freeVars(def)) {
  ------------------
  |  Branch (1547:28): [True: 2, False: 4]
  ------------------
 1548|      2|        if (dfa->liftedStateFns.count(fvn) == 0 && !dfa->c->typeEnv()->hasBinding(fvn)) {
  ------------------
  |  Branch (1548:13): [True: 2, False: 0]
  |  Branch (1548:52): [True: 1, False: 1]
  ------------------
 1549|      1|          fvns.push_back(fvn);
 1550|      1|        }
 1551|      2|      }
 1552|       |
 1553|      4|      std::string stateFn = ".patfs." + str::from(state);
 1554|      4|      ExprPtr callexp = fncall(varName(dfa, stateFn), vars(fvns, dfa->rootLA), dfa->rootLA);
 1555|       |
 1556|      4|      dfa->foldedStates.push_back(FoldedState(stateFn, ExprPtr(new Fn(fvns, def, dfa->rootLA))));
 1557|      4|      dfa->foldedStateCalls[state] = callexp;
 1558|      4|      dfa->liftedStateFns.insert(stateFn);
 1559|       |
 1560|      4|      return callexp;
 1561|      4|    }
 1562|     12|  }
 1563|    937|}
_ZN6hobbes11liftDFAExprEPNS_2ccERKSt6vectorINS_10PatternRowESaIS3_EERKNS_17LexicalAnnotationE:
 1565|    669|ExprPtr liftDFAExpr(cc* c, const PatternRows& ps, const LexicalAnnotation& rootLA) {
 1566|    669|  MDFA pdfa;
 1567|    669|  pdfa.c         = c;
 1568|    669|  pdfa.inPrimSel = false;
 1569|       |
 1570|    669|  stateidx_t initState = makeDFA(&pdfa, ps, rootLA);
 1571|    669|  ExprPtr    me        = liftDFAExpr(&pdfa, initState);
 1572|       |
 1573|    669|  if (pdfa.foldedStates.empty()) {
  ------------------
  |  Branch (1573:7): [True: 665, False: 4]
  ------------------
 1574|    665|    return me;
 1575|    665|  } else {
 1576|      4|    LetRec::Bindings bs;
 1577|      4|    for (const auto& fs : pdfa.foldedStates) {
  ------------------
  |  Branch (1577:25): [True: 4, False: 4]
  ------------------
 1578|      4|      bs.push_back(LetRec::Binding(fs.first, fs.second));
 1579|      4|    }
 1580|      4|    return ExprPtr(new LetRec(bs, me, rootLA));
 1581|      4|  }
 1582|    669|}
_ZN6hobbes21collectColumnRegexesFC2EPSt13unordered_mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS_13ColumnRegexesESt4hashIS7_ESt8equal_toIS7_ESaISt4pairIKS7_S8_EEE:
  713|    669|  explicit collectColumnRegexesF(ColumnRegexTables* out) : out(out) { }
_ZNK6hobbes21collectColumnRegexesF4withEPKNS_12MatchLiteralE:
  726|     25|  UnitV with(const MatchLiteral*) const override { return unitv; }
_ZNK6hobbes21collectColumnRegexesF4withEPKNS_8MatchAnyE:
  725|    868|  UnitV with(const MatchAny*)     const override { return unitv; }
_ZNK6hobbes21collectColumnRegexesF4withEPKNS_10MatchArrayE:
  728|     12|  UnitV with(const MatchArray* x) const override {
  729|     12|    try {
  730|     12|      PatternPtr rp = MatchRegex::toRegex(*x);
  731|     12|      add(this->out, x->name(), is<MatchRegex>(rp)->value());
  732|     12|    } catch (std::exception&) {
  733|      6|    }
  734|     31|    for (size_t i = 0; i < x->size(); ++i) {
  ------------------
  |  Branch (734:24): [True: 19, False: 12]
  ------------------
  735|     19|      switchOf(x->pattern(i), *this);
  736|     19|    }
  737|     12|    return unitv;
  738|     12|  }
_ZNK6hobbes21collectColumnRegexesF4withEPKNS_10MatchRegexE:
  727|      2|  UnitV with(const MatchRegex* x) const override { add(this->out, x->name(), x->value()); return unitv; }
_ZNK6hobbes21collectColumnRegexesF4withEPKNS_11MatchRecordE:
  739|     44|  UnitV with(const MatchRecord* x) const override {
  740|    135|    for (size_t i = 0; i < x->size(); ++i) {
  ------------------
  |  Branch (740:24): [True: 91, False: 44]
  ------------------
  741|     91|      switchOf(x->pattern(i).second, *this);
  742|     91|    }
  743|     44|    return unitv;
  744|     44|  }
_ZNK6hobbes21collectColumnRegexesF4withEPKNS_12MatchVariantE:
  745|     89|  UnitV with(const MatchVariant* x) const override {
  746|     89|    switchOf(x->value(), *this);
  747|     89|    return unitv;
  748|     89|  }
_ZN6hobbes21collectColumnRegexesF3addEPSt13unordered_mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS_13ColumnRegexesESt4hashIS7_ESt8equal_toIS7_ESaISt4pairIKS7_S8_EEERSE_RKSt10shared_ptrINS_5RegexEE:
  715|     10|  static void add(ColumnRegexTables* out, const std::string& name, const RegexPtr& r) {
  716|     10|    ColumnRegexes& crs = (*out)[name];
  717|     10|    rejectOversizedRegex(r);
  718|     10|    const std::string k = regexKey(r);
  719|     10|    if (crs.index.find(k) == crs.index.end()) {
  ------------------
  |  Branch (719:9): [True: 8, False: 2]
  ------------------
  720|      8|      crs.index[k] = crs.regexes.size();
  721|      8|      crs.regexes.push_back(r);
  722|      8|    }
  723|     10|  }
_ZN6hobbes14makeSuccStateFC2EPNS_4MDFAERKSt6vectorINS_10PatternRowESaIS4_EEm:
  909|    131|  makeSuccStateF(MDFA* dfa, const PatternRows& ps, size_t c) : dfa(dfa), ps(ps), c(c) { }
_ZNK6hobbes14makeSuccStateF4withEPKNS_12MatchLiteralE:
  915|     14|  MStatePtr with(const MatchLiteral*) const override { return makeLiteralState(dfa, ps, c); }
_ZNK6hobbes14makeSuccStateF4withEPKNS_10MatchArrayE:
  922|      4|  MStatePtr with(const MatchArray*) const override {
  923|     13|    for (const auto &p : ps) {
  ------------------
  |  Branch (923:24): [True: 13, False: 4]
  ------------------
  924|     13|      if (is<MatchRegex>(p.patterns[c]) != nullptr) {
  ------------------
  |  Branch (924:11): [True: 0, False: 13]
  ------------------
  925|      0|        return makeRegexState(dfa, regexNormalize(ps, c), c);
  926|      0|      }
  927|     13|    }
  928|      4|    return makeArrayState(dfa, ps, c);
  929|      4|  }
_ZN6hobbes14makeSuccStateF14regexNormalizeERKSt6vectorINS_10PatternRowESaIS2_EEm:
  933|      1|  static PatternRows regexNormalize(const PatternRows& ps, size_t c) {
  934|      1|    PatternRows nps = ps;
  935|      3|    for (auto &np : nps) {
  ------------------
  |  Branch (935:19): [True: 3, False: 1]
  ------------------
  936|      3|      if (const MatchArray* ma = is<MatchArray>(np.patterns[c])) {
  ------------------
  |  Branch (936:29): [True: 0, False: 3]
  ------------------
  937|      0|        np.patterns[c] = MatchRegex::toRegex(*ma);
  938|      0|      }
  939|      3|    }
  940|      1|    return nps;
  941|      1|  }
_ZNK6hobbes14makeSuccStateF4withEPKNS_10MatchRegexE:
  916|      1|  MStatePtr with(const MatchRegex*)   const override { return makeRegexState(dfa, regexNormalize(ps, c), c); }
_ZNK6hobbes14makeSuccStateF4withEPKNS_11MatchRecordE:
  917|     36|  MStatePtr with(const MatchRecord*)  const override { return makeRecordState(dfa, ps, c); }
_ZNK6hobbes14makeSuccStateF4withEPKNS_12MatchVariantE:
  918|     76|  MStatePtr with(const MatchVariant*) const override { return makeVariantState(dfa, ps, c); }
_ZNK6hobbes13scorePatternF4withEPKNS_12MatchLiteralE:
  958|     38|  size_t with(const MatchLiteral* ml) const override {
  959|     38|    return this->recprims.insert(ml->equivConstant()).second ? 1 : 0;
  ------------------
  |  Branch (959:12): [True: 34, False: 4]
  ------------------
  960|     38|  }
_ZNK6hobbes13scorePatternF4withEPKNS_8MatchAnyE:
  954|    395|  size_t with(const MatchAny*) const override {
  955|    395|    return 0;
  956|    395|  }
_ZNK6hobbes13scorePatternF4withEPKNS_10MatchArrayE:
  962|      8|  size_t with(const MatchArray* ma) const override {
  963|      8|    size_t s = 1;
  964|     16|    for (size_t i = 0; i < ma->size(); ++i) {
  ------------------
  |  Branch (964:24): [True: 8, False: 8]
  ------------------
  965|      8|      s += switchOf(ma->pattern(i), *this);
  966|      8|    }
  967|      8|    return s;
  968|      8|  }
_ZNK6hobbes13scorePatternF4withEPKNS_10MatchRegexE:
  970|      2|  size_t with(const MatchRegex*) const override {
  971|      2|    return 1;
  972|      2|  }
_ZNK6hobbes13scorePatternF4withEPKNS_11MatchRecordE:
  974|     81|  size_t with(const MatchRecord* mr) const override {
  975|     81|    size_t s = 0;
  976|    247|    for (size_t i = 0; i < mr->size(); ++i) {
  ------------------
  |  Branch (976:24): [True: 166, False: 81]
  ------------------
  977|    166|      s += switchOf(mr->pattern(i).second, *this);
  978|    166|    }
  979|     81|    return s;
  980|     81|  }
_ZNK6hobbes13scorePatternF4withEPKNS_12MatchVariantE:
  982|    128|  size_t with(const MatchVariant* mv) const override {
  983|    128|    return 1 + switchOf(mv->value(), *this);
  984|    128|  }
_ZN6hobbes10MatchDepthC2EPNS_4MDFAE:
 1266|    912|  explicit MatchDepth(MDFA* dfa) : dfa(dfa) { ++this->dfa->stateDepth; }
_ZN6hobbes10MatchDepthD2Ev:
 1267|    912|  ~MatchDepth() { --this->dfa->stateDepth; }
_ZN6hobbes7IfCheckC2Ev:
 1437|     19|  IfCheck() : trueb(nullState), falseb(nullState) { }
_ZN6hobbes12liftDFAExprFC2EPNS_4MDFAE:
 1377|    917|  liftDFAExprF(MDFA* dfa) : dfa(dfa) { }
_ZNK6hobbes12liftDFAExprF4withEPKNS_8LoadVarsE:
 1379|     63|  ExprPtr with(const LoadVars* x) const override {
 1380|     63|    const LoadVars::Defs& ds = x->defs();
 1381|     63|    ExprPtr b = liftDFAExpr(this->dfa, x->nextState());
 1382|       |
 1383|    174|    for (auto d = ds.rbegin(); d != ds.rend(); ++d) {
  ------------------
  |  Branch (1383:32): [True: 111, False: 63]
  ------------------
 1384|    111|      b = let(d->first, d->second, b, dfa->rootLA);
 1385|    111|    }
 1386|       |
 1387|     63|    return b;
 1388|     63|  }
_ZNK6hobbes12liftDFAExprF4withEPKNS_9SwitchValE:
 1390|      7|  ExprPtr with(const SwitchVal* x) const override {
 1391|      7|    ExprPtr def = x->defaultState() == nullState ? ExprPtr() : liftDFAExpr(this->dfa, x->defaultState());
  ------------------
  |  Branch (1391:19): [True: 0, False: 7]
  ------------------
 1392|       |
 1393|      7|    const SwitchVal::Jumps& jmps = x->jumps();
 1394|      7|    Switch::Bindings bs;
 1395|     14|    for (const auto& jmp : jmps) {
  ------------------
  |  Branch (1395:26): [True: 14, False: 7]
  ------------------
 1396|     14|      bs.push_back(Switch::Binding(jmp.first, liftDFAExpr(this->dfa, jmp.second)));
 1397|     14|    }
 1398|       |
 1399|      7|    return ExprPtr(new Switch(varName(this->dfa, x->switchVar()), bs, def, dfa->rootLA));
 1400|      7|  }
_ZNK6hobbes12liftDFAExprF4withEPKNS_13SwitchVariantE:
 1402|     76|  ExprPtr with(const SwitchVariant* x) const override {
 1403|     76|    ExprPtr def = x->defaultState() == nullState ? ExprPtr() : liftDFAExpr(this->dfa, x->defaultState());
  ------------------
  |  Branch (1403:19): [True: 0, False: 76]
  ------------------
 1404|       |
 1405|     76|    const SwitchVariant::CtorJumps& jmps = x->jumps();
 1406|     76|    Case::Bindings bs;
 1407|     84|    for (const auto& jmp : jmps) {
  ------------------
  |  Branch (1407:26): [True: 84, False: 76]
  ------------------
 1408|     84|      bs.push_back(Case::Binding(jmp.first, x->switchVar() + ".1", liftDFAExpr(this->dfa, jmp.second)));
 1409|     84|    }
 1410|       |
 1411|     76|    return ExprPtr(new Case(varName(this->dfa, x->switchVar()), bs, def, dfa->rootLA));
 1412|     76|  }
_ZNK6hobbes12liftDFAExprF4withEPKNS_10FinishExprE:
 1414|    771|  ExprPtr with(const FinishExpr* x) const override {
 1415|    771|    return x->expr();
 1416|    771|  }
dfa.C:_ZZN6hobbes18dfaInlineThresholdEvENK3$_0clEv:
 1497|      1|  static const size_t inlineThreshold = [] {
 1498|      1|    const char* v = std::getenv("HOBBES_DFA_INLINE_THRESHOLD");
 1499|      1|    if (v == nullptr) {
  ------------------
  |  Branch (1499:9): [True: 1, False: 0]
  ------------------
 1500|      1|      return static_cast<size_t>(100);
 1501|      1|    }
 1502|      0|    const auto i = strtoul(v, nullptr, 10);
 1503|      0|    return i == 0 ? std::numeric_limits<size_t>::max() : static_cast<size_t>(i);
  ------------------
  |  Branch (1503:12): [True: 0, False: 0]
  ------------------
 1504|      1|  }();
_ZN6hobbes14makeSplitStateINS_12MatchLiteralESt10shared_ptrINS_9PrimitiveEETnPFT0_RKT_EXadL_ZNS_8litValueERKS1_EETnPFvS8_PSt6vectorINS_10PatternRowESaISE_EERKSE_mEXadL_ZNS_15makeLitSplitRowESC_SH_SJ_mEETnPFvS5_SH_SJ_mEXadL_ZNS_12makeLSAnyRowES4_SH_SJ_mEETnPFmRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_PNS_4MDFAERKSG_EXadL_ZNS_15makeLSSuccStateESV_S4_SX_SZ_EETnPFS2_INS_6MStateEESV_SX_RKSD_ISt4pairIS5_mESaIS15_EEmEXadL_ZNS_12makeLSSwitchESV_SX_RKSD_IS14_IS4_mESaIS1C_EEmEENS_9PrimPtrLTEEES13_SX_SZ_m:
  324|     14|MStatePtr makeSplitState(MDFA* dfa, const PatternRows& ps, size_t c) {
  325|     14|  using Branches = std::map<SValue, PatternRows, SVLT>;
  326|     14|  using BranchOrder = std::map<SValue, size_t>;
  327|       |
  328|     14|  Branches    bs;
  329|     14|  BranchOrder bos;
  330|     14|  Idxs        anys;
  331|     14|  PatternRows def;
  332|       |
  333|       |  // accumulate branches for fixed cases
  334|     40|  for (size_t r = 0; r < ps.size(); ++r) {
  ------------------
  |  Branch (334:22): [True: 26, False: 14]
  ------------------
  335|     26|    if (const MType* mt = is<MType>(ps[r].patterns[c])) {
  ------------------
  |  Branch (335:22): [True: 18, False: 8]
  ------------------
  336|     18|      SValue sv = svalueF(*mt);
  337|     18|      if (bs.find(sv) == bs.end()) {
  ------------------
  |  Branch (337:11): [True: 18, False: 0]
  ------------------
  338|     18|        bos[sv] = bs.size(); // remember branch introduction order (this is important for variants)
  339|     18|      }
  340|     18|      PatternRows& outrs = bs[sv];
  341|       |
  342|       |      // the first time through this branch, we need to make sure that prior match-any rows are prepended
  343|     18|      if (outrs.empty()) {
  ------------------
  |  Branch (343:11): [True: 18, False: 0]
  ------------------
  344|     18|        for (auto i : anys) {
  ------------------
  |  Branch (344:21): [True: 0, False: 18]
  ------------------
  345|      0|          makeMatchAnyRow(sv, &outrs, ps[i], c);
  346|      0|        }
  347|     18|      }
  348|       |
  349|       |      // add this row to the fixed branch
  350|     18|      makeMatchRow(*mt, &outrs, ps[r], c);
  351|     18|    } else if (is<MatchAny>(ps[r].patterns[c])) {
  ------------------
  |  Branch (351:16): [True: 8, False: 0]
  ------------------
  352|       |      // record where this match-any came from, then append it to all states recorded so far
  353|      8|      anys.push_back(r);
  354|       |
  355|     20|      for (auto b = bs.begin(); b != bs.end(); ++b) {
  ------------------
  |  Branch (355:33): [True: 12, False: 8]
  ------------------
  356|     12|        makeMatchAnyRow(b->first, &b->second, ps[r], c);
  357|     12|      }
  358|      8|    } else {
  359|      0|      throw annotated_error(dfa->rootLA, "Internal error, invalid pattern table received");
  360|      0|    }
  361|     26|  }
  362|       |
  363|       |  // now accumulate 'catch-all' rows into the default state
  364|     14|  for (auto i : anys) {
  ------------------
  |  Branch (364:15): [True: 8, False: 14]
  ------------------
  365|      8|    copyRowWithoutColumn(&def, ps[i], c);
  366|      8|  }
  367|       |
  368|       |  // finally, pull the branch and default jumps together (in introduction order) and make the new state
  369|     14|  using Jump = std::pair<SValue, stateidx_t>;
  370|     14|  using Jumps = std::vector<Jump>;
  371|     14|  Jumps jmps;
  372|       |
  373|     14|  jmps.resize(bs.size());
  374|     18|  for (const auto& b : bs) {
  ------------------
  |  Branch (374:22): [True: 18, False: 14]
  ------------------
  375|     18|    jmps[bos[b.first]] = Jump(b.first, makeNextState(ps[0].patterns[c]->name(), b.first, dfa, b.second));
  376|     18|  }
  377|       |
  378|     14|  stateidx_t defState = !def.empty() ? makeDFAState(dfa, def) : nullState;
  ------------------
  |  Branch (378:25): [True: 8, False: 6]
  ------------------
  379|       |
  380|     14|  return makeSwitchState(ps[0].patterns[c]->name(), dfa, jmps, defState);
  381|     14|}
_ZN6hobbes14makeSplitStateINS_10MatchArrayEmTnPFT0_RKT_EXadL_ZNS_6maSizeERKS1_EETnPFvS5_PSt6vectorINS_10PatternRowESaISB_EERKSB_mEXadL_ZNS_13makeASplitRowES9_SE_SG_mEETnPFvS2_SE_SG_mEXadL_ZNS_12makeASAnyRowEmSE_SG_mEETnPFmRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES2_PNS_4MDFAERKSD_EXadL_ZNS_15makeASSuccStateESS_mSU_SW_EETnPFSt10shared_ptrINS_6MStateEESS_SU_RKSA_ISt4pairIS2_mESaIS13_EEmEXadL_ZNS_12makeASSwitchESS_SU_RKSA_IS12_ImmESaIS1A_EEmEESt4lessImEEES11_SU_SW_m:
  324|      4|MStatePtr makeSplitState(MDFA* dfa, const PatternRows& ps, size_t c) {
  325|      4|  using Branches = std::map<SValue, PatternRows, SVLT>;
  326|      4|  using BranchOrder = std::map<SValue, size_t>;
  327|       |
  328|      4|  Branches    bs;
  329|      4|  BranchOrder bos;
  330|      4|  Idxs        anys;
  331|      4|  PatternRows def;
  332|       |
  333|       |  // accumulate branches for fixed cases
  334|     17|  for (size_t r = 0; r < ps.size(); ++r) {
  ------------------
  |  Branch (334:22): [True: 13, False: 4]
  ------------------
  335|     13|    if (const MType* mt = is<MType>(ps[r].patterns[c])) {
  ------------------
  |  Branch (335:22): [True: 8, False: 5]
  ------------------
  336|      8|      SValue sv = svalueF(*mt);
  337|      8|      if (bs.find(sv) == bs.end()) {
  ------------------
  |  Branch (337:11): [True: 6, False: 2]
  ------------------
  338|      6|        bos[sv] = bs.size(); // remember branch introduction order (this is important for variants)
  339|      6|      }
  340|      8|      PatternRows& outrs = bs[sv];
  341|       |
  342|       |      // the first time through this branch, we need to make sure that prior match-any rows are prepended
  343|      8|      if (outrs.empty()) {
  ------------------
  |  Branch (343:11): [True: 6, False: 2]
  ------------------
  344|      6|        for (auto i : anys) {
  ------------------
  |  Branch (344:21): [True: 0, False: 6]
  ------------------
  345|      0|          makeMatchAnyRow(sv, &outrs, ps[i], c);
  346|      0|        }
  347|      6|      }
  348|       |
  349|       |      // add this row to the fixed branch
  350|      8|      makeMatchRow(*mt, &outrs, ps[r], c);
  351|      8|    } else if (is<MatchAny>(ps[r].patterns[c])) {
  ------------------
  |  Branch (351:16): [True: 5, False: 0]
  ------------------
  352|       |      // record where this match-any came from, then append it to all states recorded so far
  353|      5|      anys.push_back(r);
  354|       |
  355|     12|      for (auto b = bs.begin(); b != bs.end(); ++b) {
  ------------------
  |  Branch (355:33): [True: 7, False: 5]
  ------------------
  356|      7|        makeMatchAnyRow(b->first, &b->second, ps[r], c);
  357|      7|      }
  358|      5|    } else {
  359|      0|      throw annotated_error(dfa->rootLA, "Internal error, invalid pattern table received");
  360|      0|    }
  361|     13|  }
  362|       |
  363|       |  // now accumulate 'catch-all' rows into the default state
  364|      5|  for (auto i : anys) {
  ------------------
  |  Branch (364:15): [True: 5, False: 4]
  ------------------
  365|      5|    copyRowWithoutColumn(&def, ps[i], c);
  366|      5|  }
  367|       |
  368|       |  // finally, pull the branch and default jumps together (in introduction order) and make the new state
  369|      4|  using Jump = std::pair<SValue, stateidx_t>;
  370|      4|  using Jumps = std::vector<Jump>;
  371|      4|  Jumps jmps;
  372|       |
  373|      4|  jmps.resize(bs.size());
  374|      6|  for (const auto& b : bs) {
  ------------------
  |  Branch (374:22): [True: 6, False: 4]
  ------------------
  375|      6|    jmps[bos[b.first]] = Jump(b.first, makeNextState(ps[0].patterns[c]->name(), b.first, dfa, b.second));
  376|      6|  }
  377|       |
  378|      4|  stateidx_t defState = !def.empty() ? makeDFAState(dfa, def) : nullState;
  ------------------
  |  Branch (378:25): [True: 4, False: 0]
  ------------------
  379|       |
  380|      4|  return makeSwitchState(ps[0].patterns[c]->name(), dfa, jmps, defState);
  381|      4|}
_ZN6hobbes10translatepImEET_RKNS_10MatchArrayEm:
  525|      4|  T translatep(const MatchArray& ma, size_t i) {
  526|      4|    T x = 0;
  527|     36|    for (size_t j = 0; j < sizeof(T); ++j) {
  ------------------
  |  Branch (527:24): [True: 32, False: 4]
  ------------------
  528|     32|      x |= static_cast<T>(spatChar(ma, i + (sizeof(T) - 1 - j))) << (8 * j);
  529|     32|    }
  530|      4|    return x;
  531|      4|  }
_ZN6hobbes8spatCharERKNS_10MatchArrayEm:
  510|     32|inline unsigned char spatChar(const MatchArray& ma, size_t i) {
  511|     32|  if (i >= ma.size()) {
  ------------------
  |  Branch (511:7): [True: 21, False: 11]
  ------------------
  512|     21|    return 0;
  513|     21|  } else if (const MatchLiteral* ml = is<MatchLiteral>(ma.pattern(i))) {
  ------------------
  |  Branch (513:34): [True: 11, False: 0]
  ------------------
  514|     11|    if (const Char* c = is<Char>(ml->equivConstant())) {
  ------------------
  |  Branch (514:21): [True: 11, False: 0]
  ------------------
  515|     11|      return static_cast<unsigned char>(c->value());
  516|     11|    } else {
  517|      0|      throw annotated_error(*ml, "Internal error, can't unpack non-char as char");
  518|      0|    }
  519|     11|  } else {
  520|      0|    throw annotated_error(ma, "Internal error, can't unpack non-string as string");
  521|      0|  }
  522|     32|}
_ZN6hobbes14makeSplitStateINS_12MatchVariantENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEETnPFT0_RKT_EXadL_ZNS_7varCtorERKS1_EETnPFvSB_PSt6vectorINS_10PatternRowESaISH_EERKSH_mEXadL_ZNS_19makeVariantSplitRowESF_SK_SM_mEETnPFvS8_SK_SM_mEXadL_ZNS_12makeVSAnyRowES7_SK_SM_mEETnPFmRKS7_S8_PNS_4MDFAERKSJ_EXadL_ZNS_15makeVSSuccStateESS_S7_SU_SW_EETnPFSt10shared_ptrINS_6MStateEESS_SU_RKSG_ISt4pairIS8_mESaIS13_EEmEXadL_ZNS_12makeVSSwitchESS_SU_RKSG_IS12_IS7_mESaIS1A_EEmEESt4lessIS7_EEES11_SU_SW_m:
  324|     76|MStatePtr makeSplitState(MDFA* dfa, const PatternRows& ps, size_t c) {
  325|     76|  using Branches = std::map<SValue, PatternRows, SVLT>;
  326|     76|  using BranchOrder = std::map<SValue, size_t>;
  327|       |
  328|     76|  Branches    bs;
  329|     76|  BranchOrder bos;
  330|     76|  Idxs        anys;
  331|     76|  PatternRows def;
  332|       |
  333|       |  // accumulate branches for fixed cases
  334|    266|  for (size_t r = 0; r < ps.size(); ++r) {
  ------------------
  |  Branch (334:22): [True: 190, False: 76]
  ------------------
  335|    190|    if (const MType* mt = is<MType>(ps[r].patterns[c])) {
  ------------------
  |  Branch (335:22): [True: 101, False: 89]
  ------------------
  336|    101|      SValue sv = svalueF(*mt);
  337|    101|      if (bs.find(sv) == bs.end()) {
  ------------------
  |  Branch (337:11): [True: 84, False: 17]
  ------------------
  338|     84|        bos[sv] = bs.size(); // remember branch introduction order (this is important for variants)
  339|     84|      }
  340|    101|      PatternRows& outrs = bs[sv];
  341|       |
  342|       |      // the first time through this branch, we need to make sure that prior match-any rows are prepended
  343|    101|      if (outrs.empty()) {
  ------------------
  |  Branch (343:11): [True: 84, False: 17]
  ------------------
  344|     84|        for (auto i : anys) {
  ------------------
  |  Branch (344:21): [True: 0, False: 84]
  ------------------
  345|      0|          makeMatchAnyRow(sv, &outrs, ps[i], c);
  346|      0|        }
  347|     84|      }
  348|       |
  349|       |      // add this row to the fixed branch
  350|    101|      makeMatchRow(*mt, &outrs, ps[r], c);
  351|    101|    } else if (is<MatchAny>(ps[r].patterns[c])) {
  ------------------
  |  Branch (351:16): [True: 89, False: 0]
  ------------------
  352|       |      // record where this match-any came from, then append it to all states recorded so far
  353|     89|      anys.push_back(r);
  354|       |
  355|    190|      for (auto b = bs.begin(); b != bs.end(); ++b) {
  ------------------
  |  Branch (355:33): [True: 101, False: 89]
  ------------------
  356|    101|        makeMatchAnyRow(b->first, &b->second, ps[r], c);
  357|    101|      }
  358|     89|    } else {
  359|      0|      throw annotated_error(dfa->rootLA, "Internal error, invalid pattern table received");
  360|      0|    }
  361|    190|  }
  362|       |
  363|       |  // now accumulate 'catch-all' rows into the default state
  364|     89|  for (auto i : anys) {
  ------------------
  |  Branch (364:15): [True: 89, False: 76]
  ------------------
  365|     89|    copyRowWithoutColumn(&def, ps[i], c);
  366|     89|  }
  367|       |
  368|       |  // finally, pull the branch and default jumps together (in introduction order) and make the new state
  369|     76|  using Jump = std::pair<SValue, stateidx_t>;
  370|     76|  using Jumps = std::vector<Jump>;
  371|     76|  Jumps jmps;
  372|       |
  373|     76|  jmps.resize(bs.size());
  374|     84|  for (const auto& b : bs) {
  ------------------
  |  Branch (374:22): [True: 84, False: 76]
  ------------------
  375|     84|    jmps[bos[b.first]] = Jump(b.first, makeNextState(ps[0].patterns[c]->name(), b.first, dfa, b.second));
  376|     84|  }
  377|       |
  378|     76|  stateidx_t defState = !def.empty() ? makeDFAState(dfa, def) : nullState;
  ------------------
  |  Branch (378:25): [True: 76, False: 0]
  ------------------
  379|       |
  380|     76|  return makeSwitchState(ps[0].patterns[c]->name(), dfa, jmps, defState);
  381|     76|}

_ZN6hobbes7PatternC2EiRKNS_17LexicalAnnotationE:
   16|  1.05k|Pattern::Pattern(int cid, const LexicalAnnotation& la) : LexicallyAnnotated(la), cid(cid) { }
_ZNK6hobbes7Pattern7case_idEv:
   17|  10.4k|int Pattern::case_id() const { return this->cid; }
_ZNK6hobbes7Pattern4nameB5cxx11Ev:
   18|    954|const std::string& Pattern::name() const { return this->pname; }
_ZN6hobbes7Pattern4nameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
   19|  1.05k|void Pattern::name(const std::string& x) {
   20|  1.05k|  this->pname = x;
   21|  1.05k|  assignSubNames(x);
   22|  1.05k|}
_ZN6hobbes12MatchLiteralC2ERKSt10shared_ptrINS_9PrimitiveEERKNS_17LexicalAnnotationE:
   25|     29|MatchLiteral::MatchLiteral(const PrimitivePtr& proxy, const LexicalAnnotation& la) : Base(la), p(proxy) {
   26|     29|}
_ZNK6hobbes12MatchLiteral10expressionEv:
   31|     14|const ExprPtr&      MatchLiteral::expression()    const { return this->e; }
_ZNK6hobbes12MatchLiteral13equivConstantEv:
   32|    126|const PrimitivePtr& MatchLiteral::equivConstant() const { return this->p; }
_ZN6hobbes12MatchLiteral14assignSubNamesERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
   46|     29|void MatchLiteral::assignSubNames(const std::string&) { }
_ZN6hobbes8MatchAnyC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNS_17LexicalAnnotationE:
   49|    869|MatchAny::MatchAny(const std::string& vn, const LexicalAnnotation& la) : Base(la), vn(vn) { }
_ZNK6hobbes8MatchAny5valueB5cxx11Ev:
   50|  1.44k|const std::string& MatchAny::value() const { return this->vn; }
_ZN6hobbes8MatchAny14assignSubNamesERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
   61|    868|void MatchAny::assignSubNames(const std::string&) { }
_ZN6hobbes10MatchArrayC2ERKSt6vectorISt10shared_ptrINS_7PatternEESaIS4_EERKNS_17LexicalAnnotationE:
   64|     12|MatchArray::MatchArray(const Patterns& ps, const LexicalAnnotation& la) : Base(la), ps(ps), idxs(range<size_t>(0, ps.size())) {
   65|     12|}
_ZNK6hobbes10MatchArray7patternEm:
   67|    132|const PatternPtr& MatchArray::pattern(size_t i) const {
   68|    132|  if (i < this->ps.size()) {
  ------------------
  |  Branch (68:7): [True: 132, False: 0]
  ------------------
   69|    132|    return this->ps[i];
   70|    132|  } else {
   71|      0|    std::ostringstream ss;
   72|      0|    ss << "Index " << i << " out of bounds in pattern ";
   73|      0|    show(ss);
   74|       |
   75|      0|    throw annotated_error(*this, ss.str());
   76|      0|  }
   77|    132|}
_ZNK6hobbes10MatchArray7indexesEv:
   79|     12|const Idxs& MatchArray::indexes() const {
   80|     12|  return this->idxs;
   81|     12|}
_ZNK6hobbes10MatchArray4sizeEv:
   83|    224|size_t MatchArray::size() const {
   84|    224|  return this->idxs.size();
   85|    224|}
_ZN6hobbes10MatchArray14assignSubNamesERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  115|     12|void MatchArray::assignSubNames(const std::string& x) {
  116|       |  // array size check will be .0
  117|     31|  for (size_t i = 0; i < this->ps.size(); ++i) {
  ------------------
  |  Branch (117:22): [True: 19, False: 12]
  ------------------
  118|     19|    this->ps[i]->name(x + "." + str::from(i + 1));
  119|     19|  }
  120|     12|}
_ZN6hobbes10MatchRegexC2ERKSt10shared_ptrINS_5RegexEERKNS_17LexicalAnnotationE:
  123|      8|MatchRegex::MatchRegex(const RegexPtr& regex, const LexicalAnnotation& la) : Base(la), regex(regex) {
  124|      8|}
_ZN6hobbes10MatchRegexC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNS_17LexicalAnnotationE:
  126|      8|MatchRegex::MatchRegex(const std::string& regex, const LexicalAnnotation& la) : MatchRegex(parseRegex(regex), la) {
  127|      8|}
_ZNK6hobbes10MatchRegex5valueEv:
  135|     10|const RegexPtr& MatchRegex::value() const {
  136|     10|  return this->regex;
  137|     10|}
_ZN6hobbes10MatchRegex14assignSubNamesERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  150|      8|void MatchRegex::assignSubNames(const std::string&) {
  151|      8|}
_ZN6hobbes10MatchRegex7toRegexERKNS_10MatchArrayE:
  167|     12|PatternPtr MatchRegex::toRegex(const MatchArray& ma) {
  168|     12|  std::ostringstream ss;
  169|     23|  for (size_t i = 0; i < ma.size(); ++i) {
  ------------------
  |  Branch (169:22): [True: 17, False: 6]
  ------------------
  170|     17|    if (const MatchLiteral* cm = is<MatchLiteral>(ma.pattern(i))) {
  ------------------
  |  Branch (170:29): [True: 11, False: 6]
  ------------------
  171|     11|      if (const Char* c = is<Char>(cm->equivConstant())) {
  ------------------
  |  Branch (171:23): [True: 11, False: 0]
  ------------------
  172|     11|        if (isRegexMetaChar(c->value())) {
  ------------------
  |  Branch (172:13): [True: 2, False: 9]
  ------------------
  173|      2|          ss << '\\';
  174|      2|        }
  175|     11|        ss << c->value();
  176|     11|      } else {
  177|      0|        throw annotated_error(*ma.pattern(i), "Internal error, can't normalize non-char array match to regex");
  178|      0|      }
  179|       |//    } else if (const MatchAny* var = is<MatchAny>(ma.pattern(i))) {
  180|       |//      ss << "(?<" << var->name() << ">.)";                             <---- not quite right, would change capture var from char to [char]
  181|     11|    } else {
  182|      6|      throw annotated_error(ma, "Can't translate match pattern to regex");
  183|      6|    }
  184|     17|  }
  185|       |
  186|      6|  PatternPtr result(new MatchRegex(ss.str(), ma.la()));
  187|      6|  result->name(ma.name());
  188|      6|  return result;
  189|     12|}
_ZN6hobbes11MatchRecordC2ERKSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_7PatternEEESaISC_EERKNS_17LexicalAnnotationE:
  192|     44|MatchRecord::MatchRecord(const Fields& fs, const LexicalAnnotation& la) : Base(la) {
  193|     44|  fields(fs);
  194|     44|}
_ZNK6hobbes11MatchRecord7patternB5cxx11Em:
  196|    661|const MatchRecord::Field& MatchRecord::pattern(size_t i) const {
  197|    661|  if (i < this->fs.size()) {
  ------------------
  |  Branch (197:7): [True: 661, False: 0]
  ------------------
  198|    661|    return this->fs[i];
  199|    661|  } else {
  200|      0|    std::ostringstream ss;
  201|      0|    ss << "Index " << i << " out of bounds in pattern ";
  202|      0|    show(ss);
  203|       |
  204|      0|    throw annotated_error(*this, ss.str());
  205|      0|  }
  206|    661|}
_ZNK6hobbes11MatchRecord7indexesEv:
  208|     51|const Idxs& MatchRecord::indexes() const {
  209|     51|  return this->is;
  210|     51|}
_ZNK6hobbes11MatchRecord4sizeEv:
  212|    866|size_t MatchRecord::size() const {
  213|    866|  return this->fs.size();
  214|    866|}
_ZNK6hobbes11MatchRecord6fieldsB5cxx11Ev:
  216|     88|const MatchRecord::Fields& MatchRecord::fields() const {
  217|     88|  return this->fs;
  218|     88|}
_ZN6hobbes11MatchRecord6fieldsERKSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_7PatternEEESaISC_EE:
  220|     88|void MatchRecord::fields(const Fields& fs) {
  221|     88|  this->fs = fs;
  222|     88|  this->is = range<size_t>(0, fs.size());
  223|     88|  std::sort(this->fs.begin(), this->fs.end(), [](const Field& f0, const Field& f1) { return f0.first < f1.first; });
  224|     88|}
_ZNK6hobbes11MatchRecordeqERKNS_7PatternE:
  242|      9|bool MatchRecord::operator==(const Pattern& rhs) const {
  243|      9|  const auto* rrhs = hobbes::is<MatchRecord>(&rhs);
  244|      9|  if ((rrhs == nullptr) || this->fs.size() != rrhs->fs.size()) return false;
  ------------------
  |  Branch (244:7): [True: 9, False: 0]
  |  Branch (244:28): [True: 0, False: 0]
  ------------------
  245|       |
  246|      0|  for (unsigned int i = 0; i < this->fs.size(); ++i) {
  ------------------
  |  Branch (246:28): [True: 0, False: 0]
  ------------------
  247|      0|    if (this->fs[i].first != rrhs->fs[i].first) {
  ------------------
  |  Branch (247:9): [True: 0, False: 0]
  ------------------
  248|      0|      return false;
  249|      0|    } else if (!(*this->fs[i].second == *rrhs->fs[i].second)) {
  ------------------
  |  Branch (249:16): [True: 0, False: 0]
  ------------------
  250|      0|      return false;
  251|      0|    }
  252|      0|  }
  253|      0|  return true;
  254|      0|}
_ZN6hobbes11MatchRecord14assignSubNamesERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  256|     44|void MatchRecord::assignSubNames(const std::string& x) {
  257|     91|  for (auto& f : this->fs) {
  ------------------
  |  Branch (257:16): [True: 91, False: 44]
  ------------------
  258|     91|    f.second->name(x + "." + f.first);
  259|     91|  }
  260|     44|}
_ZN6hobbes12MatchVariantC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_7PatternEERKNS_17LexicalAnnotationE:
  263|     89|MatchVariant::MatchVariant(const std::string& lbl, const PatternPtr& p, const LexicalAnnotation& la) : Base(la), lbl(lbl), p(p) {
  264|     89|}
_ZNK6hobbes12MatchVariant5labelB5cxx11Ev:
  266|    190|const std::string& MatchVariant::label() const { return this->lbl; }
_ZNK6hobbes12MatchVariant5valueEv:
  267|    496|const PatternPtr&  MatchVariant::value() const { return this->p; }
_ZNK6hobbes12MatchVarianteqERKNS_7PatternE:
  273|     21|bool MatchVariant::operator==(const Pattern& rhs) const {
  274|     21|  if (const auto* vrhs = is<MatchVariant>(&rhs)) {
  ------------------
  |  Branch (274:19): [True: 1, False: 20]
  ------------------
  275|      1|    return this->lbl == vrhs->lbl && *this->p == *vrhs->p;
  ------------------
  |  Branch (275:12): [True: 1, False: 0]
  |  Branch (275:38): [True: 0, False: 1]
  ------------------
  276|     20|  } else {
  277|     20|    return false;
  278|     20|  }
  279|     21|}
_ZN6hobbes12MatchVariant14assignSubNamesERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  281|     89|void MatchVariant::assignSubNames(const std::string& x) {
  282|       |  // assume that the variant constructor will be .0
  283|     89|  this->p->name(x + ".1");
  284|     89|}
_ZN6hobbeseqERKNS_10PatternRowES2_:
  287|     57|bool operator==(const PatternRow& pr0, const PatternRow& pr1) {
  288|     57|  if (pr0.guard.get() == pr1.guard.get() && pr0.result.get() == pr1.result.get() && pr0.patterns.size() == pr1.patterns.size()) {
  ------------------
  |  Branch (288:7): [True: 57, False: 0]
  |  Branch (288:45): [True: 57, False: 0]
  |  Branch (288:85): [True: 57, False: 0]
  ------------------
  289|     57|    for (size_t i = 0; i < pr0.patterns.size(); ++i) {
  ------------------
  |  Branch (289:24): [True: 29, False: 28]
  ------------------
  290|     29|      if (!(pr0.patterns[i].get() == pr1.patterns[i].get() || *pr0.patterns[i] == *pr1.patterns[i])) {
  ------------------
  |  Branch (290:13): [True: 0, False: 29]
  |  Branch (290:63): [True: 0, False: 29]
  ------------------
  291|     29|        return false;
  292|     29|      }
  293|     29|    }
  294|     28|    return true;
  295|     57|  } else {
  296|      0|    return false;
  297|      0|  }
  298|     57|}
_ZN6hobbes4hashERKNS_10PatternRowE:
  300|  2.35k|size_t hash(const PatternRow& pr) {
  301|  2.35k|  size_t r = 0;
  302|  2.35k|  hashAppend(r, reinterpret_cast<void*>(pr.result.get()));
  303|  2.35k|  hashAppend(r, pr.patterns.size());
  304|  2.35k|  return r;
  305|  2.35k|}
_ZN6hobbes20normalizeRecPatternsEPNS_11MatchRecordERKSt3setINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4lessIS8_ESaIS8_EE:
  335|     44|void normalizeRecPatterns(MatchRecord* r, const std::set<std::string>& fnames) {
  336|     44|  MatchRecord::Fields nfs = r->fields();
  337|     44|  for (const auto& f : setDifference(fnames, toSet(first(r->fields())))) {
  ------------------
  |  Branch (337:22): [True: 0, False: 44]
  ------------------
  338|      0|    nfs.push_back(MatchRecord::Field(f, PatternPtr(new MatchAny(freshName(), r->la()))));
  339|      0|  }
  340|     44|  r->fields(nfs);
  341|     44|}
_ZN6hobbes20normalizeRecPatternsERKSt6vectorISt10shared_ptrINS_7PatternEESaIS3_EERKSt3setINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4lessISE_ESaISE_EE:
  343|     32|void normalizeRecPatterns(const Patterns& ps, const std::set<std::string>& fnames) {
  344|     44|  for (const auto& p : ps) {
  ------------------
  |  Branch (344:22): [True: 44, False: 32]
  ------------------
  345|     44|    if (auto* r = is<MatchRecord>(p)) {
  ------------------
  |  Branch (345:15): [True: 44, False: 0]
  ------------------
  346|     44|      normalizeRecPatterns(r, fnames);
  347|     44|    }
  348|     44|  }
  349|     32|}
_ZN6hobbes19groupRecordPatternsB5cxx11ERKSt6vectorISt10shared_ptrINS_7PatternEESaIS3_EE:
  353|     32|NamedPatternGroups groupRecordPatterns(const Patterns& ps) {
  354|     32|  NamedPatternGroups r;
  355|     44|  for (const auto& p : ps) {
  ------------------
  |  Branch (355:22): [True: 44, False: 32]
  ------------------
  356|     44|    if (const MatchRecord* rec = is<MatchRecord>(p)) {
  ------------------
  |  Branch (356:28): [True: 44, False: 0]
  ------------------
  357|    135|      for (size_t f = 0; f < rec->size(); ++f) {
  ------------------
  |  Branch (357:26): [True: 91, False: 44]
  ------------------
  358|     91|        const auto& fd = rec->pattern(f);
  359|     91|        r[fd.first].push_back(fd.second);
  360|     91|      }
  361|     44|    }
  362|     44|  }
  363|     32|  return r;
  364|     32|}
_ZN6hobbes20groupVariantPatternsB5cxx11ERKSt6vectorISt10shared_ptrINS_7PatternEESaIS3_EE:
  366|     64|NamedPatternGroups groupVariantPatterns(const Patterns& ps) {
  367|     64|  NamedPatternGroups r;
  368|     91|  for (const auto& p : ps) {
  ------------------
  |  Branch (368:22): [True: 91, False: 64]
  ------------------
  369|     91|    if (const MatchVariant* v = is<MatchVariant>(p)) {
  ------------------
  |  Branch (369:29): [True: 89, False: 2]
  ------------------
  370|     89|      r[v->label()].push_back(v->value());
  371|     89|    }
  372|     91|  }
  373|     64|  return r;
  374|     64|}
_ZN6hobbes19concatArrayPatternsERKSt6vectorISt10shared_ptrINS_7PatternEESaIS3_EE:
  376|      4|Patterns concatArrayPatterns(const Patterns& ps) {
  377|      4|  Patterns r;
  378|      8|  for (const auto& p : ps) {
  ------------------
  |  Branch (378:22): [True: 8, False: 4]
  ------------------
  379|      8|    if (const MatchArray* a = is<MatchArray>(p)) {
  ------------------
  |  Branch (379:27): [True: 8, False: 0]
  ------------------
  380|     16|      for (size_t i = 0; i < a->size(); ++i) {
  ------------------
  |  Branch (380:26): [True: 8, False: 8]
  ------------------
  381|      8|        r.push_back(a->pattern(i));
  382|      8|      }
  383|      8|    }
  384|      8|  }
  385|      4|  return r;
  386|      4|}
_ZN6hobbes18normalizeRecAccessERKSt6vectorISt10shared_ptrINS_7PatternEESaIS3_EE:
  388|    219|void normalizeRecAccess(const Patterns& ps) {
  389|    219|  if (ps.empty()) {
  ------------------
  |  Branch (389:7): [True: 2, False: 217]
  ------------------
  390|       |    // nothing to normalize
  391|    217|  } else if (is<MatchRecord>(ps[0]) != nullptr) {
  ------------------
  |  Branch (391:14): [True: 32, False: 185]
  ------------------
  392|       |    // this is actually the case we care about
  393|       |    // first recursively normalize within each field's pattern
  394|     32|    auto gs = groupRecordPatterns(ps);
  395|     67|    for (const auto& g : gs) {
  ------------------
  |  Branch (395:24): [True: 67, False: 32]
  ------------------
  396|     67|      normalizeRecAccess(g.second);
  397|     67|    }
  398|       |
  399|       |    // then normalize within patterns
  400|     32|    normalizeRecPatterns(ps, keys(gs));
  401|    185|  } else if (is<MatchArray>(ps[0]) != nullptr) {
  ------------------
  |  Branch (401:14): [True: 4, False: 181]
  ------------------
  402|      4|    normalizeRecAccess(concatArrayPatterns(ps));
  403|    181|  } else if (is<MatchVariant>(ps[0]) != nullptr) {
  ------------------
  |  Branch (403:14): [True: 64, False: 117]
  ------------------
  404|     72|    for (const auto& g : groupVariantPatterns(ps)) {
  ------------------
  |  Branch (404:24): [True: 72, False: 64]
  ------------------
  405|     72|      normalizeRecAccess(g.second);
  406|     72|    }
  407|    117|  } else {
  408|       |    // no other cases matter
  409|    117|  }
  410|    219|}
_ZN6hobbes18canHoldRecPatternsERKSt10shared_ptrINS_7PatternEE:
  412|    845|bool canHoldRecPatterns(const PatternPtr& p) {
  413|    845|  if (const MatchArray* a = is<MatchArray>(p)) {
  ------------------
  |  Branch (413:25): [True: 10, False: 835]
  ------------------
  414|     18|    for (size_t i = 0; i < a->size(); ++i) {
  ------------------
  |  Branch (414:24): [True: 10, False: 8]
  ------------------
  415|     10|      if (!canHoldRecPatterns(a->pattern(i))) {
  ------------------
  |  Branch (415:11): [True: 2, False: 8]
  ------------------
  416|      2|        return false;
  417|      2|      }
  418|     10|    }
  419|      8|    return true;
  420|    835|  } else if ((is<MatchLiteral>(p) != nullptr) || (is<MatchRegex>(p) != nullptr)) {
  ------------------
  |  Branch (420:14): [True: 8, False: 827]
  |  Branch (420:50): [True: 1, False: 826]
  ------------------
  421|       |    // prim matches obviously can't contain record patterns
  422|      9|    return false;
  423|    826|  } else {
  424|    826|    return true;
  425|    826|  }
  426|    845|}
_ZN6hobbes18normalizeRecAccessERKSt6vectorINS_10PatternRowESaIS1_EE:
  428|    669|void normalizeRecAccess(const PatternRows& prs) {
  429|    669|  size_t maxc = (prs.empty()) ? 0 : prs[0].patterns.size();
  ------------------
  |  Branch (429:17): [True: 0, False: 669]
  ------------------
  430|  1.39k|  for (size_t c = 0; c < maxc; ++c) {
  ------------------
  |  Branch (430:22): [True: 725, False: 669]
  ------------------
  431|       |    // gather all patterns across this column, normalize record access within the column
  432|    725|    Patterns ps;
  433|       |
  434|    835|    for (const auto &pr : prs) {
  ------------------
  |  Branch (434:25): [True: 835, False: 716]
  ------------------
  435|    835|      const PatternPtr& p = pr.patterns[c];
  436|       |
  437|       |      // (we can trivially ignore this column if it matches a literal value)
  438|    835|      if (!canHoldRecPatterns(p)) {
  ------------------
  |  Branch (438:11): [True: 9, False: 826]
  ------------------
  439|      9|        ps.clear();
  440|      9|        break;
  441|    826|      } else if (is<MatchAny>(p) == nullptr) {
  ------------------
  |  Branch (441:18): [True: 106, False: 720]
  ------------------
  442|    106|        ps.push_back(p);
  443|    106|      }
  444|    835|    }
  445|       |
  446|    725|    if (!ps.empty()) {
  ------------------
  |  Branch (446:9): [True: 76, False: 649]
  ------------------
  447|     76|      normalizeRecAccess(ps);
  448|     76|    }
  449|    725|  }
  450|    669|}
_ZN6hobbes18validateDimensionsEmRKSt6vectorINS_10PatternRowESaIS1_EERKNS_17LexicalAnnotationE:
  453|    669|void validateDimensions(size_t c, const PatternRows& ps, const LexicalAnnotation& la) {
  454|    669|  if (ps.empty()) {
  ------------------
  |  Branch (454:7): [True: 0, False: 669]
  ------------------
  455|      0|    throw annotated_error(la, "Internal error, pattern sequence cannot be empty");
  456|    669|  } else {
  457|  1.42k|    for (unsigned int i = 0; i < ps.size(); ++i) {
  ------------------
  |  Branch (457:30): [True: 755, False: 669]
  ------------------
  458|    755|      if (ps[i].patterns.size() != c) {
  ------------------
  |  Branch (458:11): [True: 0, False: 755]
  ------------------
  459|      0|        throw annotated_error(
  460|      0|          la,
  461|      0|          "Invalid pattern match sequence, row #" + str::from(i) + " has " + str::from(ps[i].patterns.size()) + " columns, "
  462|      0|          "but should have " + str::from(c)
  463|      0|        );
  464|      0|      }
  465|    755|    }
  466|    669|  }
  467|    669|}
_ZN6hobbes12matchRowTypeERKSt10shared_ptrINS_4TEnvEERKSt6vectorINS_10PatternRowESaIS6_EE:
  514|    669|MonoTypes matchRowType(const TEnvPtr& tenv, const PatternRows& ps) {
  515|    669|  MonoTypeUnifier u(tenv);
  516|       |
  517|       |  // determine the initial row type
  518|    669|  MonoTypes ts;
  519|    669|  const Patterns& pr = ps[0].patterns;
  520|    725|  for (const auto &p : pr) {
  ------------------
  |  Branch (520:22): [True: 725, False: 669]
  ------------------
  521|    725|    ts.push_back(switchOf(p, inferTypeF(&u)));
  522|    725|  }
  523|       |
  524|       |  // unify with subsequent rows
  525|    755|  for (unsigned int i = 1; i < ps.size(); ++i) {
  ------------------
  |  Branch (525:28): [True: 86, False: 669]
  ------------------
  526|    202|    for (unsigned int c = 0; c < ps[i].patterns.size(); ++c) {
  ------------------
  |  Branch (526:30): [True: 116, False: 86]
  ------------------
  527|    116|      mgu(ts[c], switchOf(ps[i].patterns[c], inferTypeF(&u)), &u);
  528|    116|    }
  529|     86|  }
  530|       |
  531|    669|  return u.substitute(ts);
  532|    669|}
_ZN6hobbes8validateERKSt10shared_ptrINS_4TEnvEEmRKSt6vectorINS_10PatternRowESaIS6_EERKNS_17LexicalAnnotationE:
  534|    669|void validate(const TEnvPtr& tenv, size_t c, const PatternRows& ps, const LexicalAnnotation& la) {
  535|       |  // the rows to match should be rectangular (so that we're matching against the same number of values)
  536|       |  // implied types should agree at all columns
  537|       |  // no row should make following rows unreachable
  538|       |  // all rows together should exhaustively cover the input space
  539|    669|  validateDimensions(c, ps, la);
  540|    669|  normalizeRecAccess(ps);
  541|    669|  matchRowType(tenv, ps);
  542|    669|}
_ZN6hobbes8varNamesB5cxx11Ej:
  544|    669|str::seq varNames(unsigned int n) {
  545|    669|  str::seq r;
  546|  1.39k|  for (unsigned int i = 0; i < n; ++i) {
  ------------------
  |  Branch (546:28): [True: 725, False: 669]
  ------------------
  547|    725|    r.push_back(freshName() + ".rv" + str::from(i));
  548|    725|  }
  549|    669|  return r;
  550|    669|}
_ZN6hobbes8inLetExpERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS6_EERKS0_ISt10shared_ptrINS_4ExprEESaISD_EERKSD_RKNS_17LexicalAnnotationE:
  552|    669|ExprPtr inLetExp(const str::seq& vns, const Exprs& es, const ExprPtr& b, const LexicalAnnotation& la) {
  553|    669|  if (vns.size() != es.size()) {
  ------------------
  |  Branch (553:7): [True: 0, False: 669]
  ------------------
  554|      0|    throw annotated_error(la, "Internal error in let exp constructions");
  555|    669|  } else {
  556|    669|    ExprPtr r = b;
  557|  1.39k|    for (unsigned int i = vns.size(); i > 0; --i) {
  ------------------
  |  Branch (557:39): [True: 725, False: 669]
  ------------------
  558|    725|      r = ExprPtr(new Let(vns[i-1], es[i-1], r, la));
  559|    725|    }
  560|    669|    return r;
  561|    669|  }
  562|    669|}
_ZN6hobbes10varMappingB5cxx11ERKSt6vectorISt10shared_ptrINS_7PatternEESaIS3_EE:
  601|    755|VarMapping varMapping(const Patterns& ps) {
  602|       |  // assuming that the input patterns have assigned names,
  603|       |  // our renaming finds user-names in the input patterns and renames them to assigned names
  604|    755|  VarMapping r;
  605|    841|  for (const auto& p : ps) {
  ------------------
  |  Branch (605:22): [True: 841, False: 755]
  ------------------
  606|    841|    switchOf(p, inferMappingF(&r));
  607|    841|  }
  608|    755|  return r;
  609|    755|}
_ZN6hobbes11assignNamesERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS6_EERS0_INS_10PatternRowESaISB_EEPb:
  611|    669|void assignNames(const str::seq& vns, PatternRows& ps, bool* mappedVs) {
  612|       |  // each row needs to be assigned the same names across columns
  613|    755|  for (auto &p : ps) {
  ------------------
  |  Branch (613:16): [True: 755, False: 669]
  ------------------
  614|  1.59k|    for (size_t c = 0; c < p.patterns.size(); ++c) {
  ------------------
  |  Branch (614:24): [True: 841, False: 755]
  ------------------
  615|    841|      p.patterns[c]->name(vns[c]);
  616|    841|    }
  617|    755|  }
  618|       |
  619|       |  // each row expression needs to be renamed consistent with the above name assignment
  620|    755|  for (auto &p : ps) {
  ------------------
  |  Branch (620:16): [True: 755, False: 669]
  ------------------
  621|    755|    VarMapping vm = varMapping(p.patterns);
  622|    755|    if (!vm.empty()) {
  ------------------
  |  Branch (622:9): [True: 456, False: 299]
  ------------------
  623|    456|      *mappedVs = true;
  624|       |
  625|    456|      if (p.guard) {
  ------------------
  |  Branch (625:11): [True: 6, False: 450]
  ------------------
  626|      6|        p.guard = substitute(vm, p.guard);
  627|      6|      }
  628|       |
  629|    456|      p.result = substitute(vm, p.result);
  630|    456|    }
  631|    755|  }
  632|    669|}
_ZN6hobbes12compileMatchEPNS_2ccERKSt6vectorISt10shared_ptrINS_4ExprEESaIS5_EERKS2_INS_10PatternRowESaISA_EERKNS_17LexicalAnnotationE:
  634|    669|ExprPtr compileMatch(cc* c, const Exprs& es, const PatternRows& ps, const LexicalAnnotation& rootLA) {
  635|       |  // everything handed in is walked below (each row's result and guard are
  636|       |  // renamed by substitution, for one), and every walk recurs through nesting.
  637|       |  // This is run from grammar actions, on sub-expressions of a parse still under
  638|       |  // way that the parser's nesting bound has not yet had a chance to see:
  639|       |  // OSS-Fuzz 556791547 is a `\x.` whose body is a chain of 11,000 comparisons,
  640|       |  // and the substitution overflowed the stack before the parse finished. So
  641|       |  // the bound is applied here, before any of it is walked.
  642|    725|  for (const auto& e : es) {
  ------------------
  |  Branch (642:22): [True: 725, False: 669]
  ------------------
  643|    725|    checkNestingDepth(e);
  644|    725|  }
  645|    755|  for (const auto& p : ps) {
  ------------------
  |  Branch (645:22): [True: 755, False: 669]
  ------------------
  646|    755|    checkNestingDepth(p.guard);
  647|    755|    checkNestingDepth(p.result);
  648|    755|  }
  649|       |
  650|    669|  validate(c->typeEnv(), es.size(), ps, rootLA);
  651|       |
  652|       |  // make variables to store each of the expressions being matched
  653|    669|  str::seq vns = varNames(es.size());
  654|       |
  655|       |  // push these variable names through pattern rows (assign explicit names to every step of pattern matching)
  656|    669|  bool mappedVs = false;
  657|    669|  assignNames(vns, const_cast<PatternRows&>(ps), &mappedVs);
  658|       |
  659|       |  // produce a match expression from the DFA induced by these patterns
  660|    669|  return inLetExp(vns, es, liftDFAExpr(c, ps, rootLA), rootLA);
  661|    669|}
_ZN6hobbes9refutableERKSt10shared_ptrINS_7PatternEE:
  708|    171|bool refutable(const PatternPtr& p) {
  709|    171|  return switchOf(p, refutableP());
  710|    171|}
_ZN6hobbes9isUnitPatERKSt10shared_ptrINS_7PatternEE:
  712|    152|bool isUnitPat(const PatternPtr& p) {
  713|    152|  if (const MatchLiteral* v = is<MatchLiteral>(p)) {
  ------------------
  |  Branch (713:27): [True: 6, False: 146]
  ------------------
  714|      6|    return sizeOf(v->equivConstant()->primType()) == 0;
  715|    146|  } else {
  716|    146|    return false;
  717|    146|  }
  718|    152|}
_ZN6hobbes9irpatFuncEPNS_2ccERKSt10shared_ptrINS_7PatternEERKS2_INS_4ExprEERKNS_17LexicalAnnotationE:
  768|     18|ExprPtr irpatFunc(cc* c, const PatternPtr& pat, const ExprPtr& body, const LexicalAnnotation& la) {
  769|     18|  return fn(str::strings(".arg"), compileMatch(c, list(var(".arg", la)), list(PatternRow(list(pat), body)), la), la);
  770|     18|}
_ZN6hobbes8rpatFuncEPNS_2ccERKSt10shared_ptrINS_7PatternEERKS2_INS_4ExprEESA_RKNS_17LexicalAnnotationE:
  772|      1|ExprPtr rpatFunc(cc* c, const PatternPtr& pat, const ExprPtr& cond, const ExprPtr& body, const LexicalAnnotation& la) {
  773|      1|  MonoTypePtr rty   = freshTypeVar();
  774|      1|  MonoTypePtr mrty  = sumtype(primty("unit"), rty);
  775|      1|  ExprPtr     fbody = assume(ExprPtr(new MkVariant(".f0", mktunit(la), la)), mrty, la);
  776|      1|  ExprPtr     sbody = assume(ExprPtr(new MkVariant(".f1", body, la)), mrty, la);
  777|      1|  PatternRow  pr    = cond ? PatternRow(list(pat), cond, sbody) : PatternRow(list(pat), sbody);
  ------------------
  |  Branch (777:23): [True: 0, False: 1]
  ------------------
  778|       |
  779|      1|  return fn(str::strings(".arg"), compileMatch(c, list(var(".arg", la)), list(pr, PatternRow(list(PatternPtr(new MatchAny("_", la))), fbody)), la), la);
  780|      1|}
_ZN6hobbes20desugarComprehensionEPNS_2ccERKSt10shared_ptrINS_4ExprEERKNS_10CSelectionERKNS_17LexicalAnnotationE:
  794|     19|ExprPtr desugarComprehension(cc* c, const ExprPtr& e, const CSelection& cs, const LexicalAnnotation& la) {
  795|     19|  if (refutable(cs.pat)) {
  ------------------
  |  Branch (795:7): [True: 1, False: 18]
  ------------------
  796|      1|    return fncall(var("ffilterMMap", la), list(rpatFunc(c, cs.pat, !cs.conds.empty() ? conjoinConds(cs.conds, la) : ExprPtr(), e, la), cs.seq), la);
  ------------------
  |  Branch (796:68): [True: 0, False: 1]
  ------------------
  797|     18|  } else if (!cs.conds.empty()) {
  ------------------
  |  Branch (797:14): [True: 0, False: 18]
  ------------------
  798|      0|    return fncall(var("ffilterMap", la), list(irpatFunc(c, cs.pat, conjoinConds(cs.conds, la), la), irpatFunc(c, cs.pat, e, la), cs.seq), la);
  799|     18|  } else {
  800|     18|    return fncall(var("fmap", la), list(irpatFunc(c, cs.pat, e, la), cs.seq), la);
  801|     18|  }
  802|     19|}
_ZN6hobbes20desugarComprehensionEPNS_2ccERKSt10shared_ptrINS_4ExprEERKSt6vectorIS2_INS_10CSelectionEESaIS9_EERKNS_17LexicalAnnotationE:
  804|     19|Expr* desugarComprehension(cc* c, const ExprPtr& ex, const CSelections& cs, const LexicalAnnotation& la) {
  805|     19|  if (cs.empty()) {
  ------------------
  |  Branch (805:7): [True: 0, False: 19]
  ------------------
  806|      0|    return ex->clone();
  807|     19|  } else {
  808|     19|    ExprPtr e = desugarComprehension(c, ex, *cs[cs.size()-1], la);
  809|     19|    for (size_t i = cs.size()-1; i > 0; --i) {
  ------------------
  |  Branch (809:34): [True: 0, False: 19]
  ------------------
  810|      0|      e = fncall(var("mflatten", la), list(desugarComprehension(c, e, *cs[i-1], la)), la);
  811|      0|    }
  812|     19|    return e->clone();
  813|     19|  }
  814|     19|}
pattern.C:_ZN6hobbesL15isRegexMetaCharEc:
  157|     11|static bool isRegexMetaChar(char c) {
  158|     11|  switch (c) {
  159|      2|  case '\\': case '(': case ')': case '|': case '.': case '[': case ']':
  ------------------
  |  Branch (159:3): [True: 0, False: 11]
  |  Branch (159:14): [True: 1, False: 10]
  |  Branch (159:24): [True: 1, False: 10]
  |  Branch (159:34): [True: 0, False: 11]
  |  Branch (159:44): [True: 0, False: 11]
  |  Branch (159:54): [True: 0, False: 11]
  |  Branch (159:64): [True: 0, False: 11]
  ------------------
  160|      2|  case '?': case '*': case '+':
  ------------------
  |  Branch (160:3): [True: 0, False: 11]
  |  Branch (160:13): [True: 0, False: 11]
  |  Branch (160:23): [True: 0, False: 11]
  ------------------
  161|      2|    return true;
  162|      9|  default:
  ------------------
  |  Branch (162:3): [True: 9, False: 2]
  ------------------
  163|      9|    return false;
  164|     11|  }
  165|     11|}
_ZN6hobbes10inferTypeFC2EPNS_15MonoTypeUnifierE:
  472|    841|  inferTypeF(MonoTypeUnifier* s) : s(s) { }
_ZNK6hobbes10inferTypeF4withEPKNS_12MatchLiteralE:
  474|     25|  MonoTypePtr with(const MatchLiteral* v) const override {
  475|     25|    return v->equivConstant()->primType();
  476|     25|  }
_ZNK6hobbes10inferTypeF4withEPKNS_8MatchAnyE:
  478|    754|  MonoTypePtr with(const MatchAny*) const override {
  479|    754|    return freshTypeVar();
  480|    754|  }
_ZNK6hobbes10inferTypeF4withEPKNS_10MatchArrayE:
  482|     12|  MonoTypePtr with(const MatchArray* v) const override {
  483|     12|    if (v->size() == 0) {
  ------------------
  |  Branch (483:9): [True: 3, False: 9]
  ------------------
  484|      3|      return arrayty(freshTypeVar());
  485|      9|    } else {
  486|      9|      MonoTypePtr elemTy = switchOf(v->pattern(0), *this);
  487|     19|      for (size_t i = 1; i < v->size(); ++i) {
  ------------------
  |  Branch (487:26): [True: 10, False: 9]
  ------------------
  488|     10|        mgu(elemTy, switchOf(v->pattern(i), *this), this->s);
  489|     10|      }
  490|      9|      return arrayty(elemTy);
  491|      9|    }
  492|     12|  }
_ZNK6hobbes10inferTypeF4withEPKNS_10MatchRegexE:
  494|      2|  MonoTypePtr with(const MatchRegex*) const override {
  495|      2|    return arrayty(primty("char"));
  496|      2|  }
_ZNK6hobbes10inferTypeF4withEPKNS_11MatchRecordE:
  498|     19|  MonoTypePtr with(const MatchRecord* v) const override {
  499|     19|    Record::Members ms;
  500|     59|    for (size_t i = 0; i < v->size(); ++i) {
  ------------------
  |  Branch (500:24): [True: 40, False: 19]
  ------------------
  501|     40|      const MatchRecord::Field& f = v->pattern(i);
  502|     40|      ms.push_back(Record::Member(f.first, switchOf(f.second, *this)));
  503|     40|    }
  504|     19|    return MonoTypePtr(Record::make(ms));
  505|     19|  }
_ZNK6hobbes10inferTypeF4withEPKNS_12MatchVariantE:
  507|     88|  MonoTypePtr with(const MatchVariant*) const override {
  508|       |    // too broad, but for this purpose should be fine
  509|     88|    return freshTypeVar();
  510|     88|  }
_ZN6hobbes13inferMappingFC2EPSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_4ExprEESt4lessIS7_ESaISt4pairIKS7_SA_EEE:
  566|    841|  inferMappingF(VarMapping* vm) : vm(vm) { }
_ZNK6hobbes13inferMappingF4withEPKNS_12MatchLiteralE:
  567|     25|  UnitV with(const MatchLiteral*) const override { return unitv; }
_ZNK6hobbes13inferMappingF4withEPKNS_8MatchAnyE:
  569|    868|  UnitV with(const MatchAny* x) const override {
  570|    868|    if (x->value() != "_") {
  ------------------
  |  Branch (570:9): [True: 581, False: 287]
  ------------------
  571|    581|      (*this->vm)[x->value()] = ExprPtr(new Var(x->name(), x->la()));
  572|    581|    }
  573|    868|    return unitv;
  574|    868|  }
_ZNK6hobbes13inferMappingF4withEPKNS_10MatchArrayE:
  576|     12|  UnitV with(const MatchArray* x) const override {
  577|     19|    for (auto i : x->indexes()) {
  ------------------
  |  Branch (577:17): [True: 19, False: 12]
  ------------------
  578|     19|      switchOf(x->pattern(i), *this);
  579|     19|    }
  580|     12|    return unitv;
  581|     12|  }
_ZNK6hobbes13inferMappingF4withEPKNS_10MatchRegexE:
  583|      2|  UnitV with(const MatchRegex*) const override {
  584|       |    // regex translation will decide how to conflate binding names
  585|      2|    return unitv;
  586|      2|  }
_ZNK6hobbes13inferMappingF4withEPKNS_11MatchRecordE:
  588|     44|  UnitV with(const MatchRecord* x) const override {
  589|     91|    for (auto i : x->indexes()) {
  ------------------
  |  Branch (589:17): [True: 91, False: 44]
  ------------------
  590|     91|      switchOf(x->pattern(i).second, *this);
  591|     91|    }
  592|     44|    return unitv;
  593|     44|  }
_ZNK6hobbes13inferMappingF4withEPKNS_12MatchVariantE:
  595|     89|  UnitV with(const MatchVariant* x) const override {
  596|     89|    switchOf(x->value(), *this);
  597|     89|    return unitv;
  598|     89|  }
_ZNK6hobbes10refutableP4withEPKNS_12MatchLiteralE:
  692|      6|  bool with(const MatchLiteral* v) const override { return sizeOf(v->equivConstant()->primType()) > 0; } // the only irrefutable literal is unit
_ZNK6hobbes10refutableP4withEPKNS_8MatchAnyE:
  693|    173|  bool with(const MatchAny*      ) const override { return false; }
_ZNK6hobbes10refutableP4withEPKNS_11MatchRecordE:
  698|      7|  bool with(const MatchRecord* x) const override {
  699|     16|    for (auto i : x->indexes()) {
  ------------------
  |  Branch (699:17): [True: 16, False: 7]
  ------------------
  700|     16|      if (switchOf(x->pattern(i).second, *this)) {
  ------------------
  |  Branch (700:11): [True: 0, False: 16]
  ------------------
  701|      0|        return true;
  702|      0|      }
  703|     16|    }
  704|      7|    return false;
  705|      7|  }
_ZNK6hobbes10refutableP4withEPKNS_12MatchVariantE:
  696|      1|  bool with(const MatchVariant*  ) const override { return true; }
pattern.C:_ZZN6hobbes11MatchRecord6fieldsERKSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_7PatternEEESaISC_EEENK3$_0clERKSC_SJ_:
  223|    188|  std::sort(this->fs.begin(), this->fs.end(), [](const Field& f0, const Field& f1) { return f0.first < f1.first; });

_ZN6hobbes7epsilonEv:
  120|     11|RegexPtr epsilon() {
  121|     11|  return RegexPtr(new REps());
  122|     11|}
_ZN6hobbes7charLitEh:
  124|     10|RegexPtr charLit(rchar_t c) {
  125|     10|  return RegexPtr(new RCharRange(c, c));
  126|     10|}
_ZN6hobbes9charRangeEhh:
  128|     13|RegexPtr charRange(rchar_t b, rchar_t e) {
  129|     13|  return RegexPtr(new RCharRange(b, e));
  130|     13|}
_ZN6hobbes10zeroOrMoreERKSt10shared_ptrINS_5RegexEE:
  132|      3|RegexPtr zeroOrMore(const RegexPtr& p) {
  133|      3|  return RegexPtr(new RStar(p));
  134|      3|}
_ZN6hobbes6eitherERKSt10shared_ptrINS_5RegexEES4_:
  136|      4|RegexPtr either(const RegexPtr& p0, const RegexPtr& p1) {
  137|      4|  return RegexPtr(new REither(p0, p1));
  138|      4|}
_ZN6hobbes6bindToERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_5RegexEE:
  140|      3|RegexPtr bindTo(const std::string& name, const RegexPtr& p) {
  141|      3|  if (name.empty()) {
  ------------------
  |  Branch (141:7): [True: 0, False: 3]
  ------------------
  142|      0|    return p;
  143|      3|  } else {
  144|      3|    return RegexPtr(new RBind(name, p));
  145|      3|  }
  146|      3|}
_ZN6hobbes8sequenceERKSt10shared_ptrINS_5RegexEES4_:
  148|     25|RegexPtr sequence(const RegexPtr& p0, const RegexPtr& p1) {
  149|     25|  return RegexPtr(new RSeq(p0, p1));
  150|     25|}
_ZN6hobbes5anyOfERKSt6vectorISt10shared_ptrINS_5RegexEESaIS3_EE:
  152|      9|RegexPtr anyOf(const Regexes& rs) {
  153|      9|  if (rs.empty()) {
  ------------------
  |  Branch (153:7): [True: 0, False: 9]
  ------------------
  154|      0|    return epsilon();
  155|      9|  } else {
  156|      9|    RegexPtr a = rs[0];
  157|     13|    for (size_t i = 1; i < rs.size(); ++i) {
  ------------------
  |  Branch (157:24): [True: 4, False: 9]
  ------------------
  158|      4|      a = either(a, rs[i]);
  159|      4|    }
  160|      9|    return a;
  161|      9|  }
  162|      9|}
_ZN6hobbes8toRangesERKSt3setIhSt4lessIhESaIhEE:
  167|      9|CharRanges toRanges(const std::set<rchar_t>& cs) {
  168|      9|  if (cs.empty()) {
  ------------------
  |  Branch (168:7): [True: 0, False: 9]
  ------------------
  169|      0|    return CharRanges();
  170|      9|  } else {
  171|      9|    auto ci = cs.begin();
  172|      9|    rchar_t b = *ci;
  173|      9|    rchar_t e = b;
  174|       |
  175|      9|    CharRanges r;
  176|    770|    do {
  177|    770|      ++ci;
  178|    770|      if (ci == cs.end()) {
  ------------------
  |  Branch (178:11): [True: 9, False: 761]
  ------------------
  179|      9|        r.push_back(std::make_pair(b, e));
  180|    761|      } else if (e+1 == *ci) {
  ------------------
  |  Branch (180:18): [True: 757, False: 4]
  ------------------
  181|    757|        e = *ci;
  182|    757|      } else {
  183|      4|        r.push_back(std::make_pair(b, e));
  184|      4|        b = e = *ci;
  185|      4|      }
  186|    770|    } while (ci != cs.end());
  ------------------
  |  Branch (186:14): [True: 761, False: 9]
  ------------------
  187|      9|    return r;
  188|      9|  }
  189|      9|}
_ZN6hobbes5anyOfERKSt3setIhSt4lessIhESaIhEE:
  191|      9|RegexPtr anyOf(const std::set<rchar_t>& cs) {
  192|      9|  Regexes rs;
  193|     13|  for (const auto& p : toRanges(cs)) {
  ------------------
  |  Branch (193:22): [True: 13, False: 9]
  ------------------
  194|     13|    rs.push_back(charRange(p.first, p.second));
  195|     13|  }
  196|      9|  return anyOf(rs);
  197|      9|}
_ZN6hobbes12unescapeIntoEhPSt3setIhSt4lessIhESaIhEE:
  199|      7|void unescapeInto(rchar_t e, std::set<rchar_t>* out) {
  200|      7|  switch (e) {
  201|      0|  case 't': out->insert('\t'); break;
  ------------------
  |  Branch (201:3): [True: 0, False: 7]
  ------------------
  202|      0|  case 'r': out->insert('\r'); break;
  ------------------
  |  Branch (202:3): [True: 0, False: 7]
  ------------------
  203|      0|  case 'n': out->insert('\n'); break;
  ------------------
  |  Branch (203:3): [True: 0, False: 7]
  ------------------
  204|      7|  default:  out->insert(e);    break;
  ------------------
  |  Branch (204:3): [True: 7, False: 0]
  ------------------
  205|      7|  }
  206|      7|}
_ZN6hobbes15unescapePatCharEh:
  208|      6|RegexPtr unescapePatChar(rchar_t x) {
  209|      6|  std::set<rchar_t> cs;
  210|      6|  unescapeInto(x, &cs);
  211|      6|  return anyOf(cs);
  212|      6|}
_ZN6hobbes9charRangeEhhPSt3setIhSt4lessIhESaIhEE:
  217|      1|void charRange(rchar_t i, rchar_t e, std::set<rchar_t>* out) {
  218|    257|  for (auto x = static_cast<size_t>(i); x <= static_cast<size_t>(e); ++x) {
  ------------------
  |  Branch (218:41): [True: 256, False: 1]
  ------------------
  219|    256|    out->insert(static_cast<rchar_t>(x));
  220|    256|  }
  221|      1|}
_ZN6hobbes8anyCharsEv:
  223|      3|const std::set<rchar_t>& anyChars() {
  224|      3|  static std::set<rchar_t> r;
  225|      3|  if (r.empty()) {
  ------------------
  |  Branch (225:7): [True: 1, False: 2]
  ------------------
  226|      1|    charRange(0x00, 0xff, &r);
  227|      1|  }
  228|      3|  return r;
  229|      3|}
_ZN6hobbes11readCharsetERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEm:
  231|      3|DCharset readCharset(const std::string& x, size_t i) {
  232|      3|  DCharset r;
  233|      3|  r.first = i;
  234|       |
  235|       |  // lookahead by one char so that we can catch ranges and escapes
  236|      7|  while (r.first < x.size()) {
  ------------------
  |  Branch (236:10): [True: 7, False: 0]
  ------------------
  237|      7|    rchar_t c0 = x[r.first];
  238|      7|    ++r.first;
  239|       |
  240|      7|    rchar_t c1 = (r.first == x.size()) ? '\0' : x[r.first];
  ------------------
  |  Branch (240:18): [True: 0, False: 7]
  ------------------
  241|      7|    if (c0 == ']') {
  ------------------
  |  Branch (241:9): [True: 3, False: 4]
  ------------------
  242|      3|      return r;
  243|      4|    } else if (c0 == '\\') {
  ------------------
  |  Branch (243:16): [True: 1, False: 3]
  ------------------
  244|       |      // c1 is the escaped character, and the increment below steps over it --
  245|       |      // but when the backslash is the last character there is no c1 (the read
  246|       |      // above substituted a nul for it), and stepping over it lands one past
  247|       |      // the end. diffRegex rejects a trailing escape outside a charset; do the
  248|       |      // same within one rather than returning a position that cannot be read.
  249|      1|      if (r.first == x.size()) {
  ------------------
  |  Branch (249:11): [True: 0, False: 1]
  ------------------
  250|      0|        throw std::runtime_error("Unexpected end in regex (expecting escape code)");
  251|      0|      }
  252|      1|      unescapeInto(c1, &r.second);
  253|      1|      ++r.first;
  254|      3|    } else if (c1 == '-' && (r.first+1) < x.size()) {
  ------------------
  |  Branch (254:16): [True: 0, False: 3]
  |  Branch (254:29): [True: 0, False: 0]
  ------------------
  255|      0|      charRange(c0, x[r.first+1], &r.second);
  256|      0|      ++r.first;
  257|      0|      ++r.first;
  258|      3|    } else {
  259|      3|      r.second.insert(c0);
  260|      3|    }
  261|      7|  }
  262|      0|  return r;
  263|      3|}
_ZN6hobbes7returnRERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEmRKSt10shared_ptrINS_5RegexEE:
  305|     22|DRegex returnR(const std::string& x, size_t k, const RegexPtr& r) {
  306|     22|  switch (k==x.size() ? '\0' : x[k]) {
  ------------------
  |  Branch (306:11): [True: 5, False: 17]
  ------------------
  307|      0|  case '?': return DRegex(k+1, either(epsilon(), r));
  ------------------
  |  Branch (307:3): [True: 0, False: 22]
  ------------------
  308|      0|  case '*': return DRegex(k+1, zeroOrMore(r));
  ------------------
  |  Branch (308:3): [True: 0, False: 22]
  ------------------
  309|      3|  case '+': return DRegex(k+1, sequence(r, zeroOrMore(r)));
  ------------------
  |  Branch (309:3): [True: 3, False: 19]
  ------------------
  310|     19|  default:  return DRegex(k, r);
  ------------------
  |  Branch (310:3): [True: 19, False: 3]
  ------------------
  311|     22|  }
  312|     22|}
_ZN6hobbes4seqRERKSt10shared_ptrINS_5RegexEES4_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEmPNS_10TermBudgetE:
  314|     19|DRegex seqR(const RegexPtr& lhs, const RegexPtr& c, const std::string& x, size_t k, TermBudget* tb) {
  315|     19|  DRegex cm = returnR(x, k, c);
  316|     19|  return diffRegex(sequence(lhs, cm.second), x, cm.first, tb);
  317|     19|}
_ZN6hobbes9diffRegexERKSt10shared_ptrINS_5RegexEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEmPNS_10TermBudgetE:
  319|     33|DRegex diffRegex(const RegexPtr& lhs, const std::string& x, size_t i, TermBudget* tb) {
  320|       |  // a position past the end is a step this function's own cases got wrong, not
  321|       |  // something an input can ask for -- each of them advances at most one past
  322|       |  // the character it consumed. Nothing downstream rechecks, though: reading
  323|       |  // from out there does not stop, it walks further off the end for as many
  324|       |  // terms as the budget allows (OSS-Fuzz testcase 4831270021693440 read ~1,000
  325|       |  // bytes past a 3-byte buffer that way). Two steps did get it wrong -- an
  326|       |  // unterminated capturing group name below, and a trailing escape in
  327|       |  // readCharset -- and both now reject instead. This is what keeps a third
  328|       |  // from being an out-of-bounds read rather than an error.
  329|     33|  if (i > x.size()) {
  ------------------
  |  Branch (329:7): [True: 0, False: 33]
  ------------------
  330|      0|    throw std::runtime_error("Internal error: regex read position is past the end of the regex");
  331|      0|  }
  332|       |
  333|     33|  if (i == x.size()) {
  ------------------
  |  Branch (333:7): [True: 8, False: 25]
  ------------------
  334|      8|    return DRegex(i, lhs);
  335|     25|  } else {
  336|       |    // one term of the regex is read below, whichever case it takes
  337|     25|    tb->take();
  338|       |
  339|     25|    rchar_t n = (i+1==x.size()) ? '\0' : x[i+1];
  ------------------
  |  Branch (339:17): [True: 2, False: 23]
  ------------------
  340|       |
  341|     25|    switch (x[i]) {
  342|       |    // a group ends here; a quantifier after it belongs to the whole group, and
  343|       |    // the '(' case applies it once the body has been read (reading it here
  344|       |    // would attach it to the alternative being read at the time, so that
  345|       |    // '(a|b)*' meant 'a|b*')
  346|      3|    case ')': return DRegex(i+1, lhs);
  ------------------
  |  Branch (346:5): [True: 3, False: 22]
  ------------------
  347|      3|    case '(': {
  ------------------
  |  Branch (347:5): [True: 3, False: 22]
  ------------------
  348|       |      // maybe read a binding name for this group
  349|       |      // (according to typical accepted regex syntax)
  350|      3|      std::string b;
  351|      3|      if (n == '?') {
  ------------------
  |  Branch (351:11): [True: 3, False: 0]
  ------------------
  352|      3|        size_t k = i+2;
  353|      3|        if (k < x.size() && x[k] == 'P') ++k;
  ------------------
  |  Branch (353:13): [True: 3, False: 0]
  |  Branch (353:29): [True: 0, False: 3]
  ------------------
  354|      3|        rchar_t gd = (k < x.size() ? x[k] : '\0');
  ------------------
  |  Branch (354:23): [True: 3, False: 0]
  ------------------
  355|      3|        ++k;
  356|      3|        rchar_t ed;
  357|      3|        if (gd == '<') {
  ------------------
  |  Branch (357:13): [True: 3, False: 0]
  ------------------
  358|      3|          ed = '>';
  359|      3|        } else if (gd == '\'') {
  ------------------
  |  Branch (359:20): [True: 0, False: 0]
  ------------------
  360|      0|          ed = '\'';
  361|      0|        } else {
  362|      0|          throw std::runtime_error("Expected capturing group name delimited as 'name' or <name>");
  363|      0|        }
  364|      3|        size_t j = k;
  365|     18|        while (j < x.size() && x[j] != ed) { ++j; }
  ------------------
  |  Branch (365:16): [True: 18, False: 0]
  |  Branch (365:32): [True: 15, False: 3]
  ------------------
  366|       |
  367|       |        // the scan above stops either on the closing delimiter or on the end of
  368|       |        // the regex. Only the first is a group name: the second means there is
  369|       |        // no delimiter to resume after, and reading on from it steps past the
  370|       |        // end (`i` becomes x.size(), and the recursion below starts at i+1).
  371|      3|        if (j == x.size()) {
  ------------------
  |  Branch (371:13): [True: 0, False: 3]
  ------------------
  372|      0|          throw std::runtime_error(std::string("Unexpected end in regex (expecting '") + static_cast<char>(ed) + "' to close a capturing group name)");
  373|      0|        }
  374|       |
  375|      3|        b = x.substr(k, j-k);
  376|      3|        i = j;
  377|      3|      }
  378|       |
  379|       |      // now the group body just matches as if inline, with any quantifier
  380|       |      // after the group applied to the body as a whole
  381|       |      // (but we may bind to the group match result)
  382|      3|      DRegex g = diffRegex(epsilon(), x, i+1, tb);
  383|      3|      DRegex q = returnR(x, g.first, g.second);
  384|      3|      return diffRegex(sequence(lhs, bindTo(b, q.second)), x, q.first, tb);
  385|      3|    }
  386|      0|    case '|': {
  ------------------
  |  Branch (386:5): [True: 0, False: 25]
  ------------------
  387|      0|      DRegex n = diffRegex(epsilon(), x, i+1, tb);
  388|      0|      return DRegex(n.first, either(lhs, n.second));
  389|      3|    }
  390|      0|    case '.': {
  ------------------
  |  Branch (390:5): [True: 0, False: 25]
  ------------------
  391|      0|      return seqR(lhs, anyOf(anyChars()), x, i+1, tb);
  392|      3|    }
  393|      3|    case '[': {
  ------------------
  |  Branch (393:5): [True: 3, False: 22]
  ------------------
  394|      3|      if (i+1 < x.size()) {
  ------------------
  |  Branch (394:11): [True: 3, False: 0]
  ------------------
  395|      3|        bool invert = x[i+1] == '^';
  396|      3|        auto p      = readCharset(x, invert ? (i+2) : (i+1));
  ------------------
  |  Branch (396:38): [True: 3, False: 0]
  ------------------
  397|      3|        auto cs     = invert ? setDifference(anyChars(), p.second) : p.second;
  ------------------
  |  Branch (397:23): [True: 3, False: 0]
  ------------------
  398|       |
  399|      3|        return seqR(lhs, anyOf(cs), x, p.first, tb);
  400|      3|      } else {
  401|      0|        throw std::runtime_error("Unexpected end in regex (expecting ']')");
  402|      0|      }
  403|      3|    }
  404|      6|    case '\\': {
  ------------------
  |  Branch (404:5): [True: 6, False: 19]
  ------------------
  405|      6|      if (i+1 < x.size()) {
  ------------------
  |  Branch (405:11): [True: 6, False: 0]
  ------------------
  406|      6|        return seqR(lhs, unescapePatChar(x[i+1]), x, i+2, tb);
  407|      6|      } else {
  408|      0|        throw std::runtime_error("Unexpected end in regex (expecting escape code)");
  409|      0|      }
  410|      6|    }
  411|     10|    default: {
  ------------------
  |  Branch (411:5): [True: 10, False: 15]
  ------------------
  412|     10|      return seqR(lhs, charLit(x[i]), x, i+1, tb);
  413|      6|    }}
  414|     25|  }
  415|     33|}
_ZN6hobbes10parseRegexERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  417|      8|RegexPtr parseRegex(const std::string& x) {
  418|      8|  TermBudget tb;
  419|      8|  DRegex dr = diffRegex(epsilon(), x, 0, &tb);
  420|      8|  while (dr.first < x.size()) {
  ------------------
  |  Branch (420:10): [True: 0, False: 8]
  ------------------
  421|       |    // only an unmatched ')' stops the read early; it closes an implicit group
  422|       |    // around everything read so far, so a quantifier after it applies to all
  423|       |    // of that (as it did when the ')' case read the quantifier itself)
  424|      0|    dr = returnR(x, dr.first, dr.second);
  425|      0|    dr = diffRegex(dr.second, x, dr.first, &tb);
  426|      0|  }
  427|      8|  return dr.second;
  428|      8|}
_ZN6hobbes12bindingNamesB5cxx11ERKSt10shared_ptrINS_5RegexEE:
  470|      6|str::seq bindingNames(const RegexPtr& rgx) {
  471|      6|  str::set ns;
  472|      6|  std::unordered_set<const Regex*> seen;
  473|      6|  bnamesF(&ns, &seen).visit(rgx);
  474|      6|  return str::seq(ns.begin(), ns.end());
  475|      6|}
_ZN6hobbes17expandedRegexSizeERKSt10shared_ptrINS_5RegexEE:
  511|     12|size_t expandedRegexSize(const RegexPtr& rgx) {
  512|     12|  std::unordered_map<const Regex*, size_t> memo;
  513|     12|  return expandedSizeF(&memo).sizeOf(rgx);
  514|     12|}
_ZN6hobbes20rejectOversizedRegexERKSt10shared_ptrINS_5RegexEE:
  516|     12|void rejectOversizedRegex(const RegexPtr& rgx) {
  517|     12|  if (expandedRegexSize(rgx) > maxRegexExpandedSize) {
  ------------------
  |  Branch (517:7): [True: 0, False: 12]
  ------------------
  518|      0|    throw std::runtime_error("regex is too complex to compile (expands to more than " + str::from(maxRegexExpandedSize) + " terms)");
  519|      0|  }
  520|     12|}
_ZN6hobbes14usedCharRangesERKSt6vectorINS_8NFAStateESaIS1_EERKSt3setIjSt4lessIjESaIjEE:
  575|      8|CharRanges usedCharRanges(const NFA& nfa, const stateset& ss) {
  576|      8|  CharRanges rs;
  577|     43|  for (auto s : ss) {
  ------------------
  |  Branch (577:15): [True: 43, False: 8]
  ------------------
  578|     43|    rs = nfa[s].chars.disjointRanges(rs);
  579|     43|  }
  580|      8|  return rs;
  581|      8|}
_ZN6hobbes11regexBeforeERKSt10shared_ptrINS_5RegexEEjjPSt6vectorINS_8NFAStateESaIS6_EE:
  638|     32|state regexBefore(const RegexPtr& p, state cont, result x, NFA* nfa) {
  639|     32|  state rstate = nfa->size();
  640|     32|  nfa->resize(rstate+1);
  641|     32|  switchOf(p, linkStateF(nfa, rstate, cont, x));
  642|     32|  return rstate;
  643|     32|}
_ZN6hobbes10accumRegexERKSt10shared_ptrINS_5RegexEEjPSt6vectorINS_8NFAStateESaIS6_EE:
  645|      2|state accumRegex(const RegexPtr& p, result x, NFA* nfa) {
  646|      2|  state rstate = nfa->size();
  647|      2|  nfa->resize(rstate+1);
  648|      2|  (*nfa)[rstate].acc = x;
  649|       |
  650|      2|  return regexBefore(p, rstate, x, nfa);
  651|      2|}
_ZN6hobbes14findEpsClosureERKSt6vectorINS_8NFAStateESaIS1_EEjPS0_IbSaIbEEPSt3mapIjSt3setIjSt4lessIjESaIjEESC_SaISt4pairIKjSE_EEEPm:
  801|     12|void findEpsClosure(const NFA& nfa, state s0, statemarks* sms, EpsClosure* ec, size_t* held) {
  802|       |  // false: visit this state and schedule its successors; true: combine it
  803|     12|  std::vector<std::pair<state, bool>> walk(1, std::make_pair(s0, false));
  804|       |
  805|     82|  while (!walk.empty()) {
  ------------------
  |  Branch (805:10): [True: 70, False: 12]
  ------------------
  806|     70|    const state s = walk.back().first;
  807|       |
  808|     70|    if (!walk.back().second) {
  ------------------
  |  Branch (808:9): [True: 35, False: 35]
  ------------------
  809|     35|      if ((*sms)[s]) {
  ------------------
  |  Branch (809:11): [True: 0, False: 35]
  ------------------
  810|      0|        walk.pop_back();
  811|      0|        continue;
  812|      0|      }
  813|     35|      (*sms)[s] = true;
  814|     35|      walk.back().second = true;
  815|       |
  816|     35|      const stateset& ets = nfa[s].eps;
  817|     61|      for (auto et = ets.rbegin(); et != ets.rend(); ++et) {
  ------------------
  |  Branch (817:36): [True: 26, False: 35]
  ------------------
  818|     26|        if (!(*sms)[*et]) {
  ------------------
  |  Branch (818:13): [True: 23, False: 3]
  ------------------
  819|     23|          walk.push_back(std::make_pair(*et, false));
  820|     23|        }
  821|     26|      }
  822|     35|    } else {
  823|     35|      walk.pop_back();
  824|       |
  825|     35|      stateset stes = (*ec)[s];
  826|     35|      stes.insert(s);
  827|     35|      for (auto et : nfa[s].eps) {
  ------------------
  |  Branch (827:20): [True: 26, False: 35]
  ------------------
  828|     26|        stes.insert(et);
  829|       |
  830|     26|        const stateset& rstes = (*ec)[et];
  831|     26|        stes.insert(rstes.begin(), rstes.end());
  832|     26|      }
  833|       |
  834|     35|      *held += stes.size();
  835|     35|      if (*held > maxEpsClosureStates) {
  ------------------
  |  Branch (835:11): [True: 0, False: 35]
  ------------------
  836|      0|        throw std::runtime_error("regex is too complex to compile (needs more than " + str::from(maxEpsClosureStates) + " epsilon-closure states)");
  837|      0|      }
  838|     35|      (*ec)[s] = std::move(stes);
  839|     35|    }
  840|     70|  }
  841|     12|}
_ZN6hobbes14findEpsClosureERKSt6vectorINS_8NFAStateESaIS1_EEPSt3mapIjSt3setIjSt4lessIjESaIjEES9_SaISt4pairIKjSB_EEE:
  843|      1|void findEpsClosure(const NFA& nfa, EpsClosure* ec) {
  844|      1|  statemarks ms(nfa.size(), false);
  845|      1|  size_t     held = 0;
  846|       |
  847|     36|  for (state s = 0; s < nfa.size(); ++s) {
  ------------------
  |  Branch (847:21): [True: 35, False: 1]
  ------------------
  848|     35|    if (!ms[s]) {
  ------------------
  |  Branch (848:9): [True: 12, False: 23]
  ------------------
  849|     12|      findEpsClosure(nfa, s, &ms, ec, &held);
  850|     12|    }
  851|     35|  }
  852|      1|}
_ZN6hobbes8epsStateERKSt3mapIjSt3setIjSt4lessIjESaIjEES3_SaISt4pairIKjS5_EEEj:
  854|     30|const stateset& epsState(const EpsClosure& ec, state s) {
  855|     30|  auto eci = ec.find(s);
  856|     30|  if (eci != ec.end()) {
  ------------------
  |  Branch (856:7): [True: 30, False: 0]
  ------------------
  857|     30|    return eci->second;
  858|     30|  } else {
  859|      0|    throw std::runtime_error("Internal error, NFA state not in eps*");
  860|      0|  }
  861|     30|}
_ZN6hobbes6insertEPSt3setIjSt4lessIjESaIjEERKS4_:
  908|     29|void insert(stateset* o, const stateset& i) {
  909|     29|  o->insert(i.begin(), i.end());
  910|     29|}
_ZN6hobbes13nfaTransitionERKSt6vectorINS_8NFAStateESaIS1_EERKSt3mapIjSt3setIjSt4lessIjESaIjEES9_SaISt4pairIKjSB_EEERKSB_RKSC_IhhEPm:
  915|     21|stateset nfaTransition(const NFA& nfa, const EpsClosure& ec, const stateset& ss, const CharRange& cr, size_t* steps) {
  916|     21|  stateset result;
  917|    142|  for (state s : ss) {
  ------------------
  |  Branch (917:16): [True: 142, False: 21]
  ------------------
  918|    142|    if (const auto* tss = nfa[s].chars.lookupRangeSubset(cr)) {
  ------------------
  |  Branch (918:21): [True: 29, False: 113]
  ------------------
  919|     29|      for (state t : *tss) {
  ------------------
  |  Branch (919:20): [True: 29, False: 29]
  ------------------
  920|     29|        const stateset& cts = epsState(ec, t);
  921|     29|        *steps += cts.size();
  922|     29|        insert(&result, cts);
  923|     29|      }
  924|     29|    }
  925|    142|  }
  926|     21|  return result;
  927|     21|}
_ZN6hobbes8dfaStateEPKNS_2ccERKSt6vectorINS_8NFAStateESaIS4_EEPSt3mapISt3setIjSt4lessIjESaIjEEjSB_ISE_ESaISt4pairIKSE_jEEEPS3_INS_8DFAStateESaISM_EEPS3_ISG_IjSE_ESaISQ_EERSH_:
  935|     22|state dfaState(const cc* c, const NFA& nfa, Nss2Ds* nss2ds, DFA* dfa, std::vector<std::pair<state, stateset>>* pending, const stateset& ss) {
  936|       |  // did we already make this state?  if so, just return it
  937|     22|  auto didIt = nss2ds->find(ss);
  938|     22|  if (didIt != nss2ds->end()) {
  ------------------
  |  Branch (938:7): [True: 14, False: 8]
  ------------------
  939|     14|    return didIt->second;
  940|     14|  }
  941|       |
  942|       |  // we need to make this state -- allocate it and remember it
  943|      8|  state result = dfa->size();
  944|      8|  dfa->resize(dfa->size() + 1);
  945|       |
  946|       |  // determinizing is exponential in the worst case, and it doesn't take an
  947|       |  // exotic regex to hit it: ' *...........,...............' is 29 characters
  948|       |  // that determinize to over 50k states. cap the construction so that a regex
  949|       |  // literal can't hang the compiler (or the parser -- regex literals are
  950|       |  // compiled where they're read).
  951|      8|  if (dfa->size() > c->regexMaxDFAStates()) {
  ------------------
  |  Branch (951:7): [True: 0, False: 8]
  ------------------
  952|      0|    throw std::runtime_error("regex is too complex to compile (needs more than " + str::from(c->regexMaxDFAStates()) + " DFA states)");
  953|      0|  }
  954|       |
  955|      8|  if (c->throwOnHugeRegexDFA() and c->regexDFAOverNFAMaxRatio() > 0 and (dfa->size() / nfa.size() > size_t(c->regexDFAOverNFAMaxRatio()))) {
  ------------------
  |  Branch (955:7): [True: 0, False: 8]
  |  Branch (955:36): [True: 0, False: 0]
  |  Branch (955:73): [True: 0, False: 0]
  ------------------
  956|      0|    throw std::runtime_error("regexes DFA over NFA Max ratio was breached");
  957|      0|  }
  958|       |
  959|      8|  (*nss2ds)[ss] = result;
  960|      8|  pending->push_back(std::make_pair(result, ss));
  961|      8|  return result;
  962|      8|}
_ZN6hobbes12disambiguateEPKNS_2ccERKSt6vectorINS_8NFAStateESaIS4_EEPS3_INS_8DFAStateESaIS9_EEPSt3mapImSt3setImSt4lessImESaImEESG_SaISt4pairIKmSI_EEE:
  979|      1|void disambiguate(const cc* c, const NFA& nfa, DFA* dfa, RStates* rstates) {
  980|       |  // determine eps* for this NFA
  981|      1|  EpsClosure ec;
  982|      1|  findEpsClosure(nfa, &ec);
  983|       |
  984|       |  // starting from the eps* start state, follow non-eps transitions to eps*
  985|       |  // successor states, making a DFA state for each set of NFA states reached.
  986|       |  //
  987|       |  // this is a walk over the DFA as it is built, and it is done with an
  988|       |  // explicit worklist rather than by recursing into each successor as it is
  989|       |  // found: the walk can be as deep as the DFA has states -- a chain of
  990|       |  // transitions with no repeats is one frame per state -- and the cap on
  991|       |  // state count above bounds how many there are, not how deep a chain of them
  992|       |  // goes. A regex well inside that cap ran the stack out this way once its
  993|       |  // frames were made large by instrumentation (each carried the sets of NFA
  994|       |  // states it was visiting). The order states are made in is not significant
  995|       |  // to anything downstream, only that each set of NFA states gets one.
  996|      1|  Nss2Ds nss2ds;
  997|      1|  std::vector<std::pair<state, stateset>> pending;
  998|      1|  dfaState(c, nfa, &nss2ds, dfa, &pending, epsState(ec, 0));
  999|       |
 1000|      1|  size_t steps = 0;
 1001|       |
 1002|      9|  while (!pending.empty()) {
  ------------------
  |  Branch (1002:10): [True: 8, False: 1]
  ------------------
 1003|      8|    const state    result = pending.back().first;
 1004|      8|    const stateset ss     = pending.back().second;
 1005|      8|    pending.pop_back();
 1006|       |
 1007|       |    // ok, how can we transition out of here?
 1008|       |    // for each case, we'll go to a set of NFA states
 1009|      8|    const CharRanges crs = usedCharRanges(nfa, ss);
 1010|      8|    steps += ss.size() * (crs.size() + 1);
 1011|      8|    if (steps > maxDisambiguationSteps) {
  ------------------
  |  Branch (1011:9): [True: 0, False: 8]
  ------------------
 1012|      0|      throw std::runtime_error("regex is too complex to compile (needs more than " + str::from(maxDisambiguationSteps) + " determinization steps)");
 1013|      0|    }
 1014|     21|    for (const auto& cr : crs) {
  ------------------
  |  Branch (1014:25): [True: 21, False: 8]
  ------------------
 1015|     21|      stateset nss = nfaTransition(nfa, ec, ss, cr, &steps);
 1016|     21|      auto ns = dfaState(c, nfa, &nss2ds, dfa, &pending, nss);
 1017|     21|      (*dfa)[result].chars.insert(cr, ns);
 1018|     21|    }
 1019|       |
 1020|       |    // our DFA state accepts if any of its NFA states accept
 1021|       |    // we may have multiple potential matches here, so we should
 1022|       |    // keep track of every such set so that outer match compilation
 1023|       |    // can choose the right one
 1024|     43|    for (state s : ss) {
  ------------------
  |  Branch (1024:18): [True: 43, False: 8]
  ------------------
 1025|     43|      auto nr = nfa[s].acc;
 1026|     43|      if (nr != nullResult) {
  ------------------
  |  Branch (1026:11): [True: 2, False: 41]
  ------------------
 1027|      2|        (*dfa)[result].acc = result;
 1028|      2|        (*rstates)[result].insert(nr);
 1029|      2|      }
 1030|     43|    }
 1031|       |
 1032|       |    // our DFA state begins/ends subrange recording for each collapsed NFA state
 1033|     43|    for (state s : ss) {
  ------------------
  |  Branch (1033:18): [True: 43, False: 8]
  ------------------
 1034|     43|      for (const auto& b : nfa[s].begins) {
  ------------------
  |  Branch (1034:26): [True: 3, False: 43]
  ------------------
 1035|      3|        (*dfa)[result].begins[b.first].insert(b.second.begin(), b.second.end());
 1036|      3|      }
 1037|     43|      for (const auto& e : nfa[s].ends) {
  ------------------
  |  Branch (1037:26): [True: 5, False: 43]
  ------------------
 1038|      5|        (*dfa)[result].ends[e.first].insert(e.second.begin(), e.second.end());
 1039|      5|      }
 1040|     43|    }
 1041|      8|  }
 1042|      1|}
_ZN6hobbes15makeExprDFAFuncEPNS_2ccERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_8MonoTypeEERKSt6vectorINS_8DFAStateESaISG_EERKNS_17LexicalAnnotationE:
 1221|      1|void makeExprDFAFunc(cc* c, const std::string& fname, const MonoTypePtr& captureTy, const DFA& dfa, const LexicalAnnotation& rootLA) {
 1222|       |  // F(cap,cs,i,e,s) =
 1223|       |  //   switch (s) {
 1224|       |  //   ...
 1225|       |  //   case S:
 1226|       |  //     cap.N.beginX <- i;
 1227|       |  //     ... etc for every begin marker
 1228|       |  //     cap.N.endX <- i;
 1229|       |  //     ... etc for every end marker
 1230|       |  //
 1231|       |  //     if (i == e) then
 1232|       |  //       ACC(S)
 1233|       |  //     else
 1234|       |  //       switch (c) {
 1235|       |  //       ...
 1236|       |  //       case C:
 1237|       |  //         F(cs, i+1, e, SUCC(S,C))
 1238|       |  //       ...
 1239|       |  //   ...
 1240|      1|  Switch::Bindings bs;
 1241|      1|  MonoTypePtr arrT = freshTypeVar();
 1242|      1|  QualTypePtr qarrElemTy = qualtype(list(std::make_shared<Constraint>("Array", list(arrT, primty("char")))), functy(list(arrT, primty("long")), primty("char")));
 1243|      1|  QualTypePtr qarrT = qualtype(list(std::make_shared<Constraint>("Array", list(arrT, primty("char")))), arrT);
 1244|       |
 1245|      9|  for (size_t s = 0; s < dfa.size(); ++s) {
  ------------------
  |  Branch (1245:22): [True: 8, False: 1]
  ------------------
 1246|       |    // all transitions out of this state
 1247|      8|    ExprPtr dispatchExpr =
 1248|      8|      transitionMapping(
 1249|      8|        fname,
 1250|      8|        dfa[s],
 1251|      8|        fncall(var("elem", rootLA), list(var("cs", rootLA), var("i", rootLA)), rootLA),
 1252|      8|        constant(static_cast<int>(-1), rootLA),
 1253|      8|        rootLA
 1254|      8|      );
 1255|       |
 1256|       |    // evaluate the input char and transition
 1257|      8|    ExprPtr evalChar =
 1258|      8|      fncall(
 1259|      8|        var("if", rootLA),
 1260|      8|        list(
 1261|      8|          fncall(var("leq", rootLA), list(var("i", rootLA), var("e", rootLA)), rootLA),
 1262|      8|          constant(static_cast<int>(dfa[s].acc), rootLA),
 1263|      8|          dispatchExpr
 1264|      8|        ),
 1265|      8|        rootLA
 1266|      8|      );
 1267|       |
 1268|       |    // mark begin/end capture ranges as appropriate
 1269|      8|    for (const auto& b : dfa[s].begins) {
  ------------------
  |  Branch (1269:24): [True: 3, False: 8]
  ------------------
 1270|      3|      for (const auto& v : b.second) {
  ------------------
  |  Branch (1270:26): [True: 3, False: 3]
  ------------------
 1271|       |        // cap.N.beginvar <- i
 1272|       |        // ...
 1273|      3|        evalChar =
 1274|      3|          let("_", assign(proj(var("cap", rootLA), str::from(b.first) + "_begin_" + v, rootLA), var("i", rootLA), rootLA),
 1275|      3|            evalChar,
 1276|      3|            rootLA
 1277|      3|          );
 1278|      3|      }
 1279|      3|    }
 1280|       |
 1281|      8|    for (const auto& e : dfa[s].ends) {
  ------------------
  |  Branch (1281:24): [True: 5, False: 8]
  ------------------
 1282|      5|      for (const auto& v : e.second) {
  ------------------
  |  Branch (1282:26): [True: 5, False: 5]
  ------------------
 1283|       |        // cap.N.endvar <- i
 1284|       |        // ...
 1285|      5|        evalChar =
 1286|      5|          let("_", assign(proj(var("cap", rootLA), str::from(e.first) + "_end_" + v, rootLA), var("i", rootLA), rootLA),
 1287|      5|            evalChar,
 1288|      5|            rootLA
 1289|      5|          );
 1290|      5|      }
 1291|      5|    }
 1292|       |
 1293|       |    // do all of this when in this state
 1294|      8|    bs.push_back(Switch::Binding(PrimitivePtr(new Int(static_cast<int>(s), rootLA)), evalChar));
 1295|      8|  }
 1296|       |
 1297|      1|  ExprPtr fndef =
 1298|      1|    fn(str::strings("cap", "cs", "i", "e", "s"),
 1299|      1|      let("n", fncall(var("ladd", rootLA), list(var("i", rootLA), constant(static_cast<long>(1), rootLA)), rootLA),
 1300|      1|      let("elem", assume(var("element", rootLA), qarrElemTy, rootLA),
 1301|      1|        switchE(
 1302|      1|          var("s", rootLA),
 1303|      1|          bs,
 1304|      1|          constant(static_cast<int>(-1), rootLA),
 1305|      1|          rootLA
 1306|      1|        ),
 1307|      1|      rootLA),rootLA),
 1308|      1|      rootLA
 1309|      1|    );
 1310|       |
 1311|      1|  c->define(fname, assume(fndef, qualtype(qarrT->constraints(), functy(list(captureTy, arrT, primty("long"), primty("long"), primty("int")), primty("int"))), rootLA));
 1312|      1|}
_ZN6hobbes11makeDFAFuncEPNS_2ccERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_8MonoTypeEERKSt6vectorINS_8DFAStateESaISG_EERKNS_17LexicalAnnotationE:
 1388|      1|void makeDFAFunc(cc* c, const std::string& fname, const MonoTypePtr& captureTy, const DFA& dfa, const LexicalAnnotation& rootLA) {
 1389|      1|  const size_t maxStates      = c->regexMaxExprDFASize();
 1390|      1|  const size_t maxTransitions = c->regexMaxExprDFATransitions();
 1391|       |
 1392|       |  // the transitions are counted once, and only where the count decides
 1393|       |  // something (a DFA under the state cap) or is reported (one with captures)
 1394|      1|  const bool   underStates = dfa.size() < maxStates;
 1395|      1|  const size_t transitions = (underStates || !isUnit(captureTy)) ? dfaTransitions(dfa) : 0;
  ------------------
  |  Branch (1395:31): [True: 1, False: 0]
  |  Branch (1395:46): [True: 0, False: 0]
  ------------------
 1396|       |
 1397|      1|  if (underStates && transitions < maxTransitions) {
  ------------------
  |  Branch (1397:7): [True: 1, False: 0]
  |  Branch (1397:22): [True: 1, False: 0]
  ------------------
 1398|      1|    makeExprDFAFunc(c, fname, captureTy, dfa, rootLA);
 1399|      1|  } else if (isUnit(captureTy)) {
  ------------------
  |  Branch (1399:14): [True: 0, False: 0]
  ------------------
 1400|      0|    makeInterpDFAFunc(c, fname, captureTy, dfa, rootLA);
 1401|      0|  } else {
 1402|      0|    throw std::runtime_error(
 1403|      0|      "regex is too complex to compile (its capture groups require it to be compiled as an expression, "
 1404|      0|      "but its DFA has " + str::from(dfa.size()) + " states and " + str::from(transitions) + " transitions, "
 1405|      0|      "past the " + str::from(maxStates) + " states or " + str::from(maxTransitions) + " transitions "
 1406|      0|      "an expression may hold)"
 1407|      0|    );
 1408|      0|  }
 1409|      1|}
_ZN6hobbes27mergeCharRangesAndEqResultsEPSt6vectorINS_8DFAStateESaIS1_EERKSt3mapImSt3setImSt4lessImESaImEES8_SaISt4pairIKmSA_EEEPSF_:
 1412|      1|void mergeCharRangesAndEqResults(DFA* dfa, const RStates& fstates, RStates* rstates) {
 1413|      1|  std::map<RegexIdxs, size_t> results;
 1414|       |
 1415|      8|  for (auto& s : *dfa) {
  ------------------
  |  Branch (1415:16): [True: 8, False: 1]
  ------------------
 1416|      8|    s.chars.compact();
 1417|       |
 1418|      8|    if (s.acc != nullResult) {
  ------------------
  |  Branch (1418:9): [True: 2, False: 6]
  ------------------
 1419|      2|      auto fsi = fstates.find(s.acc);
 1420|      2|      if (fsi == fstates.end()) { throw std::runtime_error("Internal error, invalid regex state mapping determined"); }
  ------------------
  |  Branch (1420:11): [True: 0, False: 2]
  ------------------
 1421|       |
 1422|      2|      auto si = results.find(fsi->second);
 1423|      2|      if (si != results.end()) {
  ------------------
  |  Branch (1423:11): [True: 0, False: 2]
  ------------------
 1424|      0|        s.acc = si->second;
 1425|      2|      } else {
 1426|      2|        size_t ns = results.size();
 1427|       |
 1428|      2|        results[fsi->second] = ns;
 1429|      2|        (*rstates)[ns]       = fsi->second;
 1430|      2|        s.acc                = ns;
 1431|      2|      }
 1432|      2|    }
 1433|      8|  }
 1434|      1|}
_ZN6hobbes9appendKeyEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEm:
 1476|     71|void appendKey(std::string* k, uint64_t x) {
 1477|    639|  for (size_t b = 0; b < sizeof(x); ++b) {
  ------------------
  |  Branch (1477:22): [True: 568, False: 71]
  ------------------
 1478|    568|    k->push_back(static_cast<char>((x >> (8 * b)) & 0xff));
 1479|    568|  }
 1480|     71|}
_ZN6hobbes8stateKeyB5cxx11EmRKSt6vectorISt4pairIS1_IhhEjESaIS3_EEPNS_14StatePartitionE:
 1484|      8|std::string stateKey(size_t obs, const dtransitions::Mapping& ts, StatePartition* p) {
 1485|      8|  std::string k;
 1486|      8|  k.reserve(sizeof(uint64_t) * (1 + (3 * ts.size())));
 1487|      8|  appendKey(&k, obs);
 1488|     21|  for (const auto& t : ts) {
  ------------------
  |  Branch (1488:22): [True: 21, False: 8]
  ------------------
 1489|     21|    appendKey(&k, t.first.first);
 1490|     21|    appendKey(&k, t.first.second);
 1491|     21|    appendKey(&k, p->find(t.second));
 1492|     21|  }
 1493|      8|  return k;
 1494|      8|}
_ZN6hobbes15findEquivStatesERKSt6vectorINS_8DFAStateESaIS1_EE:
 1496|      1|EqStates findEquivStates(const DFA& dfa) {
 1497|      1|  StatePartition p(dfa.size());
 1498|       |
 1499|       |  // acceptance and capture marking are fixed for the life of a state, so reduce
 1500|       |  // them to a single comparable number once rather than per pass
 1501|      1|  std::map<Observation, size_t> obsIdx;
 1502|      1|  std::vector<size_t> obs(dfa.size());
 1503|      1|  std::vector<dtransitions::Mapping> mappings(dfa.size());
 1504|      9|  for (size_t s = 0; s < dfa.size(); ++s) {
  ------------------
  |  Branch (1504:22): [True: 8, False: 1]
  ------------------
 1505|      8|    size_t nid = obsIdx.size();
 1506|      8|    obs[s]      = obsIdx.insert(std::make_pair(Observation(dfa[s].acc, dfa[s].begins, dfa[s].ends), nid)).first->second;
 1507|      8|    mappings[s] = dfa[s].chars.mapping();
 1508|      8|  }
 1509|       |
 1510|       |  // two states are equivalent when they observe the same thing and their
 1511|       |  // transitions agree on the classes established so far. merging states can
 1512|       |  // bring more states into agreement, so keep refining until a pass finds
 1513|       |  // nothing new -- a pass that stops short only leaves the DFA larger, never
 1514|       |  // wrong, so the states left unmerged in a cycle are safe to keep.
 1515|      1|  bool merging = true;
 1516|      2|  while (merging) {
  ------------------
  |  Branch (1516:10): [True: 1, False: 1]
  ------------------
 1517|      1|    merging = false;
 1518|       |
 1519|      1|    std::unordered_map<std::string, state> keys;
 1520|      1|    std::vector<std::pair<state, state>> merges;
 1521|      9|    for (state s = 0; s < dfa.size(); ++s) {
  ------------------
  |  Branch (1521:23): [True: 8, False: 1]
  ------------------
 1522|      8|      if (p.find(s) != s) continue; // one key per class, not per state
  ------------------
  |  Branch (1522:11): [True: 0, False: 8]
  ------------------
 1523|       |
 1524|      8|      auto k = keys.insert(std::make_pair(stateKey(obs[s], mappings[s], &p), s));
 1525|      8|      if (!k.second) {
  ------------------
  |  Branch (1525:11): [True: 0, False: 8]
  ------------------
 1526|      0|        merges.push_back(std::make_pair(k.first->second, s));
 1527|      0|      }
 1528|      8|    }
 1529|       |
 1530|       |    // deferred so that every key in a pass is read against the same classes
 1531|      1|    for (const auto& m : merges) {
  ------------------
  |  Branch (1531:24): [True: 0, False: 1]
  ------------------
 1532|      0|      merging = p.merge(m.first, m.second) || merging;
  ------------------
  |  Branch (1532:17): [True: 0, False: 0]
  |  Branch (1532:47): [True: 0, False: 0]
  ------------------
 1533|      0|    }
 1534|      1|  }
 1535|       |
 1536|      1|  EqStates result;
 1537|      9|  for (state s = 0; s < dfa.size(); ++s) {
  ------------------
  |  Branch (1537:21): [True: 8, False: 1]
  ------------------
 1538|      8|    state r = p.find(s);
 1539|      8|    if (r != s) {
  ------------------
  |  Branch (1539:9): [True: 0, False: 8]
  ------------------
 1540|      0|      result[s] = r;
 1541|      0|    }
 1542|      8|  }
 1543|      1|  return result;
 1544|      1|}
_ZN6hobbes17removeEquivStatesERKSt6vectorINS_8DFAStateESaIS1_EERKSt3mapIjjSt4lessIjESaISt4pairIKjjEEE:
 1546|      1|DFA removeEquivStates(const DFA& dfa, const EqStates& eqs) {
 1547|       |  // after removing states, some states will need to be renumbered
 1548|       |  // we can infer this mapping from the eqstate mapping
 1549|      1|  std::map<state, state> shifted;
 1550|      1|  size_t accShift = 0;
 1551|      1|  for (auto eq = eqs.begin(); eq != eqs.end();) {
  ------------------
  |  Branch (1551:31): [True: 0, False: 1]
  ------------------
 1552|      0|    state s0 = eq->first+1;
 1553|      0|    ++eq;
 1554|      0|    state s1 = (eq == eqs.end()) ? dfa.size() : eq->first;
  ------------------
  |  Branch (1554:16): [True: 0, False: 0]
  ------------------
 1555|      0|    ++accShift;
 1556|       |
 1557|      0|    for (state s = s0; s < s1; ++s) {
  ------------------
  |  Branch (1557:24): [True: 0, False: 0]
  ------------------
 1558|      0|      shifted[s] = s - accShift;
 1559|      0|    }
 1560|      0|  }
 1561|       |
 1562|       |  // now make a new DFA with eq states removed
 1563|       |  // all references to states need to be
 1564|       |  // patched up to account for merging/shifting
 1565|      1|  DFA result;
 1566|      1|  result.reserve(dfa.size()-eqs.size());
 1567|       |
 1568|      9|  for (size_t s = 0; s < dfa.size(); ++s) {
  ------------------
  |  Branch (1568:22): [True: 8, False: 1]
  ------------------
 1569|      8|    const auto& sd = dfa[s];
 1570|       |
 1571|       |    // don't include eliminated states
 1572|      8|    if (eqs.find(s) != eqs.end()) continue;
  ------------------
  |  Branch (1572:9): [True: 0, False: 8]
  ------------------
 1573|       |
 1574|       |    // bring this state over to the result
 1575|      8|    result.push_back(dfa[s]);
 1576|      8|    auto& rsd = result.back();
 1577|       |
 1578|       |    // patch its transitions to account for merged and shifted states
 1579|     21|    for (const auto& m : sd.chars.mapping()) {
  ------------------
  |  Branch (1579:24): [True: 21, False: 8]
  ------------------
 1580|     21|      auto  eq    = eqs.find(m.second);
 1581|     21|      state tgt   = (eq == eqs.end()) ? m.second : eq->second;
  ------------------
  |  Branch (1581:21): [True: 21, False: 0]
  ------------------
 1582|     21|      auto  shift = shifted.find(tgt);
 1583|     21|      state stgt  = (shift == shifted.end()) ? tgt : shift->second;
  ------------------
  |  Branch (1583:21): [True: 21, False: 0]
  ------------------
 1584|       |
 1585|     21|      if (stgt != m.second) {
  ------------------
  |  Branch (1585:11): [True: 0, False: 21]
  ------------------
 1586|      0|        rsd.chars.insert(m.first, stgt);
 1587|      0|      }
 1588|     21|    }
 1589|      8|  }
 1590|      1|  return result;
 1591|      1|}
_ZN6hobbes22regexCaptureBufferTypeERKSt6vectorISt10shared_ptrINS_5RegexEESaIS3_EE:
 1596|      2|MonoTypePtr regexCaptureBufferType(const Regexes& regexes) {
 1597|      2|  Record::Members ms;
 1598|      6|  for (size_t r = 0; r < regexes.size(); ++r) {
  ------------------
  |  Branch (1598:22): [True: 4, False: 2]
  ------------------
 1599|      6|    for (const auto& b : bindingNames(regexes[r])) {
  ------------------
  |  Branch (1599:24): [True: 6, False: 4]
  ------------------
 1600|      6|      ms.push_back(Record::Member(str::from(r) + "_begin_" + b, primty("long")));
 1601|      6|      ms.push_back(Record::Member(str::from(r) + "_end_"   + b, primty("long")));
 1602|      6|    }
 1603|      4|  }
 1604|      2|  return ms.empty() ? primty("unit") : MonoTypePtr(Record::make(ms));
  ------------------
  |  Branch (1604:10): [True: 0, False: 2]
  ------------------
 1605|      2|}
_ZN6hobbes22makeRegexCaptureBufferERKSt6vectorISt10shared_ptrINS_5RegexEESaIS3_EERKNS_17LexicalAnnotationE:
 1607|      1|ExprPtr makeRegexCaptureBuffer(const Regexes& regexes, const LexicalAnnotation& rootLA) {
 1608|      1|  return
 1609|      1|    assume(
 1610|      1|      fncall(
 1611|      1|        var("newPrimZ", rootLA),
 1612|      1|        list(mktunit(rootLA)),
 1613|      1|        rootLA
 1614|      1|      ),
 1615|      1|      regexCaptureBufferType(regexes),
 1616|      1|      rootLA
 1617|      1|    );
 1618|      1|}
_ZN6hobbes8regexKeyB5cxx11ERKSt10shared_ptrINS_5RegexEE:
 1666|     14|std::string regexKey(const RegexPtr& r) {
 1667|     14|  std::string k;
 1668|     14|  switchOf(r, regexKeyF(&k));
 1669|     14|  return k;
 1670|     14|}
_ZN6hobbes10regexFnKeyB5cxx11ERKSt6vectorISt10shared_ptrINS_5RegexEESaIS3_EE:
 1672|      1|std::string regexFnKey(const Regexes& regexes) {
 1673|      1|  std::string k;
 1674|      2|  for (const auto& r : regexes) {
  ------------------
  |  Branch (1674:22): [True: 2, False: 1]
  ------------------
 1675|      2|    k += regexKey(r);
 1676|      2|    k += "\n";
 1677|      2|  }
 1678|      1|  return k;
 1679|      1|}
_ZN6hobbes11makeRegexFnEPNS_2ccERKSt6vectorISt10shared_ptrINS_5RegexEESaIS5_EERKNS_17LexicalAnnotationE:
 1681|      1|CRegexes makeRegexFn(cc* c, const Regexes& regexes, const LexicalAnnotation& rootLA) {
 1682|      1|  CRegexes result;
 1683|       |
 1684|       |  // reject a regex whose tree is too large before anything walks it: every pass
 1685|       |  // below (the capture buffer's bindingNames, the cache key, the NFA build) is
 1686|       |  // linear in the unshared tree size, which a quantified group can blow up far
 1687|       |  // past the term count. Checked here, once, ahead of the first of those walks.
 1688|      2|  for (const auto& r : regexes) {
  ------------------
  |  Branch (1688:22): [True: 2, False: 1]
  ------------------
 1689|      2|    rejectOversizedRegex(r);
 1690|      2|  }
 1691|       |
 1692|       |  // save capturing-group settings
 1693|      1|  result.captureBuffer = makeRegexCaptureBuffer(regexes, rootLA);
 1694|      3|  for (size_t i = 0; i < regexes.size(); ++i) {
  ------------------
  |  Branch (1694:22): [True: 2, False: 1]
  ------------------
 1695|      2|    result.captureVarsAt[i] = bindingNames(regexes[i]);
 1696|      2|  }
 1697|       |
 1698|       |  // if these regexes have been compiled into this compiler before, the
 1699|       |  // function and the result mapping made then serve now: the function is
 1700|       |  // pure in its input and the mapping is a property of the regexes, so
 1701|       |  // neither depends on where the match that uses them is. (The capture
 1702|       |  // buffer expression above is remade with this match's annotation, and the
 1703|       |  // binding names recomputed, because they are cheap and carry a location.)
 1704|      1|  const std::string key = regexFnKey(regexes);
 1705|      1|  auto cached = c->regexFnCache.find(key);
 1706|      1|  if (cached != c->regexFnCache.end()) {
  ------------------
  |  Branch (1706:7): [True: 0, False: 1]
  ------------------
 1707|      0|    result.fname   = cached->second.fname;
 1708|      0|    result.rstates = cached->second.rstates;
 1709|      0|    return result;
 1710|      0|  }
 1711|       |
 1712|       |  // our NFA will non-deterministically jump to every possible start state
 1713|      1|  NFA nfa;
 1714|      1|  nfa.resize(1);
 1715|      3|  for (size_t i = 0; i < regexes.size(); ++i) {
  ------------------
  |  Branch (1715:22): [True: 2, False: 1]
  ------------------
 1716|      2|    auto s = accumRegex(regexes[i], i, &nfa);
 1717|      2|    nfa[0].eps.insert(s);
 1718|      2|  }
 1719|       |
 1720|       |  // now map this NFA to a DFA
 1721|      1|  DFA dfa;
 1722|      1|  RStates fstates;
 1723|      1|  disambiguate(c, nfa, &dfa, &fstates);
 1724|       |
 1725|       |  // make all char ranges compact and minimize the results to avoid redundant work in the caller
 1726|      1|  mergeCharRangesAndEqResults(&dfa, fstates, &result.rstates);
 1727|       |
 1728|       |  // in case of blowup, minimize the size of this DFA
 1729|      1|  dfa = removeEquivStates(dfa, findEquivStates(dfa));
 1730|       |
 1731|       |  // translate this DFA to a function
 1732|      1|  std::string fname = ".regex." + freshName();
 1733|      1|  makeDFAFunc(c, fname, regexCaptureBufferType(regexes), dfa, rootLA);
 1734|       |
 1735|       |  // and that's the function that the outer match logic should use
 1736|      1|  result.fname = fname;
 1737|       |
 1738|       |  // remember the function and the result mapping for the next match on these
 1739|       |  // regexes; not the capture buffer expression, which carries this match's
 1740|       |  // source location and would pin it for the life of the compiler
 1741|      1|  CRegexes& kept = c->regexFnCache[key];
 1742|      1|  kept.fname   = result.fname;
 1743|      1|  kept.rstates = result.rstates;
 1744|      1|  return result;
 1745|      1|}
_ZN6hobbes17unpackCaptureVarsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_RKNS_8CRegexesEmRKNS_17LexicalAnnotationE:
 1750|      2|CVarDefs unpackCaptureVars(const std::string& strVar, const std::string& bufferVar, const CRegexes& crgxs, size_t regex, const LexicalAnnotation& rootLA) {
 1751|      2|  CVarDefs result;
 1752|      2|  auto cvars = crgxs.captureVarsAt.find(regex);
 1753|      2|  if (cvars == crgxs.captureVarsAt.end()) return result;
  ------------------
  |  Branch (1753:7): [True: 0, False: 2]
  ------------------
 1754|       |
 1755|      3|  for (const auto& vn : cvars->second) {
  ------------------
  |  Branch (1755:23): [True: 3, False: 2]
  ------------------
 1756|      3|    result.push_back(CVarDef(vn,
 1757|      3|      fncall(
 1758|      3|        var("slice", rootLA),
 1759|      3|        list(
 1760|      3|          var(strVar, rootLA),
 1761|      3|          proj(var(bufferVar, rootLA), str::from(regex) + "_begin_" + vn, rootLA),
 1762|      3|          proj(var(bufferVar, rootLA), str::from(regex) + "_end_"   + vn, rootLA)
 1763|      3|        ),
 1764|      3|        rootLA
 1765|      3|      )
 1766|      3|    ));
 1767|      3|  }
 1768|      2|  return result;
 1769|      2|}
_ZN6hobbes10RCharRangeC2Ehh:
   31|     23|  RCharRange(rchar_t b, rchar_t e) : b(b), e(e) { }
_ZN6hobbes5RStarC2ERKSt10shared_ptrINS_5RegexEE:
   47|      3|  RStar(const RegexPtr& v) : v(v) { }
_ZN6hobbes7REitherC2ERKSt10shared_ptrINS_5RegexEES5_:
   56|      4|  REither(const RegexPtr& lhs, const RegexPtr& rhs) : lhs(lhs), rhs(rhs) { }
_ZN6hobbes5RBindC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_5RegexEE:
   74|      3|  RBind(const std::string& var, const RegexPtr& def) : var(var), def(def) { }
_ZN6hobbes4RSeqC2ERKSt10shared_ptrINS_5RegexEES5_:
   65|     25|  RSeq(const RegexPtr& lhs, const RegexPtr& rhs) : lhs(lhs), rhs(rhs) { }
_ZN6hobbes10TermBudget4takeEv:
  296|     25|  void take() {
  297|     25|    if (++this->taken > maxRegexTerms) {
  ------------------
  |  Branch (297:9): [True: 0, False: 25]
  ------------------
  298|      0|      throw std::runtime_error("regex is too complex to compile (more than " + str::from(maxRegexTerms) + " terms)");
  299|      0|    }
  300|     25|  }
_ZN6hobbes7bnamesFC2EPSt3setINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4lessIS7_ESaIS7_EEPSt13unordered_setIPKNS_5RegexESt4hashISG_ESt8equal_toISG_ESaISG_EE:
  441|      6|  bnamesF(str::set* bnames, std::unordered_set<const Regex*>* seen) : bnames(bnames), seen(seen) { }
_ZNK6hobbes7bnamesF4withEPKNS_4REpsE:
  450|     15|  UnitV with(const REps*) const override { return unitv; }
_ZNK6hobbes7bnamesF4withEPKNS_10RCharRangeE:
  451|     36|  UnitV with(const RCharRange*) const override { return unitv; }
_ZNK6hobbes7bnamesF4withEPKNS_5RStarE:
  452|      9|  UnitV with(const RStar* x) const override { return visit(x->v); }
_ZNK6hobbes7bnamesF4withEPKNS_7REitherE:
  454|     12|  UnitV with(const REither* x) const override {
  455|     12|    visit(x->lhs);
  456|     12|    return visit(x->rhs);
  457|     12|  }
_ZNK6hobbes7bnamesF4withEPKNS_4RSeqE:
  459|     42|  UnitV with(const RSeq* x) const override {
  460|     42|    visit(x->lhs);
  461|     42|    return visit(x->rhs);
  462|     42|  }
_ZNK6hobbes7bnamesF4withEPKNS_5RBindE:
  464|      9|  UnitV with(const RBind* x) const override {
  465|      9|    this->bnames->insert(x->var);
  466|      9|    return visit(x->def);
  467|      9|  }
_ZNK6hobbes7bnamesF5visitERKSt10shared_ptrINS_5RegexEE:
  443|    132|  UnitV visit(const RegexPtr& p) const {
  444|    132|    if (this->seen->insert(p.get()).second) {
  ------------------
  |  Branch (444:9): [True: 123, False: 9]
  ------------------
  445|    123|      switchOf(p, *this);
  446|    123|    }
  447|    132|    return unitv;
  448|    132|  }
_ZN6hobbes13expandedSizeFC2EPSt13unordered_mapIPKNS_5RegexEmSt4hashIS4_ESt8equal_toIS4_ESaISt4pairIKS4_mEEE:
  486|     12|  explicit expandedSizeF(std::unordered_map<const Regex*, size_t>* memo) : memo(memo) { }
_ZNK6hobbes13expandedSizeF4withEPKNS_4REpsE:
  503|     21|  size_t with(const REps*)            const override { return 1; }
_ZNK6hobbes13expandedSizeF4withEPKNS_10RCharRangeE:
  504|     47|  size_t with(const RCharRange*)      const override { return 1; }
_ZNK6hobbes13expandedSizeF4withEPKNS_5RStarE:
  505|      9|  size_t with(const RStar* x)         const override { return satAdd(1, sizeOf(x->v)); }
_ZN6hobbes13expandedSizeF6satAddEmm:
  488|    148|  static size_t satAdd(size_t a, size_t b) {
  489|    148|    size_t s = a + b;
  490|    148|    return s < a ? std::numeric_limits<size_t>::max() : s;
  ------------------
  |  Branch (490:12): [True: 0, False: 148]
  ------------------
  491|    148|  }
_ZNK6hobbes13expandedSizeF4withEPKNS_7REitherE:
  506|     12|  size_t with(const REither* x)       const override { return satAdd(1, satAdd(sizeOf(x->lhs), sizeOf(x->rhs))); }
_ZNK6hobbes13expandedSizeF4withEPKNS_4RSeqE:
  507|     53|  size_t with(const RSeq* x)          const override { return satAdd(1, satAdd(sizeOf(x->lhs), sizeOf(x->rhs))); }
_ZNK6hobbes13expandedSizeF4withEPKNS_5RBindE:
  508|      9|  size_t with(const RBind* x)         const override { return satAdd(1, sizeOf(x->def)); }
_ZNK6hobbes13expandedSizeF6sizeOfERKSt10shared_ptrINS_5RegexEE:
  493|    160|  size_t sizeOf(const RegexPtr& p) const {
  494|    160|    auto i = this->memo->find(p.get());
  495|    160|    if (i != this->memo->end()) {
  ------------------
  |  Branch (495:9): [True: 9, False: 151]
  ------------------
  496|      9|      return i->second;
  497|      9|    }
  498|    151|    size_t r = switchOf(p, *this);
  499|    151|    (*this->memo)[p.get()] = r;
  500|    151|    return r;
  501|    160|  }
_ZN6hobbes8switchOfImEET_RKSt10shared_ptrINS_5RegexEERKNS_11switchRegexIS1_EE:
   94|    151|  T switchOf(const RegexPtr& p, const switchRegex<T>& f) {
   95|    151|    if (const REps* x = dynamic_cast<REps*>(p.get())) {
  ------------------
  |  Branch (95:21): [True: 21, False: 130]
  ------------------
   96|     21|      return f.with(x);
   97|    130|    } else if (const RCharRange* x = dynamic_cast<RCharRange*>(p.get())) {
  ------------------
  |  Branch (97:34): [True: 47, False: 83]
  ------------------
   98|     47|      return f.with(x);
   99|     83|    } else if (const RStar* x = dynamic_cast<RStar*>(p.get())) {
  ------------------
  |  Branch (99:29): [True: 9, False: 74]
  ------------------
  100|      9|      return f.with(x);
  101|     74|    } else if (const REither* x = dynamic_cast<REither*>(p.get())) {
  ------------------
  |  Branch (101:31): [True: 12, False: 62]
  ------------------
  102|     12|      return f.with(x);
  103|     62|    } else if (const RSeq* x = dynamic_cast<RSeq*>(p.get())) {
  ------------------
  |  Branch (103:28): [True: 53, False: 9]
  ------------------
  104|     53|      return f.with(x);
  105|     53|    } else if (const RBind* x = dynamic_cast<RBind*>(p.get())) {
  ------------------
  |  Branch (105:29): [True: 9, False: 0]
  ------------------
  106|      9|      return f.with(x);
  107|      9|    } else {
  108|      0|      throw std::runtime_error("Internal error, not a valid regex case");
  109|      0|    }
  110|    151|  }
_ZN6hobbes10linkStateFC2EPSt6vectorINS_8NFAStateESaIS2_EEjjj:
  592|     49|  linkStateF(NFA* nfa, state self, state succ, result id) : nfa(nfa), self(self), succ(succ), id(id) {
  593|     49|  }
_ZNK6hobbes10linkStateF4withEPKNS_4REpsE:
  600|      5|  UnitV with(const REps*) const override {
  601|      5|    s().eps.insert(this->succ);
  602|      5|    return unitv;
  603|      5|  }
_ZNK6hobbes10linkStateF1sEv:
  596|     46|  NFAState& s()        const { return s(this->self); }
_ZNK6hobbes10linkStateF1sEj:
  595|     49|  NFAState& s(state k) const { return (*this->nfa)[k]; }
_ZNK6hobbes10linkStateF4withEPKNS_10RCharRangeE:
  605|     19|  UnitV with(const RCharRange* x) const override {
  606|     19|    s().chars.mergeRange(x->b, x->e, [&](stateset& ss){ ss.insert(this->succ); });
  607|     19|    return unitv;
  608|     19|  }
_ZN6hobbes14char_range_ord2ltEhh:
  532|    489|  static bool lt(rchar_t lhs, rchar_t rhs) {
  533|    489|    return lhs < rhs;
  534|    489|  }
_ZN6hobbes14char_range_ord4succEh:
  538|      2|  static rchar_t succ(rchar_t x) {
  539|      2|    return x+1;
  540|      2|  }
_ZN6hobbes14char_range_ord4predEh:
  535|     16|  static rchar_t pred(rchar_t x) {
  536|     16|    return x-1;
  537|     16|  }
_ZZNK6hobbes10linkStateF4withEPKNS_10RCharRangeEENKUlRSt3setIjSt4lessIjESaIjEEE_clES9_:
  606|     19|    s().chars.mergeRange(x->b, x->e, [&](stateset& ss){ ss.insert(this->succ); });
_ZNK6hobbes10linkStateF4withEPKNS_5RStarE:
  610|      3|  UnitV with(const RStar* x) const override {
  611|      3|    switchOf(x->v, linkStateF(this->nfa, this->self, this->self, this->id));
  612|      3|    s().eps.insert(this->succ);
  613|      3|    return unitv;
  614|      3|  }
_ZNK6hobbes10linkStateF4withEPKNS_7REitherE:
  616|      8|  UnitV with(const REither* x) const override {
  617|      8|    state lstate = ins(x->lhs);
  618|      8|    state rstate = ins(x->rhs);
  619|      8|    s().eps.insert(lstate);
  620|      8|    s().eps.insert(rstate);
  621|      8|    return unitv;
  622|      8|  }
_ZNK6hobbes10linkStateF3insERKSt10shared_ptrINS_5RegexEE:
  598|     30|  state ins(const RegexPtr& p) const { return regexBefore(p, this->succ, this->id, this->nfa); }
_ZNK6hobbes10linkStateF4withEPKNS_4RSeqE:
  624|     14|  UnitV with(const RSeq* x) const override {
  625|     14|    state rstate = ins(x->rhs);
  626|     14|    switchOf(x->lhs, linkStateF(this->nfa, this->self, rstate, this->id));
  627|     14|    return unitv;
  628|     14|  }
_ZNK6hobbes10linkStateF4withEPKNS_5RBindE:
  630|      3|  UnitV with(const RBind* x) const override {
  631|      3|    s().beginMark(this->id, x->var);
  632|      3|    switchOf(x->def, *this);
  633|      3|    s(this->succ).endMark(this->id, x->var);
  634|      3|    return unitv;
  635|      3|  }
_ZN6hobbes8NFAState9beginMarkEjRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  569|      3|  void beginMark(result r, const std::string& m) { this->begins[r].insert(m); }
_ZN6hobbes8NFAState7endMarkEjRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  570|      3|  void endMark  (result r, const std::string& m) {   this->ends[r].insert(m); }
regex.C:_ZN6hobbesL17transitionMappingERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNS_8DFAStateERKSt10shared_ptrINS_4ExprEESF_RKNS_17LexicalAnnotationE:
 1193|      8|static ExprPtr transitionMapping(const std::string& fname, const DFAState& s, const ExprPtr& charExpr, const ExprPtr& defaultResult, const LexicalAnnotation& rootLA) {
 1194|       |  // for the full 'range -> state' transition map at this state
 1195|       |  //   are we mostly looking at single character transitions?
 1196|       |  //   if so, we're better off using a switch
 1197|       |  //   else use a sequence of range tests
 1198|      8|  auto rtns = s.chars.mapping();
 1199|       |
 1200|      8|  if (rtns.empty()) {
  ------------------
  |  Branch (1200:7): [True: 1, False: 7]
  ------------------
 1201|       |    // shouldn't happen, but it's the right thing to do
 1202|      1|    return defaultResult;
 1203|      7|  } else if (rtns.size() == 1 && rtns[0].first.first == 0 && rtns[0].first.second == 255) {
  ------------------
  |  Branch (1203:14): [True: 1, False: 6]
  |  Branch (1203:34): [True: 0, False: 1]
  |  Branch (1203:62): [True: 0, False: 0]
  ------------------
 1204|       |    // a catch-all case, don't need any special logic
 1205|      0|    return transitionToState(fname, rtns[0].second, rootLA);
 1206|      0|  }
 1207|       |
 1208|      7|  double sd = 0.0;
 1209|     21|  for (const auto& rtn : rtns) {
  ------------------
  |  Branch (1209:24): [True: 21, False: 7]
  ------------------
 1210|     21|    sd += 1 + rtn.first.second - rtn.first.first;
 1211|     21|  }
 1212|      7|  double avgs = sd / static_cast<double>(rtns.size());
 1213|       |
 1214|      7|  if (avgs <= 2.0) {
  ------------------
  |  Branch (1214:7): [True: 1, False: 6]
  ------------------
 1215|      1|    return transitionAsCharSwitch(fname, s, charExpr, defaultResult, rootLA);
 1216|      6|  } else {
 1217|      6|    return transitionAsRangeChecks(fname, rtns, charExpr, defaultResult, rootLA);
 1218|      6|  }
 1219|      7|}
regex.C:_ZN6hobbesL17transitionToStateERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiRKNS_17LexicalAnnotationE:
 1124|     21|static ExprPtr transitionToState(const std::string& fname, int s, const LexicalAnnotation& rootLA) {
 1125|       |  // produce an expression fragment to jump to the given state
 1126|     21|  return fncall(var(fname, rootLA), list(var("cap", rootLA), var("cs", rootLA), var("n", rootLA), var("e", rootLA), constant(s, rootLA)), rootLA);
 1127|     21|}
regex.C:_ZN6hobbesL22transitionAsCharSwitchERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNS_8DFAStateERKSt10shared_ptrINS_4ExprEESF_RKNS_17LexicalAnnotationE:
 1129|      1|static ExprPtr transitionAsCharSwitch(const std::string& fname, const DFAState& s, const ExprPtr& charExpr, const ExprPtr& defaultResult, const LexicalAnnotation& rootLA) {
 1130|      1|  Switch::Bindings cs;
 1131|      1|  std::set<rchar_t> tcs;
 1132|      1|  s.chars.keys(&tcs);
 1133|      1|  for (auto tc : tcs) {
  ------------------
  |  Branch (1133:16): [True: 1, False: 1]
  ------------------
 1134|      1|    cs.push_back(Switch::Binding(PrimitivePtr(new Char(tc, rootLA)),
 1135|      1|      transitionToState(fname, *s.chars.lookup(tc), rootLA)
 1136|      1|    ));
 1137|      1|  }
 1138|      1|  return
 1139|      1|    switchE(
 1140|      1|      charExpr,
 1141|      1|      cs,
 1142|      1|      defaultResult,
 1143|      1|      rootLA
 1144|      1|    );
 1145|      1|}
regex.C:_ZN6hobbesL23transitionAsRangeChecksERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt6vectorISt4pairIS9_IhhEjESaISB_EERKSt10shared_ptrINS_4ExprEESK_RKNS_17LexicalAnnotationE:
 1167|      6|static ExprPtr transitionAsRangeChecks(const std::string& fname, const std::vector<std::pair<std::pair<rchar_t,rchar_t>, state>>& ranges, const ExprPtr& charExpr, const ExprPtr& defaultResult, const LexicalAnnotation& rootLA) {
 1168|      6|  std::string n = freshName();
 1169|      6|  ExprPtr cvar = var(n, rootLA);
 1170|       |
 1171|      6|  ExprPtr ifvn = var("if", rootLA);
 1172|       |
 1173|      6|  ExprPtr result = defaultResult;
 1174|     26|  for (auto r = ranges.rbegin(); r != ranges.rend(); ++r) {
  ------------------
  |  Branch (1174:34): [True: 20, False: 6]
  ------------------
 1175|     20|    result =
 1176|     20|      fncall(
 1177|     20|        ifvn,
 1178|     20|        list(
 1179|     20|          charInRange(cvar, r->first, rootLA),
 1180|     20|          transitionToState(fname, r->second, rootLA),
 1181|     20|          result
 1182|     20|        ),
 1183|     20|        rootLA
 1184|     20|      );
 1185|     20|  }
 1186|      6|  return
 1187|      6|    let(n, assume(fncall(var("unsafeCast", rootLA), list(charExpr), rootLA), primty("byte"), rootLA),
 1188|      6|      result,
 1189|      6|      rootLA
 1190|      6|    );
 1191|      6|}
regex.C:_ZN6hobbesL11charInRangeERKSt10shared_ptrINS_4ExprEERKSt4pairIhhERKNS_17LexicalAnnotationE:
 1147|     20|static ExprPtr charInRange(const ExprPtr& c, const std::pair<rchar_t, rchar_t>& crange, const LexicalAnnotation& rootLA) {
 1148|     20|  if (crange.first == 0 && crange.second == 255) {
  ------------------
  |  Branch (1148:7): [True: 6, False: 14]
  |  Branch (1148:28): [True: 0, False: 6]
  ------------------
 1149|      0|    return constant(true, rootLA);
 1150|     20|  } else if (crange.first == 0) {
  ------------------
  |  Branch (1150:14): [True: 6, False: 14]
  ------------------
 1151|      6|    return fncall(var("blte", rootLA), list(c, constant(static_cast<uint8_t>(crange.second), rootLA)), rootLA);
 1152|     14|  } else if (crange.first == crange.second) {
  ------------------
  |  Branch (1152:14): [True: 6, False: 8]
  ------------------
 1153|      6|    return fncall(var("beq", rootLA), list(c, constant(static_cast<uint8_t>(crange.first), rootLA)), rootLA);
 1154|      8|  } else {
 1155|      8|    return
 1156|      8|      fncall(
 1157|      8|        var("and", rootLA),
 1158|      8|        list(
 1159|      8|          fncall(var("blte", rootLA), list(constant(static_cast<uint8_t>(crange.first), rootLA), c), rootLA),
 1160|      8|          fncall(var("blte", rootLA), list(c, constant(static_cast<uint8_t>(crange.second), rootLA)), rootLA)
 1161|      8|        ),
 1162|      8|        rootLA
 1163|      8|      );
 1164|      8|  }
 1165|     20|}
regex.C:_ZN6hobbesL14dfaTransitionsERKSt6vectorINS_8DFAStateESaIS1_EE:
 1358|      1|static size_t dfaTransitions(const DFA& dfa) {
 1359|      1|  size_t n = 0;
 1360|      8|  for (const auto& s : dfa) {
  ------------------
  |  Branch (1360:22): [True: 8, False: 1]
  ------------------
 1361|      8|    n += s.chars.size();
 1362|      8|  }
 1363|      1|  return n;
 1364|      1|}
_ZN6hobbes14StatePartition4findEj:
 1452|     37|  state find(state s) {
 1453|     37|    while (this->reps[s] != s) {
  ------------------
  |  Branch (1453:12): [True: 0, False: 37]
  ------------------
 1454|      0|      this->reps[s] = this->reps[this->reps[s]];
 1455|      0|      s = this->reps[s];
 1456|      0|    }
 1457|     37|    return s;
 1458|     37|  }
_ZN6hobbes14StatePartitionC2Em:
 1446|      1|  explicit StatePartition(size_t states) : reps(states) {
 1447|      9|    for (size_t s = 0; s < states; ++s) {
  ------------------
  |  Branch (1447:24): [True: 8, False: 1]
  ------------------
 1448|      8|      this->reps[s] = static_cast<state>(s);
 1449|      8|    }
 1450|      1|  }
_ZN6hobbes9regexKeyFC2EPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
 1629|     14|  explicit regexKeyF(std::string* out) : out(out) { }
_ZNK6hobbes9regexKeyF4withEPKNS_4REpsE:
 1631|     26|  UnitV with(const REps*) const override { *this->out += "e;"; return unitv; }
_ZNK6hobbes9regexKeyF4withEPKNS_10RCharRangeE:
 1632|     87|  UnitV with(const RCharRange* x) const override {
 1633|     87|    *this->out += "r" + str::from(static_cast<int>(x->b)) + "," + str::from(static_cast<int>(x->e)) + ";";
 1634|     87|    return unitv;
 1635|     87|  }
_ZNK6hobbes9regexKeyF4withEPKNS_5RStarE:
 1636|     12|  UnitV with(const RStar* x) const override {
 1637|     12|    *this->out += "*(";
 1638|     12|    switchOf(x->v, *this);
 1639|     12|    *this->out += ")";
 1640|     12|    return unitv;
 1641|     12|  }
_ZNK6hobbes9regexKeyF4withEPKNS_7REitherE:
 1642|     32|  UnitV with(const REither* x) const override {
 1643|     32|    *this->out += "|(";
 1644|     32|    switchOf(x->lhs, *this);
 1645|     32|    *this->out += ",";
 1646|     32|    switchOf(x->rhs, *this);
 1647|     32|    *this->out += ")";
 1648|     32|    return unitv;
 1649|     32|  }
_ZNK6hobbes9regexKeyF4withEPKNS_4RSeqE:
 1650|     67|  UnitV with(const RSeq* x) const override {
 1651|     67|    *this->out += ".(";
 1652|     67|    switchOf(x->lhs, *this);
 1653|     67|    *this->out += ",";
 1654|     67|    switchOf(x->rhs, *this);
 1655|     67|    *this->out += ")";
 1656|     67|    return unitv;
 1657|     67|  }
_ZNK6hobbes9regexKeyF4withEPKNS_5RBindE:
 1658|     12|  UnitV with(const RBind* x) const override {
 1659|     12|    *this->out += "b" + str::from(x->var.size()) + ":" + x->var + "(";
 1660|     12|    switchOf(x->def, *this);
 1661|     12|    *this->out += ")";
 1662|     12|    return unitv;
 1663|     12|  }
_ZN6hobbes8switchOfIhEET_RKSt10shared_ptrINS_5RegexEERKNS_11switchRegexIS1_EE:
   94|    411|  T switchOf(const RegexPtr& p, const switchRegex<T>& f) {
   95|    411|    if (const REps* x = dynamic_cast<REps*>(p.get())) {
  ------------------
  |  Branch (95:21): [True: 46, False: 365]
  ------------------
   96|     46|      return f.with(x);
   97|    365|    } else if (const RCharRange* x = dynamic_cast<RCharRange*>(p.get())) {
  ------------------
  |  Branch (97:34): [True: 142, False: 223]
  ------------------
   98|    142|      return f.with(x);
   99|    223|    } else if (const RStar* x = dynamic_cast<RStar*>(p.get())) {
  ------------------
  |  Branch (99:29): [True: 24, False: 199]
  ------------------
  100|     24|      return f.with(x);
  101|    199|    } else if (const REither* x = dynamic_cast<REither*>(p.get())) {
  ------------------
  |  Branch (101:31): [True: 52, False: 147]
  ------------------
  102|     52|      return f.with(x);
  103|    147|    } else if (const RSeq* x = dynamic_cast<RSeq*>(p.get())) {
  ------------------
  |  Branch (103:28): [True: 123, False: 24]
  ------------------
  104|    123|      return f.with(x);
  105|    123|    } else if (const RBind* x = dynamic_cast<RBind*>(p.get())) {
  ------------------
  |  Branch (105:29): [True: 24, False: 0]
  ------------------
  106|     24|      return f.with(x);
  107|     24|    } else {
  108|      0|      throw std::runtime_error("Internal error, not a valid regex case");
  109|      0|    }
  110|    411|  }
_ZN6hobbes14char_range_ord9copyRangeEhhPSt3setIhSt4lessIhESaIhEE:
  541|      1|  static void copyRange(rchar_t t0, rchar_t t1, std::set<rchar_t>* out) {
  542|      1|    auto t = t0;
  543|      1|    auto e = t1;
  544|      1|    while (true) {
  ------------------
  |  Branch (544:12): [True: 1, Folded]
  ------------------
  545|      1|      out->insert(t);
  546|      1|      if (t == e) {
  ------------------
  |  Branch (546:11): [True: 1, False: 0]
  ------------------
  547|      1|        break;
  548|      1|      } else {
  549|      0|        ++t;
  550|      0|      }
  551|      1|    }
  552|      1|  }

_ZN6hobbes20AppendsToUnqualifierC2Ev:
   25|      1|AppendsToUnqualifier::AppendsToUnqualifier() {
   26|      1|  addEliminator(std::make_shared<ATRecordEliminator>());
   27|      1|}
_ZN6hobbes20AppendsToUnqualifier14constraintNameB5cxx11Ev:
   29|      1|std::string AppendsToUnqualifier::constraintName() {
   30|      1|  return "AppendsTo";
   31|      1|}
_ZN6hobbes20AppendsToUnqualifier13addEliminatorERKSt10shared_ptrINS_12ATEliminatorEE:
   33|      1|void AppendsToUnqualifier::addEliminator(const std::shared_ptr<ATEliminator>& ate) {
   34|      1|  this->eliminators.push_back(ate);
   35|      1|}
_ZNK6hobbes20AppendsToUnqualifier6lookupERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
   84|  3.37k|PolyTypePtr AppendsToUnqualifier::lookup(const std::string& vn) const {
   85|  3.37k|  for (const auto &eliminator : this->eliminators) {
  ------------------
  |  Branch (85:31): [True: 3.37k, False: 3.37k]
  ------------------
   86|  3.37k|    PolyTypePtr ty = eliminator->lookup(vn);
   87|  3.37k|    if (ty != PolyTypePtr()) {
  ------------------
  |  Branch (87:9): [True: 0, False: 3.37k]
  ------------------
   88|      0|      return ty;
   89|      0|    }
   90|  3.37k|  }
   91|  3.37k|  return PolyTypePtr();
   92|  3.37k|}
_ZNK6hobbes20AppendsToUnqualifier8bindingsB5cxx11Ev:
   94|      1|SymSet AppendsToUnqualifier::bindings() const {
   95|      1|  SymSet result;
   96|      1|  for (const auto &eliminator : this->eliminators) {
  ------------------
  |  Branch (96:31): [True: 1, False: 1]
  ------------------
   97|      1|    SymSet x = eliminator->bindings();
   98|      1|    result.insert(x.begin(), x.end());
   99|      1|  }
  100|      1|  return result;
  101|      1|}

_ZNK6hobbes18ATRecordEliminator6lookupERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  215|  3.37k|PolyTypePtr ATRecordEliminator::lookup(const std::string& vn) const {
  216|  3.37k|  if (vn == REF_REC_APPEND) {
  ------------------
  |  |   10|  3.37k|#define REF_REC_APPEND "recordAppend"
  ------------------
  |  Branch (216:7): [True: 0, False: 3.37k]
  ------------------
  217|      0|    return polytype(3, qualtype(list(std::make_shared<Constraint>(AppendsToUnqualifier::constraintName(), list(tgen(0), tgen(1), tgen(2)))), functy(list(tgen(0), tgen(1)), tgen(2))));
  218|  3.37k|  } else if (vn == REF_REC_PREFIX) {
  ------------------
  |  |   11|  3.37k|#define REF_REC_PREFIX "recordPrefix"
  ------------------
  |  Branch (218:14): [True: 0, False: 3.37k]
  ------------------
  219|      0|    return polytype(3, qualtype(list(std::make_shared<Constraint>(AppendsToUnqualifier::constraintName(), list(tgen(0), tgen(1), tgen(2)))), functy(list(tgen(2)), tgen(0))));
  220|  3.37k|  } else if (vn == REF_REC_SUFFIX) {
  ------------------
  |  |   12|  3.37k|#define REF_REC_SUFFIX "recordSuffix"
  ------------------
  |  Branch (220:14): [True: 0, False: 3.37k]
  ------------------
  221|      0|    return polytype(3, qualtype(list(std::make_shared<Constraint>(AppendsToUnqualifier::constraintName(), list(tgen(0), tgen(1), tgen(2)))), functy(list(tgen(2)), tgen(1))));
  222|  3.37k|  } else {
  223|  3.37k|    return PolyTypePtr();
  224|  3.37k|  }
  225|  3.37k|}
_ZNK6hobbes18ATRecordEliminator8bindingsB5cxx11Ev:
  227|      1|SymSet ATRecordEliminator::bindings() const {
  228|      1|  SymSet result;
  229|      1|  result.insert(REF_REC_APPEND);
  ------------------
  |  |   10|      1|#define REF_REC_APPEND "recordAppend"
  ------------------
  230|      1|  result.insert(REF_REC_PREFIX);
  ------------------
  |  |   11|      1|#define REF_REC_PREFIX "recordPrefix"
  ------------------
  231|      1|  result.insert(REF_REC_SUFFIX);
  ------------------
  |  |   12|      1|#define REF_REC_SUFFIX "recordSuffix"
  ------------------
  232|      1|  return result;
  233|      1|}

_ZN6hobbes12mergeFundepsERKSt6vectorISt4pairIS0_IiSaIiEEiESaIS4_EES8_:
  179|     97|FunDeps mergeFundeps(const FunDeps& lhs, const FunDeps& rhs) {
  180|     97|  FunDeps r = lhs;
  181|     97|  for (const auto& fd : rhs) {
  ------------------
  |  Branch (181:23): [True: 76, False: 97]
  ------------------
  182|     76|    if (!in(fd, r)) {
  ------------------
  |  Branch (182:9): [True: 45, False: 31]
  ------------------
  183|     45|      r.push_back(fd);
  184|     45|    }
  185|     76|  }
  186|     97|  return r;
  187|     97|}
_ZN6hobbes13includeFundepERKNS_10ConstraintERKSt4pairISt6vectorIiSaIiEEiEPS4_IS7_SaIS7_EE:
  189|    641|void includeFundep(const Constraint& c, const FunDep& fd, FunDeps* out) {
  190|    641|  TGenVarSet input;
  191|    975|  for (auto i : fd.first) {
  ------------------
  |  Branch (191:15): [True: 975, False: 641]
  ------------------
  192|    975|    input = setUnion(input, tgenVars(c.arguments()[i]));
  193|    975|  }
  194|       |
  195|    690|  for (auto o : tgenVars(c.arguments()[fd.second])) {
  ------------------
  |  Branch (195:15): [True: 690, False: 641]
  ------------------
  196|    690|    if (!in(o, input)) {
  ------------------
  |  Branch (196:9): [True: 557, False: 133]
  ------------------
  197|    557|      FunDep fd(VarIDs(input.begin(), input.end()), o);
  198|    557|      if (!in(fd, *out)) {
  ------------------
  |  Branch (198:11): [True: 490, False: 67]
  ------------------
  199|    490|        out->push_back(fd);
  200|    490|      }
  201|    557|    }
  202|    690|  }
  203|    641|}
_ZN6hobbes12inferFundepsERKSt10shared_ptrINS_4TEnvEERKSt6vectorIS0_INS_10ConstraintEESaIS7_EE:
  205|    348|FunDeps inferFundeps(const TEnvPtr& tenv, const Constraints& cs) {
  206|    348|  FunDeps result;
  207|    480|  for (const auto& c : cs) {
  ------------------
  |  Branch (207:22): [True: 480, False: 348]
  ------------------
  208|    480|    UnqualifierPtr uq = tenv->lookupUnqualifier(c);
  209|       |
  210|    480|    FunDeps cdeps = uq->dependencies(c);
  211|    641|    for (const auto& cdep : cdeps) {
  ------------------
  |  Branch (211:27): [True: 641, False: 480]
  ------------------
  212|    641|      includeFundep(*c, cdep, &result);
  213|    641|    }
  214|    480|  }
  215|    348|  return result;
  216|    348|}
_ZN6hobbes6TClassC2ERKSt6vectorISt10shared_ptrINS_10ConstraintEESaIS4_EERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEmRKSt3mapISE_S2_INS_8MonoTypeEESt4lessISE_ESaISt4pairISF_SJ_EEERKS1_ISM_IS1_IiSaIiEEiESaISU_EERKNS_17LexicalAnnotationE:
  220|    349|  LexicallyAnnotated(la), tcname(tcname), tvs(tvs), reqs(reqs), tcmembers(tcmembers), fundeps(fundeps)
  221|    349|{
  222|    349|}
_ZN6hobbes6TClassC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEmRKSt3mapIS6_St10shared_ptrINS_8MonoTypeEESt4lessIS6_ESaISt4pairIS7_SC_EEERKSt6vectorISF_ISL_IiSaIiEEiESaISO_EERKNS_17LexicalAnnotationE:
  227|      1|TClass::TClass(const std::string& tcname, size_t tvs, const Members& tcmembers, const FunDeps& fundeps, const LexicalAnnotation& la) : TClass(Constraints(), tcname, tvs, tcmembers, fundeps, la) {
  228|      1|}
_ZNK6hobbes6TClass4nameB5cxx11Ev:
  233|  2.86k|const std::string& TClass::name() const {
  234|  2.86k|  return this->tcname;
  235|  2.86k|}
_ZNK6hobbes6TClass8typeVarsEv:
  241|  6.34k|size_t TClass::typeVars() const {
  242|  6.34k|  return this->tvs;
  243|  6.34k|}
_ZNK6hobbes6TClass7membersB5cxx11Ev:
  245|    104|const TClass::Members& TClass::members() const {
  246|    104|  return this->tcmembers;
  247|    104|}
_ZN6hobbes6TClass6insertERKSt10shared_ptrINS_4TEnvEERKS1_INS_10TCInstanceEEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISK_EE:
  253|    433|void TClass::insert(const TEnvPtr& tenv, const TCInstancePtr& ip, Definitions* ds) {
  254|    433|  if (ip->arity() != this->tvs) {
  ------------------
  |  Branch (254:7): [True: 0, False: 433]
  ------------------
  255|      0|    std::ostringstream ss;
  256|      0|    ss << "Arity mismatch between instance definition (" << ip->arity() << ") and type class definition (" << this->tvs << ").";
  257|      0|    throw annotated_error(*ip, ss.str());
  258|    433|  } else {
  259|    433|    this->tcinstances.push_back(ip);
  260|    433|    this->tcinstdb.insert(ip->types(), ip);
  261|    433|    forgetResolutions();
  262|    433|    ip->bind(tenv, this, ds);
  263|    433|  }
  264|    433|}
_ZN6hobbes6TClass6insertERKSt10shared_ptrINS_12TCInstanceFnEE:
  266|    637|void TClass::insert(const TCInstanceFnPtr& ifp) {
  267|    637|  if (ifp->arity() != this->tvs) {
  ------------------
  |  Branch (267:7): [True: 0, False: 637]
  ------------------
  268|      0|    std::ostringstream ss;
  269|      0|    ss << "Arity mismatch between instance generator definition (" << ifp->arity() << ") and type class definition (" << this->tvs << ").";
  270|      0|    throw annotated_error(*ifp, ss.str());
  271|    637|  } else {
  272|       |    // make sure that this instance generator covers all required members
  273|    637|    auto mm = ifp->members(MonoTypeSubst());
  274|       |
  275|    637|    std::ostringstream ss;
  276|    637|    size_t errors = 0;
  277|    723|    for (const auto& tcm : this->tcmembers) {
  ------------------
  |  Branch (277:26): [True: 723, False: 637]
  ------------------
  278|    723|      if (mm.count(tcm.first) == 0u) {
  ------------------
  |  Branch (278:11): [True: 0, False: 723]
  ------------------
  279|      0|        ss << (errors != 0u?", ":"") << "expected definition of '" << tcm.first << "'";
  ------------------
  |  Branch (279:16): [True: 0, False: 0]
  ------------------
  280|      0|        ++errors;
  281|      0|      }
  282|    723|    }
  283|    723|    for (const auto& m : mm) {
  ------------------
  |  Branch (283:24): [True: 723, False: 637]
  ------------------
  284|    723|      if (this->tcmembers.count(m.first) == 0u) {
  ------------------
  |  Branch (284:11): [True: 0, False: 723]
  ------------------
  285|      0|        ss << (errors != 0u?", ":"") << "unexpected definition of '" << m.first << "'";
  ------------------
  |  Branch (285:16): [True: 0, False: 0]
  ------------------
  286|      0|        ++errors;
  287|      0|      }
  288|    723|    }
  289|    637|    if (errors != 0u) {
  ------------------
  |  Branch (289:9): [True: 0, False: 637]
  ------------------
  290|      0|      std::ostringstream ess;
  291|      0|      ess << "Can't introduce instance generator for '" << this->tcname << "': " << ss.str();
  292|      0|      throw annotated_error(*ifp, ess.str());
  293|      0|    }
  294|       |
  295|       |    // insert the instance generator
  296|    637|    ifp->order = this->tcinstancefns.size();
  297|    637|    this->tcinstancefns.push_back(ifp);
  298|       |
  299|    637|    if (TCInstanceFns* hfns = this->tcinstfndb.lookup(ifp->itys)) {
  ------------------
  |  Branch (299:24): [True: 65, False: 572]
  ------------------
  300|     65|      hfns->push_back(ifp);
  301|    572|    } else {
  302|    572|      TCInstanceFns x;
  303|    572|      x.push_back(ifp);
  304|    572|      this->tcinstfndb.insert(ifp->itys, x);
  305|    572|    }
  306|    637|    forgetResolutions();
  307|    637|  }
  308|    637|}
_ZN6hobbes6TClass17forgetResolutionsEv:
  337|  1.07k|void TClass::forgetResolutions() {
  338|  1.07k|  ++instanceGeneration;
  339|  1.07k|}
_ZNK6hobbes6TClass18refreshResolutionsEv:
  341|  16.0k|void TClass::refreshResolutions() const {
  342|  16.0k|  if (resolutionsInProgress == 0) {
  ------------------
  |  Branch (342:7): [True: 15.5k, False: 447]
  ------------------
  343|  15.5k|    requestGeneration = instanceGeneration.load();
  344|  15.5k|  }
  345|  16.0k|  if (this->memoGeneration != requestGeneration) {
  ------------------
  |  Branch (345:7): [True: 1.80k, False: 14.2k]
  ------------------
  346|  1.80k|    this->testedInstances.clear();
  347|  1.80k|    this->satfInstances.clear();
  348|  1.80k|    this->memoGeneration = requestGeneration;
  349|  1.80k|  }
  350|  16.0k|}
_ZNK6hobbes6TClass7matchesERKSt10shared_ptrINS_4TEnvEERKS1_INS_10ConstraintEEPNS_15MonoTypeUnifierEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISM_EE:
  352|    953|TCInstances TClass::matches(const TEnvPtr& tenv, const ConstraintPtr& c, MonoTypeUnifier* u, Definitions* ds) const {
  353|    953|  return matches(tenv, c->arguments(), u, ds);
  354|    953|}
_ZNK6hobbes6TClass18candidateTCInstFnsERKSt10shared_ptrINS_4TEnvEERKSt6vectorIS1_INS_8MonoTypeEESaIS8_EEPS6_IS1_INS_12TCInstanceFnEESaISE_EE:
  356|    176|void TClass::candidateTCInstFns(const TEnvPtr& tenv, const MonoTypes& mts, TCInstanceFns* x) const {
  357|    176|  std::vector<TCInstanceFns> fss;
  358|    176|  this->tcinstfndb.bidimatches(tenv, mts, &fss);
  359|       |
  360|    218|  for (const auto& fs : fss) {
  ------------------
  |  Branch (360:23): [True: 218, False: 176]
  ------------------
  361|    218|    x->insert(x->end(), fs.begin(), fs.end());
  362|    218|  }
  363|       |
  364|    176|  std::sort(x->begin(), x->end(),
  365|    176|            [] (const TCInstanceFnPtr& a, const TCInstanceFnPtr& b) { return a->order < b->order; });
  366|    176|}
_ZNK6hobbes6TClass7matchesERKSt10shared_ptrINS_4TEnvEERKSt6vectorIS1_INS_8MonoTypeEESaIS8_EEPNS_15MonoTypeUnifierEPS6_ISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISO_EE:
  368|  2.43k|TCInstances TClass::matches(const TEnvPtr& tenv, const MonoTypes& mts, MonoTypeUnifier* u, Definitions* ds) const {
  369|  2.43k|  refreshResolutions();
  370|       |
  371|       |  // do any ground instances match?
  372|  2.43k|  TCInstances r;
  373|  2.43k|  this->tcinstdb.matches(tenv, mts, &r);
  374|       |
  375|       |  // if no ground instances match, can we generate a ground instance to match?
  376|       |  //  (this can only work when we can feed back derived type information)
  377|  2.43k|  if (r.empty()) {
  ------------------
  |  Branch (377:7): [True: 176, False: 2.26k]
  ------------------
  378|    176|    ProvisionalMemo assumed(this->testedInstances, mts);
  379|       |
  380|    176|    TCInstanceFns ifns;
  381|    176|    candidateTCInstFns(tenv, mts, &ifns);
  382|    255|    for (const auto& f : ifns) {
  ------------------
  |  Branch (382:24): [True: 255, False: 30]
  ------------------
  383|       |      // for recursive instance definitions, initially assume that this instantiation is satisfiable
  384|       |      // (this will prevent nested instance requests from recursing infinitely)
  385|       |      //
  386|       |      // a generator refused for growth (InstanceResolutionStep) unwinds through
  387|       |      // here without trying the generators after it, and the provisional memo
  388|       |      // settles this type as unsatisfiable, though a later generator might
  389|       |      // have resolved it. That is the refusal's cost: it is an error in the
  390|       |      // instance that diverged, reported as such, and defining another
  391|       |      // instance clears the memo
  392|    255|      TCInstancePtr ninst;
  393|    255|      if (f->apply(tenv, mts, this, u, ds, &ninst)) {
  ------------------
  |  Branch (393:11): [True: 146, False: 109]
  ------------------
  394|    146|        const_cast<TClass*>(this)->insert(tenv, ninst, ds);
  395|    146|        r.push_back(ninst);
  396|    146|        break;
  397|    146|      } else if (ninst.get() != nullptr) {
  ------------------
  |  Branch (397:18): [True: 0, False: 109]
  ------------------
  398|      0|        r.push_back(ninst);
  399|      0|        break;
  400|      0|      }
  401|    255|    }
  402|       |
  403|    176|    this->testedInstances.insert(mts, false);
  404|    176|  }
  405|       |
  406|  2.43k|  return r;
  407|  2.43k|}
_ZN6hobbes6TClass6refineERKSt10shared_ptrINS_4TEnvEERKS1_INS_10ConstraintEEPNS_15MonoTypeUnifierEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISM_EE:
  409|  42.3k|bool TClass::refine(const TEnvPtr& tenv, const ConstraintPtr& cst, MonoTypeUnifier* s, Definitions* ds) {
  410|       |  // if the arity is wrong on this constraint, it can't ever work
  411|  42.3k|  if (cst->arguments().size() != this->tvs) {
  ------------------
  |  Branch (411:7): [True: 0, False: 42.3k]
  ------------------
  412|      0|    return false;
  413|      0|  }
  414|       |
  415|       |  // start off assuming we'll add no information
  416|  42.3k|  bool r = false;
  417|       |
  418|       |  // apply refinement across all constraints implied by this class
  419|  42.3k|  for (const auto& req : this->reqs) {
  ------------------
  |  Branch (419:24): [True: 12.8k, False: 42.3k]
  ------------------
  420|  12.8k|    r |= hobbes::refine(tenv, instantiate(cst->arguments(), req), s, ds);
  421|  12.8k|  }
  422|       |
  423|       |  // apply refinement across all fundeps
  424|  42.3k|  for (const auto &fundep : this->fundeps) {
  ------------------
  |  Branch (424:27): [True: 40.0k, False: 42.3k]
  ------------------
  425|  40.0k|    r |= refine(tenv, cst, fundep, s, ds);
  426|  40.0k|  }
  427|  42.3k|  return r;
  428|  42.3k|}
_ZNK6hobbes6TClass6refineERKSt10shared_ptrINS_4TEnvEERKS1_INS_10ConstraintEERKSt4pairISt6vectorIiSaIiEEiEPNS_15MonoTypeUnifierEPSB_ISA_INSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISR_EE:
  430|  40.0k|bool TClass::refine(const TEnvPtr& tenv, const ConstraintPtr& c, const FunDep& fd, MonoTypeUnifier* s, Definitions* ds) const {
  431|  40.0k|  size_t    bsz  = s->size();
  432|  40.0k|  MonoTypes args = s->substitute(c->arguments());
  433|       |
  434|  40.0k|  if (!hasFreeVariables(select(args, fd.first))) {
  ------------------
  |  Branch (434:7): [True: 5.77k, False: 34.2k]
  ------------------
  435|  5.77k|    MonoTypePtr rty = select(args, fd.second);
  436|       |
  437|  5.77k|    if (hasFreeVariables(rty)) {
  ------------------
  |  Branch (437:9): [True: 256, False: 5.52k]
  ------------------
  438|    256|      TCInstances ms = matches(tenv, args, s, ds);
  439|    256|      if (ms.size() == 1) {
  ------------------
  |  Branch (439:11): [True: 254, False: 2]
  ------------------
  440|    254|        mgu(rty, select(ms[0]->types(), fd.second), s);
  441|    254|      }
  442|    256|    }
  443|  5.77k|  }
  444|  40.0k|  return bsz != s->size();
  445|  40.0k|}
_ZN6hobbes15isLiteralFnTermERKSt10shared_ptrINS_4ExprEE:
  447|    160|bool isLiteralFnTerm(const ExprPtr& e) {
  448|    160|  return is<Fn>(stripAssumpHead(e)) != nullptr;
  449|    160|}
_ZNK6hobbes6TClass9satisfiedERKSt10shared_ptrINS_4TEnvEERKS1_INS_10ConstraintEEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISK_EE:
  451|  5.88k|bool TClass::satisfied(const TEnvPtr& tenv, const ConstraintPtr& c, Definitions* ds) const {
  452|  5.88k|  refreshResolutions();
  453|  5.88k|  if (c->arguments().size() != this->tvs) {
  ------------------
  |  Branch (453:7): [True: 0, False: 5.88k]
  ------------------
  454|      0|    return false;
  455|  5.88k|  } else if (c->hasFreeVariables()) {
  ------------------
  |  Branch (455:14): [True: 4.65k, False: 1.22k]
  ------------------
  456|  4.65k|    return false;
  457|  4.65k|  } else if (bool* f = this->testedInstances.lookup(c->arguments())) {
  ------------------
  |  Branch (457:20): [True: 1, False: 1.22k]
  ------------------
  458|      1|    if (*f) return true;
  ------------------
  |  Branch (458:9): [True: 0, False: 1]
  ------------------
  459|      1|  }
  460|       |
  461|       |  // consider whether all implied constraints are satisfied
  462|  1.22k|  for (const auto& req : this->reqs) {
  ------------------
  |  Branch (462:24): [True: 236, False: 1.22k]
  ------------------
  463|    236|    if (!::hobbes::satisfied(tenv, instantiate(c->arguments(), req), ds)) {
  ------------------
  |  Branch (463:9): [True: 0, False: 236]
  ------------------
  464|      0|      return false;
  465|      0|    }
  466|    236|  }
  467|       |
  468|       |  // finally see if we can get an instance
  469|  1.22k|  return matches(tenv, c->arguments(), nullptr, ds).size() == 1;
  470|  1.22k|}
_ZNK6hobbes6TClass11satisfiableERKSt10shared_ptrINS_4TEnvEERKS1_INS_10ConstraintEEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISK_EE:
  472|  7.74k|bool TClass::satisfiable(const TEnvPtr& tenv, const ConstraintPtr& c, Definitions* ds) const {
  473|       |  // take care of the obvious
  474|  7.74k|  if (c->arguments().size() != this->tvs) return false;
  ------------------
  |  Branch (474:7): [True: 0, False: 7.74k]
  ------------------
  475|       |
  476|       |  // consider satisfiability across all constraints implied by this class
  477|  7.74k|  for (const auto& req : this->reqs) {
  ------------------
  |  Branch (477:24): [True: 1.10k, False: 7.74k]
  ------------------
  478|  1.10k|    if (!::hobbes::satisfiable(tenv, instantiate(c->arguments(), req), ds)) {
  ------------------
  |  Branch (478:9): [True: 0, False: 1.10k]
  ------------------
  479|      0|      return false;
  480|      0|    }
  481|  1.10k|  }
  482|       |
  483|       |  // for empty class definitions, assume allow constraint usage before definitions
  484|  7.74k|  if (this->tcinstdb.values().empty() && this->tcinstancefns.empty()) {
  ------------------
  |  Branch (484:7): [True: 5.94k, False: 1.79k]
  |  Branch (484:7): [True: 24, False: 7.71k]
  |  Branch (484:42): [True: 24, False: 5.92k]
  ------------------
  485|     24|    return true;
  486|     24|  }
  487|       |
  488|  7.71k|  MonoTypes mts = c->arguments();
  489|       |
  490|       |  // did we already assume that this constraint was satisfiable?
  491|  7.71k|  refreshResolutions();
  492|  7.71k|  if (bool* f = this->satfInstances.lookup(mts)) {
  ------------------
  |  Branch (492:13): [True: 5.60k, False: 2.11k]
  ------------------
  493|  5.60k|    return *f;
  494|  5.60k|  }
  495|       |  
  496|       |  // assume we're satisfiable until we can prove we're not
  497|  2.11k|  ProvisionalMemo assumed(this->satfInstances, mts);
  498|       |
  499|       |  // we're satisfiable if there's at least one satisfiable instance for this constraint
  500|  2.11k|  if (this->tcinstdb.hasMatch(tenv, mts)) return true;
  ------------------
  |  Branch (500:7): [True: 863, False: 1.24k]
  ------------------
  501|       |
  502|       |  // or an instance generator
  503|  1.76k|  for (const auto& f : this->tcinstancefns) {
  ------------------
  |  Branch (503:22): [True: 1.76k, False: 409]
  ------------------
  504|  1.76k|    if (f->satisfiable(tenv, mts, ds)) {
  ------------------
  |  Branch (504:9): [True: 838, False: 925]
  ------------------
  505|    838|      return true;
  506|    838|    }
  507|  1.76k|  }
  508|       |
  509|       |  // we couldn't find a single way that this constraint was satisfiable, it's not satisfiable
  510|    409|  this->satfInstances.insert(mts, false);
  511|    409|  return false;
  512|  1.24k|}
_ZNK6hobbes6TClass14uniqueInstanceERKSt10shared_ptrINS_4TEnvEERKS1_INS_10ConstraintEEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISK_EE:
  588|    953|TCInstancePtr TClass::uniqueInstance(const TEnvPtr& tenv, const ConstraintPtr& cst, Definitions* ds) const {
  589|    953|  TCInstances tis = matches(tenv, cst, nullptr, ds);
  590|    953|  if (tis.size() == 1) {
  ------------------
  |  Branch (590:7): [True: 953, False: 0]
  ------------------
  591|    953|    return tis[0];
  592|    953|  }
  593|      0|  return TCInstancePtr();
  594|    953|}
_ZNK6hobbes6TClass6lookupERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  596|   597k|PolyTypePtr TClass::lookup(const std::string& vn) const {
  597|   597k|  auto m = this->tcmembers.find(vn);
  598|   597k|  if (m != this->tcmembers.end()) {
  ------------------
  |  Branch (598:7): [True: 2.86k, False: 594k]
  ------------------
  599|  2.86k|    return std::make_shared<PolyType>(this->typeVars(), qualtype(list(std::make_shared<Constraint>(this->name(), tgens(this->typeVars()))), m->second));
  600|   594k|  } else {
  601|   594k|    return PolyTypePtr();
  602|   594k|  }
  603|   597k|}
_ZNK6hobbes6TClass10memberTypeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  605|    922|MonoTypePtr TClass::memberType(const std::string& vn) const {
  606|    922|  auto m = this->tcmembers.find(vn);
  607|    922|  if (m != this->tcmembers.end()) {
  ------------------
  |  Branch (607:7): [True: 922, False: 0]
  ------------------
  608|    922|    return m->second;
  609|    922|  } else {
  610|      0|    throw std::runtime_error("Undefined class member, '" + vn + "'");
  611|      0|  }
  612|    922|}
_ZNK6hobbes6TClass8bindingsB5cxx11Ev:
  614|    349|SymSet TClass::bindings() const {
  615|    349|  SymSet r;
  616|    349|  for (const auto &tcmember : this->tcmembers) {
  ------------------
  |  Branch (616:29): [True: 347, False: 349]
  ------------------
  617|    347|    r.insert(tcmember.first);
  618|    347|  }
  619|    349|  return r;
  620|    349|}
_ZNK6hobbes6TClass12dependenciesERKSt10shared_ptrINS_10ConstraintEE:
  622|  23.4k|FunDeps TClass::dependencies(const ConstraintPtr&) const {
  623|  23.4k|  return this->fundeps;
  624|  23.4k|}
_ZN6hobbes10TCInstanceC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaISC_EERKSt3mapIS6_SA_INS_4ExprEESt4lessIS6_ESaISt4pairIS7_SJ_EEERKNS_17LexicalAnnotationE:
  675|    433|  LexicallyAnnotated(la), tcname(tcname), itys(itys), mmap(mmap) {
  676|    433|}
_ZNK6hobbes10TCInstance5arityEv:
  678|    433|size_t TCInstance::arity() const {
  679|    433|  return this->itys.size();
  680|    433|}
_ZNK6hobbes10TCInstance5typesEv:
  682|    687|const MonoTypes& TCInstance::types() const {
  683|    687|  return this->itys;
  684|    687|}
_ZNK6hobbes10TCInstance13memberMappingB5cxx11Ev:
  686|    953|const MemberMapping& TCInstance::memberMapping() const {
  687|    953|  return this->mmap;
  688|    953|}
_ZN6hobbes10TCInstance4bindERKSt10shared_ptrINS_4TEnvEEPKNS_6TClassEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISJ_EE:
  731|    433|void TCInstance::bind(const TEnvPtr& tenv, const TClass* c, Definitions* ds) {
  732|    487|  for (auto &mm : this->mmap) {
  ------------------
  |  Branch (732:17): [True: 487, False: 433]
  ------------------
  733|    487|    mm.second = unqualifyTypes(tenv, validateType(tenv, assume(mm.second, instantiate(this->itys, c->memberType(mm.first)), mm.second->la()), ds), ds);
  734|    487|  }
  735|    433|}
_ZN6hobbes25unqualifyClassConstraintsERKSt10shared_ptrINS_4TEnvEERKSt6vectorISt4pairIS0_INS_10ConstraintEES0_INS_10TCInstanceEEESaISB_EERKS0_INS_4ExprEEPS5_IS6_INSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESH_ESaISQ_EE:
  786|    353|ExprPtr unqualifyClassConstraints(const TEnvPtr&, const TCInstConstraints& cis, const ExprPtr& e, Definitions*) {
  787|    353|  return switchOf(e, TCUnqualifyBatch(cis));
  788|    353|}
_ZN6hobbes12TCInstanceFnC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt6vectorISt10shared_ptrINS_10ConstraintEESaISC_EERKS9_ISA_INS_8MonoTypeEESaISI_EERKSt3mapIS6_SA_INS_4ExprEESt4lessIS6_ESaISt4pairIS7_SP_EEERKNS_17LexicalAnnotationE:
  801|    637|  LexicallyAnnotated(la), tcname(tcname), reqs(reqs), mmap(mmap), itys(itys)
  802|    637|{
  803|    637|}
_ZNK6hobbes12TCInstanceFn5arityEv:
  805|    637|size_t TCInstanceFn::arity() const {
  806|    637|  return this->itys.size();
  807|    637|}
_ZNK6hobbes12TCInstanceFn11satisfiableERKSt10shared_ptrINS_4TEnvEERKSt6vectorIS1_INS_8MonoTypeEESaIS8_EEPS6_ISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISM_EE:
  809|  1.76k|bool TCInstanceFn::satisfiable(const TEnvPtr& tenv, const MonoTypes& tys, Definitions* rdefs) const {
  810|       |  // immediately reject arity mismatch (though this should never happen)
  811|  1.76k|  if (this->itys.size() != tys.size()) {
  ------------------
  |  Branch (811:7): [True: 0, False: 1.76k]
  ------------------
  812|      0|    return false;
  813|      0|  }
  814|       |
  815|  1.76k|  InstanceResolutionStep step(this->tcname, tys);
  816|       |
  817|       |  // can the input unify with this generator's head?  can it satisfy its constraints?
  818|  1.76k|  MonoTypeSubst s;
  819|  1.76k|  IFnDef        fdef  = freshDef(&s);
  820|  1.76k|  Constraints&  acsts = fdef.first;
  821|  1.76k|  MonoTypes&    argl  = fdef.second;
  822|       |
  823|       |  // determine definition types by unifying argument and generator-definition types
  824|  1.76k|  MonoTypeUnifier u(tenv);
  825|       |
  826|  1.76k|  try {
  827|  1.76k|    mgu(argl, tys, &u);
  828|  1.76k|  } catch (std::exception& ex) {
  829|    925|    return false;
  830|    925|  }
  831|       |
  832|       |  // require that all assumed constraints are satisfiable
  833|       |  // accumulate (non-recursive) constraints to ensure recursive unqualification
  834|    838|  try {
  835|    838|    refine(tenv, acsts, &u, rdefs);
  836|       |
  837|    838|    for (const auto& req : acsts) {
  ------------------
  |  Branch (837:26): [True: 290, False: 838]
  ------------------
  838|    290|      if (!hobbes::satisfiable(tenv, simplifyVarNames(req), rdefs)) {
  ------------------
  |  Branch (838:11): [True: 0, False: 290]
  ------------------
  839|      0|        return false;
  840|      0|      }
  841|    290|    }
  842|    838|  } catch (instance_resolution_depth_error&) {
  843|      0|    throw;
  844|      0|  } catch (std::exception& ex) {
  845|      0|    return false;
  846|      0|  }
  847|       |
  848|       |  // if we got here, it's satisfiable (if not yet satisfied)
  849|    838|  return true;
  850|    838|}
_ZNK6hobbes12TCInstanceFn5applyERKSt10shared_ptrINS_4TEnvEERKSt6vectorIS1_INS_8MonoTypeEESaIS8_EEPKNS_6TClassEPNS_15MonoTypeUnifierEPS6_ISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISR_EEPS1_INS_10TCInstanceEE:
  898|    255|bool TCInstanceFn::apply(const TEnvPtr& tenv, const MonoTypes& tys, const TClass* pc, MonoTypeUnifier* callsubst, Definitions* rdefs, TCInstancePtr* out) const {
  899|       |  // immediately reject arity mismatch (though this should never happen)
  900|    255|  if (this->itys.size() != tys.size()) {
  ------------------
  |  Branch (900:7): [True: 0, False: 255]
  ------------------
  901|      0|    return false;
  902|      0|  }
  903|       |
  904|    255|  InstanceResolutionStep step(this->tcname, tys);
  905|       |
  906|       |  // generate a fresh copy of this generator's type variables consistent between constraints and definition
  907|    255|  MonoTypeSubst s;
  908|    255|  IFnDef        fdef  = freshDef(&s);
  909|    255|  Constraints&  acsts = fdef.first;
  910|    255|  MonoTypes&    argl  = fdef.second;
  911|       |
  912|       |  // determine definition types by unifying argument and generator-definition types
  913|    255|  MonoTypeUnifier u(tenv);
  914|       |
  915|    255|  try {
  916|    255|    mgu(argl, tys, &u);
  917|    255|  } catch (std::exception& ex) {
  918|      0|    return false;
  919|      0|  }
  920|       |
  921|       |  // require that all assumed constraints are satisfied
  922|       |  // accumulate (non-recursive) constraints to ensure recursive unqualification
  923|    255|  try {
  924|    255|    refine(tenv, acsts, &u, rdefs);
  925|       |
  926|    255|    for (const auto& req : acsts) {
  ------------------
  |  Branch (926:26): [True: 143, False: 157]
  ------------------
  927|    143|      if (req->hasFreeVariables() || !hobbes::satisfied(tenv, req, rdefs)) {
  ------------------
  |  Branch (927:11): [True: 70, False: 73]
  |  Branch (927:38): [True: 28, False: 45]
  ------------------
  928|     98|        return false;
  929|     98|      }
  930|    143|    }
  931|    255|  } catch (instance_resolution_depth_error&) {
  932|      0|    throw;
  933|     11|  } catch (std::exception& ex) {
  934|     11|    return false;
  935|     11|  }
  936|       |
  937|       |  // require that the final type sequence is mono
  938|    146|  MonoTypes nitys = u.substitute(argl);
  939|    146|  if (hasFreeVariables(nitys)) {
  ------------------
  |  Branch (939:7): [True: 0, False: 146]
  ------------------
  940|      0|    return false;
  941|      0|  }
  942|       |
  943|       |  // we've definitely found a complete match
  944|       |  // merge local bindings to the nested unifier scope
  945|    146|  MonoTypeSubst ms = u.substitution();
  946|    146|  if (!ms.empty() && (callsubst != nullptr)) {
  ------------------
  |  Branch (946:7): [True: 146, False: 0]
  |  Branch (946:22): [True: 15, False: 131]
  ------------------
  947|     47|    for (const auto& m : ms) {
  ------------------
  |  Branch (947:24): [True: 47, False: 15]
  ------------------
  948|     47|      callsubst->bind(m.first, m.second);
  949|     47|    }
  950|     15|  }
  951|       |
  952|       |  // if we've actually already generated this instance, just return it
  953|    146|  TCInstances r;
  954|    146|  pc->tcinstdb.matches(tenv, nitys, &r);
  955|    146|  if (r.size() == 1) {
  ------------------
  |  Branch (955:7): [True: 0, False: 146]
  ------------------
  956|      0|    *out = r[0];
  957|      0|    return false;
  958|      0|  }
  959|       |
  960|       |  // and produce the output type class instance (generating residual definitions as necessary)
  961|    146|  MemberMapping mm;
  962|    160|  for (const auto& sm : this->mmap) {
  ------------------
  |  Branch (962:23): [True: 160, False: 146]
  ------------------
  963|    160|    QualTypePtr smty = qualtype(acsts, instantiate(nitys, pc->memberType(sm.first)));
  964|       |
  965|    160|    if (isLiteralFnTerm(sm.second)) {
  ------------------
  |  Branch (965:9): [True: 141, False: 19]
  ------------------
  966|    141|      std::string rfname = ".rfn" + freshName();
  967|    141|      ExprPtr     thisFn = ExprPtr(new Var(rfname, sm.second->la()));
  968|       |
  969|       |      // forward-declare this generated function
  970|    141|      tenv->root()->bind(rfname, polytype(smty));
  971|       |
  972|    141|      ExprPtr iexp = substitute(&u, substitute(s, sm.second));
  973|    141|      rdefs->push_back(Definition(rfname, substitute(MonoTypeSubst(), assume(iexp, smty, iexp->la())))); // make a fresh term/typing for this generated definition
  974|       |
  975|    141|      mm[sm.first] = thisFn;
  976|    141|    } else {
  977|     19|      mm[sm.first] = assume(substitute(&u, substitute(s, sm.second)), smty, sm.second->la());
  978|     19|    }
  979|    160|  }
  980|       |
  981|       |  // that's it, we've got a new ground type class instance
  982|    146|  *out = std::make_shared<TCInstance>(this->tcname, nitys, mm, la());
  983|    146|  return true;
  984|    146|}
_ZNK6hobbes12TCInstanceFn8freshDefEPSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEESt4lessIS7_ESaISt4pairIKS7_SA_EEE:
  986|  2.01k|TCInstanceFn::IFnDef TCInstanceFn::freshDef(MonoTypeSubst* s) const {
  987|  2.01k|  IFnDef result;
  988|  2.01k|  Constraints& acsts = result.first;
  989|  2.01k|  MonoTypes&   argl  = result.second;
  990|       |
  991|  2.01k|  NameSet arglNames;
  992|  2.01k|  tvarNames(this->itys, &arglNames);
  993|  2.01k|  tvarNames(this->reqs, &arglNames);
  994|       |  
  995|  4.60k|  for (const auto& tn : arglNames) {
  ------------------
  |  Branch (995:23): [True: 4.60k, False: 2.01k]
  ------------------
  996|  4.60k|    (*s)[tn] = freshTypeVar();
  997|  4.60k|  }
  998|  2.01k|  argl = substitute(*s, this->itys);
  999|       |
 1000|  2.01k|  for (const auto& c : this->reqs) {
  ------------------
  |  Branch (1000:22): [True: 1.51k, False: 2.01k]
  ------------------
 1001|  1.51k|    ConstraintPtr acst = c->substitute(*s);
 1002|  1.51k|    acsts.push_back(acst);
 1003|  1.51k|  }
 1004|       |
 1005|  2.01k|  return result;
 1006|  2.01k|}
_ZNK6hobbes12TCInstanceFn7membersERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEESt4lessIS7_ESaISt4pairIKS7_SA_EEE:
 1015|    637|MemberMapping TCInstanceFn::members(const MonoTypeSubst& s) const {
 1016|    637|  MemberMapping result;
 1017|    723|  for (const auto &mm : this->mmap) {
  ------------------
  |  Branch (1017:23): [True: 723, False: 637]
  ------------------
 1018|    723|    result[mm.first] = substitute(s, mm.second);
 1019|    723|  }
 1020|    637|  return result;
 1021|    637|}
_ZN6hobbes18definePrivateClassERKSt10shared_ptrINS_4TEnvEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS0_INS_4ExprEE:
 1046|    251|void definePrivateClass(const TEnvPtr& tenv, const std::string& memberName, const ExprPtr& expr) {
 1047|    251|  PolyTypePtr xety   = generalize(expr->type());
 1048|    251|  std::string tcname = ".genc" + freshName();
 1049|       |
 1050|    251|  NameSet   tvns   = tvarNames(expr->type());
 1051|    251|  MonoTypes gtvars = typeVars(toVector(tvns));
 1052|       |
 1053|    251|  if (xety->typeVariables() != gtvars.size()) {
  ------------------
  |  Branch (1053:7): [True: 0, False: 251]
  ------------------
 1054|      0|    throw annotated_error(
 1055|      0|      *expr,
 1056|      0|      "Internal error while defining private class: " +
 1057|      0|      str::from(xety->typeVariables()) + " type variables generalized from expression, but " +
 1058|      0|      str::from(gtvars.size()) + " inferred from:\n  " + showAnnotated(expr) +
 1059|      0|      "\nwith type vars:\n  {" + str::cdelim(show(gtvars), ", ") + "}"
 1060|      0|    );
 1061|      0|  }
 1062|       |
 1063|    251|  TClass::Members ms;
 1064|    251|  ms[memberName] = xety->qualtype()->monoType();
 1065|    251|  TClassPtr nclass(new TClass(xety->qualtype()->constraints(), tcname, xety->typeVariables(), ms, inferFundeps(tenv, xety->qualtype()->constraints()), expr->la()));
 1066|       |
 1067|    251|  MemberMapping mm;
 1068|    251|  mm[memberName] = expr;
 1069|       |
 1070|    251|  nclass->insert(std::make_shared<TCInstanceFn>(tcname, Constraints(), gtvars, mm, expr->la()));
 1071|       |
 1072|    251|  tenv->bind(tcname, nclass);
 1073|    251|}
_ZN6hobbes13isClassMemberERKSt10shared_ptrINS_4TEnvEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
 1126|    532|bool isClassMember(const TEnvPtr& tenv, const std::string& memberName) {
 1127|       |  // a name that isn't bound at all can't be a class member, and asking for its
 1128|       |  // type would build a "did you mean" suggestion list from every binding in
 1129|       |  // the environment before throwing
 1130|    532|  if (!tenv->hasBinding(memberName)) {
  ------------------
  |  Branch (1130:7): [True: 131, False: 401]
  ------------------
 1131|    131|    return false;
 1132|    131|  }
 1133|    401|  try {
 1134|    401|    Constraints cs = tenv->lookup(memberName)->qualtype()->constraints();
 1135|    401|    return (cs.size() == 1) && (tenv->lookupUnqualifier(cs[0])->lookup(memberName) != PolyTypePtr());
  ------------------
  |  Branch (1135:12): [True: 85, False: 316]
  |  Branch (1135:32): [True: 0, False: 85]
  ------------------
 1136|    401|  } catch (std::exception&) {
 1137|      0|    return false;
 1138|      0|  }
 1139|    401|}
class.C:_ZN6hobbes12_GLOBAL__N_115ProvisionalMemoC2ERNS_8type_mapIbEERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS8_EE:
  150|  2.28k|    ProvisionalMemo(type_map<bool>& memo, const MonoTypes& mts) : memo(memo), mts(mts), unwinding(std::uncaught_exceptions()) {
  151|  2.28k|      memo.insert(mts, true);
  152|  2.28k|      ++resolutionsInProgress;
  153|  2.28k|    }
class.C:_ZN6hobbes12_GLOBAL__N_115ProvisionalMemoD2Ev:
  154|  2.28k|    ~ProvisionalMemo() {
  155|  2.28k|      --resolutionsInProgress;
  156|  2.28k|      if (std::uncaught_exceptions() > this->unwinding) {
  ------------------
  |  Branch (156:11): [True: 0, False: 2.28k]
  ------------------
  157|      0|        try {
  158|      0|          this->memo.insert(this->mts, false);
  159|      0|        } catch (...) {
  160|       |          // out of memory while an exception is in flight; the entry stays
  161|       |          // provisional, which is what the refusal being unwound already
  162|       |          // reports, and the next instance definition clears it anyway
  163|      0|        }
  164|      0|      }
  165|  2.28k|    }
_ZN6hobbes16TCUnqualifyBatchC2ERKSt6vectorISt4pairISt10shared_ptrINS_10ConstraintEES3_INS_10TCInstanceEEESaIS8_EE:
  750|    353|  explicit TCUnqualifyBatch(const TCInstConstraints& cis) {
  751|    953|    for (const auto& ci : cis) {
  ------------------
  |  Branch (751:25): [True: 953, False: 353]
  ------------------
  752|    953|      this->cs.push_back(ci.first);
  753|  1.16k|      for (const auto& mm : ci.second->memberMapping()) {
  ------------------
  |  Branch (753:27): [True: 1.16k, False: 953]
  ------------------
  754|  1.16k|        this->subs[mm.first].push_back(std::make_pair(ci.first, mm.second));
  755|  1.16k|      }
  756|    953|    }
  757|    353|  }
_ZNK6hobbes16TCUnqualifyBatch4withEPKNS_3VarE:
  772|  6.21k|  ExprPtr with(const Var* v) const override {
  773|       |    // if we can resolve this symbol as an overload of any batched constraint, replace it
  774|  6.21k|    auto s = this->subs.find(v->value());
  775|  6.21k|    if (s != this->subs.end()) {
  ------------------
  |  Branch (775:9): [True: 1.31k, False: 4.89k]
  ------------------
  776|  1.39k|      for (const auto& ce : s->second) {
  ------------------
  |  Branch (776:27): [True: 1.39k, False: 18]
  ------------------
  777|  1.39k|        if (hasConstraint(ce.first, v->type())) {
  ------------------
  |  Branch (777:13): [True: 1.29k, False: 101]
  ------------------
  778|  1.29k|          return ce.second;
  779|  1.29k|        }
  780|  1.39k|      }
  781|  1.31k|    }
  782|  4.91k|    return wrapWithTy(v->type(), v->clone());
  783|  6.21k|  }
_ZNK6hobbes16TCUnqualifyBatch6withTyERKSt10shared_ptrINS_8QualTypeEE:
  759|  13.7k|  QualTypePtr withTy(const QualTypePtr& qt) const override {
  760|  13.7k|    Constraints r;
  761|  17.1k|    for (const auto& c : qt->constraints()) {
  ------------------
  |  Branch (761:24): [True: 17.1k, False: 13.7k]
  ------------------
  762|  17.1k|      if (!hasConstraint(c, this->cs)) {
  ------------------
  |  Branch (762:11): [True: 6.41k, False: 10.7k]
  ------------------
  763|  6.41k|        r.push_back(c);
  764|  6.41k|      }
  765|  17.1k|    }
  766|  13.7k|    if (r.size() == qt->constraints().size()) {
  ------------------
  |  Branch (766:9): [True: 8.84k, False: 4.93k]
  ------------------
  767|  8.84k|      return qt;
  768|  8.84k|    }
  769|  4.93k|    return qualtype(r, qt->monoType());
  770|  13.7k|  }
class.C:_ZN6hobbes12_GLOBAL__N_122InstanceResolutionStepC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaISD_EE:
  103|  2.01k|    InstanceResolutionStep(const std::string& tcname, const MonoTypes& tys) : grew(false) {
  104|  2.01k|      size_t n = typeSize(tys);
  105|  2.01k|      if (!instanceResolutionSizes.empty()) {
  ------------------
  |  Branch (105:11): [True: 156, False: 1.86k]
  ------------------
  106|    156|        size_t root = instanceResolutionSizes.front();
  107|    156|        if (n > maxInstanceResolutionGrowth * root + instanceResolutionAllowance) {
  ------------------
  |  Branch (107:13): [True: 0, False: 156]
  ------------------
  108|      0|          throw instance_resolution_depth_error(
  109|      0|            "instance resolution for " + show(Constraint(tcname, tys)) + " asks about a type of " + str::from(n) +
  110|      0|            " nodes, more than " + str::from(maxInstanceResolutionGrowth) + "x the " + str::from(root) +
  111|      0|            "-node request it is resolving (an instance whose context is larger than its head would do this)"
  112|      0|          );
  113|      0|        }
  114|    156|        this->grew = n > instanceResolutionSizes.back();
  115|    156|        if (this->grew && instanceResolutionGrowthSteps >= maxInstanceResolutionGrowthSteps) {
  ------------------
  |  Branch (115:13): [True: 2, False: 154]
  |  Branch (115:27): [True: 0, False: 2]
  ------------------
  116|      0|          throw instance_resolution_depth_error(
  117|      0|            "instance resolution for " + show(Constraint(tcname, tys)) + " asks about a larger type than the step before it, for the " +
  118|      0|            str::from(maxInstanceResolutionGrowthSteps + 1) + "th time (an instance whose context is larger than its head would do this)"
  119|      0|          );
  120|      0|        }
  121|    156|      }
  122|  2.01k|      instanceResolutionSizes.push_back(n);
  123|  2.01k|      if (this->grew) {
  ------------------
  |  Branch (123:11): [True: 2, False: 2.01k]
  ------------------
  124|      2|        ++instanceResolutionGrowthSteps;
  125|      2|      }
  126|  2.01k|      ++resolutionsInProgress;
  127|  2.01k|    }
class.C:_ZN6hobbes12_GLOBAL__N_18typeSizeERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS4_EE:
   82|  2.01k|  size_t typeSize(const MonoTypes& tys) {
   83|  2.01k|    typeSizeF f;
   84|  5.38k|    for (const auto& ty : tys) {
  ------------------
  |  Branch (84:25): [True: 5.38k, False: 2.01k]
  ------------------
   85|  5.38k|      switchOf(ty, f);
   86|  5.38k|    }
   87|  2.01k|    return f.n;
   88|  2.01k|  }
class.C:_ZNK6hobbes12_GLOBAL__N_19typeSizeF4withEPKNS_4PrimE:
   64|  3.29k|    UnitV with(const Prim*       v) const override { ++n; return walkTy::with(v); }
class.C:_ZNK6hobbes12_GLOBAL__N_19typeSizeF4withEPKNS_9OpaquePtrE:
   65|     32|    UnitV with(const OpaquePtr*  v) const override { ++n; return walkTy::with(v); }
class.C:_ZNK6hobbes12_GLOBAL__N_19typeSizeF4withEPKNS_4TVarE:
   66|  5.04k|    UnitV with(const TVar*       v) const override { ++n; return walkTy::with(v); }
class.C:_ZNK6hobbes12_GLOBAL__N_19typeSizeF4withEPKNS_4TAppE:
   69|    175|    UnitV with(const TApp*       v) const override { ++n; return walkTy::with(v); }
class.C:_ZNK6hobbes12_GLOBAL__N_19typeSizeF4withEPKNS_10FixedArrayE:
   70|     82|    UnitV with(const FixedArray* v) const override { ++n; return walkTy::with(v); }
class.C:_ZNK6hobbes12_GLOBAL__N_19typeSizeF4withEPKNS_5ArrayE:
   71|  1.51k|    UnitV with(const Array*      v) const override { ++n; return walkTy::with(v); }
class.C:_ZNK6hobbes12_GLOBAL__N_19typeSizeF4withEPKNS_7VariantE:
   72|    273|    UnitV with(const Variant*    v) const override { ++n; return walkTy::with(v); }
class.C:_ZNK6hobbes12_GLOBAL__N_19typeSizeF4withEPKNS_6RecordE:
   73|  2.12k|    UnitV with(const Record*     v) const override { ++n; return walkTy::with(v); }
class.C:_ZNK6hobbes12_GLOBAL__N_19typeSizeF4withEPKNS_4FuncE:
   74|    466|    UnitV with(const Func*       v) const override { ++n; return walkTy::with(v); }
class.C:_ZNK6hobbes12_GLOBAL__N_19typeSizeF4withEPKNS_6ExistsE:
   75|    301|    UnitV with(const Exists*     v) const override { ++n; return walkTy::with(v); }
class.C:_ZNK6hobbes12_GLOBAL__N_19typeSizeF4withEPKNS_9RecursiveE:
   76|    380|    UnitV with(const Recursive*  v) const override { ++n; return walkTy::with(v); }
class.C:_ZNK6hobbes12_GLOBAL__N_19typeSizeF4withEPKNS_7TStringE:
   77|    148|    UnitV with(const TString*    v) const override { ++n; return walkTy::with(v); }
class.C:_ZNK6hobbes12_GLOBAL__N_19typeSizeF4withEPKNS_5TLongE:
   78|    243|    UnitV with(const TLong*      v) const override { ++n; return walkTy::with(v); }
class.C:_ZN6hobbes12_GLOBAL__N_122InstanceResolutionStepD2Ev:
  128|  2.01k|    ~InstanceResolutionStep() {
  129|  2.01k|      --resolutionsInProgress;
  130|  2.01k|      instanceResolutionSizes.pop_back();
  131|  2.01k|      if (this->grew) {
  ------------------
  |  Branch (131:11): [True: 2, False: 2.01k]
  ------------------
  132|      2|        --instanceResolutionGrowthSteps;
  133|      2|      }
  134|  2.01k|    }
class.C:_ZZNK6hobbes6TClass18candidateTCInstFnsERKSt10shared_ptrINS_4TEnvEERKSt6vectorIS1_INS_8MonoTypeEESaIS8_EEPS6_IS1_INS_12TCInstanceFnEESaISE_EEENK3$_0clERKSE_SK_:
  365|    260|            [] (const TCInstanceFnPtr& a, const TCInstanceFnPtr& b) { return a->order < b->order; });

_ZN6hobbes19RecordDeconstructor14constraintNameB5cxx11Ev:
  118|    245|std::string RecordDeconstructor::constraintName() {
  119|    245|  return "ConsRecord";
  120|    245|}
_ZN6hobbes19RecordDeconstructor6refineERKSt10shared_ptrINS_4TEnvEERKS1_INS_10ConstraintEEPNS_15MonoTypeUnifierEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISM_EE:
  122|    111|bool RecordDeconstructor::refine(const TEnvPtr&, const ConstraintPtr& cst, MonoTypeUnifier* u, Definitions*) {
  123|    111|  size_t uc = u->size();
  124|    111|  ConsRecord cr;
  125|    111|  if (dec(cst, &cr)) {
  ------------------
  |  Branch (125:7): [True: 111, False: 0]
  ------------------
  126|    111|    if (const Record* rty = is<Record>(cr.recordType)) {
  ------------------
  |  Branch (126:23): [True: 0, False: 111]
  ------------------
  127|      0|      if (!rty->members().empty()) {
  ------------------
  |  Branch (127:11): [True: 0, False: 0]
  ------------------
  128|      0|        MonoTypePtr fname(TString::make(rty->headMember().field));
  129|       |
  130|      0|        mgu(fname,                  cr.headFieldName, u);
  131|      0|        mgu(rty->headMember().type, cr.headType,      u);
  132|       |
  133|      0|        if (cr.forward) {
  ------------------
  |  Branch (133:13): [True: 0, False: 0]
  ------------------
  134|      0|          mgu(rty->tailType(), cr.tailType, u);
  135|      0|        } else {
  136|      0|          mgu(stripHiddenFields(rty->tailType()), stripHiddenFields(cr.tailType), u);
  137|      0|        }
  138|      0|      }
  139|    111|    } else if (isUnit(cr.tailType)) {
  ------------------
  |  Branch (139:16): [True: 25, False: 86]
  ------------------
  140|     25|      if (cr.asTuple) {
  ------------------
  |  Branch (140:11): [True: 11, False: 14]
  ------------------
  141|     11|        mgu(cr.headFieldName, MonoTypePtr(TString::make(".f0")), u);
  142|     11|        mgu(cr.recordType, MonoTypePtr(Record::make(cr.headType, Record::Members())), u);
  143|     14|      } else if (const TString* lbl = is<TString>(cr.headFieldName)) {
  ------------------
  |  Branch (143:33): [True: 0, False: 14]
  ------------------
  144|      0|        mgu(cr.recordType, MonoTypePtr(Record::make(lbl->value(), cr.headType, Record::Members())), u);
  145|      0|      }
  146|     86|    } else if (const Record* rtail = is<Record>(cr.tailType)) {
  ------------------
  |  Branch (146:30): [True: 0, False: 86]
  ------------------
  147|      0|      if (cr.asTuple) {
  ------------------
  |  Branch (147:11): [True: 0, False: 0]
  ------------------
  148|      0|        mgu(cr.headFieldName, MonoTypePtr(TString::make(".f0")), u);
  149|      0|        mgu(cr.recordType, MonoTypePtr(Record::make(cr.headType, rtail->members())), u);
  150|      0|      } else if (const TString* lbl = is<TString>(cr.headFieldName)) {
  ------------------
  |  Branch (150:33): [True: 0, False: 0]
  ------------------
  151|      0|        mgu(cr.recordType, MonoTypePtr(Record::make(lbl->value(), cr.headType, rtail->members())), u);
  152|      0|      }
  153|      0|    }
  154|    111|  }
  155|    111|  return uc != u->size();
  156|    111|}
_ZNK6hobbes19RecordDeconstructor9satisfiedERKSt10shared_ptrINS_4TEnvEERKS1_INS_10ConstraintEEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISK_EE:
  158|     11|bool RecordDeconstructor::satisfied(const TEnvPtr&, const ConstraintPtr& cst, Definitions*) const {
  159|     11|  ConsRecord cr;
  160|     11|  if (!dec(cst, &cr)) {
  ------------------
  |  Branch (160:7): [True: 0, False: 11]
  ------------------
  161|      0|    return false;
  162|      0|  }
  163|       |
  164|     11|  const TString* fname = is<TString>(cr.headFieldName);
  165|     11|  if (fname == nullptr) {
  ------------------
  |  Branch (165:7): [True: 11, False: 0]
  ------------------
  166|     11|    return false;
  167|     11|  }
  168|       |
  169|      0|  const Record* rty = is<Record>(cr.recordType);
  170|      0|  if (rty == nullptr) {
  ------------------
  |  Branch (170:7): [True: 0, False: 0]
  ------------------
  171|      0|    return false;
  172|      0|  }
  173|      0|  if (cr.asTuple != rty->isTuple()) {
  ------------------
  |  Branch (173:7): [True: 0, False: 0]
  ------------------
  174|      0|    return false;
  175|      0|  }
  176|       |
  177|      0|  const Record* tty = is<Record>(cr.tailType);
  178|      0|  if ((tty == nullptr) && !isUnit(cr.tailType)) {
  ------------------
  |  Branch (178:7): [True: 0, False: 0]
  |  Branch (178:27): [True: 0, False: 0]
  ------------------
  179|      0|    return false;
  180|      0|  }
  181|       |
  182|      0|  if (!hasVisibleField(rty)) {
  ------------------
  |  Branch (182:7): [True: 0, False: 0]
  ------------------
  183|      0|    return false;
  184|      0|  }
  185|       |
  186|       |  // compare the head and tail of the record independently (as 'refine' unifies them)
  187|       |  // rather than reconstructing a record out of the constraint's head and tail types --
  188|       |  // 'headMember' normalizes opaque types stored inline to their by-reference form, so a
  189|       |  // reconstructed record can never match a record whose head field is an inline opaque
  190|       |  // type (eg: a lifted struct with a std::string field followed by any other field)
  191|      0|  if (cr.asTuple) {
  ------------------
  |  Branch (191:7): [True: 0, False: 0]
  ------------------
  192|      0|    if (tty != nullptr) {
  ------------------
  |  Branch (192:9): [True: 0, False: 0]
  ------------------
  193|      0|      return *rty->headMember().type == *cr.headType &&
  ------------------
  |  Branch (193:14): [True: 0, False: 0]
  ------------------
  194|      0|             equalVisibleFields(rty->tailType(), cr.tailType);
  ------------------
  |  Branch (194:14): [True: 0, False: 0]
  ------------------
  195|      0|    } else {
  196|      0|      return *rty->headMember().type == *cr.headType && isUnit(rty->tailType());
  ------------------
  |  Branch (196:14): [True: 0, False: 0]
  |  Branch (196:57): [True: 0, False: 0]
  ------------------
  197|      0|    }
  198|      0|  } else {
  199|      0|    if (tty != nullptr) {
  ------------------
  |  Branch (199:9): [True: 0, False: 0]
  ------------------
  200|      0|      return rty->headMember().field == fname->value() &&
  ------------------
  |  Branch (200:14): [True: 0, False: 0]
  ------------------
  201|      0|             *rty->headMember().type == *cr.headType &&
  ------------------
  |  Branch (201:14): [True: 0, False: 0]
  ------------------
  202|      0|             equalVisibleFields(rty->tailType(), cr.tailType);
  ------------------
  |  Branch (202:14): [True: 0, False: 0]
  ------------------
  203|      0|    } else {
  204|      0|      return rty->headMember().field == fname->value() &&
  ------------------
  |  Branch (204:14): [True: 0, False: 0]
  ------------------
  205|      0|             *rty->headMember().type == *cr.headType &&
  ------------------
  |  Branch (205:14): [True: 0, False: 0]
  ------------------
  206|      0|             isUnit(rty->tailType());
  ------------------
  |  Branch (206:14): [True: 0, False: 0]
  ------------------
  207|      0|    }
  208|      0|  }
  209|      0|}
_ZNK6hobbes19RecordDeconstructor11satisfiableERKSt10shared_ptrINS_4TEnvEERKS1_INS_10ConstraintEEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISK_EE:
  211|     11|bool RecordDeconstructor::satisfiable(const TEnvPtr& tenv, const ConstraintPtr& cst, Definitions* ds) const {
  212|     11|  ConsRecord cr;
  213|     11|  if (dec(cst, &cr)) {
  ------------------
  |  Branch (213:7): [True: 11, False: 0]
  ------------------
  214|     11|    return satisfied(tenv, cst, ds) || (is<TVar>(cr.recordType) != nullptr) || (is<TVar>(cr.headFieldName) != nullptr) || ((is<Record>(cr.recordType) != nullptr) && ((is<TVar>(cr.headType) != nullptr) || (is<TVar>(cr.tailType) != nullptr)));
  ------------------
  |  Branch (214:12): [True: 0, False: 11]
  |  Branch (214:40): [True: 0, False: 11]
  |  Branch (214:80): [True: 11, False: 0]
  |  Branch (214:124): [True: 0, False: 0]
  |  Branch (214:167): [True: 0, False: 0]
  |  Branch (214:205): [True: 0, False: 0]
  ------------------
  215|     11|  } else {
  216|      0|    return false;
  217|      0|  }
  218|     11|}
_ZNK6hobbes19RecordDeconstructor6lookupERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  223|  2.76k|PolyTypePtr RecordDeconstructor::lookup(const std::string& vn) const {
  224|  2.76k|  if (vn == REF_REC_LABEL) {
  ------------------
  |  |   17|  2.76k|#define REF_REC_LABEL "recordHeadLabel"
  ------------------
  |  Branch (224:7): [True: 0, False: 2.76k]
  ------------------
  225|      0|    return polytype(4, qualtype(list(std::make_shared<Constraint>(RecordDeconstructor::constraintName(), list(tlong(1), tlong(0), tgen(0), tgen(1), tgen(2), tgen(3)))), functy(list(tgen(0)), arrayty(prim<char>()))));
  226|  2.76k|  } else if (vn == REF_REC_VALUE) {
  ------------------
  |  |   18|  2.76k|#define REF_REC_VALUE "recordHeadValue"
  ------------------
  |  Branch (226:14): [True: 0, False: 2.76k]
  ------------------
  227|      0|    return polytype(4, qualtype(list(std::make_shared<Constraint>(RecordDeconstructor::constraintName(), list(tlong(1), tlong(0), tgen(0), tgen(1), tgen(2), tgen(3)))), functy(list(tgen(0)), tgen(2))));
  228|  2.76k|  } else if (vn == REF_REC_TAIL) {
  ------------------
  |  |   19|  2.76k|#define REF_REC_TAIL  "recordTail"
  ------------------
  |  Branch (228:14): [True: 0, False: 2.76k]
  ------------------
  229|      0|    return polytype(4, qualtype(list(std::make_shared<Constraint>(RecordDeconstructor::constraintName(), list(tlong(1), tlong(0), tgen(0), tgen(1), tgen(2), tgen(3)))), functy(list(tgen(0)), tgen(3))));
  230|  2.76k|  } else if (vn == REF_TUP_TAIL) {
  ------------------
  |  |   20|  2.76k|#define REF_TUP_TAIL  "tupleTail"
  ------------------
  |  Branch (230:14): [True: 0, False: 2.76k]
  ------------------
  231|      0|    return polytype(4, qualtype(list(std::make_shared<Constraint>(RecordDeconstructor::constraintName(), list(tlong(1), tlong(1), tgen(0), tgen(1), tgen(2), tgen(3)))), functy(list(tgen(0)), tgen(3))));
  232|  2.76k|  } else {
  233|  2.76k|    return PolyTypePtr();
  234|  2.76k|  }
  235|  2.76k|}
_ZNK6hobbes19RecordDeconstructor8bindingsB5cxx11Ev:
  237|      1|SymSet RecordDeconstructor::bindings() const {
  238|      1|  SymSet r;
  239|      1|  r.insert(REF_REC_LABEL);
  ------------------
  |  |   17|      1|#define REF_REC_LABEL "recordHeadLabel"
  ------------------
  240|      1|  r.insert(REF_REC_VALUE);
  ------------------
  |  |   18|      1|#define REF_REC_VALUE "recordHeadValue"
  ------------------
  241|      1|  r.insert(REF_REC_TAIL);
  ------------------
  |  |   19|      1|#define REF_REC_TAIL  "recordTail"
  ------------------
  242|      1|  r.insert(REF_TUP_TAIL);
  ------------------
  |  |   20|      1|#define REF_TUP_TAIL  "tupleTail"
  ------------------
  243|      1|  return r;
  244|      1|}
consrecord.C:_ZN6hobbesL3decERKSt10shared_ptrINS_10ConstraintEEPNS_10ConsRecordE:
   91|    133|static bool dec(const ConstraintPtr& c, ConsRecord* cr) {
   92|    133|  if (c->name() == RecordDeconstructor::constraintName() && c->arguments().size() == 6) {
  ------------------
  |  Branch (92:7): [True: 133, False: 0]
  |  Branch (92:7): [True: 133, False: 0]
  |  Branch (92:61): [True: 133, False: 0]
  ------------------
   93|    133|    if (const TLong* fwd = is<TLong>(c->arguments()[0])) {
  ------------------
  |  Branch (93:22): [True: 133, False: 0]
  ------------------
   94|    133|      if (const TLong* astup = is<TLong>(c->arguments()[1])) {
  ------------------
  |  Branch (94:24): [True: 133, False: 0]
  ------------------
   95|    133|        cr->forward       = fwd->value() != 0;
   96|    133|        cr->asTuple       = astup->value() != 0;
   97|    133|        cr->recordType    = c->arguments()[2];
   98|    133|        cr->headFieldName = c->arguments()[3];
   99|    133|        cr->headType      = c->arguments()[4];
  100|    133|        cr->tailType      = c->arguments()[5];
  101|       |
  102|    133|        if (const Record* r = is<Record>(cr->recordType)) {
  ------------------
  |  Branch (102:27): [True: 0, False: 133]
  ------------------
  103|      0|          if (!r->members().empty()) {
  ------------------
  |  Branch (103:15): [True: 0, False: 0]
  ------------------
  104|      0|            auto lpfx = r->members()[r->members().size()-1].field.substr(0,2);
  105|       |
  106|      0|            if (lpfx != ".p" && ((lpfx != ".f" && cr->asTuple) || (lpfx == ".f" && !cr->asTuple))) {
  ------------------
  |  Branch (106:17): [True: 0, False: 0]
  |  Branch (106:35): [True: 0, False: 0]
  |  Branch (106:51): [True: 0, False: 0]
  |  Branch (106:68): [True: 0, False: 0]
  |  Branch (106:84): [True: 0, False: 0]
  ------------------
  107|      0|              return false;
  108|      0|            }
  109|      0|          }
  110|      0|        }
  111|    133|        return true;
  112|    133|      }
  113|    133|    }
  114|    133|  }
  115|      0|  return false;
  116|    133|}

_ZN6hobbes20VariantDeconstructor14constraintNameB5cxx11Ev:
   58|     51|std::string VariantDeconstructor::constraintName() {
   59|     51|  return "ConsVariant";
   60|     51|}
_ZN6hobbes20VariantDeconstructor6refineERKSt10shared_ptrINS_4TEnvEERKS1_INS_10ConstraintEEPNS_15MonoTypeUnifierEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISM_EE:
   62|     16|bool VariantDeconstructor::refine(const TEnvPtr&, const ConstraintPtr& cst, MonoTypeUnifier* u, Definitions*) {
   63|     16|  ConsVariant cv;
   64|     16|  if (dec(cst, &cv)) {
  ------------------
  |  Branch (64:7): [True: 16, False: 0]
  ------------------
   65|     16|    if (const Variant* vty = is<Variant>(cv.variantType)) {
  ------------------
  |  Branch (65:24): [True: 0, False: 16]
  ------------------
   66|      0|      if (!vty->members().empty()) {
  ------------------
  |  Branch (66:11): [True: 0, False: 0]
  ------------------
   67|      0|        size_t uc = u->size();
   68|      0|        mgu(tstring(vty->headMember().selector), cv.headCtorName, u);
   69|      0|        mgu(vty->headMember().type,              cv.headType, u);
   70|       |
   71|      0|        if (cv.forward) {
  ------------------
  |  Branch (71:13): [True: 0, False: 0]
  ------------------
   72|      0|          mgu(vty->tailType(), cv.tailType, u);
   73|      0|        } else {
   74|      0|          mgu(normalizeCtorIDs(vty->tailType()), normalizeCtorIDs(cv.tailType), u);
   75|      0|        }
   76|      0|        return uc != u->size();
   77|      0|      }
   78|     16|    } else if (*cv.tailType == *primty("void")) {
  ------------------
  |  Branch (78:16): [True: 8, False: 8]
  ------------------
   79|      8|      if (const TString* lbl = is<TString>(cv.headCtorName)) {
  ------------------
  |  Branch (79:26): [True: 0, False: 8]
  ------------------
   80|      0|        mgu(cv.variantType, MonoTypePtr(Variant::make(lbl->value(), cv.headType, Variant::Members())), u);
   81|      0|      }
   82|      8|    } else if (const Variant* tvty = is<Variant>(cv.tailType)) {
  ------------------
  |  Branch (82:31): [True: 0, False: 8]
  ------------------
   83|      0|      if (const TString* lbl = is<TString>(cv.headCtorName)) {
  ------------------
  |  Branch (83:26): [True: 0, False: 0]
  ------------------
   84|      0|        mgu(cv.variantType, MonoTypePtr(Variant::make(lbl->value(), cv.headType, tvty->members())), u);
   85|      0|      }
   86|      0|    }
   87|     16|  }
   88|     16|  return false;
   89|     16|}
_ZNK6hobbes20VariantDeconstructor6lookupERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  121|  2.76k|PolyTypePtr VariantDeconstructor::lookup(const std::string& vn) const {
  122|  2.76k|  if (vn == REF_VAR_LABEL) {
  ------------------
  |  |   53|  2.76k|#define REF_VAR_LABEL "variantHeadLabel"
  ------------------
  |  Branch (122:7): [True: 0, False: 2.76k]
  ------------------
  123|       |    // variantHeadLabel :: (v=|a+vt|) => v -> [char]
  124|      0|    return polytype(4, qualtype(list(std::make_shared<Constraint>(VariantDeconstructor::constraintName(), list(tlong(1), tgen(0), tgen(1), tgen(2), tgen(3)))), functy(list(tgen(0)), arrayty(prim<char>()))));
  125|  2.76k|  } else if (vn == REF_VAR_SPLIT) {
  ------------------
  |  |   54|  2.76k|#define REF_VAR_SPLIT "variantSplit"
  ------------------
  |  Branch (125:14): [True: 0, False: 2.76k]
  ------------------
  126|       |    // variantSplit :: (v=|a+vt|) => (v, closure a c, closure vt c) -> c
  127|      0|    return
  128|      0|      polytype(5,
  129|      0|        qualtype(
  130|      0|          list(std::make_shared<Constraint>(VariantDeconstructor::constraintName(), list(tlong(1), tgen(0), tgen(1), tgen(2), tgen(3)))),
  131|      0|          functy(list(tgen(0), closty(list(tgen(2)), tgen(4)), closty(list(tgen(3)), tgen(4))), tgen(4))
  132|      0|        )
  133|      0|      );
  134|  2.76k|  } else if (vn == REF_VAR_INJH) {
  ------------------
  |  |   55|  2.76k|#define REF_VAR_INJH  "variantInjectHead"
  ------------------
  |  Branch (134:14): [True: 0, False: 2.76k]
  ------------------
  135|       |    // variantInjectHead :: (v=|a+vt|) => a -> v
  136|      0|    return
  137|      0|      polytype(4,
  138|      0|        qualtype(
  139|      0|          list(std::make_shared<Constraint>(VariantDeconstructor::constraintName(), list(tlong(1), tgen(0), tgen(1), tgen(2), tgen(3)))),
  140|      0|          functy(list(tgen(2)), tgen(0))
  141|      0|        )
  142|      0|      );
  143|  2.76k|  } else if (vn == REF_VAR_LIFTT) {
  ------------------
  |  |   56|  2.76k|#define REF_VAR_LIFTT "variantLiftTail"
  ------------------
  |  Branch (143:14): [True: 0, False: 2.76k]
  ------------------
  144|       |    // variantLiftTail :: (v=|a+vt|) => vt -> v
  145|      0|    return
  146|      0|      polytype(4,
  147|      0|        qualtype(
  148|      0|          list(std::make_shared<Constraint>(VariantDeconstructor::constraintName(), list(tlong(1), tgen(0), tgen(1), tgen(2), tgen(3)))),
  149|      0|          functy(list(tgen(3)), tgen(0))
  150|      0|        )
  151|      0|      );
  152|  2.76k|  } else {
  153|  2.76k|    return PolyTypePtr();
  154|  2.76k|  }
  155|  2.76k|}
_ZNK6hobbes20VariantDeconstructor8bindingsB5cxx11Ev:
  157|      1|SymSet VariantDeconstructor::bindings() const {
  158|      1|  SymSet r;
  159|      1|  r.insert(REF_VAR_LABEL);
  ------------------
  |  |   53|      1|#define REF_VAR_LABEL "variantHeadLabel"
  ------------------
  160|      1|  r.insert(REF_VAR_SPLIT);
  ------------------
  |  |   54|      1|#define REF_VAR_SPLIT "variantSplit"
  ------------------
  161|      1|  r.insert(REF_VAR_INJH);
  ------------------
  |  |   55|      1|#define REF_VAR_INJH  "variantInjectHead"
  ------------------
  162|      1|  r.insert(REF_VAR_LIFTT);
  ------------------
  |  |   56|      1|#define REF_VAR_LIFTT "variantLiftTail"
  ------------------
  163|      1|  return r;
  164|      1|}
consvariant.C:_ZN6hobbesL3decERKSt10shared_ptrINS_10ConstraintEEPNS_11ConsVariantE:
   39|     16|static bool dec(const ConstraintPtr& c, ConsVariant* cv) {
   40|     16|  if (c->name() == VariantDeconstructor::constraintName() && c->arguments().size() == 5) {
  ------------------
  |  Branch (40:7): [True: 16, False: 0]
  |  Branch (40:7): [True: 16, False: 0]
  |  Branch (40:62): [True: 16, False: 0]
  ------------------
   41|     16|    if (const TLong* fwd = is<TLong>(c->arguments()[0])) {
  ------------------
  |  Branch (41:22): [True: 16, False: 0]
  ------------------
   42|     16|      cv->forward      = fwd->value() != 0;
   43|     16|      cv->variantType  = c->arguments()[1];
   44|     16|      cv->headCtorName = c->arguments()[2];
   45|     16|      cv->headType     = c->arguments()[3];
   46|     16|      cv->tailType     = c->arguments()[4];
   47|     16|      return true;
   48|     16|    }
   49|     16|  }
   50|      0|  return false;
   51|     16|}

_ZN6hobbes12CPPTypeDescP14constraintNameB5cxx11Ev:
  208|      1|std::string CPPTypeDescP::constraintName() {
  209|      1|  return "CPPType";
  210|      1|}
_ZNK6hobbes12CPPTypeDescP6lookupERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  259|  2.76k|PolyTypePtr CPPTypeDescP::lookup(const std::string& vn) const {
  260|  2.76k|  if (vn == REF_CPPTDESC) {
  ------------------
  |  |  206|  2.76k|#define REF_CPPTDESC "cppType"
  ------------------
  |  Branch (260:7): [True: 0, False: 2.76k]
  ------------------
  261|      0|    return polytype(2, qualtype(list(std::make_shared<Constraint>(CPPTypeDescP::constraintName(), list(tgen(0), tgen(1)))), arrayty(primty("char"))));
  262|  2.76k|  } else {
  263|  2.76k|    return PolyTypePtr();
  264|  2.76k|  }
  265|  2.76k|}
_ZNK6hobbes12CPPTypeDescP8bindingsB5cxx11Ev:
  267|      1|SymSet CPPTypeDescP::bindings() const {
  268|      1|  SymSet r;
  269|      1|  r.insert(REF_CPPTDESC);
  ------------------
  |  |  206|      1|#define REF_CPPTDESC "cppType"
  ------------------
  270|      1|  return r;
  271|      1|}

_ZN6hobbes5DataP14constraintNameB5cxx11Ev:
    7|      7|std::string DataP::constraintName() {
    8|      7|  return "Data";
    9|      7|}
_ZN6hobbes5DataP6refineERKSt10shared_ptrINS_4TEnvEERKS1_INS_10ConstraintEEPNS_15MonoTypeUnifierEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISM_EE:
   11|      4|bool DataP::refine(const TEnvPtr&, const ConstraintPtr& c, MonoTypeUnifier* u, Definitions*) {
   12|      4|  if (c->name() == DataP::constraintName() && c->arguments().size() == 2) {
  ------------------
  |  Branch (12:7): [True: 4, False: 0]
  |  Branch (12:7): [True: 4, False: 0]
  |  Branch (12:47): [True: 4, False: 0]
  ------------------
   13|      4|    if (!hasFreeVariables(c->arguments()[0]) && hasFreeVariables(c->arguments()[1])) {
  ------------------
  |  Branch (13:9): [True: 4, False: 0]
  |  Branch (13:49): [True: 2, False: 2]
  ------------------
   14|      2|      size_t z = u->size();
   15|      2|      mgu(c->arguments()[1], repTypeStep(c->arguments()[0]), u);
   16|      2|      return z != u->size();
   17|      2|    }
   18|      4|  }
   19|      2|  return false;
   20|      4|}
_ZNK6hobbes5DataP11satisfiableERKSt10shared_ptrINS_4TEnvEERKS1_INS_10ConstraintEEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISK_EE:
   29|      2|bool DataP::satisfiable(const TEnvPtr& tenv, const ConstraintPtr& c, Definitions*) const {
   30|      2|  if (c->name() != DataP::constraintName() || c->arguments().size() != 2) {
  ------------------
  |  Branch (30:7): [True: 0, False: 2]
  |  Branch (30:7): [True: 0, False: 2]
  |  Branch (30:47): [True: 0, False: 2]
  ------------------
   31|      0|    return false;
   32|      2|  } else if (is<TVar>(c->arguments()[0]) != nullptr) {
  ------------------
  |  Branch (32:14): [True: 0, False: 2]
  ------------------
   33|      0|    return true;
   34|      2|  } else {
   35|      2|    return unifiable(tenv, repTypeStep(c->arguments()[0]), c->arguments()[1]);
   36|      2|  }
   37|      2|}
_ZNK6hobbes5DataP6lookupERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
   58|  2.36k|PolyTypePtr DataP::lookup(const std::string&) const {
   59|  2.36k|  return PolyTypePtr();
   60|  2.36k|}
_ZNK6hobbes5DataP8bindingsB5cxx11Ev:
   62|      1|SymSet DataP::bindings() const {
   63|      1|  return SymSet();
   64|      1|}
_ZN6hobbes8StripCstC2ERKSt10shared_ptrINS_10ConstraintEE:
   44|     33|  StripCst(const ConstraintPtr& cst) : constraint(cst) {
   45|     33|  }
_ZNK6hobbes8StripCst10wrapWithTyERKSt10shared_ptrINS_8QualTypeEEPNS_4ExprE:
   47|    582|  ExprPtr wrapWithTy(const QualTypePtr& qty, Expr* e) const override {
   48|    582|    ExprPtr result(e);
   49|    582|    result->type(removeConstraint(this->constraint, qty));
   50|    582|    return result;
   51|    582|  }

_ZN6hobbes12DeconstructP14constraintNameB5cxx11Ev:
    7|  1.66k|std::string DeconstructP::constraintName() {
    8|  1.66k|  return "Deconstruct";
    9|  1.66k|}
_ZN6hobbes12DeconstructP6refineERKSt10shared_ptrINS_4TEnvEERKS1_INS_10ConstraintEEPNS_15MonoTypeUnifierEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISM_EE:
  151|  1.41k|bool DeconstructP::refine(const TEnvPtr&, const ConstraintPtr& c, MonoTypeUnifier* u, Definitions*) {
  152|  1.41k|  if (c->name() != DeconstructP::constraintName() || c->arguments().size() != 2) {
  ------------------
  |  Branch (152:7): [True: 0, False: 1.41k]
  |  Branch (152:7): [True: 0, False: 1.41k]
  |  Branch (152:54): [True: 0, False: 1.41k]
  ------------------
  153|      0|    return false;
  154|      0|  }
  155|       |
  156|  1.41k|  MonoTypePtr dty;
  157|  1.41k|  if (asDestruct(c->arguments()[0], &dty)) {
  ------------------
  |  Branch (157:7): [True: 1.01k, False: 396]
  ------------------
  158|  1.01k|    size_t z = u->size();
  159|  1.01k|    mgu(dty, c->arguments()[1], u);
  160|  1.01k|    return z != u->size();
  161|  1.01k|  }
  162|       |
  163|    396|  MonoTypePtr rty;
  164|    396|  if (asRestruct(c->arguments()[1], &rty)) {
  ------------------
  |  Branch (164:7): [True: 0, False: 396]
  ------------------
  165|      0|    size_t z = u->size();
  166|      0|    mgu(rty, c->arguments()[0], u);
  167|      0|    return z != u->size();
  168|      0|  }
  169|       |
  170|    396|  return false;
  171|    396|}
_ZNK6hobbes12DeconstructP9satisfiedERKSt10shared_ptrINS_4TEnvEERKS1_INS_10ConstraintEEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISK_EE:
  173|    131|bool DeconstructP::satisfied(const TEnvPtr&, const ConstraintPtr& c, Definitions*) const {
  174|    131|  if (c->name() != DeconstructP::constraintName() || c->arguments().size() != 2) {
  ------------------
  |  Branch (174:7): [True: 0, False: 131]
  |  Branch (174:7): [True: 0, False: 131]
  |  Branch (174:54): [True: 0, False: 131]
  ------------------
  175|      0|    return false;
  176|      0|  }
  177|       |
  178|    131|  if (is<TVar>(c->arguments()[0]) != nullptr) {
  ------------------
  |  Branch (178:7): [True: 0, False: 131]
  ------------------
  179|      0|    return false;
  180|    131|  } else {
  181|    131|    MonoTypePtr dty, rty;
  182|       |
  183|    131|    return asDestruct(c->arguments()[0], &dty) &&
  ------------------
  |  Branch (183:12): [True: 131, False: 0]
  ------------------
  184|    131|           asRestruct(c->arguments()[1], &rty) &&
  ------------------
  |  Branch (184:12): [True: 131, False: 0]
  ------------------
  185|    131|           *c->arguments()[0] == *rty &&
  ------------------
  |  Branch (185:12): [True: 131, False: 0]
  ------------------
  186|    131|           *c->arguments()[1] == *dty;
  ------------------
  |  Branch (186:12): [True: 131, False: 0]
  ------------------
  187|    131|  }
  188|    131|}
_ZNK6hobbes12DeconstructP11satisfiableERKSt10shared_ptrINS_4TEnvEERKS1_INS_10ConstraintEEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISK_EE:
  190|    117|bool DeconstructP::satisfiable(const TEnvPtr& tenv, const ConstraintPtr& c, Definitions* ds) const {
  191|    117|  if (c->name() != DeconstructP::constraintName() || c->arguments().size() != 2) {
  ------------------
  |  Branch (191:7): [True: 0, False: 117]
  |  Branch (191:7): [True: 0, False: 117]
  |  Branch (191:54): [True: 0, False: 117]
  ------------------
  192|      0|    return false;
  193|      0|  }
  194|       |
  195|    117|  if ((is<TVar>(c->arguments()[0]) != nullptr) || (is<TVar>(c->arguments()[1]) != nullptr)) {
  ------------------
  |  Branch (195:7): [True: 20, False: 97]
  |  Branch (195:51): [True: 0, False: 97]
  ------------------
  196|     20|    return true;
  197|     97|  } else {
  198|     97|    return satisfied(tenv, c, ds);
  199|     97|  }
  200|    117|}
_ZNK6hobbes12DeconstructP6lookupERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  221|  2.36k|PolyTypePtr DeconstructP::lookup(const std::string&) const {
  222|  2.36k|  return PolyTypePtr();
  223|  2.36k|}
_ZNK6hobbes12DeconstructP8bindingsB5cxx11Ev:
  225|      1|SymSet DeconstructP::bindings() const {
  226|      1|  return SymSet();
  227|      1|}
_ZNK6hobbes12DeconstructP12dependenciesERKSt10shared_ptrINS_10ConstraintEE:
  229|      1|FunDeps DeconstructP::dependencies(const ConstraintPtr&) const {
  230|      1|  return list(FunDep(list(0), 1), FunDep(list(1), 0));
  231|      1|}
deconstruct.C:_ZN6hobbesL10asDestructERKSt10shared_ptrINS_8MonoTypeEEPS2_:
  117|  1.54k|static bool asDestruct(const MonoTypePtr& t, MonoTypePtr* dty) {
  118|  1.54k|  return switchOf(t, destructType(dty));
  119|  1.54k|}
_ZN6hobbes12destructTypeC2EPSt10shared_ptrINS_8MonoTypeEE:
   13|  1.54k|  destructType(MonoTypePtr* r) : r(r) { }
_ZNK6hobbes12destructType4withEPKNS_4TVarE:
   23|    396|  bool with(const TVar*) const override {
   24|    396|    return false;
   25|    396|  }
_ZNK6hobbes12destructType4withEPKNS_4FuncE:
   64|    268|  bool with(const Func* v) const override {
   65|    268|    auto ps = v->parameters();
   66|       |
   67|    268|    *this->r = tuplety(list(
   68|    268|      tstring("->"),
   69|    268|      (ps.size() == 1) ? ps[0] : v->argument(), // a little bit of a hack -- we need to deal with tuple argls better ...
  ------------------
  |  Branch (69:7): [True: 268, False: 0]
  ------------------
   70|    268|      v->result()
   71|    268|    ));
   72|    268|    return true;
   73|    268|  }
_ZNK6hobbes12destructType4withEPKNS_6ExistsE:
   75|    880|  bool with(const Exists* v) const override {
   76|       |    // again a bit of a hack
   77|       |    //   exists E.((E,a)->b)*E = (closure a b)
   78|    880|    if (const Record* crec = is<Record>(v->absType())) {
  ------------------
  |  Branch (78:23): [True: 880, False: 0]
  ------------------
   79|    880|      if (crec->members().size() == 2 && crec->isTuple()) {
  ------------------
  |  Branch (79:11): [True: 880, False: 0]
  |  Branch (79:42): [True: 880, False: 0]
  ------------------
   80|    880|        if (const Func* cfn = is<Func>(crec->members()[0].type)) {
  ------------------
  |  Branch (80:25): [True: 880, False: 0]
  ------------------
   81|    880|          MonoTypes ps = cfn->parameters();
   82|    880|          if (ps.size() >= 2 && *ps[0] == *tvar(v->absTypeName())) {
  ------------------
  |  Branch (82:15): [True: 880, False: 0]
  |  Branch (82:15): [True: 880, False: 0]
  |  Branch (82:33): [True: 880, False: 0]
  ------------------
   83|    880|            *this->r = tuplety(list(
   84|    880|              tstring("closure"),
   85|    880|              (ps.size() == 2) ? ps[1] : tuplety(drop(ps, 1)),
  ------------------
  |  Branch (85:15): [True: 880, False: 0]
  ------------------
   86|    880|              cfn->result()
   87|    880|            ));
   88|    880|            return true;
   89|    880|          }
   90|    880|        }
   91|    880|      }
   92|    880|    }
   93|      0|    return false;
   94|    880|  }
deconstruct.C:_ZN6hobbesL10asRestructERKSt10shared_ptrINS_8MonoTypeEEPS2_:
  121|    527|static bool asRestruct(const MonoTypePtr& t, MonoTypePtr* rty) {
  122|    527|  const Record* r = is<Record>(t);
  123|    527|  if ((r == nullptr) || !r->isTuple()) return false;
  ------------------
  |  Branch (123:7): [True: 0, False: 527]
  |  Branch (123:25): [True: 0, False: 527]
  ------------------
  124|       |
  125|    527|  const Record::Members& ms = r->members();
  126|    527|  if (ms.empty()) return false;
  ------------------
  |  Branch (126:7): [True: 0, False: 527]
  ------------------
  127|       |
  128|    527|  const TString* ctor = is<TString>(ms[0].type);
  129|    527|  if (ctor == nullptr) return false;
  ------------------
  |  Branch (129:7): [True: 396, False: 131]
  ------------------
  130|       |
  131|    131|  if (ctor->value() == "->" && ms.size() == 3) {
  ------------------
  |  Branch (131:7): [True: 26, False: 105]
  |  Branch (131:32): [True: 26, False: 0]
  ------------------
  132|     26|    *rty = MonoTypePtr(Func::make(tuplety(list(ms[1].type)), ms[2].type));
  133|     26|    return true;
  134|    105|  } else if (ctor->value() == "array" && ms.size() == 2) {
  ------------------
  |  Branch (134:14): [True: 0, False: 105]
  |  Branch (134:42): [True: 0, False: 0]
  ------------------
  135|      0|    *rty = MonoTypePtr(Array::make(ms[1].type));
  136|      0|    return true;
  137|    105|  } else if (ctor->value() == "fixedarray" && ms.size() == 3) {
  ------------------
  |  Branch (137:14): [True: 0, False: 105]
  |  Branch (137:47): [True: 0, False: 0]
  ------------------
  138|      0|    *rty = MonoTypePtr(FixedArray::make(ms[1].type, ms[2].type));
  139|      0|    return true;
  140|    105|  } else if (ctor->value() == "recursive" && ms.size() == 2) {
  ------------------
  |  Branch (140:14): [True: 0, False: 105]
  |  Branch (140:46): [True: 0, False: 0]
  ------------------
  141|      0|    *rty = ms[1].type;
  142|      0|    return true;
  143|    105|  } else if (ctor->value() == "closure" && ms.size() == 3) {
  ------------------
  |  Branch (143:14): [True: 105, False: 0]
  |  Branch (143:44): [True: 105, False: 0]
  ------------------
  144|    105|    *rty = MonoTypePtr(Exists::make("E", tuplety(list(functy(list(tvar("E"), ms[1].type), ms[2].type), tvar("E")))));
  145|    105|    return true;
  146|    105|  }
  147|       |
  148|      0|  return false;
  149|    131|}

_ZN6hobbes10EqualTypes14constraintNameB5cxx11Ev:
   20|      1|std::string EqualTypes::constraintName() {
   21|      1|  return "equals";
   22|      1|}
_ZNK6hobbes10EqualTypes6lookupERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
   58|  1.54k|PolyTypePtr EqualTypes::lookup(const std::string&) const {
   59|  1.54k|  return PolyTypePtr(); // this won't be necessary
   60|  1.54k|}
_ZNK6hobbes10EqualTypes8bindingsB5cxx11Ev:
   62|      1|SymSet EqualTypes::bindings() const {
   63|      1|  return SymSet(); // no overloaded symbols are defined here
   64|      1|}

_ZN6hobbes12CtorVerifierC2Ev:
   18|      1|CtorVerifier::CtorVerifier() {
   19|      1|  addEliminator(std::make_shared<HCVariantEliminator>());
   20|      1|}
_ZN6hobbes12CtorVerifier14constraintNameB5cxx11Ev:
   22|  1.70k|std::string CtorVerifier::constraintName() {
   23|  1.70k|  return "HasCtor";
   24|  1.70k|}
_ZN6hobbes12CtorVerifier13addEliminatorERKSt10shared_ptrINS_12HCEliminatorEE:
   26|      1|void CtorVerifier::addEliminator(const std::shared_ptr<HCEliminator>& hce) {
   27|      1|  this->eliminators.push_back(hce);
   28|      1|}
_ZNK6hobbes12CtorVerifier14findEliminatorERKSt10shared_ptrINS_4TEnvEERKNS_7HasCtorEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISJ_EE:
   30|  1.56k|HCEliminator* CtorVerifier::findEliminator(const TEnvPtr& tenv, const HasCtor& hc, Definitions* ds) const {
   31|  1.56k|  for (const auto& hce : this->eliminators) {
  ------------------
  |  Branch (31:24): [True: 1.56k, False: 0]
  ------------------
   32|  1.56k|    if (hce->satisfiable(tenv, hc, ds)) {
  ------------------
  |  Branch (32:9): [True: 1.56k, False: 0]
  ------------------
   33|  1.56k|      return hce.get();
   34|  1.56k|    }
   35|  1.56k|  }
   36|      0|  return nullptr;
   37|  1.56k|}
_ZN6hobbes12CtorVerifier6refineERKSt10shared_ptrINS_4TEnvEERKS1_INS_10ConstraintEEPNS_15MonoTypeUnifierEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISM_EE:
   39|  1.24k|bool CtorVerifier::refine(const TEnvPtr& tenv, const ConstraintPtr& cst, MonoTypeUnifier* s, Definitions* ds) {
   40|  1.24k|  HasCtor hc;
   41|  1.24k|  if (dec(cst, &hc)) {
  ------------------
  |  Branch (41:7): [True: 1.24k, False: 0]
  ------------------
   42|  1.24k|    if (HCEliminator* hce = findEliminator(tenv, hc, ds)) {
  ------------------
  |  Branch (42:23): [True: 1.24k, False: 0]
  ------------------
   43|  1.24k|      return hce->refine(tenv, hc, s, ds);
   44|  1.24k|    }
   45|  1.24k|  }
   46|      0|  return false;
   47|  1.24k|}
_ZNK6hobbes12CtorVerifier9satisfiedERKSt10shared_ptrINS_4TEnvEERKS1_INS_10ConstraintEEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISK_EE:
   49|    112|bool CtorVerifier::satisfied(const TEnvPtr& tenv, const ConstraintPtr& cst, Definitions* ds) const {
   50|    112|  HasCtor hc;
   51|    112|  if (dec(cst, &hc)) {
  ------------------
  |  Branch (51:7): [True: 112, False: 0]
  ------------------
   52|    112|    if (HCEliminator* hce = findEliminator(tenv, hc, ds)) {
  ------------------
  |  Branch (52:23): [True: 112, False: 0]
  ------------------
   53|    112|      return hce->satisfied(tenv, hc, ds);
   54|    112|    }
   55|    112|  }
   56|      0|  return false;
   57|    112|}
_ZNK6hobbes12CtorVerifier11satisfiableERKSt10shared_ptrINS_4TEnvEERKS1_INS_10ConstraintEEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISK_EE:
   59|    105|bool CtorVerifier::satisfiable(const TEnvPtr& tenv, const ConstraintPtr& cst, Definitions* ds) const {
   60|    105|  HasCtor hc;
   61|    105|  return dec(cst, &hc) && (findEliminator(tenv, hc, ds) != nullptr);
  ------------------
  |  Branch (61:10): [True: 105, False: 0]
  |  Branch (61:27): [True: 105, False: 0]
  ------------------
   62|    105|}
_ZNK6hobbes12CtorVerifier9unqualifyERKSt10shared_ptrINS_4TEnvEERKS1_INS_10ConstraintEERKS1_INS_4ExprEEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESB_ESaISM_EE:
  111|    109|ExprPtr CtorVerifier::unqualify(const TEnvPtr& tenv, const ConstraintPtr& cst, const ExprPtr& e, Definitions* ds) const {
  112|    109|  HasCtor hc;
  113|    109|  if (dec(cst, &hc)) {
  ------------------
  |  Branch (113:7): [True: 109, False: 0]
  ------------------
  114|    109|    if (HCEliminator* hce = findEliminator(tenv, hc, ds)) {
  ------------------
  |  Branch (114:23): [True: 109, False: 0]
  ------------------
  115|    109|      return hce->unqualify(tenv, cst, hc, switchOf(e, RewriteMSelect(hc, cst)), ds);
  116|    109|    }
  117|    109|  }
  118|      0|  throw annotated_error(*e, "Cannot unqualify constraint: " + show(cst));
  119|    109|}
_ZNK6hobbes12CtorVerifier6lookupERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  121|  1.99k|PolyTypePtr CtorVerifier::lookup(const std::string& vn) const {
  122|  1.99k|  if (vn == MSELECT_CTOR_FN) {
  ------------------
  |  |   13|  1.99k|#define MSELECT_CTOR_FN "maybeFromCtor"
  ------------------
  |  Branch (122:7): [True: 0, False: 1.99k]
  ------------------
  123|       |    // select either the given constructor payload from a variant, or nothing
  124|       |    // :: (|c/p|::v) => v -> (()+p)
  125|      0|    return polytype(3, qualtype(list(std::make_shared<Constraint>(CtorVerifier::constraintName(), list(tgen(0), tgen(1), tgen(2)))), functy(list(tgen(0)), maybety(tgen(2)))));
  126|  1.99k|  } else {
  127|  1.99k|    return PolyTypePtr();
  128|  1.99k|  }
  129|  1.99k|}
_ZNK6hobbes12CtorVerifier8bindingsB5cxx11Ev:
  131|      1|SymSet CtorVerifier::bindings() const {
  132|      1|  SymSet r;
  133|      1|  r.insert(MSELECT_CTOR_FN);
  ------------------
  |  |   13|      1|#define MSELECT_CTOR_FN "maybeFromCtor"
  ------------------
  134|      1|  return r;
  135|      1|}
_ZNK6hobbes12CtorVerifier12dependenciesERKSt10shared_ptrINS_10ConstraintEE:
  137|  1.19k|FunDeps CtorVerifier::dependencies(const ConstraintPtr&) const {
  138|  1.19k|  FunDeps result;
  139|  1.19k|  result.push_back(FunDep(list(0, 1), 2));
  140|  1.19k|  return result;
  141|  1.19k|}
_ZN6hobbes12CtorVerifier3decERKSt10shared_ptrINS_10ConstraintEEPNS_7HasCtorE:
  143|  1.56k|bool CtorVerifier::dec(const ConstraintPtr& c, HasCtor* hc) {
  144|  1.56k|  if (c->name() == CtorVerifier::constraintName() && c->arguments().size() == 3) {
  ------------------
  |  Branch (144:7): [True: 1.56k, False: 0]
  |  Branch (144:7): [True: 1.56k, False: 0]
  |  Branch (144:54): [True: 1.56k, False: 0]
  ------------------
  145|  1.56k|    hc->variant = c->arguments()[0];
  146|  1.56k|    hc->ctorlbl = c->arguments()[1];
  147|  1.56k|    hc->ctorty  = c->arguments()[2];
  148|  1.56k|    return true;
  149|  1.56k|  }
  150|      0|  return false;
  151|  1.56k|}
_ZN6hobbes14RewriteMSelectC2ERKNS_7HasCtorERKSt10shared_ptrINS_10ConstraintEE:
   72|    109|  RewriteMSelect(const HasCtor& hc, const ConstraintPtr& cst) : hc(hc), cst(cst) {
   73|    109|    const TString* fn = is<TString>(hc.ctorlbl);
   74|    109|    if (fn == nullptr) { throw std::runtime_error("Internal error, invalid hasctor constraint for unqualification"); }
  ------------------
  |  Branch (74:9): [True: 0, False: 109]
  ------------------
   75|    109|    this->ctor = fn->value();
   76|    109|  }
_ZNK6hobbes14RewriteMSelect4withEPKNS_3VarE:
   93|  1.33k|  ExprPtr with(const Var* v) const override {
   94|  1.33k|    if (hasConstraint(this->cst, v->type())) {
  ------------------
  |  Branch (94:9): [True: 27, False: 1.30k]
  ------------------
   95|     27|      if (v->value() == MSELECT_CTOR_FN) {
  ------------------
  |  |   13|     27|#define MSELECT_CTOR_FN "maybeFromCtor"
  ------------------
  |  Branch (95:11): [True: 0, False: 27]
  ------------------
   96|      0|        std::string vn = freshName();
   97|       |
   98|      0|        ExprPtr b(new Case(var(vn, this->hc.variant, v->la()), list(Case::Binding(this->ctor, ".p", justE(var(".p", this->hc.ctorty, v->la()), v->la()))), nothingE(this->hc.ctorty, v->la()), v->la()));
   99|      0|        b->type(qualtype(maybety(this->hc.ctorty)));
  100|       |        
  101|      0|        ExprPtr rv = fn(vn, b, v->la());
  102|      0|        rv->type(qualtype(functy(this->hc.variant, maybety(this->hc.ctorty))));
  103|      0|        return rv;
  104|      0|      }
  105|     27|    }
  106|  1.33k|    return wrapWithTy(v->type(), new Var(v->value(), v->la()));
  107|  1.33k|  }
_ZNK6hobbes14RewriteMSelect4withEPKNS_3AppE:
   78|    541|  ExprPtr with(const App* ap) const override {
   79|    541|    if (ap->args().size() == 1) {
  ------------------
  |  Branch (79:9): [True: 139, False: 402]
  ------------------
   80|    139|      if (hasConstraint(this->cst, ap->type())) {
  ------------------
  |  Branch (80:11): [True: 5, False: 134]
  ------------------
   81|      5|        if (const Var* f = is<Var>(stripAssumpHead(ap->fn()))) {
  ------------------
  |  Branch (81:24): [True: 5, False: 0]
  ------------------
   82|      5|          if (f->value() == MSELECT_CTOR_FN) {
  ------------------
  |  |   13|      5|#define MSELECT_CTOR_FN "maybeFromCtor"
  ------------------
  |  Branch (82:15): [True: 0, False: 5]
  ------------------
   83|      0|            ExprPtr r(new Case(ap->args()[0], list(Case::Binding(this->ctor, ".p", justE(var(".p", this->hc.ctorty, ap->la()), ap->la()))), nothingE(this->hc.ctorty, ap->la()), ap->la()));
   84|      0|            r->type(qualtype(maybety(this->hc.ctorty)));
   85|      0|            return r;
   86|      0|          }
   87|      5|        }
   88|      5|      }
   89|    139|    }
   90|    541|    return wrapWithTy(ap->type(), new App(switchOf(ap->fn(), *this), switchOf(ap->args(), *this), ap->la()));
   91|    541|  }

_ZN6hobbes14isVariantPEnumERKSt10shared_ptrINS_8MonoTypeEE:
    8|    915|const Variant *isVariantPEnum(const MonoTypePtr &e) {
    9|    915|  if (const TApp *tappty = is<TApp>(e)) {
  ------------------
  |  Branch (9:19): [True: 0, False: 915]
  ------------------
   10|      0|    if (const Prim *fn = is<Prim>(tappty->fn())) {
  ------------------
  |  Branch (10:21): [True: 0, False: 0]
  ------------------
   11|      0|      if (fn->name() == "penum" && tappty->args().size() == 2) {
  ------------------
  |  Branch (11:11): [True: 0, False: 0]
  |  Branch (11:36): [True: 0, False: 0]
  ------------------
   12|      0|        return is<Variant>(tappty->args()[1]);
   13|      0|      }
   14|      0|    }
   15|      0|  }
   16|    915|  return nullptr;
   17|    915|}
_ZNK6hobbes19HCVariantEliminator9satisfiedERKSt10shared_ptrINS_4TEnvEERKNS_7HasCtorEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISJ_EE:
   26|    112|bool HCVariantEliminator::satisfied(const TEnvPtr&, const HasCtor& hc, Definitions*) const {
   27|    112|  if (const Variant* vty = isMaybeNestedVariant(hc.variant)) {
  ------------------
  |  Branch (27:22): [True: 109, False: 3]
  ------------------
   28|    109|    if (const TString* fname = is<TString>(hc.ctorlbl)) {
  ------------------
  |  Branch (28:24): [True: 109, False: 0]
  ------------------
   29|    109|      if (const Variant::Member* m = vty->mmember(fname->value())) {
  ------------------
  |  Branch (29:34): [True: 109, False: 0]
  ------------------
   30|    109|        return *m->type == *hc.ctorty;
   31|    109|      }
   32|    109|    }
   33|    109|  }
   34|      3|  return false;
   35|    112|}
_ZNK6hobbes19HCVariantEliminator11satisfiableERKSt10shared_ptrINS_4TEnvEERKNS_7HasCtorEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISJ_EE:
   37|  1.56k|bool HCVariantEliminator::satisfiable(const TEnvPtr& tenv, const HasCtor& hc, Definitions*) const {
   38|  1.56k|  if (const Variant* vty = isMaybeNestedVariant(hc.variant)) {
  ------------------
  |  Branch (38:22): [True: 1.10k, False: 459]
  ------------------
   39|  1.10k|    if (const TString* fname = is<TString>(hc.ctorlbl)) {
  ------------------
  |  Branch (39:24): [True: 1.10k, False: 0]
  ------------------
   40|  1.10k|      const Variant::Member* vm = vty->mmember(fname->value());
   41|  1.10k|      return vm != nullptr && unifiable(tenv, vm->type, hc.ctorty);
  ------------------
  |  Branch (41:14): [True: 1.10k, False: 0]
  |  Branch (41:31): [True: 1.10k, False: 0]
  ------------------
   42|  1.10k|    } else {
   43|      0|      return is<TVar>(hc.ctorlbl) != nullptr;
   44|      0|    }
   45|  1.10k|  }
   46|    459|  return is<TVar>(hc.variant) != nullptr;
   47|  1.56k|}
_ZN6hobbes19HCVariantEliminator6refineERKSt10shared_ptrINS_4TEnvEERKNS_7HasCtorEPNS_15MonoTypeUnifierEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISL_EE:
   49|  1.24k|bool HCVariantEliminator::refine(const TEnvPtr&, const HasCtor& hc, MonoTypeUnifier* s, Definitions*) {
   50|  1.24k|  if (const Variant* vty = isMaybeNestedVariant(hc.variant)) {
  ------------------
  |  Branch (50:22): [True: 789, False: 453]
  ------------------
   51|    789|    if (const TString* fname = is<TString>(hc.ctorlbl)) {
  ------------------
  |  Branch (51:24): [True: 789, False: 0]
  ------------------
   52|    789|      if (const Variant::Member* m = vty->mmember(fname->value())) {
  ------------------
  |  Branch (52:34): [True: 789, False: 0]
  ------------------
   53|    789|        size_t uc = s->size();
   54|    789|        mgu(hc.ctorty, normIfOpaquePtr(m->type), s);
   55|    789|        return uc != s->size();
   56|    789|      }
   57|    789|    }
   58|    789|  }
   59|    453|  return false;
   60|  1.24k|}
_ZNK6hobbes19HCVariantEliminator9unqualifyERKSt10shared_ptrINS_4TEnvEERKS1_INS_10ConstraintEERKNS_7HasCtorERKS1_INS_4ExprEEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESE_ESaISP_EE:
   75|    109|ExprPtr HCVariantEliminator::unqualify(const TEnvPtr&, const ConstraintPtr& cst, const HasCtor&, const ExprPtr& e, Definitions*) const {
   76|    109|  return switchOf(e, HCVariantUnqualify(cst));
   77|    109|}
variant.C:_ZN6hobbesL20isMaybeNestedVariantERKSt10shared_ptrINS_8MonoTypeEE:
   19|  2.92k|static const Variant *isMaybeNestedVariant(const MonoTypePtr &e) {
   20|  2.92k|  if (const auto *vty = is<Variant>(e)) {
  ------------------
  |  Branch (20:19): [True: 2.00k, False: 915]
  ------------------
   21|  2.00k|    return vty;
   22|  2.00k|  }
   23|    915|  return isVariantPEnum(e);
   24|  2.92k|}
_ZN6hobbes18HCVariantUnqualifyC2ERKSt10shared_ptrINS_10ConstraintEE:
   65|    109|  HCVariantUnqualify(const ConstraintPtr& cst) : constraint(cst) {
   66|    109|  }
_ZNK6hobbes18HCVariantUnqualify10wrapWithTyERKSt10shared_ptrINS_8QualTypeEEPNS_4ExprE:
   68|  3.25k|  ExprPtr wrapWithTy(const QualTypePtr& qty, Expr* e) const override {
   69|  3.25k|    ExprPtr result(e);
   70|  3.25k|    result->type(removeConstraint(this->constraint, qty));
   71|  3.25k|    return result;
   72|  3.25k|  }

_ZN6hobbes8HasField13newConstraintENS0_9DirectionERKSt10shared_ptrINS_8MonoTypeEES6_S6_RKS2_INS_4ExprEE:
   19|    261|Constraint*   HasField::newConstraint(Direction d, const MonoTypePtr& t0, const MonoTypePtr& t1, const MonoTypePtr& t2, const ExprPtr& e) { return new Constraint(FieldVerifier::constraintName(), list(tlong(d == HasField::Read ? 0 : 1), t0, t1, t2, texpr(e))); }
  ------------------
  |  Branch (19:207): [True: 261, False: 0]
  ------------------
_ZN6hobbes8HasField13newConstraintENS0_9DirectionERKSt10shared_ptrINS_8MonoTypeEES6_S6_:
   20|     12|Constraint*   HasField::newConstraint(Direction d, const MonoTypePtr& t0, const MonoTypePtr& t1, const MonoTypePtr& t2)                   { return new Constraint(FieldVerifier::constraintName(), list(tlong(d == HasField::Read ? 0 : 1), t0, t1, t2, primty("unit"))); }
  ------------------
  |  Branch (20:207): [True: 12, False: 0]
  ------------------
_ZN6hobbes8HasField10constraintENS0_9DirectionERKSt10shared_ptrINS_8MonoTypeEES6_S6_RKS2_INS_4ExprEE:
   21|    261|ConstraintPtr HasField::constraint   (Direction d, const MonoTypePtr& t0, const MonoTypePtr& t1, const MonoTypePtr& t2, const ExprPtr& e) { return ConstraintPtr(newConstraint(d,t0,t1,t2,e)); }
_ZN6hobbes3decERKSt10shared_ptrINS_10ConstraintEEPNS_8HasFieldE:
   24|  10.6k|bool dec(const ConstraintPtr& c, HasField* hf) {
   25|  10.6k|  if (c->name() == FieldVerifier::constraintName() && c->arguments().size() == 5) {
  ------------------
  |  Branch (25:7): [True: 10.6k, False: 49]
  |  Branch (25:7): [True: 10.6k, False: 49]
  |  Branch (25:55): [True: 10.6k, False: 0]
  ------------------
   26|  10.6k|    if (const TLong* d = is<TLong>(c->arguments()[0])) {
  ------------------
  |  Branch (26:22): [True: 10.6k, False: 0]
  ------------------
   27|  10.6k|      hf->direction = d->value() == 0 ? HasField::Read : HasField::Write;
  ------------------
  |  Branch (27:23): [True: 9.78k, False: 861]
  ------------------
   28|  10.6k|      hf->recordType = c->arguments()[1];
   29|  10.6k|      hf->fieldName = c->arguments()[2];
   30|  10.6k|      hf->fieldType = c->arguments()[3];
   31|  10.6k|      if (const TExpr* e = is<TExpr>(c->arguments()[4])) {
  ------------------
  |  Branch (31:24): [True: 10.6k, False: 12]
  ------------------
   32|  10.6k|        hf->recordExpr = e->expr();
   33|  10.6k|      }
   34|  10.6k|      return true;
   35|  10.6k|    }
   36|  10.6k|  }
   37|     49|  return false;
   38|  10.6k|}
_ZN6hobbes3updERKSt10shared_ptrINS_10ConstraintEERKNS_8HasFieldE:
   40|     27|void upd(const ConstraintPtr& c, const HasField& hf) {
   41|     27|  if (c->name() == FieldVerifier::constraintName() && c->arguments().size() == 5) {
  ------------------
  |  Branch (41:7): [True: 27, False: 0]
  |  Branch (41:7): [True: 27, False: 0]
  |  Branch (41:55): [True: 27, False: 0]
  ------------------
   42|     27|    auto& mts = const_cast<MonoTypes&>(c->arguments());
   43|     27|    mts[0] = tlong(hf.direction == HasField::Read ? 0 : 1);
  ------------------
  |  Branch (43:20): [True: 0, False: 27]
  ------------------
   44|     27|    mts[1] = hf.recordType;
   45|     27|    mts[2] = hf.fieldName;
   46|     27|    mts[3] = hf.fieldType;
   47|     27|    mts[4] = hf.recordExpr ? texpr(hf.recordExpr) : primty("unit");
  ------------------
  |  Branch (47:14): [True: 27, False: 0]
  ------------------
   48|     27|  }
   49|     27|}
_ZN6hobbes13FieldVerifier14constraintNameB5cxx11Ev:
   51|  11.0k|std::string FieldVerifier::constraintName() {
   52|  11.0k|  return "HasField";
   53|  11.0k|}
_ZN6hobbes13FieldVerifierC2Ev:
   55|      1|FieldVerifier::FieldVerifier() {
   56|      1|  this->eliminators.push_back(std::make_shared<HFRecordEliminator>());
   57|      1|  this->eliminators.push_back(std::make_shared<HFSLookupEliminator>());
   58|      1|  this->eliminators.push_back(std::make_shared<HFLookupEliminator>());
   59|      1|  this->eliminators.push_back(std::make_shared<HFTEnvLookupEliminator>());
   60|      1|}
_ZN6hobbes13FieldVerifier13addEliminatorERKSt10shared_ptrINS_12HFEliminatorEE:
   62|      3|void FieldVerifier::addEliminator(const std::shared_ptr<HFEliminator>& hfe) {
   63|      3|  this->eliminators.push_back(hfe);
   64|       |
   65|       |  // a hacky way to make sure that the TEnv eliminator is the last one considered, since it's kind of a catch-all
   66|      3|  std::swap(this->eliminators[this->eliminators.size() - 1], this->eliminators[this->eliminators.size() - 2]);
   67|      3|}
_ZN6hobbes13FieldVerifier6refineERKSt10shared_ptrINS_4TEnvEERKS1_INS_10ConstraintEEPNS_15MonoTypeUnifierEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISM_EE:
   69|  5.21k|bool FieldVerifier::refine(const TEnvPtr& tenv, const ConstraintPtr& cst, MonoTypeUnifier* s, Definitions* ds) {
   70|  5.21k|  HasField hf;
   71|  5.21k|  if (dec(cst, &hf)) {
  ------------------
  |  Branch (71:7): [True: 5.21k, False: 0]
  ------------------
   72|  35.7k|    for (const auto& hfe : this->eliminators) {
  ------------------
  |  Branch (72:26): [True: 35.7k, False: 5.09k]
  ------------------
   73|  35.7k|      try {
   74|  35.7k|        if (hfe->satisfiable(tenv, hf, ds) && hfe->refine(tenv, hf, s, ds)) {
  ------------------
  |  Branch (74:13): [True: 14.8k, False: 20.9k]
  |  Branch (74:47): [True: 113, False: 14.7k]
  ------------------
   75|    113|          return true;
   76|    113|        }
   77|  35.7k|      } catch (std::exception&) { }
   78|  35.7k|    }
   79|  5.21k|  }
   80|       |
   81|  5.09k|  return false;
   82|  5.21k|}
_ZNK6hobbes13FieldVerifier9satisfiedERKSt10shared_ptrINS_4TEnvEERKS1_INS_10ConstraintEEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISK_EE:
   84|    266|bool FieldVerifier::satisfied(const TEnvPtr& tenv, const ConstraintPtr& cst, Definitions* ds) const {
   85|    266|  HasField hf;
   86|    266|  if (dec(cst, &hf)) {
  ------------------
  |  Branch (86:7): [True: 266, False: 0]
  ------------------
   87|    692|    for (const auto& hfe : this->eliminators) {
  ------------------
  |  Branch (87:26): [True: 692, False: 71]
  ------------------
   88|    692|      try {
   89|    692|        if (hfe->satisfied(tenv, hf, ds)) {
  ------------------
  |  Branch (89:13): [True: 195, False: 497]
  ------------------
   90|    195|          return true;
   91|    195|        }
   92|    692|      } catch (std::exception&) { }
   93|    692|    }
   94|    266|  }
   95|     71|  return false;
   96|    266|}
_ZNK6hobbes13FieldVerifier11satisfiableERKSt10shared_ptrINS_4TEnvEERKS1_INS_10ConstraintEEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISK_EE:
   98|    232|bool FieldVerifier::satisfiable(const TEnvPtr& tenv, const ConstraintPtr& cst, Definitions* ds) const {
   99|    232|  HasField hf;
  100|    232|  if (dec(cst, &hf)) {
  ------------------
  |  Branch (100:7): [True: 232, False: 0]
  ------------------
  101|    232|    for (const auto& hfe : this->eliminators) {
  ------------------
  |  Branch (101:26): [True: 232, False: 0]
  ------------------
  102|    232|      try {
  103|    232|        if (hfe->satisfiable(tenv, hf, ds)) {
  ------------------
  |  Branch (103:13): [True: 232, False: 0]
  ------------------
  104|    232|          return true;
  105|    232|        }
  106|    232|      } catch (std::exception& ex) {
  107|      0|      }
  108|    232|    }
  109|    232|  }
  110|      0|  return false;
  111|    232|}
_ZNK6hobbes13FieldVerifier9unqualifyERKSt10shared_ptrINS_4TEnvEERKS1_INS_10ConstraintEERKS1_INS_4ExprEEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESB_ESaISM_EE:
  165|    195|ExprPtr FieldVerifier::unqualify(const TEnvPtr& tenv, const ConstraintPtr& cst, const ExprPtr& e, Definitions* ds) const {
  166|    195|  HasField hf;
  167|    195|  if (dec(cst, &hf)) {
  ------------------
  |  Branch (167:7): [True: 195, False: 0]
  ------------------
  168|    195|    for (const auto& hfe : this->eliminators) {
  ------------------
  |  Branch (168:26): [True: 195, False: 0]
  ------------------
  169|    195|      try {
  170|    195|        if (hfe->satisfied(tenv, hf, ds)) {
  ------------------
  |  Branch (170:13): [True: 195, False: 0]
  ------------------
  171|    195|          return hfe->unqualify(tenv, cst, switchOf(e, RewriteFnAccess(hf, *hfe, tenv, ds, cst)), ds);
  172|    195|        }
  173|    195|      } catch (std::exception& exn) {
  174|      0|      }
  175|    195|    }
  176|    195|  }
  177|      0|  throw annotated_error(*e, "Cannot unqualify constraint: " + show(cst));
  178|    195|}
_ZNK6hobbes13FieldVerifier6lookupERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  180|  1.99k|PolyTypePtr FieldVerifier::lookup(const std::string& vn) const {
  181|  1.99k|  if (vn == FIELD_VALUE_FN) {
  ------------------
  |  |   14|  1.99k|#define FIELD_VALUE_FN "fieldValue"
  ------------------
  |  Branch (181:7): [True: 0, False: 1.99k]
  ------------------
  182|      0|    return polytype(3, qualtype(list(HasField::constraint(HasField::Read, tgen(0), tgen(1), tgen(2))), functy(list(tgen(0)), tgen(2))));
  183|  1.99k|  } else {
  184|  1.99k|    return PolyTypePtr();
  185|  1.99k|  }
  186|  1.99k|}
_ZNK6hobbes13FieldVerifier8bindingsB5cxx11Ev:
  188|      1|SymSet FieldVerifier::bindings() const {
  189|      1|  SymSet r;
  190|      1|  r.insert(FIELD_VALUE_FN);
  ------------------
  |  |   14|      1|#define FIELD_VALUE_FN "fieldValue"
  ------------------
  191|      1|  return r;
  192|      1|}
_ZNK6hobbes13FieldVerifier12dependenciesERKSt10shared_ptrINS_10ConstraintEE:
  194|  4.71k|FunDeps FieldVerifier::dependencies(const ConstraintPtr& c) const {
  195|       |  // ordering determined by constraints map:
  196|       |  //    (ty(x->direction() == HasField::Read), x->recordType(), x->fieldName(), x->fieldType())
  197|  4.71k|  HasField hf;
  198|  4.71k|  if (dec(c, &hf)) {
  ------------------
  |  Branch (198:7): [True: 4.71k, False: 0]
  ------------------
  199|  4.71k|    if (hf.direction == HasField::Read) {
  ------------------
  |  Branch (199:9): [True: 4.28k, False: 421]
  ------------------
  200|       |      // we always read out in _one_ way
  201|       |      // (only writes can be overloaded)
  202|  4.28k|      FunDeps result;
  203|  4.28k|      result.push_back(FunDep(list(0, 1, 2), 3));
  204|  4.28k|      return result;
  205|  4.28k|    }
  206|  4.71k|  }
  207|    421|  return FunDeps();
  208|  4.71k|}
_ZN6hobbes15RewriteFnAccessC2ERKNS_8HasFieldERKNS_12HFEliminatorERKSt10shared_ptrINS_4TEnvEEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_INS_4ExprEEESaISM_EERKS7_INS_10ConstraintEE:
  123|    195|  RewriteFnAccess(const HasField& hf, const HFEliminator& hfe, const TEnvPtr& tenv, Definitions* ds, const ConstraintPtr& cst) : hfe(hfe), tenv(tenv), ds(ds), cst(cst) {
  124|    195|    if (const TString* s = is<TString>(hf.fieldName)) {
  ------------------
  |  Branch (124:24): [True: 195, False: 0]
  ------------------
  125|    195|      this->fieldName = s->value();
  126|    195|    } else if (const TLong* n = is<TLong>(hf.fieldName)) {
  ------------------
  |  Branch (126:29): [True: 0, False: 0]
  ------------------
  127|      0|      this->fieldName = ".f" + str::from(n->value());
  128|      0|    }
  129|    195|  }
_ZNK6hobbes15RewriteFnAccess4withEPKNS_3VarE:
  146|  7.07k|  ExprPtr with(const Var* v) const override {
  147|  7.07k|    if (hasConstraint(this->cst, v->type())) {
  ------------------
  |  Branch (147:9): [True: 200, False: 6.87k]
  ------------------
  148|    200|      if (v->value() == FIELD_VALUE_FN) {
  ------------------
  |  |   14|    200|#define FIELD_VALUE_FN "fieldValue"
  ------------------
  |  Branch (148:11): [True: 0, False: 200]
  ------------------
  149|      0|        std::string vn = freshName();
  150|       |        
  151|      0|        Func* fty = is<Func>(v->type()->monoType());
  152|      0|        MonoTypePtr recordType = fty->parameters()[0];
  153|      0|        ExprPtr p(new Proj(var(vn, recordType, v->la()), this->fieldName, v->la()));
  154|      0|        p->type(qualtype(list(this->cst), fty->result()));
  155|       |
  156|      0|        ExprPtr rv = fn(vn, p, v->la());
  157|      0|        rv->type(v->type());
  158|      0|        return this->hfe.unqualify(this->tenv, this->cst, rv, this->ds);
  159|      0|      }
  160|    200|    }
  161|  7.07k|    return wrapWithTy(v->type(), new Var(v->value(), v->la()));
  162|  7.07k|  }
_ZNK6hobbes15RewriteFnAccess4withEPKNS_3AppE:
  131|  2.52k|  ExprPtr with(const App* ap) const override {
  132|  2.52k|    if (ap->args().size() == 1) {
  ------------------
  |  Branch (132:9): [True: 851, False: 1.67k]
  ------------------
  133|    851|      if (hasConstraint(this->cst, ap->type())) {
  ------------------
  |  Branch (133:11): [True: 116, False: 735]
  ------------------
  134|    116|        if (const Var* f = is<Var>(stripAssumpHead(ap->fn()))) {
  ------------------
  |  Branch (134:24): [True: 116, False: 0]
  ------------------
  135|    116|          if (f->value() == FIELD_VALUE_FN && hasConstraint(this->cst, f->type())) {
  ------------------
  |  |   14|    232|#define FIELD_VALUE_FN "fieldValue"
  ------------------
  |  Branch (135:15): [True: 0, False: 116]
  |  Branch (135:47): [True: 0, False: 0]
  ------------------
  136|      0|            ExprPtr r(new Proj(switchOf(ap->args()[0], *this), this->fieldName, ap->la()));
  137|      0|            r->type(ap->type());
  138|      0|            return this->hfe.unqualify(this->tenv, this->cst, r, this->ds);
  139|      0|          }
  140|    116|        }
  141|    116|      }
  142|    851|    }
  143|  2.52k|    return wrapWithTy(ap->type(), new App(switchOf(ap->fn(), *this), switchOf(ap->args(), *this), ap->la()));
  144|  2.52k|  }

_ZNK6hobbes18HFLookupEliminator9satisfiedERKSt10shared_ptrINS_4TEnvEERKNS_8HasFieldEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISJ_EE:
   82|     71|bool HFLookupEliminator::satisfied(const TEnvPtr& tenv, const HasField& hf, Definitions* ds) const {
   83|     71|  auto rty = hf.recordType;
   84|     71|  auto fty = hf.fieldType;
   85|       |
   86|     71|  std::string fname;
   87|     71|  if (decFieldName(hf.fieldName, &fname)) {
  ------------------
  |  Branch (87:7): [True: 71, False: 0]
  ------------------
   88|     71|    MonoTypePtr efty = rewritesToLookup(tenv, rty, fname, fty, ds);
   89|     71|    return efty != MonoTypePtr() && isMonoSingular(efty) && *efty == *fty;
  ------------------
  |  Branch (89:12): [True: 0, False: 71]
  |  Branch (89:37): [True: 0, False: 0]
  |  Branch (89:61): [True: 0, False: 0]
  ------------------
   90|     71|  } else {
   91|      0|    return false;
   92|      0|  }
   93|     71|}
_ZNK6hobbes18HFLookupEliminator11satisfiableERKSt10shared_ptrINS_4TEnvEERKNS_8HasFieldEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISJ_EE:
   95|  5.09k|bool HFLookupEliminator::satisfiable(const TEnvPtr& tenv, const HasField& hf, Definitions* ds) const {
   96|  5.09k|  auto rty = hf.recordType;
   97|  5.09k|  auto fty = hf.fieldType;
   98|       |
   99|  5.09k|  std::string fname;
  100|  5.09k|  if (decFieldName(hf.fieldName, &fname)) {
  ------------------
  |  Branch (100:7): [True: 5.08k, False: 12]
  ------------------
  101|  5.08k|    return mightRewriteToLookup(tenv, rty, fname, fty, ds);
  102|  5.08k|  } else {
  103|     12|    return is<TVar>(hf.fieldName) != nullptr;
  104|     12|  }
  105|  5.09k|}
_ZN6hobbes18HFLookupEliminator6refineERKSt10shared_ptrINS_4TEnvEERKNS_8HasFieldEPNS_15MonoTypeUnifierEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISL_EE:
  107|  1.43k|bool HFLookupEliminator::refine(const TEnvPtr& tenv, const HasField& hf, MonoTypeUnifier* s, Definitions* ds) {
  108|  1.43k|  auto rty = hf.recordType;
  109|  1.43k|  auto fty = hf.fieldType;
  110|       |
  111|  1.43k|  std::string fname;
  112|  1.43k|  if (decFieldName(hf.fieldName, &fname)) {
  ------------------
  |  Branch (112:7): [True: 1.42k, False: 12]
  ------------------
  113|  1.42k|    MonoTypePtr efty = rewritesToLookup(tenv, rty, fname, fty, ds);
  114|       |
  115|  1.42k|    if (efty != MonoTypePtr() && isMonoSingular(efty)) {
  ------------------
  |  Branch (115:9): [True: 0, False: 1.42k]
  |  Branch (115:9): [True: 0, False: 1.42k]
  |  Branch (115:34): [True: 0, False: 0]
  ------------------
  116|      0|      size_t sz = s->size();
  117|      0|      mgu(efty, fty, s);
  118|      0|      return s->size() != sz;
  119|      0|    }
  120|  1.42k|  }
  121|  1.43k|  return false;
  122|  1.43k|}
lookup.C:_ZN6hobbesL12decFieldNameERKSt10shared_ptrINS_8MonoTypeEEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
   27|  6.60k|static bool decFieldName(const MonoTypePtr& fieldName, std::string* fn) {
   28|  6.60k|  if (const TString* x = is<TString>(fieldName)) {
  ------------------
  |  Branch (28:22): [True: 6.58k, False: 24]
  ------------------
   29|  6.58k|    *fn = x->value();
   30|  6.58k|    return true;
   31|  6.58k|  } else if (const TLong* n = is<TLong>(fieldName)) {
  ------------------
  |  Branch (31:27): [True: 0, False: 24]
  ------------------
   32|      0|    *fn = ".f" + str::from(n->value());
   33|      0|    return true;
   34|     24|  } else {
   35|     24|    return false;
   36|     24|  }
   37|  6.60k|}
lookup.C:_ZN6hobbesL16rewritesToLookupERKSt10shared_ptrINS_4TEnvEERKS0_INS_8MonoTypeEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_PSt6vectorISt4pairISE_S0_INS_4ExprEEESaISL_EE:
   51|  1.49k|static MonoTypePtr rewritesToLookup(const TEnvPtr& tenv, const MonoTypePtr& rty, const std::string& fieldName, const MonoTypePtr& fty, Definitions* ds) {
   52|  1.49k|  try {
   53|  1.49k|    MonoTypeUnifier s(tenv);
   54|  1.49k|    ConstraintPtr cst(new Constraint("Lookup", list(impliedType(fieldName), rty, fty)));
   55|       |
   56|  1.49k|    refine(tenv, cst, &s, ds);
   57|  1.49k|    if (satisfied(tenv, cst, ds)) {
  ------------------
  |  Branch (57:9): [True: 0, False: 1.49k]
  ------------------
   58|      0|      return s.substitute(fty);
   59|  1.49k|    } else {
   60|  1.49k|      return MonoTypePtr();
   61|  1.49k|    }
   62|  1.49k|  } catch (std::exception& ex) {
   63|      0|    return MonoTypePtr();
   64|      0|  }
   65|  1.49k|}
lookup.C:_ZN6hobbesL11impliedTypeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
   11|  6.58k|static MonoTypePtr impliedType(const std::string& fieldName) {
   12|  6.58k|  if (fieldName.size() > 2 && fieldName[0] == '.' && fieldName[1] == 'f') {
  ------------------
  |  Branch (12:7): [True: 6.48k, False: 100]
  |  Branch (12:31): [True: 6.01k, False: 465]
  |  Branch (12:54): [True: 6.01k, False: 0]
  ------------------
   13|  6.01k|    return primty("int");
   14|  6.01k|  } else {
   15|    565|    return arrayty(primty("char"));
   16|    565|  }
   17|  6.58k|}
lookup.C:_ZN6hobbesL20mightRewriteToLookupERKSt10shared_ptrINS_4TEnvEERKS0_INS_8MonoTypeEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_PSt6vectorISt4pairISE_S0_INS_4ExprEEESaISL_EE:
   39|  5.08k|static bool mightRewriteToLookup(const TEnvPtr& tenv, const MonoTypePtr& rty, const std::string& fieldName, const MonoTypePtr& fty, Definitions* ds) {
   40|  5.08k|  try {
   41|  5.08k|    MonoTypeUnifier s(tenv);
   42|  5.08k|    ConstraintPtr cst(new Constraint("Lookup", list(impliedType(fieldName), rty, fty)));
   43|       |
   44|  5.08k|    refine(tenv, cst, &s, ds);
   45|  5.08k|    return satisfiable(tenv, cst, ds);
   46|  5.08k|  } catch (std::exception& ex) {
   47|  1.38k|    return false;
   48|  1.38k|  }
   49|  5.08k|}

_ZNK6hobbes18HFRecordEliminator9satisfiedERKSt10shared_ptrINS_4TEnvEERKNS_8HasFieldEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISJ_EE:
   23|  1.92k|bool HFRecordEliminator::satisfied(const TEnvPtr& tenv, const HasField& hf, Definitions*) const {
   24|  1.92k|  const Record* r = is<Record>(hf.recordType);
   25|  1.92k|  if (r == nullptr) return false;
  ------------------
  |  Branch (25:7): [True: 71, False: 1.85k]
  ------------------
   26|       |
   27|  1.85k|  std::string fname;
   28|  1.85k|  if (!isFieldName(hf.fieldName, &fname)) return false;
  ------------------
  |  Branch (28:7): [True: 0, False: 1.85k]
  ------------------
   29|       |
   30|  1.85k|  if (const Record::Member* m = r->mmember(fname)) {
  ------------------
  |  Branch (30:29): [True: 1.85k, False: 0]
  ------------------
   31|  1.85k|    MonoTypePtr lhst = normIfOpaquePtr(m->type);
   32|       |
   33|       |    // a little hack to allow for assigning [char] into <std.string>
   34|  1.85k|    if (hf.direction == HasField::Write) {
  ------------------
  |  Branch (34:9): [True: 71, False: 1.78k]
  ------------------
   35|     71|      if (*lhst == *stdstrty && *hf.fieldType == *chararrty) {
  ------------------
  |  Branch (35:11): [True: 0, False: 71]
  |  Branch (35:33): [True: 0, False: 0]
  ------------------
   36|      0|        return true;
   37|      0|      }
   38|     71|    }
   39|  1.85k|    return unifiable(tenv, lhst, hf.fieldType);
   40|  1.85k|  } else {
   41|      0|    return false;
   42|      0|  }
   43|  1.85k|}
_ZNK6hobbes18HFRecordEliminator11satisfiableERKSt10shared_ptrINS_4TEnvEERKNS_8HasFieldEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISJ_EE:
   45|  5.44k|bool HFRecordEliminator::satisfiable(const TEnvPtr& tenv, const HasField& hf, Definitions* ds) const {
   46|  5.44k|  if (const Record* r = is<Record>(hf.recordType)) {
  ------------------
  |  Branch (46:21): [True: 2.57k, False: 2.87k]
  ------------------
   47|  2.57k|    std::string fname;
   48|  2.57k|    if (isFieldName(hf.fieldName, &fname)) {
  ------------------
  |  Branch (48:9): [True: 2.57k, False: 0]
  ------------------
   49|  2.57k|      const Record::Member* rm = r->mmember(fname);
   50|  2.57k|      return rm != nullptr && ((is<TVar>(hf.fieldType) != nullptr) || (is<TVar>(rm->type) != nullptr) || satisfied(tenv, hf, ds));
  ------------------
  |  Branch (50:14): [True: 2.57k, False: 0]
  |  Branch (50:32): [True: 1.10k, False: 1.46k]
  |  Branch (50:71): [True: 0, False: 1.46k]
  |  Branch (50:106): [True: 1.46k, False: 0]
  ------------------
   51|  2.57k|    } else {
   52|      0|      return is<TVar>(hf.fieldName) != nullptr;
   53|      0|    }
   54|  2.57k|  }
   55|  2.87k|  return is<TVar>(hf.recordType) != nullptr;
   56|  5.44k|}
_ZN6hobbes18HFRecordEliminator6refineERKSt10shared_ptrINS_4TEnvEERKNS_8HasFieldEPNS_15MonoTypeUnifierEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISL_EE:
   58|  5.19k|bool HFRecordEliminator::refine(const TEnvPtr&, const HasField& hf, MonoTypeUnifier* s, Definitions*) {
   59|  5.19k|  if (const Record* r = is<Record>(hf.recordType)) {
  ------------------
  |  Branch (59:21): [True: 2.43k, False: 2.76k]
  ------------------
   60|  2.43k|    std::string fname;
   61|  2.43k|    if (isFieldName(hf.fieldName, &fname)) {
  ------------------
  |  Branch (61:9): [True: 2.43k, False: 0]
  ------------------
   62|  2.43k|      if (const Record::Member* m = r->mmember(fname)) {
  ------------------
  |  Branch (62:33): [True: 2.43k, False: 0]
  ------------------
   63|  2.43k|        MonoTypePtr lhst = normIfOpaquePtr(m->type);
   64|       |
   65|  2.43k|        if (hf.direction == HasField::Read || !(*lhst == *stdstrty)) {
  ------------------
  |  Branch (65:13): [True: 2.37k, False: 56]
  |  Branch (65:47): [True: 56, False: 0]
  ------------------
   66|  2.43k|          size_t uc = s->size();
   67|  2.43k|          mgu(hf.fieldType, lhst, s);
   68|  2.43k|          return uc != s->size();
   69|  2.43k|        }
   70|  2.43k|      }
   71|  2.43k|    }
   72|  2.43k|  }
   73|  2.76k|  return false;
   74|  5.19k|}
_ZNK6hobbes18HFRecordEliminator9unqualifyERKSt10shared_ptrINS_4TEnvEERKS1_INS_10ConstraintEERKS1_INS_4ExprEEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESB_ESaISM_EE:
  102|    195|ExprPtr HFRecordEliminator::unqualify(const TEnvPtr&, const ConstraintPtr& cst, const ExprPtr& e, Definitions*) const {
  103|    195|  return switchOf(e, HFRecordUnqualify(cst));
  104|    195|}
record.C:_ZN6hobbesL11isFieldNameERKSt10shared_ptrINS_8MonoTypeEEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
   11|  6.86k|static bool isFieldName(const MonoTypePtr& fn, std::string* sfn) {
   12|  6.86k|  if (const TString* fns = is<TString>(fn)) {
  ------------------
  |  Branch (12:22): [True: 6.86k, False: 0]
  ------------------
   13|  6.86k|    *sfn = fns->value();
   14|  6.86k|    return true;
   15|  6.86k|  } else if (const TLong* tnn = is<TLong>(fn)) {
  ------------------
  |  Branch (15:27): [True: 0, False: 0]
  ------------------
   16|      0|    *sfn = ".f" + str::from(tnn->value());
   17|      0|    return true;
   18|      0|  } else {
   19|      0|    return false;
   20|      0|  }
   21|  6.86k|}
_ZN6hobbes17HFRecordUnqualifyC2ERKSt10shared_ptrINS_10ConstraintEE:
   79|    195|  HFRecordUnqualify(const ConstraintPtr& cst) : constraint(cst) {
   80|    195|  }
_ZNK6hobbes17HFRecordUnqualify4withEPKNS_6AssignE:
   88|    182|  ExprPtr with(const Assign* v) const override {
   89|       |    // hack to assign [char] into <std.string>
   90|    182|    if (hasConstraint(this->constraint, v->type())) {
  ------------------
  |  Branch (90:9): [True: 63, False: 119]
  ------------------
   91|     63|      if (*v->left()->type()->monoType() == *stdstrty && *v->right()->type()->monoType() == *chararrty) {
  ------------------
  |  Branch (91:11): [True: 0, False: 63]
  |  Branch (91:58): [True: 0, False: 0]
  ------------------
   92|      0|        static MonoTypePtr assignty = functy(list(stdstrty, chararrty), unitty);
   93|       |
   94|      0|        return fncall(var("stdstringAssign", assignty, v->left()->la()), list(switchOf(v->left(), *this), switchOf(v->right(), *this)), v->la());
   95|      0|      }
   96|     63|    }
   97|       |
   98|    182|    return wrapWithTy(v->type(), new Assign(switchOf(v->left(), *this), switchOf(v->right(), *this), v->la()));
   99|    182|  }
_ZNK6hobbes17HFRecordUnqualify10wrapWithTyERKSt10shared_ptrINS_8QualTypeEEPNS_4ExprE:
   82|  16.3k|  ExprPtr wrapWithTy(const QualTypePtr& qty, Expr* e) const override {
   83|  16.3k|    ExprPtr result(e);
   84|  16.3k|    result->type(removeConstraint(this->constraint, qty));
   85|  16.3k|    return result;
   86|  16.3k|  }

_ZN6hobbes21mightRewriteToSLookupERKSt10shared_ptrINS_4TEnvEERKS0_INS_8MonoTypeEES8_S8_PSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES0_INS_4ExprEEESaISJ_EE:
   27|  5.09k|bool mightRewriteToSLookup(const TEnvPtr& tenv, const MonoTypePtr& rty, const MonoTypePtr& fieldName, const MonoTypePtr& fty, Definitions* ds) {
   28|  5.09k|  if (is<TVar>(rty) != nullptr) {
  ------------------
  |  Branch (28:7): [True: 2.76k, False: 2.33k]
  ------------------
   29|  2.76k|    return true;
   30|  2.76k|  }
   31|       |
   32|  2.33k|  try {
   33|  2.33k|    MonoTypeUnifier s(tenv);
   34|  2.33k|    ConstraintPtr cst(new Constraint("SLookup", list(rty, impliedType(fieldName), fty)));
   35|       |
   36|  2.33k|    refine(tenv, cst, &s, ds);
   37|  2.33k|    return satisfiable(tenv, cst, ds);
   38|  2.33k|  } catch (std::exception& ex) {
   39|    777|    return false;
   40|    777|  }
   41|  2.33k|}
_ZN6hobbes17rewritesToSLookupERKSt10shared_ptrINS_4TEnvEERKS0_INS_8MonoTypeEES8_S8_PSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES0_INS_4ExprEEESaISJ_EE:
   43|  2.83k|MonoTypePtr rewritesToSLookup(const TEnvPtr& tenv, const MonoTypePtr& rty, const MonoTypePtr& fieldName, const MonoTypePtr& fty, Definitions* ds) {
   44|  2.83k|  try {
   45|  2.83k|    MonoTypeUnifier s(tenv);
   46|  2.83k|    ConstraintPtr cst(new Constraint("SLookup", list(rty, impliedType(fieldName), fty)));
   47|       |
   48|  2.83k|    refine(tenv, cst, &s, ds);
   49|  2.83k|    if (satisfied(tenv, cst, ds)) {
  ------------------
  |  Branch (49:9): [True: 0, False: 2.83k]
  ------------------
   50|      0|      return s.substitute(fty);
   51|  2.83k|    } else {
   52|  2.83k|      return MonoTypePtr();
   53|  2.83k|    }
   54|  2.83k|  } catch (std::exception& ex) {
   55|    614|    return MonoTypePtr();
   56|    614|  }
   57|  2.83k|}
_ZNK6hobbes19HFSLookupEliminator9satisfiedERKSt10shared_ptrINS_4TEnvEERKNS_8HasFieldEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISJ_EE:
   74|     71|bool HFSLookupEliminator::satisfied(const TEnvPtr& tenv, const HasField& hf, Definitions* ds) const {
   75|     71|  auto rty    = hf.recordType;
   76|     71|  auto fnamet = hf.fieldName;
   77|     71|  auto fty    = hf.fieldType;
   78|       |
   79|     71|  if ((is<TString>(fnamet) != nullptr) || (is<TLong>(fnamet) != nullptr)) {
  ------------------
  |  Branch (79:7): [True: 71, False: 0]
  |  Branch (79:43): [True: 0, False: 0]
  ------------------
   80|     71|    MonoTypePtr efty = rewritesToSLookup(tenv, rty, fnamet, fty, ds);
   81|     71|    return efty != MonoTypePtr() && isMonoSingular(efty) && *efty == *fty;
  ------------------
  |  Branch (81:12): [True: 0, False: 71]
  |  Branch (81:37): [True: 0, False: 0]
  |  Branch (81:61): [True: 0, False: 0]
  ------------------
   82|     71|  } else {
   83|      0|    return false;
   84|      0|  }
   85|     71|}
_ZNK6hobbes19HFSLookupEliminator11satisfiableERKSt10shared_ptrINS_4TEnvEERKNS_8HasFieldEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISJ_EE:
   87|  5.09k|bool HFSLookupEliminator::satisfiable(const TEnvPtr& tenv, const HasField& hf, Definitions* ds) const {
   88|  5.09k|  auto rty    = hf.recordType;
   89|  5.09k|  auto fnamet = hf.fieldName;
   90|  5.09k|  auto fty    = hf.fieldType;
   91|       |
   92|  5.09k|  return mightRewriteToSLookup(tenv, rty, fnamet, fty, ds);
   93|  5.09k|}
_ZN6hobbes19HFSLookupEliminator6refineERKSt10shared_ptrINS_4TEnvEERKNS_8HasFieldEPNS_15MonoTypeUnifierEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISL_EE:
   95|  2.76k|bool HFSLookupEliminator::refine(const TEnvPtr& tenv, const HasField& hf, MonoTypeUnifier* s, Definitions* ds) {
   96|  2.76k|  auto rty    = hf.recordType;
   97|  2.76k|  auto fnamet = hf.fieldName;
   98|  2.76k|  auto fty    = hf.fieldType;
   99|       |
  100|  2.76k|  if ((is<TString>(fnamet) != nullptr) || (is<TLong>(fnamet) != nullptr)) {
  ------------------
  |  Branch (100:7): [True: 2.76k, False: 2]
  |  Branch (100:43): [True: 0, False: 2]
  ------------------
  101|  2.76k|    MonoTypePtr efty = rewritesToSLookup(tenv, rty, fnamet, fty, ds);
  102|       |
  103|  2.76k|    if (efty != MonoTypePtr() && isMonoSingular(efty)) {
  ------------------
  |  Branch (103:9): [True: 0, False: 2.76k]
  |  Branch (103:9): [True: 0, False: 2.76k]
  |  Branch (103:34): [True: 0, False: 0]
  ------------------
  104|      0|      size_t sz = s->size();
  105|      0|      mgu(efty, fty, s);
  106|      0|      return s->size() != sz;
  107|      0|    }
  108|  2.76k|  }
  109|  2.76k|  return false;
  110|  2.76k|}
slookup.C:_ZN6hobbesL11impliedTypeERKSt10shared_ptrINS_8MonoTypeEE:
   19|  5.16k|static MonoTypePtr impliedType(const MonoTypePtr& fieldName) {
   20|  5.16k|  if (const TString* fn = is<TString>(fieldName)) {
  ------------------
  |  Branch (20:22): [True: 5.15k, False: 12]
  ------------------
   21|  5.15k|    return impliedType(fn->value());
   22|  5.15k|  } else {
   23|     12|    return fieldName;
   24|     12|  }
   25|  5.16k|}
slookup.C:_ZN6hobbesL11impliedTypeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
   11|  5.15k|static MonoTypePtr impliedType(const std::string& fieldName) {
   12|  5.15k|  if (fieldName.size() > 2 && fieldName[0] == '.' && fieldName[1] == 'f') {
  ------------------
  |  Branch (12:7): [True: 5.05k, False: 100]
  |  Branch (12:31): [True: 4.76k, False: 297]
  |  Branch (12:54): [True: 4.76k, False: 0]
  ------------------
   13|  4.76k|    return tlong(str::to<long>(fieldName.substr(2)));
   14|  4.76k|  } else {
   15|    397|    return MonoTypePtr(TString::make(fieldName));
   16|    397|  }
   17|  5.15k|}

_ZNK6hobbes22HFTEnvLookupEliminator9satisfiedERKSt10shared_ptrINS_4TEnvEERKNS_8HasFieldEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISJ_EE:
   62|     71|bool HFTEnvLookupEliminator::satisfied(const TEnvPtr& tenv, const HasField& hf, Definitions*) const {
   63|     71|  const auto& rty    = hf.recordType;
   64|     71|  const auto& fnamet = hf.fieldName;
   65|     71|  const auto& fty    = hf.fieldType;
   66|       |
   67|     71|  const Func* ffnty = is<Func>(fty);
   68|     71|  if (ffnty == nullptr) { return false; }
  ------------------
  |  Branch (68:7): [True: 71, False: 0]
  ------------------
   69|      0|  const TString* fname = is<TString>(fnamet);
   70|      0|  if (fname == nullptr) { return false; }
  ------------------
  |  Branch (70:7): [True: 0, False: 0]
  ------------------
   71|      0|  if (!isMonoSingular(rty) || !isMonoSingular(fty)) { return false; }
  ------------------
  |  Branch (71:7): [True: 0, False: 0]
  |  Branch (71:31): [True: 0, False: 0]
  ------------------
   72|      0|  if (!tenv->hasBinding(fname->value())) { return false; }
  ------------------
  |  Branch (72:7): [True: 0, False: 0]
  ------------------
   73|       |
   74|      0|  return unifiable(tenv, objViewToFlatView(rty, ffnty), tenv->lookup(fname->value())->instantiate()->monoType());
   75|      0|}
_ZNK6hobbes22HFTEnvLookupEliminator11satisfiableERKSt10shared_ptrINS_4TEnvEERKNS_8HasFieldEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISJ_EE:
   77|  5.09k|bool HFTEnvLookupEliminator::satisfiable(const TEnvPtr& tenv, const HasField& hf, Definitions*) const {
   78|  5.09k|  auto rty    = hf.recordType;
   79|  5.09k|  auto fnamet = hf.fieldName;
   80|  5.09k|  auto fty    = hf.fieldType;
   81|       |
   82|  5.09k|  if (const TString* fname = is<TString>(fnamet)) {
  ------------------
  |  Branch (82:22): [True: 5.08k, False: 12]
  ------------------
   83|  5.08k|    const Func* ffnty = is<Func>(fty);
   84|  5.08k|    if (ffnty == nullptr) {
  ------------------
  |  Branch (84:9): [True: 4.83k, False: 250]
  ------------------
   85|  4.83k|      return is<TVar>(fty) != nullptr;
   86|  4.83k|    }
   87|    250|    if (!tenv->hasBinding(fname->value())) {
  ------------------
  |  Branch (87:9): [True: 250, False: 0]
  ------------------
   88|    250|      return false;
   89|    250|    }
   90|      0|    return unifiable(tenv, objViewToFlatView(rty, ffnty), tenv->lookup(fname->value())->instantiate()->monoType());
   91|    250|  } else {
   92|     12|    return is<TVar>(fnamet) != nullptr;
   93|     12|  }
   94|  5.09k|}
_ZN6hobbes22HFTEnvLookupEliminator6refineERKSt10shared_ptrINS_4TEnvEERKNS_8HasFieldEPNS_15MonoTypeUnifierEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISL_EE:
   96|  2.72k|bool HFTEnvLookupEliminator::refine(const TEnvPtr& tenv, const HasField& hf, MonoTypeUnifier* s, Definitions*) {
   97|  2.72k|  auto rty    = hf.recordType;
   98|  2.72k|  auto fnamet = hf.fieldName;
   99|  2.72k|  auto fty    = hf.fieldType;
  100|       |
  101|       |  // short-circuit refinement -- no need to do anything if there's no information to add
  102|  2.72k|  if (is<Func>(fty) == nullptr) { return false; }
  ------------------
  |  Branch (102:7): [True: 2.72k, False: 0]
  ------------------
  103|       |
  104|      0|  auto invars = tvarNames(rty).size() + tvarNames(fty).size();
  105|      0|  if (invars == 0) { return false; }
  ------------------
  |  Branch (105:7): [True: 0, False: 0]
  ------------------
  106|       |
  107|      0|  if (const TString* fname = is<TString>(fnamet)) {
  ------------------
  |  Branch (107:22): [True: 0, False: 0]
  ------------------
  108|      0|    if (tenv->hasBinding(fname->value())) {
  ------------------
  |  Branch (108:9): [True: 0, False: 0]
  ------------------
  109|      0|      const Func* ufty = is<Func>(tenv->lookup(fname->value())->instantiate()->monoType());
  110|      0|      if ((ufty == nullptr) || ufty->parameters().empty()) return false;
  ------------------
  |  Branch (110:11): [True: 0, False: 0]
  |  Branch (110:11): [True: 0, False: 0]
  |  Branch (110:32): [True: 0, False: 0]
  ------------------
  111|       |
  112|      0|      MonoTypePtr uobj     = ufty->parameters()[0];
  113|      0|      MonoTypePtr ufieldty = functy(drop(ufty->parameters(), 1), ufty->result());
  114|       |
  115|      0|      if (unifiable(tenv, rty, uobj) && unifiable(tenv, fty, ufieldty)) {
  ------------------
  |  Branch (115:11): [True: 0, False: 0]
  |  Branch (115:41): [True: 0, False: 0]
  ------------------
  116|      0|        mgu(rty, uobj,     s);
  117|      0|        mgu(fty, ufieldty, s);
  118|      0|        return (tvarNames(substitute(s, rty)).size() + tvarNames(substitute(s, fty)).size()) < invars;
  119|      0|      }
  120|      0|    }
  121|      0|  }
  122|      0|  return false;
  123|      0|}

_ZN6hobbes13NotEqualTypes14constraintNameB5cxx11Ev:
   20|     49|std::string NotEqualTypes::constraintName() {
   21|     49|  return "!equals";
   22|     49|}
_ZN6hobbes13NotEqualTypes6refineERKSt10shared_ptrINS_4TEnvEERKS1_INS_10ConstraintEEPNS_15MonoTypeUnifierEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISM_EE:
   24|     68|bool NotEqualTypes::refine(const TEnvPtr&, const ConstraintPtr&, MonoTypeUnifier*, Definitions*) {
   25|     68|  return false;
   26|     68|}
_ZNK6hobbes13NotEqualTypes9satisfiedERKSt10shared_ptrINS_4TEnvEERKS1_INS_10ConstraintEEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISK_EE:
   28|     27|bool NotEqualTypes::satisfied(const TEnvPtr&, const ConstraintPtr& cst, Definitions*) const {
   29|     27|  MonoTypePtr lhs, rhs;
   30|     27|  return dec(cst, &lhs, &rhs) && !hasFreeVariables(lhs) && !hasFreeVariables(rhs) && !(*lhs == *rhs);
  ------------------
  |  Branch (30:10): [True: 27, False: 0]
  |  Branch (30:34): [True: 27, False: 0]
  |  Branch (30:60): [True: 27, False: 0]
  |  Branch (30:86): [True: 27, False: 0]
  ------------------
   31|     27|}
_ZNK6hobbes13NotEqualTypes11satisfiableERKSt10shared_ptrINS_4TEnvEERKS1_INS_10ConstraintEEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISK_EE:
   33|      5|bool NotEqualTypes::satisfiable(const TEnvPtr&, const ConstraintPtr& cst, Definitions*) const {
   34|      5|  MonoTypePtr lhs, rhs;
   35|      5|  return dec(cst, &lhs, &rhs) && (hasFreeVariables(lhs) || hasFreeVariables(rhs) || !(*lhs == *rhs));
  ------------------
  |  Branch (35:10): [True: 5, False: 0]
  |  Branch (35:35): [True: 1, False: 4]
  |  Branch (35:60): [True: 0, False: 4]
  |  Branch (35:85): [True: 4, False: 0]
  ------------------
   36|      5|}
_ZNK6hobbes13NotEqualTypes9unqualifyERKSt10shared_ptrINS_4TEnvEERKS1_INS_10ConstraintEERKS1_INS_4ExprEEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESB_ESaISM_EE:
   53|     33|ExprPtr NotEqualTypes::unqualify(const TEnvPtr&, const ConstraintPtr& cst, const ExprPtr& e, Definitions*) const {
   54|     33|  return switchOf(e, StripCst(cst));
   55|     33|}
_ZNK6hobbes13NotEqualTypes6lookupERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
   57|  4.46k|PolyTypePtr NotEqualTypes::lookup(const std::string&) const {
   58|  4.46k|  return PolyTypePtr(); // this won't be necessary
   59|  4.46k|}
_ZNK6hobbes13NotEqualTypes8bindingsB5cxx11Ev:
   61|      1|SymSet NotEqualTypes::bindings() const {
   62|      1|  return SymSet(); // no overloaded symbols are defined here
   63|      1|}
_ZNK6hobbes13NotEqualTypes12dependenciesERKSt10shared_ptrINS_10ConstraintEE:
   65|    284|FunDeps NotEqualTypes::dependencies(const ConstraintPtr&) const {
   66|    284|  return FunDeps();
   67|    284|}
not.C:_ZN6hobbesL3decERKSt10shared_ptrINS_10ConstraintEEPS0_INS_8MonoTypeEES7_:
    8|     32|static bool dec(const ConstraintPtr& c, MonoTypePtr* lhs, MonoTypePtr* rhs) {
    9|     32|  if (c->name() == NotEqualTypes::constraintName() && c->arguments().size() == 2) {
  ------------------
  |  Branch (9:7): [True: 32, False: 0]
  |  Branch (9:7): [True: 32, False: 0]
  |  Branch (9:55): [True: 32, False: 0]
  ------------------
   10|     32|    *lhs = c->arguments()[0];
   11|     32|    *rhs = c->arguments()[1];
   12|     32|    return true;
   13|     32|  }
   14|      0|  return false;
   15|     32|}

_ZN6hobbes21isSafeExistentialTypeEPKNS_6ExistsE:
   10|     89|bool isSafeExistentialType(const Exists* e) {
   11|     89|  if (const Record* r = is<Record>(e->absType())) {
  ------------------
  |  Branch (11:21): [True: 89, False: 0]
  ------------------
   12|     89|    const Record::Members& ms = r->members();
   13|     89|    if (ms.size() != 2) return false;
  ------------------
  |  Branch (13:9): [True: 0, False: 89]
  ------------------
   14|       |
   15|     89|    if (const TVar* ev = is<TVar>(ms[1].type)) {
  ------------------
  |  Branch (15:21): [True: 89, False: 0]
  ------------------
   16|     89|      if (ev->name() != e->absTypeName()) {
  ------------------
  |  Branch (16:11): [True: 0, False: 89]
  ------------------
   17|      0|        return false;
   18|      0|      }
   19|     89|    } else {
   20|      0|      return false;
   21|      0|    }
   22|       |
   23|     89|    if (const Func* f = is<Func>(ms[0].type)) {
  ------------------
  |  Branch (23:21): [True: 89, False: 0]
  ------------------
   24|     89|      if (const TVar* rt = is<TVar>(f->result())) {
  ------------------
  |  Branch (24:23): [True: 28, False: 61]
  ------------------
   25|     28|        if (rt->name() == e->absTypeName()) {
  ------------------
  |  Branch (25:13): [True: 0, False: 28]
  ------------------
   26|      0|          return false;
   27|      0|        }
   28|     28|      }
   29|     89|    } else {
   30|      0|      return false;
   31|      0|    }
   32|       |
   33|     89|    return true;
   34|     89|  } else {
   35|      0|    return false;
   36|      0|  }
   37|     89|}
_ZN6hobbes12Existentials14constraintNameB5cxx11Ev:
   64|    639|std::string Existentials::constraintName() {
   65|    639|  return "packsto";
   66|    639|}
_ZN6hobbes12Existentials6refineERKSt10shared_ptrINS_4TEnvEERKS1_INS_10ConstraintEEPNS_15MonoTypeUnifierEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISM_EE:
   68|    519|bool Existentials::refine(const TEnvPtr& tenv, const ConstraintPtr& cst, MonoTypeUnifier* u, Definitions*) {
   69|    519|  PacksTo pt;
   70|    519|  if (dec(cst, &pt)) {
  ------------------
  |  Branch (70:7): [True: 519, False: 0]
  ------------------
   71|    519|    if (const Exists* e = is<Exists>(pt.abstractType)) {
  ------------------
  |  Branch (71:23): [True: 496, False: 23]
  ------------------
   72|    496|      MonoTypeUnifier lu(tenv);
   73|    496|      scoped_unification_suppression slus(&lu, e->absTypeName());
   74|    496|      mgu(u->substitute(pt.underlyingType), e->absType(), &lu);
   75|       |
   76|    496|      MonoTypeSubst lus = lu.substitution();
   77|    496|      for (MonoTypeSubst::const_iterator si = lus.begin(); si != lus.end(); ++si) {
  ------------------
  |  Branch (77:60): [True: 0, False: 496]
  ------------------
   78|      0|        u->bind(si->first, si->second);
   79|      0|      }
   80|    496|      pt.abstractType = substitute(lus, pt.abstractType);
   81|    496|      upd(cst, pt);
   82|    496|      return !lus.empty();
   83|    496|    }
   84|    519|  }
   85|     23|  return false;
   86|    519|}
_ZNK6hobbes12Existentials9satisfiedERKSt10shared_ptrINS_4TEnvEERKS1_INS_10ConstraintEEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISK_EE:
   88|     46|bool Existentials::satisfied(const TEnvPtr& tenv, const ConstraintPtr& cst, Definitions*) const {
   89|     46|  PacksTo pt;
   90|     46|  if (dec(cst, &pt)) {
  ------------------
  |  Branch (90:7): [True: 46, False: 0]
  ------------------
   91|     46|    if (const Exists* e = is<Exists>(pt.abstractType)) {
  ------------------
  |  Branch (91:23): [True: 46, False: 0]
  ------------------
   92|     46|      if (!isSafeExistentialType(e)) {
  ------------------
  |  Branch (92:11): [True: 0, False: 46]
  ------------------
   93|      0|        return false;
   94|      0|      }
   95|       |
   96|     46|      if (!unifiable(tenv, pt.underlyingType, e->absType())) {
  ------------------
  |  Branch (96:11): [True: 8, False: 38]
  ------------------
   97|      8|        return false;
   98|      8|      }
   99|       |
  100|     38|      NameSet utns = tvarNames(pt.underlyingType);
  101|     38|      NameSet atns = tvarNames(e->absType());
  102|       |
  103|     38|      return utns.empty() && atns.size() == 1 && (e->absTypeName() == *atns.begin());
  ------------------
  |  Branch (103:14): [True: 8, False: 30]
  |  Branch (103:30): [True: 8, False: 0]
  |  Branch (103:50): [True: 8, False: 0]
  ------------------
  104|     46|    } else {
  105|      0|      return *pt.underlyingType == *pt.abstractType;
  106|      0|    }
  107|     46|  } else {
  108|      0|    return false;
  109|      0|  }
  110|     46|}
_ZNK6hobbes12Existentials11satisfiableERKSt10shared_ptrINS_4TEnvEERKS1_INS_10ConstraintEEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISK_EE:
  112|     43|bool Existentials::satisfiable(const TEnvPtr&, const ConstraintPtr& cst, Definitions*) const {
  113|     43|  PacksTo pt;
  114|     43|  if (dec(cst, &pt)) {
  ------------------
  |  Branch (114:7): [True: 43, False: 0]
  ------------------
  115|     43|    if (is<TVar>(pt.abstractType) != nullptr) {
  ------------------
  |  Branch (115:9): [True: 0, False: 43]
  ------------------
  116|      0|      return true;
  117|     43|    } else if (const Exists* e = is<Exists>(pt.abstractType)) {
  ------------------
  |  Branch (117:30): [True: 43, False: 0]
  ------------------
  118|     43|      if (!isSafeExistentialType(e)) {
  ------------------
  |  Branch (118:11): [True: 0, False: 43]
  ------------------
  119|      0|        return false;
  120|     43|      } else {
  121|     43|        return true; // too liberal?  changed from 'unifiable' to work with streams
  122|     43|      }
  123|     43|    } else {
  124|      0|      return true;
  125|      0|    }
  126|     43|  } else {
  127|      0|    return false;
  128|      0|  }
  129|     43|}
_ZNK6hobbes12Existentials9unqualifyERKSt10shared_ptrINS_4TEnvEERKS1_INS_10ConstraintEERKS1_INS_4ExprEEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESB_ESaISM_EE:
  166|      7|ExprPtr Existentials::unqualify(const TEnvPtr&, const ConstraintPtr& cst, const ExprPtr& e, Definitions*) const {
  167|       |  // if we're eliminating a constraint that indicates no information is hidden, then get rid of the superfluous packs
  168|       |  // else, just remove the constraint from terms and let final compilation determine how to do the packing
  169|      7|  PacksTo pt;
  170|      7|  if (dec(cst, &pt)) {
  ------------------
  |  Branch (170:7): [True: 7, False: 0]
  ------------------
  171|      7|    if (is<Exists>(pt.abstractType) != nullptr) {
  ------------------
  |  Branch (171:9): [True: 7, False: 0]
  ------------------
  172|      7|      return switchOf(e, UnqualifySafePackF(cst));
  173|      7|    } else {
  174|      0|      return switchOf(e, StripTransparentPackF(cst));
  175|      0|    }
  176|      7|  } else {
  177|       |    // ???
  178|      0|    throw annotated_error(*e, "Internal error in existential unqualification, unexpected constraint: " + show(cst));
  179|      0|  }
  180|      7|}
_ZNK6hobbes12Existentials6lookupERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  182|  1.54k|PolyTypePtr Existentials::lookup(const std::string&) const {
  183|  1.54k|  return PolyTypePtr(); // this won't be necessary
  184|  1.54k|}
_ZNK6hobbes12Existentials8bindingsB5cxx11Ev:
  186|      1|SymSet Existentials::bindings() const {
  187|      1|  return SymSet(); // no overloaded symbols are defined here
  188|      1|}
_ZNK6hobbes12Existentials12dependenciesERKSt10shared_ptrINS_10ConstraintEE:
  190|    401|FunDeps Existentials::dependencies(const ConstraintPtr&) const {
  191|    401|  return FunDeps();
  192|    401|}
packsto.C:_ZN6hobbesL3decERKSt10shared_ptrINS_10ConstraintEEPNS_7PacksToE:
   44|    615|static bool dec(const ConstraintPtr& c, PacksTo* pt) {
   45|    615|  if (c->name() == Existentials::constraintName() && c->arguments().size() == 2) {
  ------------------
  |  Branch (45:7): [True: 615, False: 0]
  |  Branch (45:7): [True: 615, False: 0]
  |  Branch (45:54): [True: 615, False: 0]
  ------------------
   46|    615|    pt->underlyingType = c->arguments()[0];
   47|    615|    pt->abstractType   = c->arguments()[1];
   48|    615|    return true;
   49|    615|  }
   50|       |  
   51|      0|  return false;
   52|    615|}
packsto.C:_ZN6hobbesL3updERKSt10shared_ptrINS_10ConstraintEERKNS_7PacksToE:
   53|    496|static void upd(const ConstraintPtr& c, const PacksTo& pt) {
   54|    496|  auto& args = const_cast<MonoTypes&>(c->arguments());
   55|    496|  if (args.size() == 2) {
  ------------------
  |  Branch (55:7): [True: 496, False: 0]
  ------------------
   56|    496|    args[0] = pt.underlyingType;
   57|    496|    args[1] = pt.abstractType;
   58|    496|  }
   59|    496|}
_ZN6hobbes18UnqualifySafePackFC2ERKSt10shared_ptrINS_10ConstraintEE:
  136|      7|  UnqualifySafePackF(const ConstraintPtr& cst) : constraint(cst) {
  137|      7|  }
_ZNK6hobbes18UnqualifySafePackF10wrapWithTyERKSt10shared_ptrINS_8QualTypeEEPNS_4ExprE:
  139|    571|  ExprPtr wrapWithTy(const QualTypePtr& qty, Expr* e) const override {
  140|    571|    ExprPtr result(e);
  141|    571|    result->type(removeConstraint(this->constraint, qty));
  142|    571|    return result;
  143|    571|  }

_ZN6hobbes11FixIsoRecur14constraintNameB5cxx11Ev:
   26|    413|std::string FixIsoRecur::constraintName() {
   27|    413|  return "IsoRecur";
   28|    413|}
_ZN6hobbes11FixIsoRecur6refineERKSt10shared_ptrINS_4TEnvEERKS1_INS_10ConstraintEEPNS_15MonoTypeUnifierEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISM_EE:
   31|    295|bool FixIsoRecur::refine(const TEnvPtr&, const ConstraintPtr& cst, MonoTypeUnifier* u, Definitions*) {
   32|    295|  size_t uc = u->size();
   33|    295|  IsoRecur ir;
   34|    295|  if (dec(cst, &ir)) {
  ------------------
  |  Branch (34:7): [True: 295, False: 0]
  ------------------
   35|    295|    if (is<Recursive>(ir.rolled) != nullptr) {
  ------------------
  |  Branch (35:9): [True: 122, False: 173]
  ------------------
   36|    122|      mgu(unroll(ir.rolled), ir.unrolled, u);
   37|    122|    }
   38|    295|  }
   39|    295|  return uc != u->size();
   40|    295|}
_ZNK6hobbes11FixIsoRecur9satisfiedERKSt10shared_ptrINS_4TEnvEERKS1_INS_10ConstraintEEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISK_EE:
   42|     29|bool FixIsoRecur::satisfied(const TEnvPtr&, const ConstraintPtr& cst, Definitions*) const {
   43|     29|  IsoRecur ir;
   44|     29|  if (dec(cst, &ir)) {
  ------------------
  |  Branch (44:7): [True: 29, False: 0]
  ------------------
   45|     29|    if (is<Recursive>(ir.rolled) != nullptr) {
  ------------------
  |  Branch (45:9): [True: 23, False: 6]
  ------------------
   46|       |      // make sure that the recursive type unrolls to the unrolled type
   47|     23|      return (*unroll(ir.rolled) == *ir.unrolled);
   48|     23|    }
   49|     29|  }
   50|      6|  return false;
   51|     29|}
_ZNK6hobbes11FixIsoRecur11satisfiableERKSt10shared_ptrINS_4TEnvEERKS1_INS_10ConstraintEEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISK_EE:
   53|     27|bool FixIsoRecur::satisfiable(const TEnvPtr& tenv, const ConstraintPtr& cst, Definitions*) const {
   54|     27|  IsoRecur ir;
   55|     27|  if (dec(cst, &ir)) {
  ------------------
  |  Branch (55:7): [True: 27, False: 0]
  ------------------
   56|     27|    if (is<TVar>(ir.rolled) != nullptr) {
  ------------------
  |  Branch (56:9): [True: 7, False: 20]
  ------------------
   57|      7|      return true;
   58|     20|    } else if (is<Recursive>(ir.rolled) != nullptr) {
  ------------------
  |  Branch (58:16): [True: 20, False: 0]
  ------------------
   59|     20|      if (is<TVar>(ir.unrolled) != nullptr) {
  ------------------
  |  Branch (59:11): [True: 0, False: 20]
  ------------------
   60|      0|        return true;
   61|     20|      } else {
   62|     20|        return unifiable(tenv, unroll(ir.rolled), ir.unrolled);
   63|     20|      }
   64|     20|    } else {
   65|      0|      return false;
   66|      0|    }
   67|     27|  } else {
   68|      0|    return false;
   69|      0|  }
   70|     27|}
_ZNK6hobbes11FixIsoRecur9unqualifyERKSt10shared_ptrINS_4TEnvEERKS1_INS_10ConstraintEERKS1_INS_4ExprEEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESB_ESaISM_EE:
   98|     23|ExprPtr FixIsoRecur::unqualify(const TEnvPtr&, const ConstraintPtr& cst, const ExprPtr& e, Definitions*) const {
   99|     23|  return switchOf(e, IsoRecUnqualify(cst));
  100|     23|}
_ZNK6hobbes11FixIsoRecur6lookupERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  102|  1.99k|PolyTypePtr FixIsoRecur::lookup(const std::string& vn) const {
  103|  1.99k|  if (vn == RECTY_ROLL) {
  ------------------
  |  |   23|  1.99k|#define RECTY_ROLL   "roll"
  ------------------
  |  Branch (103:7): [True: 12, False: 1.98k]
  ------------------
  104|     12|    return polytype(2, qualtype(list(std::make_shared<Constraint>(FixIsoRecur::constraintName(), list(tgen(0), tgen(1)))), functy(list(tgen(1)), tgen(0))));
  105|  1.98k|  } else if (vn == RECTY_UNROLL) {
  ------------------
  |  |   24|  1.98k|#define RECTY_UNROLL "unroll"
  ------------------
  |  Branch (105:14): [True: 46, False: 1.93k]
  ------------------
  106|     46|    return polytype(2, qualtype(list(std::make_shared<Constraint>(FixIsoRecur::constraintName(), list(tgen(0), tgen(1)))), functy(list(tgen(0)), tgen(1))));
  107|  1.93k|  } else {
  108|  1.93k|    return PolyTypePtr();
  109|  1.93k|  }
  110|  1.99k|}
_ZNK6hobbes11FixIsoRecur8bindingsB5cxx11Ev:
  112|      1|SymSet FixIsoRecur::bindings() const {
  113|      1|  SymSet r;
  114|      1|  r.insert(RECTY_ROLL);
  ------------------
  |  |   23|      1|#define RECTY_ROLL   "roll"
  ------------------
  115|      1|  r.insert(RECTY_UNROLL);
  ------------------
  |  |   24|      1|#define RECTY_UNROLL "unroll"
  ------------------
  116|      1|  return r;
  117|      1|}
_ZNK6hobbes11FixIsoRecur12dependenciesERKSt10shared_ptrINS_10ConstraintEE:
  119|    264|FunDeps FixIsoRecur::dependencies(const ConstraintPtr&) const {
  120|    264|  FunDeps result;
  121|    264|  result.push_back(FunDep(list(0), 1));
  122|    264|  result.push_back(FunDep(list(1), 0));
  123|    264|  return result;
  124|    264|}
recty.C:_ZN6hobbesL3decERKSt10shared_ptrINS_10ConstraintEEPNS_8IsoRecurE:
   14|    351|static bool dec(const ConstraintPtr& c, IsoRecur* ir) {
   15|    351|  if (c->name() == FixIsoRecur::constraintName() && c->arguments().size() == 2) {
  ------------------
  |  Branch (15:7): [True: 351, False: 0]
  |  Branch (15:7): [True: 351, False: 0]
  |  Branch (15:53): [True: 351, False: 0]
  ------------------
   16|    351|    ir->rolled   = c->arguments()[0];
   17|    351|    ir->unrolled = c->arguments()[1];
   18|    351|    return true;
   19|    351|  }
   20|      0|  return false;
   21|    351|}
_ZN6hobbes15IsoRecUnqualifyC2ERKSt10shared_ptrINS_10ConstraintEE:
   78|     23|  IsoRecUnqualify(const ConstraintPtr& constraint) : constraint(constraint) {
   79|     23|  }
_ZNK6hobbes15IsoRecUnqualify4withEPKNS_3VarE:
   85|    371|  ExprPtr with(const Var* v) const override {
   86|    371|    if (hasConstraint(this->constraint, v->type())) {
  ------------------
  |  Branch (86:9): [True: 33, False: 338]
  ------------------
   87|       |      // replace safe functions with 'unsafe' ones
   88|     33|      if (v->value() == RECTY_ROLL) {
  ------------------
  |  |   23|     33|#define RECTY_ROLL   "roll"
  ------------------
  |  Branch (88:11): [True: 6, False: 27]
  ------------------
   89|      6|        return assume(wrapWithTy(v->type(), new Var(".cast", v->la())), withTy(v->type()), v->la());
   90|     27|      } else if (v->value() == RECTY_UNROLL) {
  ------------------
  |  |   24|     27|#define RECTY_UNROLL "unroll"
  ------------------
  |  Branch (90:18): [True: 17, False: 10]
  ------------------
   91|     17|        return assume(wrapWithTy(v->type(), new Var(".cast", v->la())), withTy(v->type()), v->la());
   92|     17|      }
   93|     33|    }
   94|    348|    return wrapWithTy(v->type(), v->clone());
   95|    371|  }
_ZNK6hobbes15IsoRecUnqualify6withTyERKSt10shared_ptrINS_8QualTypeEE:
   81|    949|  QualTypePtr withTy(const QualTypePtr& qt) const override {
   82|    949|    return removeConstraint(this->constraint, qt);
   83|    949|  }

_ZN6hobbes7SizeOfP14constraintNameB5cxx11Ev:
   11|      1|std::string SizeOfP::constraintName() {
   12|      1|  return "SizeOf";
   13|      1|}
_ZNK6hobbes7SizeOfP6lookupERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
   64|  1.71k|PolyTypePtr SizeOfP::lookup(const std::string& vn) const {
   65|  1.71k|  if (vn == REF_SIZEOF) {
  ------------------
  |  |    9|  1.71k|#define REF_SIZEOF "sizeOf"
  ------------------
  |  Branch (65:7): [True: 0, False: 1.71k]
  ------------------
   66|      0|    return polytype(2, qualtype(list(std::make_shared<Constraint>(SizeOfP::constraintName(), list(tgen(0), tgen(1)))), primty("long")));
   67|  1.71k|  } else {
   68|  1.71k|    return PolyTypePtr();
   69|  1.71k|  }
   70|  1.71k|}
_ZNK6hobbes7SizeOfP8bindingsB5cxx11Ev:
   72|      1|SymSet SizeOfP::bindings() const {
   73|      1|  SymSet r;
   74|      1|  r.insert(REF_SIZEOF);
  ------------------
  |  |    9|      1|#define REF_SIZEOF "sizeOf"
  ------------------
   75|      1|  return r;
   76|      1|}

_ZN6hobbes17initStrPredicatesERKSt10shared_ptrINS_4TEnvEE:
  262|      1|void initStrPredicates(const TEnvPtr& tenv) {
  263|      1|  tenv->bind(SplitP::constraintName(), UnqualifierPtr(new SplitP()));
  264|      1|  tenv->bind(LsP::constraintName(),    UnqualifierPtr(new LsP()));
  265|      1|}
_ZN6hobbes6SplitP14constraintNameB5cxx11Ev:
   14|      1|  static std::string constraintName() { return "Split"; }
_ZNK6hobbes6SplitP6lookupERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
   95|  1.71k|  PolyTypePtr lookup(const std::string&) const override {
   96|  1.71k|    return PolyTypePtr();
   97|  1.71k|  }
_ZNK6hobbes6SplitP8bindingsB5cxx11Ev:
   99|      1|  SymSet bindings() const override {
  100|      1|    return SymSet();
  101|      1|  }
_ZN6hobbes3LsP14constraintNameB5cxx11Ev:
  159|      1|  static std::string constraintName() { return "Ls"; }
_ZNK6hobbes3LsP6lookupERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  244|  1.93k|  PolyTypePtr lookup(const std::string&) const override {
  245|  1.93k|    return PolyTypePtr();
  246|  1.93k|  }
_ZNK6hobbes3LsP8bindingsB5cxx11Ev:
  248|      1|  SymSet bindings() const override {
  249|      1|    return SymSet();
  250|      1|  }

_ZN6hobbes18SubtypeUnqualifierC2Ev:
   19|      1|SubtypeUnqualifier::SubtypeUnqualifier() = default;
_ZN6hobbes18SubtypeUnqualifier14constraintNameB5cxx11Ev:
   21|      1|std::string SubtypeUnqualifier::constraintName() {
   22|      1|  return "Subtype";
   23|      1|}
_ZN6hobbes18SubtypeUnqualifier13addEliminatorERKSt10shared_ptrINS_17SubtypeEliminatorEE:
   25|      1|void SubtypeUnqualifier::addEliminator(const std::shared_ptr<SubtypeEliminator>& e) {
   26|      1|  this->eliminators.push_back(e);
   27|      1|}
_ZNK6hobbes18SubtypeUnqualifier6lookupERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
   76|  1.60k|PolyTypePtr SubtypeUnqualifier::lookup(const std::string& vn) const {
   77|  1.60k|  for (const auto &eliminator : this->eliminators) {
  ------------------
  |  Branch (77:31): [True: 1.60k, False: 1.60k]
  ------------------
   78|  1.60k|    PolyTypePtr r = eliminator->lookup(vn);
   79|  1.60k|    if (r) {
  ------------------
  |  Branch (79:9): [True: 0, False: 1.60k]
  ------------------
   80|      0|      return r;
   81|      0|    }
   82|  1.60k|  }
   83|  1.60k|  return PolyTypePtr();
   84|  1.60k|}
_ZNK6hobbes18SubtypeUnqualifier8bindingsB5cxx11Ev:
   86|      1|SymSet SubtypeUnqualifier::bindings() const {
   87|      1|  SymSet r;
   88|      1|  for (const auto &eliminator : this->eliminators) {
  ------------------
  |  Branch (88:31): [True: 1, False: 1]
  ------------------
   89|      1|    SymSet x = eliminator->bindings();
   90|      1|    r.insert(x.begin(), x.end());
   91|      1|  }
   92|      1|  return r;
   93|      1|}

_ZN6hobbes4Objs3addEPKSt9type_info:
   16|     43|bool Objs::add(const std::type_info*) {
   17|     43|  return false;
   18|     43|}
_ZN6hobbes4Objs3addERKSt9type_info:
  128|     43|bool Objs::add(const std::type_info& ti) {
  129|     43|  return add(&ti);
  130|     43|}
_ZNK6hobbes4Objs9isObjNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  132|     28|bool Objs::isObjName(const std::string& tn) const {
  133|     28|  return this->classDefs.find(tn) != this->classDefs.end();
  134|     28|}
_ZNK6hobbes4Objs9isObjTypeERKSt10shared_ptrINS_8MonoTypeEE:
  136|    198|bool Objs::isObjType(const MonoTypePtr& mt) const {
  137|    198|  if (auto* op = is<OpaquePtr>(mt)) {
  ------------------
  |  Branch (137:13): [True: 28, False: 170]
  ------------------
  138|     28|    return isObjName(op->name());
  139|    170|  } else {
  140|    170|    return false;
  141|    170|  }
  142|    198|}
_ZNK6hobbes4Objs10generalizeERKSt10shared_ptrINS_8MonoTypeEE:
  183|    124|PolyTypePtr Objs::generalize(const MonoTypePtr& mt) const {
  184|       |  // for now, just generalize function types
  185|    124|  Func* fty = is<Func>(mt);
  186|    124|  if (fty == nullptr) return polytype(mt);
  ------------------
  |  Branch (186:7): [True: 0, False: 124]
  ------------------
  187|       |
  188|    124|  const MonoTypes&   fatys = fty->parameters();
  189|    124|  const MonoTypePtr& nfrty = fty->result();
  190|    124|  MonoTypes          nfatys;
  191|    124|  int                tvs = 0;
  192|    124|  Constraints        cs;
  193|       |
  194|    198|  for (const auto &faty : fatys) {
  ------------------
  |  Branch (194:25): [True: 198, False: 124]
  ------------------
  195|    198|    if (isObjType(faty)) {
  ------------------
  |  Branch (195:9): [True: 0, False: 198]
  ------------------
  196|      0|      MonoTypePtr tgv(TGen::make(tvs));
  197|      0|      nfatys.push_back(tgv);
  198|      0|      cs.push_back(std::make_shared<Constraint>(SubtypeUnqualifier::constraintName(), list(tgv, faty)));
  199|      0|      ++tvs;
  200|    198|    } else {
  201|    198|      nfatys.push_back(faty);
  202|    198|    }
  203|    198|  }
  204|       |
  205|    124|  return polytype(tvs, qualtype(cs, MonoTypePtr(Func::make(tuplety(nfatys), nfrty))));
  206|    124|}
_ZNK6hobbes4Objs6lookupERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  406|  1.60k|PolyTypePtr Objs::lookup(const std::string&) const {
  407|  1.60k|  return PolyTypePtr(); // nothing to see here
  408|  1.60k|}
_ZNK6hobbes4Objs8bindingsB5cxx11Ev:
  410|      1|SymSet Objs::bindings() const {
  411|      1|  return SymSet(); // we don't actually overload any symbols
  412|      1|}

_ZN6hobbes7TypeofP14constraintNameB5cxx11Ev:
    8|      1|std::string TypeofP::constraintName() {
    9|      1|  return "TypeOf";
   10|      1|}
_ZNK6hobbes7TypeofP6lookupERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
   91|  1.57k|PolyTypePtr TypeofP::lookup(const std::string&) const {
   92|  1.57k|  return PolyTypePtr();
   93|  1.57k|}
_ZNK6hobbes7TypeofP8bindingsB5cxx11Ev:
   95|      1|SymSet TypeofP::bindings() const {
   96|      1|  return SymSet();
   97|      1|}

_ZN6hobbes11VariantAppP14constraintNameB5cxx11Ev:
   99|      1|std::string VariantAppP::constraintName() {
  100|      1|  return "VariantApp";
  101|      1|}
_ZNK6hobbes11VariantAppP6lookupERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  152|  1.53k|PolyTypePtr VariantAppP::lookup(const std::string& vn) const {
  153|  1.53k|  if (vn == REF_VAR_APP) {
  ------------------
  |  |   97|  1.53k|#define REF_VAR_APP "variantApp"
  ------------------
  |  Branch (153:7): [True: 0, False: 1.53k]
  ------------------
  154|       |    // variantApp :: (VariantApp v f r) => (v,f) -> r
  155|      0|    return polytype(3, qualtype(list(std::make_shared<Constraint>(VariantAppP::constraintName(), list(tgen(0), tgen(1), tgen(2)))), functy(list(tgen(0), tgen(1)), tgen(2))));
  156|  1.53k|  } else {
  157|  1.53k|    return PolyTypePtr();
  158|  1.53k|  }
  159|  1.53k|}
_ZNK6hobbes11VariantAppP8bindingsB5cxx11Ev:
  161|      1|SymSet VariantAppP::bindings() const {
  162|      1|  SymSet r;
  163|      1|  r.insert(REF_VAR_APP);
  ------------------
  |  |   97|      1|#define REF_VAR_APP "variantApp"
  ------------------
  164|      1|  return r;
  165|      1|}

_ZN6hobbes13VariantTruncP14constraintNameB5cxx11Ev:
   36|      1|std::string VariantTruncP::constraintName() {
   37|      1|  return "VariantTrunc";
   38|      1|}
_ZNK6hobbes13VariantTruncP6lookupERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
   77|  1.53k|PolyTypePtr VariantTruncP::lookup(const std::string& vn) const {
   78|  1.53k|  if (vn == REF_VAR_TRUNC) {
  ------------------
  |  |   34|  1.53k|#define REF_VAR_TRUNC "trunc"
  ------------------
  |  Branch (78:7): [True: 0, False: 1.53k]
  ------------------
   79|       |    // trunc :: (VariantTrunc v e) => v -> e
   80|      0|    return polytype(2, qualtype(list(std::make_shared<Constraint>(VariantTruncP::constraintName(), list(tgen(0), tgen(1)))), functy(list(tgen(0)), tgen(1))));
   81|  1.53k|  } else {
   82|  1.53k|    return PolyTypePtr();
   83|  1.53k|  }
   84|  1.53k|}
_ZNK6hobbes13VariantTruncP8bindingsB5cxx11Ev:
   86|      1|SymSet VariantTruncP::bindings() const {
   87|      1|  SymSet r;
   88|      1|  r.insert(REF_VAR_TRUNC);
  ------------------
  |  |   34|      1|#define REF_VAR_TRUNC "trunc"
  ------------------
   89|      1|  return r;
   90|      1|}

_ZN6hobbes4showB5cxx11ERKNS_8MonoTypeE:
   33|  2.87k|std::string show(const MonoType& e)   { return showT(*simplifyVarNames(e)); }
_ZN6hobbes4showB5cxx11ERKSt10shared_ptrINS_8MonoTypeEE:
   42|  2.87k|std::string show(const MonoTypePtr& e)   { return show(*e); }
_ZN6hobbes11showNoSimplB5cxx11ERKNS_8QualTypeE:
   62|    161|std::string showNoSimpl(const QualType& e)      { return showT(e); }
_ZN6hobbes11showNoSimplB5cxx11ERKSt10shared_ptrINS_8QualTypeEE:
   69|    161|std::string showNoSimpl(const QualTypePtr& e)   { return showNoSimpl(*e); }
_ZN6hobbes4TEnvC2ERKSt10shared_ptrIS0_E:
   92|  4.25k|TEnv::TEnv(const TEnvPtr& parent) : parent(parent), dbgCstRefine(false) {
   93|  4.25k|}
_ZN6hobbes4TEnvC2Ev:
   95|      1|TEnv::TEnv() :  unquals(new UnqualifierSet()), dbgCstRefine(false)  {
   96|      1|}
_ZNK6hobbes4TEnv21debugConstraintRefineEv:
   97|   238k|bool TEnv::debugConstraintRefine() const { return this->dbgCstRefine || (parent && parent->debugConstraintRefine()); }
  ------------------
  |  Branch (97:51): [True: 0, False: 238k]
  |  Branch (97:74): [True: 183k, False: 54.0k]
  |  Branch (97:84): [True: 0, False: 183k]
  ------------------
_ZNK6hobbes4TEnv10hasBindingERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  100|  2.44k|bool TEnv::hasBinding(const std::string& vname) const {
  101|  2.44k|  return hasImmediateBinding(vname) || (this->parent && this->parent->hasBinding(vname));
  ------------------
  |  Branch (101:10): [True: 803, False: 1.64k]
  |  Branch (101:41): [True: 756, False: 885]
  |  Branch (101:57): [True: 0, False: 756]
  ------------------
  102|  2.44k|}
_ZNK6hobbes4TEnv19hasImmediateBindingERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  104|  13.6k|bool TEnv::hasImmediateBinding(const std::string& vname) const {
  105|  13.6k|  return (this->ptenv.find(vname) != this->ptenv.end()) || (this->unquals && this->unquals->lookup(vname) != PolyTypePtr());
  ------------------
  |  Branch (105:10): [True: 1.78k, False: 11.8k]
  |  Branch (105:61): [True: 2.84k, False: 8.99k]
  |  Branch (105:78): [True: 1.13k, False: 1.70k]
  ------------------
  106|  13.6k|}
_ZN6hobbes4TEnv4bindERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_8PolyTypeEE:
  108|  6.93k|void TEnv::bind(const std::string& vname, const PolyTypePtr& pt) {
  109|  6.93k|  if (hasImmediateBinding(vname)) {
  ------------------
  |  Branch (109:7): [True: 0, False: 6.93k]
  ------------------
  110|      0|    throw std::runtime_error("Variable already defined: " + vname);
  111|  6.93k|  } else {
  112|  6.93k|    this->ptenv[vname] = pt;
  113|  6.93k|  }
  114|  6.93k|}
_ZN6hobbes4TEnv4bindERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_8MonoTypeEE:
  120|  1.51k|void TEnv::bind(const std::string& vname, const MonoTypePtr& t) {
  121|  1.51k|  bind(vname, polytype(t));
  122|  1.51k|}
_ZN6hobbes4TEnv6unbindERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  124|    236|void TEnv::unbind(const std::string& vname) {
  125|    236|  auto b = this->ptenv.find(vname);
  126|    236|  if (b != this->ptenv.end()) {
  ------------------
  |  Branch (126:7): [True: 236, False: 0]
  ------------------
  127|    236|    this->ptenv.erase(b);
  128|    236|  }
  129|    236|}
_ZNK6hobbes4TEnv6lookupERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  131|  23.6k|PolyTypePtr TEnv::lookup(const std::string& vname) const {
  132|  23.6k|  auto t = this->ptenv.find(vname);
  133|  23.6k|  if (t != this->ptenv.end()) {
  ------------------
  |  Branch (133:7): [True: 7.49k, False: 16.1k]
  ------------------
  134|  7.49k|    return t->second;
  135|  16.1k|  } else if (this->parent) {
  ------------------
  |  Branch (135:14): [True: 14.3k, False: 1.78k]
  ------------------
  136|  14.3k|    return this->parent->lookup(vname);
  137|  14.3k|  } else {
  138|  1.78k|    PolyTypePtr pt = this->unquals->lookup(vname);
  139|  1.78k|    if (pt != PolyTypePtr()) {
  ------------------
  |  Branch (139:9): [True: 1.78k, False: 0]
  ------------------
  140|  1.78k|      return pt;
  141|  1.78k|    } else {
  142|      0|      std::ostringstream ss;
  143|      0|      ss << "Undefined variable: '" << vname << "'";
  144|       |
  145|      0|      str::seq suggestions = str::closestMatches(vname, boundVariables(), 3);
  146|      0|      if (suggestions.size() == 1) {
  ------------------
  |  Branch (146:11): [True: 0, False: 0]
  ------------------
  147|      0|        ss << " (did you mean '" << suggestions[0] << "'?)";
  148|      0|      } else if (!suggestions.empty()) {
  ------------------
  |  Branch (148:18): [True: 0, False: 0]
  ------------------
  149|      0|        ss << " (did you mean one of: '" << suggestions[0] << "'";
  150|      0|        for (size_t i = 1; i < suggestions.size(); ++i) {
  ------------------
  |  Branch (150:28): [True: 0, False: 0]
  ------------------
  151|      0|          ss << ", '" << suggestions[i] << "'";
  152|      0|        }
  153|      0|        ss << ")";
  154|      0|      }
  155|       |
  156|      0|      throw std::runtime_error(ss.str());
  157|      0|    }
  158|  1.78k|  }
  159|  23.6k|}
_ZN6hobbes4TEnv4bindERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_11UnqualifierEE:
  161|    373|void TEnv::bind(const std::string& predName, const UnqualifierPtr& uq) {
  162|    373|  if (this->parent) {
  ------------------
  |  Branch (162:7): [True: 0, False: 373]
  ------------------
  163|      0|    this->parent->bind(predName, uq);
  164|    373|  } else {
  165|       |    // add this unqualifier only if it doesn't introduce conflicting variable definitions
  166|    373|    for (const auto& vn : uq->bindings()) {
  ------------------
  |  Branch (166:25): [True: 372, False: 373]
  ------------------
  167|    372|      if (hasBinding(vn)) {
  ------------------
  |  Branch (167:11): [True: 0, False: 372]
  ------------------
  168|      0|        throw std::runtime_error("Variable already defined: " + vn);
  169|      0|      }
  170|    372|    }
  171|       |
  172|    373|    this->unquals->add(predName, uq);
  173|    373|  }
  174|    373|}
_ZNK6hobbes4TEnv17lookupUnqualifierERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  176|   412k|UnqualifierPtr TEnv::lookupUnqualifier(const std::string& predName) const {
  177|   412k|  if (this->parent) {
  ------------------
  |  Branch (177:7): [True: 313k, False: 98.8k]
  ------------------
  178|   313k|    return this->parent->lookupUnqualifier(predName);
  179|   313k|  } else {
  180|  98.8k|    return this->unquals->findUnqualifier(predName);
  181|  98.8k|  }
  182|   412k|}
_ZNK6hobbes4TEnv17lookupUnqualifierERKSt10shared_ptrINS_10ConstraintEE:
  184|  98.1k|UnqualifierPtr TEnv::lookupUnqualifier(const ConstraintPtr& cst) const {
  185|  98.1k|  return lookupUnqualifier(cst->name());
  186|  98.1k|}
_ZNK6hobbes4TEnv13parentTypeEnvEv:
  224|  2.13k|const TEnvPtr& TEnv::parentTypeEnv() const {
  225|  2.13k|  return this->parent;
  226|  2.13k|}
_ZN6hobbes4TEnv4rootEv:
  228|    203|TEnv* TEnv::root() {
  229|    203|  if (this->parent) {
  ------------------
  |  Branch (229:7): [True: 62, False: 141]
  ------------------
  230|     62|    return this->parent->root();
  231|    141|  } else {
  232|    141|    return this;
  233|    141|  }
  234|    203|}
_ZN6hobbes4TEnv5aliasERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_8MonoTypeEE:
  236|     26|void TEnv::alias(const std::string& tn, const MonoTypePtr& t) {
  237|     26|  if (this->parent) {
  ------------------
  |  Branch (237:7): [True: 0, False: 26]
  ------------------
  238|      0|    this->parent->alias(tn, t);
  239|     26|  } else {
  240|     26|    auto ta = this->typeAliases.find(tn);
  241|     26|    if (ta != this->typeAliases.end()) {
  ------------------
  |  Branch (241:9): [True: 14, False: 12]
  ------------------
  242|     14|      if (!(*ta->second == *t)) {
  ------------------
  |  Branch (242:11): [True: 0, False: 14]
  ------------------
  243|      0|        throw std::runtime_error("Can't redefine type alias " + tn + "=" + show(ta->second) + " to incompatible " + show(t));
  244|      0|      }
  245|     14|    } else {
  246|     12|      this->typeAliases[tn] = t;
  247|     12|    }
  248|     26|  }
  249|     26|}
_ZNK6hobbes4TEnv7unaliasERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  251|    122|MonoTypePtr TEnv::unalias(const std::string& tn) const {
  252|    122|  auto ta = this->typeAliases.find(tn);
  253|    122|  if (ta != this->typeAliases.end()) {
  ------------------
  |  Branch (253:7): [True: 122, False: 0]
  ------------------
  254|    122|    return ta->second;
  255|    122|  } else {
  256|      0|    if (this->parent) {
  ------------------
  |  Branch (256:9): [True: 0, False: 0]
  ------------------
  257|      0|      return this->parent->unalias(tn);
  258|      0|    } else {
  259|      0|      throw std::runtime_error("Internal error, not a type alias: " + tn);
  260|      0|    }
  261|      0|  }
  262|    122|}
_ZNK6hobbes4TEnv17isOpaqueTypeAliasERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  264|  6.14k|bool TEnv::isOpaqueTypeAlias(const std::string& tn) const {
  265|  6.14k|  return
  266|  6.14k|    (this->typeAliases.find(tn) != this->typeAliases.end()) ||
  ------------------
  |  Branch (266:5): [True: 122, False: 6.01k]
  ------------------
  267|  6.01k|    (this->parent && this->parent->isOpaqueTypeAlias(tn));
  ------------------
  |  Branch (267:6): [True: 0, False: 6.01k]
  |  Branch (267:22): [True: 0, False: 0]
  ------------------
  268|  6.14k|}
_ZN6hobbes7fnFrameERKSt10shared_ptrINS_4TEnvEERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EERKS5_IS0_INS_8MonoTypeEESaISH_EE:
  270|    587|TEnvPtr fnFrame(const TEnvPtr& p, const str::seq& vs, const MonoTypes& atys) {
  271|    587|  TEnvPtr r(new TEnv(p));
  272|    587|  unsigned int n = std::min<unsigned int>(vs.size(), atys.size());
  273|  2.11k|  for (unsigned int i = 0; i < n; ++i) {
  ------------------
  |  Branch (273:28): [True: 1.52k, False: 587]
  ------------------
  274|  1.52k|    r->bind(vs[i], polytype(atys[i]));
  275|  1.52k|  }
  276|    587|  return r;
  277|    587|}
_ZN6hobbes9bindFrameERKSt10shared_ptrINS_4TEnvEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS0_INS_8MonoTypeEE:
  279|  1.59k|TEnvPtr bindFrame(const TEnvPtr& p, const std::string& vn, const MonoTypePtr& vty) {
  280|  1.59k|  TEnvPtr r(new TEnv(p));
  281|  1.59k|  r->bind(vn, polytype(vty));
  282|  1.59k|  return r;
  283|  1.59k|}
_ZN6hobbes9bindFrameERKSt10shared_ptrINS_4TEnvEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS0_INS_8QualTypeEE:
  285|    665|TEnvPtr bindFrame(const TEnvPtr& p, const std::string& vn, const QualTypePtr& qty) {
  286|    665|  TEnvPtr r(new TEnv(p));
  287|    665|  r->bind(vn, polytype(qty));
  288|    665|  return r;
  289|    665|}
_ZN6hobbes9satisfiedERKSt10shared_ptrINS_11UnqualifierEERKS0_INS_4TEnvEERKS0_INS_10ConstraintEEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES0_INS_4ExprEEESaISN_EE:
  291|  7.11k|bool satisfied(const UnqualifierPtr& uq, const TEnvPtr& tenv, const ConstraintPtr& c, Definitions* ds) {
  292|  7.11k|  switch (c->state) {
  293|    711|  case Constraint::Satisfied:
  ------------------
  |  Branch (293:3): [True: 711, False: 6.40k]
  ------------------
  294|    711|    return true;
  295|      0|  case Constraint::Unsatisfiable:
  ------------------
  |  Branch (295:3): [True: 0, False: 7.11k]
  ------------------
  296|      0|    return false;
  297|  6.40k|  default:
  ------------------
  |  Branch (297:3): [True: 6.40k, False: 711]
  ------------------
  298|  6.40k|    if (uq->satisfied(tenv, c, ds)) {
  ------------------
  |  Branch (298:9): [True: 1.59k, False: 4.80k]
  ------------------
  299|  1.59k|      c->state = Constraint::Satisfied;
  300|  1.59k|      return true;
  301|  4.80k|    } else {
  302|  4.80k|      return false;
  303|  4.80k|    }
  304|  7.11k|  }
  305|  7.11k|}
_ZN6hobbes9satisfiedERKSt10shared_ptrINS_4TEnvEERKS0_INS_10ConstraintEEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES0_INS_4ExprEEESaISJ_EE:
  307|  5.04k|bool satisfied(const TEnvPtr& tenv, const ConstraintPtr& c, Definitions* ds) {
  308|  5.04k|  return satisfied(tenv->lookupUnqualifier(c), tenv, c, ds);
  309|  5.04k|}
_ZN6hobbes9satisfiedERKSt10shared_ptrINS_4TEnvEERKSt6vectorIS0_INS_10ConstraintEESaIS7_EEPS5_ISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES0_INS_4ExprEEESaISL_EE:
  311|     13|bool satisfied(const TEnvPtr& tenv, const Constraints& cs, Definitions* ds) {
  312|     13|  for (const auto &c : cs) {
  ------------------
  |  Branch (312:22): [True: 0, False: 13]
  ------------------
  313|      0|    if (!satisfied(tenv, c, ds)) {
  ------------------
  |  Branch (313:9): [True: 0, False: 0]
  ------------------
  314|      0|      return false;
  315|      0|    }
  316|      0|  }
  317|     13|  return true;
  318|     13|}
_ZN6hobbes11satisfiableERKSt10shared_ptrINS_11UnqualifierEERKS0_INS_4TEnvEERKS0_INS_10ConstraintEEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES0_INS_4ExprEEESaISN_EE:
  320|  8.72k|bool satisfiable(const UnqualifierPtr& uq, const TEnvPtr& tenv, const ConstraintPtr& c, Definitions* ds) {
  321|  8.72k|  switch (c->state) {
  322|    436|  case Constraint::Satisfied:
  ------------------
  |  Branch (322:3): [True: 436, False: 8.28k]
  ------------------
  323|    436|    return true;
  324|      0|  case Constraint::Unsatisfiable:
  ------------------
  |  Branch (324:3): [True: 0, False: 8.72k]
  ------------------
  325|      0|    return false;
  326|  8.28k|  default:
  ------------------
  |  Branch (326:3): [True: 8.28k, False: 436]
  ------------------
  327|  8.28k|    if (!uq->satisfiable(tenv, c, ds)) {
  ------------------
  |  Branch (327:9): [True: 3.83k, False: 4.44k]
  ------------------
  328|  3.83k|      c->state = Constraint::Unsatisfiable;
  329|  3.83k|      return false;
  330|  4.44k|    } else {
  331|  4.44k|      return true;
  332|  4.44k|    }
  333|  8.72k|  }
  334|  8.72k|}
_ZN6hobbes11satisfiableERKSt10shared_ptrINS_4TEnvEERKS0_INS_10ConstraintEEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES0_INS_4ExprEEESaISJ_EE:
  336|  6.65k|bool satisfiable(const TEnvPtr& tenv, const ConstraintPtr& c, Definitions* ds) {
  337|  6.65k|  return satisfiable(tenv->lookupUnqualifier(c), tenv, c, ds);
  338|  6.65k|}
_ZN6hobbes8PolyTypeC2EmRKSt10shared_ptrINS_8QualTypeEE:
  352|  4.13k|PolyType::PolyType(size_t vs, const QualTypePtr& qt) : vs(vs), qt(qt) {
  353|  4.13k|}
_ZN6hobbes8PolyTypeC2ERKSt10shared_ptrINS_8QualTypeEE:
  355|  6.38k|PolyType::PolyType(const QualTypePtr& qt) : vs(0), qt(qt) {
  356|  6.38k|}
_ZNK6hobbes8PolyType13typeVariablesEv:
  358|  1.27k|size_t PolyType::typeVariables() const {
  359|  1.27k|  return this->vs;
  360|  1.27k|}
_ZNK6hobbes8PolyType11instantiateEv:
  362|  8.64k|QualTypePtr PolyType::instantiate() const {
  363|  8.64k|  return hobbes::instantiate(this->vs, this->qt);
  364|  8.64k|}
_ZNK6hobbes8PolyType8qualtypeEv:
  374|  1.43k|const QualTypePtr& PolyType::qualtype() const {
  375|  1.43k|  return this->qt;
  376|  1.43k|}
_ZN6hobbes8QualTypeC2ERKSt6vectorISt10shared_ptrINS_10ConstraintEESaIS4_EERKS2_INS_8MonoTypeEE:
  381|  81.0k|QualType::QualType(const Constraints& cs, const MonoTypePtr& mt) : cs(cs), mt(mt) {
  382|  81.0k|}
_ZN6hobbes8QualTypeC2ERKSt10shared_ptrINS_8MonoTypeEE:
  384|  13.0k|QualType::QualType(const MonoTypePtr& mt) : mt(mt) {
  385|  13.0k|}
_ZNK6hobbes8QualType8monoTypeEv:
  388|   130k|const MonoTypePtr& QualType::monoType() const { return this->mt; }
_ZN6hobbes8QualType11constraintsEv:
  389|   225k|Constraints& QualType::constraints() { return this->cs; }
_ZN6hobbes8QualType8monoTypeERKSt10shared_ptrINS_8MonoTypeEE:
  390|  25.9k|void QualType::monoType(const MonoTypePtr& nt) { this->mt = nt; }
_ZNK6hobbes8QualType4showERSo:
  392|    161|void QualType::show(std::ostream& out) const {
  393|    161|  if (this->cs.empty()) {
  ------------------
  |  Branch (393:7): [True: 149, False: 12]
  ------------------
  394|    149|    this->mt->show(out);
  395|    149|  } else if (this->cs.size() == 1) {
  ------------------
  |  Branch (395:14): [True: 12, False: 0]
  ------------------
  396|     12|    this->cs[0]->show(out);
  397|     12|    out << " => ";
  398|     12|    this->mt->show(out);
  399|     12|  } else {
  400|      0|    out << "(";
  401|      0|    this->cs[0]->show(out);
  402|      0|    for (size_t i = 1; i < this->cs.size(); ++i) {
  ------------------
  |  Branch (402:24): [True: 0, False: 0]
  ------------------
  403|      0|      out << ", ";
  404|      0|      this->cs[i]->show(out);
  405|      0|    }
  406|      0|    out << ") => ";
  407|      0|    this->mt->show(out);
  408|      0|  }
  409|    161|}
_ZNK6hobbes8QualTypeeqERKS0_:
  411|    403|bool QualType::operator==(const QualType& rhs) const {
  412|    403|  return this->cs == rhs.cs && *this->mt == *rhs.mt;
  ------------------
  |  Branch (412:10): [True: 396, False: 7]
  |  Branch (412:32): [True: 396, False: 0]
  ------------------
  413|    403|}
_ZN6hobbes10ConstraintC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaISC_EE:
  419|  51.6k|  cat(cat), mts(mts), state(Unresolved)
  420|  51.6k|{
  421|  51.6k|}
_ZNK6hobbes10Constraint4nameB5cxx11Ev:
  423|   182k|std::string        Constraint::name()      const { return this->cat; }
_ZNK6hobbes10Constraint9argumentsEv:
  424|   281k|const MonoTypes&   Constraint::arguments() const { return this->mts; }
_ZNK6hobbes10Constraint11instantiateERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS4_EE:
  426|  16.1k|ConstraintPtr Constraint::instantiate(const MonoTypes& ts) const {
  427|  16.1k|  return std::make_shared<Constraint>(this->name(), hobbes::instantiate(ts, this->arguments()));
  428|  16.1k|}
_ZNK6hobbes10Constraint9tvarNamesB5cxx11Ev:
  430|  3.31k|NameSet Constraint::tvarNames() const {
  431|  3.31k|  NameSet result;
  432|  3.31k|  hobbes::tvarNames(this->arguments(), &result);
  433|  3.31k|  return result;
  434|  3.31k|}
_ZNK6hobbes10Constraint16hasFreeVariablesEv:
  436|  6.02k|bool Constraint::hasFreeVariables() const {
  437|  6.02k|  return hobbes::hasFreeVariables(this->arguments());
  438|  6.02k|}
_ZNK6hobbes10Constraint10substituteERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEESt4lessIS7_ESaISt4pairIKS7_SA_EEE:
  440|  18.6k|ConstraintPtr Constraint::substitute(const MonoTypeSubst& s) const {
  441|  18.6k|  return std::make_shared<Constraint>(this->name(), hobbes::substitute(s, this->arguments()));
  442|  18.6k|}
_ZN6hobbes10Constraint6updateEPNS_15MonoTypeUnifierE:
  444|  77.8k|void Constraint::update(MonoTypeUnifier* u) {
  445|  77.8k|  this->mts = u->substitute(this->mts);
  446|  77.8k|}
_ZNK6hobbes10Constraint4showERSo:
  448|     12|void Constraint::show(std::ostream& out) const {
  449|     12|  if (this->cat == CtorVerifier::constraintName() && this->mts.size() >= 3) {
  ------------------
  |  Branch (449:7): [True: 0, False: 12]
  |  Branch (449:7): [True: 0, False: 12]
  |  Branch (449:54): [True: 0, False: 0]
  ------------------
  450|      0|    if (const TString* lbl = is<TString>(this->mts[1])) {
  ------------------
  |  Branch (450:24): [True: 0, False: 0]
  ------------------
  451|      0|      out << "|" << lbl->value() << ":";
  452|      0|    } else {
  453|      0|      out << "|";
  454|      0|      this->mts[1]->show(out);
  455|      0|      out << ":";
  456|      0|    }
  457|      0|    this->mts[2]->show(out);
  458|      0|    out << "|::";
  459|      0|    this->mts[0]->show(out);
  460|     12|  } else if (this->cat == FieldVerifier::constraintName() && this->mts.size() >= 4) {
  ------------------
  |  Branch (460:14): [True: 0, False: 12]
  |  Branch (460:14): [True: 0, False: 12]
  |  Branch (460:62): [True: 0, False: 0]
  ------------------
  461|      0|    this->mts[1]->show(out);
  462|      0|    if (const TString* lbl = is<TString>(this->mts[2])) {
  ------------------
  |  Branch (462:24): [True: 0, False: 0]
  ------------------
  463|      0|      out << "." << lbl->value();
  464|      0|    } else {
  465|      0|      out << "/";
  466|      0|      this->mts[2]->show(out);
  467|      0|    }
  468|      0|    out << "::";
  469|      0|    this->mts[3]->show(out);
  470|     12|  } else {
  471|     12|    out << this->cat;
  472|     32|    for (const auto &mt : this->mts) {
  ------------------
  |  Branch (472:25): [True: 32, False: 12]
  ------------------
  473|     32|      out << " ";
  474|     32|      mt->show(out);
  475|     32|    }
  476|     12|  }
  477|     12|}
_ZNK6hobbes10ConstrainteqERKS0_:
  479|  78.2k|bool Constraint::operator==(const Constraint& rhs) const {
  480|  78.2k|  if (this->cat != rhs.cat || this->mts.size() != rhs.mts.size()) {
  ------------------
  |  Branch (480:7): [True: 52.6k, False: 25.5k]
  |  Branch (480:31): [True: 0, False: 25.5k]
  ------------------
  481|  52.6k|    return false;
  482|  52.6k|  } else {
  483|  80.0k|    for (size_t i = 0; i < this->mts.size(); ++i) {
  ------------------
  |  Branch (483:24): [True: 63.3k, False: 16.6k]
  ------------------
  484|  63.3k|      if (!(*this->mts[i] == *rhs.mts[i])) {
  ------------------
  |  Branch (484:11): [True: 8.95k, False: 54.4k]
  ------------------
  485|  8.95k|        return false;
  486|  8.95k|      }
  487|  63.3k|    }
  488|  16.6k|    return true;
  489|  25.5k|  }
  490|  78.2k|}
_ZN6hobbes8MonoTypeC2Ei:
  495|  43.0k|MonoType::MonoType(int cid) : cid(cid), tgenCount(0), memorySize(-1), memoryAlignment(-1), llvmTypeMemo{nullptr, nullptr} { }
_ZNK6hobbes8MonoType7case_idEv:
  496|  1.73M|int MonoType::case_id() const { return this->cid; }
_ZN6hobbes8MonoTypeD2Ev:
  497|  42.9k|MonoType::~MonoType() = default;
_ZNK6hobbes8MonoTypeeqERKS0_:
  499|   195k|bool MonoType::operator==(const MonoType& rhs) const {
  500|   195k|  return this == &rhs;
  501|   195k|}
_ZN6hobbes9isFileRefERKSt10shared_ptrINS_8MonoTypeEE:
  504|     12|bool isFileRef(const MonoTypePtr& mt) {
  505|     12|  if (const TApp* ap = is<TApp>(mt)) {
  ------------------
  |  Branch (505:19): [True: 1, False: 11]
  ------------------
  506|      1|    if (const Prim* fn = is<Prim>(ap->fn())) {
  ------------------
  |  Branch (506:21): [True: 1, False: 0]
  ------------------
  507|      1|      return fn->name() == "fileref";
  508|      1|    }
  509|      1|  }
  510|     11|  return false;
  511|     12|}
_ZN6hobbes9alignmentERKSt10shared_ptrINS_8MonoTypeEE:
  553|  15.7k|unsigned int alignment(const MonoTypePtr& pty) {
  554|  15.7k|  if (pty->memoryAlignment == static_cast<unsigned int>(-1)) {
  ------------------
  |  Branch (554:7): [True: 142, False: 15.6k]
  ------------------
  555|    142|    pty->memoryAlignment = computeAlignment(pty);
  556|    142|  }
  557|  15.7k|  return pty->memoryAlignment;
  558|  15.7k|}
_ZN6hobbes9tctorMapsB5cxx11Ev:
  583|   416k|MTypeCtorMaps* tctorMaps() {
  584|   416k|  static MTypeCtorMaps* x = nullptr;
  585|   416k|  if (x == nullptr) {
  ------------------
  |  Branch (585:7): [True: 2, False: 416k]
  ------------------
  586|      2|    x = new MTypeCtorMaps();
  587|      2|  }
  588|   416k|  return x;
  589|   416k|}
_ZN6hobbes18compactMTypeMemoryEv:
  599|      1|void compactMTypeMemory() {
  600|      1|  hlock _;
  601|      1|  tctorMaps()->compact();
  602|      1|}
_ZN6hobbes4Prim4makeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_8MonoTypeEE:
  618|  36.2k|MonoTypePtr Prim::make(const std::string& nm, const MonoTypePtr& t) {
  619|  36.2k|  return makeType<PrimMem, Prim>(nm, t);
  620|  36.2k|}
_ZN6hobbes4PrimC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_8MonoTypeEE:
  622|     38|Prim::Prim(const std::string& nm, const MonoTypePtr& t) : nm(nm), t(t) {
  623|     38|  if (t) {
  ------------------
  |  Branch (623:7): [True: 18, False: 20]
  ------------------
  624|     18|    this->freeTVars = t->freeTVars;
  625|     18|    this->tgenCount = t->tgenCount;
  626|     18|  }
  627|     38|}
_ZNK6hobbes4Prim4showERSo:
  629|  2.03k|void Prim::show(std::ostream& out) const { out << (this->nm == "unit" ? "()" : this->nm); }
  ------------------
  |  Branch (629:52): [True: 620, False: 1.41k]
  ------------------
_ZNK6hobbes4Prim4nameB5cxx11Ev:
  630|  47.8k|const std::string& Prim::name() const { return this->nm; }
_ZNK6hobbes4Prim14representationEv:
  631|  27.3k|const MonoTypePtr& Prim::representation() const { return this->t; }
_ZN6hobbes9OpaquePtr4makeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEjb:
  633|    634|MonoTypePtr OpaquePtr::make(const std::string& nm, unsigned int sz, bool scontig) {
  634|    634|  return makeType<OpaquePtrMem, OpaquePtr>(nm, scontig ? sz : 0, scontig);
  ------------------
  |  Branch (634:48): [True: 0, False: 634]
  ------------------
  635|    634|}
_ZN6hobbes9OpaquePtrC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEjb:
  637|      9|OpaquePtr::OpaquePtr(const std::string& nm, unsigned int sz, bool scontig) : nm(nm), sz(sz), scontig(scontig) {
  638|      9|}
_ZNK6hobbes9OpaquePtr4nameB5cxx11Ev:
  640|    812|const std::string& OpaquePtr::name() const { return this->nm; }
_ZNK6hobbes9OpaquePtr4sizeEv:
  641|    546|unsigned int OpaquePtr::size() const { return this->sz; }
_ZNK6hobbes9OpaquePtr18storedContiguouslyEv:
  642|    498|bool OpaquePtr::storedContiguously() const { return this->scontig; }
_ZNK6hobbes9OpaquePtr4showERSo:
  643|     56|void OpaquePtr::show(std::ostream& out) const { out << "<" << str::replace<char>(this->nm, "::", ".") << ">"; }
_ZN6hobbes15normIfOpaquePtrERKSt10shared_ptrINS_8MonoTypeEE:
  645|  7.26k|MonoTypePtr normIfOpaquePtr(const MonoTypePtr& ty) {
  646|  7.26k|  if (const OpaquePtr* op = is<OpaquePtr>(ty)) {
  ------------------
  |  Branch (646:24): [True: 110, False: 7.15k]
  ------------------
  647|    110|    return OpaquePtr::make(op->name(), op->size(), false);
  648|  7.15k|  } else {
  649|  7.15k|    return ty;
  650|  7.15k|  }
  651|  7.26k|}
_ZN6hobbes4TVar4makeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  653|   179k|MonoTypePtr TVar::make(const std::string& nm) {
  654|   179k|  return makeType<TVarMem, TVar>(nm);
  655|   179k|}
_ZN6hobbes4TVarC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  657|  19.0k|TVar::TVar(const std::string& nm) : nm(nm) {
  658|  19.0k|  this->freeTVars.insert(nm);
  659|  19.0k|}
_ZNK6hobbes4TVar4nameB5cxx11Ev:
  661|   392k|const std::string& TVar::name() const { return this->nm; }
_ZNK6hobbes4TVar4showERSo:
  662|  3.34k|void TVar::show(std::ostream& out) const { out << this->nm; }
_ZN6hobbes4TGen4makeEi:
  664|  19.5k|MonoTypePtr TGen::make(int x) {
  665|       |  // a TGen is an index into the type variables quantified by the enclosing
  666|       |  // polytype, so it is always non-negative, and the constructor derives a
  667|       |  // count of 'x + 1' from it -- that increment overflows at INT_MAX. Reject
  668|       |  // both out-of-domain cases here rather than in the decoder alone, since
  669|       |  // every path that can carry an attacker-supplied index (the binary type
  670|       |  // decoder in particular) funnels through this constructor.
  671|  19.5k|  if (x < 0 || x == std::numeric_limits<int>::max()) {
  ------------------
  |  Branch (671:7): [True: 0, False: 19.5k]
  |  Branch (671:16): [True: 0, False: 19.5k]
  ------------------
  672|      0|    throw std::runtime_error("Invalid type variable index: " + str::from(x));
  673|      0|  }
  674|  19.5k|  return makeType<TGenMem, TGen>(x);
  675|  19.5k|}
_ZN6hobbes4TGenC2Ei:
  677|     34|TGen::TGen(int x) : x(x) {
  678|     34|  this->tgenCount = x + 1;
  679|     34|}
_ZNK6hobbes4TGen2idEv:
  680|  60.4k|int TGen::id() const { return this->x; }
_ZN6hobbes4TAbs4makeERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS7_EERKSt10shared_ptrINS_8MonoTypeEE:
  684|    110|MonoTypePtr TAbs::make(const str::seq& targns, const MonoTypePtr& b) {
  685|    110|  return makeType<TAbsMem, TAbs>(targns, b);
  686|    110|}
_ZN6hobbes4TAbsC2ERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS7_EERKSt10shared_ptrINS_8MonoTypeEE:
  688|     13|TAbs::TAbs(const str::seq& targns, const MonoTypePtr& b) : targns(targns), b(b) {
  689|     13|}
_ZNK6hobbes4TAbs4argsB5cxx11Ev:
  695|      3|const str::seq&    TAbs::args() const { return this->targns; }
_ZNK6hobbes4TAbs4bodyEv:
  696|      3|const MonoTypePtr& TAbs::body() const { return this->b; }
_ZN6hobbes11showFileRefERKSt10shared_ptrINS_8MonoTypeEERKSt6vectorIS2_SaIS2_EERSo:
  699|    330|bool showFileRef(const MonoTypePtr& f, const MonoTypes& targs, std::ostream& out) {
  700|    330|  if (const Prim* fn = is<Prim>(f)) {
  ------------------
  |  Branch (700:19): [True: 330, False: 0]
  ------------------
  701|       |    // a decoded type description can apply "fileref" to any number of
  702|       |    // arguments, not just the one or two this spelling has slots for
  703|    330|    if (fn->name() == "fileref" && (targs.size() == 1 || targs.size() == 2)) {
  ------------------
  |  Branch (703:9): [True: 262, False: 68]
  |  Branch (703:37): [True: 8, False: 254]
  |  Branch (703:58): [True: 254, False: 0]
  ------------------
  704|    262|      targs[0]->show(out);
  705|    262|      out << "@";
  706|    262|      if (targs.size() == 1) {
  ------------------
  |  Branch (706:11): [True: 8, False: 254]
  ------------------
  707|      8|        out << "?";
  708|    254|      } else {
  709|    254|        targs[1]->show(out);
  710|    254|      }
  711|    262|      return true;
  712|    262|    }
  713|    330|  }
  714|     68|  return false;
  715|    330|}
_ZN6hobbes4TApp4makeERKSt10shared_ptrINS_8MonoTypeEERKSt6vectorIS3_SaIS3_EE:
  717|  3.59k|MonoTypePtr TApp::make(const MonoTypePtr& f, const MonoTypes& targs) {
  718|  3.59k|  return makeType<TAppMem, TApp>(f, targs);
  719|  3.59k|}
_ZN6hobbes4TAppC2ERKSt10shared_ptrINS_8MonoTypeEERKSt6vectorIS3_SaIS3_EE:
  721|    231|TApp::TApp(const MonoTypePtr& f, const MonoTypes& targs) : f(f), targs(targs) {
  722|    231|  this->freeTVars = setUnion(f->freeTVars, tvarNames(targs));
  723|    231|  this->tgenCount = std::max<int>(f->tgenCount, tgenSize(targs));
  724|    231|}
_ZNK6hobbes4TApp4showERSo:
  726|    330|void TApp::show(std::ostream& out) const {
  727|    330|  if (showFileRef(this->f, this->targs, out)) return;
  ------------------
  |  Branch (727:7): [True: 262, False: 68]
  ------------------
  728|       |
  729|     68|  out << "(";
  730|     68|  this->f->show(out);
  731|     68|  if (!this->targs.empty()) {
  ------------------
  |  Branch (731:7): [True: 68, False: 0]
  ------------------
  732|    120|    for (const auto &targ : this->targs) {
  ------------------
  |  Branch (732:27): [True: 120, False: 68]
  ------------------
  733|    120|      out << " ";
  734|    120|      targ->show(out);
  735|    120|    }
  736|     68|  }
  737|     68|  out << ")";
  738|     68|}
_ZNK6hobbes4TApp2fnEv:
  739|  5.41k|const MonoTypePtr& TApp::fn() const { return this->f; }
_ZNK6hobbes4TApp4argsEv:
  740|  4.55k|const MonoTypes&   TApp::args() const { return this->targs; }
_ZN6hobbes10FixedArray4makeERKSt10shared_ptrINS_8MonoTypeEES5_:
  742|    911|MonoTypePtr FixedArray::make(const MonoTypePtr& ty, const MonoTypePtr& len) {
  743|    911|  return makeType<FixedArrayMem, FixedArray>(ty, len);
  744|    911|}
_ZN6hobbes10FixedArrayC2ERKSt10shared_ptrINS_8MonoTypeEES5_:
  746|     99|FixedArray::FixedArray(const MonoTypePtr& ty, const MonoTypePtr& len) : ty(normIfOpaquePtr(ty)), len(len) {
  747|     99|  this->freeTVars = setUnion(ty->freeTVars, len->freeTVars);
  748|     99|  this->tgenCount = std::max<int>(ty->tgenCount, len->tgenCount);
  749|     99|}
_ZNK6hobbes10FixedArray4showERSo:
  751|     85|void FixedArray::show(std::ostream& out) const { out << "[:"; this->ty->show(out); out << "|"; this->len->show(out); out << ":]"; }
_ZNK6hobbes10FixedArray4typeEv:
  752|  1.00k|const MonoTypePtr& FixedArray::type() const { return this->ty; }
_ZNK6hobbes10FixedArray6lengthEv:
  753|    953|const MonoTypePtr& FixedArray::length() const { return this->len; }
_ZNK6hobbes10FixedArray13requireLengthEv:
  755|     12|long FixedArray::requireLength() const {
  756|     12|  if (const TLong* sz = is<TLong>(this->len)) {
  ------------------
  |  Branch (756:20): [True: 12, False: 0]
  ------------------
  757|     12|    return sz->value();
  758|     12|  } else {
  759|      0|    throw std::runtime_error("Cannot determine length of array from non-fixed length: " + hobbes::show(this->len));
  760|      0|  }
  761|     12|}
_ZN6hobbes5Array4makeERKSt10shared_ptrINS_8MonoTypeEE:
  763|  21.4k|MonoTypePtr Array::make(const MonoTypePtr& t) {
  764|  21.4k|  return makeType<ArrayMem, Array>(t);
  765|  21.4k|}
_ZN6hobbes5ArrayC2ERKSt10shared_ptrINS_8MonoTypeEE:
  767|  2.08k|Array::Array(const MonoTypePtr& ty) : ty(normIfOpaquePtr(ty)) {
  768|  2.08k|  this->freeTVars = ty->freeTVars;
  769|  2.08k|  this->tgenCount = ty->tgenCount;
  770|  2.08k|}
_ZNK6hobbes5Array4showERSo:
  772|  1.26k|void Array::show(std::ostream& out) const { out << "["; this->ty->show(out); out << "]"; }
_ZNK6hobbes5Array4typeEv:
  773|  30.0k|const MonoTypePtr& Array::type() const { return this->ty; }
_ZN6hobbes7Variant4makeERKSt6vectorINS0_6MemberESaIS2_EE:
  776|  9.17k|MonoTypePtr Variant::make(const Members& ms) {
  777|  9.17k|  return makeType<VariantMem, Variant>(ms);
  778|  9.17k|}
_ZN6hobbes7Variant6MemberC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_8MonoTypeEEj:
  837|  18.3k|Variant::Member::Member(const std::string& selector, const MonoTypePtr& type, unsigned int id) : selector(selector), type(type), id(id) { }
_ZNK6hobbes7Variant6MembereqERKS1_:
  839|  15.6k|bool Variant::Member::operator==(const Variant::Member& rhs) const { return this->selector == rhs.selector && *this->type == *rhs.type && this->id == rhs.id; }
  ------------------
  |  Branch (839:77): [True: 15.6k, False: 0]
  |  Branch (839:111): [True: 15.6k, False: 0]
  |  Branch (839:139): [True: 15.6k, False: 0]
  ------------------
_ZN6hobbes17nextVisibleMemberEmRKSt6vectorINS_7Variant6MemberESaIS2_EE:
  857|    494|size_t nextVisibleMember(size_t i, const Variant::Members& ms) {
  858|    494|  while (i < ms.size() && isHiddenCtor(ms[i])) {
  ------------------
  |  Branch (858:10): [True: 494, False: 0]
  |  Branch (858:27): [True: 0, False: 494]
  ------------------
  859|      0|    ++i;
  860|      0|  }
  861|    494|  return i;
  862|    494|}
_ZN6hobbes24showFullVarPayloadSuffixERKSt10shared_ptrINS_8MonoTypeEERSo:
  864|     88|void showFullVarPayloadSuffix(const MonoTypePtr& t, std::ostream& out) {
  865|     88|  if (const Prim* p = is<Prim>(t)) {
  ------------------
  |  Branch (865:19): [True: 73, False: 15]
  ------------------
  866|     73|    if (p->name() == "unit") {
  ------------------
  |  Branch (866:9): [True: 0, False: 73]
  ------------------
  867|      0|      return;
  868|      0|    }
  869|     73|  }
  870|     88|  out << ":";
  871|     88|  t->show(out);
  872|     88|}
_ZN6hobbes8showFullERKSt6vectorINS_7Variant6MemberESaIS2_EERSo:
  874|     44|void showFull(const Variant::Members& ms, std::ostream& out) {
  875|     44|  out << "|";
  876|     44|  size_t i = nextVisibleMember(0, ms);
  877|     44|  if (i < ms.size()) {
  ------------------
  |  Branch (877:7): [True: 44, False: 0]
  ------------------
  878|     44|    const bool discrete = [s = std::next(ms.cbegin(), i), e = ms.cend()] {
  879|       |      // not start from zero or not continous
  880|     44|      return s->id != 0 ||
  881|     44|             std::adjacent_find(s, e, [](const auto &a, const auto &b) {
  882|     44|               return !((a.id < b.id) && (a.id + 1 == b.id));
  883|     44|             }) != e;
  884|     44|    }();
  885|     44|    const auto showPayload = [&out, discrete](const Variant::Member &m) {
  886|     44|      out << m.selector;
  887|     44|      if (discrete) {
  888|     44|        out << '(' << m.id << ')';
  889|     44|      }
  890|     44|      showFullVarPayloadSuffix(m.type, out);
  891|     44|    };
  892|       |
  893|     44|    showPayload(ms[i]);
  894|     88|    for (size_t j = i + 1; j < ms.size(); ++j) {
  ------------------
  |  Branch (894:28): [True: 44, False: 44]
  ------------------
  895|     44|      out << ", ";
  896|     44|      showPayload(ms[j]);
  897|     44|    }
  898|     44|  }
  899|     44|  out << "|";
  900|     44|}
_ZN6hobbes7showSumERKSt6vectorINS_7Variant6MemberESaIS2_EERSo:
  902|    450|void showSum(const Variant::Members& ms, std::ostream& out) {
  903|    450|  out << "(";
  904|    450|  size_t i = nextVisibleMember(0, ms);
  905|    450|  if (i < ms.size()) {
  ------------------
  |  Branch (905:7): [True: 450, False: 0]
  ------------------
  906|    450|    ms[i].type->show(out);
  907|    900|    for (size_t j = i + 1; j < ms.size(); ++j) {
  ------------------
  |  Branch (907:28): [True: 450, False: 450]
  ------------------
  908|    450|      out << " + ";
  909|    450|      ms[j].type->show(out);
  910|    450|    }
  911|    450|  }
  912|    450|  out << ")";
  913|    450|}
_ZN6hobbes12looksLikeSumERKSt6vectorINS_7Variant6MemberESaIS2_EE:
  915|    494|bool looksLikeSum(const Variant::Members& ms) {
  916|    538|  for (const auto &m : ms) {
  ------------------
  |  Branch (916:22): [True: 538, False: 44]
  ------------------
  917|    538|    if (m.selector.size() > 1 && m.selector[0] == '.' && m.selector[1] == 'f') {
  ------------------
  |  Branch (917:9): [True: 538, False: 0]
  |  Branch (917:34): [True: 450, False: 88]
  |  Branch (917:58): [True: 450, False: 0]
  ------------------
  918|    450|      return true;
  919|    450|    }
  920|    538|  }
  921|     44|  return false;
  922|    494|}
_ZN6hobbes7VariantC2ERKSt6vectorINS0_6MemberESaIS2_EE:
  928|  1.34k|Variant::Variant(const Members& ms) : payloadSizeM(-1), ms(ms) {
  929|  1.34k|  std::set<std::string> cnames;
  930|       |
  931|  2.68k|  for (const Member& m : ms) {
  ------------------
  |  Branch (931:24): [True: 2.68k, False: 1.34k]
  ------------------
  932|  2.68k|    this->freeTVars = setUnion(this->freeTVars, m.type->freeTVars);
  933|  2.68k|    this->tgenCount = std::max<int>(this->tgenCount, m.type->tgenCount);
  934|       |    
  935|  2.68k|    if (!isHiddenCtorName(m.selector) && !cnames.insert(m.selector).second) {
  ------------------
  |  Branch (935:9): [True: 2.68k, False: 0]
  |  Branch (935:9): [True: 0, False: 2.68k]
  |  Branch (935:42): [True: 0, False: 2.68k]
  ------------------
  936|      0|      std::ostringstream ss;
  937|      0|      showFull(ms, ss);
  938|      0|      throw std::runtime_error("Can't construct variant with duplicate constructor name '" + m.selector + "': " + ss.str());
  939|      0|    }
  940|  2.68k|  }
  941|  1.34k|}
_ZNK6hobbes7Variant4showERSo:
  943|    494|void Variant::show(std::ostream& out) const {
  944|    494|  if (looksLikeSum(this->ms)) {
  ------------------
  |  Branch (944:7): [True: 450, False: 44]
  ------------------
  945|    450|    showSum(this->ms, out);
  946|    450|  } else {
  947|     44|    showFull(this->ms, out);
  948|     44|  }
  949|    494|}
_ZNK6hobbes7Variant7membersEv:
  951|  11.4k|const Variant::Members& Variant::members() const {
  952|  11.4k|  return this->ms;
  953|  11.4k|}
_ZNK6hobbes7Variant7payloadERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  955|     34|const MonoTypePtr& Variant::payload(const std::string& selector) const {
  956|     34|  if (const Member* m = mmember(selector)) {
  ------------------
  |  Branch (956:21): [True: 34, False: 0]
  ------------------
  957|     34|    return m->type;
  958|     34|  } else {
  959|      0|    throw std::runtime_error("No selector named '" + selector + "' in the variant '" + hobbes::show(this) + "'.");
  960|      0|  }
  961|     34|}
_ZNK6hobbes7Variant2idERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  972|    100|unsigned int Variant::id(const std::string& selector) const {
  973|    142|  for (const auto &m : this->ms) {
  ------------------
  |  Branch (973:22): [True: 142, False: 0]
  ------------------
  974|    142|    if (m.selector == selector) {
  ------------------
  |  Branch (974:9): [True: 100, False: 42]
  ------------------
  975|    100|      return m.id;
  976|    100|    }
  977|    142|  }
  978|      0|  throw std::runtime_error("No selector named '" + selector + "' in the variant '" + hobbes::show(this) + "'.");
  979|    100|}
_ZNK6hobbes7Variant7mmemberERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  981|  2.04k|const Variant::Member* Variant::mmember(const std::string& selector) const {
  982|  3.34k|  for (const auto &m : this->ms) {
  ------------------
  |  Branch (982:22): [True: 3.34k, False: 0]
  ------------------
  983|  3.34k|    if (m.selector == selector) {
  ------------------
  |  Branch (983:9): [True: 2.04k, False: 1.30k]
  ------------------
  984|  2.04k|      return &m;
  985|  2.04k|    }
  986|  3.34k|  }
  987|      0|  return nullptr;
  988|  2.04k|}
_ZNK6hobbes7Variant13payloadOffsetEv:
 1024|    168|unsigned int Variant::payloadOffset() const {
 1025|    168|  unsigned int o = sizeof(int);
 1026|    336|  for (const auto& m : this->ms) {
  ------------------
  |  Branch (1026:22): [True: 336, False: 168]
  ------------------
 1027|    336|    o = std::max<unsigned int>(o, align<unsigned int>(sizeof(int), alignment(m.type)));
 1028|    336|  }
 1029|    168|  return o;
 1030|    168|}
_ZNK6hobbes7Variant11payloadSizeEv:
 1032|     64|unsigned int Variant::payloadSize() const {
 1033|     64|  if (this->payloadSizeM == static_cast<unsigned int>(-1)) {
  ------------------
  |  Branch (1033:7): [True: 27, False: 37]
  ------------------
 1034|     27|    this->payloadSizeM = 0;
 1035|     54|    for (const auto& m : this->ms) {
  ------------------
  |  Branch (1035:24): [True: 54, False: 27]
  ------------------
 1036|     54|      this->payloadSizeM = std::max(this->payloadSizeM, sizeOf(m.type));
 1037|     54|    }
 1038|     27|  }
 1039|     64|  return this->payloadSizeM;
 1040|     64|}
_ZNK6hobbes7Variant4sizeEv:
 1042|     64|unsigned int Variant::size() const {
 1043|       |  // align to strictest field
 1044|     64|  unsigned int malign = sizeof(int);
 1045|    128|  for (const auto& m : this->ms) {
  ------------------
  |  Branch (1045:22): [True: 128, False: 64]
  ------------------
 1046|    128|    malign = std::max<unsigned int>(malign, alignment(m.type));
 1047|    128|  }
 1048|     64|  return align<unsigned int>(payloadOffset() + payloadSize(), malign);
 1049|     64|}
_ZN6hobbes6Record6MemberC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_8MonoTypeEEi:
 1052|   146k|Record::Member::Member(const std::string& field, const MonoTypePtr& type, int offset) : field(field), type(type), offset(offset) { }
_ZNK6hobbes6Record6MembereqERKS1_:
 1054|   111k|bool Record::Member::operator==(const Record::Member& rhs) const { return this->field == rhs.field && *this->type == *rhs.type && this->offset == rhs.offset; }
  ------------------
  |  Branch (1054:75): [True: 111k, False: 0]
  |  Branch (1054:103): [True: 111k, False: 0]
  |  Branch (1054:131): [True: 111k, False: 0]
  ------------------
_ZN6hobbes6Record4makeERKSt6vectorINS0_6MemberESaIS2_EE:
 1080|  62.4k|MonoTypePtr Record::make(const Members& ms) {
 1081|  62.4k|  return makeType<RecordMem, Record>(Record::withResolvedMemoryLayout(ms));
 1082|  62.4k|}
_ZN6hobbes6RecordC2ERKSt6vectorINS0_6MemberESaIS2_EE:
 1084|  9.97k|Record::Record(const Record::Members& tms) : ms(tms), maxFieldAlignmentM(-1) {
 1085|  9.97k|  std::set<std::string> fnames;
 1086|       |
 1087|  21.9k|  for (const Member& m : ms) {
  ------------------
  |  Branch (1087:24): [True: 21.9k, False: 9.97k]
  ------------------
 1088|  21.9k|    if (!isHiddenFieldName(m.field) && !fnames.insert(m.field).second) {
  ------------------
  |  Branch (1088:9): [True: 21.9k, False: 0]
  |  Branch (1088:9): [True: 0, False: 21.9k]
  |  Branch (1088:40): [True: 0, False: 21.9k]
  ------------------
 1089|      0|      throw std::runtime_error("Can't construct record with duplicate field name '" + m.field + "': " + showRecord(tms));
 1090|      0|    }
 1091|       |
 1092|  21.9k|    this->freeTVars = setUnion(this->freeTVars, m.type->freeTVars);
 1093|  21.9k|    this->tgenCount = std::max<int>(this->tgenCount, m.type->tgenCount);
 1094|  21.9k|  }
 1095|       |
 1096|  9.97k|  if (isMonoSingular(this)) {
  ------------------
  |  Branch (1096:7): [True: 304, False: 9.67k]
  ------------------
 1097|    304|    this->ams = withExplicitPadding(this->ms);
 1098|    304|  }
 1099|  9.97k|}
_ZN6hobbes16findHiddenMemberERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt6vectorINS_6Record6MemberESaISA_EE:
 1108|     11|int findHiddenMember(const std::string& lbl, const Record::Members& ms) {
 1109|     11|  const auto it = std::find_if(
 1110|     11|      ms.crbegin(), ms.crend(),
 1111|     11|      [hlbl = ".p" + lbl](const auto &m) { return m.field == hlbl; });
 1112|     11|  return std::distance(it, ms.crend()) - 1;
 1113|     11|}
_ZN6hobbes10consMemberERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_8MonoTypeEERKSt6vectorINS_6Record6MemberESaISF_EE:
 1121|     11|Record::Members consMember(const std::string& lbl, const MonoTypePtr& hty, const Record::Members& tty) {
 1122|       |  // try to find a place to insert this type, otherwise insert it at the head
 1123|     11|  const int slot = findHiddenMember(lbl, tty);
 1124|       |
 1125|     11|  Record::Members r;
 1126|     11|  if (slot < 0) {
  ------------------
  |  Branch (1126:7): [True: 11, False: 0]
  ------------------
 1127|     11|    r.push_back(Record::Member(lbl, hty));
 1128|     11|    r.insert(r.end(), tty.begin(), tty.end());
 1129|     11|  } else {
 1130|      0|    r = tty;
 1131|      0|    r[slot].field = lbl;
 1132|      0|    r[slot].type  = hty;
 1133|      0|  }
 1134|     11|  resetFieldOffsets(&r);
 1135|     11|  return r;
 1136|     11|}
_ZN6hobbes6Record4makeERKSt10shared_ptrINS_8MonoTypeEERKSt6vectorINS0_6MemberESaIS7_EE:
 1147|     11|MonoTypePtr Record::make(const MonoTypePtr& hty, const Members& tty) {
 1148|     11|  Members ms = consMember(".f0", hty, tty);
 1149|     11|  normalizeTupleFields(&ms);
 1150|     11|  return make(ms);
 1151|     11|}
_ZN6hobbes6Record24withResolvedMemoryLayoutERKSt6vectorINS0_6MemberESaIS2_EE:
 1206|  62.4k|Record::Members Record::withResolvedMemoryLayout(const Members& ms) {
 1207|  62.4k|  Members r;
 1208|       |
 1209|       |  // infer offsets and/or insert padding as necessary
 1210|  62.4k|  long o = 0;
 1211|  76.6k|  for (auto m = ms.begin(); m != ms.end(); ++m) {
  ------------------
  |  Branch (1211:29): [True: 72.0k, False: 4.53k]
  ------------------
 1212|  72.0k|    if (!isMonoSingular(m->type)) {
  ------------------
  |  Branch (1212:9): [True: 57.9k, False: 14.1k]
  ------------------
 1213|  57.9k|      return ms;
 1214|  57.9k|    }
 1215|       |
 1216|  14.1k|    o = align<long>(o, static_cast<long>(alignment(m->type)));
 1217|  14.1k|    if (!representableOffset(o)) {
  ------------------
  |  Branch (1217:9): [True: 0, False: 14.1k]
  ------------------
 1218|      0|      throw
 1219|      0|        std::runtime_error(
 1220|      0|          "Member offset is out of range at field '" + m->field + "' "
 1221|      0|          "(" + str::from(o) + " is not within [0, " + str::from(maxRecordOffset) + "]) in record: " +
 1222|      0|          showRecord(ms)
 1223|      0|        );
 1224|      0|    }
 1225|       |
 1226|       |    // determine the 'in-memory' layout of this structure
 1227|       |    //   (must be consistent with GCC so that we can interoperate)
 1228|  14.1k|    if (m->offset == -1) {
  ------------------
  |  Branch (1228:9): [True: 12.8k, False: 1.26k]
  ------------------
 1229|  12.8k|      r.push_back(addoffset(*m, static_cast<int>(o)));
 1230|  12.8k|    } else if (m->offset > o) {
  ------------------
  |  Branch (1230:16): [True: 0, False: 1.26k]
  ------------------
 1231|      0|      throw
 1232|      0|        std::runtime_error(
 1233|      0|          "Actual/calculated member offset mismatch "
 1234|      0|          "at field '" + m->field + "':" + str::from(sizeOf(m->type)) +
 1235|      0|          " (" + str::from(m->offset) + " > " + str::from(o) + ") in record: " +
 1236|      0|          showRecord(ms)
 1237|      0|        );
 1238|  1.26k|    } else if (m->offset == o) {
  ------------------
  |  Branch (1238:16): [True: 1.26k, False: 0]
  ------------------
 1239|  1.26k|      r.push_back(*m);
 1240|  1.26k|    } else {
 1241|      0|      throw std::runtime_error(
 1242|      0|        "Invalid record structure defined with misaligned offsets found at field "
 1243|      0|        "'" + m->field + "':" + str::from(sizeOf(m->type)) +
 1244|      0|        " (" + str::from(m->offset) + " < " + str::from(o) + ") in record: " +
 1245|      0|        showRecord(ms)
 1246|      0|      );
 1247|      0|    }
 1248|       |
 1249|  14.1k|    o += sizeOf(m->type);
 1250|  14.1k|    if (!representableOffset(o)) {
  ------------------
  |  Branch (1250:9): [True: 0, False: 14.1k]
  ------------------
 1251|      0|      throw
 1252|      0|        std::runtime_error(
 1253|      0|          "Record extends past the end of the memory layout at field '" + m->field + "' "
 1254|      0|          "(" + str::from(o) + " is not within [0, " + str::from(maxRecordOffset) + "]) in record: " +
 1255|      0|          showRecord(ms)
 1256|      0|        );
 1257|      0|    }
 1258|  14.1k|  }
 1259|       |
 1260|  4.53k|  return r;
 1261|  62.4k|}
_ZN6hobbes18maxFieldAlignmentFERKSt6vectorINS_6Record6MemberESaIS2_EE:
 1263|    341|unsigned int maxFieldAlignmentF(const Record::Members& ms) {
 1264|    341|  unsigned int result = 1;
 1265|    920|  for (const auto& m : ms) {
  ------------------
  |  Branch (1265:22): [True: 920, False: 341]
  ------------------
 1266|    920|    result = std::max<unsigned int>(result, alignment(m.type));
 1267|    920|  }
 1268|    341|  return result;
 1269|    341|}
_ZNK6hobbes6Record17maxFieldAlignmentEv:
 1271|     37|unsigned int Record::maxFieldAlignment() const {
 1272|     37|  if (this->maxFieldAlignmentM == static_cast<unsigned int>(-1)) {
  ------------------
  |  Branch (1272:7): [True: 37, False: 0]
  ------------------
 1273|     37|    this->maxFieldAlignmentM = maxFieldAlignmentF(this->ms);
 1274|     37|  }
 1275|     37|  return this->maxFieldAlignmentM;
 1276|     37|}
_ZNK6hobbes6Record4sizeEv:
 1278|     37|unsigned int Record::size() const {
 1279|       |  // a record with no members is equivalent to unit
 1280|     37|  if (this->ms.empty()) {
  ------------------
  |  Branch (1280:7): [True: 0, False: 37]
  ------------------
 1281|      0|    return 0;
 1282|      0|  }
 1283|       |
 1284|       |  // align to strictest field
 1285|     37|  unsigned int malign = maxFieldAlignment();
 1286|       |
 1287|       |  // align from last non-unit member offset
 1288|     37|  for (auto m = this->ms.rbegin(); m != this->ms.rend(); ++m) {
  ------------------
  |  Branch (1288:36): [True: 37, False: 0]
  ------------------
 1289|     37|    size_t fsz = sizeOf(m->type);
 1290|       |
 1291|     37|    if (fsz > 0) {
  ------------------
  |  Branch (1291:9): [True: 37, False: 0]
  ------------------
 1292|     37|      const long sz =
 1293|     37|        align<long>(static_cast<long>(m->offset) + static_cast<long>(fsz), static_cast<long>(malign));
 1294|     37|      if (!representableOffset(sz)) {
  ------------------
  |  Branch (1294:11): [True: 0, False: 37]
  ------------------
 1295|      0|        throw
 1296|      0|          std::runtime_error(
 1297|      0|            "Record size is out of range "
 1298|      0|            "(" + str::from(sz) + " is not within [0, " + str::from(maxRecordOffset) + "]) in record: " +
 1299|      0|            showRecord(this->ms)
 1300|      0|          );
 1301|      0|      }
 1302|     37|      return static_cast<unsigned int>(sz);
 1303|     37|    }
 1304|     37|  }
 1305|       |
 1306|       |  // if we got here, we must be all unit
 1307|      0|  return 0;
 1308|     37|}
_ZN6hobbes6Record19withExplicitPaddingERKSt6vectorINS0_6MemberESaIS2_EERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
 1310|    304|Record::Members Record::withExplicitPadding(const Members& ms, const std::string& pfx) {
 1311|    304|  Members r;
 1312|    304|  long    o = 0; // the active determined offset in memory
 1313|    304|  int     p = 0; // unique names for pad fields
 1314|       |
 1315|       |  // as in withResolvedMemoryLayout, the offset is tracked in a 'long': an
 1316|       |  // offset and a size taken from a decoded type description are added and
 1317|       |  // differenced here, and neither the sum nor the gap need fit in an 'int'
 1318|    827|  for (const auto &m : ms) {
  ------------------
  |  Branch (1318:22): [True: 827, False: 304]
  ------------------
 1319|    827|    if (m.offset > o) {
  ------------------
  |  Branch (1319:9): [True: 45, False: 782]
  ------------------
 1320|     45|      r.push_back(Member(pfx + str::from(p++), arrayty(prim<char>(), static_cast<size_t>(m.offset - o))));
 1321|     45|    }
 1322|    827|    size_t msz = sizeOf(m.type);
 1323|    827|    o = static_cast<long>(m.offset) + static_cast<long>(msz);
 1324|       |
 1325|    827|    if (msz > 0) {
  ------------------
  |  Branch (1325:9): [True: 798, False: 29]
  ------------------
 1326|    798|      r.push_back(m);
 1327|    798|    }
 1328|    827|  }
 1329|       |
 1330|       |  // account for trailing padding
 1331|    304|  unsigned int talign = maxFieldAlignmentF(ms);
 1332|       |
 1333|    304|  if (talign > 0) {
  ------------------
  |  Branch (1333:7): [True: 304, False: 0]
  ------------------
 1334|       |    // a record that ends exactly at the last representable offset is within
 1335|       |    // range until it is aligned, and aligning it here is what would carry it
 1336|       |    // past: reject it rather than describing a padded layout whose extent no
 1337|       |    // offset or size can hold (Record::size() refuses to size such a record, so
 1338|       |    // without this it exists only to throw the first time anything asks)
 1339|    304|    const long asz = align<long>(o, static_cast<long>(talign));
 1340|    304|    if (!representableOffset(asz)) {
  ------------------
  |  Branch (1340:9): [True: 0, False: 304]
  ------------------
 1341|      0|      throw
 1342|      0|        std::runtime_error(
 1343|      0|          "Record with trailing padding is out of range "
 1344|      0|          "(" + str::from(asz) + " is not within [0, " + str::from(maxRecordOffset) + "]) in record: " +
 1345|      0|          showRecord(ms)
 1346|      0|        );
 1347|      0|    }
 1348|    304|    if (asz > o) {
  ------------------
  |  Branch (1348:9): [True: 18, False: 286]
  ------------------
 1349|     18|      r.push_back(Member(pfx + str::from(p++), arrayty(prim<char>(), static_cast<size_t>(asz - o))));
 1350|     18|    }
 1351|    304|  }
 1352|       |
 1353|    304|  return r;
 1354|    304|}
_ZN6hobbes11isTupleDescERKSt6vectorINS_6Record6MemberESaIS2_EE:
 1356|  4.86k|bool isTupleDesc(const Record::Members& ms) {
 1357|  4.91k|  for (const auto &m : ms) {
  ------------------
  |  Branch (1357:22): [True: 4.91k, False: 51]
  ------------------
 1358|  4.91k|    if (m.field.substr(0, 2) == ".f") {
  ------------------
  |  Branch (1358:9): [True: 4.81k, False: 100]
  ------------------
 1359|  4.81k|      return true;
 1360|  4.81k|    }
 1361|  4.91k|  }
 1362|     51|  return false;
 1363|  4.86k|}
_ZN6hobbes11showAsTupleERSoRKSt6vectorINS_6Record6MemberESaIS3_EE:
 1365|  1.54k|void showAsTuple(std::ostream& out, const Record::Members& ms) {
 1366|  1.54k|  bool once = false;
 1367|       |
 1368|  1.54k|  out << "(";
 1369|  3.10k|  for (const auto &m : ms) {
  ------------------
  |  Branch (1369:22): [True: 3.10k, False: 1.54k]
  ------------------
 1370|  3.10k|    if (once) { out << " * "; }
  ------------------
  |  Branch (1370:9): [True: 1.56k, False: 1.54k]
  ------------------
 1371|  3.10k|    if (m.field.size() > 2 && m.field[1] != 'p') {
  ------------------
  |  Branch (1371:9): [True: 3.10k, False: 0]
  |  Branch (1371:31): [True: 3.10k, False: 0]
  ------------------
 1372|  3.10k|      m.type->show(out);
 1373|  3.10k|      once = true;
 1374|  3.10k|    }
 1375|  3.10k|  }
 1376|  1.54k|  out << ")";
 1377|  1.54k|}
_ZN6hobbes12showAsRecordERSoRKSt6vectorINS_6Record6MemberESaIS3_EE:
 1379|     51|void showAsRecord(std::ostream& out, const Record::Members& ms) {
 1380|     51|  if (ms.empty()) {
  ------------------
  |  Branch (1380:7): [True: 0, False: 51]
  ------------------
 1381|      0|    out << "{}";
 1382|     51|  } else {
 1383|     51|    out << "{ ";
 1384|     51|    out << ms[0].field << ":";
 1385|     51|    ms[0].type->show(out);
 1386|    100|    for (size_t i = 1; i < ms.size(); ++i) {
  ------------------
  |  Branch (1386:24): [True: 49, False: 51]
  ------------------
 1387|     49|      out << ", " << ms[i].field << ":";
 1388|     49|      ms[i].type->show(out);
 1389|     49|    }
 1390|     51|    out << " }";
 1391|     51|  }
 1392|     51|}
_ZN6hobbes6Record10showRecordERSoRKSt6vectorINS0_6MemberESaIS3_EE:
 1394|  1.59k|void Record::showRecord(std::ostream& out, const Record::Members& ms) {
 1395|  1.59k|  if (isTupleDesc(ms)) {
  ------------------
  |  Branch (1395:7): [True: 1.54k, False: 51]
  ------------------
 1396|  1.54k|    showAsTuple(out, ms);
 1397|  1.54k|  } else {
 1398|     51|    showAsRecord(out, ms);
 1399|     51|  }
 1400|  1.59k|}
_ZNK6hobbes6Record4showERSo:
 1408|  1.59k|void Record::show(std::ostream& out) const {
 1409|  1.59k|  showRecord(out, this->ms);
 1410|  1.59k|}
_ZNK6hobbes6Record7isTupleEv:
 1412|  3.26k|bool Record::isTuple() const {
 1413|  3.26k|  return isTupleDesc(this->ms);
 1414|  3.26k|}
_ZNK6hobbes6Record6memberERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
 1416|    149|const MonoTypePtr& Record::member(const std::string& mn) const {
 1417|    149|  if (const auto *m = mmember(mn)) {
  ------------------
  |  Branch (1417:19): [True: 149, False: 0]
  ------------------
 1418|    149|    return m->type;
 1419|    149|  }
 1420|       |
 1421|       |  // try to make a helpful error message out of this
 1422|      0|  std::string tdesc = hobbes::show(this);
 1423|      0|  static const size_t truncTyLen = 40;
 1424|      0|  if (tdesc.size() < truncTyLen) {
  ------------------
  |  Branch (1424:7): [True: 0, False: 0]
  ------------------
 1425|      0|    throw std::runtime_error("Field '" + mn + "' does not exist in type: " + tdesc);
 1426|      0|  }
 1427|       |
 1428|      0|  str::seq suggestions = str::closestMatches(mn, selectNames(this->ms), 3);
 1429|      0|  if (suggestions.size() == 1) {
  ------------------
  |  Branch (1429:7): [True: 0, False: 0]
  ------------------
 1430|      0|    throw std::runtime_error("Field '" + mn + "' (did you mean '" + suggestions[0] + "'?) does not exist in type: " + tdesc.substr(0, truncTyLen) + "...");
 1431|      0|  } else if (!suggestions.empty()) {
  ------------------
  |  Branch (1431:14): [True: 0, False: 0]
  ------------------
 1432|      0|    std::ostringstream ss;
 1433|      0|    ss << "Field '" << mn << "' (did you mean one of: '" << suggestions[0] << "'";
 1434|      0|    for (size_t i = 1; i < suggestions.size(); ++i) {
  ------------------
  |  Branch (1434:24): [True: 0, False: 0]
  ------------------
 1435|      0|      ss << ", '" << suggestions[i] << "'";
 1436|      0|    }
 1437|      0|    ss << "?) does not exist in type: " << tdesc.substr(0, truncTyLen) << "...";
 1438|      0|    throw std::runtime_error(ss.str());
 1439|      0|  } else {
 1440|      0|    throw std::runtime_error("Field '" + mn + "' does not exist in type: " + tdesc.substr(0, truncTyLen) + "...");
 1441|      0|  }
 1442|      0|}
_ZNK6hobbes6Record7mmemberERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
 1448|  7.01k|const Record::Member* Record::mmember(const std::string& mn) const {
 1449|  11.5k|  for (const auto &m : this->ms) {
  ------------------
  |  Branch (1449:22): [True: 11.5k, False: 0]
  ------------------
 1450|  11.5k|    if (m.field == mn) {
  ------------------
  |  Branch (1450:9): [True: 7.01k, False: 4.50k]
  ------------------
 1451|  7.01k|      return &m;
 1452|  7.01k|    }
 1453|  11.5k|  }
 1454|      0|  return nullptr;
 1455|  7.01k|}
_ZNK6hobbes6Record7membersEv:
 1457|   151k|const Record::Members& Record::members() const {
 1458|   151k|  return this->ms;
 1459|   151k|}
_ZNK6hobbes6Record14alignedMembersEv:
 1461|     66|const Record::Members& Record::alignedMembers() const {
 1462|     66|  return this->ams;
 1463|     66|}
_ZNK6hobbes6Record12alignedIndexERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
 1465|    127|unsigned int Record::alignedIndex(const std::string& mn) const {
 1466|    127|  return index(this->ams, mn);
 1467|    127|}
_ZNK6hobbes6Record5indexERKSt6vectorINS0_6MemberESaIS2_EERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
 1469|    127|unsigned int Record::index(const Members& ms, const std::string& mn) const {
 1470|    127|  unsigned int k = 0;
 1471|    223|  for (const auto &m : ms) {
  ------------------
  |  Branch (1471:22): [True: 223, False: 0]
  ------------------
 1472|       |    // pretend that we don't see fields with unit type
 1473|       |    //   (they don't make it into the final compiled record anyway)
 1474|    223|    if (m.field == mn) {
  ------------------
  |  Branch (1474:9): [True: 127, False: 96]
  ------------------
 1475|    127|      return k;
 1476|    127|    }
 1477|     96|    if (!isUnit(m.type)) {
  ------------------
  |  Branch (1477:9): [True: 96, False: 0]
  ------------------
 1478|     96|      ++k;
 1479|     96|    }
 1480|     96|  }
 1481|       |
 1482|      0|  throw std::runtime_error("Struct member '" + mn + "' does not exist in " + showRecord(ms));
 1483|    127|}
_ZN6hobbes4Func4makeERKSt10shared_ptrINS_8MonoTypeEES5_:
 1485|  28.9k|MonoTypePtr Func::make(const MonoTypePtr& aty, const MonoTypePtr& rty) {
 1486|  28.9k|  return makeType<FuncMem, Func>(aty, rty);
 1487|  28.9k|}
_ZN6hobbes4FuncC2ERKSt10shared_ptrINS_8MonoTypeEES5_:
 1489|  9.45k|Func::Func(const MonoTypePtr& aty, const MonoTypePtr& rty) : aty(aty), rty(rty) {
 1490|  9.45k|  this->freeTVars = setUnion(aty->freeTVars, rty->freeTVars);
 1491|  9.45k|  this->tgenCount = std::max<int>(aty->tgenCount, rty->tgenCount);
 1492|  9.45k|}
_ZNK6hobbes4Func8argumentEv:
 1494|  40.1k|const MonoTypePtr& Func::argument() const { return this->aty; }
_ZNK6hobbes4Func6resultEv:
 1495|  35.9k|const MonoTypePtr& Func::result() const { return this->rty; }
_ZNK6hobbes4Func10parametersEv:
 1497|  1.85k|MonoTypes Func::parameters() const {
 1498|       |  // simplify multi-argument lookup
 1499|  1.85k|  const Record* arty = is<Record>(this->aty);
 1500|  1.85k|  if ((arty != nullptr) && arty->isTuple()) {
  ------------------
  |  Branch (1500:7): [True: 1.85k, False: 0]
  |  Branch (1500:28): [True: 1.85k, False: 0]
  ------------------
 1501|  1.85k|    return selectTypes(arty->members());
 1502|  1.85k|  } else {
 1503|      0|    return list(this->aty);
 1504|      0|  }
 1505|  1.85k|}
_ZNK6hobbes4Func4showERSo:
 1507|    304|void Func::show(std::ostream& out) const {
 1508|    304|  this->aty->show(out);
 1509|    304|  out << " -> ";
 1510|    304|  this->rty->show(out);
 1511|    304|}
_ZN6hobbes6Exists4makeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_8MonoTypeEE:
 1513|  6.17k|MonoTypePtr Exists::make(const std::string& tname, const MonoTypePtr& bty) {
 1514|  6.17k|  return makeType<ExistsMem, Exists>(tname, bty);
 1515|  6.17k|}
_ZN6hobbes6ExistsC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_8MonoTypeEE:
 1517|    217|Exists::Exists(const std::string& tname, const MonoTypePtr& bty) : tname(tname), bty(bty) {
 1518|    217|  this->freeTVars = setDifference(bty->freeTVars, tname);
 1519|    217|  this->tgenCount = bty->tgenCount;
 1520|    217|}
_ZNK6hobbes6Exists4showERSo:
 1522|    166|void Exists::show(std::ostream& out) const {
 1523|    166|  out << "exists " << this->tname << ".";
 1524|    166|  this->bty->show(out);
 1525|    166|}
_ZNK6hobbes6Exists11absTypeNameB5cxx11Ev:
 1527|  13.0k|const std::string& Exists::absTypeName() const { return this->tname; }
_ZNK6hobbes6Exists7absTypeEv:
 1528|  10.8k|const MonoTypePtr& Exists::absType() const { return this->bty; }
_ZN6hobbes9Recursive4makeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_8MonoTypeEE:
 1531|  6.98k|MonoTypePtr Recursive::make(const std::string& tname, const MonoTypePtr& bty) {
 1532|  6.98k|  return makeType<RecursiveMem, Recursive>(tname, bty);
 1533|  6.98k|}
_ZN6hobbes9RecursiveC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_8MonoTypeEE:
 1535|    191|Recursive::Recursive(const std::string& tname, const MonoTypePtr& bty) : tname(tname), bty(bty) {
 1536|    191|  this->freeTVars = setDifference(bty->freeTVars, tname);
 1537|    191|  this->tgenCount = bty->tgenCount;
 1538|    191|}
_ZNK6hobbes9Recursive4showERSo:
 1540|    225|void Recursive::show(std::ostream& out) const {
 1541|    225|  out << "^" << this->tname << ".";
 1542|    225|  this->bty->show(out);
 1543|    225|}
_ZNK6hobbes9Recursive11recTypeNameB5cxx11Ev:
 1545|  9.36k|const std::string& Recursive::recTypeName() const { return this->tname; }
_ZNK6hobbes9Recursive7recTypeEv:
 1546|  7.81k|const MonoTypePtr& Recursive::recType() const { return this->bty; }
_ZN6hobbes7TString4makeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
 1549|  35.4k|MonoTypePtr TString::make(const std::string& x) {
 1550|  35.4k|  return makeType<TStringMem, TString>(x);
 1551|  35.4k|}
_ZN6hobbes7TStringC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
 1553|    193|TString::TString(const std::string& val) : val(val) {
 1554|    193|}
_ZNK6hobbes7TString4showERSo:
 1556|    301|void TString::show(std::ostream& out) const { out << "'" << this->val << "'"; }
_ZNK6hobbes7TString5valueB5cxx11Ev:
 1557|   370k|const std::string& TString::value() const { return this->val; }
_ZN6hobbes5TLong4makeEl:
 1559|  5.79k|MonoTypePtr TLong::make(long x) {
 1560|  5.79k|  return makeType<TLongMem, TLong>(x);
 1561|  5.79k|}
_ZN6hobbes5TLongC2El:
 1563|     13|TLong::TLong(long x) : x(x) {
 1564|     13|}
_ZNK6hobbes5TLong4showERSo:
 1566|    203|void TLong::show(std::ostream& out) const { out << this->x << "L"; }
_ZNK6hobbes5TLong5valueEv:
 1567|  15.9k|long TLong::value() const { return this->x; }
_ZN6hobbes5TExpr4makeERKSt10shared_ptrINS_4ExprEE:
 1570|    288|MonoTypePtr TExpr::make(const ExprPtr& e) {
 1571|       |  // XXX: a subtle point here -- rather than uniquely identify type-level expressions by expression pointers,
 1572|       |  //      we identify them by _printed_ expression forms, under the assumption that this is adequate to uniquely
 1573|       |  //      identify expressions in the global context (otherwise we'd wind up with a lot of equivalent types
 1574|       |  //      unintentionally interpreted as distinct
 1575|    288|  return
 1576|    288|    std::const_pointer_cast<MonoType>(std::static_pointer_cast<const MonoType>(
 1577|    288|      tctorMaps()->at<TExprMem>().get([e](const std::string&){return new TExpr(e);}, hobbes::show(e))
 1578|    288|    ));
 1579|    288|}
_ZN6hobbes5TExprC2ERKSt10shared_ptrINS_4ExprEE:
 1581|     89|TExpr::TExpr(const ExprPtr& e) : e(e) {
 1582|     89|}
_ZNK6hobbes5TExpr4exprEv:
 1585|  17.8k|const ExprPtr& TExpr::expr() const { return this->e; }
_ZNK6hobbes6walkTy4withEPKNS_4PrimE:
 1590|  3.35k|UnitV walkTy::with(const Prim*        ) const { return unitv; }
_ZNK6hobbes6walkTy4withEPKNS_9OpaquePtrE:
 1591|     32|UnitV walkTy::with(const OpaquePtr*   ) const { return unitv; }
_ZNK6hobbes6walkTy4withEPKNS_4TVarE:
 1592|  5.23k|UnitV walkTy::with(const TVar*        ) const { return unitv; }
_ZNK6hobbes6walkTy4withEPKNS_4TAppE:
 1595|    370|UnitV walkTy::with(const TApp*       v) const { switchOf(v->fn(), *this); for (const auto& a : v->args()) { switchOf(a, *this); } return unitv; }
  ------------------
  |  Branch (1595:94): [True: 370, False: 184]
  ------------------
_ZNK6hobbes6walkTy4withEPKNS_10FixedArrayE:
 1596|     84|UnitV walkTy::with(const FixedArray* v) const { switchOf(v->type(), *this); switchOf(v->length(), *this); return unitv; }
_ZNK6hobbes6walkTy4withEPKNS_5ArrayE:
 1597|  1.71k|UnitV walkTy::with(const Array*      v) const { switchOf(v->type(), *this); return unitv; }
_ZNK6hobbes6walkTy4withEPKNS_7VariantE:
 1598|    610|UnitV walkTy::with(const Variant*    v) const { for (const auto& c : v->members()) { switchOf(c.type, *this); } return unitv; }
  ------------------
  |  Branch (1598:68): [True: 610, False: 305]
  ------------------
_ZNK6hobbes6walkTy4withEPKNS_6RecordE:
 1599|  5.05k|UnitV walkTy::with(const Record*     v) const { for (const auto& f : v->members()) { switchOf(f.type, *this); } return unitv; }
  ------------------
  |  Branch (1599:68): [True: 5.05k, False: 2.46k]
  ------------------
_ZNK6hobbes6walkTy4withEPKNS_4FuncE:
 1600|    570|UnitV walkTy::with(const Func*       v) const { switchOf(v->argument(), *this); switchOf(v->result(), *this); return unitv; }
_ZNK6hobbes6walkTy4withEPKNS_6ExistsE:
 1601|    385|UnitV walkTy::with(const Exists*     v) const { switchOf(v->absType(), *this); return unitv; }
_ZNK6hobbes6walkTy4withEPKNS_9RecursiveE:
 1602|    398|UnitV walkTy::with(const Recursive*  v) const { switchOf(v->recType(), *this); return unitv; }
_ZNK6hobbes6walkTy4withEPKNS_7TStringE:
 1603|    148|UnitV walkTy::with(const TString*     ) const { return unitv; }
_ZNK6hobbes6walkTy4withEPKNS_5TLongE:
 1604|    243|UnitV walkTy::with(const TLong*       ) const { return unitv; }
_ZNK6hobbes10switchTyFn4withEPKNS_4PrimE:
 1607|  22.7k|MonoTypePtr switchTyFn::with(const Prim*       v) const { return Prim::make(v->name(), v->representation()); }
_ZNK6hobbes10switchTyFn4withEPKNS_9OpaquePtrE:
 1608|    394|MonoTypePtr switchTyFn::with(const OpaquePtr*  v) const { return OpaquePtr::make(v->name(), v->size(), v->storedContiguously()); }
_ZNK6hobbes10switchTyFn4withEPKNS_4TVarE:
 1609|  4.72k|MonoTypePtr switchTyFn::with(const TVar*       v) const { return TVar::make(v->name()); }
_ZNK6hobbes10switchTyFn4withEPKNS_4TGenE:
 1610|  8.18k|MonoTypePtr switchTyFn::with(const TGen*       v) const { return TGen::make(v->id()); }
_ZNK6hobbes10switchTyFn4withEPKNS_4TAppE:
 1612|  1.13k|MonoTypePtr switchTyFn::with(const TApp*       v) const { return TApp::make(switchOf(v->fn(), *this), switchOf(v->args(), *this)); }
_ZNK6hobbes10switchTyFn4withEPKNS_10FixedArrayE:
 1613|    587|MonoTypePtr switchTyFn::with(const FixedArray* v) const { return FixedArray::make(switchOf(v->type(), *this), switchOf(v->length(), *this)); }
_ZNK6hobbes10switchTyFn4withEPKNS_5ArrayE:
 1614|  14.0k|MonoTypePtr switchTyFn::with(const Array*      v) const { return Array::make(switchOf(v->type(), *this)); }
_ZNK6hobbes10switchTyFn4withEPKNS_7VariantE:
 1615|  5.90k|MonoTypePtr switchTyFn::with(const Variant*    v) const { return Variant::make(switchOf(v->members(), *this)); }
_ZNK6hobbes10switchTyFn4withEPKNS_6RecordE:
 1616|  32.8k|MonoTypePtr switchTyFn::with(const Record*     v) const { return Record::make(switchOf(v->members(), *this)); }
_ZNK6hobbes10switchTyFn4withEPKNS_4FuncE:
 1617|  15.2k|MonoTypePtr switchTyFn::with(const Func*       v) const { return Func::make(switchOf(v->argument(), *this), switchOf(v->result(), *this)); }
_ZNK6hobbes10switchTyFn4withEPKNS_6ExistsE:
 1618|    903|MonoTypePtr switchTyFn::with(const Exists*     v) const { return Exists::make(v->absTypeName(), switchOf(v->absType(), *this)); }
_ZNK6hobbes10switchTyFn4withEPKNS_9RecursiveE:
 1619|  1.13k|MonoTypePtr switchTyFn::with(const Recursive*  v) const { return Recursive::make(v->recTypeName(), switchOf(v->recType(), *this)); }
_ZNK6hobbes10switchTyFn4withEPKNS_7TStringE:
 1621|    132|MonoTypePtr switchTyFn::with(const TString* v) const { return TString::make(v->value()); }
_ZNK6hobbes10switchTyFn4withEPKNS_5TLongE:
 1622|    189|MonoTypePtr switchTyFn::with(const TLong*   v) const { return TLong::make(v->value()); }
_ZN6hobbes5cloneERKSt10shared_ptrINS_8MonoTypeEE:
 1630|  4.24k|MonoTypePtr clone(const MonoTypePtr& t) { return t; }
_ZN6hobbes5cloneEPKNS_8MonoTypeE:
 1631|      2|MonoTypePtr clone(const MonoType*    t) { return clone(*t); }
_ZN6hobbes5cloneERKNS_8MonoTypeE:
 1652|  1.37k|MonoTypePtr clone(const MonoType& t) { return switchOf(t, cloneF()); }
_ZN6hobbes6clonePERKSt10shared_ptrINS_8QualTypeEE:
 1654|  1.16k|QualTypePtr cloneP(const QualTypePtr& p) {
 1655|  1.16k|  return substitute(MonoTypeSubst(), p);
 1656|  1.16k|}
_ZN6hobbes16mergeConstraintsERKSt6vectorISt10shared_ptrINS_10ConstraintEESaIS3_EES7_:
 1681|  5.15k|Constraints mergeConstraints(const Constraints& lhs, const Constraints& rhs) {
 1682|  5.15k|  Constraints r;
 1683|  5.15k|  mergeConstraints(lhs, &r);
 1684|  5.15k|  mergeConstraints(rhs, &r);
 1685|  5.15k|  return r;
 1686|  5.15k|}
_ZN6hobbes16mergeConstraintsERKSt6vectorISt10shared_ptrINS_10ConstraintEESaIS3_EEPS5_:
 1688|  20.6k|void mergeConstraints(const Constraints& fcs, Constraints* tcs) {
 1689|  20.6k|  for (const auto &fc : fcs) {
  ------------------
  |  Branch (1689:23): [True: 18.4k, False: 20.6k]
  ------------------
 1690|  18.4k|    tcs->push_back(fc);
 1691|  18.4k|  }
 1692|  20.6k|}
_ZN6hobbes9freshNameB5cxx11Ev:
 1700|  20.5k|TVName freshName() {
 1701|  20.5k|  return ".t" + str::from(uidCtr++);
 1702|  20.5k|}
_ZN6hobbes12freshTypeVarEv:
 1712|  18.7k|MonoTypePtr freshTypeVar() {
 1713|  18.7k|  return TVar::make(freshName());
 1714|  18.7k|}
_ZN6hobbes13freshTypeVarsEi:
 1716|  4.11k|MonoTypes freshTypeVars(int vs) {
 1717|  4.11k|  MonoTypes r;
 1718|  12.2k|  for (int i = 0; i < vs; ++i) {
  ------------------
  |  Branch (1718:19): [True: 8.18k, False: 4.11k]
  ------------------
 1719|  8.18k|    r.push_back(freshTypeVar());
 1720|  8.18k|  }
 1721|  4.11k|  return r;
 1722|  4.11k|}
_ZN6hobbes8typeVarsERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS6_EE:
 1753|    259|MonoTypes typeVars(const Names& ns) {
 1754|    259|  MonoTypes r;
 1755|    690|  for (const auto &n : ns) {
  ------------------
  |  Branch (1755:22): [True: 690, False: 259]
  ------------------
 1756|    690|    r.push_back(TVar::make(n));
 1757|    690|  }
 1758|    259|  return r;
 1759|    259|}
_ZN6hobbes5tgensEi:
 1761|  2.86k|MonoTypes tgens(int c) {
 1762|  2.86k|  MonoTypes r;
 1763|  8.89k|  for (int i = 0; i < c; ++i) {
  ------------------
  |  Branch (1763:19): [True: 6.02k, False: 2.86k]
  ------------------
 1764|  6.02k|    r.push_back(TGen::make(i));
 1765|  6.02k|  }
 1766|  2.86k|  return r;
 1767|  2.86k|}
_ZN6hobbes14isMonoSingularERKNS_8MonoTypeE:
 1770|   879k|bool isMonoSingular(const MonoType& mt)    { return mt.freeTVars.empty() && mt.tgenCount == 0; }
  ------------------
  |  Branch (1770:53): [True: 348k, False: 531k]
  |  Branch (1770:77): [True: 305k, False: 42.9k]
  ------------------
_ZN6hobbes14isMonoSingularEPKNS_8MonoTypeE:
 1771|  9.97k|bool isMonoSingular(const MonoType* mt)    { return isMonoSingular(*mt); }
_ZN6hobbes14isMonoSingularERKSt10shared_ptrINS_8MonoTypeEE:
 1772|   866k|bool isMonoSingular(const MonoTypePtr& mt) { return isMonoSingular(*mt); }
_ZN6hobbes8tgenSizeERKSt10shared_ptrINS_8MonoTypeEE:
 1779|    540|int tgenSize(const MonoTypePtr& mt) {
 1780|    540|  return mt->tgenCount;
 1781|    540|}
_ZN6hobbes8tgenSizeERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS3_EE:
 1783|    283|int tgenSize(const MonoTypes& mts) {
 1784|    283|  int x = 0;
 1785|    540|  for (const auto &mt : mts) {
  ------------------
  |  Branch (1785:23): [True: 540, False: 283]
  ------------------
 1786|    540|    x = std::max<int>(x, tgenSize(mt));
 1787|    540|  }
 1788|    283|  return x;
 1789|    283|}
_ZN6hobbes8tgenVarsERKSt10shared_ptrINS_8MonoTypeEE:
 1810|  1.61k|TGenVarSet tgenVars(const MonoTypePtr& mt) {
 1811|  1.61k|  if (isMonoSingular(mt)) {
  ------------------
  |  Branch (1811:7): [True: 174, False: 1.44k]
  ------------------
 1812|    174|    return TGenVarSet();
 1813|  1.44k|  } else {
 1814|  1.44k|    TGenVarSet result;
 1815|  1.44k|    switchOf(mt, tgenVarsF(&result));
 1816|  1.44k|    return result;
 1817|  1.44k|  }
 1818|  1.61k|}
_ZN6hobbes11instantiateEiRKSt10shared_ptrINS_8QualTypeEE:
 1822|  8.64k|QualTypePtr   instantiate(int vs, const QualTypePtr& scheme) { if (vs == 0)                       { return scheme; } else { return instantiate(freshTypeVars(vs), scheme); } }
  ------------------
  |  Branch (1822:68): [True: 5.78k, False: 2.86k]
  ------------------
_ZN6hobbes11instantiateERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS3_EERKS1_INS_8QualTypeEE:
 1828|  2.86k|QualTypePtr instantiate(const MonoTypes& ts, const QualTypePtr& scheme) {
 1829|  2.86k|  return std::make_shared<QualType>(instantiate(ts, scheme->constraints()), instantiate(ts, scheme->monoType()));
 1830|  2.86k|}
_ZN6hobbes11instantiateERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS3_EERKS0_IS1_INS_10ConstraintEESaIS9_EE:
 1832|  2.86k|Constraints instantiate(const MonoTypes& ts, const Constraints& cs) {
 1833|  2.86k|  Constraints r;
 1834|  2.86k|  for (const auto &c : cs) {
  ------------------
  |  Branch (1834:22): [True: 1.92k, False: 2.86k]
  ------------------
 1835|  1.92k|    r.push_back(instantiate(ts, c));
 1836|  1.92k|  }
 1837|  2.86k|  return r;
 1838|  2.86k|}
_ZN6hobbes11instantiateERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS3_EERKS1_INS_10ConstraintEE:
 1840|  16.1k|ConstraintPtr instantiate(const MonoTypes& ts, const ConstraintPtr& c) {
 1841|  16.1k|  return c->instantiate(ts);
 1842|  16.1k|}
_ZN6hobbes11instantiateERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS3_EERKS3_:
 1855|  42.5k|MonoTypePtr instantiate(const MonoTypes& ts, const MonoTypePtr& mt) {
 1856|  42.5k|  if (isMonoSingular(mt)) {
  ------------------
  |  Branch (1856:7): [True: 3.57k, False: 39.0k]
  ------------------
 1857|  3.57k|    return mt;
 1858|  39.0k|  } else {
 1859|  39.0k|    return switchOf(mt, instantiateF(ts));
 1860|  39.0k|  }
 1861|  42.5k|}
_ZN6hobbes11instantiateERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS3_EES7_:
 1863|  16.1k|MonoTypes instantiate(const MonoTypes& ts, const MonoTypes& sts) {
 1864|  16.1k|  MonoTypes result;
 1865|  38.7k|  for (const auto& st : sts) {
  ------------------
  |  Branch (1865:23): [True: 38.7k, False: 16.1k]
  ------------------
 1866|  38.7k|    result.push_back(instantiate(ts, st));
 1867|  38.7k|  }
 1868|  16.1k|  return result;
 1869|  16.1k|}
_ZN6hobbes9tvarNamesB5cxx11ERKSt10shared_ptrINS_8QualTypeEE:
 1878|  1.29k|NameSet tvarNames(const QualTypePtr& qt) {
 1879|  1.29k|  NameSet r;
 1880|  1.29k|  tvarNames(qt, &r);
 1881|  1.29k|  return r;
 1882|  1.29k|}
_ZN6hobbes9tvarNamesB5cxx11ERKSt10shared_ptrINS_10ConstraintEE:
 1890|    290|NameSet tvarNames(const ConstraintPtr& c) {
 1891|    290|  NameSet r;
 1892|    290|  tvarNames(c, &r);
 1893|    290|  return r;
 1894|    290|}
_ZN6hobbes9tvarNamesB5cxx11ERKSt10shared_ptrINS_8MonoTypeEE:
 1896|  23.2k|NameSet tvarNames(const MonoTypePtr& mt) {
 1897|  23.2k|  NameSet r;
 1898|  23.2k|  tvarNames(mt, &r);
 1899|  23.2k|  return r;
 1900|  23.2k|}
_ZN6hobbes9tvarNamesB5cxx11ERKNS_8MonoTypeE:
 1902|  2.87k|NameSet tvarNames(const MonoType& mt) {
 1903|  2.87k|  NameSet r;
 1904|  2.87k|  tvarNames(mt, &r);
 1905|  2.87k|  return r;
 1906|  2.87k|}
_ZN6hobbes9tvarNamesB5cxx11ERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS3_EE:
 1908|  1.18k|NameSet tvarNames(const MonoTypes& mts) {
 1909|  1.18k|  NameSet r;
 1910|  1.18k|  tvarNames(mts, &r);
 1911|  1.18k|  return r;
 1912|  1.18k|}
_ZN6hobbes9tvarNamesERKSt10shared_ptrINS_8QualTypeEEPSt3setINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4lessISB_ESaISB_EE:
 1914|  1.29k|void tvarNames(const QualTypePtr& qt, NameSet* out) {
 1915|  1.29k|  tvarNames(qt->constraints(), out);
 1916|  1.29k|  tvarNames(qt->monoType(), out);
 1917|  1.29k|}
_ZN6hobbes9tvarNamesERKSt6vectorISt10shared_ptrINS_10ConstraintEESaIS3_EEPSt3setINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4lessISE_ESaISE_EE:
 1919|  3.31k|void tvarNames(const Constraints& cs, NameSet* out) {
 1920|  3.31k|  for (const auto &c : cs) {
  ------------------
  |  Branch (1920:22): [True: 3.02k, False: 3.31k]
  ------------------
 1921|  3.02k|    tvarNames(c, out);
 1922|  3.02k|  }
 1923|  3.31k|}
_ZN6hobbes9tvarNamesERKSt10shared_ptrINS_10ConstraintEEPSt3setINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4lessISB_ESaISB_EE:
 1925|  3.31k|void tvarNames(const ConstraintPtr& c, NameSet* out) {
 1926|  3.31k|  NameSet ctvns = c->tvarNames();
 1927|  3.31k|  out->insert(ctvns.begin(), ctvns.end());
 1928|  3.31k|}
_ZN6hobbes9tvarNamesERKSt10shared_ptrINS_8MonoTypeEEPSt3setINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4lessISB_ESaISB_EE:
 1930|  40.5k|void tvarNames(const MonoTypePtr& mt, NameSet* out) {
 1931|  40.5k|  tvarNames(*mt, out);
 1932|  40.5k|}
_ZN6hobbes9tvarNamesERKNS_8MonoTypeEPSt3setINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4lessIS9_ESaIS9_EE:
 1934|  43.3k|void tvarNames(const MonoType& mt, NameSet* out) {
 1935|  43.3k|  out->insert(mt.freeTVars.begin(), mt.freeTVars.end());
 1936|  43.3k|}
_ZN6hobbes9tvarNamesERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS3_EEPSt3setINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4lessISE_ESaISE_EE:
 1938|  6.51k|void tvarNames(const MonoTypes& mts, NameSet* out) {
 1939|  15.9k|  for (const auto& mt : mts) {
  ------------------
  |  Branch (1939:23): [True: 15.9k, False: 6.51k]
  ------------------
 1940|  15.9k|    tvarNames(mt, out);
 1941|  15.9k|  }
 1942|  6.51k|}
_ZN6hobbes16hasFreeVariablesERKSt10shared_ptrINS_8MonoTypeEE:
 1975|  74.3k|bool hasFreeVariables(const MonoTypePtr& mt) {
 1976|  74.3k|  return !isMonoSingular(mt);
 1977|  74.3k|}
_ZN6hobbes16hasFreeVariablesERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS3_EE:
 1997|  46.2k|bool hasFreeVariables(const MonoTypes& mts) {
 1998|  60.0k|  for (const auto &mt : mts) {
  ------------------
  |  Branch (1998:23): [True: 60.0k, False: 7.22k]
  ------------------
 1999|  60.0k|    if (hasFreeVariables(mt)) {
  ------------------
  |  Branch (1999:9): [True: 39.0k, False: 20.9k]
  ------------------
 2000|  39.0k|      return true;
 2001|  39.0k|    }
 2002|  60.0k|  }
 2003|  7.22k|  return false;
 2004|  46.2k|}
_ZN6hobbes10substituteERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEESt4lessIS6_ESaISt4pairIKS6_S9_EEERKS7_INS_8QualTypeEE:
 2032|  24.5k|QualTypePtr substitute(const MonoTypeSubst& s, const QualTypePtr& qt) {
 2033|  24.5k|  return std::make_shared<QualType>(substitute(s, qt->constraints()), substitute(s, qt->monoType()));
 2034|  24.5k|}
_ZN6hobbes10substituteERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEESt4lessIS6_ESaISt4pairIKS6_S9_EEERKSt6vectorIS7_INS_10ConstraintEESaISL_EE:
 2045|  24.6k|Constraints substitute(const MonoTypeSubst& s, const Constraints& cs) {
 2046|  24.6k|  Constraints r;
 2047|  24.6k|  for (const auto &c : cs) {
  ------------------
  |  Branch (2047:22): [True: 8.45k, False: 24.6k]
  ------------------
 2048|  8.45k|    ConstraintPtr sc = substitute(s, c);
 2049|  8.45k|    if (!in(sc, r)) {
  ------------------
  |  Branch (2049:9): [True: 8.44k, False: 15]
  ------------------
 2050|  8.44k|      r.push_back(substitute(s, c));
 2051|  8.44k|    }
 2052|  8.45k|  }
 2053|  24.6k|  return r;
 2054|  24.6k|}
_ZN6hobbes10substituteERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEESt4lessIS6_ESaISt4pairIKS6_S9_EEERKS7_INS_10ConstraintEE:
 2056|  17.1k|ConstraintPtr substitute(const MonoTypeSubst& s, const ConstraintPtr& p) {
 2057|  17.1k|  return p->substitute(s);
 2058|  17.1k|}
_ZN6hobbes14substituteStepERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEESt4lessIS6_ESaISt4pairIKS6_S9_EEERKS9_:
 2132|    185|MonoTypePtr substituteStep(const MonoTypeSubst& s, const MonoTypePtr& mt) {
 2133|    185|  if (isMonoSingular(mt)) {
  ------------------
  |  Branch (2133:7): [True: 0, False: 185]
  ------------------
 2134|      0|    return mt;
 2135|    185|  } else {
 2136|    185|    return switchOf(mt, substituteF(false, s));
 2137|    185|  }
 2138|    185|}
_ZN6hobbes10substituteERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEESt4lessIS6_ESaISt4pairIKS6_S9_EEERKS9_:
 2140|  77.4k|MonoTypePtr substitute(const MonoTypeSubst& s, const MonoTypePtr& mt) {
 2141|  77.4k|  if (isMonoSingular(mt)) {
  ------------------
  |  Branch (2141:7): [True: 28.7k, False: 48.6k]
  ------------------
 2142|  28.7k|    return mt;
 2143|  48.6k|  } else {
 2144|  48.6k|    return switchOf(mt, substituteF(true, s));
 2145|  48.6k|  }
 2146|  77.4k|}
_ZN6hobbes10substituteERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEESt4lessIS6_ESaISt4pairIKS6_S9_EEERKS8_:
 2148|  2.87k|MonoTypePtr substitute(const MonoTypeSubst& s, const MonoType& mt) {
 2149|  2.87k|  if (isMonoSingular(mt)) {
  ------------------
  |  Branch (2149:7): [True: 1.36k, False: 1.50k]
  ------------------
 2150|  1.36k|    return clone(mt);
 2151|  1.50k|  } else {
 2152|  1.50k|    return switchOf(mt, substituteF(true, s));
 2153|  1.50k|  }
 2154|  2.87k|}
_ZN6hobbes10substituteERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEESt4lessIS6_ESaISt4pairIKS6_S9_EEERKSt6vectorIS9_SaIS9_EE:
 2156|  20.7k|MonoTypes substitute(const MonoTypeSubst& s, const MonoTypes& ts) {
 2157|  20.7k|  MonoTypes r;
 2158|  52.3k|  for (const auto &t : ts) {
  ------------------
  |  Branch (2158:22): [True: 52.3k, False: 20.7k]
  ------------------
 2159|  52.3k|    r.push_back(substitute(s, t));
 2160|  52.3k|  }
 2161|  20.7k|  return r;
 2162|  20.7k|}
_ZN6hobbes10generalizeERKSt10shared_ptrINS_8QualTypeEE:
 2165|  1.04k|PolyTypePtr generalize(const QualTypePtr& qt) {
 2166|       |  // these are the free types
 2167|  1.04k|  NameSet fnames = tvarNames(qt);
 2168|       |
 2169|       |  // [(v, TGen i) | (v, i) <- zip vnames [0..]]
 2170|  1.04k|  MonoTypeSubst s;
 2171|  1.04k|  int i = 0;
 2172|  1.80k|  for (const auto &fname : fnames) {
  ------------------
  |  Branch (2172:26): [True: 1.80k, False: 1.04k]
  ------------------
 2173|  1.80k|    s[fname] = TGen::make(i);
 2174|  1.80k|    ++i;
 2175|  1.80k|  }
 2176|       |
 2177|  1.04k|  return std::make_shared<PolyType>(fnames.size(), substitute(s, qt));
 2178|  1.04k|}
_ZN6hobbes13canonicalNameB5cxx11Ei:
 2181|  2.67k|TVName canonicalName(int v) {
 2182|  2.67k|  if (v >= 26) {
  ------------------
  |  Branch (2182:7): [True: 0, False: 2.67k]
  ------------------
 2183|      0|    return "t" + str::from(v - 26);
 2184|  2.67k|  } else {
 2185|  2.67k|    static const char cs[] = "abcdefghijklmnopqrstuvwxyz";
 2186|  2.67k|    return TVName(1, cs[v]);
 2187|  2.67k|  }
 2188|  2.67k|}
_ZN6hobbes18canonicalNameSubstERKSt3setINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4lessIS6_ESaIS6_EE:
 2190|  3.16k|MonoTypeSubst canonicalNameSubst(const NameSet& ns) {
 2191|  3.16k|  MonoTypeSubst r;
 2192|  3.16k|  int v = 0;
 2193|  3.16k|  for (const auto &n : ns) {
  ------------------
  |  Branch (2193:22): [True: 2.67k, False: 3.16k]
  ------------------
 2194|  2.67k|    TVName cn = canonicalName(v);
 2195|       |    // avoid making substitution cycles
 2196|  2.67k|    if (n != cn) {
  ------------------
  |  Branch (2196:9): [True: 2.50k, False: 174]
  ------------------
 2197|  2.50k|      r[n] = TVar::make(cn);
 2198|  2.50k|    }
 2199|  2.67k|    ++v;
 2200|  2.67k|  }
 2201|  3.16k|  return r;
 2202|  3.16k|}
_ZN6hobbes16simplifyVarNamesERKSt10shared_ptrINS_10ConstraintEE:
 2207|    290|ConstraintPtr simplifyVarNames(const ConstraintPtr& c) { return substitute(canonicalNameSubst(tvarNames(c)), c); }
_ZN6hobbes16simplifyVarNamesERKNS_8MonoTypeE:
 2210|  2.87k|MonoTypePtr   simplifyVarNames(const MonoType&      t) { return substitute(canonicalNameSubst(tvarNames(t)), t); }
_ZN6hobbes7repTypeERKSt10shared_ptrINS_8MonoTypeEE:
 2259|    449|MonoTypePtr repType(const MonoTypePtr& t) {
 2260|    449|  if (t->repTypeMemo) {
  ------------------
  |  Branch (2260:7): [True: 2, False: 447]
  ------------------
 2261|      2|    return t->repTypeMemo;
 2262|      2|  }
 2263|    447|  size_t steps = maxRepTypeSteps;
 2264|    447|  MonoTypePtr r = repTypeWithin(t, &steps);
 2265|    447|  if (r.get() != t.get()) {
  ------------------
  |  Branch (2265:7): [True: 6, False: 441]
  ------------------
 2266|      6|    t->repTypeMemo = r;
 2267|      6|  }
 2268|    447|  return r;
 2269|    449|}
_ZN6hobbes11repTypeStepERKSt10shared_ptrINS_8MonoTypeEE:
 2272|      4|MonoTypePtr repTypeStep(const MonoTypePtr& t) {
 2273|      4|  if (const Prim* pt = is<Prim>(t)) {
  ------------------
  |  Branch (2273:19): [True: 4, False: 0]
  ------------------
 2274|      4|    if (pt->representation()) {
  ------------------
  |  Branch (2274:9): [True: 0, False: 4]
  ------------------
 2275|      0|      return pt->representation();
 2276|      0|    }
 2277|      4|  } else if (const TApp* a = is<TApp>(t)) {
  ------------------
  |  Branch (2277:26): [True: 0, False: 0]
  ------------------
 2278|      0|    if (const TAbs* tf = is<TAbs>(repType(a->fn()))) {
  ------------------
  |  Branch (2278:21): [True: 0, False: 0]
  ------------------
 2279|      0|      return substitute(substitution(tf->args(), a->args()), tf->body());
 2280|      0|    }
 2281|      0|  }
 2282|      4|  return t;
 2283|      4|}
_ZN6hobbes6sizeOfERKSt10shared_ptrINS_8MonoTypeEE:
 2428|  27.2k|unsigned int sizeOf(const MonoTypePtr& mt) {
 2429|  27.2k|  if (mt->memorySize == static_cast<unsigned int>(-1)) {
  ------------------
  |  Branch (2429:7): [True: 521, False: 26.7k]
  ------------------
 2430|    521|    mt->memorySize = switchOf(mt, sizeOfF());
 2431|    521|  }
 2432|  27.2k|  return mt->memorySize;
 2433|  27.2k|}
_ZN6hobbes10isPrimNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
 2435|  7.05k|bool isPrimName(const std::string& tn) {
 2436|  7.05k|  static const char* prims[] = {
 2437|       |    /* ::: Set */
 2438|  7.05k|    "unit", "void", "bool", "char", "byte", "short", "int", "long", "int128", "float", "double",
 2439|       |
 2440|       |    /* ::: Set -> Set */
 2441|  7.05k|    "[]", "list", "lseq", "process", "quote", "promise", "connection", "wpipe", "rpipe",
 2442|       |
 2443|       |    /* ::: Set -> Set -> Set */
 2444|  7.05k|    "->", "closure", "fseq", "file"
 2445|  7.05k|  };
 2446|       |  
 2447|   154k|  for (const auto &prim : prims) {
  ------------------
  |  Branch (2447:25): [True: 154k, False: 6.14k]
  ------------------
 2448|   154k|    if (tn == prim) {
  ------------------
  |  Branch (2448:9): [True: 919, False: 153k]
  ------------------
 2449|    919|      return true;
 2450|    919|    }
 2451|   154k|  }
 2452|  6.14k|  return false;
 2453|  7.05k|}
_ZN6hobbes6unrollERKSt10shared_ptrINS_8MonoTypeEE:
 2455|    165|MonoTypePtr unroll(const MonoTypePtr& rty) {
 2456|    165|  if (const Recursive* x = is<Recursive>(rty)) {
  ------------------
  |  Branch (2456:24): [True: 165, False: 0]
  ------------------
 2457|    165|    MonoTypeSubst s;
 2458|    165|    s[x->recTypeName()] = rty;
 2459|    165|    return substituteStep(s, x->recType());
 2460|    165|  } else {
 2461|      0|    throw std::runtime_error("Can't unroll non-recursive type: " + show(rty));
 2462|      0|  }
 2463|    165|}
_ZN6hobbes10isMonotypeERKSt10shared_ptrINS_8QualTypeEE:
 2479|  3.81k|bool isMonotype(const QualTypePtr& qt) {
 2480|  3.81k|  return qt->constraints().empty();
 2481|  3.81k|}
_ZN6hobbes10isMonotypeERKSt10shared_ptrINS_8PolyTypeEE:
 2483|    768|bool isMonotype(const PolyTypePtr& pt) {
 2484|    768|  return pt->typeVariables() == 0 && isMonotype(pt->qualtype());
  ------------------
  |  Branch (2484:10): [True: 281, False: 487]
  |  Branch (2484:38): [True: 281, False: 0]
  ------------------
 2485|    768|}
_ZN6hobbes15requireMonotypeERKSt10shared_ptrINS_8QualTypeEE:
 2487|  3.53k|MonoTypePtr requireMonotype(const QualTypePtr& qt) {
 2488|  3.53k|  if (isMonotype(qt)) {
  ------------------
  |  Branch (2488:7): [True: 3.53k, False: 0]
  ------------------
 2489|  3.53k|    return qt->monoType();
 2490|  3.53k|  } else {
 2491|      0|    throw std::runtime_error("Required monotype but encountered qualified type: " + show(qt));
 2492|      0|  }
 2493|  3.53k|}
_ZN6hobbes12unpackedTypeEPKNS_6ExistsE:
 2512|     11|MonoTypePtr unpackedType(const Exists* ety) {
 2513|     11|  MonoTypeSubst s;
 2514|     11|  s[ety->absTypeName()] = arrayty(primty("char"), 1);
 2515|     11|  return substitute(s, ety->absType());
 2516|     11|}
_ZN6hobbes12unpackedTypeERKSt10shared_ptrINS_8MonoTypeEE:
 2518|      6|MonoTypePtr unpackedType(const MonoTypePtr& mty) {
 2519|      6|  if (const Exists* ety = is<Exists>(mty)) {
  ------------------
  |  Branch (2519:21): [True: 6, False: 0]
  ------------------
 2520|      6|    return unpackedType(ety);
 2521|      6|  } else {
 2522|      0|    return mty;
 2523|      0|  }
 2524|      6|}
_ZN6hobbes12unpackedTypeERKSt10shared_ptrINS_8QualTypeEE:
 2526|      6|QualTypePtr unpackedType(const QualTypePtr& qty) {
 2527|      6|  return qualtype(qty->constraints(), unpackedType(qty->monoType()));
 2528|      6|}
_ZN6hobbes9fileRefTyERKSt10shared_ptrINS_8MonoTypeEES4_:
 3033|     75|MonoTypePtr fileRefTy(const MonoTypePtr& ty, const MonoTypePtr& f) {
 3034|     75|  return TApp::make(primty("fileref", tabs(str::strings("x", "f"), Prim::make("long"))), list(ty, f));
 3035|     75|}
_ZN6hobbes9fileRefTyERKSt10shared_ptrINS_8MonoTypeEE:
 3037|     23|MonoTypePtr fileRefTy(const MonoTypePtr& ty) {
 3038|     23|  return TApp::make(primty("fileref", tabs(str::strings("x"), Prim::make("long"))), list(ty));
 3039|     23|}
type.C:_ZN6hobbesL16computeAlignmentERKSt10shared_ptrINS_8MonoTypeEE:
  514|    142|static unsigned int computeAlignment(const MonoTypePtr& pty) {
  515|    142|  MonoTypePtr ty = repType(pty);
  516|       |
  517|    142|  if (is<Prim>(ty) != nullptr) {
  ------------------
  |  Branch (517:7): [True: 15, False: 127]
  ------------------
  518|     15|    if (isUnit(ty)) {
  ------------------
  |  Branch (518:9): [True: 2, False: 13]
  ------------------
  519|      2|      return 1;
  520|     13|    } else {
  521|     13|      return sizeOf(ty);
  522|     13|    }
  523|    127|  } else if (const Variant* vf = is<Variant>(ty)) {
  ------------------
  |  Branch (523:29): [True: 21, False: 106]
  ------------------
  524|     21|    if (vf->payloadOffset() == sizeof(int)) {
  ------------------
  |  Branch (524:9): [True: 3, False: 18]
  ------------------
  525|      3|      return sizeof(int);
  526|     18|    } else {
  527|     18|      return sizeof(void*);
  528|     18|    }
  529|    106|  } else if (const FixedArray* farr = is<FixedArray>(ty)) {
  ------------------
  |  Branch (529:32): [True: 6, False: 100]
  ------------------
  530|      6|    return alignment(farr->type());
  531|    100|  } else if ((is<OpaquePtr>(ty) != nullptr) || (is<Array>(ty) != nullptr) || (is<Func>(ty) != nullptr)) {
  ------------------
  |  Branch (531:14): [True: 8, False: 92]
  |  Branch (531:48): [True: 12, False: 80]
  |  Branch (531:78): [True: 37, False: 43]
  ------------------
  532|     57|    return sizeof(void*);
  533|     57|  } else if (const Record* rty = is<Record>(ty)) {
  ------------------
  |  Branch (533:28): [True: 29, False: 14]
  ------------------
  534|     29|    size_t a = 1;
  535|     69|    for (const auto& f : rty->members()) {
  ------------------
  |  Branch (535:24): [True: 69, False: 29]
  ------------------
  536|     69|      a = std::max<unsigned int>(a, alignment(f.type));
  537|     69|    }
  538|     29|    return a;
  539|     29|  } else if (is<Recursive>(ty) != nullptr) {
  ------------------
  |  Branch (539:14): [True: 2, False: 12]
  ------------------
  540|      2|    return sizeof(void*);
  541|     12|  } else if (isFileRef(ty)) {
  ------------------
  |  Branch (541:14): [True: 0, False: 12]
  ------------------
  542|      0|    return sizeof(uint64_t);
  543|     12|  } else {
  544|     12|    return 1;
  545|     12|  }
  546|    142|}
_ZN6hobbes12isHiddenCtorERKNS_7Variant6MemberE:
  790|    494|inline bool isHiddenCtor(const Variant::Member& m) {
  791|    494|  return isHiddenCtorName(m.selector);
  792|    494|}
type.C:_ZZN6hobbes8showFullERKSt6vectorINS_7Variant6MemberESaIS2_EERSoENK3$_0clEv:
  878|     44|    const bool discrete = [s = std::next(ms.cbegin(), i), e = ms.cend()] {
  879|       |      // not start from zero or not continous
  880|     44|      return s->id != 0 ||
  ------------------
  |  Branch (880:14): [True: 0, False: 44]
  ------------------
  881|     44|             std::adjacent_find(s, e, [](const auto &a, const auto &b) {
  ------------------
  |  Branch (881:14): [True: 0, False: 44]
  ------------------
  882|     44|               return !((a.id < b.id) && (a.id + 1 == b.id));
  883|     44|             }) != e;
  884|     44|    }();
type.C:_ZZZN6hobbes8showFullERKSt6vectorINS_7Variant6MemberESaIS2_EERSoENK3$_0clEvENKUlRKT_RKT0_E_clIS2_S2_EEDaSB_SE_:
  881|     44|             std::adjacent_find(s, e, [](const auto &a, const auto &b) {
  882|     44|               return !((a.id < b.id) && (a.id + 1 == b.id));
  ------------------
  |  Branch (882:25): [True: 44, False: 0]
  |  Branch (882:42): [True: 44, False: 0]
  ------------------
  883|     44|             }) != e;
type.C:_ZZN6hobbes8showFullERKSt6vectorINS_7Variant6MemberESaIS2_EERSoENK3$_1clERKS2_:
  885|     88|    const auto showPayload = [&out, discrete](const Variant::Member &m) {
  886|     88|      out << m.selector;
  887|     88|      if (discrete) {
  ------------------
  |  Branch (887:11): [True: 0, False: 88]
  ------------------
  888|      0|        out << '(' << m.id << ')';
  889|      0|      }
  890|     88|      showFullVarPayloadSuffix(m.type, out);
  891|     88|    };
_ZN6hobbes16isHiddenCtorNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  787|  3.17k|inline bool isHiddenCtorName(const std::string& n) {
  788|  3.17k|  return n.substr(0,2) == ".p";
  789|  3.17k|}
_ZN6hobbes17isHiddenFieldNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
 1076|  21.9k|inline bool isHiddenFieldName(const std::string& fn) {
 1077|  21.9k|  return fn.substr(0,2) == ".p";
 1078|  21.9k|}
type.C:_ZN6hobbesL17resetFieldOffsetsEPSt6vectorINS_6Record6MemberESaIS2_EE:
 1115|     11|static void resetFieldOffsets(Record::Members* ms) {
 1116|     11|  for (auto &m : *ms) {
  ------------------
  |  Branch (1116:16): [True: 11, False: 11]
  ------------------
 1117|     11|    m.offset = -1;
 1118|     11|  }
 1119|     11|}
type.C:_ZN6hobbesL20normalizeTupleFieldsEPSt6vectorINS_6Record6MemberESaIS2_EE:
 1138|     11|static void normalizeTupleFields(Record::Members* ms) {
 1139|     11|  size_t i = 0;
 1140|     11|  for (auto &m : *ms) {
  ------------------
  |  Branch (1140:16): [True: 11, False: 11]
  ------------------
 1141|     11|    if (m.field.substr(0, 2) != ".p") {
  ------------------
  |  Branch (1141:9): [True: 11, False: 0]
  ------------------
 1142|     11|      m.field = ".f" + str::from(i++);
 1143|     11|    }
 1144|     11|  }
 1145|     11|}
type.C:_ZN6hobbesL19representableOffsetEl:
 1204|  28.6k|static bool representableOffset(long o) { return o >= 0 && o <= maxRecordOffset; }
  ------------------
  |  Branch (1204:50): [True: 28.6k, False: 0]
  |  Branch (1204:60): [True: 28.6k, False: 0]
  ------------------
_ZN6hobbes9addoffsetERKNS_6Record6MemberEi:
 1072|  12.8k|inline Record::Member addoffset(const Record::Member& m, int o) {
 1073|  12.8k|  return Record::Member(m.field, m.type, o);
 1074|  12.8k|}
_ZNK6hobbes6cloneF4withEPKNS_4PrimE:
 1634|    349|  MonoTypePtr with(const Prim*       v) const override { return Prim::make(v->name(), v->representation()); }
_ZNK6hobbes6cloneF4withEPKNS_9OpaquePtrE:
 1635|     42|  MonoTypePtr with(const OpaquePtr*  v) const override { return OpaquePtr::make(v->name(), v->size(), v->storedContiguously()); }
_ZNK6hobbes6cloneF4withEPKNS_4TAppE:
 1639|      2|  MonoTypePtr with(const TApp*       v) const override { return TApp::make(v->fn(), v->args()); }
_ZNK6hobbes6cloneF4withEPKNS_5ArrayE:
 1641|    334|  MonoTypePtr with(const Array*      v) const override { return Array::make(v->type()); }
_ZNK6hobbes6cloneF4withEPKNS_7VariantE:
 1642|     11|  MonoTypePtr with(const Variant*    v) const override { return Variant::make(v->members()); }
_ZNK6hobbes6cloneF4withEPKNS_6RecordE:
 1643|    149|  MonoTypePtr with(const Record*     v) const override { return Record::make(v->members()); }
_ZNK6hobbes6cloneF4withEPKNS_4FuncE:
 1644|      1|  MonoTypePtr with(const Func*       v) const override { return Func::make(v->argument(), v->result()); }
_ZNK6hobbes6cloneF4withEPKNS_6ExistsE:
 1645|     32|  MonoTypePtr with(const Exists*     v) const override { return Exists::make(v->absTypeName(), v->absType()); }
_ZNK6hobbes6cloneF4withEPKNS_7TStringE:
 1648|    286|  MonoTypePtr with(const TString* v) const override { return TString::make(v->value()); }
_ZNK6hobbes6cloneF4withEPKNS_5TLongE:
 1649|    165|  MonoTypePtr with(const TLong*   v) const override { return TLong::make(v->value()); }
_ZN6hobbes9tgenVarsFC2EPSt3setIiSt4lessIiESaIiEE:
 1802|  1.44k|  tgenVarsF(TGenVarSet* s) : s(s) { }
_ZNK6hobbes9tgenVarsF4withEPKNS_4TGenE:
 1804|  1.72k|  UnitV with(const TGen* v) const override {
 1805|  1.72k|    this->s->insert(v->id());
 1806|  1.72k|    return unitv;
 1807|  1.72k|  }
_ZN6hobbes12instantiateFC2ERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS4_EE:
 1846|  39.0k|  instantiateF(const MonoTypes& ts) : ts(ts) { }
_ZNK6hobbes12instantiateF4withEPKNS_4TGenE:
 1848|  50.5k|  MonoTypePtr with(const TGen* v) const override {
 1849|  50.5k|    return MonoTypePtr(this->ts[v->id()]);
 1850|  50.5k|  }
_ZN6hobbes2inERKSt10shared_ptrINS_10ConstraintEERKSt6vectorIS2_SaIS2_EE:
 2036|  8.45k|inline bool in(const ConstraintPtr& c, const Constraints& cs) {
 2037|  9.18k|  for (const auto &ci : cs) {
  ------------------
  |  Branch (2037:23): [True: 9.18k, False: 8.44k]
  ------------------
 2038|  9.18k|    if (*c == *ci) {
  ------------------
  |  Branch (2038:9): [True: 15, False: 9.17k]
  ------------------
 2039|     15|      return true;
 2040|     15|    }
 2041|  9.18k|  }
 2042|  8.44k|  return false;
 2043|  8.45k|}
_ZN6hobbes11substituteFC2EbRKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_8MonoTypeEESt4lessIS7_ESaISt4pairIKS7_SA_EEE:
 2062|  50.3k|  substituteF(bool transitive, const MonoTypeSubst& s) : transitive(transitive), s(s) { }
_ZNK6hobbes11substituteF4withEPKNS_4TVarE:
 2064|  95.7k|  MonoTypePtr with(const TVar* v) const override {
 2065|  95.7k|    auto si = this->s.find(v->name());
 2066|  95.7k|    if (si != this->s.end()) {
  ------------------
  |  Branch (2066:9): [True: 26.7k, False: 68.9k]
  ------------------
 2067|  26.7k|      if (this->transitive) {
  ------------------
  |  Branch (2067:11): [True: 26.5k, False: 188]
  ------------------
 2068|       |        // a substitution can be cyclic ('a' |-> 'a', or 'a' |-> 'b' with 'b' |-> 'a'),
 2069|       |        // in which case it has no fixed point to reach -- unification avoids producing
 2070|       |        // one, but a substitution derived from decoded type data can be cyclic, and
 2071|       |        // expanding a variable already under expansion would never terminate
 2072|  26.5k|        if (expanding(v->name())) {
  ------------------
  |  Branch (2072:13): [True: 0, False: 26.5k]
  ------------------
 2073|      0|          return TVar::make(v->name());
 2074|      0|        }
 2075|  26.5k|        expansion e(this, v->name());
 2076|  26.5k|        return switchOf(si->second, *this);
 2077|  26.5k|      } else {
 2078|    188|        return si->second;
 2079|    188|      }
 2080|  68.9k|    } else {
 2081|  68.9k|      return TVar::make(v->name());
 2082|  68.9k|    }
 2083|  95.7k|  }
_ZNK6hobbes11substituteF9expandingERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
 2122|  26.5k|  bool expanding(const std::string& n) const {
 2123|  26.5k|    for (const expansion* e = this->expansions; e != nullptr; e = e->next) {
  ------------------
  |  Branch (2123:49): [True: 15, False: 26.5k]
  ------------------
 2124|     15|      if (e->n == n) {
  ------------------
  |  Branch (2124:11): [True: 0, False: 15]
  ------------------
 2125|      0|        return true;
 2126|      0|      }
 2127|     15|    }
 2128|  26.5k|    return false;
 2129|  26.5k|  }
_ZN6hobbes11substituteF9expansionC2EPKS0_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
 2111|  26.5k|    expansion(const substituteF* f, const std::string& n) : f(f), n(n), next(f->expansions) { f->expansions = this; }
_ZN6hobbes11substituteF9expansionD2Ev:
 2112|  26.5k|    ~expansion() { this->f->expansions = this->next; }
_ZNK6hobbes11substituteF4withEPKNS_6ExistsE:
 2085|  2.60k|  MonoTypePtr with(const Exists* v) const override {
 2086|  2.60k|    if (this->s.find(v->absTypeName()) == this->s.end()) {
  ------------------
  |  Branch (2086:9): [True: 2.60k, False: 0]
  ------------------
 2087|  2.60k|      return Exists::make(v->absTypeName(), switchOf(v->absType(), *this));
 2088|  2.60k|    } else {
 2089|      0|      MonoTypeSubst cuts = this->s;
 2090|      0|      cuts.erase(v->absTypeName());
 2091|      0|      return Exists::make(v->absTypeName(), switchOf(v->absType(), substituteF(this->transitive, cuts)));
 2092|      0|    }
 2093|  2.60k|  }
_ZNK6hobbes11substituteF4withEPKNS_9RecursiveE:
 2095|  1.95k|  MonoTypePtr with(const Recursive* v) const override {
 2096|  1.95k|    if (this->s.find(v->recTypeName()) == this->s.end()) {
  ------------------
  |  Branch (2096:9): [True: 1.95k, False: 0]
  ------------------
 2097|  1.95k|      return Recursive::make(v->recTypeName(), switchOf(v->recType(), *this));
 2098|  1.95k|    } else {
 2099|      0|      MonoTypeSubst cuts = this->s;
 2100|      0|      cuts.erase(v->recTypeName());
 2101|      0|      return Recursive::make(v->recTypeName(), switchOf(v->recType(), substituteF(this->transitive, cuts)));
 2102|      0|    }
 2103|  1.95k|  }
type.C:_ZN6hobbesL13repTypeWithinERKSt10shared_ptrINS_8MonoTypeEEPm:
 2226|    450|static MonoTypePtr repTypeWithin(const MonoTypePtr& ty, size_t* steps) {
 2227|    450|  MonoTypePtr t = ty;
 2228|       |
 2229|    458|  while (true) {
  ------------------
  |  Branch (2229:10): [True: 458, Folded]
  ------------------
 2230|    458|    if (*steps == 0) {
  ------------------
  |  Branch (2230:9): [True: 0, False: 458]
  ------------------
 2231|      0|      throw std::runtime_error("Type-level application does not reduce: " + show(ty));
 2232|      0|    }
 2233|    458|    --*steps;
 2234|       |
 2235|    458|    if (const Prim* pt = is<Prim>(t)) {
  ------------------
  |  Branch (2235:21): [True: 176, False: 282]
  ------------------
 2236|    176|      if (pt->representation()) {
  ------------------
  |  Branch (2236:11): [True: 6, False: 170]
  ------------------
 2237|      6|        t = pt->representation();
 2238|      6|        continue;
 2239|      6|      }
 2240|    282|    } else if (const TApp* a = is<TApp>(t)) {
  ------------------
  |  Branch (2240:28): [True: 3, False: 279]
  ------------------
 2241|      3|      if (const TAbs* tf = is<TAbs>(repTypeWithin(a->fn(), steps))) {
  ------------------
  |  Branch (2241:23): [True: 2, False: 1]
  ------------------
 2242|      2|        t = substitute(substitution(tf->args(), a->args()), tf->body());
 2243|      2|        continue;
 2244|      2|      }
 2245|      3|    }
 2246|    450|    return t;
 2247|    458|  }
 2248|    450|}
_ZNK6hobbes7sizeOfF4withEPKNS_4PrimE:
 2292|     15|  nat with(const Prim* v) const override {
 2293|     15|    if (v->representation()) {
  ------------------
  |  Branch (2293:9): [True: 4, False: 11]
  ------------------
 2294|      4|      return r(v->representation());
 2295|     11|    } else {
 2296|     11|      return withPrim(v->name());
 2297|     11|    }
 2298|     15|  }
_ZNK6hobbes7sizeOfF1rERKSt10shared_ptrINS_8MonoTypeEE:
 2406|     13|  unsigned int r(const MonoTypePtr& t) const {
 2407|     13|    if (t->memorySize == static_cast<unsigned int>(-1)) {
  ------------------
  |  Branch (2407:9): [True: 1, False: 12]
  ------------------
 2408|      1|      t->memorySize = switchOf(t, *this);
 2409|      1|    }
 2410|     13|    return t->memorySize;
 2411|     13|  }
_ZNK6hobbes7sizeOfF8withPrimERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
 2378|     11|  nat withPrim(const std::string& pn) const {
 2379|     11|    if (pn == "unit") {
  ------------------
  |  Branch (2379:9): [True: 1, False: 10]
  ------------------
 2380|      1|      return 0;
 2381|     10|    } else if (pn == "bool") {
  ------------------
  |  Branch (2381:16): [True: 1, False: 9]
  ------------------
 2382|      1|      return 1;
 2383|      9|    } else if (pn == "char") {
  ------------------
  |  Branch (2383:16): [True: 1, False: 8]
  ------------------
 2384|      1|      return 1;
 2385|      8|    } else if (pn == "byte") {
  ------------------
  |  Branch (2385:16): [True: 1, False: 7]
  ------------------
 2386|      1|      return 1;
 2387|      7|    } else if (pn == "short") {
  ------------------
  |  Branch (2387:16): [True: 1, False: 6]
  ------------------
 2388|      1|      return sizeof(short);
 2389|      6|    } else if (pn == "int") {
  ------------------
  |  Branch (2389:16): [True: 1, False: 5]
  ------------------
 2390|      1|      return sizeof(int);
 2391|      5|    } else if (pn == "long") {
  ------------------
  |  Branch (2391:16): [True: 1, False: 4]
  ------------------
 2392|      1|      return sizeof(long);
 2393|      4|    } else if (pn == "int128") {
  ------------------
  |  Branch (2393:16): [True: 1, False: 3]
  ------------------
 2394|      1|      return sizeof(int128_t);
 2395|      3|    } else if (pn == "float") {
  ------------------
  |  Branch (2395:16): [True: 1, False: 2]
  ------------------
 2396|      1|      return sizeof(float);
 2397|      2|    } else if (pn == "double") {
  ------------------
  |  Branch (2397:16): [True: 1, False: 1]
  ------------------
 2398|      1|      return sizeof(double);
 2399|      1|    } else if (pn == "void") {
  ------------------
  |  Branch (2399:16): [True: 1, False: 0]
  ------------------
 2400|      1|      return 0; // <-- this should be harmless since you can't make one of these anyway
 2401|      1|    } else {
 2402|      0|      throw std::runtime_error("Can't determine size of unknown primitive type: " + pn);
 2403|      0|    }
 2404|     11|  }
_ZNK6hobbes7sizeOfF4withEPKNS_9OpaquePtrE:
 2300|      8|  nat with(const OpaquePtr*  v) const override { return v->storedContiguously() ? v->size() : sizeof(void*); }
  ------------------
  |  Branch (2300:57): [True: 0, False: 8]
  ------------------
_ZNK6hobbes7sizeOfF4withEPKNS_4TVarE:
 2301|     86|  [[noreturn]] nat with(const TVar*       v) const override { throw std::runtime_error("Can't determine size of type variable '" + v->name() + "'"); }
_ZNK6hobbes7sizeOfF4withEPKNS_4TAppE:
 2330|      3|  nat with(const TApp* v) const override {
 2331|       |    // uncurry type function applications
 2332|      3|    while (const TApp* lv = is<TApp>(v->fn())) {
  ------------------
  |  Branch (2332:24): [True: 0, False: 3]
  ------------------
 2333|      0|      v = lv;
 2334|      0|    }
 2335|       |
 2336|       |    // TODO: replace this with TApp/TFn application
 2337|      3|    if (const Prim* f = is<Prim>(v->fn())) {
  ------------------
  |  Branch (2337:21): [True: 3, False: 0]
  ------------------
 2338|      3|      if (f->name() == "->") {
  ------------------
  |  Branch (2338:11): [True: 0, False: 3]
  ------------------
 2339|      0|        return sizeof(void*);
 2340|      3|      } else if (f->name() == "closure") {
  ------------------
  |  Branch (2340:18): [True: 0, False: 3]
  ------------------
 2341|      0|        return sizeof(void*);
 2342|      3|      } else if (f->name() == "[]") {
  ------------------
  |  Branch (2342:18): [True: 0, False: 3]
  ------------------
 2343|      0|        return sizeof(void*);
 2344|      3|      } else if (f->name() == "list") {
  ------------------
  |  Branch (2344:18): [True: 0, False: 3]
  ------------------
 2345|      0|        return sizeof(void*);
 2346|      3|      } else if (f->name() == "fseq") {
  ------------------
  |  Branch (2346:18): [True: 0, False: 3]
  ------------------
 2347|      0|        return sizeof(long);
 2348|      3|      } else if (f->name() == "lseq") {
  ------------------
  |  Branch (2348:18): [True: 0, False: 3]
  ------------------
 2349|      0|        return sizeof(void*);
 2350|      3|      } else if (f->name() == "file") {
  ------------------
  |  Branch (2350:18): [True: 1, False: 2]
  ------------------
 2351|      1|        return sizeof(long);
 2352|      2|      } else if (f->name() == "process") {
  ------------------
  |  Branch (2352:18): [True: 0, False: 2]
  ------------------
 2353|      0|        return sizeof(long);
 2354|      2|      } else if (f->name() == "connection") {
  ------------------
  |  Branch (2354:18): [True: 0, False: 2]
  ------------------
 2355|      0|        return 0;
 2356|      2|      } else if (f->name() == "quote") {
  ------------------
  |  Branch (2356:18): [True: 0, False: 2]
  ------------------
 2357|      0|        return 0;
 2358|      2|      } else if (f->name() == "promise") {
  ------------------
  |  Branch (2358:18): [True: 0, False: 2]
  ------------------
 2359|      0|        return sizeof(long);
 2360|      2|      } else if (is<TAbs>(f->representation()) != nullptr) {
  ------------------
  |  Branch (2360:18): [True: 2, False: 0]
  ------------------
 2361|       |        // reduce to a normal form first: recurring on a single reduction step
 2362|       |        // would not terminate for an application that has no normal form
 2363|      2|        MonoTypePtr app = clone(v);
 2364|      2|        MonoTypePtr rty = repType(app);
 2365|      2|        if (rty != app) {
  ------------------
  |  Branch (2365:13): [True: 2, False: 0]
  ------------------
 2366|      2|          return r(rty);
 2367|      2|        }
 2368|      2|      }
 2369|      3|    }
 2370|      0|    throw std::runtime_error("Can't determine size of monotype: " + show(v));
 2371|      3|  }
_ZNK6hobbes7sizeOfF4withEPKNS_10FixedArrayE:
 2303|      7|  nat with(const FixedArray* v) const override {
 2304|       |    // the length is part of a type description that can be read from a file or
 2305|       |    // handed over by an untrusted peer, and the size is returned as a 'nat', so
 2306|       |    // a length that cannot describe a value in memory has to be rejected rather
 2307|       |    // than multiplied out into a wrapped-around answer
 2308|      7|    const long len = v->requireLength();
 2309|      7|    if (len < 0) {
  ------------------
  |  Branch (2309:9): [True: 0, False: 7]
  ------------------
 2310|      0|      throw std::runtime_error("Can't determine size of array of negative length: " + show(v));
 2311|      0|    }
 2312|       |
 2313|      7|    const nat esz = r(v->type());
 2314|      7|    if (esz != 0 && static_cast<unsigned long>(len) > (std::numeric_limits<nat>::max() / esz)) {
  ------------------
  |  Branch (2314:9): [True: 7, False: 0]
  |  Branch (2314:21): [True: 0, False: 7]
  ------------------
 2315|      0|      throw std::runtime_error("Array size exceeds the maximum representable type size: " + show(v));
 2316|      0|    }
 2317|      7|    return static_cast<nat>(esz * static_cast<unsigned long>(len));
 2318|      7|  }
_ZNK6hobbes7sizeOfF4withEPKNS_5ArrayE:
 2319|     14|  nat with(const Array*       ) const override { return sizeof(void*); }
_ZNK6hobbes7sizeOfF4withEPKNS_7VariantE:
 2320|     27|  nat with(const Variant*    v) const override { return rv(v); }
_ZNK6hobbes7sizeOfF2rvEPKNS_7VariantE:
 2420|     27|  unsigned int rv(const Variant* t) const {
 2421|     27|    if (t->memorySize == static_cast<unsigned int>(-1)) {
  ------------------
  |  Branch (2421:9): [True: 27, False: 0]
  ------------------
 2422|     27|      t->memorySize = t->size();
 2423|     27|    }
 2424|     27|    return t->memorySize;
 2425|     27|  }
_ZNK6hobbes7sizeOfF4withEPKNS_6RecordE:
 2321|     37|  nat with(const Record*     v) const override { return rv(v); }
_ZNK6hobbes7sizeOfF2rvEPKNS_6RecordE:
 2413|     37|  unsigned int rv(const Record* t) const {
 2414|     37|    if (t->memorySize == static_cast<unsigned int>(-1)) {
  ------------------
  |  Branch (2414:9): [True: 37, False: 0]
  ------------------
 2415|     37|      t->memorySize = t->size();
 2416|     37|    }
 2417|     37|    return t->memorySize;
 2418|     37|  }
_ZNK6hobbes7sizeOfF4withEPKNS_4FuncE:
 2322|    312|  nat with(const Func*        ) const override { return sizeof(void*); }
_ZNK6hobbes7sizeOfF4withEPKNS_6ExistsE:
 2323|      5|  nat with(const Exists*      ) const override { return sizeof(void*); }
_ZNK6hobbes7sizeOfF4withEPKNS_9RecursiveE:
 2324|      2|  nat with(const Recursive*   ) const override { return sizeof(void*); }
_ZNK6hobbes7sizeOfF4withEPKNS_7TStringE:
 2374|      6|  nat with(const TString* ) const override { return 0; }
_ZN6hobbes5showTINS_8QualTypeEEENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKT_:
   24|    161|  std::string showT(const T& t) {
   25|    161|    std::ostringstream ss;
   26|    161|    t.show(ss);
   27|    161|    return ss.str();
   28|    161|  }
_ZN6hobbes5showTINS_8MonoTypeEEENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKT_:
   24|  2.87k|  std::string showT(const T& t) {
   25|  2.87k|    std::ostringstream ss;
   26|  2.87k|    t.show(ss);
   27|  2.87k|    return ss.str();
   28|  2.87k|  }
_ZN6hobbes8MonoType8makeTypeINS_15unique_refc_mapIKNS_4PrimEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrIS0_EEEES3_JSA_SC_EEESC_DpRKT1_:
  605|  36.2k|  MonoTypePtr MonoType::makeType(const Args&... args) {
  606|  36.2k|    return
  607|  36.2k|      std::const_pointer_cast<MonoType>(std::static_pointer_cast<const MonoType>(
  608|  36.2k|        tctorMaps()->at<Class>().get(
  609|  36.2k|          [](const Args&... nargs) { return new T(nargs...); },
  610|  36.2k|          args...
  611|  36.2k|        )
  612|  36.2k|      ));
  613|  36.2k|  }
_ZZN6hobbes8MonoType8makeTypeINS_15unique_refc_mapIKNS_4PrimEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrIS0_EEEES3_JSA_SC_EEESC_DpRKT1_ENKUlRKSA_RKSC_E_clESJ_SL_:
  609|     38|          [](const Args&... nargs) { return new T(nargs...); },
_ZN6hobbes8MonoType8makeTypeINS_15unique_refc_mapIKNS_9OpaquePtrEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEjbEEES3_JSA_jbEEESt10shared_ptrIS0_EDpRKT1_:
  605|    634|  MonoTypePtr MonoType::makeType(const Args&... args) {
  606|    634|    return
  607|    634|      std::const_pointer_cast<MonoType>(std::static_pointer_cast<const MonoType>(
  608|    634|        tctorMaps()->at<Class>().get(
  609|    634|          [](const Args&... nargs) { return new T(nargs...); },
  610|    634|          args...
  611|    634|        )
  612|    634|      ));
  613|    634|  }
_ZZN6hobbes8MonoType8makeTypeINS_15unique_refc_mapIKNS_9OpaquePtrEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEjbEEES3_JSA_jbEEESt10shared_ptrIS0_EDpRKT1_ENKUlRKSA_RKjRKbE_clESJ_SL_SN_:
  609|      9|          [](const Args&... nargs) { return new T(nargs...); },
_ZN6hobbes8MonoType8makeTypeINS_15unique_refc_mapIKNS_4TVarEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEES3_JSA_EEESt10shared_ptrIS0_EDpRKT1_:
  605|   179k|  MonoTypePtr MonoType::makeType(const Args&... args) {
  606|   179k|    return
  607|   179k|      std::const_pointer_cast<MonoType>(std::static_pointer_cast<const MonoType>(
  608|   179k|        tctorMaps()->at<Class>().get(
  609|   179k|          [](const Args&... nargs) { return new T(nargs...); },
  610|   179k|          args...
  611|   179k|        )
  612|   179k|      ));
  613|   179k|  }
_ZZN6hobbes8MonoType8makeTypeINS_15unique_refc_mapIKNS_4TVarEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEES3_JSA_EEESt10shared_ptrIS0_EDpRKT1_ENKUlRKSA_E_clESJ_:
  609|  19.0k|          [](const Args&... nargs) { return new T(nargs...); },
_ZN6hobbes8MonoType8makeTypeINS_15unique_refc_mapIKNS_4TGenEJiEEES3_JiEEESt10shared_ptrIS0_EDpRKT1_:
  605|  19.5k|  MonoTypePtr MonoType::makeType(const Args&... args) {
  606|  19.5k|    return
  607|  19.5k|      std::const_pointer_cast<MonoType>(std::static_pointer_cast<const MonoType>(
  608|  19.5k|        tctorMaps()->at<Class>().get(
  609|  19.5k|          [](const Args&... nargs) { return new T(nargs...); },
  610|  19.5k|          args...
  611|  19.5k|        )
  612|  19.5k|      ));
  613|  19.5k|  }
_ZZN6hobbes8MonoType8makeTypeINS_15unique_refc_mapIKNS_4TGenEJiEEES3_JiEEESt10shared_ptrIS0_EDpRKT1_ENKUlRKiE_clESD_:
  609|     34|          [](const Args&... nargs) { return new T(nargs...); },
_ZN6hobbes8MonoType8makeTypeINS_15unique_refc_mapIKNS_4TAbsEJSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EESt10shared_ptrIS0_EEEES3_JSD_SF_EEESF_DpRKT1_:
  605|    110|  MonoTypePtr MonoType::makeType(const Args&... args) {
  606|    110|    return
  607|    110|      std::const_pointer_cast<MonoType>(std::static_pointer_cast<const MonoType>(
  608|    110|        tctorMaps()->at<Class>().get(
  609|    110|          [](const Args&... nargs) { return new T(nargs...); },
  610|    110|          args...
  611|    110|        )
  612|    110|      ));
  613|    110|  }
_ZZN6hobbes8MonoType8makeTypeINS_15unique_refc_mapIKNS_4TAbsEJSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EESt10shared_ptrIS0_EEEES3_JSD_SF_EEESF_DpRKT1_ENKUlRKSD_RKSF_E_clESM_SO_:
  609|     13|          [](const Args&... nargs) { return new T(nargs...); },
_ZN6hobbes8MonoType8makeTypeINS_15unique_refc_mapIKNS_4TAppEJSt10shared_ptrIS0_ESt6vectorIS6_SaIS6_EEEEES3_JS6_S9_EEES6_DpRKT1_:
  605|  3.59k|  MonoTypePtr MonoType::makeType(const Args&... args) {
  606|  3.59k|    return
  607|  3.59k|      std::const_pointer_cast<MonoType>(std::static_pointer_cast<const MonoType>(
  608|  3.59k|        tctorMaps()->at<Class>().get(
  609|  3.59k|          [](const Args&... nargs) { return new T(nargs...); },
  610|  3.59k|          args...
  611|  3.59k|        )
  612|  3.59k|      ));
  613|  3.59k|  }
_ZZN6hobbes8MonoType8makeTypeINS_15unique_refc_mapIKNS_4TAppEJSt10shared_ptrIS0_ESt6vectorIS6_SaIS6_EEEEES3_JS6_S9_EEES6_DpRKT1_ENKUlRKS6_RKS9_E_clESG_SI_:
  609|    231|          [](const Args&... nargs) { return new T(nargs...); },
_ZN6hobbes8MonoType8makeTypeINS_15unique_refc_mapIKNS_10FixedArrayEJSt10shared_ptrIS0_ES6_EEES3_JS6_S6_EEES6_DpRKT1_:
  605|    911|  MonoTypePtr MonoType::makeType(const Args&... args) {
  606|    911|    return
  607|    911|      std::const_pointer_cast<MonoType>(std::static_pointer_cast<const MonoType>(
  608|    911|        tctorMaps()->at<Class>().get(
  609|    911|          [](const Args&... nargs) { return new T(nargs...); },
  610|    911|          args...
  611|    911|        )
  612|    911|      ));
  613|    911|  }
_ZZN6hobbes8MonoType8makeTypeINS_15unique_refc_mapIKNS_10FixedArrayEJSt10shared_ptrIS0_ES6_EEES3_JS6_S6_EEES6_DpRKT1_ENKUlRKS6_SD_E_clESD_SD_:
  609|     99|          [](const Args&... nargs) { return new T(nargs...); },
_ZN6hobbes8MonoType8makeTypeINS_15unique_refc_mapIKNS_5ArrayEJSt10shared_ptrIS0_EEEES3_JS6_EEES6_DpRKT1_:
  605|  21.4k|  MonoTypePtr MonoType::makeType(const Args&... args) {
  606|  21.4k|    return
  607|  21.4k|      std::const_pointer_cast<MonoType>(std::static_pointer_cast<const MonoType>(
  608|  21.4k|        tctorMaps()->at<Class>().get(
  609|  21.4k|          [](const Args&... nargs) { return new T(nargs...); },
  610|  21.4k|          args...
  611|  21.4k|        )
  612|  21.4k|      ));
  613|  21.4k|  }
_ZZN6hobbes8MonoType8makeTypeINS_15unique_refc_mapIKNS_5ArrayEJSt10shared_ptrIS0_EEEES3_JS6_EEES6_DpRKT1_ENKUlRKS6_E_clESD_:
  609|  2.08k|          [](const Args&... nargs) { return new T(nargs...); },
_ZN6hobbes8MonoType8makeTypeINS_15unique_refc_mapIKNS_7VariantEJSt6vectorINS3_6MemberESaIS6_EEEEES3_JS8_EEESt10shared_ptrIS0_EDpRKT1_:
  605|  9.17k|  MonoTypePtr MonoType::makeType(const Args&... args) {
  606|  9.17k|    return
  607|  9.17k|      std::const_pointer_cast<MonoType>(std::static_pointer_cast<const MonoType>(
  608|  9.17k|        tctorMaps()->at<Class>().get(
  609|  9.17k|          [](const Args&... nargs) { return new T(nargs...); },
  610|  9.17k|          args...
  611|  9.17k|        )
  612|  9.17k|      ));
  613|  9.17k|  }
_ZZN6hobbes8MonoType8makeTypeINS_15unique_refc_mapIKNS_7VariantEJSt6vectorINS3_6MemberESaIS6_EEEEES3_JS8_EEESt10shared_ptrIS0_EDpRKT1_ENKUlRKS8_E_clESH_:
  609|  1.34k|          [](const Args&... nargs) { return new T(nargs...); },
_ZN6hobbes8MonoType8makeTypeINS_15unique_refc_mapIKNS_6RecordEJSt6vectorINS3_6MemberESaIS6_EEEEES3_JS8_EEESt10shared_ptrIS0_EDpRKT1_:
  605|  62.4k|  MonoTypePtr MonoType::makeType(const Args&... args) {
  606|  62.4k|    return
  607|  62.4k|      std::const_pointer_cast<MonoType>(std::static_pointer_cast<const MonoType>(
  608|  62.4k|        tctorMaps()->at<Class>().get(
  609|  62.4k|          [](const Args&... nargs) { return new T(nargs...); },
  610|  62.4k|          args...
  611|  62.4k|        )
  612|  62.4k|      ));
  613|  62.4k|  }
_ZZN6hobbes8MonoType8makeTypeINS_15unique_refc_mapIKNS_6RecordEJSt6vectorINS3_6MemberESaIS6_EEEEES3_JS8_EEESt10shared_ptrIS0_EDpRKT1_ENKUlRKS8_E_clESH_:
  609|  9.97k|          [](const Args&... nargs) { return new T(nargs...); },
_ZN6hobbes8MonoType8makeTypeINS_15unique_refc_mapIKNS_4FuncEJSt10shared_ptrIS0_ES6_EEES3_JS6_S6_EEES6_DpRKT1_:
  605|  28.9k|  MonoTypePtr MonoType::makeType(const Args&... args) {
  606|  28.9k|    return
  607|  28.9k|      std::const_pointer_cast<MonoType>(std::static_pointer_cast<const MonoType>(
  608|  28.9k|        tctorMaps()->at<Class>().get(
  609|  28.9k|          [](const Args&... nargs) { return new T(nargs...); },
  610|  28.9k|          args...
  611|  28.9k|        )
  612|  28.9k|      ));
  613|  28.9k|  }
_ZZN6hobbes8MonoType8makeTypeINS_15unique_refc_mapIKNS_4FuncEJSt10shared_ptrIS0_ES6_EEES3_JS6_S6_EEES6_DpRKT1_ENKUlRKS6_SD_E_clESD_SD_:
  609|  9.45k|          [](const Args&... nargs) { return new T(nargs...); },
_ZN6hobbes8MonoType8makeTypeINS_15unique_refc_mapIKNS_6ExistsEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrIS0_EEEES3_JSA_SC_EEESC_DpRKT1_:
  605|  6.17k|  MonoTypePtr MonoType::makeType(const Args&... args) {
  606|  6.17k|    return
  607|  6.17k|      std::const_pointer_cast<MonoType>(std::static_pointer_cast<const MonoType>(
  608|  6.17k|        tctorMaps()->at<Class>().get(
  609|  6.17k|          [](const Args&... nargs) { return new T(nargs...); },
  610|  6.17k|          args...
  611|  6.17k|        )
  612|  6.17k|      ));
  613|  6.17k|  }
_ZZN6hobbes8MonoType8makeTypeINS_15unique_refc_mapIKNS_6ExistsEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrIS0_EEEES3_JSA_SC_EEESC_DpRKT1_ENKUlRKSA_RKSC_E_clESJ_SL_:
  609|    217|          [](const Args&... nargs) { return new T(nargs...); },
_ZN6hobbes8MonoType8makeTypeINS_15unique_refc_mapIKNS_9RecursiveEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrIS0_EEEES3_JSA_SC_EEESC_DpRKT1_:
  605|  6.98k|  MonoTypePtr MonoType::makeType(const Args&... args) {
  606|  6.98k|    return
  607|  6.98k|      std::const_pointer_cast<MonoType>(std::static_pointer_cast<const MonoType>(
  608|  6.98k|        tctorMaps()->at<Class>().get(
  609|  6.98k|          [](const Args&... nargs) { return new T(nargs...); },
  610|  6.98k|          args...
  611|  6.98k|        )
  612|  6.98k|      ));
  613|  6.98k|  }
_ZZN6hobbes8MonoType8makeTypeINS_15unique_refc_mapIKNS_9RecursiveEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrIS0_EEEES3_JSA_SC_EEESC_DpRKT1_ENKUlRKSA_RKSC_E_clESJ_SL_:
  609|    191|          [](const Args&... nargs) { return new T(nargs...); },
_ZN6hobbes8MonoType8makeTypeINS_15unique_refc_mapIKNS_7TStringEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEES3_JSA_EEESt10shared_ptrIS0_EDpRKT1_:
  605|  35.4k|  MonoTypePtr MonoType::makeType(const Args&... args) {
  606|  35.4k|    return
  607|  35.4k|      std::const_pointer_cast<MonoType>(std::static_pointer_cast<const MonoType>(
  608|  35.4k|        tctorMaps()->at<Class>().get(
  609|  35.4k|          [](const Args&... nargs) { return new T(nargs...); },
  610|  35.4k|          args...
  611|  35.4k|        )
  612|  35.4k|      ));
  613|  35.4k|  }
_ZZN6hobbes8MonoType8makeTypeINS_15unique_refc_mapIKNS_7TStringEJNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEES3_JSA_EEESt10shared_ptrIS0_EDpRKT1_ENKUlRKSA_E_clESJ_:
  609|    193|          [](const Args&... nargs) { return new T(nargs...); },
_ZN6hobbes8MonoType8makeTypeINS_15unique_refc_mapIKNS_5TLongEJlEEES3_JlEEESt10shared_ptrIS0_EDpRKT1_:
  605|  5.79k|  MonoTypePtr MonoType::makeType(const Args&... args) {
  606|  5.79k|    return
  607|  5.79k|      std::const_pointer_cast<MonoType>(std::static_pointer_cast<const MonoType>(
  608|  5.79k|        tctorMaps()->at<Class>().get(
  609|  5.79k|          [](const Args&... nargs) { return new T(nargs...); },
  610|  5.79k|          args...
  611|  5.79k|        )
  612|  5.79k|      ));
  613|  5.79k|  }
_ZZN6hobbes8MonoType8makeTypeINS_15unique_refc_mapIKNS_5TLongEJlEEES3_JlEEESt10shared_ptrIS0_EDpRKT1_ENKUlRKlE_clESD_:
  609|     13|          [](const Args&... nargs) { return new T(nargs...); },
type.C:_ZZN6hobbes5TExpr4makeERKSt10shared_ptrINS_4ExprEEENK3$_0clERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
 1577|     89|      tctorMaps()->at<TExprMem>().get([e](const std::string&){return new TExpr(e);}, hobbes::show(e))

_ZN6hobbes9LiftUType5applyERKSt10shared_ptrINS_8MonoTypeEE:
   11|   102k|UTypeRec LiftUType::apply(const MonoTypePtr& t) {
   12|   102k|  UTypeRec r;
   13|   102k|  r.ty      = t;
   14|   102k|  r.visited = false;
   15|   102k|  r.donebc  = 0;
   16|   102k|  return r;
   17|   102k|}
_ZN6hobbes15MoreDefinedType5applyERKNS_8UTypeRecES3_:
   19|  30.1k|const UTypeRec& MoreDefinedType::apply(const UTypeRec& lhs, const UTypeRec& rhs) {
   20|  30.1k|  if (const TVar* lv = is<TVar>(lhs.ty)) {
  ------------------
  |  Branch (20:19): [True: 10.4k, False: 19.7k]
  ------------------
   21|  10.4k|    if (const TVar* rv = is<TVar>(rhs.ty)) {
  ------------------
  |  Branch (21:21): [True: 5.35k, False: 5.05k]
  ------------------
   22|  5.35k|      return (lv->name() < rv->name()) ? lhs : rhs;
  ------------------
  |  Branch (22:14): [True: 2.68k, False: 2.66k]
  ------------------
   23|  5.35k|    } else {
   24|  5.05k|      return rhs;
   25|  5.05k|    }
   26|  19.7k|  } else {
   27|  19.7k|    if (is<TVar>(rhs.ty) != nullptr) {
  ------------------
  |  Branch (27:9): [True: 8.19k, False: 11.5k]
  ------------------
   28|  8.19k|      return lhs;
   29|  11.5k|    } else {
   30|  11.5k|      return (tvarNames(lhs.ty).size() < tvarNames(rhs.ty).size()) ? lhs : rhs;
  ------------------
  |  Branch (30:14): [True: 4.93k, False: 6.65k]
  ------------------
   31|  11.5k|    }
   32|  19.7k|  }
   33|  30.1k|}
_ZN6hobbes15MonoTypeUnifierC2ERKSt10shared_ptrINS_4TEnvEE:
   35|  21.9k|MonoTypeUnifier::MonoTypeUnifier(const TEnvPtr& tenv) : tenv(tenv), bcount(0) {
   36|  21.9k|}
_ZN6hobbes15MonoTypeUnifierC2ERKS0_:
   38|  1.78k|MonoTypeUnifier::MonoTypeUnifier(const MonoTypeUnifier& u) : tenv(u.tenv), bcount(u.bcount) {
   39|  1.78k|  this->merge(u);
   40|  1.78k|}
_ZNK6hobbes15MonoTypeUnifier4sizeEv:
   55|  94.6k|size_t MonoTypeUnifier::size() const {
   56|  94.6k|  return this->bcount;
   57|  94.6k|}
_ZN6hobbes15MonoTypeUnifier8suppressERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
   59|    810|void MonoTypeUnifier::suppress(const std::string& vn) {
   60|    810|  ++this->suppressVarCounts[vn];
   61|    810|}
_ZN6hobbes15MonoTypeUnifier8suppressERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS7_EE:
   63|  11.6k|void MonoTypeUnifier::suppress(const str::seq& vns) {
   64|  11.6k|  for (const auto &vn : vns) {
  ------------------
  |  Branch (64:23): [True: 314, False: 11.6k]
  ------------------
   65|    314|    suppress(vn);
   66|    314|  }
   67|  11.6k|}
_ZN6hobbes15MonoTypeUnifier10unsuppressERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
   69|    810|void MonoTypeUnifier::unsuppress(const std::string& vn) {
   70|    810|  auto vnc = this->suppressVarCounts.find(vn);
   71|       |
   72|    810|  if (vnc != this->suppressVarCounts.end()) {
  ------------------
  |  Branch (72:7): [True: 810, False: 0]
  ------------------
   73|    810|    if (--vnc->second == 0) {
  ------------------
  |  Branch (73:9): [True: 653, False: 157]
  ------------------
   74|    653|      this->suppressVarCounts.erase(vnc);
   75|    653|    }
   76|    810|  }
   77|    810|}
_ZN6hobbes15MonoTypeUnifier10unsuppressERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS7_EE:
   79|  11.6k|void MonoTypeUnifier::unsuppress(const str::seq& vns) {
   80|  11.6k|  for (const auto &vn : vns) {
  ------------------
  |  Branch (80:23): [True: 314, False: 11.6k]
  ------------------
   81|    314|    unsuppress(vn);
   82|    314|  }
   83|  11.6k|}
_ZNK6hobbes15MonoTypeUnifier10suppressedERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
   85|  36.2k|bool MonoTypeUnifier::suppressed(const std::string& vn) const {
   86|  36.2k|  auto vnc = this->suppressVarCounts.find(vn);
   87|  36.2k|  return vnc != this->suppressVarCounts.end() && vnc->second > 0;
  ------------------
  |  Branch (87:10): [True: 1.21k, False: 35.0k]
  |  Branch (87:50): [True: 1.21k, False: 0]
  ------------------
   88|  36.2k|}
_ZNK6hobbes15MonoTypeUnifier10suppressedERKSt10shared_ptrINS_8MonoTypeEE:
   90|  88.7k|bool MonoTypeUnifier::suppressed(const MonoTypePtr& ty) const {
   91|  88.7k|  if (const TVar* tv = is<TVar>(ty)) {
  ------------------
  |  Branch (91:19): [True: 36.2k, False: 52.4k]
  ------------------
   92|  36.2k|    return suppressed(tv->name());
   93|  52.4k|  } else {
   94|  52.4k|    return false;
   95|  52.4k|  }
   96|  88.7k|}
_ZN6hobbes15MonoTypeUnifier4bindERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_8MonoTypeEE:
   99|     47|void MonoTypeUnifier::bind(const std::string& vn, const MonoTypePtr& t) {
  100|     47|  unify(MonoTypePtr(TVar::make(vn)), t);
  101|     47|}
_ZN6hobbes15MonoTypeUnifier7bindingERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  103|  76.1k|MonoTypePtr MonoTypeUnifier::binding(const std::string& vn) {
  104|  76.1k|  return this->m.find(MonoTypePtr(TVar::make(vn))).ty;
  105|  76.1k|}
_ZN6hobbes12typeCtorFormERKSt10shared_ptrINS_8MonoTypeEEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPSt6vectorIS2_SaIS2_EEPSC_ISA_SaISA_EE:
  206|  26.1k|void typeCtorForm(const MonoTypePtr& ty, std::string* cname, MonoTypes* targs, str::seq* ignvs) {
  207|  26.1k|  *cname = switchOf(ty, encodeCtorForm(ty, targs, ignvs));
  208|  26.1k|}
_ZN6hobbes15MonoTypeUnifier5unifyERKSt10shared_ptrINS_8MonoTypeEES5_:
  264|  44.4k|void MonoTypeUnifier::unify(const MonoTypePtr& lhs, const MonoTypePtr& rhs) {
  265|  44.4k|  inferenceDepthGuard depthGuard("unification");
  266|       |
  267|  44.4k|  if (suppressed(lhs) || suppressed(rhs)) {
  ------------------
  |  Branch (267:7): [True: 225, False: 44.2k]
  |  Branch (267:26): [True: 992, False: 43.2k]
  ------------------
  268|  1.21k|    return;
  269|  1.21k|  }
  270|       |
  271|  43.2k|  const MonoTypePtr& lhsv = this->m.find(lhs).ty;
  272|  43.2k|  const MonoTypePtr& rhsv = this->m.find(rhs).ty;
  273|       |
  274|  43.2k|  if (lhsv != rhsv) {
  ------------------
  |  Branch (274:7): [True: 30.7k, False: 12.5k]
  ------------------
  275|       |    // unify the constituents of these types (if applicable)
  276|  30.7k|    if ((is<TVar>(lhsv) == nullptr) && (is<TVar>(rhsv) == nullptr)) {
  ------------------
  |  Branch (276:9): [True: 19.0k, False: 11.7k]
  |  Branch (276:40): [True: 13.0k, False: 5.93k]
  ------------------
  277|  13.0k|      str::seq ignvs;
  278|       |
  279|  13.0k|      std::string lhscn;
  280|  13.0k|      MonoTypes lhsts;
  281|  13.0k|      typeCtorForm(lhsv, &lhscn, &lhsts, &ignvs);
  282|       |
  283|  13.0k|      std::string rhscn;
  284|  13.0k|      MonoTypes rhsts;
  285|  13.0k|      typeCtorForm(rhsv, &rhscn, &rhsts, &ignvs);
  286|       |
  287|  13.0k|      if (lhsts.size() != rhsts.size() || lhscn != rhscn) {
  ------------------
  |  Branch (287:11): [True: 976, False: 12.1k]
  |  Branch (287:43): [True: 463, False: 11.6k]
  ------------------
  288|  1.43k|        throw std::runtime_error("Cannot unify types: " + show(substitute(lhsv)) + " != " + show(substitute(rhsv)));
  289|  1.43k|      }
  290|       |
  291|  11.6k|      suppress(ignvs);
  292|  11.6k|      try {
  293|  34.1k|        for (size_t i = 0; i < lhsts.size(); ++i) {
  ------------------
  |  Branch (293:28): [True: 22.5k, False: 11.6k]
  ------------------
  294|  22.5k|          unify(lhsts[i], rhsts[i]);
  295|  22.5k|        }
  296|  11.6k|        unsuppress(ignvs);
  297|  11.6k|      } catch (...) {
  298|    141|        unsuppress(ignvs);
  299|    141|        throw;
  300|    141|      }
  301|  17.6k|    } else {
  302|       |      // one of the values is a variable -- let's increase our binding count
  303|  17.6k|      ++this->bcount;
  304|  17.6k|    }
  305|       |
  306|       |    // and the types themselves are the same
  307|  29.1k|    this->m.join(lhsv, rhsv);
  308|  29.1k|  }
  309|  43.2k|}
_ZN6hobbes15MonoTypeUnifier10substituteERKSt10shared_ptrINS_8MonoTypeEE:
  388|   598k|MonoTypePtr MonoTypeUnifier::substitute(const MonoTypePtr& ty) {
  389|   598k|  inferenceDepthGuard depthGuard("substitution");
  390|       |
  391|   598k|  if (isMonoSingular(ty)) {
  ------------------
  |  Branch (391:7): [True: 223k, False: 374k]
  ------------------
  392|   223k|    return ty;
  393|   223k|  }
  394|       |
  395|   374k|  UTypeRec& uty = this->m.find(ty);
  396|   374k|  if (uty.donebc > 0 && uty.donebc == this->bcount) {
  ------------------
  |  Branch (396:7): [True: 264k, False: 110k]
  |  Branch (396:25): [True: 247k, False: 17.5k]
  ------------------
  397|   247k|    return uty.ty;
  398|   247k|  } else if (uty.visited) {
  ------------------
  |  Branch (398:14): [True: 8, False: 127k]
  ------------------
  399|      8|    throw std::runtime_error("Cannot infer infinite type");
  400|   127k|  } else {
  401|   127k|    uty.ty     = switchOf(uty.ty, substituteInto(this, uty));
  402|   127k|    uty.donebc = this->bcount;
  403|   127k|    return uty.ty;
  404|   127k|  }
  405|   374k|}
_ZN6hobbes15MonoTypeUnifier10substituteERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS4_EE:
  407|   119k|MonoTypes MonoTypeUnifier::substitute(const MonoTypes& ts) {
  408|   119k|  MonoTypes result;
  409|   393k|  for (const auto &t : ts) {
  ------------------
  |  Branch (409:22): [True: 393k, False: 119k]
  ------------------
  410|   393k|    result.push_back(substitute(t));
  411|   393k|  }
  412|   119k|  return result;
  413|   119k|}
_ZN6hobbes15MonoTypeUnifier5mergeERKS0_:
  415|  1.78k|size_t MonoTypeUnifier::merge(const MonoTypeUnifier& u) {
  416|  1.78k|  return this->m.merge(u.m);
  417|  1.78k|}
_ZN6hobbes15MonoTypeUnifier12substitutionB5cxx11Ev:
  419|    642|MonoTypeSubst MonoTypeUnifier::substitution() {
  420|    642|  MonoTypeSubst result;
  421|  4.62k|  for (const MonoTypePtr& bt : this->m.values()) {
  ------------------
  |  Branch (421:30): [True: 4.62k, False: 642]
  ------------------
  422|  4.62k|    if (const TVar* vn = is<TVar>(bt)) {
  ------------------
  |  Branch (422:21): [True: 762, False: 3.86k]
  ------------------
  423|    762|      MonoTypePtr bv = substitute(bt);
  424|    762|      if (bv != bt) {
  ------------------
  |  Branch (424:11): [True: 280, False: 482]
  ------------------
  425|    280|        result[vn->name()] = bv;
  426|    280|      }
  427|    762|    }
  428|  4.62k|  }
  429|    642|  return result;
  430|    642|}
_ZN6hobbes30scoped_unification_suppressionC2EPNS_15MonoTypeUnifierERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  432|    496|scoped_unification_suppression::scoped_unification_suppression(MonoTypeUnifier* u, const std::string& sv) : u(u), sv(sv) {
  433|    496|  this->u->suppress(this->sv);
  434|    496|}
_ZN6hobbes30scoped_unification_suppressionD2Ev:
  436|    496|scoped_unification_suppression::~scoped_unification_suppression() {
  437|    496|  this->u->unsuppress(this->sv);
  438|    496|}
_ZN6hobbes10substituteEPNS_15MonoTypeUnifierERKSt10shared_ptrINS_8MonoTypeEE:
  441|  25.9k|MonoTypePtr substitute(MonoTypeUnifier* u, const MonoTypePtr& ty) {
  442|  25.9k|  return u->substitute(ty);
  443|  25.9k|}
_ZN6hobbes10substituteEPNS_15MonoTypeUnifierERKSt10shared_ptrINS_10ConstraintEE:
  453|  22.2k|ConstraintPtr substitute(MonoTypeUnifier* u, const ConstraintPtr& cst) {
  454|  22.2k|  cst->update(u);
  455|  22.2k|  return cst;
  456|  22.2k|}
_ZN6hobbes10substituteEPNS_15MonoTypeUnifierERKSt6vectorISt10shared_ptrINS_10ConstraintEESaIS5_EE:
  458|  25.9k|Constraints substitute(MonoTypeUnifier* u, const Constraints& cs) {
  459|  25.9k|  for (const auto &c : cs) {
  ------------------
  |  Branch (459:22): [True: 22.2k, False: 25.9k]
  ------------------
  460|  22.2k|    substitute(u, c);
  461|  22.2k|  }
  462|  25.9k|  return cs;
  463|  25.9k|}
_ZN6hobbes10substituteEPNS_15MonoTypeUnifierERKSt10shared_ptrINS_8QualTypeEE:
  465|  25.9k|QualTypePtr substitute(MonoTypeUnifier* u, const QualTypePtr& qty) {
  466|  25.9k|  qty->constraints() = substitute(u, qty->constraints());
  467|  25.9k|  qty->monoType(substitute(u, qty->monoType()));
  468|  25.9k|  return qty;
  469|  25.9k|}
_ZN6hobbes10substituteEPNS_15MonoTypeUnifierERKSt10shared_ptrINS_4ExprEE:
  480|    160|ExprPtr substitute(MonoTypeUnifier* u, const ExprPtr& e) {
  481|    160|  switchOf(e, exprTypeSubst(u));
  482|    160|  return e;
  483|    160|}
_ZN6hobbes9unifiableERKSt10shared_ptrINS_4TEnvEERKS0_INS_8MonoTypeEES8_:
  486|  3.03k|bool unifiable(const TEnvPtr& tenv, const MonoTypePtr& t0, const MonoTypePtr& t1) {
  487|  3.03k|  if (*t0 == *t1) {
  ------------------
  |  Branch (487:7): [True: 2.95k, False: 81]
  ------------------
  488|  2.95k|    return true;
  489|  2.95k|  }
  490|       |
  491|     81|  try {
  492|     81|    MonoTypeUnifier s(tenv);
  493|     81|    mgu(t0, t1, &s);
  494|     81|    s.substitute(t0);
  495|     81|    return true;
  496|     81|  } catch (std::exception&) {
  497|      8|    return false;
  498|      8|  }
  499|     81|}
_ZN6hobbes9unifiableERKSt10shared_ptrINS_4TEnvEERKSt6vectorIS0_INS_8MonoTypeEESaIS7_EESB_:
  501|    123|bool unifiable(const TEnvPtr& tenv, const MonoTypes& ts0, const MonoTypes& ts1) {
  502|    123|  if (ts0.size() != ts1.size()) {
  ------------------
  |  Branch (502:7): [True: 0, False: 123]
  ------------------
  503|      0|    return false;
  504|    123|  } else if (ts0.empty()) {
  ------------------
  |  Branch (504:14): [True: 0, False: 123]
  ------------------
  505|      0|    return true;
  506|    123|  } else {
  507|    123|    try {
  508|    123|      MonoTypeUnifier s(tenv);
  509|    513|      for (size_t i = 0; i < ts0.size(); ++i) {
  ------------------
  |  Branch (509:26): [True: 390, False: 123]
  ------------------
  510|    390|        if (!(ts0[i] == ts1[i])) {
  ------------------
  |  Branch (510:13): [True: 106, False: 284]
  ------------------
  511|    106|          mgu(ts0[i], ts1[i], &s);
  512|    106|        }
  513|    390|      }
  514|    123|      s.substitute(ts0[0]);
  515|    123|      return true;
  516|    123|    } catch (std::exception&) {
  517|      0|      return false;
  518|      0|    }
  519|    123|  }
  520|    123|}
_ZN6hobbes9unifiableERKSt10shared_ptrINS_4TEnvEERKS0_INS_10ConstraintEES8_:
  522|    123|bool unifiable(const TEnvPtr& tenv, const ConstraintPtr& c0, const ConstraintPtr& c1) {
  523|    123|  MonoTypes ts0;
  524|    123|  typeSeqForm(c0, &ts0);
  525|       |
  526|    123|  MonoTypes ts1;
  527|    123|  typeSeqForm(c1, &ts1);
  528|       |
  529|    123|  return unifiable(tenv, ts0, ts1);
  530|    123|}
_ZN6hobbes6refineERKSt10shared_ptrINS_4TEnvEERKS0_INS_10ConstraintEEPNS_15MonoTypeUnifierEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES0_INS_4ExprEEESaISL_EE:
  534|  55.9k|bool refine(const TEnvPtr& tenv, const ConstraintPtr& c, MonoTypeUnifier* s, Definitions* ds) {
  535|  55.9k|  if (c->state != Constraint::Unresolved) {
  ------------------
  |  Branch (535:7): [True: 1.97k, False: 54.0k]
  ------------------
  536|  1.97k|    return false;
  537|  54.0k|  } else {
  538|  54.0k|    if (tenv->debugConstraintRefine()) {
  ------------------
  |  Branch (538:9): [True: 0, False: 54.0k]
  ------------------
  539|      0|      std::cout << "  == refine ==> " << c << std::endl;
  540|      0|    }
  541|       |
  542|  54.0k|    c->update(s);
  543|  54.0k|    if (tenv->lookupUnqualifier(c)->refine(tenv, c, s, ds)) {
  ------------------
  |  Branch (543:9): [True: 540, False: 53.4k]
  ------------------
  544|    540|      c->update(s);
  545|    540|      return true;
  546|  53.4k|    } else {
  547|  53.4k|      return false;
  548|  53.4k|    }
  549|  54.0k|  }
  550|  55.9k|}
_ZN6hobbes6refineERKSt10shared_ptrINS_4TEnvEERKSt6vectorIS0_INS_10ConstraintEESaIS7_EEPNS_15MonoTypeUnifierEPS5_ISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES0_INS_4ExprEEESaISN_EE:
  552|  20.4k|bool refine(const TEnvPtr& tenv, const Constraints& cs, MonoTypeUnifier* s, Definitions* ds) {
  553|       |  // this fixpoint runs until a whole pass refines nothing. A convergent set
  554|       |  // reaches that quickly, but a pathological one can keep reporting an update
  555|       |  // without ever converging, spinning here forever and pinning the inference
  556|       |  // thread (STRFR-433979). Cap the passes and raise a recoverable error. The
  557|       |  // worst case for a well-founded set is one pass per constraint (information
  558|       |  // propagating one constraint at a time), so the bound scales with the set
  559|       |  // size -- generously, so a large machine-generated set that legitimately
  560|       |  // needs many passes is not refused -- with a floor for small sets.
  561|  20.4k|  const size_t maxRefinePasses = 100000 + 8 * cs.size();
  562|  20.4k|  size_t passes = 0;
  563|       |
  564|  20.4k|  bool upd = true;
  565|  41.3k|  while (upd) {
  ------------------
  |  Branch (565:10): [True: 20.8k, False: 20.4k]
  ------------------
  566|  20.8k|    if (++passes > maxRefinePasses) {
  ------------------
  |  Branch (566:9): [True: 0, False: 20.8k]
  ------------------
  567|      0|      throw std::runtime_error("Constraint refinement did not converge within " + std::to_string(maxRefinePasses) + " passes");
  568|      0|    }
  569|  20.8k|    upd = false;
  570|  31.3k|    for (const auto &c : cs) {
  ------------------
  |  Branch (570:24): [True: 31.3k, False: 20.8k]
  ------------------
  571|  31.3k|      upd |= refine(tenv, c, s, ds);
  572|  31.3k|    }
  573|  20.8k|  }
  574|  20.4k|  return false;
  575|  20.4k|}
_ZN6hobbes6refineERKSt10shared_ptrINS_4TEnvEERKS0_INS_8QualTypeEEPNS_15MonoTypeUnifierEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES0_INS_4ExprEEESaISL_EE:
  577|  19.3k|bool refine(const TEnvPtr& tenv, const QualTypePtr& qty, MonoTypeUnifier* s, Definitions* ds) {
  578|       |  // first reduce this set of constraints as much as possible
  579|  19.3k|  ConstraintSet cs;
  580|  31.7k|  for (const auto& c : qty->constraints()) {
  ------------------
  |  Branch (580:22): [True: 31.7k, False: 19.3k]
  ------------------
  581|  31.7k|    cs.insert(tenv, c, s);
  582|  31.7k|  }
  583|       |
  584|       |  // then refine the remaining constraints after reduction
  585|  19.3k|  Constraints qtr = cs.constraints();
  586|  19.3k|  bool result = refine(tenv, qtr, s, ds);
  587|       |
  588|       |  // and the input type should reflect this refined constraint set
  589|  19.3k|  qty->constraints() = qtr;
  590|  19.3k|  return result;
  591|  19.3k|}
_ZN6hobbes6refineERKSt10shared_ptrINS_4TEnvEERKS0_INS_4ExprEEPNS_15MonoTypeUnifierEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ESaISJ_EE:
  593|    487|bool refine(const TEnvPtr& tenv, const ExprPtr& e, MonoTypeUnifier* s, Definitions* ds) {
  594|    487|  return refine(tenv, e->type(), s, ds);
  595|    487|}
_ZN6hobbes17makeRecordMembersERKSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_4ExprEEESaISB_EERKS0_IS8_INS_8MonoTypeEESaISH_EE:
  598|     99|Record::Members makeRecordMembers(const MkRecord::FieldDefs& fds, const MonoTypes& mts) {
  599|     99|  Record::Members r;
  600|     99|  int i = 0;
  601|    312|  for (auto f = fds.begin(); f != fds.end(); ++f, ++i) {
  ------------------
  |  Branch (601:30): [True: 213, False: 99]
  ------------------
  602|    213|    r.push_back(Record::Member(f->first, mts[i]));
  603|    213|  }
  604|     99|  return r;
  605|     99|}
_ZN6hobbes12validateTypeERKSt10shared_ptrINS_4TEnvEERKS0_INS_4ExprEEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ESaISH_EE:
  998|    487|ExprPtr validateType(const TEnvPtr& tenv, const ExprPtr& e, Definitions* ds) {
  999|    487|  try {
 1000|    487|    MonoTypeUnifier u(tenv);
 1001|    487|    switchOf(e, expTypeInfF(tenv, &u, ds));
 1002|    487|    refine(tenv, e, &u, ds);
 1003|    487|    switchOf(e, applySubstitutionF(&u));
 1004|    487|    return e;
 1005|    487|  } catch (annotated_error&) {
 1006|      0|    throw;
 1007|      0|  } catch (std::exception& ex) {
 1008|      0|    throw annotated_error(*e, ex.what());
 1009|      0|  }
 1010|    487|}
_ZN6hobbes12validateTypeERKSt10shared_ptrINS_4TEnvEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKS0_INS_4ExprEEPSt6vectorISt4pairISA_SE_ESaISJ_EE:
 1012|    810|ExprPtr validateType(const TEnvPtr& tenv, const std::string& vname, const ExprPtr& e, Definitions* ds) {
 1013|    810|  try {
 1014|    810|    MonoTypeUnifier u(tenv);
 1015|       |
 1016|    810|    TEnvPtr rtenv(new TEnv(tenv));
 1017|    810|    MonoTypePtr defTy = freshTypeVar();
 1018|    810|    rtenv->bind(vname, polytype(defTy));
 1019|       |
 1020|    810|    ExprPtr result(new Assump(e, qualtype(defTy), e->la()));
 1021|    810|    switchOf(result, expTypeInfF(rtenv, &u, ds));
 1022|    810|    switchOf(result, applySubstitutionF(&u));
 1023|    810|    return result;
 1024|    810|  } catch (annotated_error&) {
 1025|      0|    throw;
 1026|      0|  } catch (std::exception& ex) {
 1027|      0|    throw annotated_error(*e, ex.what());
 1028|      0|  }
 1029|    810|}
_ZN6hobbes3mguERKSt10shared_ptrINS_4ExprEES4_PNS_15MonoTypeUnifierE:
 1032|     86|void mgu(const ExprPtr& e0, const ExprPtr& e1, MonoTypeUnifier* u) {
 1033|     86|  try {
 1034|     86|    mgu(e0->type(), e1->type(), u);
 1035|     86|  } catch (std::runtime_error& ex) {
 1036|      0|    throw annotated_error(list(annmsg(ex.what(), e0->la()), annmsg("while unifying with:", e1->la())));
 1037|      0|  }
 1038|     86|}
_ZN6hobbes3mguERKSt10shared_ptrINS_4ExprEERKS0_INS_8QualTypeEEPNS_15MonoTypeUnifierE:
 1040|  7.48k|void mgu(const ExprPtr& e, const QualTypePtr& t, MonoTypeUnifier* u) {
 1041|  7.48k|  try {
 1042|  7.48k|    mgu(e->type(), t, u);
 1043|  7.48k|  } catch (std::runtime_error& ex) {
 1044|      0|    throw annotated_error(list(annmsg(ex.what(), e->la())));
 1045|      0|  }
 1046|  7.48k|}
_ZN6hobbes3mguERKSt10shared_ptrINS_8QualTypeEES4_PNS_15MonoTypeUnifierE:
 1052|  7.57k|void mgu(const QualTypePtr& t0, const QualTypePtr& t1, MonoTypeUnifier* u) {
 1053|  7.57k|  mgu(t0->monoType(), t1->monoType(), u);
 1054|  7.57k|}
_ZN6hobbes3mguERKSt10shared_ptrINS_8MonoTypeEES4_PNS_15MonoTypeUnifierE:
 1056|  21.9k|void mgu(const MonoTypePtr& t0, const MonoTypePtr& t1, MonoTypeUnifier* u) {
 1057|  21.9k|  u->unify(t0, t1);
 1058|  21.9k|}
_ZN6hobbes3mguERKSt6vectorISt10shared_ptrINS_8MonoTypeEESaIS3_EES7_PNS_15MonoTypeUnifierE:
 1060|  2.73k|void mgu(const MonoTypes& t0s, const MonoTypes& t1s, MonoTypeUnifier* u) {
 1061|  2.73k|  if (t0s.size() == t1s.size()) {
  ------------------
  |  Branch (1061:7): [True: 2.73k, False: 0]
  ------------------
 1062|  9.08k|    for (size_t i = 0; i < t0s.size(); ++i) {
  ------------------
  |  Branch (1062:24): [True: 6.35k, False: 2.73k]
  ------------------
 1063|  6.35k|      mgu(t0s[i], t1s[i], u);
 1064|  6.35k|    }
 1065|  2.73k|  } else {
 1066|      0|    throw std::runtime_error("Cannot unify parameter lists (length mismatch).");
 1067|      0|  }
 1068|  2.73k|}
_ZN6hobbes3mguERKSt10shared_ptrINS_10ConstraintEES4_PNS_15MonoTypeUnifierE:
 1070|     95|void mgu(const ConstraintPtr& c0, const ConstraintPtr& c1, MonoTypeUnifier* u) {
 1071|     95|  MonoTypes c0ts;
 1072|     95|  typeSeqForm(c0, &c0ts);
 1073|       |
 1074|     95|  MonoTypes c1ts;
 1075|     95|  typeSeqForm(c1, &c1ts);
 1076|       |
 1077|     95|  mgu(c0ts, c1ts, u);
 1078|     95|}
_ZN6hobbes14liftQualifiersERKSt6vectorISt10shared_ptrINS_8QualTypeEESaIS3_EE:
 1081|     99|QualLiftedMonoTypes liftQualifiers(const QualTypes& qts) {
 1082|     99|  QualLiftedMonoTypes r;
 1083|    213|  for (const auto &qt : qts) {
  ------------------
  |  Branch (1083:23): [True: 213, False: 99]
  ------------------
 1084|    213|    mergeConstraints(qt->constraints(), &r.first);
 1085|    213|    r.second.push_back(qt->monoType());
 1086|    213|  }
 1087|     99|  return r;
 1088|     99|}
_ZN6hobbes14encodeCtorFormC2ERKSt10shared_ptrINS_8MonoTypeEEPSt6vectorIS3_SaIS3_EEPS6_INSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISF_EE:
  114|  26.1k|  encodeCtorForm(const MonoTypePtr& forTy, MonoTypes* targs, str::seq* ignvs) : forTy(forTy), targs(targs), ignvs(ignvs) { }
_ZNK6hobbes14encodeCtorForm4withB5cxx11EPKNS_4PrimE:
  116|    349|  std::string with(const Prim* v) const override {
  117|    349|    return "prim:" + v->name();
  118|    349|  }
_ZNK6hobbes14encodeCtorForm4withB5cxx11EPKNS_9OpaquePtrE:
  120|     42|  std::string with(const OpaquePtr* v) const override {
  121|     42|    return "ptr" + std::string(v->storedContiguously() ? "c" : "") + ":" + v->name();
  ------------------
  |  Branch (121:32): [True: 0, False: 42]
  ------------------
  122|     42|  }
_ZNK6hobbes14encodeCtorForm4withB5cxx11EPKNS_4TAppE:
  136|    264|  std::string with(const TApp* v) const override {
  137|    264|    this->targs->push_back(v->fn());
  138|    514|    for (const auto& arg : v->args()) {
  ------------------
  |  Branch (138:26): [True: 514, False: 264]
  ------------------
  139|    514|      this->targs->push_back(arg);
  140|    514|    }
  141|    264|    return "tapp";
  142|    264|  }
_ZNK6hobbes14encodeCtorForm4withB5cxx11EPKNS_10FixedArrayE:
  144|     99|  std::string with(const FixedArray* v) const override {
  145|     99|    this->targs->push_back(v->type());
  146|     99|    this->targs->push_back(v->length());
  147|     99|    return "farray";
  148|     99|  }
_ZNK6hobbes14encodeCtorForm4withB5cxx11EPKNS_5ArrayE:
  150|  2.68k|  std::string with(const Array* v) const override {
  151|  2.68k|    this->targs->push_back(v->type());
  152|  2.68k|    return "array";
  153|  2.68k|  }
_ZNK6hobbes14encodeCtorForm4withB5cxx11EPKNS_7VariantE:
  155|    610|  std::string with(const Variant* v) const override {
  156|    610|    std::ostringstream vn;
  157|    610|    vn << "variant:";
  158|  1.22k|    for (const auto &c : v->members()) {
  ------------------
  |  Branch (158:24): [True: 1.22k, False: 610]
  ------------------
  159|  1.22k|      vn << c.selector << "=" << ";";
  160|  1.22k|      this->targs->push_back(c.type);
  161|  1.22k|    }
  162|    610|    return vn.str();
  163|    610|  }
_ZNK6hobbes14encodeCtorForm4withB5cxx11EPKNS_6RecordE:
  165|  11.5k|  std::string with(const Record* v) const override {
  166|  11.5k|    std::ostringstream rn;
  167|  11.5k|    rn << "record:";
  168|  23.9k|    for (const auto &f : v->members()) {
  ------------------
  |  Branch (168:24): [True: 23.9k, False: 11.5k]
  ------------------
  169|  23.9k|      rn << f.field << "=" << ";";
  170|  23.9k|      this->targs->push_back(f.type);
  171|  23.9k|    }
  172|  11.5k|    return rn.str();
  173|  11.5k|  }
_ZNK6hobbes14encodeCtorForm4withB5cxx11EPKNS_4FuncE:
  175|  9.69k|  std::string with(const Func* v) const override {
  176|  9.69k|    this->targs->push_back(v->argument());
  177|  9.69k|    this->targs->push_back(v->result());
  178|  9.69k|    return "->";
  179|  9.69k|  }
_ZNK6hobbes14encodeCtorForm4withB5cxx11EPKNS_6ExistsE:
  181|    272|  std::string with(const Exists* v) const override {
  182|    272|    this->ignvs->push_back(v->absTypeName());
  183|    272|    this->targs->push_back(v->absType());
  184|    272|    return "exists";
  185|    272|  }
_ZNK6hobbes14encodeCtorForm4withB5cxx11EPKNS_9RecursiveE:
  187|    174|  std::string with(const Recursive* v) const override {
  188|    174|    this->ignvs->push_back(v->recTypeName());
  189|    174|    this->targs->push_back(v->recType());
  190|    174|    return "recur";
  191|    174|  }
_ZNK6hobbes14encodeCtorForm4withB5cxx11EPKNS_7TStringE:
  193|    286|  std::string with(const TString* v) const override {
  194|    286|    return "string:" + v->value();
  195|    286|  }
_ZNK6hobbes14encodeCtorForm4withB5cxx11EPKNS_5TLongE:
  197|    165|  std::string with(const TLong* v) const override {
  198|    165|    return "long:" + str::from(v->value());
  199|    165|  }
typeinf.C:_ZN6hobbes12_GLOBAL__N_119inferenceDepthGuardC2EPKc:
  233|   642k|  inferenceDepthGuard(const char* what) {
  234|   642k|    if (inferenceDepth >= maxInferenceRecursionDepth) {
  ------------------
  |  Branch (234:9): [True: 0, False: 642k]
  ------------------
  235|      0|      throw std::runtime_error(
  236|      0|        std::string("Type ") + what + " recurses past the limit of " +
  237|      0|        std::to_string(maxInferenceRecursionDepth) + " levels");
  238|      0|    }
  239|   642k|    ++inferenceDepth;
  240|   642k|  }
typeinf.C:_ZN6hobbes12_GLOBAL__N_119inferenceDepthGuardD2Ev:
  241|   642k|  ~inferenceDepthGuard() { --inferenceDepth; }
_ZN6hobbes14substituteIntoC2EPNS_15MonoTypeUnifierERNS_8UTypeRecE:
  315|   127k|  substituteInto(MonoTypeUnifier* s, UTypeRec& uty) : s(s), uty(uty) { }
_ZNK6hobbes14substituteInto4withEPKNS_4TVarE:
  317|  76.1k|  MonoTypePtr with(const TVar* v) const override {
  318|  76.1k|    return this->s->binding(v->name());
  319|  76.1k|  }
_ZNK6hobbes14substituteInto4withEPKNS_4TAppE:
  321|  1.68k|  MonoTypePtr with(const TApp* v) const override {
  322|  1.68k|    markVisited mv(this->uty);
  323|  1.68k|    MonoTypePtr f = this->s->substitute(v->fn());
  324|  1.68k|    MonoTypes args;
  325|  3.31k|    for (const auto& arg : v->args()) {
  ------------------
  |  Branch (325:26): [True: 3.31k, False: 1.68k]
  ------------------
  326|  3.31k|      args.push_back(this->s->substitute(arg));
  327|  3.31k|    }
  328|  1.68k|    return MonoTypePtr(TApp::make(f, args));
  329|  1.68k|  }
typeinf.C:_ZN6hobbes12_GLOBAL__N_111markVisitedC2ERNS_8UTypeRecE:
  255|  47.9k|  markVisited(UTypeRec& uty) : uty(uty) { this->uty.visited = true; }
typeinf.C:_ZN6hobbes12_GLOBAL__N_111markVisitedD2Ev:
  256|  47.9k|  ~markVisited() { this->uty.visited = false; }
_ZNK6hobbes14substituteInto4withEPKNS_10FixedArrayE:
  331|    183|  MonoTypePtr with(const FixedArray* v) const override {
  332|    183|    markVisited mv(this->uty);
  333|    183|    MonoTypePtr t = this->s->substitute(v->type());
  334|    183|    MonoTypePtr l = this->s->substitute(v->length());
  335|    183|    return MonoTypePtr(FixedArray::make(t, l));
  336|    183|  }
_ZNK6hobbes14substituteInto4withEPKNS_5ArrayE:
  338|  5.46k|  MonoTypePtr with(const Array* v) const override {
  339|  5.46k|    markVisited mv(this->uty);
  340|  5.46k|    MonoTypePtr e = this->s->substitute(v->type());
  341|  5.46k|    return MonoTypePtr(Array::make(e));
  342|  5.46k|  }
_ZNK6hobbes14substituteInto4withEPKNS_7VariantE:
  344|  2.99k|  MonoTypePtr with(const Variant* v) const override {
  345|  2.99k|    markVisited mv(this->uty);
  346|  2.99k|    Variant::Members vms;
  347|  5.98k|    for (const auto& c : v->members()) {
  ------------------
  |  Branch (347:24): [True: 5.98k, False: 2.99k]
  ------------------
  348|  5.98k|      vms.push_back(Variant::Member(c.selector, this->s->substitute(c.type), c.id));
  349|  5.98k|    }
  350|  2.99k|    return MonoTypePtr(Variant::make(vms));
  351|  2.99k|  }
_ZNK6hobbes14substituteInto4withEPKNS_6RecordE:
  353|  22.6k|  MonoTypePtr with(const Record* v) const override {
  354|  22.6k|    markVisited mv(this->uty);
  355|  22.6k|    Record::Members rms;
  356|  46.9k|    for (const auto& f : v->members()) {
  ------------------
  |  Branch (356:24): [True: 46.9k, False: 22.6k]
  ------------------
  357|  46.9k|      rms.push_back(Record::Member(f.field, this->s->substitute(f.type), f.offset));
  358|  46.9k|    }
  359|  22.6k|    return MonoTypePtr(Record::make(rms));
  360|  22.6k|  }
_ZNK6hobbes14substituteInto4withEPKNS_4FuncE:
  362|  8.64k|  MonoTypePtr with(const Func* v) const override {
  363|  8.64k|    markVisited mv(this->uty);
  364|  8.64k|    MonoTypePtr a = this->s->substitute(v->argument());
  365|  8.64k|    MonoTypePtr r = this->s->substitute(v->result());
  366|  8.64k|    return MonoTypePtr(Func::make(a, r));
  367|  8.64k|  }
_ZNK6hobbes14substituteInto4withEPKNS_6ExistsE:
  369|  2.48k|  MonoTypePtr with(const Exists* v) const override {
  370|  2.48k|    markVisited mv(this->uty);
  371|  2.48k|    MonoTypePtr at = this->s->substitute(v->absType());
  372|  2.48k|    return MonoTypePtr(Exists::make(v->absTypeName(), at));
  373|  2.48k|  }
_ZNK6hobbes14substituteInto4withEPKNS_9RecursiveE:
  375|  3.82k|  MonoTypePtr with(const Recursive* v) const override {
  376|  3.82k|    markVisited mv(this->uty);
  377|  3.82k|    MonoTypePtr rt = this->s->substitute(v->recType());
  378|  3.82k|    return MonoTypePtr(Recursive::make(v->recTypeName(), rt));
  379|  3.82k|  }
_ZN6hobbes13exprTypeSubstC2EPNS_15MonoTypeUnifierE:
  473|    160|  exprTypeSubst(MonoTypeUnifier* u) : u(u) { }
_ZNK6hobbes13exprTypeSubst6withTyERKSt10shared_ptrINS_8QualTypeEE:
  475|  4.20k|  QualTypePtr withTy(const QualTypePtr& qt) const override {
  476|  4.20k|    return substitute(this->u, qt);
  477|  4.20k|  }
_ZN6hobbes11expTypeInfFC2ERKSt10shared_ptrINS_4TEnvEEPNS_15MonoTypeUnifierEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISI_EE:
  612|  2.63k|  expTypeInfF(const TEnvPtr& tenv, MonoTypeUnifier* u, Definitions* ds) : tenv(tenv), u(u), ds(ds) { }
_ZN6hobbes11expTypeInfF4withEPNS_4UnitE:
  628|    191|  UnitV with(Unit* v) override   { return mkprim(v, "unit"); }
_ZNK6hobbes11expTypeInfF6mkprimEPNS_4ExprERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  623|  1.24k|  UnitV mkprim(Expr* e, const std::string& pn) const {
  624|  1.24k|    e->type(qualtype(MonoTypePtr(Prim::make(pn))));
  625|  1.24k|    return unitv;
  626|  1.24k|  }
_ZN6hobbes11expTypeInfF4withEPNS_4BoolE:
  629|     78|  UnitV with(Bool* v) override   { return mkprim(v, "bool"); }
_ZN6hobbes11expTypeInfF4withEPNS_4CharE:
  630|    130|  UnitV with(Char* v) override   { return mkprim(v, "char"); }
_ZN6hobbes11expTypeInfF4withEPNS_4ByteE:
  631|    169|  UnitV with(Byte* v) override   { return mkprim(v, "byte"); }
_ZN6hobbes11expTypeInfF4withEPNS_5ShortE:
  632|      5|  UnitV with(Short* v) override  { return mkprim(v, "short"); }
_ZN6hobbes11expTypeInfF4withEPNS_3IntE:
  633|    200|  UnitV with(Int* v) override    { return mkprim(v, "int"); }
_ZN6hobbes11expTypeInfF4withEPNS_4LongE:
  634|    458|  UnitV with(Long* v) override   { return mkprim(v, "long"); }
_ZN6hobbes11expTypeInfF4withEPNS_6Int128E:
  635|      4|  UnitV with(Int128* v) override { return mkprim(v, "int128"); }
_ZN6hobbes11expTypeInfF4withEPNS_5FloatE:
  636|      4|  UnitV with(Float* v) override  { return mkprim(v, "float"); }
_ZN6hobbes11expTypeInfF4withEPNS_6DoubleE:
  637|      4|  UnitV with(Double* v) override { return mkprim(v, "double"); }
_ZN6hobbes11expTypeInfF4withEPNS_3VarE:
  639|  8.24k|  UnitV with(Var* v) override {
  640|  8.24k|    v->type(this->tenv->lookup(v->value())->instantiate());
  641|  8.24k|    return unitv;
  642|  8.24k|  }
_ZN6hobbes11expTypeInfF4withEPNS_3LetE:
  644|    659|  UnitV with(Let* v) override {
  645|    659|    switchOf(v->varExpr(), *this);
  646|    659|    switchOf(v->bodyExpr(), expTypeInfF(bindFrame(this->tenv, v->var(), v->varExpr()->type()), this->u, this->ds));
  647|       |
  648|    659|    Constraints cs = mergeConstraints(v->varExpr()->type()->constraints(), v->bodyExpr()->type()->constraints());
  649|    659|    v->type(qt(cs, v->bodyExpr()->type()->monoType()));
  650|    659|    return unitv;
  651|    659|  }
_ZN6hobbes11expTypeInfF2qtERKSt6vectorISt10shared_ptrINS_10ConstraintEESaIS4_EERKS2_INS_8MonoTypeEE:
  619|  18.8k|  QualTypePtr qt(const Constraints& csts, const MonoTypePtr& mt) {
  620|  18.8k|    return qt(qualtype(csts, mt));
  621|  18.8k|  }
_ZN6hobbes11expTypeInfF2qtERKSt10shared_ptrINS_8QualTypeEE:
  614|  18.8k|  const QualTypePtr& qt(const QualTypePtr& qty) {
  615|  18.8k|    refine(this->tenv, qty, this->u, this->ds);
  616|  18.8k|    return qty;
  617|  18.8k|  }
_ZN6hobbes11expTypeInfF4withEPNS_6LetRecE:
  662|      4|  UnitV with(LetRec* v) override {
  663|      4|    TEnvPtr lrtenv = letRecFrame(this->tenv, v->bindings());
  664|       |
  665|      4|    Constraints cs;
  666|      4|    for (auto& b : v->bindings()) {
  ------------------
  |  Branch (666:18): [True: 4, False: 4]
  ------------------
  667|      4|      switchOf(b.second, expTypeInfF(lrtenv, this->u, this->ds));
  668|      4|      mgu(b.second, lrtenv->lookup(b.first)->instantiate(), this->u);
  669|      4|      mergeConstraints(b.second->type()->constraints(), &cs);
  670|      4|    }
  671|       |
  672|      4|    switchOf(v->bodyExpr(), expTypeInfF(lrtenv, this->u, this->ds));
  673|      4|    mergeConstraints(v->bodyExpr()->type()->constraints(), &cs);
  674|       |
  675|      4|    v->type(qt(cs, v->bodyExpr()->type()->monoType()));
  676|      4|    return unitv;
  677|      4|  }
_ZN6hobbes11expTypeInfF11letRecFrameERKSt10shared_ptrINS_4TEnvEERKSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES1_INS_4ExprEEESaISG_EE:
  653|      4|  static TEnvPtr letRecFrame(const TEnvPtr& ptenv, const LetRec::Bindings& bs) {
  654|       |    // assume that letrec bindings must be functions
  655|      4|    TEnvPtr r(new TEnv(ptenv));
  656|      4|    for (const auto& b : bs) {
  ------------------
  |  Branch (656:24): [True: 4, False: 4]
  ------------------
  657|      4|      r->bind(b.first, polytype(MonoTypePtr(Func::make(freshTypeVar(), freshTypeVar()))));
  658|      4|    }
  659|      4|    return r;
  660|      4|  }
_ZN6hobbes11expTypeInfF4withEPNS_2FnE:
  679|    587|  UnitV with(Fn* v) override {
  680|    587|    MonoTypes argl = freshTypeVars(v->varNames().size());
  681|    587|    switchOf(v->body(), expTypeInfF(fnFrame(this->tenv, v->varNames(), argl), this->u, this->ds));
  682|       |
  683|    587|    v->type(qt(v->body()->type()->constraints(), MonoTypePtr(Func::make(tuplety(argl), v->body()->type()->monoType()))));
  684|    587|    return unitv;
  685|    587|  }
_ZN6hobbes11expTypeInfF4withEPNS_3AppE:
  687|  3.29k|  UnitV with(App* v) override {
  688|  3.29k|    switchOf(v->fn(), *this);
  689|       |
  690|  3.29k|    Constraints csts;
  691|  3.29k|    mergeConstraints(v->fn()->type()->constraints(), &csts);
  692|       |
  693|  3.29k|    MonoTypes atys;
  694|  6.79k|    for (auto &a : v->args()) {
  ------------------
  |  Branch (694:18): [True: 6.79k, False: 3.29k]
  ------------------
  695|  6.79k|      switchOf(a, *this);
  696|  6.79k|      mergeConstraints(a->type()->constraints(), &csts);
  697|  6.79k|      atys.push_back(a->type()->monoType());
  698|  6.79k|    }
  699|       |
  700|  3.29k|    MonoTypePtr irty = freshTypeVar();
  701|  3.29k|    mgu(v->fn(), qt(csts, functy(atys, irty)), this->u);
  702|  3.29k|    v->type(qt(csts, irty));
  703|  3.29k|    return unitv;
  704|  3.29k|  }
_ZN6hobbes11expTypeInfF4withEPNS_6AssignE:
  706|    109|  UnitV with(Assign* v) override {
  707|    109|    switchOf(v->left(),  *this);
  708|    109|    switchOf(v->right(), *this);
  709|       |
  710|       |    // for now, we have a special-case for assignment into records
  711|    109|    if (Proj* p = is<Proj>(v->left())) {
  ------------------
  |  Branch (711:15): [True: 23, False: 86]
  ------------------
  712|       |      // try to patch the constraint for the left read to instead become a write
  713|       |      // there should always be such a constraint, given the definition of type inference on record projections
  714|     23|      bool foundcst = false;
  715|     84|      for (const auto& cst : v->left()->type()->constraints()) {
  ------------------
  |  Branch (715:28): [True: 84, False: 23]
  ------------------
  716|     84|        HasField hf;
  717|     84|        if (dec(cst, &hf)) {
  ------------------
  |  Branch (717:13): [True: 35, False: 49]
  ------------------
  718|     35|          if (const TString* lbl = is<TString>(hf.fieldName)) {
  ------------------
  |  Branch (718:30): [True: 35, False: 0]
  ------------------
  719|     35|            MonoTypePtr trecty = this->u->substitute(hf.recordType);
  720|     35|            MonoTypePtr arecty = this->u->substitute(p->record()->type()->monoType());
  721|       |
  722|     35|            if (lbl->value() == p->field() && *trecty == *arecty) {
  ------------------
  |  Branch (722:17): [True: 28, False: 7]
  |  Branch (722:47): [True: 27, False: 1]
  ------------------
  723|     27|              hf.direction  = HasField::Write;
  724|     27|              hf.recordType = arecty;
  725|     27|              hf.fieldType  = v->right()->type()->monoType();
  726|     27|              upd(cst, hf);
  727|       |
  728|     27|              p->record()->type()->monoType(arecty);
  729|     27|              foundcst = true;
  730|     27|            }
  731|     35|          }
  732|     35|        }
  733|     84|      }
  734|       |
  735|     23|      if (!foundcst) {
  ------------------
  |  Branch (735:11): [True: 0, False: 23]
  ------------------
  736|      0|        throw annotated_error(*v, "Internal error, type inference on record assignment is internally inconsistent");
  737|      0|      }
  738|       |
  739|     23|      Constraints cs;
  740|     23|      mergeConstraints(v->left()->type()->constraints(), &cs);
  741|     23|      mergeConstraints(v->right()->type()->constraints(), &cs);
  742|       |
  743|     23|      v->type(qt(cs, MonoTypePtr(Prim::make("unit"))));
  744|     23|      return unitv;
  745|     86|    } else {
  746|     86|      mgu(v->left(), v->right(), this->u);
  747|       |
  748|     86|      Constraints cs = mergeConstraints(v->left()->type()->constraints(), v->right()->type()->constraints());
  749|     86|      v->type(qt(cs, MonoTypePtr(Prim::make("unit"))));
  750|     86|      return unitv;
  751|     86|    }
  752|    109|  }
_ZN6hobbes11expTypeInfF4withEPNS_7MkArrayE:
  754|     67|  UnitV with(MkArray* v) override {
  755|     67|    Constraints cs;
  756|     67|    MonoTypePtr ety  = freshTypeVar();
  757|     67|    QualTypePtr qety = qualtype(ety);
  758|       |
  759|    187|    for (auto &e : v->values()) {
  ------------------
  |  Branch (759:18): [True: 187, False: 67]
  ------------------
  760|    187|      switchOf(e, *this);
  761|    187|      mgu(e, qety, this->u);
  762|    187|      cs = mergeConstraints(e->type()->constraints(), cs);
  763|    187|    }
  764|       |
  765|     67|    v->type(qt(cs, arrayty(ety)));
  766|     67|    return unitv;
  767|     67|  }
_ZN6hobbes11expTypeInfF4withEPNS_9MkVariantE:
  770|     92|  UnitV with(MkVariant* v) override {
  771|     92|    switchOf(v->value(), *this);
  772|       |
  773|     92|    MonoTypePtr   vty  = freshTypeVar();
  774|     92|    ConstraintPtr c    = std::make_shared<Constraint>(CtorVerifier::constraintName(), list(vty, MonoTypePtr(TString::make(v->label())), v->value()->type()->monoType()));
  775|     92|    Constraints   cs   = mergeConstraints(v->value()->type()->constraints(), list(c));
  776|       |
  777|     92|    v->type(qt(cs, vty));
  778|     92|    return unitv;
  779|     92|  }
_ZN6hobbes11expTypeInfF4withEPNS_8MkRecordE:
  781|     99|  UnitV with(MkRecord* v) override {
  782|     99|    QualTypes ftys;
  783|     99|    str::set fnames;
  784|       |
  785|    312|    for (MkRecord::FieldDefs::const_iterator f = v->fields().begin(); f != v->fields().end(); ++f) {
  ------------------
  |  Branch (785:71): [True: 213, False: 99]
  ------------------
  786|    213|      if (!fnames.insert(f->first).second) {
  ------------------
  |  Branch (786:11): [True: 0, False: 213]
  ------------------
  787|      0|        throw annotated_error(*v, "Duplicate field name introduction: " + f->first);
  788|      0|      }
  789|       |
  790|    213|      switchOf(f->second, *this);
  791|    213|      ftys.push_back(f->second->type());
  792|    213|    }
  793|       |
  794|     99|    QualLiftedMonoTypes qmt = liftQualifiers(ftys);
  795|     99|    v->type(qt(qmt.first, MonoTypePtr(Record::make(makeRecordMembers(v->fields(), qmt.second)))));
  796|     99|    return unitv;
  797|     99|  }
_ZN6hobbes11expTypeInfF4withEPNS_6AIndexE:
  799|    245|  UnitV with(AIndex* v) override {
  800|    245|    v->index(assume(fncall(var("convert", v->index()->la()), list(v->index()), v->index()->la()), primty("long"), v->index()->la()));
  801|       |
  802|    245|    switchOf(v->array(), *this);
  803|    245|    switchOf(v->index(), *this);
  804|       |
  805|    245|    MonoTypePtr elemTy = freshTypeVar();
  806|    245|    mgu(v->array(), qualtype(arrayty(elemTy)), this->u);
  807|    245|    mgu(v->index(), qualtype(Prim::make("long")), this->u);
  808|       |
  809|    245|    Constraints cs = mergeConstraints(v->array()->type()->constraints(), v->index()->type()->constraints());
  810|    245|    v->type(qt(cs, elemTy));
  811|    245|    return unitv;
  812|    245|  }
_ZN6hobbes11expTypeInfF4withEPNS_4CaseE:
  847|     53|  UnitV with(Case* v) override {
  848|       |    // if a default case is specified, the set of variant constructors is open
  849|     53|    if (v->defaultExpr().get() != nullptr) {
  ------------------
  |  Branch (849:9): [True: 29, False: 24]
  ------------------
  850|     29|      return withGenericMeaning(v);
  851|     29|    }
  852|       |
  853|       |    // no default case, assume that this 'case' term fully contains the constructor set
  854|     24|    Case::Bindings   cbs;
  855|     24|    Variant::Members vms;
  856|     24|    MonoTypePtr      rty = freshTypeVar();
  857|     24|    Constraints      cs;
  858|     24|    int              cidx = 0;
  859|       |
  860|     48|    for (auto &b : v->bindings()) {
  ------------------
  |  Branch (860:18): [True: 48, False: 24]
  ------------------
  861|     48|      MonoTypePtr bty = freshTypeVar();
  862|     48|      switchOf(b.exp, expTypeInfF(bindFrame(this->tenv, b.vname, bty), this->u, this->ds));
  863|       |
  864|     48|      mgu(b.exp, qualtype(rty), this->u);
  865|       |
  866|     48|      cbs.push_back(Case::Binding(b.selector, b.vname, b.exp));
  867|     48|      vms.push_back(Variant::Member(b.selector, bty, cidx++));
  868|     48|      cs = mergeConstraints(cs, b.exp->type()->constraints());
  869|     48|    }
  870|       |
  871|     24|    switchOf(v->variant(), *this);
  872|       |
  873|       |    // now we need to infer the variant type, but as a bit of a hack, let's see if the lhs actually has a type on it
  874|       |    // and if so then we can patch up the inferred constructor IDs
  875|     24|    if (const Variant* vty = is<Variant>(v->variant()->type()->monoType())) {
  ------------------
  |  Branch (875:24): [True: 0, False: 24]
  ------------------
  876|      0|      for (auto &vm : vms) {
  ------------------
  |  Branch (876:21): [True: 0, False: 0]
  ------------------
  877|      0|        try {
  878|      0|          vm.id = vty->id(vm.selector);
  879|      0|        } catch (...) {
  880|      0|        }
  881|      0|      }
  882|      0|    }
  883|     24|    mgu(v->variant(), qualtype(Variant::make(vms)), this->u);
  884|       |
  885|       |    // finally the type of this case analysis merges constraints across all cases and all branches have the same result type
  886|     24|    cs = mergeConstraints(cs, v->variant()->type()->constraints());
  887|     24|    v->type(qt(cs, rty));
  888|     24|    return unitv;
  889|     24|  }
_ZN6hobbes11expTypeInfF18withGenericMeaningEPNS_4CaseE:
  816|     29|  UnitV withGenericMeaning(Case* v) {
  817|     29|    switchOf(v->variant(), *this);
  818|       |
  819|     29|    MonoTypePtr    rty = freshTypeVar();
  820|     29|    Case::Bindings cbs;
  821|     29|    Constraints    cs;
  822|     29|    Constraints    vcs;
  823|       |
  824|     58|    for (Case::Bindings::const_iterator b = v->bindings().begin(); b != v->bindings().end(); ++b) {
  ------------------
  |  Branch (824:68): [True: 29, False: 29]
  ------------------
  825|     29|      MonoTypePtr bty = freshTypeVar();
  826|     29|      switchOf(b->exp, expTypeInfF(bindFrame(this->tenv, b->vname, bty), this->u, this->ds));
  827|       |
  828|     29|      mgu(b->exp, qualtype(rty), this->u);
  829|       |
  830|     29|      cbs.push_back(Case::Binding(b->selector, b->vname, b->exp));
  831|     29|      cs = mergeConstraints(cs, b->exp->type()->constraints());
  832|     29|      vcs.push_back(std::make_shared<Constraint>(CtorVerifier::constraintName(), list(v->variant()->type()->monoType(), MonoTypePtr(TString::make(b->selector)), bty)));
  833|     29|    }
  834|     29|    v->variant()->type(qt(mergeConstraints(vcs, v->variant()->type()->constraints()), v->variant()->type()->monoType()));
  835|       |
  836|     29|    if (v->defaultExpr()) {
  ------------------
  |  Branch (836:9): [True: 29, False: 0]
  ------------------
  837|     29|      switchOf(v->defaultExpr(), *this);
  838|     29|      mgu(v->defaultExpr(), qualtype(rty), this->u);
  839|     29|      cs = mergeConstraints(cs, v->defaultExpr()->type()->constraints());
  840|     29|    }
  841|     29|    cs = mergeConstraints(cs, v->variant()->type()->constraints());
  842|     29|    v->type(qt(cs, rty));
  843|       |
  844|     29|    return unitv;
  845|     29|  }
_ZN6hobbes11expTypeInfF4withEPNS_6SwitchE:
  891|      8|  UnitV with(Switch* v) override {
  892|      8|    switchOf(v->expr(), *this);
  893|      8|    mgu(v->expr(), qualtype(v->bindings()[0].value->primType()), this->u);
  894|       |
  895|      8|    Constraints cs = v->expr()->type()->constraints();
  896|       |
  897|      8|    Switch::Bindings& bs = v->bindings();
  898|      8|    switchOf(bs[0].exp, *this);
  899|      8|    QualTypePtr bty = bs[0].exp->type();
  900|      8|    cs = mergeConstraints(cs, bty->constraints());
  901|       |
  902|     21|    for (size_t i = 1; i < bs.size(); ++i) {
  ------------------
  |  Branch (902:24): [True: 13, False: 8]
  ------------------
  903|     13|      switchOf(bs[i].exp, *this);
  904|     13|      mgu(bs[i].exp, bty, this->u);
  905|     13|      cs = mergeConstraints(cs, bs[i].exp->type()->constraints());
  906|     13|    }
  907|       |
  908|      8|    if (v->defaultExpr()) {
  ------------------
  |  Branch (908:9): [True: 8, False: 0]
  ------------------
  909|      8|      switchOf(v->defaultExpr(), *this);
  910|      8|      mgu(v->defaultExpr(), bty, this->u);
  911|      8|      cs = mergeConstraints(cs, v->defaultExpr()->type()->constraints());
  912|      8|    }
  913|       |
  914|      8|    v->type(qt(cs, bty->monoType()));
  915|      8|    return unitv;
  916|      8|  }
_ZN6hobbes11expTypeInfF4withEPNS_4ProjE:
  919|    261|  UnitV with(Proj* v) override {
  920|    261|    switchOf(v->record(), *this);
  921|       |
  922|    261|    MonoTypePtr   fty  = freshTypeVar();
  923|    261|    ConstraintPtr fcst = HasField::constraint(HasField::Read, v->record()->type()->monoType(), MonoTypePtr(TString::make(v->field())), fty, v->record());
  924|    261|    Constraints   cs   = mergeConstraints(v->record()->type()->constraints(), list(fcst));
  925|       |
  926|    261|    v->type(qt(cs, fty));
  927|    261|    return unitv;
  928|    261|  }
_ZN6hobbes11expTypeInfF4withEPNS_6AssumpE:
  930|  3.35k|  UnitV with(Assump* v) override {
  931|  3.35k|    switchOf(v->expr(), *this);
  932|  3.35k|    mgu(v->expr(), v->ty(), this->u);
  933|       |
  934|       |    // hack?  allow user refinement of type predicates
  935|       |    // this works by unifying user constraints with inferred constraints IFF there's just one unifiable constraint inferred for each user constraint
  936|  3.35k|    QualTypePtr eqty = qt(v->expr()->type()->constraints(), v->expr()->type()->monoType());
  937|  3.35k|    QualTypePtr uqty = qt(v->ty()->constraints(), v->ty()->monoType());
  938|       |
  939|  3.35k|    for (const ConstraintPtr& uc : uqty->constraints()) {
  ------------------
  |  Branch (939:34): [True: 268, False: 3.35k]
  ------------------
  940|    268|      ConstraintPtr cec; // the one plausible constraint to unify with (if just one can be found)
  941|       |
  942|  1.02k|      for (const ConstraintPtr& ec : eqty->constraints()) {
  ------------------
  |  Branch (942:36): [True: 1.02k, False: 254]
  ------------------
  943|  1.02k|        ec->update(this->u);
  944|  1.02k|        if (!satisfied(this->tenv, ec, this->ds)) {
  ------------------
  |  Branch (944:13): [True: 315, False: 706]
  ------------------
  945|    315|          if (ec->name() == uc->name() && unifiable(this->tenv, uc, ec)) {
  ------------------
  |  Branch (945:15): [True: 123, False: 192]
  |  Branch (945:15): [True: 123, False: 192]
  |  Branch (945:43): [True: 123, False: 0]
  ------------------
  946|    123|            if (cec) {
  ------------------
  |  Branch (946:17): [True: 14, False: 109]
  ------------------
  947|       |              // ambiguous, do nothing
  948|     14|              cec = ConstraintPtr();
  949|     14|              break;
  950|    109|            } else {
  951|    109|              cec = ec;
  952|    109|            }
  953|    123|          }
  954|    315|        }
  955|  1.02k|      }
  956|       |
  957|    268|      if (cec) {
  ------------------
  |  Branch (957:11): [True: 95, False: 173]
  ------------------
  958|     95|        mgu(cec, uc, this->u);
  959|     95|      }
  960|    268|    }
  961|  3.35k|    v->type(qt(mergeConstraints(uqty->constraints(), eqty->constraints()), eqty->monoType()));
  962|  3.35k|    return unitv;
  963|  3.35k|  }
_ZN6hobbes11expTypeInfF4withEPNS_4PackE:
  965|     23|  UnitV with(Pack* v) override {
  966|     23|    switchOf(v->expr(), *this);
  967|       |
  968|     23|    MonoTypePtr   packedType = freshTypeVar();
  969|     23|    ConstraintPtr pcst       = std::make_shared<Constraint>(Existentials::constraintName(), list(v->expr()->type()->monoType(), packedType));
  970|       |
  971|     23|    Constraints cs = mergeConstraints(v->expr()->type()->constraints(), list(pcst));
  972|     23|    v->type(qt(cs, packedType));
  973|     23|    return unitv;
  974|     23|  }
_ZN6hobbes11expTypeInfF4withEPNS_6UnpackE:
  976|      6|  UnitV with(Unpack* v) override {
  977|      6|    switchOf(v->package(), *this);
  978|      6|    switchOf(v->expr(), expTypeInfF(bindFrame(this->tenv, v->varName(), unpackedType(substitute(this->u, v->package()->type()))), this->u, this->ds));
  979|       |
  980|      6|    Constraints cs = mergeConstraints(v->package()->type()->constraints(), v->expr()->type()->constraints());
  981|       |
  982|      6|    v->type(qt(cs, v->expr()->type()->monoType()));
  983|      6|    return unitv;
  984|      6|  }
_ZN6hobbes18applySubstitutionFC2EPNS_15MonoTypeUnifierE:
  990|  1.29k|  applySubstitutionF(MonoTypeUnifier* s) : s(s) { }
_ZNK6hobbes18applySubstitutionF6withTyERKSt10shared_ptrINS_8QualTypeEE:
  992|  21.7k|  QualTypePtr withTy(const QualTypePtr& qt) const override {
  993|  21.7k|    return substitute(this->s, qt);
  994|  21.7k|  }

_ZNK6hobbes10MonoTypeLTclERKSt10shared_ptrINS_8MonoTypeEES5_:
  187|   408k|bool MonoTypeLT::operator()(const MonoTypePtr& lhs, const MonoTypePtr& rhs) const {
  188|   408k|  if (lhs.get() == rhs.get()) {
  ------------------
  |  Branch (188:7): [True: 159k, False: 248k]
  ------------------
  189|   159k|    return false; // if the types are the same objects in memory, then they must be equal
  190|   159k|  }
  191|       |
  192|   248k|  int ltid = lhs->case_id();
  193|   248k|  int rtid = rhs->case_id();
  194|   248k|  if (ltid != rtid) {
  ------------------
  |  Branch (194:7): [True: 17.9k, False: 230k]
  ------------------
  195|  17.9k|    return ltid < rtid;
  196|   230k|  } else {
  197|   230k|    return switchOf(lhs, mtyLT(rhs));
  198|   230k|  }
  199|   248k|}
_ZN6hobbes5mtyLTC2ERKSt10shared_ptrINS_8MonoTypeEE:
    8|   230k|  mtyLT(const MonoTypePtr& rhs) : rhs(rhs) { }
_ZNK6hobbes5mtyLT4withEPKNS_4PrimE:
   18|  10.1k|  bool with(const Prim*    v) const override { return v->name() < right<Prim>()->name(); }
_ZNK6hobbes5mtyLT5rightINS_4PrimEEEPKT_v:
   10|  10.1k|    const T* right() const {
   11|  10.1k|      const T* r = is<T>(this->rhs);
   12|  10.1k|      if (!r) {
  ------------------
  |  Branch (12:11): [True: 0, False: 10.1k]
  ------------------
   13|      0|        throw std::runtime_error("Internal error, type IDs must be out of sequence");
   14|      0|      }
   15|  10.1k|      return r;
   16|  10.1k|    }
_ZNK6hobbes5mtyLT4withEPKNS_9OpaquePtrE:
   59|     49|  bool with(const OpaquePtr* v) const override {
   60|     49|    const auto* r = right<OpaquePtr>();
   61|       |
   62|     49|    if (v->name() != r->name()) {
  ------------------
  |  Branch (62:9): [True: 49, False: 0]
  ------------------
   63|     49|      return v->name() < r->name();
   64|     49|    } else if (v->storedContiguously() != r->storedContiguously()) {
  ------------------
  |  Branch (64:16): [True: 0, False: 0]
  ------------------
   65|      0|      return static_cast<int>(v->storedContiguously()) < static_cast<int>(r->storedContiguously());
   66|      0|    } else if (v->storedContiguously()) {
  ------------------
  |  Branch (66:16): [True: 0, False: 0]
  ------------------
   67|      0|      return v->size() < r->size();
   68|      0|    } else {
   69|      0|      return false;
   70|      0|    }
   71|     49|  }
_ZNK6hobbes5mtyLT5rightINS_9OpaquePtrEEEPKT_v:
   10|     49|    const T* right() const {
   11|     49|      const T* r = is<T>(this->rhs);
   12|     49|      if (!r) {
  ------------------
  |  Branch (12:11): [True: 0, False: 49]
  ------------------
   13|      0|        throw std::runtime_error("Internal error, type IDs must be out of sequence");
   14|      0|      }
   15|     49|      return r;
   16|     49|    }
_ZNK6hobbes5mtyLT4withEPKNS_4TVarE:
   19|  22.1k|  bool with(const TVar*    v) const override { return v->name() < right<TVar>()->name(); }
_ZNK6hobbes5mtyLT5rightINS_4TVarEEEPKT_v:
   10|  22.1k|    const T* right() const {
   11|  22.1k|      const T* r = is<T>(this->rhs);
   12|  22.1k|      if (!r) {
  ------------------
  |  Branch (12:11): [True: 0, False: 22.1k]
  ------------------
   13|      0|        throw std::runtime_error("Internal error, type IDs must be out of sequence");
   14|      0|      }
   15|  22.1k|      return r;
   16|  22.1k|    }
_ZNK6hobbes5mtyLT4withEPKNS_4TAppE:
   35|    339|  bool with(const TApp* v) const override {
   36|    339|    const MonoTypes& largs = v->args();
   37|    339|    const MonoTypes& rargs = right<TApp>()->args();
   38|       |
   39|    339|    if (MonoTypeLT()(v->fn(), right<TApp>()->fn())) {
  ------------------
  |  Branch (39:9): [True: 139, False: 200]
  ------------------
   40|    139|      return true;
   41|    200|    } else if (MonoTypeLT()(right<TApp>()->fn(), v->fn())) {
  ------------------
  |  Branch (41:16): [True: 68, False: 132]
  ------------------
   42|     68|      return false;
   43|    132|    } else if (largs.size() < rargs.size()) {
  ------------------
  |  Branch (43:16): [True: 19, False: 113]
  ------------------
   44|     19|      return true;
   45|    113|    } else if (rargs.size() < largs.size()) {
  ------------------
  |  Branch (45:16): [True: 7, False: 106]
  ------------------
   46|      7|      return false;
   47|    106|    } else {
   48|    106|      for (size_t i = 0; i < largs.size(); ++i) {
  ------------------
  |  Branch (48:26): [True: 106, False: 0]
  ------------------
   49|    106|        if (MonoTypeLT()(largs[i], rargs[i])) {
  ------------------
  |  Branch (49:13): [True: 91, False: 15]
  ------------------
   50|     91|          return true;
   51|     91|        } else if (MonoTypeLT()(rargs[i], largs[i])) {
  ------------------
  |  Branch (51:20): [True: 15, False: 0]
  ------------------
   52|     15|          return false;
   53|     15|        }
   54|    106|      }
   55|      0|      return false;
   56|    106|    }
   57|    339|  }
_ZNK6hobbes5mtyLT5rightINS_4TAppEEEPKT_v:
   10|    878|    const T* right() const {
   11|    878|      const T* r = is<T>(this->rhs);
   12|    878|      if (!r) {
  ------------------
  |  Branch (12:11): [True: 0, False: 878]
  ------------------
   13|      0|        throw std::runtime_error("Internal error, type IDs must be out of sequence");
   14|      0|      }
   15|    878|      return r;
   16|    878|    }
_ZNK6hobbes5mtyLT4withEPKNS_10FixedArrayE:
   73|      9|  bool with(const FixedArray* v) const override {
   74|      9|    const auto* r = right<FixedArray>();
   75|       |
   76|      9|    if (MonoTypeLT()(v->type(), r->type())) {
  ------------------
  |  Branch (76:9): [True: 6, False: 3]
  ------------------
   77|      6|      return true;
   78|      6|    } else if (MonoTypeLT()(r->type(), v->type())) {
  ------------------
  |  Branch (78:16): [True: 3, False: 0]
  ------------------
   79|      3|      return false;
   80|      3|    } else if (MonoTypeLT()(v->length(), r->length())) {
  ------------------
  |  Branch (80:16): [True: 0, False: 0]
  ------------------
   81|      0|      return true;
   82|      0|    } else if (MonoTypeLT()(r->length(), v->length())) {
  ------------------
  |  Branch (82:16): [True: 0, False: 0]
  ------------------
   83|      0|      return false;
   84|      0|    } else {
   85|      0|      return false;
   86|      0|    }
   87|      9|  }
_ZNK6hobbes5mtyLT5rightINS_10FixedArrayEEEPKT_v:
   10|      9|    const T* right() const {
   11|      9|      const T* r = is<T>(this->rhs);
   12|      9|      if (!r) {
  ------------------
  |  Branch (12:11): [True: 0, False: 9]
  ------------------
   13|      0|        throw std::runtime_error("Internal error, type IDs must be out of sequence");
   14|      0|      }
   15|      9|      return r;
   16|      9|    }
_ZNK6hobbes5mtyLT4withEPKNS_5ArrayE:
   21|  2.75k|  bool with(const Array*   v) const override { return MonoTypeLT()(v->type(), right<Array>()->type()); }
_ZNK6hobbes5mtyLT5rightINS_5ArrayEEEPKT_v:
   10|  2.75k|    const T* right() const {
   11|  2.75k|      const T* r = is<T>(this->rhs);
   12|  2.75k|      if (!r) {
  ------------------
  |  Branch (12:11): [True: 0, False: 2.75k]
  ------------------
   13|      0|        throw std::runtime_error("Internal error, type IDs must be out of sequence");
   14|      0|      }
   15|  2.75k|      return r;
   16|  2.75k|    }
_ZNK6hobbes5mtyLT4withEPKNS_7VariantE:
  105|    208|  bool with(const Variant* v) const override {
  106|    208|    const auto* r = right<Variant>();
  107|       |
  108|    208|    if (v->members().size() != r->members().size()) {
  ------------------
  |  Branch (108:9): [True: 0, False: 208]
  ------------------
  109|      0|      return v->members().size() < r->members().size();
  110|    208|    } else {
  111|    411|      for (size_t i = 0; i < v->members().size(); ++i) {
  ------------------
  |  Branch (111:26): [True: 411, False: 0]
  ------------------
  112|    411|        const Variant::Member& lm = v->members()[i];
  113|    411|        const Variant::Member& rm = r->members()[i];
  114|       |
  115|    411|        if (lm.selector != rm.selector) {
  ------------------
  |  Branch (115:13): [True: 0, False: 411]
  ------------------
  116|      0|          return lm.selector < rm.selector;
  117|    411|        } else if (lm.id != rm.id) {
  ------------------
  |  Branch (117:20): [True: 0, False: 411]
  ------------------
  118|      0|          return lm.id < rm.id;
  119|    411|        } else if (MonoTypeLT()(lm.type, rm.type)) {
  ------------------
  |  Branch (119:20): [True: 160, False: 251]
  ------------------
  120|    160|          return true;
  121|    251|        } else if (MonoTypeLT()(rm.type, lm.type)) {
  ------------------
  |  Branch (121:20): [True: 48, False: 203]
  ------------------
  122|     48|          return false;
  123|     48|        }
  124|    411|      }
  125|      0|      return false;
  126|    208|    }
  127|    208|  }
_ZNK6hobbes5mtyLT5rightINS_7VariantEEEPKT_v:
   10|    208|    const T* right() const {
   11|    208|      const T* r = is<T>(this->rhs);
   12|    208|      if (!r) {
  ------------------
  |  Branch (12:11): [True: 0, False: 208]
  ------------------
   13|      0|        throw std::runtime_error("Internal error, type IDs must be out of sequence");
   14|      0|      }
   15|    208|      return r;
   16|    208|    }
_ZNK6hobbes5mtyLT4withEPKNS_6RecordE:
  129|  13.7k|  bool with(const Record* v) const override {
  130|  13.7k|    const auto* r = right<Record>();
  131|       |
  132|  13.7k|    if (v->members().size() != r->members().size()) {
  ------------------
  |  Branch (132:9): [True: 2.10k, False: 11.6k]
  ------------------
  133|  2.10k|      return v->members().size() < r->members().size();
  134|  11.6k|    } else {
  135|  15.2k|      for (size_t i = 0; i < v->members().size(); ++i) {
  ------------------
  |  Branch (135:26): [True: 15.2k, False: 0]
  ------------------
  136|  15.2k|        const Record::Member& lm = v->members()[i];
  137|  15.2k|        const Record::Member& rm = r->members()[i];
  138|       |
  139|  15.2k|        if (lm.field != rm.field) {
  ------------------
  |  Branch (139:13): [True: 2, False: 15.2k]
  ------------------
  140|      2|          return lm.field < rm.field;
  141|  15.2k|        } else if (lm.offset != rm.offset) {
  ------------------
  |  Branch (141:20): [True: 609, False: 14.6k]
  ------------------
  142|    609|          return lm.offset < rm.offset;
  143|  14.6k|        } else if (MonoTypeLT()(lm.type, rm.type)) {
  ------------------
  |  Branch (143:20): [True: 8.43k, False: 6.18k]
  ------------------
  144|  8.43k|          return true;
  145|  8.43k|        } else if (MonoTypeLT()(rm.type, lm.type)) {
  ------------------
  |  Branch (145:20): [True: 2.63k, False: 3.55k]
  ------------------
  146|  2.63k|          return false;
  147|  2.63k|        }
  148|  15.2k|      }
  149|      0|      return false;
  150|  11.6k|    }
  151|  13.7k|  }
_ZNK6hobbes5mtyLT5rightINS_6RecordEEEPKT_v:
   10|  13.7k|    const T* right() const {
   11|  13.7k|      const T* r = is<T>(this->rhs);
   12|  13.7k|      if (!r) {
  ------------------
  |  Branch (12:11): [True: 0, False: 13.7k]
  ------------------
   13|      0|        throw std::runtime_error("Internal error, type IDs must be out of sequence");
   14|      0|      }
   15|  13.7k|      return r;
   16|  13.7k|    }
_ZNK6hobbes5mtyLT4withEPKNS_4FuncE:
   89|  2.52k|  bool with(const Func* v) const override {
   90|  2.52k|    const Func* r = right<Func>();
   91|       |
   92|  2.52k|    if (MonoTypeLT()(v->argument(), r->argument())) {
  ------------------
  |  Branch (92:9): [True: 2.05k, False: 477]
  ------------------
   93|  2.05k|      return true;
   94|  2.05k|    } else if (MonoTypeLT()(r->argument(), v->argument())) {
  ------------------
  |  Branch (94:16): [True: 420, False: 57]
  ------------------
   95|    420|      return false;
   96|    420|    } else if (MonoTypeLT()(v->result(), r->result())) {
  ------------------
  |  Branch (96:16): [True: 49, False: 8]
  ------------------
   97|     49|      return true;
   98|     49|    } else if (MonoTypeLT()(r->result(), v->result())) {
  ------------------
  |  Branch (98:16): [True: 8, False: 0]
  ------------------
   99|      8|      return false;
  100|      8|    } else {
  101|      0|      return false;
  102|      0|    }
  103|  2.52k|  }
_ZNK6hobbes5mtyLT5rightINS_4FuncEEEPKT_v:
   10|  2.52k|    const T* right() const {
   11|  2.52k|      const T* r = is<T>(this->rhs);
   12|  2.52k|      if (!r) {
  ------------------
  |  Branch (12:11): [True: 0, False: 2.52k]
  ------------------
   13|      0|        throw std::runtime_error("Internal error, type IDs must be out of sequence");
   14|      0|      }
   15|  2.52k|      return r;
   16|  2.52k|    }
_ZNK6hobbes5mtyLT4withEPKNS_6ExistsE:
  153|  1.30k|  bool with(const Exists* v) const override {
  154|  1.30k|    const auto* r = right<Exists>();
  155|       |
  156|  1.30k|    if (v->absTypeName() != r->absTypeName()) {
  ------------------
  |  Branch (156:9): [True: 0, False: 1.30k]
  ------------------
  157|      0|      return v->absTypeName() < r->absTypeName();
  158|  1.30k|    } else {
  159|  1.30k|      return MonoTypeLT()(v->absType(), r->absType());
  160|  1.30k|    }
  161|  1.30k|  }
_ZNK6hobbes5mtyLT5rightINS_6ExistsEEEPKT_v:
   10|  1.30k|    const T* right() const {
   11|  1.30k|      const T* r = is<T>(this->rhs);
   12|  1.30k|      if (!r) {
  ------------------
  |  Branch (12:11): [True: 0, False: 1.30k]
  ------------------
   13|      0|        throw std::runtime_error("Internal error, type IDs must be out of sequence");
   14|      0|      }
   15|  1.30k|      return r;
   16|  1.30k|    }
_ZNK6hobbes5mtyLT4withEPKNS_9RecursiveE:
  163|     88|  bool with(const Recursive* v) const override {
  164|     88|    const auto* r = right<Recursive>();
  165|       |
  166|     88|    if (v->recTypeName() != r->recTypeName()) {
  ------------------
  |  Branch (166:9): [True: 0, False: 88]
  ------------------
  167|      0|      return v->recTypeName() < r->recTypeName();
  168|     88|    } else {
  169|     88|      return MonoTypeLT()(v->recType(), r->recType());
  170|     88|    }
  171|     88|  }
_ZNK6hobbes5mtyLT5rightINS_9RecursiveEEEPKT_v:
   10|     88|    const T* right() const {
   11|     88|      const T* r = is<T>(this->rhs);
   12|     88|      if (!r) {
  ------------------
  |  Branch (12:11): [True: 0, False: 88]
  ------------------
   13|      0|        throw std::runtime_error("Internal error, type IDs must be out of sequence");
   14|      0|      }
   15|     88|      return r;
   16|     88|    }
_ZNK6hobbes5mtyLT4withEPKNS_7TStringE:
   22|   173k|  bool with(const TString* v) const override { return v->value() < right<TString>()->value(); }
_ZNK6hobbes5mtyLT5rightINS_7TStringEEEPKT_v:
   10|   173k|    const T* right() const {
   11|   173k|      const T* r = is<T>(this->rhs);
   12|   173k|      if (!r) {
  ------------------
  |  Branch (12:11): [True: 0, False: 173k]
  ------------------
   13|      0|        throw std::runtime_error("Internal error, type IDs must be out of sequence");
   14|      0|      }
   15|   173k|      return r;
   16|   173k|    }
_ZNK6hobbes5mtyLT4withEPKNS_5TLongE:
   23|  2.26k|  bool with(const TLong*   v) const override { return v->value() < right<TLong>()->value(); }
_ZNK6hobbes5mtyLT5rightINS_5TLongEEEPKT_v:
   10|  2.26k|    const T* right() const {
   11|  2.26k|      const T* r = is<T>(this->rhs);
   12|  2.26k|      if (!r) {
  ------------------
  |  Branch (12:11): [True: 0, False: 2.26k]
  ------------------
   13|      0|        throw std::runtime_error("Internal error, type IDs must be out of sequence");
   14|      0|      }
   15|  2.26k|      return r;
   16|  2.26k|    }
_ZNK6hobbes5mtyLT4withEPKNS_5TExprE:
  173|  1.20k|  bool with(const TExpr* v) const override {
  174|  1.20k|    const auto* r = right<TExpr>();
  175|       |
  176|       |    // this may not be sound ...
  177|  1.20k|    if (v->expr().get() == r->expr().get()) {
  ------------------
  |  Branch (177:9): [True: 0, False: 1.20k]
  ------------------
  178|      0|      return false;
  179|  1.20k|    } else if (*v->expr() == *r->expr()) {
  ------------------
  |  Branch (179:16): [True: 0, False: 1.20k]
  ------------------
  180|      0|      return false;
  181|  1.20k|    } else {
  182|  1.20k|      return v->expr().get() < r->expr().get();
  183|  1.20k|    }
  184|  1.20k|  }
_ZNK6hobbes5mtyLT5rightINS_5TExprEEEPKT_v:
   10|  1.20k|    const T* right() const {
   11|  1.20k|      const T* r = is<T>(this->rhs);
   12|  1.20k|      if (!r) {
  ------------------
  |  Branch (12:11): [True: 0, False: 1.20k]
  ------------------
   13|      0|        throw std::runtime_error("Internal error, type IDs must be out of sequence");
   14|      0|      }
   15|  1.20k|      return r;
   16|  1.20k|    }

_ZN6hobbes14UnqualifierSet3addERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_11UnqualifierEE:
    8|    373|void UnqualifierSet::add(const std::string& name, const UnqualifierPtr& uq) {
    9|    373|  if (this->uqs.find(name) != this->uqs.end()) {
  ------------------
  |  Branch (9:7): [True: 0, False: 373]
  ------------------
   10|      0|    throw std::runtime_error("Redefinition of the '" + name + "' type predicate.");
   11|    373|  } else {
   12|    373|    this->uqs[name] = uq;
   13|    373|  }
   14|    373|}
_ZN6hobbes14UnqualifierSet15findUnqualifierERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
   16|  98.8k|UnqualifierPtr UnqualifierSet::findUnqualifier(const std::string& name) {
   17|  98.8k|  Unqualifiers::const_iterator uq = this->uqs.find(name);
   18|  98.8k|  if (uq == this->uqs.end()) {
  ------------------
  |  Branch (18:7): [True: 2.77k, False: 96.0k]
  ------------------
   19|  2.77k|    throw std::runtime_error("Undefined predicate: " + name);
   20|  96.0k|  } else {
   21|  96.0k|    return uq->second;
   22|  96.0k|  }
   23|  98.8k|}
_ZNK6hobbes14UnqualifierSet6lookupERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
   72|  4.63k|PolyTypePtr UnqualifierSet::lookup(const std::string& vn) const {
   73|   648k|  for (const auto &uq : this->uqs) {
  ------------------
  |  Branch (73:23): [True: 648k, False: 1.70k]
  ------------------
   74|   648k|    PolyTypePtr pt = uq.second->lookup(vn);
   75|   648k|    if (pt != PolyTypePtr()) {
  ------------------
  |  Branch (75:9): [True: 2.92k, False: 645k]
  ------------------
   76|  2.92k|      return pt;
   77|  2.92k|    }
   78|   648k|  }
   79|  1.70k|  return PolyTypePtr();
   80|  4.63k|}
_ZN6hobbes13hasConstraintERKSt10shared_ptrINS_10ConstraintEERKSt6vectorIS2_SaIS2_EE:
  100|  28.5k|bool hasConstraint(const ConstraintPtr& c, const Constraints& cs) {
  101|  28.5k|  Constraints r;
  102|  47.5k|  for (const auto &ci : cs) {
  ------------------
  |  Branch (102:23): [True: 47.5k, False: 16.0k]
  ------------------
  103|  47.5k|    if (*c == *ci) {
  ------------------
  |  Branch (103:9): [True: 12.5k, False: 35.0k]
  ------------------
  104|  12.5k|      return true;
  105|  12.5k|    }
  106|  47.5k|  }
  107|  16.0k|  return false;
  108|  28.5k|}
_ZN6hobbes13hasConstraintERKSt10shared_ptrINS_10ConstraintEERKS0_INS_8QualTypeEE:
  110|  11.3k|bool hasConstraint(const ConstraintPtr& c, const QualTypePtr& qt) {
  111|  11.3k|  return hasConstraint(c, qt->constraints());
  112|  11.3k|}
_ZN6hobbes16removeConstraintERKSt10shared_ptrINS_10ConstraintEERKSt6vectorIS2_SaIS2_EE:
  114|  21.6k|Constraints removeConstraint(const ConstraintPtr& c, const Constraints& cs) {
  115|  21.6k|  Constraints r;
  116|  21.6k|  for (const auto &ci : cs) {
  ------------------
  |  Branch (116:23): [True: 21.4k, False: 21.6k]
  ------------------
  117|  21.4k|    if (!(*c == *ci)) {
  ------------------
  |  Branch (117:9): [True: 17.4k, False: 4.08k]
  ------------------
  118|  17.4k|      r.push_back(ci);
  119|  17.4k|    }
  120|  21.4k|  }
  121|  21.6k|  return r;
  122|  21.6k|}
_ZN6hobbes16removeConstraintERKSt10shared_ptrINS_10ConstraintEERKS0_INS_8QualTypeEE:
  124|  21.6k|QualTypePtr removeConstraint(const ConstraintPtr& c, const QualTypePtr& qt) {
  125|  21.6k|  return qualtype(removeConstraint(c, qt->constraints()), qt->monoType());
  126|  21.6k|}

_ZN6hobbes14unqualifyTypesERKSt10shared_ptrINS_4TEnvEERKS0_INS_4ExprEEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ESaISH_EE:
    9|  1.29k|ExprPtr unqualifyTypes(const TEnvPtr& tenv, const ExprPtr& e, Definitions* ds) {
   10|  1.29k|  ExprPtr result = e;
   11|  1.29k|  bool    changed = true;
   12|       |
   13|  3.01k|  while (changed) {
  ------------------
  |  Branch (13:10): [True: 1.71k, False: 1.29k]
  ------------------
   14|  1.71k|    changed = false;
   15|       |
   16|  1.71k|    QualTypePtr eqt = result->type();
   17|       |
   18|  1.71k|    if (eqt == QualTypePtr()) {
  ------------------
  |  Branch (18:9): [True: 0, False: 1.71k]
  ------------------
   19|      0|      throw annotated_error(
   20|      0|        *e,
   21|      0|        "Internal compiler error, cannot unqualify expression without explicit type annotations "
   22|      0|        "(did you forget to perform type-inference first?): " + show(result)
   23|      0|      );
   24|  1.71k|    } else if (!eqt->constraints().empty()) {
  ------------------
  |  Branch (24:16): [True: 619, False: 1.09k]
  ------------------
   25|       |      // resolve satisfiable, satisfied predicates in this expression
   26|       |      // class constraints with a unique instance are gathered and eliminated in one
   27|       |      // traversal per contiguous run, since a rewrite per constraint (each copying
   28|       |      // and then discarding the entire expression) dominates compile time for large
   29|       |      // generated expressions like match tables
   30|    619|      const Constraints& cs = eqt->constraints();
   31|    619|      TCInstConstraints batch;
   32|       |
   33|    619|      auto flushBatch = [&]() {
   34|    619|        if (!batch.empty()) {
   35|    619|          result = unqualifyClassConstraints(tenv, batch, result, ds);
   36|    619|          batch.clear();
   37|    619|        }
   38|    619|      };
   39|       |
   40|  2.06k|      for (const auto& c : cs) {
  ------------------
  |  Branch (40:26): [True: 2.06k, False: 619]
  ------------------
   41|  2.06k|        UnqualifierPtr uq = tenv->lookupUnqualifier(c);
   42|       |
   43|  2.06k|        if (!satisfiable(uq, tenv, c, ds)) {
  ------------------
  |  Branch (43:13): [True: 0, False: 2.06k]
  ------------------
   44|      0|          annmsgs msgs;
   45|      0|          uq->explain(tenv, c, e, ds, &msgs);
   46|      0|          if (!msgs.empty()) {
  ------------------
  |  Branch (46:15): [True: 0, False: 0]
  ------------------
   47|      0|            throw annotated_error(msgs);
   48|      0|          } else {
   49|      0|            throw annotated_error(*e, "Unsatisfiable predicate: " + show(c));
   50|      0|          }
   51|  2.06k|        } else if (satisfied(uq, tenv, c, ds)) {
  ------------------
  |  Branch (51:20): [True: 1.32k, False: 746]
  ------------------
   52|  1.32k|          TCInstancePtr inst;
   53|  1.32k|          if (const auto* tc = dynamic_cast<const TClass*>(uq.get())) {
  ------------------
  |  Branch (53:27): [True: 953, False: 367]
  ------------------
   54|    953|            inst = tc->uniqueInstance(tenv, c, ds);
   55|    953|          }
   56|       |
   57|  1.32k|          if (inst != TCInstancePtr()) {
  ------------------
  |  Branch (57:15): [True: 953, False: 367]
  ------------------
   58|    953|            batch.push_back(std::make_pair(c, inst));
   59|    953|          } else {
   60|    367|            flushBatch();
   61|    367|            result = uq->unqualify(tenv, c, result, ds);
   62|    367|          }
   63|  1.32k|          changed = true;
   64|  1.32k|        }
   65|  2.06k|      }
   66|    619|      flushBatch();
   67|    619|    }
   68|  1.71k|  }
   69|       |
   70|  1.29k|  return result;
   71|  1.29k|}
tyunqualify.C:_ZZN6hobbes14unqualifyTypesERKSt10shared_ptrINS_4TEnvEERKS0_INS_4ExprEEPSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ESaISH_EEENK3$_0clEv:
   33|    986|      auto flushBatch = [&]() {
   34|    986|        if (!batch.empty()) {
  ------------------
  |  Branch (34:13): [True: 353, False: 633]
  ------------------
   35|    353|          result = unqualifyClassConstraints(tenv, batch, result, ds);
   36|    353|          batch.clear();
   37|    353|        }
   38|    986|      };

_ZN6hobbes14freeParserDataEv:
   64|     30|void freeParserData() {
   65|     30|  if (activeParseBuffers.empty()) {
  ------------------
  |  Branch (65:7): [True: 30, False: 0]
  ------------------
   66|     30|    AutoreleaseSet::reset();
   67|     30|  }
   68|     30|}
_ZN6hobbes17runParserOnBufferEPNS_2ccEiP15yy_buffer_state:
  187|     30|void runParserOnBuffer(cc* c, int initTok, YY_BUFFER_STATE bs) {
  188|     30|  {
  189|     30|    ParseScope scope(c, initTok, bs);
  190|     30|    yyparse();
  191|     30|  }
  192|       |
  193|     30|  if (!yyVexpLexError.empty()) {
  ------------------
  |  Branch (193:7): [True: 0, False: 30]
  ------------------
  194|      0|    std::string msg = yyVexpLexError;
  195|      0|    yyVexpLexError = "";
  196|      0|    throw std::runtime_error(msg);
  197|      0|  }
  198|     30|}
_ZN6hobbes17runParserOnStringEPNS_2ccEiPKc:
  221|     30|void runParserOnString(cc* c, int initTok, const char* s) {
  222|     30|  try {
  223|     30|    LexicallyAnnotated::pushLiteralContext(s);
  224|     30|    runParserOnBuffer(c, initTok, yy_scan_string(s));
  225|     30|    LexicallyAnnotated::popContext();
  226|     30|  } catch (annotated_error&) {
  227|      0|    LexicallyAnnotated::popContext();
  228|      0|    throw;
  229|      0|  } catch (std::exception& ex) {
  230|      0|    LexicallyAnnotated::popContext();
  231|      0|    throwBufferError(s, parseErrorPos(), ex.what());
  232|      0|  }
  233|     30|}
_ZN6hobbes13defReadModuleEPNS_2ccEPKc:
  263|     27|ModulePtr defReadModule(cc* c, const char* text) {
  264|     27|  LOCK_PARSER;
  ------------------
  |  |   23|     27|#define LOCK_PARSER parse_mutex_lock parse_lock
  ------------------
  265|       |
  266|     27|  yyParsedModule = nullptr;
  267|     27|  runParserOnString(c, TPARSEMODULE, text);
  268|       |
  269|     27|  ModulePtr m = checkReturn(yyParsedModule != nullptr ? ModulePtr(yyParsedModule) : ModulePtr());
  ------------------
  |  Branch (269:29): [True: 27, False: 0]
  ------------------
  270|     27|  checkNestingDepth(m);
  271|     27|  return m;
  272|     27|}
_ZN6hobbes13defReadModuleEPNS_2ccERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  274|     27|ModulePtr defReadModule(cc* c, const std::string& text) {
  275|     27|  return defReadModule(c, text.c_str());
  276|     27|}
_ZN6hobbes11defReadExprEPNS_2ccERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  290|      3|ExprPtr defReadExpr(cc* c, const std::string& expr) {
  291|      3|  LOCK_PARSER;
  ------------------
  |  |   23|      3|#define LOCK_PARSER parse_mutex_lock parse_lock
  ------------------
  292|       |
  293|      3|  yyParsedExpr = nullptr;
  294|      3|  runParserOnString(c, TPARSEEXPR, expr.c_str());
  295|       |
  296|      3|  ExprPtr e = checkReturn(yyParsedExpr != nullptr ? ExprPtr(yyParsedExpr) : ExprPtr());
  ------------------
  |  Branch (296:27): [True: 3, False: 0]
  ------------------
  297|      3|  checkNestingDepth(e);
  298|      3|  return e;
  299|      3|}
_ZN6hobbes10defVarCtorERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNS_17LexicalAnnotationE:
  307|  6.62k|Expr* defVarCtor(const std::string& vn, const LexicalAnnotation& la) { return new Var(vn, la); }
_ZN6hobbes13defPatVarCtorERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNS_17LexicalAnnotationE:
  311|    384|Pattern* defPatVarCtor(const std::string& vn, const LexicalAnnotation& la) { return new MatchAny(vn, la); }
_ZN6hobbes10ParseScopeC2EPNS_2ccEiP15yy_buffer_state:
  149|     30|  ParseScope(cc* c, int initTok, YY_BUFFER_STATE bs) : bs(bs) {
  150|     30|    yyParseCC      = c;
  151|     30|    yyInitToken    = initTok;
  152|     30|    yylineno       = 1;
  153|     30|    yycolumn       = 1;
  154|     30|    yyVexpLexError = ""; // a lexer error left by a parse that threw is not this one's
  155|     30|    yyErrPos       = YYLTYPE(); // nor is the position of one (see parseErrorPos)
  156|     30|    yylloc         = YYLTYPE{1, 1, 1, 1}; // the lexer sets this per token, and an empty parse has none: its
  157|       |                                          // end-of-file error would otherwise sit where the previous parse's last token was
  158|     30|    pushLexerParseState();
  159|     30|    yy_switch_to_buffer(bs);
  160|     30|    activeParseBuffers.push(bs);
  161|     30|  }
_ZN6hobbes10ParseScopeD2Ev:
  163|     30|  ~ParseScope() {
  164|     30|    activeParseBuffers.pop();
  165|     30|    freeParserData();
  166|     30|    yy_delete_buffer(this->bs);
  167|     30|    if (!activeParseBuffers.empty()) { yy_switch_to_buffer(activeParseBuffers.top()); }
  ------------------
  |  Branch (167:9): [True: 0, False: 30]
  ------------------
  168|     30|    popLexerParseState();
  169|     30|  }
_ZN16parse_mutex_lockC2Ev:
   20|     30|   parse_mutex_lock() { parse_mutex.lock(); }
parser.C:_ZN6hobbesL17checkNestingDepthERKSt10shared_ptrINS_6ModuleEE:
  238|     27|static void checkNestingDepth(const ModulePtr& m) {
  239|  1.41k|  for (const auto& md : m->definitions()) {
  ------------------
  |  Branch (239:23): [True: 1.41k, False: 27]
  ------------------
  240|  1.41k|    if (const MVarDef* vd = is<MVarDef>(md)) {
  ------------------
  |  Branch (240:24): [True: 277, False: 1.14k]
  ------------------
  241|    277|      checkNestingDepth(vd->varExpr());
  242|  1.14k|    } else if (const InstanceDef* id = is<InstanceDef>(md)) {
  ------------------
  |  Branch (242:35): [True: 621, False: 520]
  ------------------
  243|    747|      for (const auto& mvd : id->members()) {
  ------------------
  |  Branch (243:28): [True: 747, False: 621]
  ------------------
  244|    747|        checkNestingDepth(mvd->varExpr());
  245|    747|      }
  246|    621|    }
  247|  1.41k|  }
  248|     27|}
_ZN16parse_mutex_lockD2Ev:
   21|     30|  ~parse_mutex_lock() { parse_mutex.unlock(); }
_ZN6hobbes11checkReturnISt10shared_ptrINS_6ModuleEEEERKT_S6_:
   75|     27|  const T& checkReturn(const T& x) {
   76|     27|    if (!x) {
  ------------------
  |  Branch (76:9): [True: 0, False: 27]
  ------------------
   77|      0|      throw std::runtime_error("Internal error: parser failed to produce a value");
   78|     27|    } else {
   79|     27|      return x;
   80|     27|    }
   81|     27|  }
_ZN6hobbes11checkReturnISt10shared_ptrINS_4ExprEEEERKT_S6_:
   75|      3|  const T& checkReturn(const T& x) {
   76|      3|    if (!x) {
  ------------------
  |  Branch (76:9): [True: 0, False: 3]
  ------------------
   77|      0|      throw std::runtime_error("Internal error: parser failed to produce a value");
   78|      3|    } else {
   79|      3|      return x;
   80|      3|    }
   81|      3|  }

_Z10wantIndentb:
  749|  1.43k|void wantIndent(bool f) {
  750|  1.43k|  if (f) {
  ------------------
  |  Branch (750:7): [True: 718, False: 718]
  ------------------
  751|    718|    ++yyWantIndent;
  752|    718|  } else if (yyWantIndent > 0) {
  ------------------
  |  Branch (752:14): [True: 718, False: 0]
  ------------------
  753|    718|    --yyWantIndent;
  754|    718|  }
  755|  1.43k|}
_Z10wantIndentv:
  756|  1.88k|bool wantIndent() { return yyWantIndent > 0; }
_Z10pushIndentv:
  759|  6.15k|void pushIndent() {
  760|  6.15k|  yyIndentStack.push_back(yyWantIndent);
  761|  6.15k|  yyWantIndent = 0;
  762|  6.15k|}
_Z9popIndentv:
  763|  6.15k|void popIndent() {
  764|  6.15k|  if(!yyIndentStack.empty()){
  ------------------
  |  Branch (764:6): [True: 6.15k, False: 0]
  ------------------
  765|  6.15k|    yyWantIndent = *--yyIndentStack.end();
  766|  6.15k|    yyIndentStack.pop_back();
  767|  6.15k|  }
  768|  6.15k|}
_Z19pushLexerParseStatev:
  791|     30|void pushLexerParseState() {
  792|     30|  LexerParseState s;
  793|     30|  s.start       = YY_START;
  ------------------
  |  |  123|     30|#define YY_START (((yy_start) - 1) / 2)
  ------------------
  794|     30|  s.wantIndent  = yyWantIndent;
  795|     30|  s.indentStack = yyIndentStack;
  796|     30|  yySavedLexerParseStates.push_back(s);
  797|       |
  798|     30|  BEGIN(0); // INITIAL -- which flex defines only after this prologue, as 0
  ------------------
  |  |  118|     30|#define BEGIN (yy_start) = 1 + 2 *
  ------------------
  799|     30|  yyWantIndent = 0;
  800|     30|  yyIndentStack.clear();
  801|     30|}
_Z18popLexerParseStatev:
  803|     30|void popLexerParseState() {
  804|     30|  if (yySavedLexerParseStates.empty()) {
  ------------------
  |  Branch (804:7): [True: 0, False: 30]
  ------------------
  805|      0|    return;
  806|      0|  }
  807|     30|  const LexerParseState& s = yySavedLexerParseStates.back();
  808|     30|  BEGIN(s.start);
  ------------------
  |  |  118|     30|#define BEGIN (yy_start) = 1 + 2 *
  ------------------
  809|     30|  yyWantIndent  = s.wantIndent;
  810|     30|  yyIndentStack = s.indentStack;
  811|     30|  yySavedLexerParseStates.pop_back();
  812|     30|}
_Z10identifierB5cxx11PKcS0_:
  834|  17.9k|std::string* identifier(const char* b, const char* e) {
  835|  17.9k|  if ((b+1) == e && *b == '_') {
  ------------------
  |  Branch (835:7): [True: 8.19k, False: 9.73k]
  |  Branch (835:21): [True: 531, False: 7.66k]
  ------------------
  836|    531|    return hobbes::autorelease(new std::string(hobbes::freshName()));
  837|  17.3k|  } else {
  838|  17.3k|    return hobbes::autorelease(new std::string(b, e));
  839|  17.3k|  }
  840|  17.9k|}
_Z5yylexv:
 1029|  46.7k|{
 1030|  46.7k|	yy_state_type yy_current_state;
 1031|  46.7k|	char *yy_cp, *yy_bp;
 1032|  46.7k|	int yy_act;
 1033|       |    
 1034|  46.7k|	if ( !(yy_init) )
  ------------------
  |  Branch (1034:7): [True: 1, False: 46.7k]
  ------------------
 1035|      1|		{
 1036|      1|		(yy_init) = 1;
 1037|       |
 1038|       |#ifdef YY_USER_INIT
 1039|       |		YY_USER_INIT;
 1040|       |#endif
 1041|       |
 1042|      1|		if ( ! (yy_start) )
  ------------------
  |  Branch (1042:8): [True: 0, False: 1]
  ------------------
 1043|      0|			(yy_start) = 1;	/* first start state */
 1044|       |
 1045|      1|		if ( ! yyin )
  ------------------
  |  Branch (1045:8): [True: 1, False: 0]
  ------------------
 1046|      1|			yyin = stdin;
 1047|       |
 1048|      1|		if ( ! yyout )
  ------------------
  |  Branch (1048:8): [True: 1, False: 0]
  ------------------
 1049|      1|			yyout = stdout;
 1050|       |
 1051|      1|		if ( ! YY_CURRENT_BUFFER ) {
  ------------------
  |  |  279|      1|#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
  |  |  ------------------
  |  |  |  Branch (279:29): [True: 1, False: 0]
  |  |  ------------------
  |  |  280|      1|                          ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
  |  |  281|      1|                          : NULL)
  ------------------
  |  Branch (1051:8): [True: 0, False: 1]
  ------------------
 1052|      0|			yyensure_buffer_stack ();
 1053|      0|			YY_CURRENT_BUFFER_LVALUE =
  ------------------
  |  |  285|      0|#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
  ------------------
 1054|      0|				yy_create_buffer( yyin, YY_BUF_SIZE );
  ------------------
  |  |  140|      0|#define YY_BUF_SIZE 16384
  ------------------
 1055|      0|		}
 1056|       |
 1057|      1|		yy_load_buffer_state(  );
 1058|      1|		}
 1059|       |
 1060|  46.7k|	{
 1061|  46.7k|#line 174 "hexpr.l"
 1062|       |
 1063|       |
 1064|       |
 1065|  46.7k|#line 178 "hexpr.l"
 1066|       |  /* simulate multiple start symbols in our grammar by supporting a distinguished prefix token to switch on pseudo-start symbol productions */
 1067|  46.7k|  if (yyInitToken) {
  ------------------
  |  Branch (1067:7): [True: 30, False: 46.7k]
  ------------------
 1068|     30|    int r = yyInitToken;
 1069|     30|    yyInitToken = 0;
 1070|     30|    return r;
 1071|     30|  }
 1072|       |
 1073|       |
 1074|  46.7k|#line 1075 "hexpr.lex.C"
 1075|       |
 1076|  71.9k|	while ( /*CONSTCOND*/1 )		/* loops until end-of-file is reached */
  ------------------
  |  Branch (1076:23): [True: 71.9k, Folded]
  ------------------
 1077|  71.9k|		{
 1078|  71.9k|		yy_cp = (yy_c_buf_p);
 1079|       |
 1080|       |		/* Support of yytext. */
 1081|  71.9k|		*yy_cp = (yy_hold_char);
 1082|       |
 1083|       |		/* yy_bp points to the position in yy_ch_buf of the start of
 1084|       |		 * the current run.
 1085|       |		 */
 1086|  71.9k|		yy_bp = yy_cp;
 1087|       |
 1088|  71.9k|		yy_current_state = (yy_start);
 1089|  71.9k|yy_match:
 1090|  71.9k|		do
 1091|   202k|			{
 1092|   202k|			YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ;
  ------------------
  |  |  112|   202k|#define YY_SC_TO_UI(c) ((YY_CHAR) (c))
  ------------------
 1093|   202k|			if ( yy_accept[yy_current_state] )
  ------------------
  |  Branch (1093:9): [True: 112k, False: 90.2k]
  ------------------
 1094|   112k|				{
 1095|   112k|				(yy_last_accepting_state) = yy_current_state;
 1096|   112k|				(yy_last_accepting_cpos) = yy_cp;
 1097|   112k|				}
 1098|   333k|			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
  ------------------
  |  Branch (1098:12): [True: 130k, False: 202k]
  ------------------
 1099|   130k|				{
 1100|   130k|				yy_current_state = (int) yy_def[yy_current_state];
 1101|   130k|				if ( yy_current_state >= 282 )
  ------------------
  |  Branch (1101:10): [True: 82.4k, False: 48.3k]
  ------------------
 1102|  82.4k|					yy_c = yy_meta[yy_c];
 1103|   130k|				}
 1104|   202k|			yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
 1105|   202k|			++yy_cp;
 1106|   202k|			}
 1107|   202k|		while ( yy_base[yy_current_state] != 393 );
  ------------------
  |  Branch (1107:11): [True: 130k, False: 71.9k]
  ------------------
 1108|       |
 1109|  72.0k|yy_find_action:
 1110|  72.0k|		yy_act = yy_accept[yy_current_state];
 1111|  72.0k|		if ( yy_act == 0 )
  ------------------
  |  Branch (1111:8): [True: 47.7k, False: 24.2k]
  ------------------
 1112|  47.7k|			{ /* have to back up */
 1113|  47.7k|			yy_cp = (yy_last_accepting_cpos);
 1114|  47.7k|			yy_current_state = (yy_last_accepting_state);
 1115|  47.7k|			yy_act = yy_accept[yy_current_state];
 1116|  47.7k|			}
 1117|       |
 1118|  72.0k|		YY_DO_BEFORE_ACTION;
  ------------------
  |  |  372|  72.0k|	(yytext_ptr) = yy_bp; \
  |  |  ------------------
  |  |  |  |  361|  72.0k|#define yytext_ptr yytext
  |  |  ------------------
  |  |  373|  72.0k|	yyleng = (int) (yy_cp - yy_bp); \
  |  |  374|  72.0k|	(yy_hold_char) = *yy_cp; \
  |  |  375|  72.0k|	*yy_cp = '\0'; \
  |  |  376|  72.0k|	(yy_c_buf_p) = yy_cp;
  ------------------
 1119|       |
 1120|  72.0k|		if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] )
  ------------------
  |  |  378|   144k|#define YY_END_OF_BUFFER 123
  ------------------
  |  Branch (1120:8): [True: 71.9k, False: 57]
  |  Branch (1120:38): [True: 4.65k, False: 67.2k]
  ------------------
 1121|  4.65k|			{
 1122|  4.65k|			int yyl;
 1123|  30.9k|			for ( yyl = 0; yyl < yyleng; ++yyl )
  ------------------
  |  Branch (1123:19): [True: 26.2k, False: 4.65k]
  ------------------
 1124|  26.2k|				if ( yytext[yyl] == '\n' )
  ------------------
  |  Branch (1124:10): [True: 4.46k, False: 21.8k]
  ------------------
 1125|       |					
 1126|  4.46k|    yylineno++;
 1127|  4.65k|;
 1128|  4.65k|			}
 1129|       |
 1130|  72.0k|do_action:	/* This label is used only to access EOF actions. */
 1131|       |
 1132|  72.0k|		switch ( yy_act )
 1133|  72.0k|	{ /* beginning of action switch */
 1134|      0|			case 0: /* must back up */
  ------------------
  |  Branch (1134:4): [True: 0, False: 72.0k]
  ------------------
 1135|       |			/* undo the effects of YY_DO_BEFORE_ACTION */
 1136|      0|			*yy_cp = (yy_hold_char);
 1137|      0|			yy_cp = (yy_last_accepting_cpos);
 1138|      0|			yy_current_state = (yy_last_accepting_state);
 1139|      0|			goto yy_find_action;
 1140|       |
 1141|  2.27k|case 1:
  ------------------
  |  Branch (1141:1): [True: 2.27k, False: 69.7k]
  ------------------
 1142|       |/* rule 1 can match eol */
 1143|  2.27k|YY_RULE_SETUP
  ------------------
  |  | 1024|  2.27k|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|  2.27k|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|  2.27k|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|  2.27k|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1144|  2.27k|#line 186 "hexpr.l"
 1145|  2.27k|{ yycolumn = 1; }
 1146|  2.27k|	YY_BREAK
  ------------------
  |  | 1020|  2.27k|#define YY_BREAK /*LINTED*/break;
  ------------------
 1147|  19.8k|case 2:
  ------------------
  |  Branch (1147:1): [True: 19.8k, False: 52.1k]
  ------------------
 1148|  19.8k|YY_RULE_SETUP
  ------------------
  |  | 1024|  19.8k|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|  19.8k|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|  19.8k|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|  19.8k|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1149|  19.8k|#line 187 "hexpr.l"
 1150|  19.8k|{ }
 1151|  19.8k|	YY_BREAK
  ------------------
  |  | 1020|  19.8k|#define YY_BREAK /*LINTED*/break;
  ------------------
 1152|  1.87k|case 3:
  ------------------
  |  Branch (1152:1): [True: 1.87k, False: 70.1k]
  ------------------
 1153|       |/* rule 3 can match eol */
 1154|  1.87k|YY_RULE_SETUP
  ------------------
  |  | 1024|  1.87k|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|  1.87k|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|  1.87k|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|  1.87k|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1155|  1.87k|#line 188 "hexpr.l"
 1156|  1.87k|{ pushBackLookahead(1); yycolumn = 2; if (wantIndent()) { return TINDENT; } }
  ------------------
  |  |  828|  1.87k|  do {                                                         \
  |  |  829|  1.87k|    yyless(yyleng - (n));                                      \
  |  |  ------------------
  |  |  |  |  190|  1.87k|	do \
  |  |  |  |  191|  1.87k|		{ \
  |  |  |  |  192|  1.87k|		/* Undo effects of setting up yytext. */ \
  |  |  |  |  193|  1.87k|        int yyless_macro_arg = (n); \
  |  |  |  |  194|  1.87k|        YY_LESS_LINENO(yyless_macro_arg);\
  |  |  |  |  ------------------
  |  |  |  |  |  |  174|  1.87k|            do { \
  |  |  |  |  |  |  175|  1.87k|                int yyl;\
  |  |  |  |  |  |  176|  3.75k|                for ( yyl = n; yyl < yyleng; ++yyl )\
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (176:32): [True: 1.87k, False: 1.87k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  177|  1.87k|                    if ( yytext[yyl] == '\n' )\
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (177:26): [True: 0, False: 1.87k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  178|  1.87k|                        --yylineno;\
  |  |  |  |  |  |  179|  1.87k|            }while(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (179:20): [Folded, False: 1.87k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  195|  1.87k|		*yy_cp = (yy_hold_char); \
  |  |  |  |  196|  1.87k|		YY_RESTORE_YY_MORE_OFFSET \
  |  |  |  |  197|  1.87k|		(yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
  |  |  |  |  ------------------
  |  |  |  |  |  |  670|  1.87k|#define YY_MORE_ADJ 0
  |  |  |  |  ------------------
  |  |  |  |  198|  1.87k|		YY_DO_BEFORE_ACTION; /* set up yytext again */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  372|  1.87k|	(yytext_ptr) = yy_bp; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  361|  1.87k|#define yytext_ptr yytext
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  373|  1.87k|	yyleng = (int) (yy_cp - yy_bp); \
  |  |  |  |  |  |  374|  1.87k|	(yy_hold_char) = *yy_cp; \
  |  |  |  |  |  |  375|  1.87k|	*yy_cp = '\0'; \
  |  |  |  |  |  |  376|  1.87k|	(yy_c_buf_p) = yy_cp;
  |  |  |  |  ------------------
  |  |  |  |  199|  1.87k|		} \
  |  |  |  |  200|  1.87k|	while ( 0 )
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (200:10): [Folded, False: 1.87k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  830|  1.87k|    yylloc.first_line = yylloc.last_line = yylineno;           \
  |  |  831|  1.87k|    yylloc.last_column = yylloc.first_column + yyleng - 1;     \
  |  |  832|  1.87k|  } while (false)
  |  |  ------------------
  |  |  |  Branch (832:12): [Folded, False: 1.87k]
  |  |  ------------------
  ------------------
  |  Branch (1156:43): [True: 841, False: 1.03k]
  ------------------
 1157|  1.03k|	YY_BREAK
  ------------------
  |  | 1020|  1.03k|#define YY_BREAK /*LINTED*/break;
  ------------------
 1158|  1.03k|case 4:
  ------------------
  |  Branch (1158:1): [True: 0, False: 72.0k]
  ------------------
 1159|       |/* rule 4 can match eol */
 1160|      0|YY_RULE_SETUP
  ------------------
  |  | 1024|      0|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      0|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      0|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      0|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1161|      0|#line 189 "hexpr.l"
 1162|      0|{ pushBackLookahead(2); yycolumn = 2; if (wantIndent()) { return TINDENT; } }
  ------------------
  |  |  828|      0|  do {                                                         \
  |  |  829|      0|    yyless(yyleng - (n));                                      \
  |  |  ------------------
  |  |  |  |  190|      0|	do \
  |  |  |  |  191|      0|		{ \
  |  |  |  |  192|      0|		/* Undo effects of setting up yytext. */ \
  |  |  |  |  193|      0|        int yyless_macro_arg = (n); \
  |  |  |  |  194|      0|        YY_LESS_LINENO(yyless_macro_arg);\
  |  |  |  |  ------------------
  |  |  |  |  |  |  174|      0|            do { \
  |  |  |  |  |  |  175|      0|                int yyl;\
  |  |  |  |  |  |  176|      0|                for ( yyl = n; yyl < yyleng; ++yyl )\
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (176:32): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  177|      0|                    if ( yytext[yyl] == '\n' )\
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (177:26): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  178|      0|                        --yylineno;\
  |  |  |  |  |  |  179|      0|            }while(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (179:20): [Folded, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  195|      0|		*yy_cp = (yy_hold_char); \
  |  |  |  |  196|      0|		YY_RESTORE_YY_MORE_OFFSET \
  |  |  |  |  197|      0|		(yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
  |  |  |  |  ------------------
  |  |  |  |  |  |  670|      0|#define YY_MORE_ADJ 0
  |  |  |  |  ------------------
  |  |  |  |  198|      0|		YY_DO_BEFORE_ACTION; /* set up yytext again */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  372|      0|	(yytext_ptr) = yy_bp; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  361|      0|#define yytext_ptr yytext
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  373|      0|	yyleng = (int) (yy_cp - yy_bp); \
  |  |  |  |  |  |  374|      0|	(yy_hold_char) = *yy_cp; \
  |  |  |  |  |  |  375|      0|	*yy_cp = '\0'; \
  |  |  |  |  |  |  376|      0|	(yy_c_buf_p) = yy_cp;
  |  |  |  |  ------------------
  |  |  |  |  199|      0|		} \
  |  |  |  |  200|      0|	while ( 0 )
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (200:10): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  830|      0|    yylloc.first_line = yylloc.last_line = yylineno;           \
  |  |  831|      0|    yylloc.last_column = yylloc.first_column + yyleng - 1;     \
  |  |  832|      0|  } while (false)
  |  |  ------------------
  |  |  |  Branch (832:12): [Folded, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (1162:43): [True: 0, False: 0]
  ------------------
 1163|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1164|      2|case 5:
  ------------------
  |  Branch (1164:1): [True: 2, False: 72.0k]
  ------------------
 1165|       |/* rule 5 can match eol */
 1166|      2|YY_RULE_SETUP
  ------------------
  |  | 1024|      2|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      2|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      2|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      2|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1167|      2|#line 190 "hexpr.l"
 1168|      2|{ yycolumn = 2; if (wantIndent()) { return TINDENT; } }
  ------------------
  |  Branch (1168:21): [True: 1, False: 1]
  ------------------
 1169|      1|	YY_BREAK
  ------------------
  |  | 1020|      1|#define YY_BREAK /*LINTED*/break;
  ------------------
 1170|      1|case 6:
  ------------------
  |  Branch (1170:1): [True: 0, False: 72.0k]
  ------------------
 1171|      0|YY_RULE_SETUP
  ------------------
  |  | 1024|      0|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      0|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      0|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      0|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1172|      0|#line 191 "hexpr.l"
 1173|      0|{               if (wantIndent()) { return TINDENT; } }
  ------------------
  |  Branch (1173:21): [True: 0, False: 0]
  ------------------
 1174|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1175|      0|case 7:
  ------------------
  |  Branch (1175:1): [True: 0, False: 72.0k]
  ------------------
 1176|       |/* rule 7 can match eol */
 1177|      0|YY_RULE_SETUP
  ------------------
  |  | 1024|      0|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      0|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      0|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      0|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1178|      0|#line 192 "hexpr.l"
 1179|      0|{ yycolumn = 2; if (wantIndent()) { return TINDENT; } }
  ------------------
  |  Branch (1179:21): [True: 0, False: 0]
  ------------------
 1180|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1181|      0|case 8:
  ------------------
  |  Branch (1181:1): [True: 0, False: 72.0k]
  ------------------
 1182|      0|YY_RULE_SETUP
  ------------------
  |  | 1024|      0|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      0|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      0|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      0|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1183|      0|#line 193 "hexpr.l"
 1184|      0|{               if (wantIndent()) { return TINDENT; } }
  ------------------
  |  Branch (1184:21): [True: 0, False: 0]
  ------------------
 1185|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1186|    249|case 9:
  ------------------
  |  Branch (1186:1): [True: 249, False: 71.7k]
  ------------------
 1187|       |/* rule 9 can match eol */
 1188|    249|YY_RULE_SETUP
  ------------------
  |  | 1024|    249|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|    249|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|    249|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|    249|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1189|    249|#line 194 "hexpr.l"
 1190|    249|{ yycolumn = 1; }
 1191|    249|	YY_BREAK
  ------------------
  |  | 1020|    249|#define YY_BREAK /*LINTED*/break;
  ------------------
 1192|     27|case 10:
  ------------------
  |  Branch (1192:1): [True: 27, False: 72.0k]
  ------------------
 1193|     27|YY_RULE_SETUP
  ------------------
  |  | 1024|     27|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|     27|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|     27|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|     27|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1194|     27|#line 196 "hexpr.l"
 1195|     27|{ BEGIN(BLOCK_COMMENT); }
  ------------------
  |  |  118|     27|#define BEGIN (yy_start) = 1 + 2 *
  ------------------
              { BEGIN(BLOCK_COMMENT); }
  ------------------
  |  |  846|     27|#define BLOCK_COMMENT 1
  ------------------
 1196|     27|	YY_BREAK
  ------------------
  |  | 1020|     27|#define YY_BREAK /*LINTED*/break;
  ------------------
 1197|     27|case 11:
  ------------------
  |  Branch (1197:1): [True: 27, False: 72.0k]
  ------------------
 1198|     27|YY_RULE_SETUP
  ------------------
  |  | 1024|     27|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|     27|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|     27|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|     27|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1199|     27|#line 197 "hexpr.l"
 1200|     27|{ BEGIN(INITIAL); }
  ------------------
  |  |  118|     27|#define BEGIN (yy_start) = 1 + 2 *
  ------------------
              { BEGIN(INITIAL); }
  ------------------
  |  |  845|     27|#define INITIAL 0
  ------------------
 1201|     27|	YY_BREAK
  ------------------
  |  | 1020|     27|#define YY_BREAK /*LINTED*/break;
  ------------------
 1202|     66|case 12:
  ------------------
  |  Branch (1202:1): [True: 66, False: 71.9k]
  ------------------
 1203|       |/* rule 12 can match eol */
 1204|     66|YY_RULE_SETUP
  ------------------
  |  | 1024|     66|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|     66|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|     66|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|     66|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1205|     66|#line 198 "hexpr.l"
 1206|     66|{ yycolumn = 1; }
 1207|     66|	YY_BREAK
  ------------------
  |  | 1020|     66|#define YY_BREAK /*LINTED*/break;
  ------------------
 1208|  1.71k|case 13:
  ------------------
  |  Branch (1208:1): [True: 1.71k, False: 70.3k]
  ------------------
 1209|  1.71k|YY_RULE_SETUP
  ------------------
  |  | 1024|  1.71k|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|  1.71k|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|  1.71k|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|  1.71k|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1210|  1.71k|#line 199 "hexpr.l"
 1211|  1.71k|{ }
 1212|  1.71k|	YY_BREAK
  ------------------
  |  | 1020|  1.71k|#define YY_BREAK /*LINTED*/break;
  ------------------
 1213|      0|case 14:
  ------------------
  |  Branch (1213:1): [True: 0, False: 72.0k]
  ------------------
 1214|      0|YY_RULE_SETUP
  ------------------
  |  | 1024|      0|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      0|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      0|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      0|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1215|      0|#line 201 "hexpr.l"
 1216|      0|{ return TOPTION; }
 1217|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1218|      0|case 15:
  ------------------
  |  Branch (1218:1): [True: 0, False: 72.0k]
  ------------------
 1219|      0|YY_RULE_SETUP
  ------------------
  |  | 1024|      0|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      0|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      0|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      0|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1220|      0|#line 202 "hexpr.l"
 1221|      0|{ return TMODULE; }
 1222|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1223|    632|case 16:
  ------------------
  |  Branch (1223:1): [True: 632, False: 71.3k]
  ------------------
 1224|    632|YY_RULE_SETUP
  ------------------
  |  | 1024|    632|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|    632|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|    632|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|    632|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1225|    632|#line 203 "hexpr.l"
 1226|    632|{ return TWHERE; }
 1227|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1228|      0|case 17:
  ------------------
  |  Branch (1228:1): [True: 0, False: 72.0k]
  ------------------
 1229|      0|YY_RULE_SETUP
  ------------------
  |  | 1024|      0|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      0|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      0|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      0|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1230|      0|#line 204 "hexpr.l"
 1231|      0|{ return TIMPORT; }
 1232|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1233|      4|case 18:
  ------------------
  |  Branch (1233:1): [True: 4, False: 72.0k]
  ------------------
 1234|      4|YY_RULE_SETUP
  ------------------
  |  | 1024|      4|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      4|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      4|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      4|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1235|      4|#line 205 "hexpr.l"
 1236|      4|{ return TTYPE; }
 1237|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1238|      9|case 19:
  ------------------
  |  Branch (1238:1): [True: 9, False: 72.0k]
  ------------------
 1239|      9|YY_RULE_SETUP
  ------------------
  |  | 1024|      9|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      9|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      9|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      9|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1240|      9|#line 206 "hexpr.l"
 1241|      9|{ return TDATA; }
 1242|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1243|     97|case 20:
  ------------------
  |  Branch (1243:1): [True: 97, False: 71.9k]
  ------------------
 1244|     97|YY_RULE_SETUP
  ------------------
  |  | 1024|     97|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|     97|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|     97|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|     97|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1245|     97|#line 207 "hexpr.l"
 1246|     97|{ wantIndent(true); return TCLASS; }
 1247|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1248|    621|case 21:
  ------------------
  |  Branch (1248:1): [True: 621, False: 71.4k]
  ------------------
 1249|    621|YY_RULE_SETUP
  ------------------
  |  | 1024|    621|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|    621|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|    621|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|    621|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1250|    621|#line 208 "hexpr.l"
 1251|    621|{ wantIndent(true); return TINST; }
 1252|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1253|     29|case 22:
  ------------------
  |  Branch (1253:1): [True: 29, False: 72.0k]
  ------------------
 1254|     29|YY_RULE_SETUP
  ------------------
  |  | 1024|     29|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|     29|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|     29|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|     29|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1255|     29|#line 209 "hexpr.l"
 1256|     29|{ return TEXISTS; }
 1257|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1258|     93|case 23:
  ------------------
  |  Branch (1258:1): [True: 93, False: 71.9k]
  ------------------
 1259|     93|YY_RULE_SETUP
  ------------------
  |  | 1024|     93|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|     93|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|     93|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|     93|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1260|     93|#line 210 "hexpr.l"
 1261|     93|{ return TUNSAFE; }
 1262|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1263|     57|case 24:
  ------------------
  |  Branch (1263:1): [True: 57, False: 71.9k]
  ------------------
 1264|     57|YY_RULE_SETUP
  ------------------
  |  | 1024|     57|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|     57|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|     57|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|     57|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1265|     57|#line 211 "hexpr.l"
 1266|     57|{ return TSAFE; } 
 1267|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1268|    110|case 25:
  ------------------
  |  Branch (1268:1): [True: 110, False: 71.9k]
  ------------------
 1269|    110|YY_RULE_SETUP
  ------------------
  |  | 1024|    110|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|    110|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|    110|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|    110|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1270|    110|#line 213 "hexpr.l"
 1271|    110|{ return TASSIGN; }
 1272|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1273|  1.64k|case 26:
  ------------------
  |  Branch (1273:1): [True: 1.64k, False: 70.3k]
  ------------------
 1274|  1.64k|YY_RULE_SETUP
  ------------------
  |  | 1024|  1.64k|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|  1.64k|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|  1.64k|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|  1.64k|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1275|  1.64k|#line 214 "hexpr.l"
 1276|  1.64k|{ return TEQUALS; }
 1277|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1278|    695|case 27:
  ------------------
  |  Branch (1278:1): [True: 695, False: 71.3k]
  ------------------
 1279|    695|YY_RULE_SETUP
  ------------------
  |  | 1024|    695|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|    695|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|    695|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|    695|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1280|    695|#line 215 "hexpr.l"
 1281|    695|{ return TASSUMP; }
 1282|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1283|    523|case 28:
  ------------------
  |  Branch (1283:1): [True: 523, False: 71.5k]
  ------------------
 1284|    523|YY_RULE_SETUP
  ------------------
  |  | 1024|    523|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|    523|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|    523|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|    523|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1285|    523|#line 216 "hexpr.l"
 1286|    523|{ return TCSTARROW; }
 1287|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1288|      0|case 29:
  ------------------
  |  Branch (1288:1): [True: 0, False: 72.0k]
  ------------------
 1289|      0|YY_RULE_SETUP
  ------------------
  |  | 1024|      0|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      0|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      0|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      0|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1290|      0|#line 217 "hexpr.l"
 1291|      0|{ return TPARROW; }
 1292|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1293|    341|case 30:
  ------------------
  |  Branch (1293:1): [True: 341, False: 71.6k]
  ------------------
 1294|    341|YY_RULE_SETUP
  ------------------
  |  | 1024|    341|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|    341|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|    341|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|    341|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1295|    341|#line 218 "hexpr.l"
 1296|    341|{ return TCOLON; }
 1297|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1298|    720|case 31:
  ------------------
  |  Branch (1298:1): [True: 720, False: 71.3k]
  ------------------
 1299|    720|YY_RULE_SETUP
  ------------------
  |  | 1024|    720|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|    720|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|    720|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|    720|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1300|    720|#line 219 "hexpr.l"
 1301|    720|{ return TARROW; }
 1302|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1303|    150|case 32:
  ------------------
  |  Branch (1303:1): [True: 150, False: 71.8k]
  ------------------
 1304|    150|YY_RULE_SETUP
  ------------------
  |  | 1024|    150|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|    150|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|    150|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|    150|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1305|    150|#line 220 "hexpr.l"
 1306|    150|{ return TEQUIV; }
 1307|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1308|     60|case 33:
  ------------------
  |  Branch (1308:1): [True: 60, False: 71.9k]
  ------------------
 1309|     60|YY_RULE_SETUP
  ------------------
  |  | 1024|     60|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|     60|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|     60|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|     60|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1310|     60|#line 221 "hexpr.l"
 1311|     60|{ return TEQ; }
 1312|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1313|      5|case 34:
  ------------------
  |  Branch (1313:1): [True: 5, False: 72.0k]
  ------------------
 1314|      5|YY_RULE_SETUP
  ------------------
  |  | 1024|      5|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      5|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      5|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      5|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1315|      5|#line 222 "hexpr.l"
 1316|      5|{ return TCIEQ; }
 1317|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1318|     16|case 35:
  ------------------
  |  Branch (1318:1): [True: 16, False: 72.0k]
  ------------------
 1319|     16|YY_RULE_SETUP
  ------------------
  |  | 1024|     16|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|     16|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|     16|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|     16|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1320|     16|#line 223 "hexpr.l"
 1321|     16|{ return TNEQ; }
 1322|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1323|    142|case 36:
  ------------------
  |  Branch (1323:1): [True: 142, False: 71.8k]
  ------------------
 1324|    142|YY_RULE_SETUP
  ------------------
  |  | 1024|    142|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|    142|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|    142|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|    142|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1325|    142|#line 224 "hexpr.l"
 1326|    142|{ return TLT; }
 1327|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1328|     65|case 37:
  ------------------
  |  Branch (1328:1): [True: 65, False: 71.9k]
  ------------------
 1329|     65|YY_RULE_SETUP
  ------------------
  |  | 1024|     65|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|     65|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|     65|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|     65|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1330|     65|#line 225 "hexpr.l"
 1331|     65|{ return TLTE; }
 1332|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1333|     99|case 38:
  ------------------
  |  Branch (1333:1): [True: 99, False: 71.9k]
  ------------------
 1334|     99|YY_RULE_SETUP
  ------------------
  |  | 1024|     99|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|     99|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|     99|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|     99|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1335|     99|#line 226 "hexpr.l"
 1336|     99|{ return TGT; }
 1337|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1338|     58|case 39:
  ------------------
  |  Branch (1338:1): [True: 58, False: 71.9k]
  ------------------
 1339|     58|YY_RULE_SETUP
  ------------------
  |  | 1024|     58|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|     58|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|     58|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|     58|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1340|     58|#line 227 "hexpr.l"
 1341|     58|{ return TGTE; }
 1342|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1343|      0|case 40:
  ------------------
  |  Branch (1343:1): [True: 0, False: 72.0k]
  ------------------
 1344|      0|YY_RULE_SETUP
  ------------------
  |  | 1024|      0|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      0|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      0|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      0|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1345|      0|#line 228 "hexpr.l"
 1346|      0|{ return TNOT; }
 1347|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1348|      7|case 41:
  ------------------
  |  Branch (1348:1): [True: 7, False: 72.0k]
  ------------------
 1349|      7|YY_RULE_SETUP
  ------------------
  |  | 1024|      7|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      7|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      7|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      7|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1350|      7|#line 229 "hexpr.l"
 1351|      7|{ return TNOT; }
 1352|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1353|     81|case 42:
  ------------------
  |  Branch (1353:1): [True: 81, False: 71.9k]
  ------------------
 1354|     81|YY_RULE_SETUP
  ------------------
  |  | 1024|     81|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|     81|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|     81|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|     81|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1355|     81|#line 230 "hexpr.l"
 1356|     81|{ return TLET; }
 1357|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1358|     62|case 43:
  ------------------
  |  Branch (1358:1): [True: 62, False: 71.9k]
  ------------------
 1359|     62|YY_RULE_SETUP
  ------------------
  |  | 1024|     62|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|     62|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|     62|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|     62|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1360|     62|#line 231 "hexpr.l"
 1361|     62|{ return TCASE; }
 1362|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1363|      0|case 44:
  ------------------
  |  Branch (1363:1): [True: 0, False: 72.0k]
  ------------------
 1364|      0|YY_RULE_SETUP
  ------------------
  |  | 1024|      0|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      0|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      0|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      0|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1365|      0|#line 232 "hexpr.l"
 1366|      0|{ return TDEFAULT; }
 1367|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1368|     56|case 45:
  ------------------
  |  Branch (1368:1): [True: 56, False: 71.9k]
  ------------------
 1369|     56|YY_RULE_SETUP
  ------------------
  |  | 1024|     56|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|     56|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|     56|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|     56|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1370|     56|#line 233 "hexpr.l"
 1371|     56|{ return TMATCH; }
 1372|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1373|      0|case 46:
  ------------------
  |  Branch (1373:1): [True: 0, False: 72.0k]
  ------------------
 1374|      0|YY_RULE_SETUP
  ------------------
  |  | 1024|      0|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      0|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      0|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      0|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1375|      0|#line 234 "hexpr.l"
 1376|      0|{ return TMATCHES; }
 1377|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1378|      0|case 47:
  ------------------
  |  Branch (1378:1): [True: 0, False: 72.0k]
  ------------------
 1379|      0|YY_RULE_SETUP
  ------------------
  |  | 1024|      0|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      0|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      0|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      0|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1380|      0|#line 235 "hexpr.l"
 1381|      0|{ return TPARSE; }
 1382|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1383|     56|case 48:
  ------------------
  |  Branch (1383:1): [True: 56, False: 71.9k]
  ------------------
 1384|     56|YY_RULE_SETUP
  ------------------
  |  | 1024|     56|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|     56|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|     56|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|     56|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1385|     56|#line 236 "hexpr.l"
 1386|     56|{ return TWITH; }
 1387|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1388|     62|case 49:
  ------------------
  |  Branch (1388:1): [True: 62, False: 71.9k]
  ------------------
 1389|     62|YY_RULE_SETUP
  ------------------
  |  | 1024|     62|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|     62|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|     62|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|     62|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1390|     62|#line 237 "hexpr.l"
 1391|     62|{ return TOF; }
 1392|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1393|     17|case 50:
  ------------------
  |  Branch (1393:1): [True: 17, False: 72.0k]
  ------------------
 1394|     17|YY_RULE_SETUP
  ------------------
  |  | 1024|     17|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|     17|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|     17|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|     17|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1395|     17|#line 238 "hexpr.l"
 1396|     17|{ return TAND; }
 1397|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1398|     12|case 51:
  ------------------
  |  Branch (1398:1): [True: 12, False: 72.0k]
  ------------------
 1399|     12|YY_RULE_SETUP
  ------------------
  |  | 1024|     12|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|     12|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|     12|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|     12|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1400|     12|#line 239 "hexpr.l"
 1401|     12|{ return TOR; }
 1402|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1403|    247|case 52:
  ------------------
  |  Branch (1403:1): [True: 247, False: 71.7k]
  ------------------
 1404|    247|YY_RULE_SETUP
  ------------------
  |  | 1024|    247|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|    247|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|    247|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|    247|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1405|    247|#line 240 "hexpr.l"
 1406|    247|{ return TIF; }
 1407|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1408|    247|case 53:
  ------------------
  |  Branch (1408:1): [True: 247, False: 71.7k]
  ------------------
 1409|    247|YY_RULE_SETUP
  ------------------
  |  | 1024|    247|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|    247|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|    247|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|    247|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1410|    247|#line 241 "hexpr.l"
 1411|    247|{ return TTHEN; }
 1412|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1413|    247|case 54:
  ------------------
  |  Branch (1413:1): [True: 247, False: 71.7k]
  ------------------
 1414|    247|YY_RULE_SETUP
  ------------------
  |  | 1024|    247|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|    247|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|    247|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|    247|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1415|    247|#line 242 "hexpr.l"
 1416|    247|{ return TELSE; }
 1417|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1418|     34|case 55:
  ------------------
  |  Branch (1418:1): [True: 34, False: 71.9k]
  ------------------
 1419|     34|YY_RULE_SETUP
  ------------------
  |  | 1024|     34|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|     34|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|     34|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|     34|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1420|     34|#line 243 "hexpr.l"
 1421|     34|{ SAVE_BOOL; return TBOOL; }
  ------------------
  |  |  737|     34|#define SAVE_BOOL   std::istringstream(std::string(yytext, yytext + yyleng)) >> std::boolalpha >> yylval.boolv
  ------------------
 1422|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1423|     62|case 56:
  ------------------
  |  Branch (1423:1): [True: 62, False: 71.9k]
  ------------------
 1424|     62|YY_RULE_SETUP
  ------------------
  |  | 1024|     62|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|     62|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|     62|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|     62|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1425|     62|#line 244 "hexpr.l"
 1426|     62|{ SAVE_BOOL; return TBOOL; }
  ------------------
  |  |  737|     62|#define SAVE_BOOL   std::istringstream(std::string(yytext, yytext + yyleng)) >> std::boolalpha >> yylval.boolv
  ------------------
 1427|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1428|     94|case 57:
  ------------------
  |  Branch (1428:1): [True: 94, False: 71.9k]
  ------------------
 1429|     94|YY_RULE_SETUP
  ------------------
  |  | 1024|     94|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|     94|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|     94|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|     94|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1430|     94|#line 245 "hexpr.l"
 1431|     94|{ return TIN; }
 1432|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1433|      0|case 58:
  ------------------
  |  Branch (1433:1): [True: 0, False: 72.0k]
  ------------------
 1434|      0|YY_RULE_SETUP
  ------------------
  |  | 1024|      0|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      0|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      0|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      0|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1435|      0|#line 246 "hexpr.l"
 1436|      0|{ return TPACK; }
 1437|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1438|      2|case 59:
  ------------------
  |  Branch (1438:1): [True: 2, False: 72.0k]
  ------------------
 1439|      2|YY_RULE_SETUP
  ------------------
  |  | 1024|      2|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      2|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      2|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      2|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1440|      2|#line 247 "hexpr.l"
 1441|      2|{ return TUNPACK; }
 1442|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1443|    173|case 60:
  ------------------
  |  Branch (1443:1): [True: 173, False: 71.8k]
  ------------------
 1444|    173|YY_RULE_SETUP
  ------------------
  |  | 1024|    173|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|    173|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|    173|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|    173|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1445|    173|#line 248 "hexpr.l"
 1446|    173|{ return TDO; }
 1447|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1448|     96|case 61:
  ------------------
  |  Branch (1448:1): [True: 96, False: 71.9k]
  ------------------
 1449|     96|YY_RULE_SETUP
  ------------------
  |  | 1024|     96|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|     96|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|     96|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|     96|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1450|     96|#line 249 "hexpr.l"
 1451|     96|{ return TRETURN; }
 1452|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1453|    150|case 62:
  ------------------
  |  Branch (1453:1): [True: 150, False: 71.8k]
  ------------------
 1454|    150|YY_RULE_SETUP
  ------------------
  |  | 1024|    150|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|    150|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|    150|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|    150|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1455|    150|#line 251 "hexpr.l"
 1456|    150|{ return TLPRAGMA; }
 1457|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1458|    150|case 63:
  ------------------
  |  Branch (1458:1): [True: 150, False: 71.8k]
  ------------------
 1459|    150|YY_RULE_SETUP
  ------------------
  |  | 1024|    150|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|    150|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|    150|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|    150|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1460|    150|#line 252 "hexpr.l"
 1461|    150|{ return TRPRAGMA; }   
 1462|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1463|  5.07k|case 64:
  ------------------
  |  Branch (1463:1): [True: 5.07k, False: 66.9k]
  ------------------
 1464|  5.07k|YY_RULE_SETUP
  ------------------
  |  | 1024|  5.07k|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|  5.07k|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|  5.07k|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|  5.07k|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1465|  5.07k|#line 254 "hexpr.l"
 1466|  5.07k|{ pushIndent(); return TLPAREN; }
 1467|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1468|  5.07k|case 65:
  ------------------
  |  Branch (1468:1): [True: 5.07k, False: 66.9k]
  ------------------
 1469|  5.07k|YY_RULE_SETUP
  ------------------
  |  | 1024|  5.07k|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|  5.07k|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|  5.07k|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|  5.07k|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1470|  5.07k|#line 255 "hexpr.l"
 1471|  5.07k|{ popIndent();  return TRPAREN; }
 1472|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1473|    840|case 66:
  ------------------
  |  Branch (1473:1): [True: 840, False: 71.1k]
  ------------------
 1474|    840|YY_RULE_SETUP
  ------------------
  |  | 1024|    840|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|    840|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|    840|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|    840|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1475|    840|#line 256 "hexpr.l"
 1476|    840|{ pushIndent(); return TLBRACKET; }
 1477|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1478|    840|case 67:
  ------------------
  |  Branch (1478:1): [True: 840, False: 71.1k]
  ------------------
 1479|    840|YY_RULE_SETUP
  ------------------
  |  | 1024|    840|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|    840|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|    840|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|    840|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1480|    840|#line 257 "hexpr.l"
 1481|    840|{ popIndent();  return TRBRACKET; }
 1482|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1483|    241|case 68:
  ------------------
  |  Branch (1483:1): [True: 241, False: 71.7k]
  ------------------
 1484|    241|YY_RULE_SETUP
  ------------------
  |  | 1024|    241|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|    241|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|    241|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|    241|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1485|    241|#line 258 "hexpr.l"
 1486|    241|{ pushIndent(); return TLBRACE; }
 1487|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1488|    241|case 69:
  ------------------
  |  Branch (1488:1): [True: 241, False: 71.7k]
  ------------------
 1489|    241|YY_RULE_SETUP
  ------------------
  |  | 1024|    241|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|    241|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|    241|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|    241|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1490|    241|#line 259 "hexpr.l"
 1491|    241|{ popIndent();  return TRBRACE; }
 1492|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1493|    708|case 70:
  ------------------
  |  Branch (1493:1): [True: 708, False: 71.3k]
  ------------------
 1494|    708|YY_RULE_SETUP
  ------------------
  |  | 1024|    708|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|    708|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|    708|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|    708|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1495|    708|#line 261 "hexpr.l"
 1496|    708|{ return TBAR; }
 1497|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1498|  3.23k|case 71:
  ------------------
  |  Branch (1498:1): [True: 3.23k, False: 68.7k]
  ------------------
 1499|  3.23k|YY_RULE_SETUP
  ------------------
  |  | 1024|  3.23k|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|  3.23k|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|  3.23k|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|  3.23k|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1500|  3.23k|#line 262 "hexpr.l"
 1501|  3.23k|{ return TCOMMA; }
 1502|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1503|    406|case 72:
  ------------------
  |  Branch (1503:1): [True: 406, False: 71.6k]
  ------------------
 1504|    406|YY_RULE_SETUP
  ------------------
  |  | 1024|    406|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|    406|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|    406|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|    406|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1505|    406|#line 263 "hexpr.l"
 1506|    406|{ return TSEMICOLON; }
 1507|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1508|     19|case 73:
  ------------------
  |  Branch (1508:1): [True: 19, False: 72.0k]
  ------------------
 1509|     19|YY_RULE_SETUP
  ------------------
  |  | 1024|     19|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|     19|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|     19|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|     19|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1510|     19|#line 264 "hexpr.l"
 1511|     19|{ return TAPPEND; }
 1512|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1513|    511|case 74:
  ------------------
  |  Branch (1513:1): [True: 511, False: 71.5k]
  ------------------
 1514|    511|YY_RULE_SETUP
  ------------------
  |  | 1024|    511|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|    511|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|    511|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|    511|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1515|    511|#line 265 "hexpr.l"
 1516|    511|{ return TPLUS; }
 1517|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1518|     99|case 75:
  ------------------
  |  Branch (1518:1): [True: 99, False: 71.9k]
  ------------------
 1519|     99|YY_RULE_SETUP
  ------------------
  |  | 1024|     99|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|     99|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|     99|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|     99|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1520|     99|#line 266 "hexpr.l"
 1521|     99|{ return TMINUS; }
 1522|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1523|    385|case 76:
  ------------------
  |  Branch (1523:1): [True: 385, False: 71.6k]
  ------------------
 1524|    385|YY_RULE_SETUP
  ------------------
  |  | 1024|    385|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|    385|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|    385|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|    385|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1525|    385|#line 267 "hexpr.l"
 1526|    385|{ return TTIMES; }
 1527|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1528|     52|case 77:
  ------------------
  |  Branch (1528:1): [True: 52, False: 71.9k]
  ------------------
 1529|     52|YY_RULE_SETUP
  ------------------
  |  | 1024|     52|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|     52|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|     52|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|     52|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1530|     52|#line 268 "hexpr.l"
 1531|     52|{ return TDIVIDE; }
 1532|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1533|     18|case 78:
  ------------------
  |  Branch (1533:1): [True: 18, False: 72.0k]
  ------------------
 1534|     18|YY_RULE_SETUP
  ------------------
  |  | 1024|     18|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|     18|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|     18|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|     18|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1535|     18|#line 269 "hexpr.l"
 1536|     18|{ return TREM; }
 1537|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1538|    109|case 79:
  ------------------
  |  Branch (1538:1): [True: 109, False: 71.9k]
  ------------------
 1539|    109|YY_RULE_SETUP
  ------------------
  |  | 1024|    109|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|    109|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|    109|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|    109|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1540|    109|#line 270 "hexpr.l"
 1541|    109|{ return TFN; }
 1542|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1543|      0|case 80:
  ------------------
  |  Branch (1543:1): [True: 0, False: 72.0k]
  ------------------
 1544|      0|YY_RULE_SETUP
  ------------------
  |  | 1024|      0|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      0|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      0|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      0|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1545|      0|#line 271 "hexpr.l"
 1546|      0|{ return TFNL; }
 1547|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1548|      0|case 81:
  ------------------
  |  Branch (1548:1): [True: 0, False: 72.0k]
  ------------------
 1549|      0|YY_RULE_SETUP
  ------------------
  |  | 1024|      0|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      0|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      0|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      0|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1550|      0|#line 272 "hexpr.l"
 1551|      0|{ return TCOMPOSE; }
 1552|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1553|    542|case 82:
  ------------------
  |  Branch (1553:1): [True: 542, False: 71.4k]
  ------------------
 1554|    542|YY_RULE_SETUP
  ------------------
  |  | 1024|    542|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|    542|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|    542|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|    542|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1555|    542|#line 273 "hexpr.l"
 1556|    542|{ return TDOT; }
 1557|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1558|      2|case 83:
  ------------------
  |  Branch (1558:1): [True: 2, False: 72.0k]
  ------------------
 1559|      2|YY_RULE_SETUP
  ------------------
  |  | 1024|      2|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      2|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      2|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      2|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1560|      2|#line 274 "hexpr.l"
 1561|      2|{ return TUPTO; }
 1562|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1563|     89|case 84:
  ------------------
  |  Branch (1563:1): [True: 89, False: 71.9k]
  ------------------
 1564|     89|YY_RULE_SETUP
  ------------------
  |  | 1024|     89|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|     89|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|     89|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|     89|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1565|     89|#line 275 "hexpr.l"
 1566|     89|{ return TCARET; }
 1567|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1568|     87|case 85:
  ------------------
  |  Branch (1568:1): [True: 87, False: 71.9k]
  ------------------
 1569|     87|YY_RULE_SETUP
  ------------------
  |  | 1024|     87|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|     87|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|     87|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|     87|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1570|     87|#line 276 "hexpr.l"
 1571|     87|{ return TAT; }
 1572|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1573|      0|case 86:
  ------------------
  |  Branch (1573:1): [True: 0, False: 72.0k]
  ------------------
 1574|      0|YY_RULE_SETUP
  ------------------
  |  | 1024|      0|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      0|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      0|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      0|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1575|      0|#line 277 "hexpr.l"
 1576|      0|{ return TDOLLAR; }
 1577|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1578|     19|case 87:
  ------------------
  |  Branch (1578:1): [True: 19, False: 72.0k]
  ------------------
 1579|     19|YY_RULE_SETUP
  ------------------
  |  | 1024|     19|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|     19|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|     19|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|     19|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1580|     19|#line 278 "hexpr.l"
 1581|     19|{ return TQUESTION; }
 1582|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1583|     51|case 88:
  ------------------
  |  Branch (1583:1): [True: 51, False: 71.9k]
  ------------------
 1584|     51|YY_RULE_SETUP
  ------------------
  |  | 1024|     51|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|     51|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|     51|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|     51|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1585|     51|#line 279 "hexpr.l"
 1586|     51|{ SAVE_STR;    return (hobbes::str::unescape(hobbes::str::trimq(*yylval.string, '\'')).size() <= 1) ? TCHAR : TREGEX; }
  ------------------
  |  |  735|     51|#define SAVE_STR    yylval.string = hobbes::autorelease(new std::string(yytext, yytext + yyleng))
  ------------------
  |  Branch (1586:23): [True: 49, False: 2]
  ------------------
 1587|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1588|      0|case 89:
  ------------------
  |  Branch (1588:1): [True: 0, False: 72.0k]
  ------------------
 1589|      0|YY_RULE_SETUP
  ------------------
  |  | 1024|      0|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      0|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      0|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      0|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1590|      0|#line 280 "hexpr.l"
 1591|      0|{ return TSQUOTE; }
 1592|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1593|      0|case 90:
  ------------------
  |  Branch (1593:1): [True: 0, False: 72.0k]
  ------------------
 1594|      0|YY_RULE_SETUP
  ------------------
  |  | 1024|      0|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      0|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      0|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      0|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1595|      0|#line 281 "hexpr.l"
 1596|      0|{ return TEQUOTE; }
 1597|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1598|     12|case 91:
  ------------------
  |  Branch (1598:1): [True: 12, False: 72.0k]
  ------------------
 1599|     12|YY_RULE_SETUP
  ------------------
  |  | 1024|     12|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|     12|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|     12|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|     12|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1600|     12|#line 282 "hexpr.l"
 1601|     12|{ SAVE_STR;    return TBYTE; }
  ------------------
  |  |  735|     12|#define SAVE_STR    yylval.string = hobbes::autorelease(new std::string(yytext, yytext + yyleng))
  ------------------
 1602|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1603|      1|case 92:
  ------------------
  |  Branch (1603:1): [True: 1, False: 72.0k]
  ------------------
 1604|      1|YY_RULE_SETUP
  ------------------
  |  | 1024|      1|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      1|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      1|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      1|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1605|      1|#line 283 "hexpr.l"
 1606|      1|{ SAVE_STR;    return TBYTES; }
  ------------------
  |  |  735|      1|#define SAVE_STR    yylval.string = hobbes::autorelease(new std::string(yytext, yytext + yyleng))
  ------------------
 1607|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1608|  17.9k|case 93:
  ------------------
  |  Branch (1608:1): [True: 17.9k, False: 54.1k]
  ------------------
 1609|  17.9k|YY_RULE_SETUP
  ------------------
  |  | 1024|  17.9k|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|  17.9k|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|  17.9k|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|  17.9k|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1610|  17.9k|#line 284 "hexpr.l"
 1611|  17.9k|{ SAVE_IDENT;  return TIDENT; }
  ------------------
  |  |  736|  17.9k|#define SAVE_IDENT  yylval.string = identifier(yytext, yytext + yyleng)
  ------------------
 1612|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1613|      2|case 94:
  ------------------
  |  Branch (1613:1): [True: 2, False: 72.0k]
  ------------------
 1614|      2|YY_RULE_SETUP
  ------------------
  |  | 1024|      2|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      2|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      2|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      2|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1615|      2|#line 285 "hexpr.l"
 1616|      2|{ SAVE_STR;    return TTUPSECTION; }
  ------------------
  |  |  735|      2|#define SAVE_STR    yylval.string = hobbes::autorelease(new std::string(yytext, yytext + yyleng))
  ------------------
 1617|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1618|      2|case 95:
  ------------------
  |  Branch (1618:1): [True: 2, False: 72.0k]
  ------------------
 1619|      2|YY_RULE_SETUP
  ------------------
  |  | 1024|      2|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      2|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      2|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      2|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1620|      2|#line 286 "hexpr.l"
 1621|      2|{ SAVE_FLOAT;  return TFLOAT; }
  ------------------
  |  |  742|      2|#define SAVE_FLOAT  yylval.floatv = std::stof(std::string(yytext, yytext + yyleng))
  ------------------
 1622|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1623|      2|case 96:
  ------------------
  |  Branch (1623:1): [True: 2, False: 72.0k]
  ------------------
 1624|      2|YY_RULE_SETUP
  ------------------
  |  | 1024|      2|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      2|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      2|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      2|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1625|      2|#line 287 "hexpr.l"
 1626|      2|{ SAVE_DOUBLE; return TDOUBLE; }
  ------------------
  |  |  743|      2|#define SAVE_DOUBLE yylval.doublev = std::stod(std::string(yytext, yytext + yyleng))
  ------------------
 1627|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1628|      0|case 97:
  ------------------
  |  Branch (1628:1): [True: 0, False: 72.0k]
  ------------------
 1629|      0|YY_RULE_SETUP
  ------------------
  |  | 1024|      0|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      0|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      0|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      0|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1630|      0|#line 288 "hexpr.l"
 1631|      0|{ SAVE_DOUBLE; yylval.doublev *= 0.01; return TDOUBLE; }
  ------------------
  |  |  743|      0|#define SAVE_DOUBLE yylval.doublev = std::stod(std::string(yytext, yytext + yyleng))
  ------------------
 1632|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1633|      2|case 98:
  ------------------
  |  Branch (1633:1): [True: 2, False: 72.0k]
  ------------------
 1634|      2|YY_RULE_SETUP
  ------------------
  |  | 1024|      2|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      2|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      2|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      2|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1635|      2|#line 289 "hexpr.l"
 1636|      2|{ SAVE_INT128; return TINT128; }
  ------------------
  |  |  741|      2|#define SAVE_INT128 yylval.int128v = str2int128(std::string(yytext, yytext + yyleng - 1))
  ------------------
 1637|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1638|    360|case 99:
  ------------------
  |  Branch (1638:1): [True: 360, False: 71.6k]
  ------------------
 1639|    360|YY_RULE_SETUP
  ------------------
  |  | 1024|    360|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|    360|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|    360|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|    360|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1640|    360|#line 290 "hexpr.l"
 1641|    360|{ SAVE_LONG;   return TLONG; }
  ------------------
  |  |  740|    360|#define SAVE_LONG   yylval.longv = str2long(std::string(yytext, yytext + yyleng - 1))
  ------------------
 1642|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1643|      3|case 100:
  ------------------
  |  Branch (1643:1): [True: 3, False: 72.0k]
  ------------------
 1644|      3|YY_RULE_SETUP
  ------------------
  |  | 1024|      3|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      3|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      3|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      3|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1645|      3|#line 291 "hexpr.l"
 1646|      3|{ SAVE_SHORT;  return TSHORT; }
  ------------------
  |  |  738|      3|#define SAVE_SHORT  yylval.shortv = str2short(std::string(yytext, yytext + yyleng - 1))
  ------------------
 1647|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1648|    706|case 101:
  ------------------
  |  Branch (1648:1): [True: 706, False: 71.3k]
  ------------------
 1649|    706|YY_RULE_SETUP
  ------------------
  |  | 1024|    706|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|    706|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|    706|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|    706|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1650|    706|#line 292 "hexpr.l"
 1651|    706|{ SAVE_INT;    return TINT; }
  ------------------
  |  |  739|    706|#define SAVE_INT    yylval.intv = str2int(std::string(yytext, yytext + yyleng))
  ------------------
 1652|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1653|    181|case 102:
  ------------------
  |  Branch (1653:1): [True: 181, False: 71.8k]
  ------------------
 1654|       |/* rule 102 can match eol */
 1655|    181|YY_RULE_SETUP
  ------------------
  |  | 1024|    181|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|    181|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|    181|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|    181|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1656|    181|#line 293 "hexpr.l"
 1657|    181|{ SAVE_STR;    return TSTRING; }
  ------------------
  |  |  735|    181|#define SAVE_STR    yylval.string = hobbes::autorelease(new std::string(yytext, yytext + yyleng))
  ------------------
 1658|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1659|      0|case 103:
  ------------------
  |  Branch (1659:1): [True: 0, False: 72.0k]
  ------------------
 1660|      0|YY_RULE_SETUP
  ------------------
  |  | 1024|      0|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      0|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      0|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      0|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1661|      0|#line 295 "hexpr.l"
 1662|      0|{ SAVE_STR;    return TTIMEINTERVAL; }
  ------------------
  |  |  735|      0|#define SAVE_STR    yylval.string = hobbes::autorelease(new std::string(yytext, yytext + yyleng))
  ------------------
 1663|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1664|      0|case 104:
  ------------------
  |  Branch (1664:1): [True: 0, False: 72.0k]
  ------------------
 1665|      0|YY_RULE_SETUP
  ------------------
  |  | 1024|      0|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      0|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      0|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      0|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1666|      0|#line 296 "hexpr.l"
 1667|      0|{ SAVE_STR;    return TTIMEINTERVAL; }
  ------------------
  |  |  735|      0|#define SAVE_STR    yylval.string = hobbes::autorelease(new std::string(yytext, yytext + yyleng))
  ------------------
 1668|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1669|      1|case 105:
  ------------------
  |  Branch (1669:1): [True: 1, False: 72.0k]
  ------------------
 1670|      1|YY_RULE_SETUP
  ------------------
  |  | 1024|      1|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      1|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      1|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      1|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1671|      1|#line 297 "hexpr.l"
 1672|      1|{ SAVE_STR;    return TTIMEINTERVAL; }
  ------------------
  |  |  735|      1|#define SAVE_STR    yylval.string = hobbes::autorelease(new std::string(yytext, yytext + yyleng))
  ------------------
 1673|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1674|      0|case 106:
  ------------------
  |  Branch (1674:1): [True: 0, False: 72.0k]
  ------------------
 1675|      0|YY_RULE_SETUP
  ------------------
  |  | 1024|      0|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      0|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      0|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      0|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1676|      0|#line 298 "hexpr.l"
 1677|      0|{ SAVE_STR;    return TTIMEINTERVAL; }
  ------------------
  |  |  735|      0|#define SAVE_STR    yylval.string = hobbes::autorelease(new std::string(yytext, yytext + yyleng))
  ------------------
 1678|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1679|      0|case 107:
  ------------------
  |  Branch (1679:1): [True: 0, False: 72.0k]
  ------------------
 1680|      0|YY_RULE_SETUP
  ------------------
  |  | 1024|      0|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      0|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      0|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      0|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1681|      0|#line 299 "hexpr.l"
 1682|      0|{ SAVE_STR;    return TTIMEINTERVAL; }
  ------------------
  |  |  735|      0|#define SAVE_STR    yylval.string = hobbes::autorelease(new std::string(yytext, yytext + yyleng))
  ------------------
 1683|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1684|      0|case 108:
  ------------------
  |  Branch (1684:1): [True: 0, False: 72.0k]
  ------------------
 1685|      0|YY_RULE_SETUP
  ------------------
  |  | 1024|      0|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      0|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      0|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      0|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1686|      0|#line 300 "hexpr.l"
 1687|      0|{ SAVE_STR;    return TTIMEINTERVAL; }
  ------------------
  |  |  735|      0|#define SAVE_STR    yylval.string = hobbes::autorelease(new std::string(yytext, yytext + yyleng))
  ------------------
 1688|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1689|      0|case 109:
  ------------------
  |  Branch (1689:1): [True: 0, False: 72.0k]
  ------------------
 1690|      0|YY_RULE_SETUP
  ------------------
  |  | 1024|      0|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      0|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      0|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      0|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1691|      0|#line 301 "hexpr.l"
 1692|      0|{ SAVE_STR;    return TTIMEINTERVAL; }
  ------------------
  |  |  735|      0|#define SAVE_STR    yylval.string = hobbes::autorelease(new std::string(yytext, yytext + yyleng))
  ------------------
 1693|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1694|      0|case 110:
  ------------------
  |  Branch (1694:1): [True: 0, False: 72.0k]
  ------------------
 1695|      0|YY_RULE_SETUP
  ------------------
  |  | 1024|      0|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      0|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      0|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      0|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1696|      0|#line 302 "hexpr.l"
 1697|      0|{ SAVE_STR;    return TTIMEINTERVAL; }
  ------------------
  |  |  735|      0|#define SAVE_STR    yylval.string = hobbes::autorelease(new std::string(yytext, yytext + yyleng))
  ------------------
 1698|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1699|      0|case 111:
  ------------------
  |  Branch (1699:1): [True: 0, False: 72.0k]
  ------------------
 1700|      0|YY_RULE_SETUP
  ------------------
  |  | 1024|      0|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      0|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      0|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      0|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1701|      0|#line 303 "hexpr.l"
 1702|      0|{ SAVE_STR;    return TTIMEINTERVAL; }
  ------------------
  |  |  735|      0|#define SAVE_STR    yylval.string = hobbes::autorelease(new std::string(yytext, yytext + yyleng))
  ------------------
 1703|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1704|      0|case 112:
  ------------------
  |  Branch (1704:1): [True: 0, False: 72.0k]
  ------------------
 1705|      0|YY_RULE_SETUP
  ------------------
  |  | 1024|      0|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      0|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      0|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      0|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1706|      0|#line 305 "hexpr.l"
 1707|      0|{ SAVE_STR; return TTIME; }
  ------------------
  |  |  735|      0|#define SAVE_STR    yylval.string = hobbes::autorelease(new std::string(yytext, yytext + yyleng))
  ------------------
 1708|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1709|      0|case 113:
  ------------------
  |  Branch (1709:1): [True: 0, False: 72.0k]
  ------------------
 1710|      0|YY_RULE_SETUP
  ------------------
  |  | 1024|      0|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      0|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      0|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      0|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1711|      0|#line 306 "hexpr.l"
 1712|      0|{ SAVE_STR; return TTIME; }
  ------------------
  |  |  735|      0|#define SAVE_STR    yylval.string = hobbes::autorelease(new std::string(yytext, yytext + yyleng))
  ------------------
 1713|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1714|      0|case 114:
  ------------------
  |  Branch (1714:1): [True: 0, False: 72.0k]
  ------------------
 1715|      0|YY_RULE_SETUP
  ------------------
  |  | 1024|      0|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      0|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      0|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      0|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1716|      0|#line 307 "hexpr.l"
 1717|      0|{ SAVE_STR; return TTIME; }
  ------------------
  |  |  735|      0|#define SAVE_STR    yylval.string = hobbes::autorelease(new std::string(yytext, yytext + yyleng))
  ------------------
 1718|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1719|      0|case 115:
  ------------------
  |  Branch (1719:1): [True: 0, False: 72.0k]
  ------------------
 1720|      0|YY_RULE_SETUP
  ------------------
  |  | 1024|      0|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      0|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      0|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      0|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1721|      0|#line 308 "hexpr.l"
 1722|      0|{ SAVE_STR; return TTIME; }
  ------------------
  |  |  735|      0|#define SAVE_STR    yylval.string = hobbes::autorelease(new std::string(yytext, yytext + yyleng))
  ------------------
 1723|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1724|      0|case 116:
  ------------------
  |  Branch (1724:1): [True: 0, False: 72.0k]
  ------------------
 1725|      0|YY_RULE_SETUP
  ------------------
  |  | 1024|      0|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      0|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      0|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      0|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1726|      0|#line 310 "hexpr.l"
 1727|      0|{ SAVE_STR; return TDATETIME; }
  ------------------
  |  |  735|      0|#define SAVE_STR    yylval.string = hobbes::autorelease(new std::string(yytext, yytext + yyleng))
  ------------------
 1728|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1729|      0|case 117:
  ------------------
  |  Branch (1729:1): [True: 0, False: 72.0k]
  ------------------
 1730|      0|YY_RULE_SETUP
  ------------------
  |  | 1024|      0|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      0|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      0|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      0|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1731|      0|#line 311 "hexpr.l"
 1732|      0|{ SAVE_STR; return TDATETIME; }
  ------------------
  |  |  735|      0|#define SAVE_STR    yylval.string = hobbes::autorelease(new std::string(yytext, yytext + yyleng))
  ------------------
 1733|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1734|      0|case 118:
  ------------------
  |  Branch (1734:1): [True: 0, False: 72.0k]
  ------------------
 1735|      0|YY_RULE_SETUP
  ------------------
  |  | 1024|      0|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      0|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      0|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      0|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1736|      0|#line 312 "hexpr.l"
 1737|      0|{ SAVE_STR; return TDATETIME; }
  ------------------
  |  |  735|      0|#define SAVE_STR    yylval.string = hobbes::autorelease(new std::string(yytext, yytext + yyleng))
  ------------------
 1738|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1739|      0|case 119:
  ------------------
  |  Branch (1739:1): [True: 0, False: 72.0k]
  ------------------
 1740|      0|YY_RULE_SETUP
  ------------------
  |  | 1024|      0|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      0|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      0|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      0|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1741|      0|#line 313 "hexpr.l"
 1742|      0|{ SAVE_STR; return TDATETIME; }
  ------------------
  |  |  735|      0|#define SAVE_STR    yylval.string = hobbes::autorelease(new std::string(yytext, yytext + yyleng))
  ------------------
 1743|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1744|      0|case 120:
  ------------------
  |  Branch (1744:1): [True: 0, False: 72.0k]
  ------------------
 1745|      0|YY_RULE_SETUP
  ------------------
  |  | 1024|      0|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      0|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      0|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      0|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1746|      0|#line 314 "hexpr.l"
 1747|      0|{ SAVE_STR; return TDATETIME; }
  ------------------
  |  |  735|      0|#define SAVE_STR    yylval.string = hobbes::autorelease(new std::string(yytext, yytext + yyleng))
  ------------------
 1748|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1749|      0|case 121:
  ------------------
  |  Branch (1749:1): [True: 0, False: 72.0k]
  ------------------
 1750|      0|YY_RULE_SETUP
  ------------------
  |  | 1024|      0|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      0|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      0|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      0|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1751|      0|#line 316 "hexpr.l"
 1752|      0|{ yyVexpLexError = "Unknown character: " + std::string(yytext); yyterminate(); if (false) { yyrealloc(0, 0); yyunput(0, 0); } }
  ------------------
  |  |  985|      0|#define yyterminate() return YY_NULL
  |  |  ------------------
  |  |  |  |  107|      0|#define YY_NULL 0
  |  |  ------------------
  ------------------
  |  Branch (1752:84): [Folded, False: 0]
  ------------------
 1753|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1754|      0|case 122:
  ------------------
  |  Branch (1754:1): [True: 0, False: 72.0k]
  ------------------
 1755|      0|YY_RULE_SETUP
  ------------------
  |  | 1024|      0|	YY_USER_ACTION
  |  |  ------------------
  |  |  |  |  682|      0|  yylloc.first_line = yylloc.last_line = yylineno; \
  |  |  |  |  683|      0|  yylloc.first_column = yycolumn; yylloc.last_column = yycolumn+yyleng-1; \
  |  |  |  |  684|      0|  yycolumn += yyleng;
  |  |  ------------------
  ------------------
 1756|      0|#line 318 "hexpr.l"
 1757|      0|ECHO;
  ------------------
  |  |  941|      0|#define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0)
  |  |  ------------------
  |  |  |  Branch (941:23): [True: 0, False: 0]
  |  |  |  Branch (941:80): [Folded, False: 0]
  |  |  ------------------
  ------------------
 1758|      0|	YY_BREAK
  ------------------
  |  | 1020|      0|#define YY_BREAK /*LINTED*/break;
  ------------------
 1759|      0|#line 1760 "hexpr.lex.C"
 1760|     30|case YY_STATE_EOF(INITIAL):
  ------------------
  |  |  126|     30|#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
  |  |  ------------------
  |  |  |  |  378|     30|#define YY_END_OF_BUFFER 123
  |  |  ------------------
  ------------------
  |  Branch (1760:1): [True: 30, False: 72.0k]
  ------------------
 1761|     30|case YY_STATE_EOF(BLOCK_COMMENT):
  ------------------
  |  |  126|     30|#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
  |  |  ------------------
  |  |  |  |  378|     30|#define YY_END_OF_BUFFER 123
  |  |  ------------------
  ------------------
  |  Branch (1761:1): [True: 0, False: 72.0k]
  ------------------
 1762|     30|	yyterminate();
  ------------------
  |  |  985|     30|#define yyterminate() return YY_NULL
  |  |  ------------------
  |  |  |  |  107|     30|#define YY_NULL 0
  |  |  ------------------
  ------------------
 1763|       |
 1764|     57|	case YY_END_OF_BUFFER:
  ------------------
  |  |  378|     57|#define YY_END_OF_BUFFER 123
  ------------------
  |  Branch (1764:2): [True: 57, False: 71.9k]
  ------------------
 1765|     57|		{
 1766|       |		/* Amount of text matched not including the EOB char. */
 1767|     57|		int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
  ------------------
  |  |  361|     57|#define yytext_ptr yytext
  ------------------
 1768|       |
 1769|       |		/* Undo the effects of YY_DO_BEFORE_ACTION. */
 1770|     57|		*yy_cp = (yy_hold_char);
 1771|     57|		YY_RESTORE_YY_MORE_OFFSET
 1772|       |
 1773|     57|		if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
  ------------------
  |  |  285|     57|#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
  ------------------
              		if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
  ------------------
  |  |  251|     57|#define YY_BUFFER_NEW 0
  ------------------
  |  Branch (1773:8): [True: 30, False: 27]
  ------------------
 1774|     30|			{
 1775|       |			/* We're scanning a new file or input source.  It's
 1776|       |			 * possible that this happened because the user
 1777|       |			 * just pointed yyin at a new source and called
 1778|       |			 * yylex().  If so, then we have to assure
 1779|       |			 * consistency between YY_CURRENT_BUFFER and our
 1780|       |			 * globals.  Here is the right place to do so, because
 1781|       |			 * this is the first action (other than possibly a
 1782|       |			 * back-up) that will match for the new input source.
 1783|       |			 */
 1784|     30|			(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
  ------------------
  |  |  285|     30|#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
  ------------------
 1785|     30|			YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
  ------------------
  |  |  285|     30|#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
  ------------------
 1786|     30|			YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
  ------------------
  |  |  285|     30|#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
  ------------------
              			YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
  ------------------
  |  |  252|     30|#define YY_BUFFER_NORMAL 1
  ------------------
 1787|     30|			}
 1788|       |
 1789|       |		/* Note that here we test for yy_c_buf_p "<=" to the position
 1790|       |		 * of the first EOB in the buffer, since yy_c_buf_p will
 1791|       |		 * already have been incremented past the NUL character
 1792|       |		 * (since all states make transitions on EOB to the
 1793|       |		 * end-of-buffer state).  Contrast this with the test
 1794|       |		 * in input().
 1795|       |		 */
 1796|     57|		if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
  ------------------
  |  |  285|     57|#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
  ------------------
  |  Branch (1796:8): [True: 0, False: 57]
  ------------------
 1797|      0|			{ /* This was really a NUL. */
 1798|      0|			yy_state_type yy_next_state;
 1799|       |
 1800|      0|			(yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
  ------------------
  |  |  361|      0|#define yytext_ptr yytext
  ------------------
 1801|       |
 1802|      0|			yy_current_state = yy_get_previous_state(  );
 1803|       |
 1804|       |			/* Okay, we're now positioned to make the NUL
 1805|       |			 * transition.  We couldn't have
 1806|       |			 * yy_get_previous_state() go ahead and do it
 1807|       |			 * for us because it doesn't know how to deal
 1808|       |			 * with the possibility of jamming (and we don't
 1809|       |			 * want to build jamming into it because then it
 1810|       |			 * will run more slowly).
 1811|       |			 */
 1812|       |
 1813|      0|			yy_next_state = yy_try_NUL_trans( yy_current_state );
 1814|       |
 1815|      0|			yy_bp = (yytext_ptr) + YY_MORE_ADJ;
  ------------------
  |  |  361|      0|#define yytext_ptr yytext
  ------------------
              			yy_bp = (yytext_ptr) + YY_MORE_ADJ;
  ------------------
  |  |  670|      0|#define YY_MORE_ADJ 0
  ------------------
 1816|       |
 1817|      0|			if ( yy_next_state )
  ------------------
  |  Branch (1817:9): [True: 0, False: 0]
  ------------------
 1818|      0|				{
 1819|       |				/* Consume the NUL. */
 1820|      0|				yy_cp = ++(yy_c_buf_p);
 1821|      0|				yy_current_state = yy_next_state;
 1822|      0|				goto yy_match;
 1823|      0|				}
 1824|       |
 1825|      0|			else
 1826|      0|				{
 1827|      0|				yy_cp = (yy_c_buf_p);
 1828|      0|				goto yy_find_action;
 1829|      0|				}
 1830|      0|			}
 1831|       |
 1832|     57|		else switch ( yy_get_next_buffer(  ) )
  ------------------
  |  Branch (1832:17): [True: 57, False: 0]
  ------------------
 1833|     57|			{
 1834|     30|			case EOB_ACT_END_OF_FILE:
  ------------------
  |  |  163|     30|#define EOB_ACT_END_OF_FILE 1
  ------------------
  |  Branch (1834:4): [True: 30, False: 27]
  ------------------
 1835|     30|				{
 1836|     30|				(yy_did_buffer_switch_on_eof) = 0;
 1837|       |
 1838|     30|				if ( yywrap(  ) )
  ------------------
  |  |  346|     30|#define yywrap() (/*CONSTCOND*/1)
  |  |  ------------------
  |  |  |  Branch (346:18): [True: 30, Folded]
  |  |  ------------------
  ------------------
 1839|     30|					{
 1840|       |					/* Note: because we've taken care in
 1841|       |					 * yy_get_next_buffer() to have set up
 1842|       |					 * yytext, we can now set up
 1843|       |					 * yy_c_buf_p so that if some total
 1844|       |					 * hoser (like flex itself) wants to
 1845|       |					 * call the scanner after we return the
 1846|       |					 * YY_NULL, it'll still work - another
 1847|       |					 * YY_NULL will get returned.
 1848|       |					 */
 1849|     30|					(yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
  ------------------
  |  |  361|     30|#define yytext_ptr yytext
  ------------------
              					(yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
  ------------------
  |  |  670|     30|#define YY_MORE_ADJ 0
  ------------------
 1850|       |
 1851|     30|					yy_act = YY_STATE_EOF(YY_START);
  ------------------
  |  |  126|     30|#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
  |  |  ------------------
  |  |  |  |  378|     30|#define YY_END_OF_BUFFER 123
  |  |  ------------------
  ------------------
 1852|     30|					goto do_action;
 1853|     30|					}
 1854|       |
 1855|      0|				else
 1856|      0|					{
 1857|      0|					if ( ! (yy_did_buffer_switch_on_eof) )
  ------------------
  |  Branch (1857:11): [True: 0, False: 0]
  ------------------
 1858|      0|						YY_NEW_FILE;
  ------------------
  |  |  128|      0|#define YY_NEW_FILE yyrestart( yyin  )
  ------------------
 1859|      0|					}
 1860|      0|				break;
 1861|     30|				}
 1862|       |
 1863|      0|			case EOB_ACT_CONTINUE_SCAN:
  ------------------
  |  |  162|      0|#define EOB_ACT_CONTINUE_SCAN 0
  ------------------
  |  Branch (1863:4): [True: 0, False: 57]
  ------------------
 1864|      0|				(yy_c_buf_p) =
 1865|      0|					(yytext_ptr) + yy_amount_of_matched_text;
  ------------------
  |  |  361|      0|#define yytext_ptr yytext
  ------------------
 1866|       |
 1867|      0|				yy_current_state = yy_get_previous_state(  );
 1868|       |
 1869|      0|				yy_cp = (yy_c_buf_p);
 1870|      0|				yy_bp = (yytext_ptr) + YY_MORE_ADJ;
  ------------------
  |  |  361|      0|#define yytext_ptr yytext
  ------------------
              				yy_bp = (yytext_ptr) + YY_MORE_ADJ;
  ------------------
  |  |  670|      0|#define YY_MORE_ADJ 0
  ------------------
 1871|      0|				goto yy_match;
 1872|       |
 1873|     27|			case EOB_ACT_LAST_MATCH:
  ------------------
  |  |  164|     27|#define EOB_ACT_LAST_MATCH 2
  ------------------
  |  Branch (1873:4): [True: 27, False: 30]
  ------------------
 1874|     27|				(yy_c_buf_p) =
 1875|     27|				&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
  ------------------
  |  |  285|     27|#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
  ------------------
 1876|       |
 1877|     27|				yy_current_state = yy_get_previous_state(  );
 1878|       |
 1879|     27|				yy_cp = (yy_c_buf_p);
 1880|     27|				yy_bp = (yytext_ptr) + YY_MORE_ADJ;
  ------------------
  |  |  361|     27|#define yytext_ptr yytext
  ------------------
              				yy_bp = (yytext_ptr) + YY_MORE_ADJ;
  ------------------
  |  |  670|     27|#define YY_MORE_ADJ 0
  ------------------
 1881|     27|				goto yy_find_action;
 1882|     57|			}
 1883|      0|		break;
 1884|     57|		}
 1885|       |
 1886|      0|	default:
  ------------------
  |  Branch (1886:2): [True: 0, False: 72.0k]
  ------------------
 1887|      0|		YY_FATAL_ERROR(
  ------------------
  |  |  995|      0|#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
  ------------------
 1888|  72.0k|			"fatal flex scanner internal error--no action found" );
 1889|  72.0k|	} /* end of action switch */
 1890|  72.0k|		} /* end of scanning one token */
 1891|  46.7k|	} /* end of user's declarations */
 1892|  46.7k|} /* end of yylex */
_Z19yy_switch_to_bufferP15yy_buffer_state:
 2241|     60|{
 2242|       |    
 2243|       |	/* TODO. We should be able to replace this entire function body
 2244|       |	 * with
 2245|       |	 *		yypop_buffer_state();
 2246|       |	 *		yypush_buffer_state(new_buffer);
 2247|       |     */
 2248|     60|	yyensure_buffer_stack ();
 2249|     60|	if ( YY_CURRENT_BUFFER == new_buffer )
  ------------------
  |  |  279|     60|#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
  |  |  ------------------
  |  |  |  Branch (279:29): [True: 60, False: 0]
  |  |  ------------------
  |  |  280|     60|                          ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
  |  |  281|     60|                          : NULL)
  ------------------
  |  Branch (2249:7): [True: 30, False: 30]
  ------------------
 2250|     30|		return;
 2251|       |
 2252|     30|	if ( YY_CURRENT_BUFFER )
  ------------------
  |  |  279|     30|#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
  |  |  ------------------
  |  |  |  Branch (279:27): [True: 0, False: 30]
  |  |  |  Branch (279:29): [True: 30, False: 0]
  |  |  ------------------
  |  |  280|     30|                          ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
  |  |  281|     30|                          : NULL)
  ------------------
 2253|      0|		{
 2254|       |		/* Flush out information for old buffer. */
 2255|      0|		*(yy_c_buf_p) = (yy_hold_char);
 2256|      0|		YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
  ------------------
  |  |  285|      0|#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
  ------------------
 2257|      0|		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
  ------------------
  |  |  285|      0|#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
  ------------------
 2258|      0|		}
 2259|       |
 2260|     30|	YY_CURRENT_BUFFER_LVALUE = new_buffer;
  ------------------
  |  |  285|     30|#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
  ------------------
 2261|     30|	yy_load_buffer_state(  );
 2262|       |
 2263|       |	/* We don't actually know whether we did this switch during
 2264|       |	 * EOF (yywrap()) processing, but the only time this flag
 2265|       |	 * is looked at is after yywrap() is called, so it's safe
 2266|       |	 * to go ahead and always set it.
 2267|       |	 */
 2268|     30|	(yy_did_buffer_switch_on_eof) = 1;
 2269|     30|}
_Z16yy_delete_bufferP15yy_buffer_state:
 2314|     30|{
 2315|       |    
 2316|     30|	if ( ! b )
  ------------------
  |  Branch (2316:7): [True: 0, False: 30]
  ------------------
 2317|      0|		return;
 2318|       |
 2319|     30|	if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
  ------------------
  |  |  279|     30|#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
  |  |  ------------------
  |  |  |  Branch (279:29): [True: 30, False: 0]
  |  |  ------------------
  |  |  280|     30|                          ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
  |  |  281|     30|                          : NULL)
  ------------------
  |  Branch (2319:7): [True: 30, False: 0]
  ------------------
 2320|     30|		YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
  ------------------
  |  |  285|     30|#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
  ------------------
 2321|       |
 2322|     30|	if ( b->yy_is_our_buffer )
  ------------------
  |  Branch (2322:7): [True: 30, False: 0]
  ------------------
 2323|     30|		yyfree( (void *) b->yy_ch_buf  );
 2324|       |
 2325|     30|	yyfree( (void *) b  );
 2326|     30|}
_Z14yy_scan_bufferPcm:
 2488|     30|{
 2489|     30|	YY_BUFFER_STATE b;
 2490|       |    
 2491|     30|	if ( size < 2 ||
  ------------------
  |  Branch (2491:7): [True: 0, False: 30]
  ------------------
 2492|     30|	     base[size-2] != YY_END_OF_BUFFER_CHAR ||
  ------------------
  |  |  129|     60|#define YY_END_OF_BUFFER_CHAR 0
  ------------------
  |  Branch (2492:7): [True: 0, False: 30]
  ------------------
 2493|     30|	     base[size-1] != YY_END_OF_BUFFER_CHAR )
  ------------------
  |  |  129|     30|#define YY_END_OF_BUFFER_CHAR 0
  ------------------
  |  Branch (2493:7): [True: 0, False: 30]
  ------------------
 2494|       |		/* They forgot to leave room for the EOB's. */
 2495|      0|		return NULL;
 2496|       |
 2497|     30|	b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state )  );
 2498|     30|	if ( ! b )
  ------------------
  |  Branch (2498:7): [True: 0, False: 30]
  ------------------
 2499|      0|		YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
  ------------------
  |  |  995|      0|#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
  ------------------
 2500|       |
 2501|     30|	b->yy_buf_size = (int) (size - 2);	/* "- 2" to take care of EOB's */
 2502|     30|	b->yy_buf_pos = b->yy_ch_buf = base;
 2503|     30|	b->yy_is_our_buffer = 0;
 2504|     30|	b->yy_input_file = NULL;
 2505|     30|	b->yy_n_chars = b->yy_buf_size;
 2506|     30|	b->yy_is_interactive = 0;
 2507|     30|	b->yy_at_bol = 1;
 2508|     30|	b->yy_fill_buffer = 0;
 2509|     30|	b->yy_buffer_status = YY_BUFFER_NEW;
  ------------------
  |  |  251|     30|#define YY_BUFFER_NEW 0
  ------------------
 2510|       |
 2511|     30|	yy_switch_to_buffer( b  );
 2512|       |
 2513|     30|	return b;
 2514|     30|}
_Z14yy_scan_stringPKc:
 2525|     30|{
 2526|       |    
 2527|     30|	return yy_scan_bytes( yystr, (int) strlen(yystr) );
 2528|     30|}
_Z13yy_scan_bytesPKci:
 2538|     30|{
 2539|     30|	YY_BUFFER_STATE b;
 2540|     30|	char *buf;
 2541|     30|	yy_size_t n;
 2542|     30|	int i;
 2543|       |    
 2544|       |	/* Get memory for full buffer, including space for trailing EOB's. */
 2545|     30|	n = (yy_size_t) (_yybytes_len + 2);
 2546|     30|	buf = (char *) yyalloc( n  );
 2547|     30|	if ( ! buf )
  ------------------
  |  Branch (2547:7): [True: 0, False: 30]
  ------------------
 2548|      0|		YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
  ------------------
  |  |  995|      0|#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
  ------------------
 2549|       |
 2550|   153k|	for ( i = 0; i < _yybytes_len; ++i )
  ------------------
  |  Branch (2550:15): [True: 152k, False: 30]
  ------------------
 2551|   152k|		buf[i] = yybytes[i];
 2552|       |
 2553|     30|	buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
  ------------------
  |  |  129|     30|#define YY_END_OF_BUFFER_CHAR 0
  ------------------
 2554|       |
 2555|     30|	b = yy_scan_buffer( buf, n );
 2556|     30|	if ( ! b )
  ------------------
  |  Branch (2556:7): [True: 0, False: 30]
  ------------------
 2557|      0|		YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
  ------------------
  |  |  995|      0|#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
  ------------------
 2558|       |
 2559|       |	/* It's okay to grow etc. this buffer, and we should throw it
 2560|       |	 * away when we're done.
 2561|       |	 */
 2562|     30|	b->yy_is_our_buffer = 1;
 2563|       |
 2564|     30|	return b;
 2565|     30|}
_Z7yyallocm:
 2753|     61|{
 2754|     61|			return malloc(size);
 2755|     61|}
_Z9yyreallocPvm:
 2758|      1|{
 2759|       |		
 2760|       |	/* The cast to (char *) in the following accommodates both
 2761|       |	 * implementations that use char* generic pointers, and those
 2762|       |	 * that use void* generic pointers.  It works with the latter
 2763|       |	 * because both ANSI C and C++ allow castless assignment from
 2764|       |	 * any pointer type to void*, and deal with argument conversions
 2765|       |	 * as though doing an assignment.
 2766|       |	 */
 2767|      1|	return realloc(ptr, size);
 2768|      1|}
_Z6yyfreePv:
 2771|     60|{
 2772|     60|			free( (char *) ptr );	/* see yyrealloc() for (char *) cast */
 2773|     60|}
hexpr.lex.C:_ZN12_GLOBAL__N_110str2int128ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  726|      2|__int128 str2int128(const std::string& s) {
  727|      2|  __int128 i = 0;
  728|      2|  if (!readInt128(s, &i)) {
  ------------------
  |  Branch (728:7): [True: 0, False: 2]
  ------------------
  729|      0|    throw make_err(s);
  730|      0|  }
  731|      2|  return i;
  732|      2|}
hexpr.lex.C:_ZN12_GLOBAL__N_18str2longERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  710|    360|long str2long(const std::string& s) {
  711|    360|  try {
  712|    360|    return std::stol(s);
  713|    360|  } catch (const std::out_of_range&) {
  714|      0|    throw make_err(s);
  715|      0|  }
  716|    360|}
hexpr.lex.C:_ZN12_GLOBAL__N_19str2shortERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  718|      3|short str2short(const std::string& s) {
  719|      3|  const auto i = str2int(s);
  720|      3|  if (i > std::numeric_limits<short>::max()) {
  ------------------
  |  Branch (720:7): [True: 0, False: 3]
  ------------------
  721|      0|    throw make_err(s);
  722|      0|  }
  723|      3|  return static_cast<short>(i);
  724|      3|}
hexpr.lex.C:_ZN12_GLOBAL__N_17str2intERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  702|    709|int str2int(const std::string& s) {
  703|    709|  try {
  704|    709|    return std::stoi(s);
  705|    709|  } catch (const std::out_of_range&) {
  706|      0|    throw make_err(s);
  707|      0|  }
  708|    709|}
hexpr.lex.C:_ZL18yy_get_next_bufferv:
 1902|     57|{
 1903|     57|    	char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
  ------------------
  |  |  285|     57|#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
  ------------------
 1904|     57|	char *source = (yytext_ptr);
  ------------------
  |  |  361|     57|#define yytext_ptr yytext
  ------------------
 1905|     57|	int number_to_move, i;
 1906|     57|	int ret_val;
 1907|       |
 1908|     57|	if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
  ------------------
  |  |  285|     57|#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
  ------------------
  |  Branch (1908:7): [True: 0, False: 57]
  ------------------
 1909|      0|		YY_FATAL_ERROR(
  ------------------
  |  |  995|      0|#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
  ------------------
 1910|     57|		"fatal flex scanner internal error--end of buffer missed" );
 1911|       |
 1912|     57|	if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
  ------------------
  |  |  285|     57|#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
  ------------------
  |  Branch (1912:7): [True: 57, False: 0]
  ------------------
 1913|     57|		{ /* Don't try to fill the buffer, so this is an EOF. */
 1914|     57|		if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
  ------------------
  |  |  361|     57|#define yytext_ptr yytext
  ------------------
              		if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
  ------------------
  |  |  670|     57|#define YY_MORE_ADJ 0
  ------------------
  |  Branch (1914:8): [True: 30, False: 27]
  ------------------
 1915|     30|			{
 1916|       |			/* We matched a single character, the EOB, so
 1917|       |			 * treat this as a final EOF.
 1918|       |			 */
 1919|     30|			return EOB_ACT_END_OF_FILE;
  ------------------
  |  |  163|     30|#define EOB_ACT_END_OF_FILE 1
  ------------------
 1920|     30|			}
 1921|       |
 1922|     27|		else
 1923|     27|			{
 1924|       |			/* We matched some text prior to the EOB, first
 1925|       |			 * process it.
 1926|       |			 */
 1927|     27|			return EOB_ACT_LAST_MATCH;
  ------------------
  |  |  164|     27|#define EOB_ACT_LAST_MATCH 2
  ------------------
 1928|     27|			}
 1929|     57|		}
 1930|       |
 1931|       |	/* Try to read more data. */
 1932|       |
 1933|       |	/* First move last chars to start of buffer. */
 1934|      0|	number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr) - 1);
  ------------------
  |  |  361|      0|#define yytext_ptr yytext
  ------------------
 1935|       |
 1936|      0|	for ( i = 0; i < number_to_move; ++i )
  ------------------
  |  Branch (1936:15): [True: 0, False: 0]
  ------------------
 1937|      0|		*(dest++) = *(source++);
 1938|       |
 1939|      0|	if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
  ------------------
  |  |  285|      0|#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
  ------------------
              	if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
  ------------------
  |  |  263|      0|#define YY_BUFFER_EOF_PENDING 2
  ------------------
  |  Branch (1939:7): [True: 0, False: 0]
  ------------------
 1940|       |		/* don't do the read, it's not guaranteed to return an EOF,
 1941|       |		 * just force an EOF
 1942|       |		 */
 1943|      0|		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
  ------------------
  |  |  285|      0|#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
  ------------------
 1944|       |
 1945|      0|	else
 1946|      0|		{
 1947|      0|			int num_to_read =
 1948|      0|			YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
  ------------------
  |  |  285|      0|#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
  ------------------
 1949|       |
 1950|      0|		while ( num_to_read <= 0 )
  ------------------
  |  Branch (1950:11): [True: 0, False: 0]
  ------------------
 1951|      0|			{ /* Not enough room in the buffer - grow it. */
 1952|       |
 1953|       |			/* just a shorter name for the current buffer */
 1954|      0|			YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE;
  ------------------
  |  |  285|      0|#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
  ------------------
 1955|       |
 1956|      0|			int yy_c_buf_p_offset =
 1957|      0|				(int) ((yy_c_buf_p) - b->yy_ch_buf);
 1958|       |
 1959|      0|			if ( b->yy_is_our_buffer )
  ------------------
  |  Branch (1959:9): [True: 0, False: 0]
  ------------------
 1960|      0|				{
 1961|      0|				int new_size = b->yy_buf_size * 2;
 1962|       |
 1963|      0|				if ( new_size <= 0 )
  ------------------
  |  Branch (1963:10): [True: 0, False: 0]
  ------------------
 1964|      0|					b->yy_buf_size += b->yy_buf_size / 8;
 1965|      0|				else
 1966|      0|					b->yy_buf_size *= 2;
 1967|       |
 1968|      0|				b->yy_ch_buf = (char *)
 1969|       |					/* Include room in for 2 EOB chars. */
 1970|      0|					yyrealloc( (void *) b->yy_ch_buf,
 1971|      0|							 (yy_size_t) (b->yy_buf_size + 2)  );
 1972|      0|				}
 1973|      0|			else
 1974|       |				/* Can't grow it, we don't own it. */
 1975|      0|				b->yy_ch_buf = NULL;
 1976|       |
 1977|      0|			if ( ! b->yy_ch_buf )
  ------------------
  |  Branch (1977:9): [True: 0, False: 0]
  ------------------
 1978|      0|				YY_FATAL_ERROR(
  ------------------
  |  |  995|      0|#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
  ------------------
 1979|      0|				"fatal error - scanner input buffer overflow" );
 1980|       |
 1981|      0|			(yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset];
 1982|       |
 1983|      0|			num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
  ------------------
  |  |  285|      0|#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
  ------------------
 1984|      0|						number_to_move - 1;
 1985|       |
 1986|      0|			}
 1987|       |
 1988|      0|		if ( num_to_read > YY_READ_BUF_SIZE )
  ------------------
  |  |  932|      0|#define YY_READ_BUF_SIZE 8192
  ------------------
  |  Branch (1988:8): [True: 0, False: 0]
  ------------------
 1989|      0|			num_to_read = YY_READ_BUF_SIZE;
  ------------------
  |  |  932|      0|#define YY_READ_BUF_SIZE 8192
  ------------------
 1990|       |
 1991|       |		/* Read in more data. */
 1992|      0|		YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
  ------------------
  |  |  949|      0|	if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
  |  |  ------------------
  |  |  |  |  285|      0|#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
  |  |  ------------------
  |  |  |  Branch (949:7): [True: 0, False: 0]
  |  |  ------------------
  |  |  950|      0|		{ \
  |  |  951|      0|		int c = '*'; \
  |  |  952|      0|		int n; \
  |  |  953|      0|		for ( n = 0; n < max_size && \
  |  |  ------------------
  |  |  |  Branch (953:16): [True: 0, False: 0]
  |  |  ------------------
  |  |  954|      0|			     (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
  |  |  ------------------
  |  |  |  Branch (954:9): [True: 0, False: 0]
  |  |  |  Branch (954:38): [True: 0, False: 0]
  |  |  ------------------
  |  |  955|      0|			buf[n] = (char) c; \
  |  |  956|      0|		if ( c == '\n' ) \
  |  |  ------------------
  |  |  |  Branch (956:8): [True: 0, False: 0]
  |  |  ------------------
  |  |  957|      0|			buf[n++] = (char) c; \
  |  |  958|      0|		if ( c == EOF && ferror( yyin ) ) \
  |  |  ------------------
  |  |  |  Branch (958:8): [True: 0, False: 0]
  |  |  |  Branch (958:20): [True: 0, False: 0]
  |  |  ------------------
  |  |  959|      0|			YY_FATAL_ERROR( "input in flex scanner failed" ); \
  |  |  ------------------
  |  |  |  |  995|      0|#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
  |  |  ------------------
  |  |  960|      0|		result = n; \
  |  |  961|      0|		} \
  |  |  962|      0|	else \
  |  |  963|      0|		{ \
  |  |  964|      0|		errno=0; \
  |  |  965|      0|		while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \
  |  |  ------------------
  |  |  |  Branch (965:11): [True: 0, False: 0]
  |  |  |  Branch (965:78): [True: 0, False: 0]
  |  |  ------------------
  |  |  966|      0|			{ \
  |  |  967|      0|			if( errno != EINTR) \
  |  |  ------------------
  |  |  |  Branch (967:8): [True: 0, False: 0]
  |  |  ------------------
  |  |  968|      0|				{ \
  |  |  969|      0|				YY_FATAL_ERROR( "input in flex scanner failed" ); \
  |  |  ------------------
  |  |  |  |  995|      0|#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
  |  |  ------------------
  |  |  970|      0|				break; \
  |  |  971|      0|				} \
  |  |  972|      0|			errno=0; \
  |  |  973|      0|			clearerr(yyin); \
  |  |  974|      0|			} \
  |  |  975|      0|		}\
  ------------------
 1993|      0|			(yy_n_chars), num_to_read );
 1994|       |
 1995|      0|		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
  ------------------
  |  |  285|      0|#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
  ------------------
 1996|      0|		}
 1997|       |
 1998|      0|	if ( (yy_n_chars) == 0 )
  ------------------
  |  Branch (1998:7): [True: 0, False: 0]
  ------------------
 1999|      0|		{
 2000|      0|		if ( number_to_move == YY_MORE_ADJ )
  ------------------
  |  |  670|      0|#define YY_MORE_ADJ 0
  ------------------
  |  Branch (2000:8): [True: 0, False: 0]
  ------------------
 2001|      0|			{
 2002|      0|			ret_val = EOB_ACT_END_OF_FILE;
  ------------------
  |  |  163|      0|#define EOB_ACT_END_OF_FILE 1
  ------------------
 2003|      0|			yyrestart( yyin  );
 2004|      0|			}
 2005|       |
 2006|      0|		else
 2007|      0|			{
 2008|      0|			ret_val = EOB_ACT_LAST_MATCH;
  ------------------
  |  |  164|      0|#define EOB_ACT_LAST_MATCH 2
  ------------------
 2009|      0|			YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
  ------------------
  |  |  285|      0|#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
  ------------------
 2010|      0|				YY_BUFFER_EOF_PENDING;
  ------------------
  |  |  263|      0|#define YY_BUFFER_EOF_PENDING 2
  ------------------
 2011|      0|			}
 2012|      0|		}
 2013|       |
 2014|      0|	else
 2015|      0|		ret_val = EOB_ACT_CONTINUE_SCAN;
  ------------------
  |  |  162|      0|#define EOB_ACT_CONTINUE_SCAN 0
  ------------------
 2016|       |
 2017|      0|	if (((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
  ------------------
  |  |  285|      0|#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
  ------------------
  |  Branch (2017:6): [True: 0, False: 0]
  ------------------
 2018|       |		/* Extend the array by 50%, plus the number we really need. */
 2019|      0|		int new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
 2020|      0|		YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc(
  ------------------
  |  |  285|      0|#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
  ------------------
 2021|      0|			(void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size  );
  ------------------
  |  |  285|      0|#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
  ------------------
 2022|      0|		if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
  ------------------
  |  |  285|      0|#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
  ------------------
  |  Branch (2022:8): [True: 0, False: 0]
  ------------------
 2023|      0|			YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
  ------------------
  |  |  995|      0|#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
  ------------------
 2024|       |		/* "- 2" to take care of EOB's */
 2025|      0|		YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2);
  ------------------
  |  |  285|      0|#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
  ------------------
 2026|      0|	}
 2027|       |
 2028|      0|	(yy_n_chars) += number_to_move;
 2029|      0|	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
  ------------------
  |  |  285|      0|#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
  ------------------
              	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
  ------------------
  |  |  129|      0|#define YY_END_OF_BUFFER_CHAR 0
  ------------------
 2030|      0|	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
  ------------------
  |  |  285|      0|#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
  ------------------
              	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
  ------------------
  |  |  129|      0|#define YY_END_OF_BUFFER_CHAR 0
  ------------------
 2031|       |
 2032|      0|	(yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
  ------------------
  |  |  361|      0|#define yytext_ptr yytext
  ------------------
              	(yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
  ------------------
  |  |  285|      0|#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
  ------------------
 2033|       |
 2034|      0|	return ret_val;
 2035|      0|}
hexpr.lex.C:_ZL21yy_get_previous_statev:
 2040|     27|{
 2041|     27|	yy_state_type yy_current_state;
 2042|     27|	char *yy_cp;
 2043|       |    
 2044|     27|	yy_current_state = (yy_start);
 2045|       |
 2046|     54|	for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
  ------------------
  |  |  361|     27|#define yytext_ptr yytext
  ------------------
              	for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
  ------------------
  |  |  670|     27|#define YY_MORE_ADJ 0
  ------------------
  |  Branch (2046:44): [True: 27, False: 27]
  ------------------
 2047|     27|		{
 2048|     27|		YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
  ------------------
  |  |  112|     27|#define YY_SC_TO_UI(c) ((YY_CHAR) (c))
  ------------------
  |  Branch (2048:19): [True: 27, False: 0]
  ------------------
 2049|     27|		if ( yy_accept[yy_current_state] )
  ------------------
  |  Branch (2049:8): [True: 0, False: 27]
  ------------------
 2050|      0|			{
 2051|      0|			(yy_last_accepting_state) = yy_current_state;
 2052|      0|			(yy_last_accepting_cpos) = yy_cp;
 2053|      0|			}
 2054|     27|		while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
  ------------------
  |  Branch (2054:11): [True: 0, False: 27]
  ------------------
 2055|      0|			{
 2056|      0|			yy_current_state = (int) yy_def[yy_current_state];
 2057|      0|			if ( yy_current_state >= 282 )
  ------------------
  |  Branch (2057:9): [True: 0, False: 0]
  ------------------
 2058|      0|				yy_c = yy_meta[yy_c];
 2059|      0|			}
 2060|     27|		yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
 2061|     27|		}
 2062|       |
 2063|     27|	return yy_current_state;
 2064|     27|}
hexpr.lex.C:_ZL20yy_load_buffer_statev:
 2272|     31|{
 2273|     31|    	(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
  ------------------
  |  |  285|     31|#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
  ------------------
 2274|     31|	(yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
  ------------------
  |  |  361|     31|#define yytext_ptr yytext
  ------------------
              	(yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
  ------------------
  |  |  285|     31|#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
  ------------------
 2275|     31|	yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
  ------------------
  |  |  285|     31|#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
  ------------------
 2276|     31|	(yy_hold_char) = *(yy_c_buf_p);
 2277|     31|}
hexpr.lex.C:_ZL21yyensure_buffer_stackv:
 2439|     60|{
 2440|     60|	yy_size_t num_to_alloc;
 2441|       |    
 2442|     60|	if (!(yy_buffer_stack)) {
  ------------------
  |  Branch (2442:6): [True: 1, False: 59]
  ------------------
 2443|       |
 2444|       |		/* First allocation is just for 2 elements, since we don't know if this
 2445|       |		 * scanner will even need a stack. We use 2 instead of 1 to avoid an
 2446|       |		 * immediate realloc on the next call.
 2447|       |         */
 2448|      1|      num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */
 2449|      1|		(yy_buffer_stack) = (struct yy_buffer_state**)yyalloc
 2450|      1|								(num_to_alloc * sizeof(struct yy_buffer_state*)
 2451|      1|								);
 2452|      1|		if ( ! (yy_buffer_stack) )
  ------------------
  |  Branch (2452:8): [True: 0, False: 1]
  ------------------
 2453|      0|			YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
  ------------------
  |  |  995|      0|#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
  ------------------
 2454|       |
 2455|      1|		memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
 2456|       |
 2457|      1|		(yy_buffer_stack_max) = num_to_alloc;
 2458|      1|		(yy_buffer_stack_top) = 0;
 2459|      1|		return;
 2460|      1|	}
 2461|       |
 2462|     59|	if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
  ------------------
  |  Branch (2462:6): [True: 1, False: 58]
  ------------------
 2463|       |
 2464|       |		/* Increase the buffer to prepare for a possible push. */
 2465|      1|		yy_size_t grow_size = 8 /* arbitrary grow size */;
 2466|       |
 2467|      1|		num_to_alloc = (yy_buffer_stack_max) + grow_size;
 2468|      1|		(yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc
 2469|      1|								((yy_buffer_stack),
 2470|      1|								num_to_alloc * sizeof(struct yy_buffer_state*)
 2471|      1|								);
 2472|      1|		if ( ! (yy_buffer_stack) )
  ------------------
  |  Branch (2472:8): [True: 0, False: 1]
  ------------------
 2473|      0|			YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
  ------------------
  |  |  995|      0|#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
  ------------------
 2474|       |
 2475|       |		/* zero only the new slots.*/
 2476|      1|		memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
 2477|      1|		(yy_buffer_stack_max) = num_to_alloc;
 2478|      1|	}
 2479|     59|}

_Z1mRK7YYLTYPE:
  135|  9.41k|LexicalAnnotation m(const YYLTYPE& p) {
  136|  9.41k|  return LexicallyAnnotated::make(Pos(p.first_line, p.first_column), Pos(p.last_line, p.last_column));
  137|  9.41k|}
_Z1mRK7YYLTYPES1_:
  139|  7.98k|LexicalAnnotation m(const YYLTYPE& p0, const YYLTYPE& p1) {
  140|  7.98k|  return LexicallyAnnotated::make(Pos(p0.first_line, p0.first_column), Pos(p1.last_line, p1.last_column));
  141|  7.98k|}
_Z13pickNestedExpPSt6vectorISt10shared_ptrIN6hobbes4ExprEESaIS3_EERKNS1_17LexicalAnnotationE:
  148|    714|Expr* pickNestedExp(Exprs* exprs, const LexicalAnnotation& la) {
  149|    714|  if (exprs->empty()) {
  ------------------
  |  Branch (149:7): [True: 99, False: 615]
  ------------------
  150|     99|    return new Unit(la);
  151|    615|  } else if (exprs->size() == 1) {
  ------------------
  |  Branch (151:14): [True: 567, False: 48]
  ------------------
  152|    567|    return (*exprs)[0]->clone();
  153|    567|  } else {
  154|     48|    MkRecord::FieldDefs fds;
  155|    156|    for (size_t i = 0; i < exprs->size(); ++i) {
  ------------------
  |  Branch (155:24): [True: 108, False: 48]
  ------------------
  156|    108|      fds.push_back(MkRecord::FieldDef(".f" + str::from(i), (*exprs)[i]));
  157|    108|    }
  158|     48|    return new MkRecord(fds, la);
  159|     48|  }
  160|    714|}
_Z13pickNestedPatPSt6vectorISt10shared_ptrIN6hobbes7PatternEESaIS3_EERKNS1_17LexicalAnnotationE:
  162|     50|Pattern* pickNestedPat(Patterns* pats, const LexicalAnnotation& la) {
  163|     50|  if (pats->empty()) {
  ------------------
  |  Branch (163:7): [True: 6, False: 44]
  ------------------
  164|      6|    return new MatchLiteral(PrimitivePtr(new Unit(la)), la);
  165|     44|  } else {
  166|     44|    MatchRecord::Fields fds;
  167|    135|    for (size_t i = 0; i < pats->size(); ++i) {
  ------------------
  |  Branch (167:24): [True: 91, False: 44]
  ------------------
  168|     91|      fds.push_back(MatchRecord::Field(".f" + str::from(i), (*pats)[i]));
  169|     91|    }
  170|     44|    return new MatchRecord(fds, la);
  171|     44|  }
  172|     50|}
_Z16normPatternRulesSt6vectorIN6hobbes10PatternRowESaIS1_EERKNS0_17LexicalAnnotationE:
  174|     56|PatternRows normPatternRules(PatternRows rs, const LexicalAnnotation& la) {
  175|     56|  if (!rs.empty() && !rs.back().result) {
  ------------------
  |  Branch (175:7): [True: 56, False: 0]
  |  Branch (175:22): [True: 0, False: 56]
  ------------------
  176|      0|    throw annotated_error(la, "match table can't end with fall-through row");
  177|      0|  }
  178|       |
  179|    197|  for (size_t i = rs.size(); i > 0; --i) {
  ------------------
  |  Branch (179:30): [True: 141, False: 56]
  ------------------
  180|    141|    if (!rs[i-1].result) {
  ------------------
  |  Branch (180:9): [True: 0, False: 141]
  ------------------
  181|      0|      rs[i-1].result = rs[i].result;
  182|      0|    }
  183|    141|  }
  184|     56|  return rs;
  185|     56|}
_Z21compileNestedLetMatchRKSt6vectorISt4pairISt10shared_ptrIN6hobbes7PatternEES1_INS2_4ExprEEESaIS7_EERKS6_RKNS2_17LexicalAnnotationE:
  187|    254|Expr* compileNestedLetMatch(const LetBindings& bs, const ExprPtr& e, const LexicalAnnotation& la) {
  188|    254|  ExprPtr r = e;
  189|    739|  for (auto b = bs.rbegin(); b != bs.rend(); ++b) {
  ------------------
  |  Branch (189:30): [True: 485, False: 254]
  ------------------
  190|    485|    r = compileMatch(yyParseCC, list(b->second), list(PatternRow(list(b->first), r)), la);
  191|    485|  }
  192|    254|  return r->clone();
  193|    254|}
_Z24makeIrrefutablePatternFnRKSt6vectorISt10shared_ptrIN6hobbes7PatternEESaIS3_EERKS0_INS1_4ExprEERKNS1_17LexicalAnnotationE:
  215|    109|Expr* makeIrrefutablePatternFn(const Patterns& ps, const ExprPtr& e, const LexicalAnnotation& la) {
  216|    109|  str::seq vns;
  217|    109|  Exprs    vnes;
  218|    261|  for (size_t i = 0; i < ps.size(); ++i) {
  ------------------
  |  Branch (218:22): [True: 152, False: 109]
  ------------------
  219|    152|    std::string vname = ".arg" + str::from(i);
  220|    152|    vns.push_back(vname);
  221|    152|    vnes.push_back(isUnitPat(ps[i]) ? assume(var(vname, la), primty("unit"), la) : var(vname, la));
  ------------------
  |  Branch (221:20): [True: 6, False: 146]
  ------------------
  222|    152|  }
  223|    109|  return new Fn(vns, compileMatch(yyParseCC, vnes, list(PatternRow(ps, e)), la), la);
  224|    109|}
_Z13makePatternFnRKSt6vectorISt10shared_ptrIN6hobbes7PatternEESaIS3_EERKS0_INS1_4ExprEERKNS1_17LexicalAnnotationE:
  226|    109|Expr* makePatternFn(const Patterns& ps, const ExprPtr& e, const LexicalAnnotation& la) {
  227|    152|  for (const auto& p : ps) {
  ------------------
  |  Branch (227:22): [True: 152, False: 109]
  ------------------
  228|    152|    if (refutable(p)) {
  ------------------
  |  Branch (228:9): [True: 0, False: 152]
  ------------------
  229|      0|      return makeRefutablePatternFn(ps, e, la);
  230|      0|    }
  231|    152|  }
  232|    109|  return makeIrrefutablePatternFn(ps, e, la);
  233|    109|}
_Z11makeProjSeqPN6hobbes4ExprERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS8_EERKNS_17LexicalAnnotationE:
  235|    261|Expr* makeProjSeq(Expr* rec, const str::seq& fields, const LexicalAnnotation& la) {
  236|    269|  for (const auto& f : fields) {
  ------------------
  |  Branch (236:22): [True: 269, False: 261]
  ------------------
  237|    269|    rec = new Proj(ExprPtr(rec), f, la);
  238|    269|  }
  239|    261|  return rec;
  240|    261|}
_Z8mkAIndexRKSt10shared_ptrIN6hobbes4ExprEES4_RKNS0_17LexicalAnnotationE:
  254|    193|Expr* mkAIndex(const ExprPtr& arr, const ExprPtr& idx, const LexicalAnnotation& la) {
  255|    193|  return new AIndex(arr, fncall(var("arrayIndexFrom", la), list(idx), la), la);
  256|    193|}
_Z14monoTypeByNameRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  269|  5.37k|MonoTypePtr monoTypeByName(const std::string& tn) {
  270|  5.37k|  if (isPrimName(tn) || yyParseCC->isTypeAliasName(tn)) {
  ------------------
  |  Branch (270:7): [True: 919, False: 4.46k]
  |  Branch (270:25): [True: 0, False: 4.46k]
  ------------------
  271|    919|    return yyParseCC->replaceTypeAliases(Prim::make(tn));
  272|  4.46k|  } else if (yyParseCC->isTypeName(tn)) {
  ------------------
  |  Branch (272:14): [True: 82, False: 4.37k]
  ------------------
  273|     82|    return Prim::make(tn, yyParseCC->namedTypeRepresentation(tn));
  274|  4.37k|  } else {
  275|  4.37k|    return TVar::make(tn);
  276|  4.37k|  }
  277|  5.37k|}
_Z9accumTAppRKSt6vectorISt10shared_ptrIN6hobbes8MonoTypeEESaIS3_EE:
  279|  1.13k|MonoTypePtr accumTApp(const MonoTypes& ts) {
  280|  1.13k|  if (ts.empty()) {
  ------------------
  |  Branch (280:7): [True: 0, False: 1.13k]
  ------------------
  281|      0|    throw std::runtime_error("Internal parser error for type applications");
  282|  1.13k|  } else if (ts.size() == 1) {
  ------------------
  |  Branch (282:14): [True: 1.02k, False: 114]
  ------------------
  283|  1.02k|    return ts[0];
  284|  1.02k|  } else {
  285|    114|    return MonoTypePtr(TApp::make(ts[0], drop(ts, 1)));
  286|    114|  }
  287|  1.13k|}
_Z13makeTupleTypeRKSt6vectorISt10shared_ptrIN6hobbes8MonoTypeEESaIS3_EE:
  301|  3.83k|MonoTypePtr makeTupleType(const MonoTypes& mts) {
  302|  3.83k|  if (mts.size() == 1) {
  ------------------
  |  Branch (302:7): [True: 3.61k, False: 227]
  ------------------
  303|  3.61k|    return clone(mts[0]);
  304|  3.61k|  } else {
  305|    227|    Record::Members tms;
  306|    689|    for (unsigned int i = 0; i < mts.size(); ++i) {
  ------------------
  |  Branch (306:30): [True: 462, False: 227]
  ------------------
  307|    462|      tms.push_back(Record::Member(".f" + str::from(i), mts[i]));
  308|    462|    }
  309|    227|    return Record::make(tms);
  310|    227|  }
  311|  3.83k|}
_Z11makeSumTypeRKSt6vectorISt10shared_ptrIN6hobbes8MonoTypeEESaIS3_EE:
  313|    234|MonoTypePtr makeSumType(const MonoTypes& mts) {
  314|    234|  Variant::Members ms;
  315|    702|  for (unsigned int i = 0; i < mts.size(); ++i) {
  ------------------
  |  Branch (315:28): [True: 468, False: 234]
  ------------------
  316|    468|    ms.push_back(Variant::Member(".f" + str::from(i), mts[i], i));
  317|    468|  }
  318|    234|  return Variant::make(ms);
  319|    234|}
_Z11makeRecTypeRKSt6vectorIN6hobbes6Record6MemberESaIS2_EE:
  321|     19|MonoTypePtr makeRecType(const Record::Members& tms) {
  322|     19|  return Record::make(tms);
  323|     19|}
_Z11makeVarTypeRKSt6vectorIN6hobbes7Variant6MemberESaIS2_EE:
  358|      2|MonoTypePtr makeVarType(const Variant::Members& vms) {
  359|      2|  Variant::Members tvms = vms;
  360|      6|  for (unsigned int i = 0; i < tvms.size(); ++i) {
  ------------------
  |  Branch (360:28): [True: 4, False: 2]
  ------------------
  361|      4|    tvms[i].id = i;
  362|      4|  }
  363|      2|  return Variant::make(tvms);
  364|      2|}
_Z16tupSectionFieldsRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  366|      2|str::seq tupSectionFields(const std::string& x) {
  367|      2|  str::seq r = str::csplit(x.substr(1), ".");
  368|      4|  for (std::string& f : r) {
  ------------------
  |  Branch (368:23): [True: 4, False: 2]
  ------------------
  369|      4|    f = ".f" + f;
  370|      4|  }
  371|      2|  return r;
  372|      2|}
_Z7yyparsev:
 2851|     30|{
 2852|     30|    yy_state_fast_t yystate = 0;
 2853|       |    /* Number of tokens to shift before error messages enabled.  */
 2854|     30|    int yyerrstatus = 0;
 2855|       |
 2856|       |    /* Refer to the stacks through separate pointers, to allow yyoverflow
 2857|       |       to reallocate them elsewhere.  */
 2858|       |
 2859|       |    /* Their size.  */
 2860|     30|    YYPTRDIFF_T yystacksize = YYINITDEPTH;
  ------------------
  |  |  676|     30|#  define YYPTRDIFF_T __PTRDIFF_TYPE__
  ------------------
                  YYPTRDIFF_T yystacksize = YYINITDEPTH;
  ------------------
  |  | 2355|     30|# define YYINITDEPTH 200
  ------------------
 2861|       |
 2862|       |    /* The state stack: array, bottom, top.  */
 2863|     30|    yy_state_t yyssa[YYINITDEPTH];
 2864|     30|    yy_state_t *yyss = yyssa;
 2865|     30|    yy_state_t *yyssp = yyss;
 2866|       |
 2867|       |    /* The semantic value stack: array, bottom, top.  */
 2868|     30|    YYSTYPE yyvsa[YYINITDEPTH];
 2869|     30|    YYSTYPE *yyvs = yyvsa;
 2870|     30|    YYSTYPE *yyvsp = yyvs;
 2871|       |
 2872|       |    /* The location stack: array, bottom, top.  */
 2873|     30|    YYLTYPE yylsa[YYINITDEPTH];
 2874|     30|    YYLTYPE *yyls = yylsa;
 2875|     30|    YYLTYPE *yylsp = yyls;
 2876|       |
 2877|     30|  int yyn;
 2878|       |  /* The return value of yyparse.  */
 2879|     30|  int yyresult;
 2880|       |  /* Lookahead symbol kind.  */
 2881|     30|  yysymbol_kind_t yytoken = YYSYMBOL_YYEMPTY;
 2882|       |  /* The variables used to return semantic value and location from the
 2883|       |     action routines.  */
 2884|     30|  YYSTYPE yyval;
 2885|     30|  YYLTYPE yyloc;
 2886|       |
 2887|       |  /* The locations where the error started and ended.  */
 2888|     30|  YYLTYPE yyerror_range[3];
 2889|       |
 2890|       |  /* Buffer for error messages, and its allocated size.  */
 2891|     30|  char yymsgbuf[128];
 2892|     30|  char *yymsg = yymsgbuf;
 2893|     30|  YYPTRDIFF_T yymsg_alloc = sizeof yymsgbuf;
  ------------------
  |  |  676|     30|#  define YYPTRDIFF_T __PTRDIFF_TYPE__
  ------------------
 2894|       |
 2895|     30|#define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N), yylsp -= (N))
 2896|       |
 2897|       |  /* The number of symbols on the RHS of the reduced rule.
 2898|       |     Keep to zero when no symbol should be popped.  */
 2899|     30|  int yylen = 0;
 2900|       |
 2901|     30|  YYDPRINTF ((stderr, "Starting parse\n"));
  ------------------
  |  | 2346|     30|# define YYDPRINTF(Args) ((void) 0)
  ------------------
 2902|       |
 2903|     30|  yychar = YYEMPTY; /* Cause a token to be read.  */
 2904|       |
 2905|     30|  yylsp[0] = yylloc;
 2906|     30|  goto yysetstate;
 2907|       |
 2908|       |
 2909|       |/*------------------------------------------------------------.
 2910|       || yynewstate -- push a new state, which is found in yystate.  |
 2911|       |`------------------------------------------------------------*/
 2912|   179k|yynewstate:
 2913|       |  /* In all cases, when you get here, the value and location stacks
 2914|       |     have just been pushed.  So pushing a state here evens the stacks.  */
 2915|   179k|  yyssp++;
 2916|       |
 2917|       |
 2918|       |/*--------------------------------------------------------------------.
 2919|       || yysetstate -- set current state (the top of the stack) to yystate.  |
 2920|       |`--------------------------------------------------------------------*/
 2921|   179k|yysetstate:
 2922|   179k|  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
  ------------------
  |  | 2346|   179k|# define YYDPRINTF(Args) ((void) 0)
  ------------------
 2923|   179k|  YY_ASSERT (0 <= yystate && yystate < YYNSTATES);
  ------------------
  |  |  792|   179k|#define YY_ASSERT(E) ((void) (0 && (E)))
  |  |  ------------------
  |  |  |  Branch (792:31): [Folded, False: 179k]
  |  |  |  Branch (792:37): [True: 0, False: 0]
  |  |  |  Branch (792:37): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2924|   179k|  YY_IGNORE_USELESS_CAST_BEGIN
 2925|   179k|  *yyssp = YY_CAST (yy_state_t, yystate);
  ------------------
  |  |  387|   179k|#   define YY_CAST(Type, Val) static_cast<Type> (Val)
  ------------------
 2926|   179k|  YY_IGNORE_USELESS_CAST_END
 2927|   179k|  YY_STACK_PRINT (yyss, yyssp);
 2928|       |
 2929|   179k|  if (yyss + yystacksize - 1 <= yyssp)
  ------------------
  |  Branch (2929:7): [True: 0, False: 179k]
  ------------------
 2930|      0|#if !defined yyoverflow && !defined YYSTACK_RELOCATE
 2931|      0|    YYNOMEM;
  ------------------
  |  | 2112|      0|#define YYNOMEM         goto yyexhaustedlab
  ------------------
 2932|       |#else
 2933|       |    {
 2934|       |      /* Get the current used size of the three stacks, in elements.  */
 2935|       |      YYPTRDIFF_T yysize = yyssp - yyss + 1;
 2936|       |
 2937|       |# if defined yyoverflow
 2938|       |      {
 2939|       |        /* Give user a chance to reallocate the stack.  Use copies of
 2940|       |           these so that the &'s don't force the real ones into
 2941|       |           memory.  */
 2942|       |        yy_state_t *yyss1 = yyss;
 2943|       |        YYSTYPE *yyvs1 = yyvs;
 2944|       |        YYLTYPE *yyls1 = yyls;
 2945|       |
 2946|       |        /* Each stack pointer address is followed by the size of the
 2947|       |           data in use in that stack, in bytes.  This used to be a
 2948|       |           conditional around just the two extra args, but that might
 2949|       |           be undefined if yyoverflow is a macro.  */
 2950|       |        yyoverflow (YY_("memory exhausted"),
 2951|       |                    &yyss1, yysize * YYSIZEOF (*yyssp),
 2952|       |                    &yyvs1, yysize * YYSIZEOF (*yyvsp),
 2953|       |                    &yyls1, yysize * YYSIZEOF (*yylsp),
 2954|       |                    &yystacksize);
 2955|       |        yyss = yyss1;
 2956|       |        yyvs = yyvs1;
 2957|       |        yyls = yyls1;
 2958|       |      }
 2959|       |# else /* defined YYSTACK_RELOCATE */
 2960|       |      /* Extend the stack our own way.  */
 2961|       |      if (YYMAXDEPTH <= yystacksize)
 2962|       |        YYNOMEM;
 2963|       |      yystacksize *= 2;
 2964|       |      if (YYMAXDEPTH < yystacksize)
 2965|       |        yystacksize = YYMAXDEPTH;
 2966|       |
 2967|       |      {
 2968|       |        yy_state_t *yyss1 = yyss;
 2969|       |        union yyalloc *yyptr =
 2970|       |          YY_CAST (union yyalloc *,
 2971|       |                   YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize))));
 2972|       |        if (! yyptr)
 2973|       |          YYNOMEM;
 2974|       |        YYSTACK_RELOCATE (yyss_alloc, yyss);
 2975|       |        YYSTACK_RELOCATE (yyvs_alloc, yyvs);
 2976|       |        YYSTACK_RELOCATE (yyls_alloc, yyls);
 2977|       |#  undef YYSTACK_RELOCATE
 2978|       |        if (yyss1 != yyssa)
 2979|       |          YYSTACK_FREE (yyss1);
 2980|       |      }
 2981|       |# endif
 2982|       |
 2983|       |      yyssp = yyss + yysize - 1;
 2984|       |      yyvsp = yyvs + yysize - 1;
 2985|       |      yylsp = yyls + yysize - 1;
 2986|       |
 2987|       |      YY_IGNORE_USELESS_CAST_BEGIN
 2988|       |      YYDPRINTF ((stderr, "Stack size increased to %ld\n",
 2989|       |                  YY_CAST (long, yystacksize)));
 2990|       |      YY_IGNORE_USELESS_CAST_END
 2991|       |
 2992|       |      if (yyss + yystacksize - 1 <= yyssp)
 2993|       |        YYABORT;
 2994|       |    }
 2995|       |#endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */
 2996|       |
 2997|       |
 2998|   179k|  if (yystate == YYFINAL)
  ------------------
  |  |  925|   179k|#define YYFINAL  74
  ------------------
  |  Branch (2998:7): [True: 30, False: 179k]
  ------------------
 2999|     30|    YYACCEPT;
  ------------------
  |  | 2109|     30|#define YYACCEPT        goto yyacceptlab
  ------------------
 3000|       |
 3001|   179k|  goto yybackup;
 3002|       |
 3003|       |
 3004|       |/*-----------.
 3005|       || yybackup.  |
 3006|       |`-----------*/
 3007|   179k|yybackup:
 3008|       |  /* Do appropriate processing given the current state.  Read a
 3009|       |     lookahead token if we need one and don't already have one.  */
 3010|       |
 3011|       |  /* First try to decide what to do without reference to lookahead token.  */
 3012|   179k|  yyn = yypact[yystate];
 3013|   179k|  if (yypact_value_is_default (yyn))
  ------------------
  |  | 1093|   179k|  ((Yyn) == YYPACT_NINF)
  |  |  ------------------
  |  |  |  | 1090|   179k|#define YYPACT_NINF (-617)
  |  |  ------------------
  |  |  |  Branch (1093:3): [True: 68.9k, False: 110k]
  |  |  ------------------
  ------------------
 3014|  68.9k|    goto yydefault;
 3015|       |
 3016|       |  /* Not known => get a lookahead token if don't already have one.  */
 3017|       |
 3018|       |  /* YYCHAR is either empty, or end-of-input, or a valid lookahead.  */
 3019|   110k|  if (yychar == YYEMPTY)
  ------------------
  |  Branch (3019:7): [True: 46.7k, False: 63.5k]
  ------------------
 3020|  46.7k|    {
 3021|  46.7k|      YYDPRINTF ((stderr, "Reading a token\n"));
  ------------------
  |  | 2346|  46.7k|# define YYDPRINTF(Args) ((void) 0)
  ------------------
 3022|  46.7k|      yychar = yylex ();
 3023|  46.7k|    }
 3024|       |
 3025|   110k|  if (yychar <= YYEOF)
  ------------------
  |  Branch (3025:7): [True: 257, False: 110k]
  ------------------
 3026|    257|    {
 3027|    257|      yychar = YYEOF;
 3028|    257|      yytoken = YYSYMBOL_YYEOF;
 3029|    257|      YYDPRINTF ((stderr, "Now at end of input.\n"));
  ------------------
  |  | 2346|    257|# define YYDPRINTF(Args) ((void) 0)
  ------------------
 3030|    257|    }
 3031|   110k|  else if (yychar == YYerror)
  ------------------
  |  Branch (3031:12): [True: 0, False: 110k]
  ------------------
 3032|      0|    {
 3033|       |      /* The scanner already issued an error message, process directly
 3034|       |         to error recovery.  But do not keep the error token as
 3035|       |         lookahead, it is too special and may lead us to an endless
 3036|       |         loop in error recovery. */
 3037|      0|      yychar = YYUNDEF;
 3038|      0|      yytoken = YYSYMBOL_YYerror;
 3039|      0|      yyerror_range[1] = yylloc;
 3040|      0|      goto yyerrlab1;
 3041|      0|    }
 3042|   110k|  else
 3043|   110k|    {
 3044|   110k|      yytoken = YYTRANSLATE (yychar);
  ------------------
  |  |  945|   110k|  (0 <= (YYX) && (YYX) <= YYMAXUTOK                     \
  |  |  ------------------
  |  |  |  |  939|   110k|#define YYMAXUTOK   352
  |  |  ------------------
  |  |  |  Branch (945:4): [True: 110k, False: 0]
  |  |  |  Branch (945:18): [True: 110k, False: 0]
  |  |  ------------------
  |  |  946|   110k|   ? YY_CAST (yysymbol_kind_t, yytranslate[YYX])        \
  |  |  ------------------
  |  |  |  |  387|   110k|#   define YY_CAST(Type, Val) static_cast<Type> (Val)
  |  |  ------------------
  |  |  947|   110k|   : YYSYMBOL_YYUNDEF)
  ------------------
 3045|   110k|      YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
 3046|   110k|    }
 3047|       |
 3048|       |  /* If the proper action on seeing token YYTOKEN is to reduce or to
 3049|       |     detect an error, take that action.  */
 3050|   110k|  yyn += yytoken;
 3051|   110k|  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
  ------------------
  |  |  927|   110k|#define YYLAST   3006
  ------------------
  |  Branch (3051:7): [True: 0, False: 110k]
  |  Branch (3051:18): [True: 0, False: 110k]
  |  Branch (3051:34): [True: 63.0k, False: 47.2k]
  ------------------
 3052|  63.0k|    goto yydefault;
 3053|  47.2k|  yyn = yytable[yyn];
 3054|  47.2k|  if (yyn <= 0)
  ------------------
  |  Branch (3054:7): [True: 491, False: 46.7k]
  ------------------
 3055|    491|    {
 3056|    491|      if (yytable_value_is_error (yyn))
  ------------------
  |  | 1098|    491|  0
  |  |  ------------------
  |  |  |  Branch (1098:3): [Folded, False: 491]
  |  |  ------------------
  ------------------
 3057|      0|        goto yyerrlab;
 3058|    491|      yyn = -yyn;
 3059|    491|      goto yyreduce;
 3060|    491|    }
 3061|       |
 3062|       |  /* Count tokens shifted since error; after three, turn off error
 3063|       |     status.  */
 3064|  46.7k|  if (yyerrstatus)
  ------------------
  |  Branch (3064:7): [True: 0, False: 46.7k]
  ------------------
 3065|      0|    yyerrstatus--;
 3066|       |
 3067|       |  /* Shift the lookahead token.  */
 3068|  46.7k|  YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
 3069|  46.7k|  yystate = yyn;
 3070|  46.7k|  YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
 3071|  46.7k|  *++yyvsp = yylval;
 3072|  46.7k|  YY_IGNORE_MAYBE_UNINITIALIZED_END
 3073|  46.7k|  *++yylsp = yylloc;
 3074|       |
 3075|       |  /* Discard the shifted token.  */
 3076|  46.7k|  yychar = YYEMPTY;
 3077|  46.7k|  goto yynewstate;
 3078|       |
 3079|       |
 3080|       |/*-----------------------------------------------------------.
 3081|       || yydefault -- do the default action for the current state.  |
 3082|       |`-----------------------------------------------------------*/
 3083|   132k|yydefault:
 3084|   132k|  yyn = yydefact[yystate];
 3085|   132k|  if (yyn == 0)
  ------------------
  |  Branch (3085:7): [True: 0, False: 132k]
  ------------------
 3086|      0|    goto yyerrlab;
 3087|   132k|  goto yyreduce;
 3088|       |
 3089|       |
 3090|       |/*-----------------------------.
 3091|       || yyreduce -- do a reduction.  |
 3092|       |`-----------------------------*/
 3093|   132k|yyreduce:
 3094|       |  /* yyn is the number of a rule to reduce with.  */
 3095|   132k|  yylen = yyr2[yyn];
 3096|       |
 3097|       |  /* If YYLEN is nonzero, implement the default value of the action:
 3098|       |     '$$ = $1'.
 3099|       |
 3100|       |     Otherwise, the following line sets YYVAL to garbage.
 3101|       |     This behavior is undocumented and Bison
 3102|       |     users should not rely upon it.  Assigning to YYVAL
 3103|       |     unconditionally makes the parser a bit smaller, and it avoids a
 3104|       |     GCC warning that YYVAL may be used uninitialized.  */
 3105|   132k|  yyval = yyvsp[1-yylen];
 3106|       |
 3107|       |  /* Default location. */
 3108|   132k|  YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen);
  ------------------
  |  |   84|   132k|  if (N) { \
  |  |  ------------------
  |  |  |  Branch (84:7): [True: 132k, False: 197]
  |  |  ------------------
  |  |   85|   132k|    (L).first_line   = YYRHSLOC(R, 1).first_line; \
  |  |  ------------------
  |  |  |  | 2162|   132k|#define YYRHSLOC(Rhs, K) ((Rhs)[K])
  |  |  ------------------
  |  |   86|   132k|    (L).first_column = YYRHSLOC(R, 1).first_column; \
  |  |  ------------------
  |  |  |  | 2162|   132k|#define YYRHSLOC(Rhs, K) ((Rhs)[K])
  |  |  ------------------
  |  |   87|   132k|    (L).last_line    = YYRHSLOC(R, N).last_line; \
  |  |  ------------------
  |  |  |  | 2162|   132k|#define YYRHSLOC(Rhs, K) ((Rhs)[K])
  |  |  ------------------
  |  |   88|   132k|    (L).last_column  = YYRHSLOC(R, N).last_column; \
  |  |  ------------------
  |  |  |  | 2162|   132k|#define YYRHSLOC(Rhs, K) ((Rhs)[K])
  |  |  ------------------
  |  |   89|   132k|  } else { \
  |  |   90|    197|    (L).first_line = (L).last_line = YYRHSLOC(R, 0).last_line; \
  |  |  ------------------
  |  |  |  | 2162|    197|#define YYRHSLOC(Rhs, K) ((Rhs)[K])
  |  |  ------------------
  |  |   91|    197|    (L).first_column = (L).last_column = YYRHSLOC(R, 0).last_column; \
  |  |  ------------------
  |  |  |  | 2162|    197|#define YYRHSLOC(Rhs, K) ((Rhs)[K])
  |  |  ------------------
  |  |   92|    197|  }
  ------------------
 3109|   132k|  yyerror_range[1] = yyloc;
 3110|   132k|  YY_REDUCE_PRINT (yyn);
 3111|   132k|  switch (yyn)
 3112|   132k|    {
 3113|     27|  case 2: /* s: "domodule" module  */
  ------------------
  |  Branch (3113:3): [True: 27, False: 132k]
  ------------------
 3114|     27|#line 566 "hexpr.y"
 3115|     27|                            { yyParsedModule = (yyvsp[0].module);                     }
 3116|     27|#line 3117 "hexpr.parse.C"
 3117|     27|    break;
 3118|       |
 3119|      0|  case 3: /* s: "dodefn" id "=" l0expr  */
  ------------------
  |  Branch (3119:3): [True: 0, False: 132k]
  ------------------
 3120|      0|#line 567 "hexpr.y"
 3121|      0|                            { yyParsedVar    = *(yyvsp[-2].string); yyParsedExpr = (yyvsp[0].exp); }
 3122|      0|#line 3123 "hexpr.parse.C"
 3123|      0|    break;
 3124|       |
 3125|      0|  case 4: /* s: "dodefn" l0expr  */
  ------------------
  |  Branch (3125:3): [True: 0, False: 132k]
  ------------------
 3126|      0|#line 568 "hexpr.y"
 3127|      0|                            { yyParsedVar    = "";  yyParsedExpr = (yyvsp[0].exp); }
 3128|      0|#line 3129 "hexpr.parse.C"
 3129|      0|    break;
 3130|       |
 3131|      3|  case 5: /* s: "doexpr" l0expr  */
  ------------------
  |  Branch (3131:3): [True: 3, False: 132k]
  ------------------
 3132|      3|#line 569 "hexpr.y"
 3133|      3|                            { yyParsedExpr   = (yyvsp[0].exp);                     }
 3134|      3|#line 3135 "hexpr.parse.C"
 3135|      3|    break;
 3136|       |
 3137|      0|  case 6: /* module: "option" id module  */
  ------------------
  |  Branch (3137:3): [True: 0, False: 132k]
  ------------------
 3138|      0|#line 572 "hexpr.y"
 3139|      0|                                 { (yyval.module) = (yyvsp[0].module); (yyval.module)->setOption(*(yyvsp[-1].string), m((yylsp[-2]))); }
 3140|      0|#line 3141 "hexpr.parse.C"
 3141|      0|    break;
 3142|       |
 3143|      0|  case 7: /* module: "module" id "where" defs  */
  ------------------
  |  Branch (3143:3): [True: 0, False: 132k]
  ------------------
 3144|      0|#line 573 "hexpr.y"
 3145|      0|                                 { (yyval.module) = new Module(*(yyvsp[-2].string), *(yyvsp[0].mdefs)); }
 3146|      0|#line 3147 "hexpr.parse.C"
 3147|      0|    break;
 3148|       |
 3149|     27|  case 8: /* module: defs  */
  ------------------
  |  Branch (3149:3): [True: 27, False: 132k]
  ------------------
 3150|     27|#line 574 "hexpr.y"
 3151|     27|                                 { (yyval.module) = new Module(freshName(), *(yyvsp[0].mdefs)); }
 3152|     27|#line 3153 "hexpr.parse.C"
 3153|     27|    break;
 3154|       |
 3155|      0|  case 9: /* defs: %empty  */
  ------------------
  |  Branch (3155:3): [True: 0, False: 132k]
  ------------------
 3156|      0|#line 576 "hexpr.y"
 3157|      0|                    { (yyval.mdefs) = autorelease(new ModuleDefs()); }
 3158|      0|#line 3159 "hexpr.parse.C"
 3159|      0|    break;
 3160|       |
 3161|     27|  case 10: /* defs: def  */
  ------------------
  |  Branch (3161:3): [True: 27, False: 132k]
  ------------------
 3162|     27|#line 577 "hexpr.y"
 3163|     27|                    { (yyval.mdefs) = autorelease(new ModuleDefs()); (yyval.mdefs)->push_back(ModuleDefPtr((yyvsp[0].mdef))); }
 3164|     27|#line 3165 "hexpr.parse.C"
 3165|     27|    break;
 3166|       |
 3167|  1.39k|  case 11: /* defs: defs def  */
  ------------------
  |  Branch (3167:3): [True: 1.39k, False: 131k]
  ------------------
 3168|  1.39k|#line 578 "hexpr.y"
 3169|  1.39k|                    { (yyval.mdefs) = (yyvsp[-1].mdefs);                            (yyval.mdefs)->push_back(ModuleDefPtr((yyvsp[0].mdef))); }
 3170|  1.39k|#line 3171 "hexpr.parse.C"
 3171|  1.39k|    break;
 3172|       |
 3173|      0|  case 12: /* def: importdef  */
  ------------------
  |  Branch (3173:3): [True: 0, False: 132k]
  ------------------
 3174|      0|#line 580 "hexpr.y"
 3175|      0|               { (yyval.mdef) = (yyvsp[0].mdef); }
 3176|      0|#line 3177 "hexpr.parse.C"
 3177|      0|    break;
 3178|       |
 3179|     13|  case 13: /* def: tydef  */
  ------------------
  |  Branch (3179:3): [True: 13, False: 132k]
  ------------------
 3180|     13|#line 581 "hexpr.y"
 3181|     13|               { (yyval.mdef) = (yyvsp[0].mdef); }
 3182|     13|#line 3183 "hexpr.parse.C"
 3183|     13|    break;
 3184|       |
 3185|    260|  case 14: /* def: vartybind  */
  ------------------
  |  Branch (3185:3): [True: 260, False: 132k]
  ------------------
 3186|    260|#line 582 "hexpr.y"
 3187|    260|               { (yyval.mdef) = (yyvsp[0].mvtydef); }
 3188|    260|#line 3189 "hexpr.parse.C"
 3189|    260|    break;
 3190|       |
 3191|     97|  case 15: /* def: classdef  */
  ------------------
  |  Branch (3191:3): [True: 97, False: 132k]
  ------------------
 3192|     97|#line 583 "hexpr.y"
 3193|     97|               { (yyval.mdef) = (yyvsp[0].mdef); }
 3194|     97|#line 3195 "hexpr.parse.C"
 3195|     97|    break;
 3196|       |
 3197|    621|  case 16: /* def: instdef  */
  ------------------
  |  Branch (3197:3): [True: 621, False: 131k]
  ------------------
 3198|    621|#line 584 "hexpr.y"
 3199|    621|               { (yyval.mdef) = (yyvsp[0].mdef); }
 3200|    621|#line 3201 "hexpr.parse.C"
 3201|    621|    break;
 3202|       |
 3203|    150|  case 17: /* def: pragmadef  */
  ------------------
  |  Branch (3203:3): [True: 150, False: 132k]
  ------------------
 3204|    150|#line 585 "hexpr.y"
 3205|    150|               { (yyval.mdef) = (yyvsp[0].mdef); }
 3206|    150|#line 3207 "hexpr.parse.C"
 3207|    150|    break;
 3208|       |
 3209|     11|  case 18: /* def: id "=" l0expr  */
  ------------------
  |  Branch (3209:3): [True: 11, False: 132k]
  ------------------
 3210|     11|#line 587 "hexpr.y"
 3211|     11|                   { (yyval.mdef) = new MVarDef(list(*(yyvsp[-2].string)), ExprPtr((yyvsp[0].exp)), m((yylsp[-2]), (yylsp[0]))); }
 3212|     11|#line 3213 "hexpr.parse.C"
 3213|     11|    break;
 3214|       |
 3215|     46|  case 19: /* def: id id "=" l0expr  */
  ------------------
  |  Branch (3215:3): [True: 46, False: 132k]
  ------------------
 3216|     46|#line 588 "hexpr.y"
 3217|     46|                      { (yyval.mdef) = new MVarDef(list(*(yyvsp[-3].string), *(yyvsp[-2].string)), ExprPtr((yyvsp[0].exp)), m((yylsp[-3]), (yylsp[0]))); }
 3218|     46|#line 3219 "hexpr.parse.C"
 3219|     46|    break;
 3220|       |
 3221|     76|  case 20: /* def: id id id "=" l0expr  */
  ------------------
  |  Branch (3221:3): [True: 76, False: 132k]
  ------------------
 3222|     76|#line 589 "hexpr.y"
 3223|     76|                         { (yyval.mdef) = new MVarDef(list(*(yyvsp[-4].string), *(yyvsp[-3].string), *(yyvsp[-2].string)), ExprPtr((yyvsp[0].exp)), m((yylsp[-4]), (yylsp[0]))); }
 3224|     76|#line 3225 "hexpr.parse.C"
 3225|     76|    break;
 3226|       |
 3227|     60|  case 21: /* def: id id id id "=" l0expr  */
  ------------------
  |  Branch (3227:3): [True: 60, False: 132k]
  ------------------
 3228|     60|#line 590 "hexpr.y"
 3229|     60|                            { (yyval.mdef) = new MVarDef(list(*(yyvsp[-5].string), *(yyvsp[-4].string), *(yyvsp[-3].string), *(yyvsp[-2].string)), ExprPtr((yyvsp[0].exp)), m((yylsp[-5]), (yylsp[0]))); }
 3230|     60|#line 3231 "hexpr.parse.C"
 3231|     60|    break;
 3232|       |
 3233|     49|  case 22: /* def: id id id id id "=" l0expr  */
  ------------------
  |  Branch (3233:3): [True: 49, False: 132k]
  ------------------
 3234|     49|#line 591 "hexpr.y"
 3235|     49|                               { (yyval.mdef) = new MVarDef(list(*(yyvsp[-6].string), *(yyvsp[-5].string), *(yyvsp[-4].string), *(yyvsp[-3].string), *(yyvsp[-2].string)), ExprPtr((yyvsp[0].exp)), m((yylsp[-6]), (yylsp[0]))); }
 3236|     49|#line 3237 "hexpr.parse.C"
 3237|     49|    break;
 3238|       |
 3239|     22|  case 23: /* def: id id id id id id "=" l0expr  */
  ------------------
  |  Branch (3239:3): [True: 22, False: 132k]
  ------------------
 3240|     22|#line 592 "hexpr.y"
 3241|     22|                                  { (yyval.mdef) = new MVarDef(list(*(yyvsp[-7].string), *(yyvsp[-6].string), *(yyvsp[-5].string), *(yyvsp[-4].string), *(yyvsp[-3].string), *(yyvsp[-2].string)), ExprPtr((yyvsp[0].exp)), m((yylsp[-7]), (yylsp[0]))); }
 3242|     22|#line 3243 "hexpr.parse.C"
 3243|     22|    break;
 3244|       |
 3245|      6|  case 24: /* def: id id id id id id id "=" l0expr  */
  ------------------
  |  Branch (3245:3): [True: 6, False: 132k]
  ------------------
 3246|      6|#line 593 "hexpr.y"
 3247|      6|                                     { (yyval.mdef) = new MVarDef(list(*(yyvsp[-8].string), *(yyvsp[-7].string), *(yyvsp[-6].string), *(yyvsp[-5].string), *(yyvsp[-4].string), *(yyvsp[-3].string), *(yyvsp[-2].string)), ExprPtr((yyvsp[0].exp)), m((yylsp[-8]), (yylsp[0]))); }
 3248|      6|#line 3249 "hexpr.parse.C"
 3249|      6|    break;
 3250|       |
 3251|      6|  case 25: /* def: id id id id id id id id "=" l0expr  */
  ------------------
  |  Branch (3251:3): [True: 6, False: 132k]
  ------------------
 3252|      6|#line 594 "hexpr.y"
 3253|      6|                                        { (yyval.mdef) = new MVarDef(list(*(yyvsp[-9].string), *(yyvsp[-8].string), *(yyvsp[-7].string), *(yyvsp[-6].string), *(yyvsp[-5].string), *(yyvsp[-4].string), *(yyvsp[-3].string), *(yyvsp[-2].string)), ExprPtr((yyvsp[0].exp)), m((yylsp[-9]), (yylsp[0]))); }
 3254|      6|#line 3255 "hexpr.parse.C"
 3255|      6|    break;
 3256|       |
 3257|      0|  case 26: /* def: id id id id id id id id id "=" l0expr  */
  ------------------
  |  Branch (3257:3): [True: 0, False: 132k]
  ------------------
 3258|      0|#line 595 "hexpr.y"
 3259|      0|                                           { (yyval.mdef) = new MVarDef(list(*(yyvsp[-10].string), *(yyvsp[-9].string), *(yyvsp[-8].string), *(yyvsp[-7].string), *(yyvsp[-6].string), *(yyvsp[-5].string), *(yyvsp[-4].string), *(yyvsp[-3].string), *(yyvsp[-2].string)), ExprPtr((yyvsp[0].exp)), m((yylsp[-10]), (yylsp[0]))); }
 3260|      0|#line 3261 "hexpr.parse.C"
 3261|      0|    break;
 3262|       |
 3263|      0|  case 27: /* def: id id id id id id id id id id "=" l0expr  */
  ------------------
  |  Branch (3263:3): [True: 0, False: 132k]
  ------------------
 3264|      0|#line 596 "hexpr.y"
 3265|      0|                                              { (yyval.mdef) = new MVarDef(list(*(yyvsp[-11].string), *(yyvsp[-10].string), *(yyvsp[-9].string), *(yyvsp[-8].string), *(yyvsp[-7].string), *(yyvsp[-6].string), *(yyvsp[-5].string), *(yyvsp[-4].string), *(yyvsp[-3].string), *(yyvsp[-2].string)), ExprPtr((yyvsp[0].exp)), m((yylsp[-11]), (yylsp[0]))); }
 3266|      0|#line 3267 "hexpr.parse.C"
 3267|      0|    break;
 3268|       |
 3269|      1|  case 28: /* def: id id id id id id id id id id id "=" l0expr  */
  ------------------
  |  Branch (3269:3): [True: 1, False: 132k]
  ------------------
 3270|      1|#line 597 "hexpr.y"
 3271|      1|                                                 { (yyval.mdef) = new MVarDef(list(*(yyvsp[-12].string), *(yyvsp[-11].string), *(yyvsp[-10].string), *(yyvsp[-9].string), *(yyvsp[-8].string), *(yyvsp[-7].string), *(yyvsp[-6].string), *(yyvsp[-5].string), *(yyvsp[-4].string), *(yyvsp[-3].string), *(yyvsp[-2].string)), ExprPtr((yyvsp[0].exp)), m((yylsp[-12]), (yylsp[0]))); }
 3272|      1|#line 3273 "hexpr.parse.C"
 3273|      1|    break;
 3274|       |
 3275|      0|  case 29: /* def: id id id id id id id id id id id id "=" l0expr  */
  ------------------
  |  Branch (3275:3): [True: 0, False: 132k]
  ------------------
 3276|      0|#line 598 "hexpr.y"
 3277|      0|                                                    { (yyval.mdef) = new MVarDef(list(*(yyvsp[-13].string), *(yyvsp[-12].string), *(yyvsp[-11].string), *(yyvsp[-10].string), *(yyvsp[-9].string), *(yyvsp[-8].string), *(yyvsp[-7].string), *(yyvsp[-6].string), *(yyvsp[-5].string), *(yyvsp[-4].string), *(yyvsp[-3].string), *(yyvsp[-2].string)), ExprPtr((yyvsp[0].exp)), m((yylsp[-13]), (yylsp[0]))); }
 3278|      0|#line 3279 "hexpr.parse.C"
 3279|      0|    break;
 3280|       |
 3281|      0|  case 30: /* def: id id id id id id id id id id id id id "=" l0expr  */
  ------------------
  |  Branch (3281:3): [True: 0, False: 132k]
  ------------------
 3282|      0|#line 599 "hexpr.y"
 3283|      0|                                                       { (yyval.mdef) = new MVarDef(list(*(yyvsp[-14].string), *(yyvsp[-13].string), *(yyvsp[-12].string), *(yyvsp[-11].string), *(yyvsp[-10].string), *(yyvsp[-9].string), *(yyvsp[-8].string), *(yyvsp[-7].string), *(yyvsp[-6].string), *(yyvsp[-5].string), *(yyvsp[-4].string), *(yyvsp[-3].string), *(yyvsp[-2].string)), ExprPtr((yyvsp[0].exp)), m((yylsp[-14]), (yylsp[0]))); }
 3284|      0|#line 3285 "hexpr.parse.C"
 3285|      0|    break;
 3286|       |
 3287|      0|  case 31: /* def: id id id id id id id id id id id id id id "=" l0expr  */
  ------------------
  |  Branch (3287:3): [True: 0, False: 132k]
  ------------------
 3288|      0|#line 600 "hexpr.y"
 3289|      0|                                                          { (yyval.mdef) = new MVarDef(list(*(yyvsp[-15].string), *(yyvsp[-14].string), *(yyvsp[-13].string), *(yyvsp[-12].string), *(yyvsp[-11].string), *(yyvsp[-10].string), *(yyvsp[-9].string), *(yyvsp[-8].string), *(yyvsp[-7].string), *(yyvsp[-6].string), *(yyvsp[-5].string), *(yyvsp[-4].string), *(yyvsp[-3].string), *(yyvsp[-2].string)), ExprPtr((yyvsp[0].exp)), m((yylsp[-15]), (yylsp[0]))); }
 3290|      0|#line 3291 "hexpr.parse.C"
 3291|      0|    break;
 3292|       |
 3293|      0|  case 32: /* def: id id id id id id id id id id id id id id id "=" l0expr  */
  ------------------
  |  Branch (3293:3): [True: 0, False: 132k]
  ------------------
 3294|      0|#line 601 "hexpr.y"
 3295|      0|                                                             { (yyval.mdef) = new MVarDef(list(*(yyvsp[-16].string), *(yyvsp[-15].string), *(yyvsp[-14].string), *(yyvsp[-13].string), *(yyvsp[-12].string), *(yyvsp[-11].string), *(yyvsp[-10].string), *(yyvsp[-9].string), *(yyvsp[-8].string), *(yyvsp[-7].string), *(yyvsp[-6].string), *(yyvsp[-5].string), *(yyvsp[-4].string), *(yyvsp[-3].string), *(yyvsp[-2].string)), ExprPtr((yyvsp[0].exp)), m((yylsp[-16]), (yylsp[0]))); }
 3296|      0|#line 3297 "hexpr.parse.C"
 3297|      0|    break;
 3298|       |
 3299|      0|  case 33: /* def: id id id id id id id id id id id id id id id id "=" l0expr  */
  ------------------
  |  Branch (3299:3): [True: 0, False: 132k]
  ------------------
 3300|      0|#line 602 "hexpr.y"
 3301|      0|                                                                { (yyval.mdef) = new MVarDef(list(*(yyvsp[-17].string), *(yyvsp[-16].string), *(yyvsp[-15].string), *(yyvsp[-14].string), *(yyvsp[-13].string), *(yyvsp[-12].string), *(yyvsp[-11].string), *(yyvsp[-10].string), *(yyvsp[-9].string), *(yyvsp[-8].string), *(yyvsp[-7].string), *(yyvsp[-6].string), *(yyvsp[-5].string), *(yyvsp[-4].string), *(yyvsp[-3].string), *(yyvsp[-2].string)), ExprPtr((yyvsp[0].exp)), m((yylsp[-17]), (yylsp[0]))); }
 3302|      0|#line 3303 "hexpr.parse.C"
 3303|      0|    break;
 3304|       |
 3305|      0|  case 34: /* def: id id id id id id id id id id id id id id id id id "=" l0expr  */
  ------------------
  |  Branch (3305:3): [True: 0, False: 132k]
  ------------------
 3306|      0|#line 603 "hexpr.y"
 3307|      0|                                                                   { (yyval.mdef) = new MVarDef(list(*(yyvsp[-18].string), *(yyvsp[-17].string), *(yyvsp[-16].string), *(yyvsp[-15].string), *(yyvsp[-14].string), *(yyvsp[-13].string), *(yyvsp[-12].string), *(yyvsp[-11].string), *(yyvsp[-10].string), *(yyvsp[-9].string), *(yyvsp[-8].string), *(yyvsp[-7].string), *(yyvsp[-6].string), *(yyvsp[-5].string), *(yyvsp[-4].string), *(yyvsp[-3].string), *(yyvsp[-2].string)), ExprPtr((yyvsp[0].exp)), m((yylsp[-18]), (yylsp[0]))); }
 3308|      0|#line 3309 "hexpr.parse.C"
 3309|      0|    break;
 3310|       |
 3311|      0|  case 35: /* def: id id id id id id id id id id id id id id id id id id "=" l0expr  */
  ------------------
  |  Branch (3311:3): [True: 0, False: 132k]
  ------------------
 3312|      0|#line 604 "hexpr.y"
 3313|      0|                                                                      { (yyval.mdef) = new MVarDef(list(*(yyvsp[-19].string), *(yyvsp[-18].string), *(yyvsp[-17].string), *(yyvsp[-16].string), *(yyvsp[-15].string), *(yyvsp[-14].string), *(yyvsp[-13].string), *(yyvsp[-12].string), *(yyvsp[-11].string), *(yyvsp[-10].string), *(yyvsp[-9].string), *(yyvsp[-8].string), *(yyvsp[-7].string), *(yyvsp[-6].string), *(yyvsp[-5].string), *(yyvsp[-4].string), *(yyvsp[-3].string), *(yyvsp[-2].string)), ExprPtr((yyvsp[0].exp)), m((yylsp[-19]), (yylsp[0]))); }
 3314|      0|#line 3315 "hexpr.parse.C"
 3315|      0|    break;
 3316|       |
 3317|      0|  case 36: /* def: id id id id id id id id id id id id id id id id id id id "=" l0expr  */
  ------------------
  |  Branch (3317:3): [True: 0, False: 132k]
  ------------------
 3318|      0|#line 605 "hexpr.y"
 3319|      0|                                                                         { (yyval.mdef) = new MVarDef(list(*(yyvsp[-20].string), *(yyvsp[-19].string), *(yyvsp[-18].string), *(yyvsp[-17].string), *(yyvsp[-16].string), *(yyvsp[-15].string), *(yyvsp[-14].string), *(yyvsp[-13].string), *(yyvsp[-12].string), *(yyvsp[-11].string), *(yyvsp[-10].string), *(yyvsp[-9].string), *(yyvsp[-8].string), *(yyvsp[-7].string), *(yyvsp[-6].string), *(yyvsp[-5].string), *(yyvsp[-4].string), *(yyvsp[-3].string), *(yyvsp[-2].string)), ExprPtr((yyvsp[0].exp)), m((yylsp[-20]), (yylsp[0]))); }
 3320|      0|#line 3321 "hexpr.parse.C"
 3321|      0|    break;
 3322|       |
 3323|      0|  case 37: /* def: id id id id id id id id id id id id id id id id id id id id "=" l0expr  */
  ------------------
  |  Branch (3323:3): [True: 0, False: 132k]
  ------------------
 3324|      0|#line 606 "hexpr.y"
 3325|      0|                                                                            { (yyval.mdef) = new MVarDef(list(*(yyvsp[-21].string), *(yyvsp[-20].string), *(yyvsp[-19].string), *(yyvsp[-18].string), *(yyvsp[-17].string), *(yyvsp[-16].string), *(yyvsp[-15].string), *(yyvsp[-14].string), *(yyvsp[-13].string), *(yyvsp[-12].string), *(yyvsp[-11].string), *(yyvsp[-10].string), *(yyvsp[-9].string), *(yyvsp[-8].string), *(yyvsp[-7].string), *(yyvsp[-6].string), *(yyvsp[-5].string), *(yyvsp[-4].string), *(yyvsp[-3].string), *(yyvsp[-2].string)), ExprPtr((yyvsp[0].exp)), m((yylsp[-21]), (yylsp[0]))); }
 3326|      0|#line 3327 "hexpr.parse.C"
 3327|      0|    break;
 3328|       |
 3329|      0|  case 38: /* def: id id id id id id id id id id id id id id id id id id id id id "=" l0expr  */
  ------------------
  |  Branch (3329:3): [True: 0, False: 132k]
  ------------------
 3330|      0|#line 607 "hexpr.y"
 3331|      0|                                                                               { (yyval.mdef) = new MVarDef(list(*(yyvsp[-22].string), *(yyvsp[-21].string), *(yyvsp[-20].string), *(yyvsp[-19].string), *(yyvsp[-18].string), *(yyvsp[-17].string), *(yyvsp[-16].string), *(yyvsp[-15].string), *(yyvsp[-14].string), *(yyvsp[-13].string), *(yyvsp[-12].string), *(yyvsp[-11].string), *(yyvsp[-10].string), *(yyvsp[-9].string), *(yyvsp[-8].string), *(yyvsp[-7].string), *(yyvsp[-6].string), *(yyvsp[-5].string), *(yyvsp[-4].string), *(yyvsp[-3].string), *(yyvsp[-2].string)), ExprPtr((yyvsp[0].exp)), m((yylsp[-22]), (yylsp[0]))); }
 3332|      0|#line 3333 "hexpr.parse.C"
 3333|      0|    break;
 3334|       |
 3335|      0|  case 39: /* def: l5expr  */
  ------------------
  |  Branch (3335:3): [True: 0, False: 132k]
  ------------------
 3336|      0|#line 610 "hexpr.y"
 3337|      0|            { (yyval.mdef) = new MVarDef(list(freshName()), let(freshName(), ExprPtr((yyvsp[0].exp)), mktunit(m((yylsp[0]))), m((yylsp[0]))), m((yylsp[0]))); }
 3338|      0|#line 3339 "hexpr.parse.C"
 3339|      0|    break;
 3340|       |
 3341|      0|  case 40: /* importdef: "import" cppid  */
  ------------------
  |  Branch (3341:3): [True: 0, False: 132k]
  ------------------
 3342|      0|#line 613 "hexpr.y"
 3343|      0|                          { (yyval.mdef) = new MImport(yyModulePath, *(yyvsp[0].string), m((yylsp[-1]), (yylsp[0]))); }
 3344|      0|#line 3345 "hexpr.parse.C"
 3345|      0|    break;
 3346|       |
 3347|    150|  case 41: /* pragmadef: "{-#" pragmaty "#-}"  */
  ------------------
  |  Branch (3347:3): [True: 150, False: 132k]
  ------------------
 3348|    150|#line 616 "hexpr.y"
 3349|    150|                                { (yyval.mdef) = (yyvsp[-1].mdef); }
 3350|    150|#line 3351 "hexpr.parse.C"
 3351|    150|    break;
 3352|       |
 3353|     93|  case 42: /* pragmaty: "UNSAFE" id  */
  ------------------
  |  Branch (3353:3): [True: 93, False: 132k]
  ------------------
 3354|     93|#line 617 "hexpr.y"
 3355|     93|                      { (yyval.mdef) = new MUnsafePragmaDef(*(yyvsp[0].string), m((yylsp[-1]), (yylsp[0]))); }
 3356|     93|#line 3357 "hexpr.parse.C"
 3357|     93|    break;
 3358|       |
 3359|     57|  case 43: /* pragmaty: "SAFE" id  */
  ------------------
  |  Branch (3359:3): [True: 57, False: 132k]
  ------------------
 3360|     57|#line 618 "hexpr.y"
 3361|     57|                    { (yyval.mdef) = new MSafePragmaDef(*(yyvsp[0].string), m((yylsp[-1]), (yylsp[0]))); }
 3362|     57|#line 3363 "hexpr.parse.C"
 3363|     57|    break;
 3364|       |
 3365|      4|  case 44: /* tydef: "type" nameseq "=" qtype  */
  ------------------
  |  Branch (3365:3): [True: 4, False: 132k]
  ------------------
 3366|      4|#line 621 "hexpr.y"
 3367|      4|                                { (yyval.mdef) = new MTypeDef(MTypeDef::Transparent, hobbes::select(*(yyvsp[-2].strings), 0), hobbes::select(*(yyvsp[-2].strings), 1, (int)(yyvsp[-2].strings)->size()), QualTypePtr((yyvsp[0].qualtype)), m((yylsp[-3]), (yylsp[0]))); }
 3368|      4|#line 3369 "hexpr.parse.C"
 3369|      4|    break;
 3370|       |
 3371|      9|  case 45: /* tydef: "data" nameseq "=" qtype  */
  ------------------
  |  Branch (3371:3): [True: 9, False: 132k]
  ------------------
 3372|      9|#line 622 "hexpr.y"
 3373|      9|                                { (yyval.mdef) = new MTypeDef(MTypeDef::Opaque, hobbes::select(*(yyvsp[-2].strings), 0), hobbes::select(*(yyvsp[-2].strings), 1, (int)(yyvsp[-2].strings)->size()), QualTypePtr((yyvsp[0].qualtype)), m((yylsp[-3]), (yylsp[0]))); }
 3374|      9|#line 3375 "hexpr.parse.C"
 3375|      9|    break;
 3376|       |
 3377|    355|  case 46: /* vartybind: name "::" qtype  */
  ------------------
  |  Branch (3377:3): [True: 355, False: 132k]
  ------------------
 3378|    355|#line 625 "hexpr.y"
 3379|    355|                           { (yyval.mvtydef) = new MVarTypeDef(*(yyvsp[-2].string), QualTypePtr((yyvsp[0].qualtype)), m((yylsp[-2]), (yylsp[0]))); }
 3380|    355|#line 3381 "hexpr.parse.C"
 3381|    355|    break;
 3382|       |
 3383|    747|  case 47: /* vardef: names "=" l0expr  */
  ------------------
  |  Branch (3383:3): [True: 747, False: 131k]
  ------------------
 3384|    747|#line 627 "hexpr.y"
 3385|    747|                         { (yyval.mvdef) = new MVarDef(*(yyvsp[-2].strings), ExprPtr((yyvsp[0].exp)), m((yylsp[-2]), (yylsp[0]))); }
 3386|    747|#line 3387 "hexpr.parse.C"
 3387|    747|    break;
 3388|       |
 3389|      0|  case 48: /* classdef: "class" cst "=>" id names  */
  ------------------
  |  Branch (3389:3): [True: 0, False: 132k]
  ------------------
 3390|      0|#line 630 "hexpr.y"
 3391|      0|                                                                 { (yyval.mdef) = new ClassDef(*(yyvsp[-3].tconstraints), *(yyvsp[-1].string), *(yyvsp[0].strings), CFunDepDefs(), MVarTypeDefs(), m((yylsp[-4]), (yylsp[0]))); wantIndent(false); }
 3392|      0|#line 3393 "hexpr.parse.C"
 3393|      0|    break;
 3394|       |
 3395|      3|  case 49: /* classdef: "class" cst "=>" id names "|" fundeps  */
  ------------------
  |  Branch (3395:3): [True: 3, False: 132k]
  ------------------
 3396|      3|#line 631 "hexpr.y"
 3397|      3|                                                                 { (yyval.mdef) = new ClassDef(*(yyvsp[-5].tconstraints), *(yyvsp[-3].string), *(yyvsp[-2].strings), *(yyvsp[0].fundeps),           MVarTypeDefs(), m((yylsp[-6]), (yylsp[0]))); wantIndent(false); }
 3398|      3|#line 3399 "hexpr.parse.C"
 3399|      3|    break;
 3400|       |
 3401|      8|  case 50: /* classdef: "class" cst "=>" id names "where" cmembers  */
  ------------------
  |  Branch (3401:3): [True: 8, False: 132k]
  ------------------
 3402|      8|#line 632 "hexpr.y"
 3403|      8|                                                                 { (yyval.mdef) = new ClassDef(*(yyvsp[-5].tconstraints), *(yyvsp[-3].string), *(yyvsp[-2].strings), CFunDepDefs(), *(yyvsp[0].mvtydefs), m((yylsp[-6]), (yylsp[0])));            wantIndent(false); }
 3404|      8|#line 3405 "hexpr.parse.C"
 3405|      8|    break;
 3406|       |
 3407|      4|  case 51: /* classdef: "class" cst "=>" id names "|" fundeps "where" cmembers  */
  ------------------
  |  Branch (3407:3): [True: 4, False: 132k]
  ------------------
 3408|      4|#line 633 "hexpr.y"
 3409|      4|                                                                 { (yyval.mdef) = new ClassDef(*(yyvsp[-7].tconstraints), *(yyvsp[-5].string), *(yyvsp[-4].strings), *(yyvsp[-2].fundeps),           *(yyvsp[0].mvtydefs), m((yylsp[-8]), (yylsp[0])));            wantIndent(false); }
 3410|      4|#line 3411 "hexpr.parse.C"
 3411|      4|    break;
 3412|       |
 3413|      5|  case 52: /* classdef: "class" id names  */
  ------------------
  |  Branch (3413:3): [True: 5, False: 132k]
  ------------------
 3414|      5|#line 634 "hexpr.y"
 3415|      5|                                                                 { (yyval.mdef) = new ClassDef(Constraints(), *(yyvsp[-1].string), *(yyvsp[0].strings), CFunDepDefs(), MVarTypeDefs(), m((yylsp[-2]), (yylsp[0]))); wantIndent(false); }
 3416|      5|#line 3417 "hexpr.parse.C"
 3417|      5|    break;
 3418|       |
 3419|      9|  case 53: /* classdef: "class" id names "|" fundeps  */
  ------------------
  |  Branch (3419:3): [True: 9, False: 132k]
  ------------------
 3420|      9|#line 635 "hexpr.y"
 3421|      9|                                                                 { (yyval.mdef) = new ClassDef(Constraints(), *(yyvsp[-3].string), *(yyvsp[-2].strings), *(yyvsp[0].fundeps),           MVarTypeDefs(), m((yylsp[-4]), (yylsp[0]))); wantIndent(false); }
 3422|      9|#line 3423 "hexpr.parse.C"
 3423|      9|    break;
 3424|       |
 3425|     52|  case 54: /* classdef: "class" id names "where" cmembers  */
  ------------------
  |  Branch (3425:3): [True: 52, False: 132k]
  ------------------
 3426|     52|#line 636 "hexpr.y"
 3427|     52|                                                                 { (yyval.mdef) = new ClassDef(Constraints(), *(yyvsp[-3].string), *(yyvsp[-2].strings), CFunDepDefs(), *(yyvsp[0].mvtydefs), m((yylsp[-4]), (yylsp[0])));            wantIndent(false); }
 3428|     52|#line 3429 "hexpr.parse.C"
 3429|     52|    break;
 3430|       |
 3431|     16|  case 55: /* classdef: "class" id names "|" fundeps "where" cmembers  */
  ------------------
  |  Branch (3431:3): [True: 16, False: 132k]
  ------------------
 3432|     16|#line 637 "hexpr.y"
 3433|     16|                                                                 { (yyval.mdef) = new ClassDef(Constraints(), *(yyvsp[-5].string), *(yyvsp[-4].strings), *(yyvsp[-2].fundeps),           *(yyvsp[0].mvtydefs), m((yylsp[-6]), (yylsp[0])));            wantIndent(false); }
 3434|     16|#line 3435 "hexpr.parse.C"
 3435|     16|    break;
 3436|       |
 3437|     32|  case 56: /* fundeps: fundep  */
  ------------------
  |  Branch (3437:3): [True: 32, False: 132k]
  ------------------
 3438|     32|#line 639 "hexpr.y"
 3439|     32|                            { (yyval.fundeps) = autorelease(new CFunDepDefs()); (yyval.fundeps)->push_back(*(yyvsp[0].fundep)); }
 3440|     32|#line 3441 "hexpr.parse.C"
 3441|     32|    break;
 3442|       |
 3443|     28|  case 57: /* fundeps: fundeps "," fundep  */
  ------------------
  |  Branch (3443:3): [True: 28, False: 132k]
  ------------------
 3444|     28|#line 640 "hexpr.y"
 3445|     28|                            { (yyval.fundeps) = (yyvsp[-2].fundeps);                             (yyval.fundeps)->push_back(*(yyvsp[0].fundep)); }
 3446|     28|#line 3447 "hexpr.parse.C"
 3447|     28|    break;
 3448|       |
 3449|     60|  case 58: /* fundep: idseq "->" idseq  */
  ------------------
  |  Branch (3449:3): [True: 60, False: 132k]
  ------------------
 3450|     60|#line 642 "hexpr.y"
 3451|     60|                         { (yyval.fundep) = autorelease(new CFunDepDef(*(yyvsp[-2].strings), *(yyvsp[0].strings))); }
 3452|     60|#line 3453 "hexpr.parse.C"
 3453|     60|    break;
 3454|       |
 3455|     80|  case 59: /* cmembers: cmember  */
  ------------------
  |  Branch (3455:3): [True: 80, False: 132k]
  ------------------
 3456|     80|#line 644 "hexpr.y"
 3457|     80|                           { (yyval.mvtydefs) = autorelease(new MVarTypeDefs()); (yyval.mvtydefs)->push_back(MVarTypeDefPtr((yyvsp[0].mvtydef))); }
 3458|     80|#line 3459 "hexpr.parse.C"
 3459|     80|    break;
 3460|       |
 3461|     15|  case 60: /* cmembers: cmembers cmember  */
  ------------------
  |  Branch (3461:3): [True: 15, False: 132k]
  ------------------
 3462|     15|#line 645 "hexpr.y"
 3463|     15|                           { (yyval.mvtydefs) = (yyvsp[-1].mvtydefs);                              (yyval.mvtydefs)->push_back(MVarTypeDefPtr((yyvsp[0].mvtydef))); }
 3464|     15|#line 3465 "hexpr.parse.C"
 3465|     15|    break;
 3466|       |
 3467|     95|  case 61: /* cmember: "indent" vartybind  */
  ------------------
  |  Branch (3467:3): [True: 95, False: 132k]
  ------------------
 3468|     95|#line 647 "hexpr.y"
 3469|     95|                            { (yyval.mvtydef) = (yyvsp[0].mvtydef); }
 3470|     95|#line 3471 "hexpr.parse.C"
 3471|     95|    break;
 3472|       |
 3473|     49|  case 62: /* instdef: "instance" id types  */
  ------------------
  |  Branch (3473:3): [True: 49, False: 132k]
  ------------------
 3474|     49|#line 650 "hexpr.y"
 3475|     49|                                                       { (yyval.mdef) = new InstanceDef(Constraints(), *(yyvsp[-1].string), *(yyvsp[0].mtypes), MVarDefs(), m((yylsp[-2]), (yylsp[0]))); wantIndent(false); }
 3476|     49|#line 3477 "hexpr.parse.C"
 3477|     49|    break;
 3478|       |
 3479|     26|  case 63: /* instdef: "instance" cst "=>" id types  */
  ------------------
  |  Branch (3479:3): [True: 26, False: 132k]
  ------------------
 3480|     26|#line 651 "hexpr.y"
 3481|     26|                                                       { (yyval.mdef) = new InstanceDef(*(yyvsp[-3].tconstraints),           *(yyvsp[-1].string), *(yyvsp[0].mtypes), MVarDefs(), m((yylsp[-4]), (yylsp[0]))); wantIndent(false); }
 3482|     26|#line 3483 "hexpr.parse.C"
 3483|     26|    break;
 3484|       |
 3485|    286|  case 64: /* instdef: "instance" id types "where" imembers  */
  ------------------
  |  Branch (3485:3): [True: 286, False: 132k]
  ------------------
 3486|    286|#line 652 "hexpr.y"
 3487|    286|                                                       { (yyval.mdef) = new InstanceDef(Constraints(), *(yyvsp[-3].string), *(yyvsp[-2].mtypes), *(yyvsp[0].mvdefs), m((yylsp[-4]), (yylsp[0])));        wantIndent(false); }
 3488|    286|#line 3489 "hexpr.parse.C"
 3489|    286|    break;
 3490|       |
 3491|    260|  case 65: /* instdef: "instance" cst "=>" id types "where" imembers  */
  ------------------
  |  Branch (3491:3): [True: 260, False: 132k]
  ------------------
 3492|    260|#line 653 "hexpr.y"
 3493|    260|                                                       { (yyval.mdef) = new InstanceDef(*(yyvsp[-5].tconstraints),           *(yyvsp[-3].string), *(yyvsp[-2].mtypes), *(yyvsp[0].mvdefs), m((yylsp[-6]), (yylsp[0])));        wantIndent(false); }
 3494|    260|#line 3495 "hexpr.parse.C"
 3495|    260|    break;
 3496|       |
 3497|    546|  case 66: /* imembers: imember  */
  ------------------
  |  Branch (3497:3): [True: 546, False: 131k]
  ------------------
 3498|    546|#line 655 "hexpr.y"
 3499|    546|                           { (yyval.mvdefs) = autorelease(new MVarDefs()); (yyval.mvdefs)->push_back(MVarDefPtr((yyvsp[0].mvdef))); }
 3500|    546|#line 3501 "hexpr.parse.C"
 3501|    546|    break;
 3502|       |
 3503|    201|  case 67: /* imembers: imembers imember  */
  ------------------
  |  Branch (3503:3): [True: 201, False: 132k]
  ------------------
 3504|    201|#line 656 "hexpr.y"
 3505|    201|                           { (yyval.mvdefs) = (yyvsp[-1].mvdefs);                          (yyval.mvdefs)->push_back(MVarDefPtr((yyvsp[0].mvdef))); }
 3506|    201|#line 3507 "hexpr.parse.C"
 3507|    201|    break;
 3508|       |
 3509|    747|  case 68: /* imember: "indent" vardef  */
  ------------------
  |  Branch (3509:3): [True: 747, False: 131k]
  ------------------
 3510|    747|#line 658 "hexpr.y"
 3511|    747|                         { (yyval.mvdef) = (yyvsp[0].mvdef); }
 3512|    747|#line 3513 "hexpr.parse.C"
 3513|    747|    break;
 3514|       |
 3515|    676|  case 69: /* names: nameseq  */
  ------------------
  |  Branch (3515:3): [True: 676, False: 131k]
  ------------------
 3516|    676|#line 661 "hexpr.y"
 3517|    676|               { (yyval.strings) = (yyvsp[0].strings); }
 3518|    676|#line 3519 "hexpr.parse.C"
 3519|    676|    break;
 3520|       |
 3521|    168|  case 70: /* names: id opname id  */
  ------------------
  |  Branch (3521:3): [True: 168, False: 132k]
  ------------------
 3522|    168|#line 663 "hexpr.y"
 3523|    168|                    { (yyval.strings) = autorelease(new str::seq()); (yyval.strings)->push_back(*(yyvsp[-1].string)); (yyval.strings)->push_back(*(yyvsp[-2].string)); (yyval.strings)->push_back(*(yyvsp[0].string)); }
 3524|    168|#line 3525 "hexpr.parse.C"
 3525|    168|    break;
 3526|       |
 3527|    689|  case 71: /* nameseq: name  */
  ------------------
  |  Branch (3527:3): [True: 689, False: 131k]
  ------------------
 3528|    689|#line 665 "hexpr.y"
 3529|    689|                      { (yyval.strings) = autorelease(new str::seq()); (yyval.strings)->push_back(*(yyvsp[0].string)); }
 3530|    689|#line 3531 "hexpr.parse.C"
 3531|    689|    break;
 3532|       |
 3533|    765|  case 72: /* nameseq: nameseq name  */
  ------------------
  |  Branch (3533:3): [True: 765, False: 131k]
  ------------------
 3534|    765|#line 666 "hexpr.y"
 3535|    765|                      { (yyval.strings) = (yyvsp[-1].strings);                          (yyval.strings)->push_back(*(yyvsp[0].string)); }
 3536|    765|#line 3537 "hexpr.parse.C"
 3537|    765|    break;
 3538|       |
 3539|  1.71k|  case 73: /* name: id  */
  ------------------
  |  Branch (3539:3): [True: 1.71k, False: 130k]
  ------------------
 3540|  1.71k|#line 668 "hexpr.y"
 3541|  1.71k|         { (yyval.string) = (yyvsp[0].string); }
 3542|  1.71k|#line 3543 "hexpr.parse.C"
 3543|  1.71k|    break;
 3544|       |
 3545|     90|  case 74: /* name: "(" opname ")"  */
  ------------------
  |  Branch (3545:3): [True: 90, False: 132k]
  ------------------
 3546|     90|#line 670 "hexpr.y"
 3547|     90|                     { (yyval.string) = (yyvsp[-1].string); }
 3548|     90|#line 3549 "hexpr.parse.C"
 3549|     90|    break;
 3550|       |
 3551|      0|  case 75: /* opname: "and"  */
  ------------------
  |  Branch (3551:3): [True: 0, False: 132k]
  ------------------
 3552|      0|#line 672 "hexpr.y"
 3553|      0|              { (yyval.string) = autorelease(new std::string("and")); }
 3554|      0|#line 3555 "hexpr.parse.C"
 3555|      0|    break;
 3556|       |
 3557|      0|  case 76: /* opname: "or"  */
  ------------------
  |  Branch (3557:3): [True: 0, False: 132k]
  ------------------
 3558|      0|#line 673 "hexpr.y"
 3559|      0|              { (yyval.string) = autorelease(new std::string("or")); }
 3560|      0|#line 3561 "hexpr.parse.C"
 3561|      0|    break;
 3562|       |
 3563|      0|  case 77: /* opname: "o"  */
  ------------------
  |  Branch (3563:3): [True: 0, False: 132k]
  ------------------
 3564|      0|#line 674 "hexpr.y"
 3565|      0|              { (yyval.string) = autorelease(new std::string("compose")); }
 3566|      0|#line 3567 "hexpr.parse.C"
 3567|      0|    break;
 3568|       |
 3569|      0|  case 78: /* opname: "."  */
  ------------------
  |  Branch (3569:3): [True: 0, False: 132k]
  ------------------
 3570|      0|#line 675 "hexpr.y"
 3571|      0|              { (yyval.string) = autorelease(new std::string("compose")); }
 3572|      0|#line 3573 "hexpr.parse.C"
 3573|      0|    break;
 3574|       |
 3575|      2|  case 79: /* opname: "~"  */
  ------------------
  |  Branch (3575:3): [True: 2, False: 132k]
  ------------------
 3576|      2|#line 676 "hexpr.y"
 3577|      2|              { (yyval.string) = autorelease(new std::string("~")); }
 3578|      2|#line 3579 "hexpr.parse.C"
 3579|      2|    break;
 3580|       |
 3581|      0|  case 80: /* opname: "=~"  */
  ------------------
  |  Branch (3581:3): [True: 0, False: 132k]
  ------------------
 3582|      0|#line 677 "hexpr.y"
 3583|      0|               { (yyval.string) = autorelease(new std::string("=~")); }
 3584|      0|#line 3585 "hexpr.parse.C"
 3585|      0|    break;
 3586|       |
 3587|     24|  case 81: /* opname: "==="  */
  ------------------
  |  Branch (3587:3): [True: 24, False: 132k]
  ------------------
 3588|     24|#line 678 "hexpr.y"
 3589|     24|              { (yyval.string) = autorelease(new std::string("===")); }
 3590|     24|#line 3591 "hexpr.parse.C"
 3591|     24|    break;
 3592|       |
 3593|     14|  case 82: /* opname: "=="  */
  ------------------
  |  Branch (3593:3): [True: 14, False: 132k]
  ------------------
 3594|     14|#line 679 "hexpr.y"
 3595|     14|              { (yyval.string) = autorelease(new std::string("==")); }
 3596|     14|#line 3597 "hexpr.parse.C"
 3597|     14|    break;
 3598|       |
 3599|     31|  case 83: /* opname: "<"  */
  ------------------
  |  Branch (3599:3): [True: 31, False: 132k]
  ------------------
 3600|     31|#line 680 "hexpr.y"
 3601|     31|              { (yyval.string) = autorelease(new std::string("<")); }
 3602|     31|#line 3603 "hexpr.parse.C"
 3603|     31|    break;
 3604|       |
 3605|     31|  case 84: /* opname: "<="  */
  ------------------
  |  Branch (3605:3): [True: 31, False: 132k]
  ------------------
 3606|     31|#line 681 "hexpr.y"
 3607|     31|              { (yyval.string) = autorelease(new std::string("<=")); }
 3608|     31|#line 3609 "hexpr.parse.C"
 3609|     31|    break;
 3610|       |
 3611|     31|  case 85: /* opname: ">"  */
  ------------------
  |  Branch (3611:3): [True: 31, False: 132k]
  ------------------
 3612|     31|#line 682 "hexpr.y"
 3613|     31|              { (yyval.string) = autorelease(new std::string(">")); }
 3614|     31|#line 3615 "hexpr.parse.C"
 3615|     31|    break;
 3616|       |
 3617|     31|  case 86: /* opname: ">="  */
  ------------------
  |  Branch (3617:3): [True: 31, False: 132k]
  ------------------
 3618|     31|#line 683 "hexpr.y"
 3619|     31|              { (yyval.string) = autorelease(new std::string(">=")); }
 3620|     31|#line 3621 "hexpr.parse.C"
 3621|     31|    break;
 3622|       |
 3623|      8|  case 87: /* opname: "in"  */
  ------------------
  |  Branch (3623:3): [True: 8, False: 132k]
  ------------------
 3624|      8|#line 684 "hexpr.y"
 3625|      8|              { (yyval.string) = autorelease(new std::string("in")); }
 3626|      8|#line 3627 "hexpr.parse.C"
 3627|      8|    break;
 3628|       |
 3629|      0|  case 88: /* opname: "++"  */
  ------------------
  |  Branch (3629:3): [True: 0, False: 132k]
  ------------------
 3630|      0|#line 685 "hexpr.y"
 3631|      0|              { (yyval.string) = autorelease(new std::string("append")); }
 3632|      0|#line 3633 "hexpr.parse.C"
 3633|      0|    break;
 3634|       |
 3635|     20|  case 89: /* opname: "+"  */
  ------------------
  |  Branch (3635:3): [True: 20, False: 132k]
  ------------------
 3636|     20|#line 686 "hexpr.y"
 3637|     20|              { (yyval.string) = autorelease(new std::string("+")); }
 3638|     20|#line 3639 "hexpr.parse.C"
 3639|     20|    break;
 3640|       |
 3641|     20|  case 90: /* opname: "-"  */
  ------------------
  |  Branch (3641:3): [True: 20, False: 132k]
  ------------------
 3642|     20|#line 687 "hexpr.y"
 3643|     20|              { (yyval.string) = autorelease(new std::string("-")); }
 3644|     20|#line 3645 "hexpr.parse.C"
 3645|     20|    break;
 3646|       |
 3647|     18|  case 91: /* opname: "*"  */
  ------------------
  |  Branch (3647:3): [True: 18, False: 132k]
  ------------------
 3648|     18|#line 688 "hexpr.y"
 3649|     18|              { (yyval.string) = autorelease(new std::string("*")); }
 3650|     18|#line 3651 "hexpr.parse.C"
 3651|     18|    break;
 3652|       |
 3653|     17|  case 92: /* opname: "/"  */
  ------------------
  |  Branch (3653:3): [True: 17, False: 132k]
  ------------------
 3654|     17|#line 689 "hexpr.y"
 3655|     17|              { (yyval.string) = autorelease(new std::string("/")); }
 3656|     17|#line 3657 "hexpr.parse.C"
 3657|     17|    break;
 3658|       |
 3659|     11|  case 93: /* opname: "%"  */
  ------------------
  |  Branch (3659:3): [True: 11, False: 132k]
  ------------------
 3660|     11|#line 690 "hexpr.y"
 3661|     11|              { (yyval.string) = autorelease(new std::string("%")); }
 3662|     11|#line 3663 "hexpr.parse.C"
 3663|     11|    break;
 3664|       |
 3665|    120|  case 94: /* idseq: id  */
  ------------------
  |  Branch (3665:3): [True: 120, False: 132k]
  ------------------
 3666|    120|#line 692 "hexpr.y"
 3667|    120|                { (yyval.strings) = autorelease(new str::seq()); (yyval.strings)->push_back(*(yyvsp[0].string)); }
 3668|    120|#line 3669 "hexpr.parse.C"
 3669|    120|    break;
 3670|       |
 3671|     42|  case 95: /* idseq: idseq id  */
  ------------------
  |  Branch (3671:3): [True: 42, False: 132k]
  ------------------
 3672|     42|#line 693 "hexpr.y"
 3673|     42|                { (yyval.strings) = (yyvsp[-1].strings);                          (yyval.strings)->push_back(*(yyvsp[0].string)); }
 3674|     42|#line 3675 "hexpr.parse.C"
 3675|     42|    break;
 3676|       |
 3677|    621|  case 96: /* types: l0mtype  */
  ------------------
  |  Branch (3677:3): [True: 621, False: 131k]
  ------------------
 3678|    621|#line 695 "hexpr.y"
 3679|    621|                     { (yyval.mtypes) = autorelease(new MonoTypes()); (yyval.mtypes)->push_back(*(yyvsp[0].mtype)); }
 3680|    621|#line 3681 "hexpr.parse.C"
 3681|    621|    break;
 3682|       |
 3683|    832|  case 97: /* types: types l0mtype  */
  ------------------
  |  Branch (3683:3): [True: 832, False: 131k]
  ------------------
 3684|    832|#line 696 "hexpr.y"
 3685|    832|                     { (yyval.mtypes) = (yyvsp[-1].mtypes);                           (yyval.mtypes)->push_back(*(yyvsp[0].mtype)); }
 3686|    832|#line 3687 "hexpr.parse.C"
 3687|    832|    break;
 3688|       |
 3689|    109|  case 98: /* l0expr: "\\" patterns "." l0expr  */
  ------------------
  |  Branch (3689:3): [True: 109, False: 132k]
  ------------------
 3690|    109|#line 699 "hexpr.y"
 3691|    109|                                 { (yyval.exp) = makePatternFn(*(yyvsp[-2].patterns), ExprPtr((yyvsp[0].exp)), m((yylsp[-3]), (yylsp[0]))); }
 3692|    109|#line 3693 "hexpr.parse.C"
 3693|    109|    break;
 3694|       |
 3695|      0|  case 99: /* l0expr: "fn" patterns "." l0expr  */
  ------------------
  |  Branch (3695:3): [True: 0, False: 132k]
  ------------------
 3696|      0|#line 700 "hexpr.y"
 3697|      0|                                 { (yyval.exp) = makePatternFn(*(yyvsp[-2].patterns), ExprPtr((yyvsp[0].exp)), m((yylsp[-3]), (yylsp[0]))); }
 3698|      0|#line 3699 "hexpr.parse.C"
 3699|      0|    break;
 3700|       |
 3701|     91|  case 100: /* l0expr: lhexpr "<-" lhexpr  */
  ------------------
  |  Branch (3701:3): [True: 91, False: 132k]
  ------------------
 3702|     91|#line 701 "hexpr.y"
 3703|     91|                                 { (yyval.exp) = new Assign(ExprPtr((yyvsp[-2].exp)), ExprPtr((yyvsp[0].exp)), m((yylsp[-2]), (yylsp[0]))); }
 3704|     91|#line 3705 "hexpr.parse.C"
 3705|     91|    break;
 3706|       |
 3707|  7.73k|  case 101: /* l0expr: lhexpr  */
  ------------------
  |  Branch (3707:3): [True: 7.73k, False: 124k]
  ------------------
 3708|  7.73k|#line 702 "hexpr.y"
 3709|  7.73k|                                 { (yyval.exp) = (yyvsp[0].exp); }
 3710|  7.73k|#line 3711 "hexpr.parse.C"
 3711|  7.73k|    break;
 3712|       |
 3713|      7|  case 102: /* lhexpr: "!" l1expr  */
  ------------------
  |  Branch (3713:3): [True: 7, False: 132k]
  ------------------
 3714|      7|#line 704 "hexpr.y"
 3715|      7|                                 { (yyval.exp) = TAPP1(var("not",m((yylsp[-1]))), (yyvsp[0].exp), m((yylsp[-1]),(yylsp[0]))); }
  ------------------
  |  |  144|      7|#define TAPP1(fn,x0,la)       new App(fn, list(ExprPtr(x0)), la)
  ------------------
 3716|      7|#line 3717 "hexpr.parse.C"
 3717|      7|    break;
 3718|       |
 3719|     17|  case 103: /* lhexpr: lhexpr "and" lhexpr  */
  ------------------
  |  Branch (3719:3): [True: 17, False: 132k]
  ------------------
 3720|     17|#line 705 "hexpr.y"
 3721|     17|                                 { (yyval.exp) = TAPP2(var("and",m((yylsp[-1]))), (yyvsp[-2].exp), (yyvsp[0].exp), m((yylsp[-2]),(yylsp[0]))); }
  ------------------
  |  |  145|     17|#define TAPP2(fn,x0,x1,la)    new App(fn, list(ExprPtr(x0),ExprPtr(x1)), la)
  ------------------
 3722|     17|#line 3723 "hexpr.parse.C"
 3723|     17|    break;
 3724|       |
 3725|     12|  case 104: /* lhexpr: lhexpr "or" lhexpr  */
  ------------------
  |  Branch (3725:3): [True: 12, False: 132k]
  ------------------
 3726|     12|#line 706 "hexpr.y"
 3727|     12|                                 { (yyval.exp) = TAPP2(var("or",m((yylsp[-1]))),  (yyvsp[-2].exp), (yyvsp[0].exp), m((yylsp[-2]),(yylsp[0]))); }
  ------------------
  |  |  145|     12|#define TAPP2(fn,x0,x1,la)    new App(fn, list(ExprPtr(x0),ExprPtr(x1)), la)
  ------------------
 3728|     12|#line 3729 "hexpr.parse.C"
 3729|     12|    break;
 3730|       |
 3731|      0|  case 105: /* lhexpr: lhexpr "o" lhexpr  */
  ------------------
  |  Branch (3731:3): [True: 0, False: 132k]
  ------------------
 3732|      0|#line 707 "hexpr.y"
 3733|      0|                                 { (yyval.exp) = TAPP2(var("compose",m((yylsp[-1]))), (yyvsp[-2].exp), (yyvsp[0].exp), m((yylsp[-2]),(yylsp[0]))); }
  ------------------
  |  |  145|      0|#define TAPP2(fn,x0,x1,la)    new App(fn, list(ExprPtr(x0),ExprPtr(x1)), la)
  ------------------
 3734|      0|#line 3735 "hexpr.parse.C"
 3735|      0|    break;
 3736|       |
 3737|      3|  case 106: /* lhexpr: l1expr "in" l1expr  */
  ------------------
  |  Branch (3737:3): [True: 3, False: 132k]
  ------------------
 3738|      3|#line 708 "hexpr.y"
 3739|      3|                                 { (yyval.exp) = TAPP2(var("in",m((yylsp[-1]))), (yyvsp[-2].exp), (yyvsp[0].exp), m((yylsp[-2]),(yylsp[0]))); }
  ------------------
  |  |  145|      3|#define TAPP2(fn,x0,x1,la)    new App(fn, list(ExprPtr(x0),ExprPtr(x1)), la)
  ------------------
 3740|      3|#line 3741 "hexpr.parse.C"
 3741|      3|    break;
 3742|       |
 3743|  7.94k|  case 107: /* lhexpr: l1expr  */
  ------------------
  |  Branch (3743:3): [True: 7.94k, False: 124k]
  ------------------
 3744|  7.94k|#line 709 "hexpr.y"
 3745|  7.94k|                                 { (yyval.exp) = (yyvsp[0].exp); }
 3746|  7.94k|#line 3747 "hexpr.parse.C"
 3747|  7.94k|    break;
 3748|       |
 3749|    247|  case 108: /* l1expr: "if" l0expr "then" l0expr "else" l0expr  */
  ------------------
  |  Branch (3749:3): [True: 247, False: 132k]
  ------------------
 3750|    247|#line 711 "hexpr.y"
 3751|    247|                                                { (yyval.exp) = TAPP3(var("if",m((yylsp[-5]))), (yyvsp[-4].exp), (yyvsp[-2].exp), (yyvsp[0].exp), m((yylsp[-5]), (yylsp[0]))); }
  ------------------
  |  |  146|    247|#define TAPP3(fn,x0,x1,x2,la) new App(fn, list(ExprPtr(x0),ExprPtr(x1),ExprPtr(x2)), la)
  ------------------
 3752|    247|#line 3753 "hexpr.parse.C"
 3753|    247|    break;
 3754|       |
 3755|  7.83k|  case 109: /* l1expr: l2expr  */
  ------------------
  |  Branch (3755:3): [True: 7.83k, False: 124k]
  ------------------
 3756|  7.83k|#line 712 "hexpr.y"
 3757|  7.83k|                                                { (yyval.exp) = (yyvsp[0].exp); }
 3758|  7.83k|#line 3759 "hexpr.parse.C"
 3759|  7.83k|    break;
 3760|       |
 3761|      0|  case 110: /* l2expr: l2expr "~" l2expr  */
  ------------------
  |  Branch (3761:3): [True: 0, False: 132k]
  ------------------
 3762|      0|#line 714 "hexpr.y"
 3763|      0|                            { (yyval.exp) = TAPP2(var("~",m((yylsp[-1]))), (yyvsp[-2].exp), (yyvsp[0].exp), m((yylsp[-2]),(yylsp[0]))); }
  ------------------
  |  |  145|      0|#define TAPP2(fn,x0,x1,la)    new App(fn, list(ExprPtr(x0),ExprPtr(x1)), la)
  ------------------
 3764|      0|#line 3765 "hexpr.parse.C"
 3765|      0|    break;
 3766|       |
 3767|     35|  case 111: /* l2expr: l2expr "===" l2expr  */
  ------------------
  |  Branch (3767:3): [True: 35, False: 132k]
  ------------------
 3768|     35|#line 715 "hexpr.y"
 3769|     35|                            { (yyval.exp) = TAPP2(var("===",m((yylsp[-1]))), (yyvsp[-2].exp), (yyvsp[0].exp), m((yylsp[-2]),(yylsp[0]))); }
  ------------------
  |  |  145|     35|#define TAPP2(fn,x0,x1,la)    new App(fn, list(ExprPtr(x0),ExprPtr(x1)), la)
  ------------------
 3770|     35|#line 3771 "hexpr.parse.C"
 3771|     35|    break;
 3772|       |
 3773|    136|  case 112: /* l2expr: l2expr "==" l2expr  */
  ------------------
  |  Branch (3773:3): [True: 136, False: 132k]
  ------------------
 3774|    136|#line 716 "hexpr.y"
 3775|    136|                            { (yyval.exp) = TAPP2(var("==",m((yylsp[-1]))), (yyvsp[-2].exp), (yyvsp[0].exp), m((yylsp[-2]),(yylsp[0]))); }
  ------------------
  |  |  145|    136|#define TAPP2(fn,x0,x1,la)    new App(fn, list(ExprPtr(x0),ExprPtr(x1)), la)
  ------------------
 3776|    136|#line 3777 "hexpr.parse.C"
 3777|    136|    break;
 3778|       |
 3779|      0|  case 113: /* l2expr: l2expr "!=" l2expr  */
  ------------------
  |  Branch (3779:3): [True: 0, False: 132k]
  ------------------
 3780|      0|#line 717 "hexpr.y"
 3781|      0|                            { (yyval.exp) = TAPP1(var("not",m((yylsp[-1]))), TAPP2(var("==",m((yylsp[-1]))), (yyvsp[-2].exp), (yyvsp[0].exp), m((yylsp[-2]),(yylsp[0]))), m((yylsp[-2]),(yylsp[0]))); }
  ------------------
  |  |  144|      0|#define TAPP1(fn,x0,la)       new App(fn, list(ExprPtr(x0)), la)
  ------------------
 3782|      0|#line 3783 "hexpr.parse.C"
 3783|      0|    break;
 3784|       |
 3785|     72|  case 114: /* l2expr: l2expr "<" l2expr  */
  ------------------
  |  Branch (3785:3): [True: 72, False: 132k]
  ------------------
 3786|     72|#line 718 "hexpr.y"
 3787|     72|                            { (yyval.exp) = TAPP2(var("<",m((yylsp[-1]))),  (yyvsp[-2].exp), (yyvsp[0].exp), m((yylsp[-2]),(yylsp[0]))); }
  ------------------
  |  |  145|     72|#define TAPP2(fn,x0,x1,la)    new App(fn, list(ExprPtr(x0),ExprPtr(x1)), la)
  ------------------
 3788|     72|#line 3789 "hexpr.parse.C"
 3789|     72|    break;
 3790|       |
 3791|     34|  case 115: /* l2expr: l2expr "<=" l2expr  */
  ------------------
  |  Branch (3791:3): [True: 34, False: 132k]
  ------------------
 3792|     34|#line 719 "hexpr.y"
 3793|     34|                            { (yyval.exp) = TAPP2(var("<=",m((yylsp[-1]))), (yyvsp[-2].exp), (yyvsp[0].exp), m((yylsp[-2]),(yylsp[0]))); }
  ------------------
  |  |  145|     34|#define TAPP2(fn,x0,x1,la)    new App(fn, list(ExprPtr(x0),ExprPtr(x1)), la)
  ------------------
 3794|     34|#line 3795 "hexpr.parse.C"
 3795|     34|    break;
 3796|       |
 3797|     29|  case 116: /* l2expr: l2expr ">" l2expr  */
  ------------------
  |  Branch (3797:3): [True: 29, False: 132k]
  ------------------
 3798|     29|#line 720 "hexpr.y"
 3799|     29|                            { (yyval.exp) = TAPP2(var(">",m((yylsp[-1]))),  (yyvsp[-2].exp), (yyvsp[0].exp), m((yylsp[-2]),(yylsp[0]))); }
  ------------------
  |  |  145|     29|#define TAPP2(fn,x0,x1,la)    new App(fn, list(ExprPtr(x0),ExprPtr(x1)), la)
  ------------------
 3800|     29|#line 3801 "hexpr.parse.C"
 3801|     29|    break;
 3802|       |
 3803|     27|  case 117: /* l2expr: l2expr ">=" l2expr  */
  ------------------
  |  Branch (3803:3): [True: 27, False: 132k]
  ------------------
 3804|     27|#line 721 "hexpr.y"
 3805|     27|                            { (yyval.exp) = TAPP2(var(">=",m((yylsp[-1]))), (yyvsp[-2].exp), (yyvsp[0].exp), m((yylsp[-2]),(yylsp[0]))); }
  ------------------
  |  |  145|     27|#define TAPP2(fn,x0,x1,la)    new App(fn, list(ExprPtr(x0),ExprPtr(x1)), la)
  ------------------
 3806|     27|#line 3807 "hexpr.parse.C"
 3807|     27|    break;
 3808|       |
 3809|  8.16k|  case 118: /* l2expr: l3expr  */
  ------------------
  |  Branch (3809:3): [True: 8.16k, False: 124k]
  ------------------
 3810|  8.16k|#line 722 "hexpr.y"
 3811|  8.16k|                            { (yyval.exp) = (yyvsp[0].exp); }
 3812|  8.16k|#line 3813 "hexpr.parse.C"
 3813|  8.16k|    break;
 3814|       |
 3815|    222|  case 119: /* l3expr: l3expr "+" l3expr  */
  ------------------
  |  Branch (3815:3): [True: 222, False: 132k]
  ------------------
 3816|    222|#line 724 "hexpr.y"
 3817|    222|                           { (yyval.exp) = TAPP2(var("+",m((yylsp[-1]))), (yyvsp[-2].exp), (yyvsp[0].exp), m((yylsp[-2]),(yylsp[0]))); }
  ------------------
  |  |  145|    222|#define TAPP2(fn,x0,x1,la)    new App(fn, list(ExprPtr(x0),ExprPtr(x1)), la)
  ------------------
 3818|    222|#line 3819 "hexpr.parse.C"
 3819|    222|    break;
 3820|       |
 3821|     76|  case 120: /* l3expr: l3expr "-" l3expr  */
  ------------------
  |  Branch (3821:3): [True: 76, False: 132k]
  ------------------
 3822|     76|#line 725 "hexpr.y"
 3823|     76|                           { (yyval.exp) = TAPP2(var("-",m((yylsp[-1]))), (yyvsp[-2].exp), (yyvsp[0].exp), m((yylsp[-2]),(yylsp[0]))); }
  ------------------
  |  |  145|     76|#define TAPP2(fn,x0,x1,la)    new App(fn, list(ExprPtr(x0),ExprPtr(x1)), la)
  ------------------
 3824|     76|#line 3825 "hexpr.parse.C"
 3825|     76|    break;
 3826|       |
 3827|     19|  case 121: /* l3expr: l3expr "++" l3expr  */
  ------------------
  |  Branch (3827:3): [True: 19, False: 132k]
  ------------------
 3828|     19|#line 726 "hexpr.y"
 3829|     19|                           { (yyval.exp) = TAPP2(var("append",m((yylsp[-1]))), (yyvsp[-2].exp), (yyvsp[0].exp), m((yylsp[-2]),(yylsp[0]))); }
  ------------------
  |  |  145|     19|#define TAPP2(fn,x0,x1,la)    new App(fn, list(ExprPtr(x0),ExprPtr(x1)), la)
  ------------------
 3830|     19|#line 3831 "hexpr.parse.C"
 3831|     19|    break;
 3832|       |
 3833|      3|  case 122: /* l3expr: "-" l3expr  */
  ------------------
  |  Branch (3833:3): [True: 3, False: 132k]
  ------------------
 3834|      3|#line 727 "hexpr.y"
 3835|      3|                           { (yyval.exp) = TAPP1(var("neg",m((yylsp[-1]))), ExprPtr((yyvsp[0].exp)), m((yylsp[-1]),(yylsp[0]))); }
  ------------------
  |  |  144|      3|#define TAPP1(fn,x0,la)       new App(fn, list(ExprPtr(x0)), la)
  ------------------
 3836|      3|#line 3837 "hexpr.parse.C"
 3837|      3|    break;
 3838|       |
 3839|  8.48k|  case 123: /* l3expr: l4expr  */
  ------------------
  |  Branch (3839:3): [True: 8.48k, False: 124k]
  ------------------
 3840|  8.48k|#line 728 "hexpr.y"
 3841|  8.48k|                           { (yyval.exp) = (yyvsp[0].exp); }
 3842|  8.48k|#line 3843 "hexpr.parse.C"
 3843|  8.48k|    break;
 3844|       |
 3845|     21|  case 124: /* l4expr: l4expr "*" l4expr  */
  ------------------
  |  Branch (3845:3): [True: 21, False: 132k]
  ------------------
 3846|     21|#line 730 "hexpr.y"
 3847|     21|                          { (yyval.exp) = TAPP2(var("*", m((yylsp[-1]))), (yyvsp[-2].exp), (yyvsp[0].exp), m((yylsp[-2]), (yylsp[0]))); }
  ------------------
  |  |  145|     21|#define TAPP2(fn,x0,x1,la)    new App(fn, list(ExprPtr(x0),ExprPtr(x1)), la)
  ------------------
 3848|     21|#line 3849 "hexpr.parse.C"
 3849|     21|    break;
 3850|       |
 3851|     23|  case 125: /* l4expr: l4expr "/" l4expr  */
  ------------------
  |  Branch (3851:3): [True: 23, False: 132k]
  ------------------
 3852|     23|#line 731 "hexpr.y"
 3853|     23|                          { (yyval.exp) = TAPP2(var("/", m((yylsp[-1]))), (yyvsp[-2].exp), (yyvsp[0].exp), m((yylsp[-2]), (yylsp[0]))); }
  ------------------
  |  |  145|     23|#define TAPP2(fn,x0,x1,la)    new App(fn, list(ExprPtr(x0),ExprPtr(x1)), la)
  ------------------
 3854|     23|#line 3855 "hexpr.parse.C"
 3855|     23|    break;
 3856|       |
 3857|      7|  case 126: /* l4expr: l4expr "%" l4expr  */
  ------------------
  |  Branch (3857:3): [True: 7, False: 132k]
  ------------------
 3858|      7|#line 732 "hexpr.y"
 3859|      7|                          { (yyval.exp) = TAPP2(var("%", m((yylsp[-1]))), (yyvsp[-2].exp), (yyvsp[0].exp), m((yylsp[-2]), (yylsp[0]))); }
  ------------------
  |  |  145|      7|#define TAPP2(fn,x0,x1,la)    new App(fn, list(ExprPtr(x0),ExprPtr(x1)), la)
  ------------------
 3860|      7|#line 3861 "hexpr.parse.C"
 3861|      7|    break;
 3862|       |
 3863|  8.53k|  case 127: /* l4expr: l5expr  */
  ------------------
  |  Branch (3863:3): [True: 8.53k, False: 123k]
  ------------------
 3864|  8.53k|#line 733 "hexpr.y"
 3865|  8.53k|                          { (yyval.exp) = (yyvsp[0].exp); }
 3866|  8.53k|#line 3867 "hexpr.parse.C"
 3867|  8.53k|    break;
 3868|       |
 3869|  7.89k|  case 128: /* l5expr: l6expr  */
  ------------------
  |  Branch (3869:3): [True: 7.89k, False: 124k]
  ------------------
 3870|  7.89k|#line 735 "hexpr.y"
 3871|  7.89k|               { (yyval.exp) = (yyvsp[0].exp); }
 3872|  7.89k|#line 3873 "hexpr.parse.C"
 3873|  7.89k|    break;
 3874|       |
 3875|     79|  case 129: /* l5expr: "let" letbindings "in" l0expr  */
  ------------------
  |  Branch (3875:3): [True: 79, False: 132k]
  ------------------
 3876|     79|#line 738 "hexpr.y"
 3877|     79|                                      { (yyval.exp) = compileNestedLetMatch(*(yyvsp[-2].letbindings), ExprPtr((yyvsp[0].exp)), m((yylsp[-3]),(yylsp[0]))); }
 3878|     79|#line 3879 "hexpr.parse.C"
 3879|     79|    break;
 3880|       |
 3881|      2|  case 130: /* l5expr: "let" letbindings ";" "in" l0expr  */
  ------------------
  |  Branch (3881:3): [True: 2, False: 132k]
  ------------------
 3882|      2|#line 739 "hexpr.y"
 3883|      2|                                          { (yyval.exp) = compileNestedLetMatch(*(yyvsp[-3].letbindings), ExprPtr((yyvsp[0].exp)), m((yylsp[-4]),(yylsp[0]))); }
 3884|      2|#line 3885 "hexpr.parse.C"
 3885|      2|    break;
 3886|       |
 3887|     56|  case 131: /* l5expr: "match" l6exprs "with" patternexps  */
  ------------------
  |  Branch (3887:3): [True: 56, False: 132k]
  ------------------
 3888|     56|#line 742 "hexpr.y"
 3889|     56|                                           { (yyval.exp) = compileMatch(yyParseCC, *(yyvsp[-2].exps), normPatternRules(*(yyvsp[0].patternexps), m((yylsp[-3]),(yylsp[0]))), m((yylsp[-3]),(yylsp[0])))->clone(); }
 3890|     56|#line 3891 "hexpr.parse.C"
 3891|     56|    break;
 3892|       |
 3893|      0|  case 132: /* l5expr: l6expr "matches" pattern  */
  ------------------
  |  Branch (3893:3): [True: 0, False: 132k]
  ------------------
 3894|      0|#line 745 "hexpr.y"
 3895|      0|                                 { (yyval.exp) = compileMatchTest(yyParseCC, ExprPtr((yyvsp[-2].exp)), PatternPtr((yyvsp[0].pattern)), m((yylsp[-2]),(yylsp[0])))->clone(); }
 3896|      0|#line 3897 "hexpr.parse.C"
 3897|      0|    break;
 3898|       |
 3899|      0|  case 133: /* l5expr: "parse" "{" prules "}"  */
  ------------------
  |  Branch (3899:3): [True: 0, False: 132k]
  ------------------
 3900|      0|#line 748 "hexpr.y"
 3901|      0|                               {
 3902|      0|        try {
 3903|      0|          (yyval.exp) = makeParser(yyParseCC, *(yyvsp[-1].prules), m((yylsp[-3]),(yylsp[0])))->clone();
 3904|      0|        } catch (hobbes::compile_table_failure& ctf) {
 3905|      0|          std::ostringstream ss;
 3906|      0|          ss << ctf.what() << std::endl;
 3907|      0|          ctf.print(ss);
 3908|      0|          throw annotated_error(m((yylsp[-3]),(yylsp[0])), ss.str());
 3909|      0|        }
 3910|      0|      }
 3911|      0|#line 3912 "hexpr.parse.C"
 3912|      0|    break;
 3913|       |
 3914|     77|  case 134: /* l5expr: "do" "{" dobindings "}"  */
  ------------------
  |  Branch (3914:3): [True: 77, False: 132k]
  ------------------
 3915|     77|#line 760 "hexpr.y"
 3916|     77|                                                { (yyval.exp) = compileNestedLetMatch(*(yyvsp[-1].letbindings), ExprPtr(new Unit(m((yylsp[-3]),(yylsp[0])))), m((yylsp[-3]),(yylsp[0]))); }
 3917|     77|#line 3918 "hexpr.parse.C"
 3918|     77|    break;
 3919|       |
 3920|     96|  case 135: /* l5expr: "do" "{" dobindings "return" l0expr "}"  */
  ------------------
  |  Branch (3920:3): [True: 96, False: 132k]
  ------------------
 3921|     96|#line 761 "hexpr.y"
 3922|     96|                                                { (yyval.exp) = compileNestedLetMatch(*(yyvsp[-3].letbindings), ExprPtr((yyvsp[-1].exp)), m((yylsp[-5]),(yylsp[0]))); }
 3923|     96|#line 3924 "hexpr.parse.C"
 3924|     96|    break;
 3925|       |
 3926|    328|  case 136: /* l5expr: l6expr "::" qtype  */
  ------------------
  |  Branch (3926:3): [True: 328, False: 132k]
  ------------------
 3927|    328|#line 764 "hexpr.y"
 3928|    328|                                { (yyval.exp) = new Assump(ExprPtr((yyvsp[-2].exp)), QualTypePtr((yyvsp[0].qualtype)), m((yylsp[-2]),(yylsp[0]))); }
 3929|    328|#line 3930 "hexpr.parse.C"
 3930|    328|    break;
 3931|       |
 3932|     48|  case 137: /* letbindings: letbindings ";" letbinding  */
  ------------------
  |  Branch (3932:3): [True: 48, False: 132k]
  ------------------
 3933|     48|#line 766 "hexpr.y"
 3934|     48|                                        { (yyvsp[-2].letbindings)->push_back(*(yyvsp[0].letbinding)); (yyval.letbindings) = (yyvsp[-2].letbindings); }
 3935|     48|#line 3936 "hexpr.parse.C"
 3936|     48|    break;
 3937|       |
 3938|     81|  case 138: /* letbindings: letbinding  */
  ------------------
  |  Branch (3938:3): [True: 81, False: 132k]
  ------------------
 3939|     81|#line 767 "hexpr.y"
 3940|     81|                                        { (yyval.letbindings) = autorelease(new LetBindings()); (yyval.letbindings)->push_back(*(yyvsp[0].letbinding)); }
 3941|     81|#line 3942 "hexpr.parse.C"
 3942|     81|    break;
 3943|       |
 3944|    129|  case 139: /* letbinding: irrefutablep "=" l1expr  */
  ------------------
  |  Branch (3944:3): [True: 129, False: 132k]
  ------------------
 3945|    129|#line 769 "hexpr.y"
 3946|    129|                                    { (yyval.letbinding) = autorelease(new LetBinding(PatternPtr((yyvsp[-2].pattern)), ExprPtr((yyvsp[0].exp)))); }
 3947|    129|#line 3948 "hexpr.parse.C"
 3948|    129|    break;
 3949|       |
 3950|    183|  case 140: /* dobindings: dobindings dobinding  */
  ------------------
  |  Branch (3950:3): [True: 183, False: 132k]
  ------------------
 3951|    183|#line 771 "hexpr.y"
 3952|    183|                                 { (yyval.letbindings) = (yyvsp[-1].letbindings); (yyval.letbindings)->push_back(*(yyvsp[0].letbinding)); }
 3953|    183|#line 3954 "hexpr.parse.C"
 3954|    183|    break;
 3955|       |
 3956|    173|  case 141: /* dobindings: dobinding  */
  ------------------
  |  Branch (3956:3): [True: 173, False: 132k]
  ------------------
 3957|    173|#line 772 "hexpr.y"
 3958|    173|                                 { (yyval.letbindings) = autorelease(new LetBindings()); (yyval.letbindings)->push_back(*(yyvsp[0].letbinding)); }
 3959|    173|#line 3960 "hexpr.parse.C"
 3960|    173|    break;
 3961|       |
 3962|     70|  case 142: /* dobinding: irrefutablep "=" l0expr ";"  */
  ------------------
  |  Branch (3962:3): [True: 70, False: 132k]
  ------------------
 3963|     70|#line 774 "hexpr.y"
 3964|     70|                                       { (yyval.letbinding) = autorelease(new LetBinding(PatternPtr((yyvsp[-3].pattern)), ExprPtr((yyvsp[-1].exp)))); }
 3965|     70|#line 3966 "hexpr.parse.C"
 3966|     70|    break;
 3967|       |
 3968|    286|  case 143: /* dobinding: l0expr ";"  */
  ------------------
  |  Branch (3968:3): [True: 286, False: 132k]
  ------------------
 3969|    286|#line 775 "hexpr.y"
 3970|    286|                                       { (yyval.letbinding) = autorelease(new LetBinding(PatternPtr(new MatchAny("_",m((yylsp[-1])))), ExprPtr((yyvsp[-1].exp)))); }
 3971|    286|#line 3972 "hexpr.parse.C"
 3972|    286|    break;
 3973|       |
 3974|      0|  case 144: /* cselconds: cselconds "," lhexpr  */
  ------------------
  |  Branch (3974:3): [True: 0, False: 132k]
  ------------------
 3975|      0|#line 777 "hexpr.y"
 3976|      0|                                { (yyval.exps) = (yyvsp[-2].exps); (yyval.exps)->push_back(ExprPtr((yyvsp[0].exp))); }
 3977|      0|#line 3978 "hexpr.parse.C"
 3978|      0|    break;
 3979|       |
 3980|      0|  case 145: /* cselconds: lhexpr  */
  ------------------
  |  Branch (3980:3): [True: 0, False: 132k]
  ------------------
 3981|      0|#line 778 "hexpr.y"
 3982|      0|                                { (yyval.exps) = autorelease(new Exprs()); (yyval.exps)->push_back(ExprPtr((yyvsp[0].exp))); }
 3983|      0|#line 3984 "hexpr.parse.C"
 3984|      0|    break;
 3985|       |
 3986|      0|  case 146: /* cselection: pattern "<-" l0expr "," cselconds  */
  ------------------
  |  Branch (3986:3): [True: 0, False: 132k]
  ------------------
 3987|      0|#line 780 "hexpr.y"
 3988|      0|                                              { (yyval.cselection) = new CSelection(); (yyval.cselection)->pat = PatternPtr((yyvsp[-4].pattern)); (yyval.cselection)->seq = ExprPtr((yyvsp[-2].exp)); (yyval.cselection)->conds = *(yyvsp[0].exps); }
 3989|      0|#line 3990 "hexpr.parse.C"
 3990|      0|    break;
 3991|       |
 3992|     19|  case 147: /* cselection: pattern "<-" l0expr  */
  ------------------
  |  Branch (3992:3): [True: 19, False: 132k]
  ------------------
 3993|     19|#line 781 "hexpr.y"
 3994|     19|                                              { (yyval.cselection) = new CSelection(); (yyval.cselection)->pat = PatternPtr((yyvsp[-2].pattern)); (yyval.cselection)->seq = ExprPtr((yyvsp[0].exp)); }
 3995|     19|#line 3996 "hexpr.parse.C"
 3996|     19|    break;
 3997|       |
 3998|      0|  case 148: /* cselections: cselections "|" cselection  */
  ------------------
  |  Branch (3998:3): [True: 0, False: 132k]
  ------------------
 3999|      0|#line 783 "hexpr.y"
 4000|      0|                                        { (yyval.cselections) = (yyvsp[-2].cselections); (yyval.cselections)->push_back(CSelectionPtr((yyvsp[0].cselection))); }
 4001|      0|#line 4002 "hexpr.parse.C"
 4002|      0|    break;
 4003|       |
 4004|     19|  case 149: /* cselections: cselection  */
  ------------------
  |  Branch (4004:3): [True: 19, False: 132k]
  ------------------
 4005|     19|#line 784 "hexpr.y"
 4006|     19|                                        { (yyval.cselections) = autorelease(new CSelections()); (yyval.cselections)->push_back(CSelectionPtr((yyvsp[0].cselection))); }
 4007|     19|#line 4008 "hexpr.parse.C"
 4008|     19|    break;
 4009|       |
 4010|  2.25k|  case 150: /* l6expr: l6expr "(" cargs ")"  */
  ------------------
  |  Branch (4010:3): [True: 2.25k, False: 130k]
  ------------------
 4011|  2.25k|#line 787 "hexpr.y"
 4012|  2.25k|                                { (yyval.exp) = new App(ExprPtr((yyvsp[-3].exp)), *(yyvsp[-1].exps), m((yylsp[-3]), (yylsp[0]))); }
 4013|  2.25k|#line 4014 "hexpr.parse.C"
 4014|  2.25k|    break;
 4015|       |
 4016|  6.62k|  case 151: /* l6expr: id  */
  ------------------
  |  Branch (4016:3): [True: 6.62k, False: 125k]
  ------------------
 4017|  6.62k|#line 788 "hexpr.y"
 4018|  6.62k|                                { (yyval.exp) = varCtorFn(*(yyvsp[0].string), m((yylsp[0]))); }
 4019|  6.62k|#line 4020 "hexpr.parse.C"
 4020|  6.62k|    break;
 4021|       |
 4022|      2|  case 152: /* l6expr: "[" l0expr ".." l0expr "]"  */
  ------------------
  |  Branch (4022:3): [True: 2, False: 132k]
  ------------------
 4023|      2|#line 791 "hexpr.y"
 4024|      2|                                                          { (yyval.exp) = new App(var("range", m((yylsp[-2]))), list(ExprPtr((yyvsp[-3].exp)), ExprPtr((yyvsp[-1].exp))), m((yylsp[-4]), (yylsp[0]))); }
 4025|      2|#line 4026 "hexpr.parse.C"
 4026|      2|    break;
 4027|       |
 4028|      0|  case 153: /* l6expr: "[" l0expr ".." "]"  */
  ------------------
  |  Branch (4028:3): [True: 0, False: 132k]
  ------------------
 4029|      0|#line 792 "hexpr.y"
 4030|      0|                                                          { (yyval.exp) = new App(var("iterateS", m((yylsp[-1]))), list(ExprPtr((yyvsp[-2].exp)), fn(str::strings(".x"), fncall(var("+", m((yylsp[-1]))), list(var(".x", m((yylsp[-1]))), ExprPtr(new Int(1, m((yylsp[-1]))))), m((yylsp[-1]))), m((yylsp[-1])))), m((yylsp[-3]), (yylsp[0]))); }
 4031|      0|#line 4032 "hexpr.parse.C"
 4032|      0|    break;
 4033|       |
 4034|     19|  case 154: /* l6expr: "[" l0expr "|" cselections "]"  */
  ------------------
  |  Branch (4034:3): [True: 19, False: 132k]
  ------------------
 4035|     19|#line 793 "hexpr.y"
 4036|     19|                                                          { (yyval.exp) = desugarComprehension(yyParseCC, ExprPtr((yyvsp[-3].exp)), *(yyvsp[-1].cselections), m((yylsp[-4]), (yylsp[0]))); }
 4037|     19|#line 4038 "hexpr.parse.C"
 4038|     19|    break;
 4039|       |
 4040|     33|  case 155: /* l6expr: "[" cargs "]"  */
  ------------------
  |  Branch (4040:3): [True: 33, False: 132k]
  ------------------
 4041|     33|#line 794 "hexpr.y"
 4042|     33|                                                          { (yyval.exp) = new MkArray(*(yyvsp[-1].exps), m((yylsp[-2]), (yylsp[0]))); }
 4043|     33|#line 4044 "hexpr.parse.C"
 4044|     33|    break;
 4045|       |
 4046|      0|  case 156: /* l6expr: l6expr "[" "timeV" "]"  */
  ------------------
  |  Branch (4046:3): [True: 0, False: 132k]
  ------------------
 4047|      0|#line 795 "hexpr.y"
 4048|      0|                                                          { (yyval.exp) = maybeArraySliceWithTime(ExprPtr((yyvsp[-3].exp)), *(yyvsp[-1].string), m((yylsp[-3]), (yylsp[0]))); }
 4049|      0|#line 4050 "hexpr.parse.C"
 4050|      0|    break;
 4051|       |
 4052|    193|  case 157: /* l6expr: l6expr "[" l0expr "]"  */
  ------------------
  |  Branch (4052:3): [True: 193, False: 132k]
  ------------------
 4053|    193|#line 796 "hexpr.y"
 4054|    193|                                                          { (yyval.exp) = mkAIndex(ExprPtr((yyvsp[-3].exp)), ExprPtr((yyvsp[-1].exp)), m((yylsp[-3]), (yylsp[0]))); }
 4055|    193|#line 4056 "hexpr.parse.C"
 4056|    193|    break;
 4057|       |
 4058|      4|  case 158: /* l6expr: l6expr "[" l0expr ":" l0expr "]"  */
  ------------------
  |  Branch (4058:3): [True: 4, False: 132k]
  ------------------
 4059|      4|#line 797 "hexpr.y"
 4060|      4|                                                          { (yyval.exp) = new App(var("slice", m((yylsp[-2]))), list(ExprPtr((yyvsp[-5].exp)), ExprPtr((yyvsp[-3].exp)), ExprPtr((yyvsp[-1].exp))), m((yylsp[-5]), (yylsp[0]))); }
 4061|      4|#line 4062 "hexpr.parse.C"
 4062|      4|    break;
 4063|       |
 4064|     18|  case 159: /* l6expr: l6expr "[" l0expr ":" "]"  */
  ------------------
  |  Branch (4064:3): [True: 18, False: 132k]
  ------------------
 4065|     18|#line 798 "hexpr.y"
 4066|     18|                                                          { std::string vn = freshName(); (yyval.exp) = new Let(vn, ExprPtr((yyvsp[-4].exp)), fncall(var("slice",m((yylsp[-1]))), list(var(vn,m((yylsp[-4]))), ExprPtr((yyvsp[-2].exp)), fncall(var("size",m((yylsp[-1]))), list(var(vn,m((yylsp[-4])))),m((yylsp[-4])))),m((yylsp[-4]),(yylsp[0]))), m((yylsp[-4]), (yylsp[0]))); }
 4067|     18|#line 4068 "hexpr.parse.C"
 4068|     18|    break;
 4069|       |
 4070|      0|  case 160: /* l6expr: l6expr "[" ":" l0expr "]"  */
  ------------------
  |  Branch (4070:3): [True: 0, False: 132k]
  ------------------
 4071|      0|#line 799 "hexpr.y"
 4072|      0|                                                          { std::string vn = freshName(); (yyval.exp) = new Let(vn, ExprPtr((yyvsp[-4].exp)), fncall(var("slice",m((yylsp[-2]))), list(var(vn,m((yylsp[-4]))), fncall(var("size",m((yylsp[-2]))), list(var(vn,m((yylsp[-2])))),m((yylsp[-4]))), ExprPtr((yyvsp[-1].exp))), m((yylsp[-4]),(yylsp[0]))), m((yylsp[-4]), (yylsp[0]))); }
 4073|      0|#line 4074 "hexpr.parse.C"
 4074|      0|    break;
 4075|       |
 4076|      0|  case 161: /* l6expr: "|" id "=" l0expr "|"  */
  ------------------
  |  Branch (4076:3): [True: 0, False: 132k]
  ------------------
 4077|      0|#line 802 "hexpr.y"
 4078|      0|                                                              { (yyval.exp) = new MkVariant(*(yyvsp[-3].string), ExprPtr((yyvsp[-1].exp)), m((yylsp[-4]), (yylsp[0]))); }
 4079|      0|#line 4080 "hexpr.parse.C"
 4080|      0|    break;
 4081|       |
 4082|     40|  case 162: /* l6expr: "|" "intV" "=" l0expr "|"  */
  ------------------
  |  Branch (4082:3): [True: 40, False: 132k]
  ------------------
 4083|     40|#line 803 "hexpr.y"
 4084|     40|                                                              { (yyval.exp) = new MkVariant(".f" + str::from((yyvsp[-3].intv)), ExprPtr((yyvsp[-1].exp)), m((yylsp[-4]), (yylsp[0]))); }
 4085|     40|#line 4086 "hexpr.parse.C"
 4086|     40|    break;
 4087|       |
 4088|      0|  case 163: /* l6expr: "|" id "|"  */
  ------------------
  |  Branch (4088:3): [True: 0, False: 132k]
  ------------------
 4089|      0|#line 804 "hexpr.y"
 4090|      0|                                                              { (yyval.exp) = new MkVariant(*(yyvsp[-1].string), ExprPtr(new Unit(m((yylsp[-1])))), m((yylsp[-2]), (yylsp[0]))); }
 4091|      0|#line 4092 "hexpr.parse.C"
 4092|      0|    break;
 4093|       |
 4094|     62|  case 164: /* l6expr: "case" l0expr "of" "|" varfields "|"  */
  ------------------
  |  Branch (4094:3): [True: 62, False: 132k]
  ------------------
 4095|     62|#line 805 "hexpr.y"
 4096|     62|                                                              { (yyval.exp) = new Case(ExprPtr((yyvsp[-4].exp)), *(yyvsp[-1].vfields), m((yylsp[-5]), (yylsp[0]))); }
 4097|     62|#line 4098 "hexpr.parse.C"
 4098|     62|    break;
 4099|       |
 4100|      0|  case 165: /* l6expr: "case" l0expr "of" "|" varfields "|" "default" l0expr  */
  ------------------
  |  Branch (4100:3): [True: 0, False: 132k]
  ------------------
 4101|      0|#line 806 "hexpr.y"
 4102|      0|                                                              { (yyval.exp) = new Case(ExprPtr((yyvsp[-6].exp)), *(yyvsp[-3].vfields), ExprPtr((yyvsp[0].exp)), m((yylsp[-7]), (yylsp[0]))); }
 4103|      0|#line 4104 "hexpr.parse.C"
 4104|      0|    break;
 4105|       |
 4106|      4|  case 166: /* l6expr: "{" recfields "}"  */
  ------------------
  |  Branch (4106:3): [True: 4, False: 132k]
  ------------------
 4107|      4|#line 809 "hexpr.y"
 4108|      4|                              { if ((yyvsp[-1].rfields)->size() > 0) { (yyval.exp) = new MkRecord(*(yyvsp[-1].rfields), m((yylsp[-2]), (yylsp[0]))); } else { (yyval.exp) = new Unit(m((yylsp[-2]), (yylsp[0]))); } }
  ------------------
  |  Branch (4108:37): [True: 4, False: 0]
  ------------------
 4109|      4|#line 4110 "hexpr.parse.C"
 4110|      4|    break;
 4111|       |
 4112|      0|  case 167: /* l6expr: "{" recfields "," "}"  */
  ------------------
  |  Branch (4112:3): [True: 0, False: 132k]
  ------------------
 4113|      0|#line 810 "hexpr.y"
 4114|      0|                              { if ((yyvsp[-2].rfields)->size() > 0) { (yyval.exp) = new MkRecord(*(yyvsp[-2].rfields), m((yylsp[-3]), (yylsp[0]))); } else { (yyval.exp) = new Unit(m((yylsp[-3]), (yylsp[0]))); } }
  ------------------
  |  Branch (4114:37): [True: 0, False: 0]
  ------------------
 4115|      0|#line 4116 "hexpr.parse.C"
 4116|      0|    break;
 4117|       |
 4118|    261|  case 168: /* l6expr: l6expr recfieldpath  */
  ------------------
  |  Branch (4118:3): [True: 261, False: 132k]
  ------------------
 4119|    261|#line 811 "hexpr.y"
 4120|    261|                              { (yyval.exp) = makeProjSeq((yyvsp[-1].exp), *(yyvsp[0].strings), m((yylsp[-1]), (yylsp[0]))); }
 4121|    261|#line 4122 "hexpr.parse.C"
 4122|    261|    break;
 4123|       |
 4124|      7|  case 169: /* l6expr: recfieldpath  */
  ------------------
  |  Branch (4124:3): [True: 7, False: 132k]
  ------------------
 4125|      7|#line 814 "hexpr.y"
 4126|      7|                     { (yyval.exp) = new Fn(str::strings("x"), proj(var("x", m((yylsp[0]))), *(yyvsp[0].strings), m((yylsp[0]))), m((yylsp[0]))); }
 4127|      7|#line 4128 "hexpr.parse.C"
 4128|      7|    break;
 4129|       |
 4130|      0|  case 170: /* l6expr: "regexV"  */
  ------------------
  |  Branch (4130:3): [True: 0, False: 132k]
  ------------------
 4131|      0|#line 817 "hexpr.y"
 4132|      0|                 { (yyval.exp) = compileRegexFn(yyParseCC, std::string((yyvsp[0].string)->begin() + 1, (yyvsp[0].string)->end() - 1), m((yylsp[0])))->clone(); }
 4133|      0|#line 4134 "hexpr.parse.C"
 4134|      0|    break;
 4135|       |
 4136|      0|  case 171: /* l6expr: "pack" l6expr  */
  ------------------
  |  Branch (4136:3): [True: 0, False: 132k]
  ------------------
 4137|      0|#line 820 "hexpr.y"
 4138|      0|                                           { (yyval.exp) = new Pack(ExprPtr((yyvsp[0].exp)), m((yylsp[-1]), (yylsp[0]))); }
 4139|      0|#line 4140 "hexpr.parse.C"
 4140|      0|    break;
 4141|       |
 4142|      2|  case 172: /* l6expr: "unpack" id "=" l6expr "in" l6expr  */
  ------------------
  |  Branch (4142:3): [True: 2, False: 132k]
  ------------------
 4143|      2|#line 821 "hexpr.y"
 4144|      2|                                           { (yyval.exp) = new Unpack(*(yyvsp[-4].string), ExprPtr((yyvsp[-2].exp)), ExprPtr((yyvsp[0].exp)), m((yylsp[-5]), (yylsp[0]))); }
 4145|      2|#line 4146 "hexpr.parse.C"
 4146|      2|    break;
 4147|       |
 4148|     88|  case 173: /* l6expr: "boolV"  */
  ------------------
  |  Branch (4148:3): [True: 88, False: 132k]
  ------------------
 4149|     88|#line 824 "hexpr.y"
 4150|     88|                    { (yyval.exp) = new Bool((yyvsp[0].boolv), m((yylsp[0]))); }
 4151|     88|#line 4152 "hexpr.parse.C"
 4152|     88|    break;
 4153|       |
 4154|     49|  case 174: /* l6expr: "charV"  */
  ------------------
  |  Branch (4154:3): [True: 49, False: 132k]
  ------------------
 4155|     49|#line 825 "hexpr.y"
 4156|     49|                    { (yyval.exp) = new Char(str::readCharDef(*(yyvsp[0].string)), m((yylsp[0]))); }
 4157|     49|#line 4158 "hexpr.parse.C"
 4158|     49|    break;
 4159|       |
 4160|     12|  case 175: /* l6expr: "byteV"  */
  ------------------
  |  Branch (4160:3): [True: 12, False: 132k]
  ------------------
 4161|     12|#line 826 "hexpr.y"
 4162|     12|                    { (yyval.exp) = new Byte(str::dehex(*(yyvsp[0].string)), m((yylsp[0]))); }
 4163|     12|#line 4164 "hexpr.parse.C"
 4164|     12|    break;
 4165|       |
 4166|      1|  case 176: /* l6expr: "bytesV"  */
  ------------------
  |  Branch (4166:3): [True: 1, False: 132k]
  ------------------
 4167|      1|#line 827 "hexpr.y"
 4168|      1|                    { (yyval.exp) = mkarray(str::dehexs(*(yyvsp[0].string)), m((yylsp[0]))); }
 4169|      1|#line 4170 "hexpr.parse.C"
 4170|      1|    break;
 4171|       |
 4172|      3|  case 177: /* l6expr: "shortV"  */
  ------------------
  |  Branch (4172:3): [True: 3, False: 132k]
  ------------------
 4173|      3|#line 828 "hexpr.y"
 4174|      3|                    { (yyval.exp) = new Short((yyvsp[0].shortv), m((yylsp[0]))); }
 4175|      3|#line 4176 "hexpr.parse.C"
 4176|      3|    break;
 4177|       |
 4178|    192|  case 178: /* l6expr: "intV"  */
  ------------------
  |  Branch (4178:3): [True: 192, False: 132k]
  ------------------
 4179|    192|#line 829 "hexpr.y"
 4180|    192|                    { (yyval.exp) = new Int((yyvsp[0].intv), m((yylsp[0]))); }
 4181|    192|#line 4182 "hexpr.parse.C"
 4182|    192|    break;
 4183|       |
 4184|    360|  case 179: /* l6expr: "longV"  */
  ------------------
  |  Branch (4184:3): [True: 360, False: 132k]
  ------------------
 4185|    360|#line 830 "hexpr.y"
 4186|    360|                    { (yyval.exp) = new Long((yyvsp[0].longv), m((yylsp[0]))); }
 4187|    360|#line 4188 "hexpr.parse.C"
 4188|    360|    break;
 4189|       |
 4190|      2|  case 180: /* l6expr: "int128V"  */
  ------------------
  |  Branch (4190:3): [True: 2, False: 132k]
  ------------------
 4191|      2|#line 831 "hexpr.y"
 4192|      2|                    { (yyval.exp) = new Int128((yyvsp[0].int128v), m((yylsp[0]))); }
 4193|      2|#line 4194 "hexpr.parse.C"
 4194|      2|    break;
 4195|       |
 4196|      2|  case 181: /* l6expr: "floatV"  */
  ------------------
  |  Branch (4196:3): [True: 2, False: 132k]
  ------------------
 4197|      2|#line 832 "hexpr.y"
 4198|      2|                    { (yyval.exp) = new Float((yyvsp[0].floatv), m((yylsp[0]))); }
 4199|      2|#line 4200 "hexpr.parse.C"
 4200|      2|    break;
 4201|       |
 4202|      2|  case 182: /* l6expr: "doubleV"  */
  ------------------
  |  Branch (4202:3): [True: 2, False: 132k]
  ------------------
 4203|      2|#line 833 "hexpr.y"
 4204|      2|                    { (yyval.exp) = new Double((yyvsp[0].doublev), m((yylsp[0]))); }
 4205|      2|#line 4206 "hexpr.parse.C"
 4206|      2|    break;
 4207|       |
 4208|     75|  case 183: /* l6expr: "stringV"  */
  ------------------
  |  Branch (4208:3): [True: 75, False: 132k]
  ------------------
 4209|     75|#line 834 "hexpr.y"
 4210|     75|                    { (yyval.exp) = mkarray(str::unescape(str::trimq(*(yyvsp[0].string))), m((yylsp[0]))); }
 4211|     75|#line 4212 "hexpr.parse.C"
 4212|     75|    break;
 4213|       |
 4214|      1|  case 184: /* l6expr: tsseq  */
  ------------------
  |  Branch (4214:3): [True: 1, False: 132k]
  ------------------
 4215|      1|#line 835 "hexpr.y"
 4216|      1|                    { (yyval.exp) = mkTimespanExpr(*(yyvsp[0].strings), m((yylsp[0])))->clone(); }
 4217|      1|#line 4218 "hexpr.parse.C"
 4218|      1|    break;
 4219|       |
 4220|      0|  case 185: /* l6expr: "timeV"  */
  ------------------
  |  Branch (4220:3): [True: 0, False: 132k]
  ------------------
 4221|      0|#line 836 "hexpr.y"
 4222|      0|                    { (yyval.exp) = mkTimeExpr(*(yyvsp[0].string), m((yylsp[0])))->clone(); }
 4223|      0|#line 4224 "hexpr.parse.C"
 4224|      0|    break;
 4225|       |
 4226|      0|  case 186: /* l6expr: "dateTimeV"  */
  ------------------
  |  Branch (4226:3): [True: 0, False: 132k]
  ------------------
 4227|      0|#line 837 "hexpr.y"
 4228|      0|                    { (yyval.exp) = mkDateTimeExpr(*(yyvsp[0].string), m((yylsp[0])))->clone(); }
 4229|      0|#line 4230 "hexpr.parse.C"
 4230|      0|    break;
 4231|       |
 4232|    714|  case 187: /* l6expr: "(" cargs ")"  */
  ------------------
  |  Branch (4232:3): [True: 714, False: 131k]
  ------------------
 4233|    714|#line 840 "hexpr.y"
 4234|    714|                      { (yyval.exp) = pickNestedExp((yyvsp[-1].exps), m((yylsp[-2]),(yylsp[0]))); }
 4235|    714|#line 4236 "hexpr.parse.C"
 4236|    714|    break;
 4237|       |
 4238|      0|  case 188: /* l6expr: "(" "++" ")"  */
  ------------------
  |  Branch (4238:3): [True: 0, False: 132k]
  ------------------
 4239|      0|#line 843 "hexpr.y"
 4240|      0|                      { (yyval.exp) = new Var("append", m((yylsp[-1]))); }
 4241|      0|#line 4242 "hexpr.parse.C"
 4242|      0|    break;
 4243|       |
 4244|      1|  case 189: /* l6expr: "(" "+" ")"  */
  ------------------
  |  Branch (4244:3): [True: 1, False: 132k]
  ------------------
 4245|      1|#line 844 "hexpr.y"
 4246|      1|                      { (yyval.exp) = new Var("+",      m((yylsp[-1]))); }
 4247|      1|#line 4248 "hexpr.parse.C"
 4248|      1|    break;
 4249|       |
 4250|      0|  case 190: /* l6expr: "(" "-" ")"  */
  ------------------
  |  Branch (4250:3): [True: 0, False: 132k]
  ------------------
 4251|      0|#line 845 "hexpr.y"
 4252|      0|                      { (yyval.exp) = new Var("-",      m((yylsp[-1]))); }
 4253|      0|#line 4254 "hexpr.parse.C"
 4254|      0|    break;
 4255|       |
 4256|      0|  case 191: /* l6expr: "(" "*" ")"  */
  ------------------
  |  Branch (4256:3): [True: 0, False: 132k]
  ------------------
 4257|      0|#line 846 "hexpr.y"
 4258|      0|                      { (yyval.exp) = new Var("*",      m((yylsp[-1]))); }
 4259|      0|#line 4260 "hexpr.parse.C"
 4260|      0|    break;
 4261|       |
 4262|      0|  case 192: /* l6expr: "(" "/" ")"  */
  ------------------
  |  Branch (4262:3): [True: 0, False: 132k]
  ------------------
 4263|      0|#line 847 "hexpr.y"
 4264|      0|                      { (yyval.exp) = new Var("/",      m((yylsp[-1]))); }
 4265|      0|#line 4266 "hexpr.parse.C"
 4266|      0|    break;
 4267|       |
 4268|      0|  case 193: /* l6expr: "(" "%" ")"  */
  ------------------
  |  Branch (4268:3): [True: 0, False: 132k]
  ------------------
 4269|      0|#line 848 "hexpr.y"
 4270|      0|                      { (yyval.exp) = new Var("%",      m((yylsp[-1]))); }
 4271|      0|#line 4272 "hexpr.parse.C"
 4272|      0|    break;
 4273|       |
 4274|      0|  case 194: /* l6expr: "(" "~" ")"  */
  ------------------
  |  Branch (4274:3): [True: 0, False: 132k]
  ------------------
 4275|      0|#line 849 "hexpr.y"
 4276|      0|                      { (yyval.exp) = new Var("~",      m((yylsp[-1]))); }
 4277|      0|#line 4278 "hexpr.parse.C"
 4278|      0|    break;
 4279|       |
 4280|      1|  case 195: /* l6expr: "(" "===" ")"  */
  ------------------
  |  Branch (4280:3): [True: 1, False: 132k]
  ------------------
 4281|      1|#line 850 "hexpr.y"
 4282|      1|                      { (yyval.exp) = new Var("===",    m((yylsp[-1]))); }
 4283|      1|#line 4284 "hexpr.parse.C"
 4284|      1|    break;
 4285|       |
 4286|      0|  case 196: /* l6expr: "(" "==" ")"  */
  ------------------
  |  Branch (4286:3): [True: 0, False: 132k]
  ------------------
 4287|      0|#line 851 "hexpr.y"
 4288|      0|                      { (yyval.exp) = new Var("==",     m((yylsp[-1]))); }
 4289|      0|#line 4290 "hexpr.parse.C"
 4290|      0|    break;
 4291|       |
 4292|      0|  case 197: /* l6expr: "(" "!=" ")"  */
  ------------------
  |  Branch (4292:3): [True: 0, False: 132k]
  ------------------
 4293|      0|#line 852 "hexpr.y"
 4294|      0|                      { (yyval.exp) = new Var("!=",     m((yylsp[-1]))); }
 4295|      0|#line 4296 "hexpr.parse.C"
 4296|      0|    break;
 4297|       |
 4298|      0|  case 198: /* l6expr: "(" "<" ")"  */
  ------------------
  |  Branch (4298:3): [True: 0, False: 132k]
  ------------------
 4299|      0|#line 853 "hexpr.y"
 4300|      0|                      { (yyval.exp) = new Var("<",      m((yylsp[-1]))); }
 4301|      0|#line 4302 "hexpr.parse.C"
 4302|      0|    break;
 4303|       |
 4304|      0|  case 199: /* l6expr: "(" ">" ")"  */
  ------------------
  |  Branch (4304:3): [True: 0, False: 132k]
  ------------------
 4305|      0|#line 854 "hexpr.y"
 4306|      0|                      { (yyval.exp) = new Var(">",      m((yylsp[-1]))); }
 4307|      0|#line 4308 "hexpr.parse.C"
 4308|      0|    break;
 4309|       |
 4310|      0|  case 200: /* l6expr: "(" ">=" ")"  */
  ------------------
  |  Branch (4310:3): [True: 0, False: 132k]
  ------------------
 4311|      0|#line 855 "hexpr.y"
 4312|      0|                      { (yyval.exp) = new Var(">=",     m((yylsp[-1]))); }
 4313|      0|#line 4314 "hexpr.parse.C"
 4314|      0|    break;
 4315|       |
 4316|      0|  case 201: /* l6expr: "(" "<=" ")"  */
  ------------------
  |  Branch (4316:3): [True: 0, False: 132k]
  ------------------
 4317|      0|#line 856 "hexpr.y"
 4318|      0|                      { (yyval.exp) = new Var("<=",     m((yylsp[-1]))); }
 4319|      0|#line 4320 "hexpr.parse.C"
 4320|      0|    break;
 4321|       |
 4322|      0|  case 202: /* l6expr: "(" "and" ")"  */
  ------------------
  |  Branch (4322:3): [True: 0, False: 132k]
  ------------------
 4323|      0|#line 857 "hexpr.y"
 4324|      0|                      { (yyval.exp) = new Var("and",    m((yylsp[-1]))); }
 4325|      0|#line 4326 "hexpr.parse.C"
 4326|      0|    break;
 4327|       |
 4328|      0|  case 203: /* l6expr: "(" "or" ")"  */
  ------------------
  |  Branch (4328:3): [True: 0, False: 132k]
  ------------------
 4329|      0|#line 858 "hexpr.y"
 4330|      0|                      { (yyval.exp) = new Var("or",     m((yylsp[-1]))); }
 4331|      0|#line 4332 "hexpr.parse.C"
 4332|      0|    break;
 4333|       |
 4334|      0|  case 204: /* l6expr: "(" "in" ")"  */
  ------------------
  |  Branch (4334:3): [True: 0, False: 132k]
  ------------------
 4335|      0|#line 859 "hexpr.y"
 4336|      0|                      { (yyval.exp) = new Var("in",     m((yylsp[-1]))); }
 4337|      0|#line 4338 "hexpr.parse.C"
 4338|      0|    break;
 4339|       |
 4340|      0|  case 205: /* l6expr: "(" "!" ")"  */
  ------------------
  |  Branch (4340:3): [True: 0, False: 132k]
  ------------------
 4341|      0|#line 860 "hexpr.y"
 4342|      0|                      { (yyval.exp) = new Var("not",    m((yylsp[-1]))); }
 4343|      0|#line 4344 "hexpr.parse.C"
 4344|      0|    break;
 4345|       |
 4346|      0|  case 206: /* l6expr: "`" l0expr "`"  */
  ------------------
  |  Branch (4346:3): [True: 0, False: 132k]
  ------------------
 4347|      0|#line 863 "hexpr.y"
 4348|      0|                       { (yyval.exp) = new Assump(fncall(var("unsafeCast", m((yylsp[-1]))), list(mktunit(m((yylsp[-1])))), m((yylsp[-1]))), qualtype(quotedExprType((yyvsp[-1].exp))), m((yylsp[-1]))); }
 4349|      0|#line 4350 "hexpr.parse.C"
 4350|      0|    break;
 4351|       |
 4352|      0|  case 207: /* prules: prules prule  */
  ------------------
  |  Branch (4352:3): [True: 0, False: 132k]
  ------------------
 4353|      0|#line 865 "hexpr.y"
 4354|      0|                     { (yyval.prules) = (yyvsp[-1].prules); (yyval.prules)->push_back(*(yyvsp[0].prule)); }
 4355|      0|#line 4356 "hexpr.parse.C"
 4356|      0|    break;
 4357|       |
 4358|      0|  case 208: /* prules: prule  */
  ------------------
  |  Branch (4358:3): [True: 0, False: 132k]
  ------------------
 4359|      0|#line 866 "hexpr.y"
 4360|      0|                     { (yyval.prules) = autorelease(new Grammar()); (yyval.prules)->push_back(*(yyvsp[0].prule)); }
 4361|      0|#line 4362 "hexpr.parse.C"
 4362|      0|    break;
 4363|       |
 4364|      0|  case 209: /* prule: id ":=" prdefs  */
  ------------------
  |  Branch (4364:3): [True: 0, False: 132k]
  ------------------
 4365|      0|#line 868 "hexpr.y"
 4366|      0|                      { (yyval.prule) = autorelease(new Grammar::value_type(*(yyvsp[-2].string), *(yyvsp[0].prdefs))); }
 4367|      0|#line 4368 "hexpr.parse.C"
 4368|      0|    break;
 4369|       |
 4370|      0|  case 210: /* prdefs: prdefs "|" prdef  */
  ------------------
  |  Branch (4370:3): [True: 0, False: 132k]
  ------------------
 4371|      0|#line 870 "hexpr.y"
 4372|      0|                         { (yyval.prdefs) = (yyvsp[-2].prdefs); (yyval.prdefs)->push_back(*(yyvsp[0].prdef)); }
 4373|      0|#line 4374 "hexpr.parse.C"
 4374|      0|    break;
 4375|       |
 4376|      0|  case 211: /* prdefs: prdef  */
  ------------------
  |  Branch (4376:3): [True: 0, False: 132k]
  ------------------
 4377|      0|#line 871 "hexpr.y"
 4378|      0|                         { (yyval.prdefs) = autorelease(new GrammarRules()); (yyval.prdefs)->push_back(*(yyvsp[0].prdef)); }
 4379|      0|#line 4380 "hexpr.parse.C"
 4380|      0|    break;
 4381|       |
 4382|      0|  case 212: /* prdef: pbelems "{" l0expr "}"  */
  ------------------
  |  Branch (4382:3): [True: 0, False: 132k]
  ------------------
 4383|      0|#line 873 "hexpr.y"
 4384|      0|                              { (yyval.prdef) = autorelease(new GrammarRule(*(yyvsp[-3].pbelems), ExprPtr((yyvsp[-1].exp)))); }
 4385|      0|#line 4386 "hexpr.parse.C"
 4386|      0|    break;
 4387|       |
 4388|      0|  case 213: /* pbelems: pbelems pbelem  */
  ------------------
  |  Branch (4388:3): [True: 0, False: 132k]
  ------------------
 4389|      0|#line 875 "hexpr.y"
 4390|      0|                        { (yyval.pbelems) = (yyvsp[-1].pbelems); (yyval.pbelems)->push_back(*(yyvsp[0].pbelem)); }
 4391|      0|#line 4392 "hexpr.parse.C"
 4392|      0|    break;
 4393|       |
 4394|      0|  case 214: /* pbelems: %empty  */
  ------------------
  |  Branch (4394:3): [True: 0, False: 132k]
  ------------------
 4395|      0|#line 876 "hexpr.y"
 4396|      0|                        { (yyval.pbelems) = autorelease(new BoundGrammarValues()); }
 4397|      0|#line 4398 "hexpr.parse.C"
 4398|      0|    break;
 4399|       |
 4400|      0|  case 215: /* pbelem: id ":" pvalue  */
  ------------------
  |  Branch (4400:3): [True: 0, False: 132k]
  ------------------
 4401|      0|#line 878 "hexpr.y"
 4402|      0|                      { (yyval.pbelem) = autorelease(new BoundGrammarValue(*(yyvsp[-2].string), GrammarValuePtr((yyvsp[0].pvalue)))); }
 4403|      0|#line 4404 "hexpr.parse.C"
 4404|      0|    break;
 4405|       |
 4406|      0|  case 216: /* pbelem: pvalue  */
  ------------------
  |  Branch (4406:3): [True: 0, False: 132k]
  ------------------
 4407|      0|#line 879 "hexpr.y"
 4408|      0|                      { (yyval.pbelem) = autorelease(new BoundGrammarValue("_", GrammarValuePtr((yyvsp[0].pvalue)))); }
 4409|      0|#line 4410 "hexpr.parse.C"
 4410|      0|    break;
 4411|       |
 4412|      0|  case 217: /* pvalue: id  */
  ------------------
  |  Branch (4412:3): [True: 0, False: 132k]
  ------------------
 4413|      0|#line 881 "hexpr.y"
 4414|      0|                      { (yyval.pvalue) = new GSymRef(*(yyvsp[0].string), m((yylsp[0]))); }
 4415|      0|#line 4416 "hexpr.parse.C"
 4416|      0|    break;
 4417|       |
 4418|      0|  case 218: /* pvalue: "stringV"  */
  ------------------
  |  Branch (4418:3): [True: 0, False: 132k]
  ------------------
 4419|      0|#line 882 "hexpr.y"
 4420|      0|                      { (yyval.pvalue) = new GStr(str::unescape(str::trimq(*(yyvsp[0].string))), m((yylsp[0]))); }
 4421|      0|#line 4422 "hexpr.parse.C"
 4422|      0|    break;
 4423|       |
 4424|      0|  case 219: /* pvalue: "charV"  */
  ------------------
  |  Branch (4424:3): [True: 0, False: 132k]
  ------------------
 4425|      0|#line 883 "hexpr.y"
 4426|      0|                      { (yyval.pvalue) = new GStr(std::string(1, str::readCharDef(*(yyvsp[0].string))), m((yylsp[0]))); }
 4427|      0|#line 4428 "hexpr.parse.C"
 4428|      0|    break;
 4429|       |
 4430|      1|  case 220: /* tsseq: "timespanV"  */
  ------------------
  |  Branch (4430:3): [True: 1, False: 132k]
  ------------------
 4431|      1|#line 885 "hexpr.y"
 4432|      1|                         { (yyval.strings) = autorelease(new str::seq()); (yyval.strings)->push_back(*(yyvsp[0].string)); }
 4433|      1|#line 4434 "hexpr.parse.C"
 4434|      1|    break;
 4435|       |
 4436|      0|  case 221: /* tsseq: tsseq "timespanV"  */
  ------------------
  |  Branch (4436:3): [True: 0, False: 132k]
  ------------------
 4437|      0|#line 886 "hexpr.y"
 4438|      0|                         { (yyval.strings) = (yyvsp[-1].strings); (yyval.strings)->push_back(*(yyvsp[0].string)); }
 4439|      0|#line 4440 "hexpr.parse.C"
 4440|      0|    break;
 4441|       |
 4442|     13|  case 222: /* l6exprs: l6exprs l6expr  */
  ------------------
  |  Branch (4442:3): [True: 13, False: 132k]
  ------------------
 4443|     13|#line 888 "hexpr.y"
 4444|     13|                        { (yyval.exps) = (yyvsp[-1].exps); (yyval.exps)->push_back(ExprPtr((yyvsp[0].exp))); }
 4445|     13|#line 4446 "hexpr.parse.C"
 4446|     13|    break;
 4447|       |
 4448|     56|  case 223: /* l6exprs: l6expr  */
  ------------------
  |  Branch (4448:3): [True: 56, False: 132k]
  ------------------
 4449|     56|#line 889 "hexpr.y"
 4450|     56|                        { (yyval.exps) = autorelease(new Exprs()); (yyval.exps)->push_back(ExprPtr((yyvsp[0].exp))); }
 4451|     56|#line 4452 "hexpr.parse.C"
 4452|     56|    break;
 4453|       |
 4454|     85|  case 224: /* patternexps: patternexps patternexp  */
  ------------------
  |  Branch (4454:3): [True: 85, False: 132k]
  ------------------
 4455|     85|#line 891 "hexpr.y"
 4456|     85|                                    { (yyval.patternexps) = (yyvsp[-1].patternexps); (yyval.patternexps)->push_back(*(yyvsp[0].patternexp)); }
 4457|     85|#line 4458 "hexpr.parse.C"
 4458|     85|    break;
 4459|       |
 4460|     56|  case 225: /* patternexps: patternexp  */
  ------------------
  |  Branch (4460:3): [True: 56, False: 132k]
  ------------------
 4461|     56|#line 892 "hexpr.y"
 4462|     56|                                    { (yyval.patternexps) = autorelease(new PatternRows()); (yyval.patternexps)->push_back(*(yyvsp[0].patternexp)); }
 4463|     56|#line 4464 "hexpr.parse.C"
 4464|     56|    break;
 4465|       |
 4466|    135|  case 226: /* patternexp: "|" patterns "->" l0expr  */
  ------------------
  |  Branch (4466:3): [True: 135, False: 132k]
  ------------------
 4467|    135|#line 894 "hexpr.y"
 4468|    135|                                                    { (yyval.patternexp) = autorelease(new PatternRow(*(yyvsp[-2].patterns), ExprPtr((yyvsp[0].exp)))); }
 4469|    135|#line 4470 "hexpr.parse.C"
 4470|    135|    break;
 4471|       |
 4472|      6|  case 227: /* patternexp: "|" patterns "where" l0expr "->" l0expr  */
  ------------------
  |  Branch (4472:3): [True: 6, False: 132k]
  ------------------
 4473|      6|#line 895 "hexpr.y"
 4474|      6|                                                    { (yyval.patternexp) = autorelease(new PatternRow(*(yyvsp[-4].patterns), ExprPtr((yyvsp[-2].exp)), ExprPtr((yyvsp[0].exp)))); }
 4475|      6|#line 4476 "hexpr.parse.C"
 4476|      6|    break;
 4477|       |
 4478|     86|  case 228: /* patterns: patterns pattern  */
  ------------------
  |  Branch (4478:3): [True: 86, False: 132k]
  ------------------
 4479|     86|#line 898 "hexpr.y"
 4480|     86|                           { (yyval.patterns) = (yyvsp[-1].patterns); (yyval.patterns)->push_back(PatternPtr((yyvsp[0].pattern))); }
 4481|     86|#line 4482 "hexpr.parse.C"
 4482|     86|    break;
 4483|       |
 4484|    250|  case 229: /* patterns: pattern  */
  ------------------
  |  Branch (4484:3): [True: 250, False: 132k]
  ------------------
 4485|    250|#line 899 "hexpr.y"
 4486|    250|                           { (yyval.patterns) = autorelease(new Patterns()); (yyval.patterns)->push_back(PatternPtr((yyvsp[0].pattern))); }
 4487|    250|#line 4488 "hexpr.parse.C"
 4488|    250|    break;
 4489|       |
 4490|      8|  case 230: /* refutablep: "boolV"  */
  ------------------
  |  Branch (4490:3): [True: 8, False: 132k]
  ------------------
 4491|      8|#line 901 "hexpr.y"
 4492|      8|                                       { (yyval.pattern) = new MatchLiteral(PrimitivePtr(new Bool((yyvsp[0].boolv), m((yylsp[0])))), m((yylsp[0]))); }
 4493|      8|#line 4494 "hexpr.parse.C"
 4494|      8|    break;
 4495|       |
 4496|      0|  case 231: /* refutablep: "charV"  */
  ------------------
  |  Branch (4496:3): [True: 0, False: 132k]
  ------------------
 4497|      0|#line 902 "hexpr.y"
 4498|      0|                                       { (yyval.pattern) = new MatchLiteral(PrimitivePtr(new Char(str::readCharDef(*(yyvsp[0].string)), m((yylsp[0])))), m((yylsp[0]))); }
 4499|      0|#line 4500 "hexpr.parse.C"
 4500|      0|    break;
 4501|       |
 4502|      0|  case 232: /* refutablep: "byteV"  */
  ------------------
  |  Branch (4502:3): [True: 0, False: 132k]
  ------------------
 4503|      0|#line 903 "hexpr.y"
 4504|      0|                                       { (yyval.pattern) = new MatchLiteral(PrimitivePtr(new Byte(str::dehex(*(yyvsp[0].string)), m((yylsp[0])))), m((yylsp[0]))); }
 4505|      0|#line 4506 "hexpr.parse.C"
 4506|      0|    break;
 4507|       |
 4508|      0|  case 233: /* refutablep: "shortV"  */
  ------------------
  |  Branch (4508:3): [True: 0, False: 132k]
  ------------------
 4509|      0|#line 904 "hexpr.y"
 4510|      0|                                       { (yyval.pattern) = new MatchLiteral(PrimitivePtr(new Short((yyvsp[0].shortv), m((yylsp[0])))), m((yylsp[0]))); }
 4511|      0|#line 4512 "hexpr.parse.C"
 4512|      0|    break;
 4513|       |
 4514|      0|  case 234: /* refutablep: "intV"  */
  ------------------
  |  Branch (4514:3): [True: 0, False: 132k]
  ------------------
 4515|      0|#line 905 "hexpr.y"
 4516|      0|                                       { (yyval.pattern) = new MatchLiteral(PrimitivePtr(new Int((yyvsp[0].intv), m((yylsp[0])))), m((yylsp[0]))); }
 4517|      0|#line 4518 "hexpr.parse.C"
 4518|      0|    break;
 4519|       |
 4520|      0|  case 235: /* refutablep: "longV"  */
  ------------------
  |  Branch (4520:3): [True: 0, False: 132k]
  ------------------
 4521|      0|#line 906 "hexpr.y"
 4522|      0|                                       { (yyval.pattern) = new MatchLiteral(PrimitivePtr(new Long((yyvsp[0].longv), m((yylsp[0])))), m((yylsp[0]))); }
 4523|      0|#line 4524 "hexpr.parse.C"
 4524|      0|    break;
 4525|       |
 4526|      0|  case 236: /* refutablep: "int128V"  */
  ------------------
  |  Branch (4526:3): [True: 0, False: 132k]
  ------------------
 4527|      0|#line 907 "hexpr.y"
 4528|      0|                                       { (yyval.pattern) = new MatchLiteral(PrimitivePtr(new Int128((yyvsp[0].int128v), m((yylsp[0])))), m((yylsp[0]))); }
 4529|      0|#line 4530 "hexpr.parse.C"
 4530|      0|    break;
 4531|       |
 4532|      0|  case 237: /* refutablep: "doubleV"  */
  ------------------
  |  Branch (4532:3): [True: 0, False: 132k]
  ------------------
 4533|      0|#line 908 "hexpr.y"
 4534|      0|                                       { (yyval.pattern) = new MatchLiteral(PrimitivePtr(new Double((yyvsp[0].doublev), m((yylsp[0])))), m((yylsp[0]))); }
 4535|      0|#line 4536 "hexpr.parse.C"
 4536|      0|    break;
 4537|       |
 4538|      0|  case 238: /* refutablep: "bytesV"  */
  ------------------
  |  Branch (4538:3): [True: 0, False: 132k]
  ------------------
 4539|      0|#line 909 "hexpr.y"
 4540|      0|                                       { (yyval.pattern) = mkpatarray(str::dehexs(*(yyvsp[0].string)), m((yylsp[0]))); }
 4541|      0|#line 4542 "hexpr.parse.C"
 4542|      0|    break;
 4543|       |
 4544|      4|  case 239: /* refutablep: "stringV"  */
  ------------------
  |  Branch (4544:3): [True: 4, False: 132k]
  ------------------
 4545|      4|#line 910 "hexpr.y"
 4546|      4|                                       { (yyval.pattern) = mkpatarray(str::unescape(str::trimq(*(yyvsp[0].string))), m((yylsp[0]))); }
 4547|      4|#line 4548 "hexpr.parse.C"
 4548|      4|    break;
 4549|       |
 4550|      0|  case 240: /* refutablep: tsseq  */
  ------------------
  |  Branch (4550:3): [True: 0, False: 132k]
  ------------------
 4551|      0|#line 911 "hexpr.y"
 4552|      0|                                       { (yyval.pattern) = new MatchLiteral(mkTimespanPrim(*(yyvsp[0].strings), m((yylsp[0]))), mkTimespanExpr(*(yyvsp[0].strings), m((yylsp[0]))), m((yylsp[0]))); }
 4553|      0|#line 4554 "hexpr.parse.C"
 4554|      0|    break;
 4555|       |
 4556|      0|  case 241: /* refutablep: "timeV"  */
  ------------------
  |  Branch (4556:3): [True: 0, False: 132k]
  ------------------
 4557|      0|#line 912 "hexpr.y"
 4558|      0|                                       { (yyval.pattern) = new MatchLiteral(mkTimePrim(*(yyvsp[0].string), m((yylsp[0]))), mkTimeExpr(*(yyvsp[0].string), m((yylsp[0]))), m((yylsp[0]))); }
 4559|      0|#line 4560 "hexpr.parse.C"
 4560|      0|    break;
 4561|       |
 4562|      0|  case 242: /* refutablep: "dateTimeV"  */
  ------------------
  |  Branch (4562:3): [True: 0, False: 132k]
  ------------------
 4563|      0|#line 913 "hexpr.y"
 4564|      0|                                       { (yyval.pattern) = new MatchLiteral(mkDateTimePrim(*(yyvsp[0].string), m((yylsp[0]))), mkDateTimeExpr(*(yyvsp[0].string), m((yylsp[0]))), m((yylsp[0]))); }
 4565|      0|#line 4566 "hexpr.parse.C"
 4566|      0|    break;
 4567|       |
 4568|      2|  case 243: /* refutablep: "regexV"  */
  ------------------
  |  Branch (4568:3): [True: 2, False: 132k]
  ------------------
 4569|      2|#line 914 "hexpr.y"
 4570|      2|                                       { (yyval.pattern) = new MatchRegex(std::string((yyvsp[0].string)->begin() + 1, (yyvsp[0].string)->end() - 1), m((yylsp[0]))); }
 4571|      2|#line 4572 "hexpr.parse.C"
 4572|      2|    break;
 4573|       |
 4574|      8|  case 244: /* refutablep: "[" patternseq "]"  */
  ------------------
  |  Branch (4574:3): [True: 8, False: 132k]
  ------------------
 4575|      8|#line 915 "hexpr.y"
 4576|      8|                                       { (yyval.pattern) = new MatchArray(*(yyvsp[-1].patterns), m((yylsp[-2]),(yylsp[0]))); }
 4577|      8|#line 4578 "hexpr.parse.C"
 4578|      8|    break;
 4579|       |
 4580|      0|  case 245: /* refutablep: "[" patternseq "," "]"  */
  ------------------
  |  Branch (4580:3): [True: 0, False: 132k]
  ------------------
 4581|      0|#line 916 "hexpr.y"
 4582|      0|                                       { (yyval.pattern) = new MatchArray(*(yyvsp[-2].patterns), m((yylsp[-3]),(yylsp[0]))); }
 4583|      0|#line 4584 "hexpr.parse.C"
 4584|      0|    break;
 4585|       |
 4586|      0|  case 246: /* refutablep: "|" id "|"  */
  ------------------
  |  Branch (4586:3): [True: 0, False: 132k]
  ------------------
 4587|      0|#line 917 "hexpr.y"
 4588|      0|                                       { (yyval.pattern) = new MatchVariant(*(yyvsp[-1].string), PatternPtr(new MatchLiteral(PrimitivePtr(new Unit(m((yylsp[-1])))), m((yylsp[-1])))), m((yylsp[-2]),(yylsp[0]))); }
 4589|      0|#line 4590 "hexpr.parse.C"
 4590|      0|    break;
 4591|       |
 4592|      0|  case 247: /* refutablep: "|" id "=" pattern "|"  */
  ------------------
  |  Branch (4592:3): [True: 0, False: 132k]
  ------------------
 4593|      0|#line 918 "hexpr.y"
 4594|      0|                                       { (yyval.pattern) = new MatchVariant(*(yyvsp[-3].string), PatternPtr((yyvsp[-1].pattern)), m((yylsp[-4]),(yylsp[0]))); }
 4595|      0|#line 4596 "hexpr.parse.C"
 4596|      0|    break;
 4597|       |
 4598|     89|  case 248: /* refutablep: "|" "intV" "=" pattern "|"  */
  ------------------
  |  Branch (4598:3): [True: 89, False: 132k]
  ------------------
 4599|     89|#line 919 "hexpr.y"
 4600|     89|                                       { (yyval.pattern) = new MatchVariant(".f" + str::from((yyvsp[-3].intv)), PatternPtr((yyvsp[-1].pattern)), m((yylsp[-4]),(yylsp[0]))); }
 4601|     89|#line 4602 "hexpr.parse.C"
 4602|     89|    break;
 4603|       |
 4604|     48|  case 249: /* refutablep: "(" patternseq ")"  */
  ------------------
  |  Branch (4604:3): [True: 48, False: 132k]
  ------------------
 4605|     48|#line 920 "hexpr.y"
 4606|     48|                                       { (yyval.pattern) = pickNestedPat((yyvsp[-1].patterns), m((yylsp[-2]),(yylsp[0]))); }
 4607|     48|#line 4608 "hexpr.parse.C"
 4608|     48|    break;
 4609|       |
 4610|      0|  case 250: /* refutablep: "(" patternseq "," ")"  */
  ------------------
  |  Branch (4610:3): [True: 0, False: 132k]
  ------------------
 4611|      0|#line 921 "hexpr.y"
 4612|      0|                                       { (yyval.pattern) = pickNestedPat((yyvsp[-2].patterns), m((yylsp[-3]),(yylsp[0]))); }
 4613|      0|#line 4614 "hexpr.parse.C"
 4614|      0|    break;
 4615|       |
 4616|      0|  case 251: /* refutablep: "{" recpatfields "}"  */
  ------------------
  |  Branch (4616:3): [True: 0, False: 132k]
  ------------------
 4617|      0|#line 922 "hexpr.y"
 4618|      0|                                       { (yyval.pattern) = new MatchRecord(*(yyvsp[-1].recpatfields), m((yylsp[-2]),(yylsp[0]))); }
 4619|      0|#line 4620 "hexpr.parse.C"
 4620|      0|    break;
 4621|       |
 4622|      0|  case 252: /* refutablep: "{" recpatfields "," "}"  */
  ------------------
  |  Branch (4622:3): [True: 0, False: 132k]
  ------------------
 4623|      0|#line 923 "hexpr.y"
 4624|      0|                                       { (yyval.pattern) = new MatchRecord(*(yyvsp[-2].recpatfields), m((yylsp[-3]),(yylsp[0]))); }
 4625|      0|#line 4626 "hexpr.parse.C"
 4626|      0|    break;
 4627|       |
 4628|    384|  case 253: /* refutablep: id  */
  ------------------
  |  Branch (4628:3): [True: 384, False: 132k]
  ------------------
 4629|    384|#line 924 "hexpr.y"
 4630|    384|                                       { (yyval.pattern) = patVarCtorFn(*(yyvsp[0].string), m((yylsp[0]))); }
 4631|    384|#line 4632 "hexpr.parse.C"
 4632|    384|    break;
 4633|       |
 4634|    197|  case 254: /* irrefutablep: id  */
  ------------------
  |  Branch (4634:3): [True: 197, False: 132k]
  ------------------
 4635|    197|#line 926 "hexpr.y"
 4636|    197|                                       { (yyval.pattern) = new MatchAny(*(yyvsp[0].string), m((yylsp[0]))); }
 4637|    197|#line 4638 "hexpr.parse.C"
 4638|    197|    break;
 4639|       |
 4640|      2|  case 255: /* irrefutablep: "(" patternseq ")"  */
  ------------------
  |  Branch (4640:3): [True: 2, False: 132k]
  ------------------
 4641|      2|#line 927 "hexpr.y"
 4642|      2|                                       { (yyval.pattern) = pickNestedPat((yyvsp[-1].patterns), m((yylsp[-2]),(yylsp[0]))); }
 4643|      2|#line 4644 "hexpr.parse.C"
 4644|      2|    break;
 4645|       |
 4646|      0|  case 256: /* irrefutablep: "(" patternseq "," ")"  */
  ------------------
  |  Branch (4646:3): [True: 0, False: 132k]
  ------------------
 4647|      0|#line 928 "hexpr.y"
 4648|      0|                                       { (yyval.pattern) = pickNestedPat((yyvsp[-2].patterns), m((yylsp[-3]),(yylsp[0]))); }
 4649|      0|#line 4650 "hexpr.parse.C"
 4650|      0|    break;
 4651|       |
 4652|      0|  case 257: /* irrefutablep: "{" recpatfields "}"  */
  ------------------
  |  Branch (4652:3): [True: 0, False: 132k]
  ------------------
 4653|      0|#line 929 "hexpr.y"
 4654|      0|                                       { (yyval.pattern) = new MatchRecord(*(yyvsp[-1].recpatfields), m((yylsp[-2]),(yylsp[0]))); }
 4655|      0|#line 4656 "hexpr.parse.C"
 4656|      0|    break;
 4657|       |
 4658|      0|  case 258: /* irrefutablep: "{" recpatfields "," "}"  */
  ------------------
  |  Branch (4658:3): [True: 0, False: 132k]
  ------------------
 4659|      0|#line 930 "hexpr.y"
 4660|      0|                                       { (yyval.pattern) = new MatchRecord(*(yyvsp[-2].recpatfields), m((yylsp[-3]),(yylsp[0]))); }
 4661|      0|#line 4662 "hexpr.parse.C"
 4662|      0|    break;
 4663|       |
 4664|    543|  case 259: /* pattern: refutablep  */
  ------------------
  |  Branch (4664:3): [True: 543, False: 131k]
  ------------------
 4665|    543|#line 932 "hexpr.y"
 4666|    543|                    { (yyval.pattern) = (yyvsp[0].pattern); }
 4667|    543|#line 4668 "hexpr.parse.C"
 4668|    543|    break;
 4669|       |
 4670|     50|  case 260: /* patternseq: patternseqn  */
  ------------------
  |  Branch (4670:3): [True: 50, False: 132k]
  ------------------
 4671|     50|#line 934 "hexpr.y"
 4672|     50|                          { (yyval.patterns) = (yyvsp[0].patterns); }
 4673|     50|#line 4674 "hexpr.parse.C"
 4674|     50|    break;
 4675|       |
 4676|      8|  case 261: /* patternseq: %empty  */
  ------------------
  |  Branch (4676:3): [True: 8, False: 132k]
  ------------------
 4677|      8|#line 935 "hexpr.y"
 4678|      8|                          { (yyval.patterns) = autorelease(new Patterns()); }
 4679|      8|#line 4680 "hexpr.parse.C"
 4680|      8|    break;
 4681|       |
 4682|     49|  case 262: /* patternseqn: patternseqn "," pattern  */
  ------------------
  |  Branch (4682:3): [True: 49, False: 132k]
  ------------------
 4683|     49|#line 937 "hexpr.y"
 4684|     49|                                     { (yyval.patterns) = (yyvsp[-2].patterns); (yyval.patterns)->push_back(PatternPtr((yyvsp[0].pattern))); }
 4685|     49|#line 4686 "hexpr.parse.C"
 4686|     49|    break;
 4687|       |
 4688|     50|  case 263: /* patternseqn: pattern  */
  ------------------
  |  Branch (4688:3): [True: 50, False: 132k]
  ------------------
 4689|     50|#line 938 "hexpr.y"
 4690|     50|                                     { (yyval.patterns) = autorelease(new Patterns()); (yyval.patterns)->push_back(PatternPtr((yyvsp[0].pattern))); }
 4691|     50|#line 4692 "hexpr.parse.C"
 4692|     50|    break;
 4693|       |
 4694|      0|  case 264: /* recpatfields: recpatfields "," recpatfield  */
  ------------------
  |  Branch (4694:3): [True: 0, False: 132k]
  ------------------
 4695|      0|#line 940 "hexpr.y"
 4696|      0|                                           { (yyval.recpatfields) = (yyvsp[-2].recpatfields); (yyval.recpatfields)->push_back(*(yyvsp[0].recpatfield)); }
 4697|      0|#line 4698 "hexpr.parse.C"
 4698|      0|    break;
 4699|       |
 4700|      0|  case 265: /* recpatfields: recpatfield  */
  ------------------
  |  Branch (4700:3): [True: 0, False: 132k]
  ------------------
 4701|      0|#line 941 "hexpr.y"
 4702|      0|                                           { (yyval.recpatfields) = autorelease(new MatchRecord::Fields()); (yyval.recpatfields)->push_back(*(yyvsp[0].recpatfield)); }
 4703|      0|#line 4704 "hexpr.parse.C"
 4704|      0|    break;
 4705|       |
 4706|      0|  case 266: /* recpatfield: id "=" pattern  */
  ------------------
  |  Branch (4706:3): [True: 0, False: 132k]
  ------------------
 4707|      0|#line 943 "hexpr.y"
 4708|      0|                            { (yyval.recpatfield) = autorelease(new MatchRecord::Field(*(yyvsp[-2].string), PatternPtr((yyvsp[0].pattern)))); }
 4709|      0|#line 4710 "hexpr.parse.C"
 4710|      0|    break;
 4711|       |
 4712|      0|  case 267: /* recfields: %empty  */
  ------------------
  |  Branch (4712:3): [True: 0, False: 132k]
  ------------------
 4713|      0|#line 945 "hexpr.y"
 4714|      0|                                                 { (yyval.rfields) = autorelease(new MkRecord::FieldDefs()); }
 4715|      0|#line 4716 "hexpr.parse.C"
 4716|      0|    break;
 4717|       |
 4718|      4|  case 268: /* recfields: recfieldname "=" l0expr  */
  ------------------
  |  Branch (4718:3): [True: 4, False: 132k]
  ------------------
 4719|      4|#line 946 "hexpr.y"
 4720|      4|                                                 { (yyval.rfields) = autorelease(new MkRecord::FieldDefs()); (yyval.rfields)->push_back(MkRecord::FieldDef(*(yyvsp[-2].string), ExprPtr((yyvsp[0].exp)))); }
 4721|      4|#line 4722 "hexpr.parse.C"
 4722|      4|    break;
 4723|       |
 4724|      0|  case 269: /* recfields: recfields "," recfieldname "=" l0expr  */
  ------------------
  |  Branch (4724:3): [True: 0, False: 132k]
  ------------------
 4725|      0|#line 947 "hexpr.y"
 4726|      0|                                                 { (yyval.rfields) = (yyvsp[-4].rfields);                                     (yyval.rfields)->push_back(MkRecord::FieldDef(*(yyvsp[-2].string), ExprPtr((yyvsp[0].exp)))); }
 4727|      0|#line 4728 "hexpr.parse.C"
 4728|      0|    break;
 4729|       |
 4730|     71|  case 270: /* recfieldname: id  */
  ------------------
  |  Branch (4730:3): [True: 71, False: 132k]
  ------------------
 4731|     71|#line 949 "hexpr.y"
 4732|     71|                         { (yyval.string) = (yyvsp[0].string); }
 4733|     71|#line 4734 "hexpr.parse.C"
 4734|     71|    break;
 4735|       |
 4736|      0|  case 271: /* recfieldname: "data"  */
  ------------------
  |  Branch (4736:3): [True: 0, False: 132k]
  ------------------
 4737|      0|#line 950 "hexpr.y"
 4738|      0|                         { (yyval.string) = autorelease(new std::string("data")); }
 4739|      0|#line 4740 "hexpr.parse.C"
 4740|      0|    break;
 4741|       |
 4742|      0|  case 272: /* recfieldname: "type"  */
  ------------------
  |  Branch (4742:3): [True: 0, False: 132k]
  ------------------
 4743|      0|#line 951 "hexpr.y"
 4744|      0|                         { (yyval.string) = autorelease(new std::string("type")); }
 4745|      0|#line 4746 "hexpr.parse.C"
 4746|      0|    break;
 4747|       |
 4748|      0|  case 273: /* recfieldname: "where"  */
  ------------------
  |  Branch (4748:3): [True: 0, False: 132k]
  ------------------
 4749|      0|#line 952 "hexpr.y"
 4750|      0|                         { (yyval.string) = autorelease(new std::string("where")); }
 4751|      0|#line 4752 "hexpr.parse.C"
 4752|      0|    break;
 4753|       |
 4754|      0|  case 274: /* recfieldname: "class"  */
  ------------------
  |  Branch (4754:3): [True: 0, False: 132k]
  ------------------
 4755|      0|#line 953 "hexpr.y"
 4756|      0|                         { (yyval.string) = autorelease(new std::string("class")); wantIndent(false); }
 4757|      0|#line 4758 "hexpr.parse.C"
 4758|      0|    break;
 4759|       |
 4760|      0|  case 275: /* recfieldname: "instance"  */
  ------------------
  |  Branch (4760:3): [True: 0, False: 132k]
  ------------------
 4761|      0|#line 954 "hexpr.y"
 4762|      0|                         { (yyval.string) = autorelease(new std::string("instance")); wantIndent(false); }
 4763|      0|#line 4764 "hexpr.parse.C"
 4764|      0|    break;
 4765|       |
 4766|      0|  case 276: /* recfieldname: "exists"  */
  ------------------
  |  Branch (4766:3): [True: 0, False: 132k]
  ------------------
 4767|      0|#line 955 "hexpr.y"
 4768|      0|                         { (yyval.string) = autorelease(new std::string("exists")); }
 4769|      0|#line 4770 "hexpr.parse.C"
 4770|      0|    break;
 4771|       |
 4772|      0|  case 277: /* recfieldname: "import"  */
  ------------------
  |  Branch (4772:3): [True: 0, False: 132k]
  ------------------
 4773|      0|#line 956 "hexpr.y"
 4774|      0|                         { (yyval.string) = autorelease(new std::string("import")); }
 4775|      0|#line 4776 "hexpr.parse.C"
 4776|      0|    break;
 4777|       |
 4778|      0|  case 278: /* recfieldname: "module"  */
  ------------------
  |  Branch (4778:3): [True: 0, False: 132k]
  ------------------
 4779|      0|#line 957 "hexpr.y"
 4780|      0|                         { (yyval.string) = autorelease(new std::string("module")); }
 4781|      0|#line 4782 "hexpr.parse.C"
 4782|      0|    break;
 4783|       |
 4784|      0|  case 279: /* recfieldname: "parse"  */
  ------------------
  |  Branch (4784:3): [True: 0, False: 132k]
  ------------------
 4785|      0|#line 958 "hexpr.y"
 4786|      0|                         { (yyval.string) = autorelease(new std::string("parse")); }
 4787|      0|#line 4788 "hexpr.parse.C"
 4788|      0|    break;
 4789|       |
 4790|      0|  case 280: /* recfieldname: "do"  */
  ------------------
  |  Branch (4790:3): [True: 0, False: 132k]
  ------------------
 4791|      0|#line 959 "hexpr.y"
 4792|      0|                         { (yyval.string) = autorelease(new std::string("do")); }
 4793|      0|#line 4794 "hexpr.parse.C"
 4794|      0|    break;
 4795|       |
 4796|      0|  case 281: /* recfieldname: "return"  */
  ------------------
  |  Branch (4796:3): [True: 0, False: 132k]
  ------------------
 4797|      0|#line 960 "hexpr.y"
 4798|      0|                         { (yyval.string) = autorelease(new std::string("return")); }
 4799|      0|#line 4800 "hexpr.parse.C"
 4800|      0|    break;
 4801|       |
 4802|      0|  case 282: /* recfieldname: "fn"  */
  ------------------
  |  Branch (4802:3): [True: 0, False: 132k]
  ------------------
 4803|      0|#line 961 "hexpr.y"
 4804|      0|                         { (yyval.string) = autorelease(new std::string("fn")); }
 4805|      0|#line 4806 "hexpr.parse.C"
 4806|      0|    break;
 4807|       |
 4808|    205|  case 283: /* recfieldname: "intV"  */
  ------------------
  |  Branch (4808:3): [True: 205, False: 132k]
  ------------------
 4809|    205|#line 962 "hexpr.y"
 4810|    205|                         { (yyval.string) = autorelease(new std::string(".f" + str::from((yyvsp[0].intv)))); }
 4811|    205|#line 4812 "hexpr.parse.C"
 4812|    205|    break;
 4813|       |
 4814|      0|  case 284: /* recfieldname: "stringV"  */
  ------------------
  |  Branch (4814:3): [True: 0, False: 132k]
  ------------------
 4815|      0|#line 963 "hexpr.y"
 4816|      0|                         { std::string stringField = str::unescape(str::trimq(*(yyvsp[0].string)));
 4817|      0|                           if (stringField.size() > 0 && stringField[0] == '.' ) {
  ------------------
  |  Branch (4817:32): [True: 0, False: 0]
  |  Branch (4817:58): [True: 0, False: 0]
  ------------------
 4818|      0|                             throw annotated_error(m((yylsp[0])), "Cannot define record string label with leading '.'");
 4819|      0|                           }
 4820|      0|                           (yyval.string) = autorelease(new std::string(str::unescape(str::trimq(*(yyvsp[0].string))))); }
 4821|      0|#line 4822 "hexpr.parse.C"
 4822|      0|    break;
 4823|       |
 4824|      6|  case 285: /* recfieldpath: recfieldpath "." recfieldname  */
  ------------------
  |  Branch (4824:3): [True: 6, False: 132k]
  ------------------
 4825|      6|#line 969 "hexpr.y"
 4826|      6|                                            { (yyval.strings) = (yyvsp[-2].strings); (yyval.strings)->push_back(*(yyvsp[0].string)); }
 4827|      6|#line 4828 "hexpr.parse.C"
 4828|      6|    break;
 4829|       |
 4830|      0|  case 286: /* recfieldpath: recfieldpath "tupSection"  */
  ------------------
  |  Branch (4830:3): [True: 0, False: 132k]
  ------------------
 4831|      0|#line 970 "hexpr.y"
 4832|      0|                                            { (yyval.strings) = (yyvsp[-1].strings); str::seq x = tupSectionFields(*(yyvsp[0].string)); (yyval.strings)->insert((yyval.strings)->end(), x.begin(), x.end()); }
 4833|      0|#line 4834 "hexpr.parse.C"
 4834|      0|    break;
 4835|       |
 4836|    266|  case 287: /* recfieldpath: "." recfieldname  */
  ------------------
  |  Branch (4836:3): [True: 266, False: 132k]
  ------------------
 4837|    266|#line 971 "hexpr.y"
 4838|    266|                                            { (yyval.strings) = autorelease(new str::seq()); (yyval.strings)->push_back(*(yyvsp[0].string)); }
 4839|    266|#line 4840 "hexpr.parse.C"
 4840|    266|    break;
 4841|       |
 4842|      2|  case 288: /* recfieldpath: "tupSection"  */
  ------------------
  |  Branch (4842:3): [True: 2, False: 132k]
  ------------------
 4843|      2|#line 972 "hexpr.y"
 4844|      2|                                            { (yyval.strings) = autorelease(new str::seq()); *(yyval.strings) = tupSectionFields(*(yyvsp[0].string)); }
 4845|      2|#line 4846 "hexpr.parse.C"
 4846|      2|    break;
 4847|       |
 4848|     62|  case 289: /* varfields: varbind  */
  ------------------
  |  Branch (4848:3): [True: 62, False: 132k]
  ------------------
 4849|     62|#line 974 "hexpr.y"
 4850|     62|                                 { (yyval.vfields) = autorelease(new Case::Bindings()); (yyval.vfields)->push_back(*(yyvsp[0].vbind)); }
 4851|     62|#line 4852 "hexpr.parse.C"
 4852|     62|    break;
 4853|       |
 4854|     62|  case 290: /* varfields: varfields "," varbind  */
  ------------------
  |  Branch (4854:3): [True: 62, False: 132k]
  ------------------
 4855|     62|#line 975 "hexpr.y"
 4856|     62|                                 { (yyval.vfields) = (yyvsp[-2].vfields); (yyval.vfields)->push_back(*(yyvsp[0].vbind)); }
 4857|     62|#line 4858 "hexpr.parse.C"
 4858|     62|    break;
 4859|       |
 4860|      0|  case 291: /* varbind: id "=" l0expr  */
  ------------------
  |  Branch (4860:3): [True: 0, False: 132k]
  ------------------
 4861|      0|#line 977 "hexpr.y"
 4862|      0|                                  { (yyval.vbind) = autorelease(new Case::Binding(*(yyvsp[-2].string), *(yyvsp[-2].string), ExprPtr((yyvsp[0].exp)))); }
 4863|      0|#line 4864 "hexpr.parse.C"
 4864|      0|    break;
 4865|       |
 4866|      2|  case 292: /* varbind: id ":" id "=" l0expr  */
  ------------------
  |  Branch (4866:3): [True: 2, False: 132k]
  ------------------
 4867|      2|#line 978 "hexpr.y"
 4868|      2|                                  { (yyval.vbind) = autorelease(new Case::Binding(*(yyvsp[-4].string), *(yyvsp[-2].string), ExprPtr((yyvsp[0].exp)))); }
 4869|      2|#line 4870 "hexpr.parse.C"
 4870|      2|    break;
 4871|       |
 4872|    122|  case 293: /* varbind: "intV" ":" id "=" l0expr  */
  ------------------
  |  Branch (4872:3): [True: 122, False: 132k]
  ------------------
 4873|    122|#line 979 "hexpr.y"
 4874|    122|                                  { (yyval.vbind) = autorelease(new Case::Binding(".f" + str::from((yyvsp[-4].intv)), *(yyvsp[-2].string), ExprPtr((yyvsp[0].exp)))); }
 4875|    122|#line 4876 "hexpr.parse.C"
 4876|    122|    break;
 4877|       |
 4878|    189|  case 294: /* cargs: %empty  */
  ------------------
  |  Branch (4878:3): [True: 189, False: 132k]
  ------------------
 4879|    189|#line 981 "hexpr.y"
 4880|    189|                        { (yyval.exps) = autorelease(new Exprs()); }
 4881|    189|#line 4882 "hexpr.parse.C"
 4882|    189|    break;
 4883|       |
 4884|  2.80k|  case 295: /* cargs: l0expr  */
  ------------------
  |  Branch (4884:3): [True: 2.80k, False: 129k]
  ------------------
 4885|  2.80k|#line 982 "hexpr.y"
 4886|  2.80k|                        { (yyval.exps) = autorelease(new Exprs()); (yyval.exps)->push_back(ExprPtr((yyvsp[0].exp))); }
 4887|  2.80k|#line 4888 "hexpr.parse.C"
 4888|  2.80k|    break;
 4889|       |
 4890|  2.08k|  case 296: /* cargs: cargs "," l0expr  */
  ------------------
  |  Branch (4890:3): [True: 2.08k, False: 130k]
  ------------------
 4891|  2.08k|#line 983 "hexpr.y"
 4892|  2.08k|                        { (yyvsp[-2].exps)->push_back(ExprPtr((yyvsp[0].exp))); (yyval.exps) = (yyvsp[-2].exps); }
 4893|  2.08k|#line 4894 "hexpr.parse.C"
 4894|  2.08k|    break;
 4895|       |
 4896|    222|  case 297: /* qtype: cst "=>" l0mtype  */
  ------------------
  |  Branch (4896:3): [True: 222, False: 132k]
  ------------------
 4897|    222|#line 985 "hexpr.y"
 4898|    222|                         { (yyval.qualtype) = new QualType(*(yyvsp[-2].tconstraints), *(yyvsp[0].mtype)); }
 4899|    222|#line 4900 "hexpr.parse.C"
 4900|    222|    break;
 4901|       |
 4902|    474|  case 298: /* qtype: l0mtype  */
  ------------------
  |  Branch (4902:3): [True: 474, False: 132k]
  ------------------
 4903|    474|#line 986 "hexpr.y"
 4904|    474|                         { (yyval.qualtype) = new QualType(Constraints(), *(yyvsp[0].mtype)); }
 4905|    474|#line 4906 "hexpr.parse.C"
 4906|    474|    break;
 4907|       |
 4908|      0|  case 299: /* qtype: pal0mtype  */
  ------------------
  |  Branch (4908:3): [True: 0, False: 132k]
  ------------------
 4909|      0|#line 987 "hexpr.y"
 4910|      0|                         { (yyval.qualtype) = new QualType(Constraints(), *(yyvsp[0].mtype)); }
 4911|      0|#line 4912 "hexpr.parse.C"
 4912|      0|    break;
 4913|       |
 4914|      0|  case 300: /* pal1mtype: cst  */
  ------------------
  |  Branch (4914:3): [True: 0, False: 132k]
  ------------------
 4915|      0|#line 992 "hexpr.y"
 4916|      0|                               { try { (yyval.mtype) = autorelease(new MonoTypePtr(tyAppFromConstraints(*(yyvsp[0].tconstraints)))); } catch (std::exception& ex) { throw annotated_error(m((yylsp[0])), ex.what()); } }
 4917|      0|#line 4918 "hexpr.parse.C"
 4918|      0|    break;
 4919|       |
 4920|      0|  case 301: /* pal1mtype: pal1mtype "@" l1mtype  */
  ------------------
  |  Branch (4920:3): [True: 0, False: 132k]
  ------------------
 4921|      0|#line 993 "hexpr.y"
 4922|      0|                                 { (yyval.mtype) = autorelease(new MonoTypePtr(fileRefTy(*(yyvsp[-2].mtype), *(yyvsp[0].mtype)))); }
 4923|      0|#line 4924 "hexpr.parse.C"
 4924|      0|    break;
 4925|       |
 4926|      0|  case 302: /* pal1mtype: pal1mtype "@" "?"  */
  ------------------
  |  Branch (4926:3): [True: 0, False: 132k]
  ------------------
 4927|      0|#line 994 "hexpr.y"
 4928|      0|                                 { (yyval.mtype) = autorelease(new MonoTypePtr(fileRefTy(*(yyvsp[-2].mtype)))); }
 4929|      0|#line 4930 "hexpr.parse.C"
 4930|      0|    break;
 4931|       |
 4932|      0|  case 303: /* pamtuplist: pal1mtype  */
  ------------------
  |  Branch (4932:3): [True: 0, False: 132k]
  ------------------
 4933|      0|#line 996 "hexpr.y"
 4934|      0|                                   { (yyval.mtypes) = autorelease(new MonoTypes()); (yyval.mtypes)->push_back(*(yyvsp[0].mtype)); }
 4935|      0|#line 4936 "hexpr.parse.C"
 4936|      0|    break;
 4937|       |
 4938|      0|  case 304: /* pamtuplist: pamtuplist "*" l1mtype  */
  ------------------
  |  Branch (4938:3): [True: 0, False: 132k]
  ------------------
 4939|      0|#line 997 "hexpr.y"
 4940|      0|                                   { (yyval.mtypes) = (yyvsp[-2].mtypes); (yyval.mtypes)->push_back(*(yyvsp[0].mtype)); }
 4941|      0|#line 4942 "hexpr.parse.C"
 4942|      0|    break;
 4943|       |
 4944|      0|  case 305: /* pamsumlist: pal1mtype "+" l1mtype  */
  ------------------
  |  Branch (4944:3): [True: 0, False: 132k]
  ------------------
 4945|      0|#line 999 "hexpr.y"
 4946|      0|                                   { (yyval.mtypes) = autorelease(new MonoTypes()); (yyval.mtypes)->push_back(*(yyvsp[-2].mtype)); (yyval.mtypes)->push_back(*(yyvsp[0].mtype)); }
 4947|      0|#line 4948 "hexpr.parse.C"
 4948|      0|    break;
 4949|       |
 4950|      0|  case 306: /* pamsumlist: pamsumlist "+" l1mtype  */
  ------------------
  |  Branch (4950:3): [True: 0, False: 132k]
  ------------------
 4951|      0|#line 1000 "hexpr.y"
 4952|      0|                                   { (yyval.mtypes) = (yyvsp[-2].mtypes); (yyval.mtypes)->push_back(*(yyvsp[0].mtype)); }
 4953|      0|#line 4954 "hexpr.parse.C"
 4954|      0|    break;
 4955|       |
 4956|      0|  case 307: /* pal0mtype: pal1mtype "->" l1mtype  */
  ------------------
  |  Branch (4956:3): [True: 0, False: 132k]
  ------------------
 4957|      0|#line 1002 "hexpr.y"
 4958|      0|                                  { (yyval.mtype) = autorelease(new MonoTypePtr(Func::make(tuplety(list(*(yyvsp[-2].mtype))), *(yyvsp[0].mtype)))); }
 4959|      0|#line 4960 "hexpr.parse.C"
 4960|      0|    break;
 4961|       |
 4962|      0|  case 308: /* pal0mtype: pamtuplist  */
  ------------------
  |  Branch (4962:3): [True: 0, False: 132k]
  ------------------
 4963|      0|#line 1003 "hexpr.y"
 4964|      0|                                  { (yyval.mtype) = autorelease(new MonoTypePtr(makeTupleType(*(yyvsp[0].mtypes)))); }
 4965|      0|#line 4966 "hexpr.parse.C"
 4966|      0|    break;
 4967|       |
 4968|      0|  case 309: /* pal0mtype: pamsumlist  */
  ------------------
  |  Branch (4968:3): [True: 0, False: 132k]
  ------------------
 4969|      0|#line 1004 "hexpr.y"
 4970|      0|                                  { (yyval.mtype) = autorelease(new MonoTypePtr(makeSumType(*(yyvsp[0].mtypes)))); }
 4971|      0|#line 4972 "hexpr.parse.C"
 4972|      0|    break;
 4973|       |
 4974|    523|  case 310: /* cst: "(" tpreds ")"  */
  ------------------
  |  Branch (4974:3): [True: 523, False: 131k]
  ------------------
 4975|    523|#line 1007 "hexpr.y"
 4976|    523|                    { (yyval.tconstraints) = (yyvsp[-1].tconstraints); }
 4977|    523|#line 4978 "hexpr.parse.C"
 4978|    523|    break;
 4979|       |
 4980|    523|  case 311: /* tpreds: tpred  */
  ------------------
  |  Branch (4980:3): [True: 523, False: 131k]
  ------------------
 4981|    523|#line 1009 "hexpr.y"
 4982|    523|                         { (yyval.tconstraints) = autorelease(new Constraints()); (yyval.tconstraints)->push_back(ConstraintPtr((yyvsp[0].tconstraint))); }
 4983|    523|#line 4984 "hexpr.parse.C"
 4984|    523|    break;
 4985|       |
 4986|    330|  case 312: /* tpreds: tpreds "," tpred  */
  ------------------
  |  Branch (4986:3): [True: 330, False: 132k]
  ------------------
 4987|    330|#line 1010 "hexpr.y"
 4988|    330|                         { (yyvsp[-2].tconstraints)->push_back(ConstraintPtr((yyvsp[0].tconstraint))); (yyval.tconstraints) = (yyvsp[-2].tconstraints); }
 4989|    330|#line 4990 "hexpr.parse.C"
 4990|    330|    break;
 4991|       |
 4992|    677|  case 313: /* tpred: id l1mtargl  */
  ------------------
  |  Branch (4992:3): [True: 677, False: 131k]
  ------------------
 4993|    677|#line 1012 "hexpr.y"
 4994|    677|                                                      { (yyval.tconstraint) = new Constraint(*(yyvsp[-1].string), *(yyvsp[0].mtypes)); }
 4995|    677|#line 4996 "hexpr.parse.C"
 4996|    677|    break;
 4997|       |
 4998|      0|  case 314: /* tpred: l1mtype "==" l1mtype  */
  ------------------
  |  Branch (4998:3): [True: 0, False: 132k]
  ------------------
 4999|      0|#line 1013 "hexpr.y"
 5000|      0|                                                      { (yyval.tconstraint) = new Constraint(EqualTypes::constraintName(), list(*(yyvsp[-2].mtype), *(yyvsp[0].mtype))); }
 5001|      0|#line 5002 "hexpr.parse.C"
 5002|      0|    break;
 5003|       |
 5004|     16|  case 315: /* tpred: l1mtype "!=" l1mtype  */
  ------------------
  |  Branch (5004:3): [True: 16, False: 132k]
  ------------------
 5005|     16|#line 1014 "hexpr.y"
 5006|     16|                                                      { (yyval.tconstraint) = new Constraint(NotEqualTypes::constraintName(), list(*(yyvsp[-2].mtype), *(yyvsp[0].mtype))); }
 5007|     16|#line 5008 "hexpr.parse.C"
 5008|     16|    break;
 5009|       |
 5010|      3|  case 316: /* tpred: l1mtype "~" l1mtype  */
  ------------------
  |  Branch (5010:3): [True: 3, False: 132k]
  ------------------
 5011|      3|#line 1015 "hexpr.y"
 5012|      3|                                                      { (yyval.tconstraint) = new Constraint(FixIsoRecur::constraintName(), list(*(yyvsp[-2].mtype), *(yyvsp[0].mtype))); }
 5013|      3|#line 5014 "hexpr.parse.C"
 5014|      3|    break;
 5015|       |
 5016|     28|  case 317: /* tpred: l1mtype "=" "{" l1mtype "*" l1mtype "}"  */
  ------------------
  |  Branch (5016:3): [True: 28, False: 132k]
  ------------------
 5017|     28|#line 1016 "hexpr.y"
 5018|     28|                                                      { (yyval.tconstraint) = new Constraint(RecordDeconstructor::constraintName(), list(tlong(1), tlong(0), *(yyvsp[-6].mtype), freshTypeVar(),  *(yyvsp[-3].mtype), *(yyvsp[-1].mtype))); }
 5019|     28|#line 5020 "hexpr.parse.C"
 5020|     28|    break;
 5021|       |
 5022|     15|  case 318: /* tpred: l1mtype "=" "{" id ":" l1mtype "*" l1mtype "}"  */
  ------------------
  |  Branch (5022:3): [True: 15, False: 132k]
  ------------------
 5023|     15|#line 1017 "hexpr.y"
 5024|     15|                                                      { (yyval.tconstraint) = new Constraint(RecordDeconstructor::constraintName(), list(tlong(1), tlong(0), *(yyvsp[-8].mtype), TVar::make(*(yyvsp[-5].string)), *(yyvsp[-3].mtype), *(yyvsp[-1].mtype))); }
 5025|     15|#line 5026 "hexpr.parse.C"
 5026|     15|    break;
 5027|       |
 5028|     60|  case 319: /* tpred: l1mtype "=" "(" l1mtype "*" l1mtype ")"  */
  ------------------
  |  Branch (5028:3): [True: 60, False: 132k]
  ------------------
 5029|     60|#line 1018 "hexpr.y"
 5030|     60|                                                      { (yyval.tconstraint) = new Constraint(RecordDeconstructor::constraintName(), list(tlong(1), tlong(1), *(yyvsp[-6].mtype), freshTypeVar(),  *(yyvsp[-3].mtype), *(yyvsp[-1].mtype))); }
 5031|     60|#line 5032 "hexpr.parse.C"
 5032|     60|    break;
 5033|       |
 5034|      0|  case 320: /* tpred: "{" l1mtype "*" l1mtype "}" "=" l1mtype  */
  ------------------
  |  Branch (5034:3): [True: 0, False: 132k]
  ------------------
 5035|      0|#line 1019 "hexpr.y"
 5036|      0|                                                      { (yyval.tconstraint) = new Constraint(RecordDeconstructor::constraintName(), list(tlong(0), tlong(0), *(yyvsp[0].mtype), freshTypeVar(),  *(yyvsp[-5].mtype), *(yyvsp[-3].mtype))); }
 5037|      0|#line 5038 "hexpr.parse.C"
 5038|      0|    break;
 5039|       |
 5040|      2|  case 321: /* tpred: "{" id ":" l1mtype "*" l1mtype "}" "=" l1mtype  */
  ------------------
  |  Branch (5040:3): [True: 2, False: 132k]
  ------------------
 5041|      2|#line 1020 "hexpr.y"
 5042|      2|                                                      { (yyval.tconstraint) = new Constraint(RecordDeconstructor::constraintName(), list(tlong(0), tlong(0), *(yyvsp[0].mtype), TVar::make(*(yyvsp[-7].string)), *(yyvsp[-5].mtype), *(yyvsp[-3].mtype))); }
 5043|      2|#line 5044 "hexpr.parse.C"
 5044|      2|    break;
 5045|       |
 5046|      6|  case 322: /* tpred: "(" l1mtype "*" l1mtype ")" "=" l1mtype  */
  ------------------
  |  Branch (5046:3): [True: 6, False: 132k]
  ------------------
 5047|      6|#line 1021 "hexpr.y"
 5048|      6|                                                      { (yyval.tconstraint) = new Constraint(RecordDeconstructor::constraintName(), list(tlong(0), tlong(1), *(yyvsp[0].mtype), freshTypeVar(),  *(yyvsp[-5].mtype), *(yyvsp[-3].mtype))); }
 5049|      6|#line 5050 "hexpr.parse.C"
 5050|      6|    break;
 5051|       |
 5052|      0|  case 323: /* tpred: l1mtype "." recfieldname "::" l1mtype  */
  ------------------
  |  Branch (5052:3): [True: 0, False: 132k]
  ------------------
 5053|      0|#line 1023 "hexpr.y"
 5054|      0|                                                      { (yyval.tconstraint) = HasField::newConstraint(HasField::Read,  *(yyvsp[-4].mtype), TString::make(*(yyvsp[-2].string)), *(yyvsp[0].mtype)); }
 5055|      0|#line 5056 "hexpr.parse.C"
 5056|      0|    break;
 5057|       |
 5058|      0|  case 324: /* tpred: l1mtype "." recfieldname "<-" l1mtype  */
  ------------------
  |  Branch (5058:3): [True: 0, False: 132k]
  ------------------
 5059|      0|#line 1024 "hexpr.y"
 5060|      0|                                                      { (yyval.tconstraint) = HasField::newConstraint(HasField::Write, *(yyvsp[-4].mtype), TString::make(*(yyvsp[-2].string)), *(yyvsp[0].mtype)); }
 5061|      0|#line 5062 "hexpr.parse.C"
 5062|      0|    break;
 5063|       |
 5064|     12|  case 325: /* tpred: l1mtype "/" l1mtype "::" l1mtype  */
  ------------------
  |  Branch (5064:3): [True: 12, False: 132k]
  ------------------
 5065|     12|#line 1025 "hexpr.y"
 5066|     12|                                                      { (yyval.tconstraint) = HasField::newConstraint(HasField::Read,  *(yyvsp[-4].mtype), *(yyvsp[-2].mtype),                *(yyvsp[0].mtype)); }
 5067|     12|#line 5068 "hexpr.parse.C"
 5068|     12|    break;
 5069|       |
 5070|      0|  case 326: /* tpred: l1mtype "/" l1mtype "<-" l1mtype  */
  ------------------
  |  Branch (5070:3): [True: 0, False: 132k]
  ------------------
 5071|      0|#line 1026 "hexpr.y"
 5072|      0|                                                      { (yyval.tconstraint) = HasField::newConstraint(HasField::Write, *(yyvsp[-4].mtype), *(yyvsp[-2].mtype),                *(yyvsp[0].mtype)); }
 5073|      0|#line 5074 "hexpr.parse.C"
 5074|      0|    break;
 5075|       |
 5076|     22|  case 327: /* tpred: l1mtype "=" "|" l1mtype "+" l1mtype "|"  */
  ------------------
  |  Branch (5076:3): [True: 22, False: 132k]
  ------------------
 5077|     22|#line 1028 "hexpr.y"
 5078|     22|                                                      { (yyval.tconstraint) = new Constraint(VariantDeconstructor::constraintName(), list(tlong(1), *(yyvsp[-6].mtype), freshTypeVar(),  *(yyvsp[-3].mtype), *(yyvsp[-1].mtype))); }
 5079|     22|#line 5080 "hexpr.parse.C"
 5080|     22|    break;
 5081|       |
 5082|      0|  case 328: /* tpred: "|" l1mtype "+" l1mtype "|" "=" l1mtype  */
  ------------------
  |  Branch (5082:3): [True: 0, False: 132k]
  ------------------
 5083|      0|#line 1029 "hexpr.y"
 5084|      0|                                                      { (yyval.tconstraint) = new Constraint(VariantDeconstructor::constraintName(), list(tlong(0), *(yyvsp[0].mtype), freshTypeVar(),  *(yyvsp[-5].mtype), *(yyvsp[-3].mtype))); }
 5085|      0|#line 5086 "hexpr.parse.C"
 5086|      0|    break;
 5087|       |
 5088|      8|  case 329: /* tpred: l1mtype "=" "|" id ":" l1mtype "+" l1mtype "|"  */
  ------------------
  |  Branch (5088:3): [True: 8, False: 132k]
  ------------------
 5089|      8|#line 1030 "hexpr.y"
 5090|      8|                                                      { (yyval.tconstraint) = new Constraint(VariantDeconstructor::constraintName(), list(tlong(1), *(yyvsp[-8].mtype), TVar::make(*(yyvsp[-5].string)), *(yyvsp[-3].mtype), *(yyvsp[-1].mtype))); }
 5091|      8|#line 5092 "hexpr.parse.C"
 5092|      8|    break;
 5093|       |
 5094|      4|  case 330: /* tpred: "|" id ":" l1mtype "+" l1mtype "|" "=" l1mtype  */
  ------------------
  |  Branch (5094:3): [True: 4, False: 132k]
  ------------------
 5095|      4|#line 1031 "hexpr.y"
 5096|      4|                                                      { (yyval.tconstraint) = new Constraint(VariantDeconstructor::constraintName(), list(tlong(0), *(yyvsp[0].mtype), TVar::make(*(yyvsp[-7].string)), *(yyvsp[-5].mtype), *(yyvsp[-3].mtype))); }
 5097|      4|#line 5098 "hexpr.parse.C"
 5098|      4|    break;
 5099|       |
 5100|      0|  case 331: /* tpred: "|" id ":" l0mtype "|" "::" l1mtype  */
  ------------------
  |  Branch (5100:3): [True: 0, False: 132k]
  ------------------
 5101|      0|#line 1033 "hexpr.y"
 5102|      0|                                                      { (yyval.tconstraint) = new Constraint(CtorVerifier::constraintName(), list(*(yyvsp[0].mtype), TString::make(*(yyvsp[-5].string)), *(yyvsp[-3].mtype))); }
 5103|      0|#line 5104 "hexpr.parse.C"
 5104|      0|    break;
 5105|       |
 5106|      0|  case 332: /* tpred: "|" l1mtype "/" l0mtype "|" "::" l1mtype  */
  ------------------
  |  Branch (5106:3): [True: 0, False: 132k]
  ------------------
 5107|      0|#line 1034 "hexpr.y"
 5108|      0|                                                      { (yyval.tconstraint) = new Constraint(CtorVerifier::constraintName(), list(*(yyvsp[0].mtype), *(yyvsp[-5].mtype),                *(yyvsp[-3].mtype))); }
 5109|      0|#line 5110 "hexpr.parse.C"
 5110|      0|    break;
 5111|       |
 5112|      0|  case 333: /* tpred: l1mtype "++" l1mtype "=" l1mtype  */
  ------------------
  |  Branch (5112:3): [True: 0, False: 132k]
  ------------------
 5113|      0|#line 1035 "hexpr.y"
 5114|      0|                                                      { (yyval.tconstraint) = new Constraint(AppendsToUnqualifier::constraintName(), list(*(yyvsp[-4].mtype), *(yyvsp[-2].mtype), *(yyvsp[0].mtype))); }
 5115|      0|#line 5116 "hexpr.parse.C"
 5116|      0|    break;
 5117|       |
 5118|    677|  case 334: /* l1mtargl: l1mtype  */
  ------------------
  |  Branch (5118:3): [True: 677, False: 131k]
  ------------------
 5119|    677|#line 1037 "hexpr.y"
 5120|    677|                           { (yyval.mtypes) = autorelease(new MonoTypes()); (yyval.mtypes)->push_back(*(yyvsp[0].mtype)); }
 5121|    677|#line 5122 "hexpr.parse.C"
 5122|    677|    break;
 5123|       |
 5124|    706|  case 335: /* l1mtargl: l1mtargl l1mtype  */
  ------------------
  |  Branch (5124:3): [True: 706, False: 131k]
  ------------------
 5125|    706|#line 1038 "hexpr.y"
 5126|    706|                           { (yyvsp[-1].mtypes)->push_back(*(yyvsp[0].mtype)); (yyval.mtypes) = (yyvsp[-1].mtypes); }
 5127|    706|#line 5128 "hexpr.parse.C"
 5128|    706|    break;
 5129|       |
 5130|    179|  case 336: /* ltmtype: ltmtype l0mtype  */
  ------------------
  |  Branch (5130:3): [True: 179, False: 132k]
  ------------------
 5131|    179|#line 1040 "hexpr.y"
 5132|    179|                          { (yyval.mtypes) = (yyvsp[-1].mtypes); (yyval.mtypes)->push_back(*(yyvsp[0].mtype)); }
 5133|    179|#line 5134 "hexpr.parse.C"
 5134|    179|    break;
 5135|       |
 5136|  1.13k|  case 337: /* ltmtype: l0mtype  */
  ------------------
  |  Branch (5136:3): [True: 1.13k, False: 131k]
  ------------------
 5137|  1.13k|#line 1041 "hexpr.y"
 5138|  1.13k|                          { (yyval.mtypes) = autorelease(new MonoTypes()); (yyval.mtypes)->push_back(*(yyvsp[0].mtype)); }
 5139|  1.13k|#line 5140 "hexpr.parse.C"
 5140|  1.13k|    break;
 5141|       |
 5142|    519|  case 338: /* l0mtype: l0mtargl "->" l1mtype  */
  ------------------
  |  Branch (5142:3): [True: 519, False: 131k]
  ------------------
 5143|    519|#line 1043 "hexpr.y"
 5144|    519|                               { (yyval.mtype) = autorelease(new MonoTypePtr(Func::make(tuplety(*(yyvsp[-2].mtypes)), *(yyvsp[0].mtype)))); }
 5145|    519|#line 5146 "hexpr.parse.C"
 5146|    519|    break;
 5147|       |
 5148|  3.83k|  case 339: /* l0mtype: mtuplist  */
  ------------------
  |  Branch (5148:3): [True: 3.83k, False: 128k]
  ------------------
 5149|  3.83k|#line 1044 "hexpr.y"
 5150|  3.83k|                               { (yyval.mtype) = autorelease(new MonoTypePtr(makeTupleType(*(yyvsp[0].mtypes)))); }
 5151|  3.83k|#line 5152 "hexpr.parse.C"
 5152|  3.83k|    break;
 5153|       |
 5154|    234|  case 340: /* l0mtype: msumlist  */
  ------------------
  |  Branch (5154:3): [True: 234, False: 132k]
  ------------------
 5155|    234|#line 1045 "hexpr.y"
 5156|    234|                               { (yyval.mtype) = autorelease(new MonoTypePtr(makeSumType(*(yyvsp[0].mtypes)))); }
 5157|    234|#line 5158 "hexpr.parse.C"
 5158|    234|    break;
 5159|       |
 5160|  5.37k|  case 341: /* l1mtype: id  */
  ------------------
  |  Branch (5160:3): [True: 5.37k, False: 127k]
  ------------------
 5161|  5.37k|#line 1047 "hexpr.y"
 5162|  5.37k|                                           { (yyval.mtype) = autorelease(new MonoTypePtr(monoTypeByName(*(yyvsp[0].string)))); }
 5163|  5.37k|#line 5164 "hexpr.parse.C"
 5164|  5.37k|    break;
 5165|       |
 5166|     39|  case 342: /* l1mtype: "<" cppid ">"  */
  ------------------
  |  Branch (5166:3): [True: 39, False: 132k]
  ------------------
 5167|     39|#line 1048 "hexpr.y"
 5168|     39|                                           { (yyval.mtype) = autorelease(new MonoTypePtr(OpaquePtr::make(str::replace<char>(*(yyvsp[-1].string), ".", "::"), 0, false))); }
 5169|     39|#line 5170 "hexpr.parse.C"
 5170|     39|    break;
 5171|       |
 5172|      0|  case 343: /* l1mtype: "[" "]"  */
  ------------------
  |  Branch (5172:3): [True: 0, False: 132k]
  ------------------
 5173|      0|#line 1049 "hexpr.y"
 5174|      0|                                           { (yyval.mtype) = autorelease(new MonoTypePtr(Prim::make("[]"))); }
 5175|      0|#line 5176 "hexpr.parse.C"
 5176|      0|    break;
 5177|       |
 5178|    501|  case 344: /* l1mtype: "[" ltmtype "]"  */
  ------------------
  |  Branch (5178:3): [True: 501, False: 131k]
  ------------------
 5179|    501|#line 1050 "hexpr.y"
 5180|    501|                                           { try { (yyval.mtype) = autorelease(new MonoTypePtr(Array::make(yyParseCC->replaceTypeAliases(accumTApp(*(yyvsp[-1].mtypes)))))); } catch (std::exception& ex) { throw annotated_error(m((yylsp[-1])), ex.what()); } }
 5181|      0|#line 5182 "hexpr.parse.C"
 5182|    501|    break;
 5183|       |
 5184|     62|  case 345: /* l1mtype: "[" ":" l0mtype "|" tyind ":" "]"  */
  ------------------
  |  Branch (5184:3): [True: 62, False: 132k]
  ------------------
 5185|     62|#line 1051 "hexpr.y"
 5186|     62|                                           { (yyval.mtype) = autorelease(new MonoTypePtr(FixedArray::make(*(yyvsp[-4].mtype), *(yyvsp[-2].mtype)))); }
 5187|     62|#line 5188 "hexpr.parse.C"
 5188|     62|    break;
 5189|       |
 5190|      0|  case 346: /* l1mtype: "(" "->" ")"  */
  ------------------
  |  Branch (5190:3): [True: 0, False: 132k]
  ------------------
 5191|      0|#line 1052 "hexpr.y"
 5192|      0|                                           { (yyval.mtype) = autorelease(new MonoTypePtr(Prim::make("->"))); }
 5193|      0|#line 5194 "hexpr.parse.C"
 5194|      0|    break;
 5195|       |
 5196|    635|  case 347: /* l1mtype: "(" ltmtype ")"  */
  ------------------
  |  Branch (5196:3): [True: 635, False: 131k]
  ------------------
 5197|    635|#line 1053 "hexpr.y"
 5198|    635|                                           { try { (yyval.mtype) = autorelease(new MonoTypePtr(clone(yyParseCC->replaceTypeAliases(accumTApp(*(yyvsp[-1].mtypes)))))); } catch (std::exception& ex) { throw annotated_error(m((yylsp[-1])), ex.what()); } }
 5199|      0|#line 5200 "hexpr.parse.C"
 5200|    635|    break;
 5201|       |
 5202|     19|  case 348: /* l1mtype: "{" mreclist "}"  */
  ------------------
  |  Branch (5202:3): [True: 19, False: 132k]
  ------------------
 5203|     19|#line 1054 "hexpr.y"
 5204|     19|                                           { (yyval.mtype) = autorelease(new MonoTypePtr(makeRecType(*(yyvsp[-1].mreclist)))); }
 5205|     19|#line 5206 "hexpr.parse.C"
 5206|     19|    break;
 5207|       |
 5208|      2|  case 349: /* l1mtype: "|" mvarlist "|"  */
  ------------------
  |  Branch (5208:3): [True: 2, False: 132k]
  ------------------
 5209|      2|#line 1055 "hexpr.y"
 5210|      2|                                           { (yyval.mtype) = autorelease(new MonoTypePtr(makeVarType(*(yyvsp[-1].mvarlist)))); }
 5211|      2|#line 5212 "hexpr.parse.C"
 5212|      2|    break;
 5213|       |
 5214|      0|  case 350: /* l1mtype: "|" mpvarlist "|"  */
  ------------------
  |  Branch (5214:3): [True: 0, False: 132k]
  ------------------
 5215|      0|#line 1056 "hexpr.y"
 5216|      0|                                           { (yyval.mtype) = autorelease(new MonoTypePtr(makePVarType(*(yyvsp[-1].mvarlist), m((yylsp[-1]))))); }
 5217|      0|#line 5218 "hexpr.parse.C"
 5218|      0|    break;
 5219|       |
 5220|    387|  case 351: /* l1mtype: "(" ")"  */
  ------------------
  |  Branch (5220:3): [True: 387, False: 132k]
  ------------------
 5221|    387|#line 1057 "hexpr.y"
 5222|    387|                                           { (yyval.mtype) = autorelease(new MonoTypePtr(Prim::make("unit"))); }
 5223|    387|#line 5224 "hexpr.parse.C"
 5224|    387|    break;
 5225|       |
 5226|     56|  case 352: /* l1mtype: "intV"  */
  ------------------
  |  Branch (5226:3): [True: 56, False: 132k]
  ------------------
 5227|     56|#line 1058 "hexpr.y"
 5228|     56|                                           { (yyval.mtype) = autorelease(new MonoTypePtr(((yyvsp[0].intv) == 0) ? Prim::make("void") : TLong::make((yyvsp[0].intv)))); }
  ------------------
  |  Branch (5228:90): [True: 20, False: 36]
  ------------------
 5229|     56|#line 5230 "hexpr.parse.C"
 5230|     56|    break;
 5231|       |
 5232|      0|  case 353: /* l1mtype: "boolV"  */
  ------------------
  |  Branch (5232:3): [True: 0, False: 132k]
  ------------------
 5233|      0|#line 1059 "hexpr.y"
 5234|      0|                                           { (yyval.mtype) = autorelease(new MonoTypePtr((yyvsp[0].boolv) ? TLong::make(1) : TLong::make(0))); }
  ------------------
  |  Branch (5234:90): [True: 0, False: 0]
  ------------------
 5235|      0|#line 5236 "hexpr.parse.C"
 5236|      0|    break;
 5237|       |
 5238|     29|  case 354: /* l1mtype: "exists" id "." l1mtype  */
  ------------------
  |  Branch (5238:3): [True: 29, False: 132k]
  ------------------
 5239|     29|#line 1060 "hexpr.y"
 5240|     29|                                           { (yyval.mtype) = autorelease(new MonoTypePtr(Exists::make(*(yyvsp[-2].string), *(yyvsp[0].mtype)))); }
 5241|     29|#line 5242 "hexpr.parse.C"
 5242|     29|    break;
 5243|       |
 5244|     68|  case 355: /* l1mtype: l1mtype "@" l1mtype  */
  ------------------
  |  Branch (5244:3): [True: 68, False: 132k]
  ------------------
 5245|     68|#line 1061 "hexpr.y"
 5246|     68|                                           { (yyval.mtype) = autorelease(new MonoTypePtr(fileRefTy(*(yyvsp[-2].mtype), *(yyvsp[0].mtype)))); }
 5247|     68|#line 5248 "hexpr.parse.C"
 5248|     68|    break;
 5249|       |
 5250|     19|  case 356: /* l1mtype: l1mtype "@" "?"  */
  ------------------
  |  Branch (5250:3): [True: 19, False: 132k]
  ------------------
 5251|     19|#line 1062 "hexpr.y"
 5252|     19|                                           { (yyval.mtype) = autorelease(new MonoTypePtr(fileRefTy(*(yyvsp[-2].mtype)))); }
 5253|     19|#line 5254 "hexpr.parse.C"
 5254|     19|    break;
 5255|       |
 5256|     89|  case 357: /* l1mtype: "^" id "." l1mtype  */
  ------------------
  |  Branch (5256:3): [True: 89, False: 132k]
  ------------------
 5257|     89|#line 1063 "hexpr.y"
 5258|     89|                                           { (yyval.mtype) = autorelease(new MonoTypePtr(Recursive::make(*(yyvsp[-2].string), *(yyvsp[0].mtype)))); }
 5259|     89|#line 5260 "hexpr.parse.C"
 5260|     89|    break;
 5261|       |
 5262|    102|  case 358: /* l1mtype: "stringV"  */
  ------------------
  |  Branch (5262:3): [True: 102, False: 132k]
  ------------------
 5263|    102|#line 1064 "hexpr.y"
 5264|    102|                                           { (yyval.mtype) = autorelease(new MonoTypePtr(TString::make(str::unescape(str::trimq(*(yyvsp[0].string)))))); }
 5265|    102|#line 5266 "hexpr.parse.C"
 5266|    102|    break;
 5267|       |
 5268|      0|  case 359: /* l1mtype: "`" l0expr "`"  */
  ------------------
  |  Branch (5268:3): [True: 0, False: 132k]
  ------------------
 5269|      0|#line 1065 "hexpr.y"
 5270|      0|                                           { (yyval.mtype) = autorelease(new MonoTypePtr(quotedExprType((yyvsp[-1].exp)))); }
 5271|      0|#line 5272 "hexpr.parse.C"
 5272|      0|    break;
 5273|       |
 5274|     60|  case 360: /* tyind: id  */
  ------------------
  |  Branch (5274:3): [True: 60, False: 132k]
  ------------------
 5275|     60|#line 1067 "hexpr.y"
 5276|     60|              { (yyval.mtype) = autorelease(new MonoTypePtr(TVar::make(*(yyvsp[0].string)))); }
 5277|     60|#line 5278 "hexpr.parse.C"
 5278|     60|    break;
 5279|       |
 5280|      2|  case 361: /* tyind: "intV"  */
  ------------------
  |  Branch (5280:3): [True: 2, False: 132k]
  ------------------
 5281|      2|#line 1068 "hexpr.y"
 5282|      2|              { (yyval.mtype) = autorelease(new MonoTypePtr(TLong::make((yyvsp[0].intv)))); }
 5283|      2|#line 5284 "hexpr.parse.C"
 5284|      2|    break;
 5285|       |
 5286|     39|  case 362: /* cppid: id  */
  ------------------
  |  Branch (5286:3): [True: 39, False: 132k]
  ------------------
 5287|     39|#line 1070 "hexpr.y"
 5288|     39|                    { (yyval.string) = (yyvsp[0].string); }
 5289|     39|#line 5290 "hexpr.parse.C"
 5290|     39|    break;
 5291|       |
 5292|     43|  case 363: /* cppid: cppid "." id  */
  ------------------
  |  Branch (5292:3): [True: 43, False: 132k]
  ------------------
 5293|     43|#line 1071 "hexpr.y"
 5294|     43|                    { (yyval.string) = (yyvsp[-2].string); *(yyval.string) += "."; *(yyval.string) += *(yyvsp[0].string); }
 5295|     43|#line 5296 "hexpr.parse.C"
 5296|     43|    break;
 5297|       |
 5298|    161|  case 364: /* l0mtargl: l1mtype  */
  ------------------
  |  Branch (5298:3): [True: 161, False: 132k]
  ------------------
 5299|    161|#line 1073 "hexpr.y"
 5300|    161|                                        { (yyval.mtypes) = autorelease(new MonoTypes()); (yyval.mtypes)->push_back(*(yyvsp[0].mtype)); }
 5301|    161|#line 5302 "hexpr.parse.C"
 5302|    161|    break;
 5303|       |
 5304|    358|  case 365: /* l0mtargl: "(" l0mtype "," l0mtarglt ")"  */
  ------------------
  |  Branch (5304:3): [True: 358, False: 132k]
  ------------------
 5305|    358|#line 1074 "hexpr.y"
 5306|    358|                                        { (yyvsp[-1].mtypes)->insert((yyvsp[-1].mtypes)->begin(), *(yyvsp[-3].mtype)); (yyval.mtypes) = (yyvsp[-1].mtypes); }
 5307|    358|#line 5308 "hexpr.parse.C"
 5308|    358|    break;
 5309|       |
 5310|    358|  case 366: /* l0mtarglt: l0mtype  */
  ------------------
  |  Branch (5310:3): [True: 358, False: 132k]
  ------------------
 5311|    358|#line 1076 "hexpr.y"
 5312|    358|                                 { (yyval.mtypes) = autorelease(new MonoTypes()); (yyval.mtypes)->push_back(*(yyvsp[0].mtype)); }
 5313|    358|#line 5314 "hexpr.parse.C"
 5314|    358|    break;
 5315|       |
 5316|    308|  case 367: /* l0mtarglt: l0mtarglt "," l0mtype  */
  ------------------
  |  Branch (5316:3): [True: 308, False: 132k]
  ------------------
 5317|    308|#line 1077 "hexpr.y"
 5318|    308|                                 { (yyvsp[-2].mtypes)->push_back(*(yyvsp[0].mtype)); (yyval.mtypes) = (yyvsp[-2].mtypes); }
 5319|    308|#line 5320 "hexpr.parse.C"
 5320|    308|    break;
 5321|       |
 5322|  3.83k|  case 368: /* mtuplist: l1mtype  */
  ------------------
  |  Branch (5322:3): [True: 3.83k, False: 128k]
  ------------------
 5323|  3.83k|#line 1079 "hexpr.y"
 5324|  3.83k|                               { (yyval.mtypes) = autorelease(new MonoTypes()); (yyval.mtypes)->push_back(*(yyvsp[0].mtype)); }
 5325|  3.83k|#line 5326 "hexpr.parse.C"
 5326|  3.83k|    break;
 5327|       |
 5328|    235|  case 369: /* mtuplist: mtuplist "*" l1mtype  */
  ------------------
  |  Branch (5328:3): [True: 235, False: 132k]
  ------------------
 5329|    235|#line 1080 "hexpr.y"
 5330|    235|                               { (yyval.mtypes) = (yyvsp[-2].mtypes); (yyval.mtypes)->push_back(*(yyvsp[0].mtype)); }
 5331|    235|#line 5332 "hexpr.parse.C"
 5332|    235|    break;
 5333|       |
 5334|    234|  case 370: /* msumlist: l1mtype "+" l1mtype  */
  ------------------
  |  Branch (5334:3): [True: 234, False: 132k]
  ------------------
 5335|    234|#line 1082 "hexpr.y"
 5336|    234|                               { (yyval.mtypes) = autorelease(new MonoTypes()); (yyval.mtypes)->push_back(*(yyvsp[-2].mtype)); (yyval.mtypes)->push_back(*(yyvsp[0].mtype)); }
 5337|    234|#line 5338 "hexpr.parse.C"
 5338|    234|    break;
 5339|       |
 5340|      0|  case 371: /* msumlist: msumlist "+" l1mtype  */
  ------------------
  |  Branch (5340:3): [True: 0, False: 132k]
  ------------------
 5341|      0|#line 1083 "hexpr.y"
 5342|      0|                               { (yyval.mtypes) = (yyvsp[-2].mtypes); (yyval.mtypes)->push_back(*(yyvsp[0].mtype)); }
 5343|      0|#line 5344 "hexpr.parse.C"
 5344|      0|    break;
 5345|       |
 5346|     19|  case 372: /* mreclist: mreclist "," id ":" l0mtype  */
  ------------------
  |  Branch (5346:3): [True: 19, False: 132k]
  ------------------
 5347|     19|#line 1085 "hexpr.y"
 5348|     19|                                      { (yyval.mreclist) = (yyvsp[-4].mreclist);                                 (yyval.mreclist)->push_back(Record::Member(*(yyvsp[-2].string), *(yyvsp[0].mtype))); }
 5349|     19|#line 5350 "hexpr.parse.C"
 5350|     19|    break;
 5351|       |
 5352|     19|  case 373: /* mreclist: id ":" l0mtype  */
  ------------------
  |  Branch (5352:3): [True: 19, False: 132k]
  ------------------
 5353|     19|#line 1086 "hexpr.y"
 5354|     19|                                      { (yyval.mreclist) = autorelease(new Record::Members()); (yyval.mreclist)->push_back(Record::Member(*(yyvsp[-2].string), *(yyvsp[0].mtype))); }
 5355|     19|#line 5356 "hexpr.parse.C"
 5356|     19|    break;
 5357|       |
 5358|      2|  case 374: /* mvarlist: mvarlist "," id ":" l0mtype  */
  ------------------
  |  Branch (5358:3): [True: 2, False: 132k]
  ------------------
 5359|      2|#line 1088 "hexpr.y"
 5360|      2|                                      { (yyval.mvarlist) = (yyvsp[-4].mvarlist);                                  (yyval.mvarlist)->push_back(Variant::Member(*(yyvsp[-2].string), *(yyvsp[0].mtype),                0)); }
 5361|      2|#line 5362 "hexpr.parse.C"
 5362|      2|    break;
 5363|       |
 5364|      0|  case 375: /* mvarlist: mvarlist "," id  */
  ------------------
  |  Branch (5364:3): [True: 0, False: 132k]
  ------------------
 5365|      0|#line 1089 "hexpr.y"
 5366|      0|                                      { (yyval.mvarlist) = (yyvsp[-2].mvarlist);                                  (yyval.mvarlist)->push_back(Variant::Member(*(yyvsp[0].string), Prim::make("unit"), 0)); }
 5367|      0|#line 5368 "hexpr.parse.C"
 5368|      0|    break;
 5369|       |
 5370|      2|  case 376: /* mvarlist: id ":" l0mtype  */
  ------------------
  |  Branch (5370:3): [True: 2, False: 132k]
  ------------------
 5371|      2|#line 1090 "hexpr.y"
 5372|      2|                                      { (yyval.mvarlist) = autorelease(new Variant::Members()); (yyval.mvarlist)->push_back(Variant::Member(*(yyvsp[-2].string), *(yyvsp[0].mtype),                0)); }
 5373|      2|#line 5374 "hexpr.parse.C"
 5374|      2|    break;
 5375|       |
 5376|      0|  case 377: /* mvarlist: id  */
  ------------------
  |  Branch (5376:3): [True: 0, False: 132k]
  ------------------
 5377|      0|#line 1091 "hexpr.y"
 5378|      0|                                      { (yyval.mvarlist) = autorelease(new Variant::Members()); (yyval.mvarlist)->push_back(Variant::Member(*(yyvsp[0].string), Prim::make("unit"), 0)); }
 5379|      0|#line 5380 "hexpr.parse.C"
 5380|      0|    break;
 5381|       |
 5382|      0|  case 378: /* mpvarlist: mpvarlist "," mpvar  */
  ------------------
  |  Branch (5382:3): [True: 0, False: 132k]
  ------------------
 5383|      0|#line 1093 "hexpr.y"
 5384|      0|                               { (yyval.mvarlist) = (yyvsp[-2].mvarlist);                                  (yyval.mvarlist)->push_back(*(yyvsp[0].mpvar)); }
 5385|      0|#line 5386 "hexpr.parse.C"
 5386|      0|    break;
 5387|       |
 5388|      0|  case 379: /* mpvarlist: mpvar  */
  ------------------
  |  Branch (5388:3): [True: 0, False: 132k]
  ------------------
 5389|      0|#line 1094 "hexpr.y"
 5390|      0|                               { (yyval.mvarlist) = autorelease(new Variant::Members()); (yyval.mvarlist)->push_back(*(yyvsp[0].mpvar)); }
 5391|      0|#line 5392 "hexpr.parse.C"
 5392|      0|    break;
 5393|       |
 5394|      0|  case 380: /* mpvar: id "(" "intV" ")"  */
  ------------------
  |  Branch (5394:3): [True: 0, False: 132k]
  ------------------
 5395|      0|#line 1096 "hexpr.y"
 5396|      0|                           { (yyval.mpvar) = autorelease(new Variant::Member(*(yyvsp[-3].string), Prim::make("unit"), (yyvsp[-1].intv))); }
 5397|      0|#line 5398 "hexpr.parse.C"
 5398|      0|    break;
 5399|       |
 5400|      0|  case 381: /* mpvar: id "(" "shortV" ")"  */
  ------------------
  |  Branch (5400:3): [True: 0, False: 132k]
  ------------------
 5401|      0|#line 1097 "hexpr.y"
 5402|      0|                           { (yyval.mpvar) = autorelease(new Variant::Member(*(yyvsp[-3].string), Prim::make("unit"), (yyvsp[-1].shortv))); }
 5403|      0|#line 5404 "hexpr.parse.C"
 5404|      0|    break;
 5405|       |
 5406|      0|  case 382: /* mpvar: id "(" "boolV" ")"  */
  ------------------
  |  Branch (5406:3): [True: 0, False: 132k]
  ------------------
 5407|      0|#line 1098 "hexpr.y"
 5408|      0|                           { (yyval.mpvar) = autorelease(new Variant::Member(*(yyvsp[-3].string), Prim::make("unit"), (yyvsp[-1].boolv))); }
 5409|      0|#line 5410 "hexpr.parse.C"
 5410|      0|    break;
 5411|       |
 5412|      0|  case 383: /* mpvar: id "(" "byteV" ")"  */
  ------------------
  |  Branch (5412:3): [True: 0, False: 132k]
  ------------------
 5413|      0|#line 1099 "hexpr.y"
 5414|      0|                           { (yyval.mpvar) = autorelease(new Variant::Member(*(yyvsp[-3].string), Prim::make("unit"), str::dehex(*(yyvsp[-1].string)))); }
 5415|      0|#line 5416 "hexpr.parse.C"
 5416|      0|    break;
 5417|       |
 5418|      0|  case 384: /* mpvar: id "(" "charV" ")"  */
  ------------------
  |  Branch (5418:3): [True: 0, False: 132k]
  ------------------
 5419|      0|#line 1100 "hexpr.y"
 5420|      0|                           { (yyval.mpvar) = autorelease(new Variant::Member(*(yyvsp[-3].string), Prim::make("unit"), str::readCharDef(*(yyvsp[-1].string)))); }
 5421|      0|#line 5422 "hexpr.parse.C"
 5422|      0|    break;
 5423|       |
 5424|       |
 5425|      0|#line 5426 "hexpr.parse.C"
 5426|       |
 5427|  17.9k|      default: break;
  ------------------
  |  Branch (5427:7): [True: 17.9k, False: 114k]
  ------------------
 5428|   132k|    }
 5429|       |  /* User semantic actions sometimes alter yychar, and that requires
 5430|       |     that yytoken be updated with the new translation.  We take the
 5431|       |     approach of translating immediately before every use of yytoken.
 5432|       |     One alternative is translating here after every semantic action,
 5433|       |     but that translation would be missed if the semantic action invokes
 5434|       |     YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or
 5435|       |     if it invokes YYBACKUP.  In the case of YYABORT or YYACCEPT, an
 5436|       |     incorrect destructor might then be invoked immediately.  In the
 5437|       |     case of YYERROR or YYBACKUP, subsequent parser actions might lead
 5438|       |     to an incorrect destructor call or verbose syntax error message
 5439|       |     before the lookahead is translated.  */
 5440|   132k|  YY_SYMBOL_PRINT ("-> $$ =", YY_CAST (yysymbol_kind_t, yyr1[yyn]), &yyval, &yyloc);
 5441|       |
 5442|   132k|  YYPOPSTACK (yylen);
  ------------------
  |  | 2895|   132k|#define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N), yylsp -= (N))
  ------------------
 5443|   132k|  yylen = 0;
 5444|       |
 5445|   132k|  *++yyvsp = yyval;
 5446|   132k|  *++yylsp = yyloc;
 5447|       |
 5448|       |  /* Now 'shift' the result of the reduction.  Determine what state
 5449|       |     that goes to, based on the state we popped back to and the rule
 5450|       |     number reduced by.  */
 5451|   132k|  {
 5452|   132k|    const int yylhs = yyr1[yyn] - YYNTOKENS;
  ------------------
  |  |  930|   132k|#define YYNTOKENS  98
  ------------------
 5453|   132k|    const int yyi = yypgoto[yylhs] + *yyssp;
 5454|   132k|    yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp
  ------------------
  |  |  927|   250k|#define YYLAST   3006
  ------------------
  |  Branch (5454:16): [True: 117k, False: 14.8k]
  |  Branch (5454:28): [True: 117k, False: 0]
  |  Branch (5454:45): [True: 37.9k, False: 79.6k]
  ------------------
 5455|   132k|               ? yytable[yyi]
 5456|   132k|               : yydefgoto[yylhs]);
 5457|   132k|  }
 5458|       |
 5459|   132k|  goto yynewstate;
 5460|       |
 5461|       |
 5462|       |/*--------------------------------------.
 5463|       || yyerrlab -- here on detecting error.  |
 5464|       |`--------------------------------------*/
 5465|      0|yyerrlab:
 5466|       |  /* Make sure we have latest lookahead translation.  See comments at
 5467|       |     user semantic actions for why this is necessary.  */
 5468|      0|  yytoken = yychar == YYEMPTY ? YYSYMBOL_YYEMPTY : YYTRANSLATE (yychar);
  ------------------
  |  |  945|      0|  (0 <= (YYX) && (YYX) <= YYMAXUTOK                     \
  |  |  ------------------
  |  |  |  |  939|      0|#define YYMAXUTOK   352
  |  |  ------------------
  |  |  |  Branch (945:4): [True: 0, False: 0]
  |  |  |  Branch (945:18): [True: 0, False: 0]
  |  |  ------------------
  |  |  946|      0|   ? YY_CAST (yysymbol_kind_t, yytranslate[YYX])        \
  |  |  ------------------
  |  |  |  |  387|      0|#   define YY_CAST(Type, Val) static_cast<Type> (Val)
  |  |  ------------------
  |  |  947|      0|   : YYSYMBOL_YYUNDEF)
  ------------------
  |  Branch (5468:13): [True: 0, False: 0]
  ------------------
 5469|       |  /* If not already recovering from an error, report this error.  */
 5470|      0|  if (!yyerrstatus)
  ------------------
  |  Branch (5470:7): [True: 0, False: 0]
  ------------------
 5471|      0|    {
 5472|      0|      ++yynerrs;
 5473|      0|      {
 5474|      0|        yypcontext_t yyctx
 5475|      0|          = {yyssp, yytoken, &yylloc};
 5476|      0|        char const *yymsgp = YY_("syntax error");
  ------------------
  |  |  726|      0|#  define YY_(Msgid) Msgid
  ------------------
 5477|      0|        int yysyntax_error_status;
 5478|      0|        yysyntax_error_status = yysyntax_error (&yymsg_alloc, &yymsg, &yyctx);
 5479|      0|        if (yysyntax_error_status == 0)
  ------------------
  |  Branch (5479:13): [True: 0, False: 0]
  ------------------
 5480|      0|          yymsgp = yymsg;
 5481|      0|        else if (yysyntax_error_status == -1)
  ------------------
  |  Branch (5481:18): [True: 0, False: 0]
  ------------------
 5482|      0|          {
 5483|      0|            if (yymsg != yymsgbuf)
  ------------------
  |  Branch (5483:17): [True: 0, False: 0]
  ------------------
 5484|      0|              YYSTACK_FREE (yymsg);
  ------------------
  |  |  834|      0|#  define YYSTACK_FREE YYFREE
  |  |  ------------------
  |  |  |  |  853|      0|#   define YYFREE free
  |  |  ------------------
  ------------------
 5485|      0|            yymsg = YY_CAST (char *,
  ------------------
  |  |  387|      0|#   define YY_CAST(Type, Val) static_cast<Type> (Val)
  ------------------
 5486|      0|                             YYSTACK_ALLOC (YY_CAST (YYSIZE_T, yymsg_alloc)));
 5487|      0|            if (yymsg)
  ------------------
  |  Branch (5487:17): [True: 0, False: 0]
  ------------------
 5488|      0|              {
 5489|      0|                yysyntax_error_status
 5490|      0|                  = yysyntax_error (&yymsg_alloc, &yymsg, &yyctx);
 5491|      0|                yymsgp = yymsg;
 5492|      0|              }
 5493|      0|            else
 5494|      0|              {
 5495|      0|                yymsg = yymsgbuf;
 5496|      0|                yymsg_alloc = sizeof yymsgbuf;
 5497|      0|                yysyntax_error_status = YYENOMEM;
 5498|      0|              }
 5499|      0|          }
 5500|      0|        yyerror (yymsgp);
 5501|      0|        if (yysyntax_error_status == YYENOMEM)
  ------------------
  |  Branch (5501:13): [True: 0, False: 0]
  ------------------
 5502|      0|          YYNOMEM;
  ------------------
  |  | 2112|      0|#define YYNOMEM         goto yyexhaustedlab
  ------------------
 5503|      0|      }
 5504|      0|    }
 5505|       |
 5506|      0|  yyerror_range[1] = yylloc;
 5507|      0|  if (yyerrstatus == 3)
  ------------------
  |  Branch (5507:7): [True: 0, False: 0]
  ------------------
 5508|      0|    {
 5509|       |      /* If just tried and failed to reuse lookahead token after an
 5510|       |         error, discard it.  */
 5511|       |
 5512|      0|      if (yychar <= YYEOF)
  ------------------
  |  Branch (5512:11): [True: 0, False: 0]
  ------------------
 5513|      0|        {
 5514|       |          /* Return failure if at end of input.  */
 5515|      0|          if (yychar == YYEOF)
  ------------------
  |  Branch (5515:15): [True: 0, False: 0]
  ------------------
 5516|      0|            YYABORT;
  ------------------
  |  | 2110|      0|#define YYABORT         goto yyabortlab
  ------------------
 5517|      0|        }
 5518|      0|      else
 5519|      0|        {
 5520|      0|          yydestruct ("Error: discarding",
 5521|      0|                      yytoken, &yylval, &yylloc);
 5522|      0|          yychar = YYEMPTY;
 5523|      0|        }
 5524|      0|    }
 5525|       |
 5526|       |  /* Else will try to reuse lookahead token after shifting the error
 5527|       |     token.  */
 5528|      0|  goto yyerrlab1;
 5529|       |
 5530|       |
 5531|       |/*---------------------------------------------------.
 5532|       || yyerrorlab -- error raised explicitly by YYERROR.  |
 5533|       |`---------------------------------------------------*/
 5534|      0|yyerrorlab:
 5535|       |  /* Pacify compilers when the user code never invokes YYERROR and the
 5536|       |     label yyerrorlab therefore never appears in user code.  */
 5537|      0|  if (0)
  ------------------
  |  Branch (5537:7): [Folded, False: 0]
  ------------------
 5538|      0|    YYERROR;
  ------------------
  |  | 2111|      0|#define YYERROR         goto yyerrorlab
  ------------------
 5539|      0|  ++yynerrs;
 5540|       |
 5541|       |  /* Do not reclaim the symbols of the rule whose action triggered
 5542|       |     this YYERROR.  */
 5543|      0|  YYPOPSTACK (yylen);
  ------------------
  |  | 2895|      0|#define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N), yylsp -= (N))
  ------------------
 5544|      0|  yylen = 0;
 5545|      0|  YY_STACK_PRINT (yyss, yyssp);
 5546|      0|  yystate = *yyssp;
 5547|      0|  goto yyerrlab1;
 5548|       |
 5549|       |
 5550|       |/*-------------------------------------------------------------.
 5551|       || yyerrlab1 -- common code for both syntax error and YYERROR.  |
 5552|       |`-------------------------------------------------------------*/
 5553|      0|yyerrlab1:
 5554|      0|  yyerrstatus = 3;      /* Each real token shifted decrements this.  */
 5555|       |
 5556|       |  /* Pop stack until we find a state that shifts the error token.  */
 5557|      0|  for (;;)
 5558|      0|    {
 5559|      0|      yyn = yypact[yystate];
 5560|      0|      if (!yypact_value_is_default (yyn))
  ------------------
  |  | 1093|      0|  ((Yyn) == YYPACT_NINF)
  |  |  ------------------
  |  |  |  | 1090|      0|#define YYPACT_NINF (-617)
  |  |  ------------------
  ------------------
  |  Branch (5560:11): [True: 0, False: 0]
  ------------------
 5561|      0|        {
 5562|      0|          yyn += YYSYMBOL_YYerror;
 5563|      0|          if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYSYMBOL_YYerror)
  ------------------
  |  |  927|      0|#define YYLAST   3006
  ------------------
  |  Branch (5563:15): [True: 0, False: 0]
  |  Branch (5563:27): [True: 0, False: 0]
  |  Branch (5563:44): [True: 0, False: 0]
  ------------------
 5564|      0|            {
 5565|      0|              yyn = yytable[yyn];
 5566|      0|              if (0 < yyn)
  ------------------
  |  Branch (5566:19): [True: 0, False: 0]
  ------------------
 5567|      0|                break;
 5568|      0|            }
 5569|      0|        }
 5570|       |
 5571|       |      /* Pop the current state because it cannot handle the error token.  */
 5572|      0|      if (yyssp == yyss)
  ------------------
  |  Branch (5572:11): [True: 0, False: 0]
  ------------------
 5573|      0|        YYABORT;
  ------------------
  |  | 2110|      0|#define YYABORT         goto yyabortlab
  ------------------
 5574|       |
 5575|      0|      yyerror_range[1] = *yylsp;
 5576|      0|      yydestruct ("Error: popping",
 5577|      0|                  YY_ACCESSING_SYMBOL (yystate), yyvsp, yylsp);
  ------------------
  |  | 1038|      0|#define YY_ACCESSING_SYMBOL(State) YY_CAST (yysymbol_kind_t, yystos[State])
  |  |  ------------------
  |  |  |  |  387|      0|#   define YY_CAST(Type, Val) static_cast<Type> (Val)
  |  |  ------------------
  ------------------
 5578|      0|      YYPOPSTACK (1);
  ------------------
  |  | 2895|      0|#define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N), yylsp -= (N))
  ------------------
 5579|      0|      yystate = *yyssp;
 5580|      0|      YY_STACK_PRINT (yyss, yyssp);
 5581|      0|    }
 5582|       |
 5583|      0|  YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
 5584|      0|  *++yyvsp = yylval;
 5585|      0|  YY_IGNORE_MAYBE_UNINITIALIZED_END
 5586|       |
 5587|      0|  yyerror_range[2] = yylloc;
 5588|      0|  ++yylsp;
 5589|      0|  YYLLOC_DEFAULT (*yylsp, yyerror_range, 2);
  ------------------
  |  |   84|      0|  if (N) { \
  |  |  ------------------
  |  |  |  Branch (84:7): [True: 0, Folded]
  |  |  ------------------
  |  |   85|      0|    (L).first_line   = YYRHSLOC(R, 1).first_line; \
  |  |  ------------------
  |  |  |  | 2162|      0|#define YYRHSLOC(Rhs, K) ((Rhs)[K])
  |  |  ------------------
  |  |   86|      0|    (L).first_column = YYRHSLOC(R, 1).first_column; \
  |  |  ------------------
  |  |  |  | 2162|      0|#define YYRHSLOC(Rhs, K) ((Rhs)[K])
  |  |  ------------------
  |  |   87|      0|    (L).last_line    = YYRHSLOC(R, N).last_line; \
  |  |  ------------------
  |  |  |  | 2162|      0|#define YYRHSLOC(Rhs, K) ((Rhs)[K])
  |  |  ------------------
  |  |   88|      0|    (L).last_column  = YYRHSLOC(R, N).last_column; \
  |  |  ------------------
  |  |  |  | 2162|      0|#define YYRHSLOC(Rhs, K) ((Rhs)[K])
  |  |  ------------------
  |  |   89|      0|  } else { \
  |  |   90|      0|    (L).first_line = (L).last_line = YYRHSLOC(R, 0).last_line; \
  |  |  ------------------
  |  |  |  | 2162|      0|#define YYRHSLOC(Rhs, K) ((Rhs)[K])
  |  |  ------------------
  |  |   91|      0|    (L).first_column = (L).last_column = YYRHSLOC(R, 0).last_column; \
  |  |  ------------------
  |  |  |  | 2162|      0|#define YYRHSLOC(Rhs, K) ((Rhs)[K])
  |  |  ------------------
  |  |   92|      0|  }
  ------------------
 5590|       |
 5591|       |  /* Shift the error token.  */
 5592|      0|  YY_SYMBOL_PRINT ("Shifting", YY_ACCESSING_SYMBOL (yyn), yyvsp, yylsp);
 5593|       |
 5594|      0|  yystate = yyn;
 5595|      0|  goto yynewstate;
 5596|       |
 5597|       |
 5598|       |/*-------------------------------------.
 5599|       || yyacceptlab -- YYACCEPT comes here.  |
 5600|       |`-------------------------------------*/
 5601|     30|yyacceptlab:
 5602|     30|  yyresult = 0;
 5603|     30|  goto yyreturnlab;
 5604|       |
 5605|       |
 5606|       |/*-----------------------------------.
 5607|       || yyabortlab -- YYABORT comes here.  |
 5608|       |`-----------------------------------*/
 5609|      0|yyabortlab:
 5610|      0|  yyresult = 1;
 5611|      0|  goto yyreturnlab;
 5612|       |
 5613|       |
 5614|       |/*-----------------------------------------------------------.
 5615|       || yyexhaustedlab -- YYNOMEM (memory exhaustion) comes here.  |
 5616|       |`-----------------------------------------------------------*/
 5617|      0|yyexhaustedlab:
 5618|      0|  yyerror (YY_("memory exhausted"));
  ------------------
  |  |  726|      0|#  define YY_(Msgid) Msgid
  ------------------
 5619|      0|  yyresult = 2;
 5620|      0|  goto yyreturnlab;
 5621|       |
 5622|       |
 5623|       |/*----------------------------------------------------------.
 5624|       || yyreturnlab -- parsing is finished, clean up and return.  |
 5625|       |`----------------------------------------------------------*/
 5626|     30|yyreturnlab:
 5627|     30|  if (yychar != YYEMPTY)
  ------------------
  |  Branch (5627:7): [True: 0, False: 30]
  ------------------
 5628|      0|    {
 5629|       |      /* Make sure we have latest lookahead translation.  See comments at
 5630|       |         user semantic actions for why this is necessary.  */
 5631|      0|      yytoken = YYTRANSLATE (yychar);
  ------------------
  |  |  945|      0|  (0 <= (YYX) && (YYX) <= YYMAXUTOK                     \
  |  |  ------------------
  |  |  |  |  939|      0|#define YYMAXUTOK   352
  |  |  ------------------
  |  |  |  Branch (945:4): [True: 0, False: 0]
  |  |  |  Branch (945:18): [True: 0, False: 0]
  |  |  ------------------
  |  |  946|      0|   ? YY_CAST (yysymbol_kind_t, yytranslate[YYX])        \
  |  |  ------------------
  |  |  |  |  387|      0|#   define YY_CAST(Type, Val) static_cast<Type> (Val)
  |  |  ------------------
  |  |  947|      0|   : YYSYMBOL_YYUNDEF)
  ------------------
 5632|      0|      yydestruct ("Cleanup: discarding lookahead",
 5633|      0|                  yytoken, &yylval, &yylloc);
 5634|      0|    }
 5635|       |  /* Do not reclaim the symbols of the rule whose action triggered
 5636|       |     this YYABORT or YYACCEPT.  */
 5637|     30|  YYPOPSTACK (yylen);
  ------------------
  |  | 2895|     30|#define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N), yylsp -= (N))
  ------------------
 5638|     30|  YY_STACK_PRINT (yyss, yyssp);
 5639|     90|  while (yyssp != yyss)
  ------------------
  |  Branch (5639:10): [True: 60, False: 30]
  ------------------
 5640|     60|    {
 5641|     60|      yydestruct ("Cleanup: popping",
 5642|     60|                  YY_ACCESSING_SYMBOL (+*yyssp), yyvsp, yylsp);
  ------------------
  |  | 1038|     60|#define YY_ACCESSING_SYMBOL(State) YY_CAST (yysymbol_kind_t, yystos[State])
  |  |  ------------------
  |  |  |  |  387|     60|#   define YY_CAST(Type, Val) static_cast<Type> (Val)
  |  |  ------------------
  ------------------
 5643|     60|      YYPOPSTACK (1);
  ------------------
  |  | 2895|     60|#define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N), yylsp -= (N))
  ------------------
 5644|     60|    }
 5645|     30|#ifndef yyoverflow
 5646|       | // false positive https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98753
 5647|     30|  if (yyss != yyssa)
  ------------------
  |  Branch (5647:7): [True: 0, False: 30]
  ------------------
 5648|      0|    YYSTACK_FREE (yyss == yyssa ? nullptr : yyss);
  ------------------
  |  |  834|      0|#  define YYSTACK_FREE YYFREE
  |  |  ------------------
  |  |  |  |  853|      0|#   define YYFREE free
  |  |  ------------------
  ------------------
  |  Branch (5648:19): [True: 0, False: 0]
  ------------------
 5649|     30|#endif
 5650|     30|  if (yymsg != yymsgbuf)
  ------------------
  |  Branch (5650:7): [True: 0, False: 30]
  ------------------
 5651|      0|    YYSTACK_FREE (yymsg);
  ------------------
  |  |  834|      0|#  define YYSTACK_FREE YYFREE
  |  |  ------------------
  |  |  |  |  853|      0|#   define YYFREE free
  |  |  ------------------
  ------------------
 5652|     30|  return yyresult;
 5653|      0|}
hexpr.parse.C:_ZL10yydestructPKc15yysymbol_kind_tP7YYSTYPEP7YYLTYPE:
 2649|     60|{
 2650|     60|  YY_USE (yyvaluep);
  ------------------
  |  |  749|     60|# define YY_USE(E) ((void) (E))
  ------------------
 2651|     60|  YY_USE (yylocationp);
  ------------------
  |  |  749|     60|# define YY_USE(E) ((void) (E))
  ------------------
 2652|     60|  if (!yymsg)
  ------------------
  |  Branch (2652:7): [True: 0, False: 60]
  ------------------
 2653|      0|    yymsg = "Deleting";
 2654|     60|  YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp);
 2655|       |
 2656|     60|  YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
 2657|     60|  switch (yykind)
 2658|     60|    {
 2659|      0|    case YYSYMBOL_module: /* module  */
  ------------------
  |  Branch (2659:5): [True: 0, False: 60]
  ------------------
 2660|      0|#line 546 "hexpr.y"
 2661|      0|            { delete ((*yyvaluep).module); }
 2662|      0|#line 2663 "hexpr.parse.C"
 2663|      0|        break;
 2664|       |
 2665|      0|    case YYSYMBOL_def: /* def  */
  ------------------
  |  Branch (2665:5): [True: 0, False: 60]
  ------------------
 2666|      0|#line 546 "hexpr.y"
 2667|      0|            { delete ((*yyvaluep).mdef); }
 2668|      0|#line 2669 "hexpr.parse.C"
 2669|      0|        break;
 2670|       |
 2671|      0|    case YYSYMBOL_importdef: /* importdef  */
  ------------------
  |  Branch (2671:5): [True: 0, False: 60]
  ------------------
 2672|      0|#line 546 "hexpr.y"
 2673|      0|            { delete ((*yyvaluep).mdef); }
 2674|      0|#line 2675 "hexpr.parse.C"
 2675|      0|        break;
 2676|       |
 2677|      0|    case YYSYMBOL_pragmadef: /* pragmadef  */
  ------------------
  |  Branch (2677:5): [True: 0, False: 60]
  ------------------
 2678|      0|#line 546 "hexpr.y"
 2679|      0|            { delete ((*yyvaluep).mdef); }
 2680|      0|#line 2681 "hexpr.parse.C"
 2681|      0|        break;
 2682|       |
 2683|      0|    case YYSYMBOL_pragmaty: /* pragmaty  */
  ------------------
  |  Branch (2683:5): [True: 0, False: 60]
  ------------------
 2684|      0|#line 546 "hexpr.y"
 2685|      0|            { delete ((*yyvaluep).mdef); }
 2686|      0|#line 2687 "hexpr.parse.C"
 2687|      0|        break;
 2688|       |
 2689|      0|    case YYSYMBOL_tydef: /* tydef  */
  ------------------
  |  Branch (2689:5): [True: 0, False: 60]
  ------------------
 2690|      0|#line 546 "hexpr.y"
 2691|      0|            { delete ((*yyvaluep).mdef); }
 2692|      0|#line 2693 "hexpr.parse.C"
 2693|      0|        break;
 2694|       |
 2695|      0|    case YYSYMBOL_vartybind: /* vartybind  */
  ------------------
  |  Branch (2695:5): [True: 0, False: 60]
  ------------------
 2696|      0|#line 546 "hexpr.y"
 2697|      0|            { delete ((*yyvaluep).mvtydef); }
 2698|      0|#line 2699 "hexpr.parse.C"
 2699|      0|        break;
 2700|       |
 2701|      0|    case YYSYMBOL_vardef: /* vardef  */
  ------------------
  |  Branch (2701:5): [True: 0, False: 60]
  ------------------
 2702|      0|#line 546 "hexpr.y"
 2703|      0|            { delete ((*yyvaluep).mvdef); }
 2704|      0|#line 2705 "hexpr.parse.C"
 2705|      0|        break;
 2706|       |
 2707|      0|    case YYSYMBOL_classdef: /* classdef  */
  ------------------
  |  Branch (2707:5): [True: 0, False: 60]
  ------------------
 2708|      0|#line 546 "hexpr.y"
 2709|      0|            { delete ((*yyvaluep).mdef); }
 2710|      0|#line 2711 "hexpr.parse.C"
 2711|      0|        break;
 2712|       |
 2713|      0|    case YYSYMBOL_cmember: /* cmember  */
  ------------------
  |  Branch (2713:5): [True: 0, False: 60]
  ------------------
 2714|      0|#line 546 "hexpr.y"
 2715|      0|            { delete ((*yyvaluep).mvtydef); }
 2716|      0|#line 2717 "hexpr.parse.C"
 2717|      0|        break;
 2718|       |
 2719|      0|    case YYSYMBOL_instdef: /* instdef  */
  ------------------
  |  Branch (2719:5): [True: 0, False: 60]
  ------------------
 2720|      0|#line 546 "hexpr.y"
 2721|      0|            { delete ((*yyvaluep).mdef); }
 2722|      0|#line 2723 "hexpr.parse.C"
 2723|      0|        break;
 2724|       |
 2725|      0|    case YYSYMBOL_imember: /* imember  */
  ------------------
  |  Branch (2725:5): [True: 0, False: 60]
  ------------------
 2726|      0|#line 546 "hexpr.y"
 2727|      0|            { delete ((*yyvaluep).mvdef); }
 2728|      0|#line 2729 "hexpr.parse.C"
 2729|      0|        break;
 2730|       |
 2731|      0|    case YYSYMBOL_l0expr: /* l0expr  */
  ------------------
  |  Branch (2731:5): [True: 0, False: 60]
  ------------------
 2732|      0|#line 546 "hexpr.y"
 2733|      0|            { delete ((*yyvaluep).exp); }
 2734|      0|#line 2735 "hexpr.parse.C"
 2735|      0|        break;
 2736|       |
 2737|      0|    case YYSYMBOL_lhexpr: /* lhexpr  */
  ------------------
  |  Branch (2737:5): [True: 0, False: 60]
  ------------------
 2738|      0|#line 546 "hexpr.y"
 2739|      0|            { delete ((*yyvaluep).exp); }
 2740|      0|#line 2741 "hexpr.parse.C"
 2741|      0|        break;
 2742|       |
 2743|      0|    case YYSYMBOL_l1expr: /* l1expr  */
  ------------------
  |  Branch (2743:5): [True: 0, False: 60]
  ------------------
 2744|      0|#line 546 "hexpr.y"
 2745|      0|            { delete ((*yyvaluep).exp); }
 2746|      0|#line 2747 "hexpr.parse.C"
 2747|      0|        break;
 2748|       |
 2749|      0|    case YYSYMBOL_l2expr: /* l2expr  */
  ------------------
  |  Branch (2749:5): [True: 0, False: 60]
  ------------------
 2750|      0|#line 546 "hexpr.y"
 2751|      0|            { delete ((*yyvaluep).exp); }
 2752|      0|#line 2753 "hexpr.parse.C"
 2753|      0|        break;
 2754|       |
 2755|      0|    case YYSYMBOL_l3expr: /* l3expr  */
  ------------------
  |  Branch (2755:5): [True: 0, False: 60]
  ------------------
 2756|      0|#line 546 "hexpr.y"
 2757|      0|            { delete ((*yyvaluep).exp); }
 2758|      0|#line 2759 "hexpr.parse.C"
 2759|      0|        break;
 2760|       |
 2761|      0|    case YYSYMBOL_l4expr: /* l4expr  */
  ------------------
  |  Branch (2761:5): [True: 0, False: 60]
  ------------------
 2762|      0|#line 546 "hexpr.y"
 2763|      0|            { delete ((*yyvaluep).exp); }
 2764|      0|#line 2765 "hexpr.parse.C"
 2765|      0|        break;
 2766|       |
 2767|      0|    case YYSYMBOL_l5expr: /* l5expr  */
  ------------------
  |  Branch (2767:5): [True: 0, False: 60]
  ------------------
 2768|      0|#line 546 "hexpr.y"
 2769|      0|            { delete ((*yyvaluep).exp); }
 2770|      0|#line 2771 "hexpr.parse.C"
 2771|      0|        break;
 2772|       |
 2773|      0|    case YYSYMBOL_cselection: /* cselection  */
  ------------------
  |  Branch (2773:5): [True: 0, False: 60]
  ------------------
 2774|      0|#line 546 "hexpr.y"
 2775|      0|            { delete ((*yyvaluep).cselection); }
 2776|      0|#line 2777 "hexpr.parse.C"
 2777|      0|        break;
 2778|       |
 2779|      0|    case YYSYMBOL_l6expr: /* l6expr  */
  ------------------
  |  Branch (2779:5): [True: 0, False: 60]
  ------------------
 2780|      0|#line 546 "hexpr.y"
 2781|      0|            { delete ((*yyvaluep).exp); }
 2782|      0|#line 2783 "hexpr.parse.C"
 2783|      0|        break;
 2784|       |
 2785|      0|    case YYSYMBOL_pvalue: /* pvalue  */
  ------------------
  |  Branch (2785:5): [True: 0, False: 60]
  ------------------
 2786|      0|#line 546 "hexpr.y"
 2787|      0|            { delete ((*yyvaluep).pvalue); }
 2788|      0|#line 2789 "hexpr.parse.C"
 2789|      0|        break;
 2790|       |
 2791|      0|    case YYSYMBOL_refutablep: /* refutablep  */
  ------------------
  |  Branch (2791:5): [True: 0, False: 60]
  ------------------
 2792|      0|#line 546 "hexpr.y"
 2793|      0|            { delete ((*yyvaluep).pattern); }
 2794|      0|#line 2795 "hexpr.parse.C"
 2795|      0|        break;
 2796|       |
 2797|      0|    case YYSYMBOL_irrefutablep: /* irrefutablep  */
  ------------------
  |  Branch (2797:5): [True: 0, False: 60]
  ------------------
 2798|      0|#line 546 "hexpr.y"
 2799|      0|            { delete ((*yyvaluep).pattern); }
 2800|      0|#line 2801 "hexpr.parse.C"
 2801|      0|        break;
 2802|       |
 2803|      0|    case YYSYMBOL_pattern: /* pattern  */
  ------------------
  |  Branch (2803:5): [True: 0, False: 60]
  ------------------
 2804|      0|#line 546 "hexpr.y"
 2805|      0|            { delete ((*yyvaluep).pattern); }
 2806|      0|#line 2807 "hexpr.parse.C"
 2807|      0|        break;
 2808|       |
 2809|      0|    case YYSYMBOL_qtype: /* qtype  */
  ------------------
  |  Branch (2809:5): [True: 0, False: 60]
  ------------------
 2810|      0|#line 546 "hexpr.y"
 2811|      0|            { delete ((*yyvaluep).qualtype); }
 2812|      0|#line 2813 "hexpr.parse.C"
 2813|      0|        break;
 2814|       |
 2815|      0|    case YYSYMBOL_tpred: /* tpred  */
  ------------------
  |  Branch (2815:5): [True: 0, False: 60]
  ------------------
 2816|      0|#line 546 "hexpr.y"
 2817|      0|            { delete ((*yyvaluep).tconstraint); }
 2818|      0|#line 2819 "hexpr.parse.C"
 2819|      0|        break;
 2820|       |
 2821|     60|      default:
  ------------------
  |  Branch (2821:7): [True: 60, False: 0]
  ------------------
 2822|     60|        break;
 2823|     60|    }
 2824|     60|  YY_IGNORE_MAYBE_UNINITIALIZED_END
 2825|     60|}

_ZN6hobbes17LexicalAnnotationC2Ev:
   10|  18.6k|LexicalAnnotation::LexicalAnnotation() {
   11|  18.6k|  static BuffOrFilenamePtr* n = nullptr;
   12|  18.6k|  if (n == nullptr) {
  ------------------
  |  Branch (12:7): [True: 1, False: 18.6k]
  ------------------
   13|      1|    n = new BuffOrFilenamePtr(new BuffOrFilename(false, "???"));
   14|      1|  }
   15|  18.6k|  this->bfptr = *n;
   16|  18.6k|  this->p0    = Pos(0,0);
   17|  18.6k|  this->p1    = Pos(0,0);
   18|  18.6k|}
_ZNK6hobbes17LexicalAnnotation8filenameB5cxx11Ev:
   20|    402|std::string LexicalAnnotation::filename() const {
   21|    402|  return this->bfptr->first ? this->bfptr->second : "stdin";
  ------------------
  |  Branch (21:10): [True: 0, False: 402]
  ------------------
   22|    402|}
_ZN6hobbes10slurpLinesB5cxx11ERSimm:
   24|     17|str::seq slurpLines(std::istream& in, size_t i, size_t f) {
   25|     17|  str::seq    result;
   26|     17|  std::string mline;
   27|  1.17k|  for (size_t k = 0; k < i; ++k) {
  ------------------
  |  Branch (27:22): [True: 1.15k, False: 17]
  ------------------
   28|  1.15k|    std::getline(in, mline);
   29|  1.15k|  }
   30|     54|  for (size_t k = i; k < f; ++k) {
  ------------------
  |  Branch (30:22): [True: 37, False: 17]
  ------------------
   31|     37|    if (std::getline(in, mline)) {
  ------------------
  |  Branch (31:9): [True: 37, False: 0]
  ------------------
   32|     37|      result.push_back(mline);
   33|     37|    }
   34|     37|  }
   35|     17|  return result;
   36|     17|}
_ZNK6hobbes17LexicalAnnotation8lineDescB5cxx11Ev:
   38|    385|std::string LexicalAnnotation::lineDesc() const {
   39|    385|  if (!this->bfptr) {
  ------------------
  |  Branch (39:7): [True: 0, False: 385]
  ------------------
   40|      0|    return "";
   41|      0|  }
   42|       |
   43|    385|  std::ostringstream ss;
   44|    385|  ss << filename() << ":";
   45|    385|  if (this->p0.first == this->p1.first) {
  ------------------
  |  Branch (45:7): [True: 385, False: 0]
  ------------------
   46|    385|    ss << this->p0.first << "," << this->p0.second << "-" << this->p1.second;
   47|    385|  } else {
   48|      0|    ss << this->p0.first << "," << this->p0.second << "-" << this->p1.first << "," << this->p1.second;
   49|      0|  }
   50|    385|  return ss.str();
   51|    385|}
_ZNK6hobbes17LexicalAnnotation5linesB5cxx11Emm:
   53|     17|str::seq LexicalAnnotation::lines(size_t i, size_t f) const {
   54|     17|  if (!this->bfptr) {
  ------------------
  |  Branch (54:7): [True: 0, False: 17]
  ------------------
   55|      0|    return str::seq();
   56|     17|  } else if (this->bfptr->first) {
  ------------------
  |  Branch (56:14): [True: 0, False: 17]
  ------------------
   57|      0|    std::ifstream fd(this->bfptr->second);
   58|      0|    return slurpLines(fd, i, f);
   59|     17|  } else {
   60|     17|    std::istringstream sd(this->bfptr->second);
   61|     17|    return slurpLines(sd, i, f);
   62|     17|  }
   63|     17|}
_ZN6hobbes17LexicalAnnotation4nullEv:
   65|     66|LexicalAnnotation LexicalAnnotation::null() {
   66|     66|  return LexicalAnnotation();
   67|     66|}
_ZN6hobbes18LexicallyAnnotatedC2ERKNS_17LexicalAnnotationE:
   89|   194k|LexicallyAnnotated::LexicallyAnnotated(const LexicalAnnotation& la) : lannotation(la) {
   90|   194k|}
_ZNK6hobbes18LexicallyAnnotated2laEv:
   98|   175k|const LexicalAnnotation& LexicallyAnnotated::la() const {
   99|   175k|  return this->lannotation;
  100|   175k|}
_ZN6hobbes18LexicallyAnnotated18pushLiteralContextERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  106|     30|void LexicallyAnnotated::pushLiteralContext(const std::string& txt) {
  107|     30|  annotationCtxStack().push(std::make_shared<BuffOrFilename>(false, txt));
  108|     30|}
_ZN6hobbes18LexicallyAnnotated10popContextEv:
  110|     30|void LexicallyAnnotated::popContext() {
  111|     30|  annotationCtxStack().pop();
  112|     30|}
_ZN6hobbes18LexicallyAnnotated4makeERKSt4pairImmES4_:
  114|  17.4k|LexicalAnnotation LexicallyAnnotated::make(const Pos& p0, const Pos& p1) {
  115|  17.4k|  auto& s = annotationCtxStack();
  116|       |
  117|  17.4k|  LexicalAnnotation r;
  118|  17.4k|  r.bfptr = !s.empty() ? s.top() : std::make_shared<BuffOrFilename>(false, "???");
  ------------------
  |  Branch (118:13): [True: 17.4k, False: 0]
  ------------------
  119|  17.4k|  r.p0    = p0;
  120|  17.4k|  r.p1    = p1;
  121|  17.4k|  return r;
  122|  17.4k|}
_ZN6hobbes15annotated_errorC2ERKSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS_17LexicalAnnotationEESaISA_EE:
  125|    385|annotated_error::annotated_error(const annmsgs& amsgs) : std::runtime_error(plainDesc(amsgs)), amsgs(amsgs) {
  126|    385|}
_ZN6hobbes15annotated_errorC2ERKNS_18LexicallyAnnotatedERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  131|    385|annotated_error::annotated_error(const LexicallyAnnotated& la, const std::string& m) : annotated_error(list(annmsg(m, la.la()))) {
  132|    385|}
_ZN6hobbes15annotated_error9plainDescERKSt6vectorISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS_17LexicalAnnotationEESaISA_EE:
  138|    385|std::string annotated_error::plainDesc(const annmsgs& amsgs) {
  139|    385|  std::ostringstream ss;
  140|    385|  for (const auto& amsg : amsgs) {
  ------------------
  |  Branch (140:25): [True: 385, False: 385]
  ------------------
  141|    385|    ss << amsg.second.lineDesc() << ": " << amsg.first << "\n";
  142|    385|  }
  143|    385|  return ss.str();
  144|    385|}
lannotation.C:_ZN6hobbesL18annotationCtxStackB5cxx11Ev:
   79|  17.4k|static AnnContextStack& annotationCtxStack() {
   80|  17.4k|  static __thread AnnContextStack* actxs = nullptr;
   81|  17.4k|  if (actxs == nullptr) {
  ------------------
  |  Branch (81:7): [True: 1, False: 17.4k]
  ------------------
   82|      1|    actxs = new AnnContextStack();
   83|      1|  }
   84|  17.4k|  return *actxs;
   85|  17.4k|}

_ZN6hobbes6regionC2Emmm:
   14|      2|  minPageSize(minPageSize), maxPageSize(maxPageSize), lastAllocPageSize(minPageSize),
   15|      2|  abortOnOOM(false), maxTotalAllocation(0), totalAllocation(0), usedp(nullptr), freep(nullptr)
   16|      2|{
   17|       |  // newpage can now throw if a page allocation fails; free whatever pages we did
   18|       |  // obtain before the exception leaves the constructor, since the destructor
   19|       |  // does not run for a throwing constructor (STRFR-433966). freepages walks a
   20|       |  // page chain and tolerates a null head, so it covers both the single usedp
   21|       |  // page and the freep list whether or not either was set.
   22|      2|  try {
   23|      2|    this->usedp = newpage(nullptr, minPageSize);
   24|       |
   25|      4|    for (size_t i = 0; i < initialFreePages; ++i) {
  ------------------
  |  Branch (25:24): [True: 2, False: 2]
  ------------------
   26|      2|      this->freep = newpage(this->freep, minPageSize);
   27|      2|    }
   28|      2|  } catch (...) {
   29|      0|    freepages(this->usedp);
   30|      0|    freepages(this->freep);
   31|      0|    throw;
   32|      0|  }
   33|      2|}
_ZN6hobbes6regionD2Ev:
   35|      1|region::~region() {
   36|      1|  clear();
   37|      1|  freepage(this->usedp);
   38|      1|}
_ZN6hobbes6region6mallocEmm:
   40|  78.3k|void* region::malloc(size_t sz, size_t asz) {
   41|       |  // read + sz + asz is the high-water mark this request needs to fit. Computed
   42|       |  // in size_t with no check, a huge sz wraps that sum to a small value, so the
   43|       |  // "does it fit" test below passes and a block with almost no usable space is
   44|       |  // handed back -- which the caller then writes past, rewinding the bump
   45|       |  // cursor over live objects (STRFR-433992). Reject a size that cannot even be
   46|       |  // represented before the wrapping arithmetic can run. asz (alignment) is
   47|       |  // small and read <= size always holds, so this only fires for a genuinely
   48|       |  // out-of-range sz.
   49|  78.3k|  size_t need = 0;
   50|  78.3k|  if (__builtin_add_overflow(sz, asz, &need) ||
  ------------------
  |  Branch (50:7): [True: 0, False: 78.3k]
  ------------------
   51|  78.3k|      __builtin_add_overflow(need, this->usedp->read, &need)) {
  ------------------
  |  Branch (51:7): [True: 0, False: 78.3k]
  ------------------
   52|      0|    throw std::runtime_error("region allocation of " + str::from(sz) + " bytes is too large to represent");
   53|      0|  }
   54|       |
   55|  78.3k|  if (need <= this->usedp->size) {
  ------------------
  |  Branch (55:7): [True: 78.2k, False: 15]
  ------------------
   56|       |    // fits in the current page; need <= size and afixup < asz, so no wrap
   57|  78.2k|    uint8_t* uresult = reinterpret_cast<uint8_t*>(this->usedp->base) + this->usedp->read;
   58|  78.2k|    size_t   afixup  = align(reinterpret_cast<size_t>(uresult), asz) - reinterpret_cast<size_t>(uresult);
   59|  78.2k|    uint8_t* result  = uresult + afixup;
   60|       |
   61|  78.2k|    this->usedp->read = (this->usedp->read + sz) + afixup;
   62|  78.2k|    return result;
   63|  78.2k|  } else {
   64|       |    // sz + asz was checked above (it is the first sum in 'need')
   65|     15|    allocpage(sz + asz);
   66|       |
   67|     15|    auto* uresult = reinterpret_cast<uint8_t*>(this->usedp->base);
   68|     15|    size_t   afixup  = align(reinterpret_cast<size_t>(uresult), asz) - reinterpret_cast<size_t>(uresult);
   69|     15|    uint8_t* result  = uresult + afixup;
   70|       |
   71|     15|    this->usedp->read = sz + afixup;
   72|     15|    return result;
   73|     15|  }
   74|  78.3k|}
_ZN6hobbes6region5clearEv:
   76|      2|void region::clear() {
   77|      2|  freepages(this->freep);
   78|      2|  freepages(this->usedp->succ);
   79|       |
   80|      2|  this->freep       = nullptr;
   81|      2|  this->usedp->read = 0;
   82|      2|  this->usedp->succ = nullptr;
   83|       |
   84|      2|  this->lastAllocPageSize = this->minPageSize;
   85|      2|}
_ZN6hobbes6region7newpageEPNS_7mempageEm:
  179|     18|mempage* region::newpage(mempage* succ, size_t sz) {
  180|     18|  size_t psz = 0;
  181|     18|  if (this->lastAllocPageSize < this->maxPageSize) {
  ------------------
  |  Branch (181:7): [True: 17, False: 1]
  ------------------
  182|     17|    psz = std::max(sz, this->lastAllocPageSize);
  183|     17|  } else {
  184|      1|    psz = std::max(sz, this->maxPageSize);
  185|      1|  }
  186|       |
  187|     18|  this->totalAllocation += psz;
  188|     18|  if (this->abortOnOOM && this->totalAllocation >= this->maxTotalAllocation) {
  ------------------
  |  Branch (188:7): [True: 0, False: 18]
  |  Branch (188:27): [True: 0, False: 0]
  ------------------
  189|       |    // we've gone too far, and we've been asked to abort in this case
  190|      0|    dbglog("aborting on out-of-memory condition");
  191|      0|    abort();
  192|      0|  }
  193|       |
  194|     18|  auto* p = new mempage;
  195|     18|  p->size = psz;
  196|     18|  p->base = ::malloc(p->size);
  197|       |  // a page size can be arithmetically valid yet more than malloc can satisfy: a
  198|       |  // large array length from untrusted data (a wire-decoded count, a codec
  199|       |  // block) reaches here as psz, and malloc returns null for a request that big.
  200|       |  // Using that null base would hand the caller a near-null pointer to write the
  201|       |  // array's size field through -- a single message SIGSEGVs the process. Fail
  202|       |  // with a recoverable error the compile/eval path can catch instead, and undo
  203|       |  // the accounting for the page we did not get (STRFR-433966).
  204|     18|  if (p->base == nullptr) {
  ------------------
  |  Branch (204:7): [True: 0, False: 18]
  ------------------
  205|      0|    delete p;
  206|      0|    this->totalAllocation -= psz;
  207|      0|    throw std::runtime_error("region page allocation of " + str::from(psz) + " bytes failed");
  208|      0|  }
  209|     18|  p->read = 0;
  210|     18|  p->succ = succ;
  211|       |
  212|       |  // the page exists now, so grow the next page-size target -- doing this only on
  213|       |  // success leaves the region's sizing state untouched when an allocation fails
  214|     18|  if (this->lastAllocPageSize < this->maxPageSize) {
  ------------------
  |  Branch (214:7): [True: 17, False: 1]
  ------------------
  215|     17|    this->lastAllocPageSize *= 2;
  216|     17|  }
  217|       |
  218|     18|  return p;
  219|     18|}
_ZN6hobbes6region9allocpageEm:
  221|     15|void region::allocpage(size_t sz) {
  222|     15|  if (this->freep != nullptr && sz <= this->freep->size) {
  ------------------
  |  Branch (222:7): [True: 2, False: 13]
  |  Branch (222:33): [True: 1, False: 1]
  ------------------
  223|       |    // used = head free : used
  224|      1|    mempage* usednp = this->freep;
  225|      1|    mempage* freenp = this->freep->succ;
  226|       |
  227|      1|    usednp->succ = this->usedp;
  228|       |
  229|      1|    this->usedp = usednp;
  230|       |
  231|       |    // free = tail free
  232|      1|    this->freep = freenp;
  233|     14|  } else {
  234|     14|    this->usedp = newpage(this->usedp, sz);
  235|     14|  }
  236|     15|}
_ZN6hobbes6region8freepageEPNS_7mempageE:
  238|     17|void region::freepage(mempage* p) {
  239|     17|  this->totalAllocation -= p->size;
  240|     17|  ::free(p->base);
  241|     17|  delete p;
  242|     17|}
_ZN6hobbes6region9freepagesEPNS_7mempageE:
  244|      4|void region::freepages(mempage* p) {
  245|     20|  while (p != nullptr) {
  ------------------
  |  Branch (245:10): [True: 16, False: 4]
  ------------------
  246|     16|    mempage* np = p->succ;
  247|     16|    freepage(p);
  248|     16|    p = np;
  249|     16|  }
  250|      4|}

_ZN6hobbes3str8demangleB5cxx11EPKc:
  190|     43|std::string demangle(const char* tn) {
  191|     43|  if (tn == nullptr) {
  ------------------
  |  Branch (191:7): [True: 0, False: 43]
  ------------------
  192|      0|    return "";
  193|      0|  }
  194|       |
  195|     43|  int   s   = 0;
  196|     43|  char* dmn = abi::__cxa_demangle(tn, nullptr, nullptr, &s);
  197|       |
  198|     43|  if (dmn == nullptr) {
  ------------------
  |  Branch (198:7): [True: 0, False: 43]
  ------------------
  199|      0|    return std::string(tn);
  200|     43|  } else {
  201|     43|    std::string r(dmn);
  202|     43|    free(dmn);
  203|     43|    return r;
  204|     43|  }
  205|     43|}
_ZN6hobbes3str7splitAtERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEj:
  211|      2|pair splitAt(const std::string& s, unsigned int i) {
  212|      2|  if (i >= s.size()) {
  ------------------
  |  Branch (212:7): [True: 1, False: 1]
  ------------------
  213|      1|    return pair(s, "");
  214|      1|  } else {
  215|      1|    return pair(s.substr(0, i), s.substr(i, s.size()));
  216|      1|  }
  217|      2|}
_ZN6hobbes3str6csplitERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_:
  237|      2|seq csplit(const std::string& str, const std::string& pivot) {
  238|      2|  using size_type = std::string::size_type;
  239|       |
  240|      2|  seq       ret;
  241|      2|  size_type mp = 0;
  242|       |
  243|      6|  while (mp != std::string::npos) {
  ------------------
  |  Branch (243:10): [True: 4, False: 2]
  ------------------
  244|      4|    size_type nmp = str.find(pivot, mp);
  245|       |
  246|      4|    if (nmp == std::string::npos) {
  ------------------
  |  Branch (246:9): [True: 2, False: 2]
  ------------------
  247|      2|      ret.push_back(str.substr(mp, str.size() - mp));
  248|      2|      mp = nmp;
  249|      2|    } else {
  250|      2|      ret.push_back(str.substr(mp, nmp - mp));
  251|      2|      mp = nmp + pivot.size();
  252|      2|    }
  253|      4|  }
  254|       |
  255|      2|  return ret;
  256|      2|}
_ZN6hobbes3str9readWhileEPFbcERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  258|      2|pair readWhile(bool (*P)(char), const std::string& s) {
  259|      2|  return splitAt(s, firstFailIndex(P, s));
  260|      2|}
_ZN6hobbes3str5denybEc:
  266|    280|char denyb(char c) {
  267|    280|  if (c >= 'a' && c <= 'f') {
  ------------------
  |  Branch (267:7): [True: 5, False: 275]
  |  Branch (267:19): [True: 5, False: 0]
  ------------------
  268|      5|    return 10 + (c - 'a');
  269|    275|  } else if (c >= 'A' && c <= 'F') {
  ------------------
  |  Branch (269:14): [True: 0, False: 275]
  |  Branch (269:26): [True: 0, False: 0]
  ------------------
  270|      0|    return 10 + (c - 'A');
  271|    275|  } else if (c >= '0' && c <= '9') {
  ------------------
  |  Branch (271:14): [True: 275, False: 0]
  |  Branch (271:26): [True: 275, False: 0]
  ------------------
  272|    275|    return (c - '0');
  273|    275|  } else {
  274|      0|    return 0;
  275|      0|  }
  276|    280|}
_ZN6hobbes3str5dehexERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  278|     12|unsigned char dehex(const std::string& x) {
  279|     12|  if (x.size() == 4 && x[0] == '0' && (x[1] == 'x' || x[1] == 'X')) {
  ------------------
  |  Branch (279:7): [True: 12, False: 0]
  |  Branch (279:24): [True: 12, False: 0]
  |  Branch (279:40): [True: 0, False: 12]
  |  Branch (279:55): [True: 12, False: 0]
  ------------------
  280|     12|    return (denyb(x[2]) << 4) | denyb(x[3]);
  281|     12|  } else if (x.size() == 2) {
  ------------------
  |  Branch (281:14): [True: 0, False: 0]
  ------------------
  282|      0|    return (denyb(x[0]) << 4) | denyb(x[1]);
  283|      0|  } else {
  284|      0|    return 0;
  285|      0|  }
  286|     12|}
_ZN6hobbes3str6dehexsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  288|      1|std::vector<unsigned char> dehexs(const std::string& x) {
  289|      1|  std::vector<unsigned char> r;
  290|      1|  unsigned int i = (x.size() > 2 && x[0] == '0' && (x[1] == 'X' || x[1] == 'x')) ? 2 : 0;
  ------------------
  |  Branch (290:21): [True: 1, False: 0]
  |  Branch (290:37): [True: 1, False: 0]
  |  Branch (290:53): [True: 0, False: 1]
  |  Branch (290:68): [True: 1, False: 0]
  ------------------
  291|    129|  while (i < x.size()) {
  ------------------
  |  Branch (291:10): [True: 128, False: 1]
  ------------------
  292|    128|    r.push_back((denyb(x[i]) << 4) | denyb(x[i+1]));
  293|    128|    i += 2;
  294|    128|  }
  295|      1|  return r;
  296|      1|}
_ZN6hobbes3str3nybEh:
  298|     10|char nyb(unsigned char x) {
  299|     10|  static const char cs[] = "0123456789abcdef";
  300|     10|  return cs[x % 16];
  301|     10|}
_ZN6hobbes3str3hexB5cxx11Eh:
  303|      5|std::string hex(unsigned char x) {
  304|      5|  const char d[] = {nyb(x >> 4), nyb(x & 0x0F), '\0'};
  305|      5|  return std::string(d);
  306|      5|}
_ZN6hobbes3str8unescapeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  362|    232|std::string unescape(const std::string& cs) {
  363|    232|  std::ostringstream result;
  364|    232|  bool esc = false;
  365|  1.02k|  for (auto c = cs.begin(); c != cs.end(); ++c) {
  ------------------
  |  Branch (365:29): [True: 796, False: 232]
  ------------------
  366|    796|    if (*c == '\\' && !esc) {
  ------------------
  |  Branch (366:9): [True: 55, False: 741]
  |  Branch (366:23): [True: 55, False: 0]
  ------------------
  367|     55|      esc = true;
  368|    741|    } else if (esc) {
  ------------------
  |  Branch (368:16): [True: 55, False: 686]
  ------------------
  369|     55|      switch (*c) {
  370|      6|      case 'n':
  ------------------
  |  Branch (370:7): [True: 6, False: 49]
  ------------------
  371|      6|        result << "\n";
  372|      6|        break;
  373|      0|      case 't':
  ------------------
  |  Branch (373:7): [True: 0, False: 55]
  ------------------
  374|      0|        result << "\t";
  375|      0|        break;
  376|      0|      case 'r':
  ------------------
  |  Branch (376:7): [True: 0, False: 55]
  ------------------
  377|      0|        result << "\r";
  378|      0|        break;
  379|     38|      case '0':
  ------------------
  |  Branch (379:7): [True: 38, False: 17]
  ------------------
  380|     38|        result.put('\0');
  381|     38|        break;
  382|      0|      case 'x': {
  ------------------
  |  Branch (382:7): [True: 0, False: 55]
  ------------------
  383|       |          // only step onto a digit that exists: incrementing an iterator that
  384|       |          // is already at the end is undefined, and leaves the following
  385|       |          // 'c != cs.end()' guard passing on a past-the-end iterator, so a
  386|       |          // string ending in "\x" read one byte beyond the buffer
  387|      0|          char b1 = 0; char b2 = 0;
  388|      0|          if (std::next(c) != cs.end()) { ++c; b1 = *c; }
  ------------------
  |  Branch (388:15): [True: 0, False: 0]
  ------------------
  389|      0|          if (std::next(c) != cs.end()) { ++c; b2 = *c; }
  ------------------
  |  Branch (389:15): [True: 0, False: 0]
  ------------------
  390|      0|          result.put((denyb(b1) << 4) + denyb(b2));
  391|      0|          break;
  392|      0|        }
  393|     11|      default:
  ------------------
  |  Branch (393:7): [True: 11, False: 44]
  ------------------
  394|     11|        result.put(*c);
  395|     55|      }
  396|     55|      esc = false;
  397|    686|    } else {
  398|    686|      result.put(*c);
  399|    686|    }
  400|    796|  }
  401|    232|  return result.str();
  402|    232|}
_ZN6hobbes3str11readCharDefERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  446|     49|char readCharDef(const std::string& x) {
  447|     49|  if (x.empty()) {
  ------------------
  |  Branch (447:7): [True: 0, False: 49]
  ------------------
  448|      0|    return 0;
  449|     49|  } else if (x[0] != '\'') {
  ------------------
  |  Branch (449:14): [True: 0, False: 49]
  ------------------
  450|      0|    return x[0]; // ?
  451|     49|  } else if (x.size() > 2 && x[1] == '\\') {
  ------------------
  |  Branch (451:14): [True: 49, False: 0]
  |  Branch (451:30): [True: 38, False: 11]
  ------------------
  452|     38|    switch (x[2]) {
  453|     38|    case '0':  return 0;
  ------------------
  |  Branch (453:5): [True: 38, False: 0]
  ------------------
  454|      0|    case 'r':  return '\r';
  ------------------
  |  Branch (454:5): [True: 0, False: 38]
  ------------------
  455|      0|    case 'n':  return '\n';
  ------------------
  |  Branch (455:5): [True: 0, False: 38]
  ------------------
  456|      0|    case 't':  return '\t';
  ------------------
  |  Branch (456:5): [True: 0, False: 38]
  ------------------
  457|      0|    case '\\': return '\\';
  ------------------
  |  Branch (457:5): [True: 0, False: 38]
  ------------------
  458|      0|    default:   return x[2];
  ------------------
  |  Branch (458:5): [True: 0, False: 38]
  ------------------
  459|     38|    }
  460|     38|  } else {
  461|     11|    return x[1];
  462|     11|  }
  463|     49|}
_ZN6hobbes3str7isDigitEc:
  475|      3|bool isDigit(char c) {
  476|      3|  return std::isdigit(c) != 0;
  477|      3|}
_ZN6hobbes3str10isNotDigitEc:
  479|      1|bool isNotDigit(char c) {
  480|      1|  return !isDigit(c);
  481|      1|}
_ZN6hobbes3str14firstFailIndexEPFbcERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  483|      2|unsigned int firstFailIndex(bool (*P)(char), const std::string& s) {
  484|      2|  unsigned int i = 0;
  485|      4|  while (i < s.size()) {
  ------------------
  |  Branch (485:10): [True: 3, False: 1]
  ------------------
  486|      3|    if (!P(s[i])) {
  ------------------
  |  Branch (486:9): [True: 1, False: 2]
  ------------------
  487|      1|      break;
  488|      1|    }
  489|      2|    ++i;
  490|      2|  }
  491|      2|  return i;
  492|      2|}
_ZN6hobbes3str6cdelimERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS7_EERKS7_:
  494|    174|std::string cdelim(const seq& ss, const std::string& d) {
  495|    174|  if (ss.empty()) {
  ------------------
  |  Branch (495:7): [True: 0, False: 174]
  ------------------
  496|      0|    return "";
  497|    174|  } else {
  498|    174|    std::ostringstream r;
  499|    174|    r << ss[0];
  500|    747|    for (unsigned int s = 1; s < ss.size(); ++s) {
  ------------------
  |  Branch (500:30): [True: 573, False: 174]
  ------------------
  501|    573|      r << d << ss[s];
  502|    573|    }
  503|    174|    return r.str();
  504|    174|  }
  505|    174|}

